Repository: Gamemode4Dev/GM4_Datapacks Branch: master Commit: 50101bf302d9 Files: 6258 Total size: 5.9 MB Directory structure: gitextract_letogdq4/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feat_request.md │ └── workflows/ │ └── main.yml ├── .gitignore ├── .python-version ├── .vscode/ │ ├── settings.json │ └── tasks.json ├── LICENSE.md ├── README.md ├── base/ │ ├── assets/ │ │ ├── gm4/ │ │ │ ├── font/ │ │ │ │ ├── container_gui.json │ │ │ │ ├── default.json │ │ │ │ ├── half_invert.json │ │ │ │ └── offscreen.json │ │ │ ├── lang/ │ │ │ │ └── en_us.json │ │ │ └── models/ │ │ │ └── block/ │ │ │ ├── cube_with_plate.json │ │ │ └── plate.json │ │ ├── minecraft/ │ │ │ ├── atlases/ │ │ │ │ └── items.json │ │ │ └── optifine/ │ │ │ └── emissive.properties │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ ├── advancement/ │ │ │ │ ├── intro_song/ │ │ │ │ │ ├── invisible_root.json │ │ │ │ │ ├── play_song.json │ │ │ │ │ └── welcome_toast.json │ │ │ │ └── upgrade_paths/ │ │ │ │ ├── changed_dimension.json │ │ │ │ └── join_game.json │ │ │ ├── function/ │ │ │ │ ├── conflict_logs/ │ │ │ │ │ ├── traverse.mcfunction │ │ │ │ │ └── version_conflict_start.mcfunction │ │ │ │ ├── intro_song/ │ │ │ │ │ ├── init.mcfunction │ │ │ │ │ ├── init_song.mcfunction │ │ │ │ │ ├── main.mcfunction │ │ │ │ │ ├── notes/ │ │ │ │ │ │ ├── 0.mcfunction │ │ │ │ │ │ ├── 10.mcfunction │ │ │ │ │ │ ├── 12.mcfunction │ │ │ │ │ │ ├── 14.mcfunction │ │ │ │ │ │ ├── 16.mcfunction │ │ │ │ │ │ ├── 20.mcfunction │ │ │ │ │ │ ├── 23.mcfunction │ │ │ │ │ │ ├── 24.mcfunction │ │ │ │ │ │ ├── 26.mcfunction │ │ │ │ │ │ ├── 28.mcfunction │ │ │ │ │ │ ├── 30.mcfunction │ │ │ │ │ │ ├── 32.mcfunction │ │ │ │ │ │ ├── 35.mcfunction │ │ │ │ │ │ ├── 36.mcfunction │ │ │ │ │ │ ├── 38.mcfunction │ │ │ │ │ │ ├── 39.mcfunction │ │ │ │ │ │ ├── 4.mcfunction │ │ │ │ │ │ ├── 40.mcfunction │ │ │ │ │ │ ├── 41.mcfunction │ │ │ │ │ │ ├── 42.mcfunction │ │ │ │ │ │ ├── 43.mcfunction │ │ │ │ │ │ ├── 44.mcfunction │ │ │ │ │ │ ├── 45.mcfunction │ │ │ │ │ │ ├── 46.mcfunction │ │ │ │ │ │ ├── 47.mcfunction │ │ │ │ │ │ ├── 48.mcfunction │ │ │ │ │ │ ├── 51.mcfunction │ │ │ │ │ │ ├── 52.mcfunction │ │ │ │ │ │ ├── 54.mcfunction │ │ │ │ │ │ ├── 55.mcfunction │ │ │ │ │ │ ├── 56.mcfunction │ │ │ │ │ │ ├── 58.mcfunction │ │ │ │ │ │ ├── 60.mcfunction │ │ │ │ │ │ ├── 62.mcfunction │ │ │ │ │ │ ├── 64.mcfunction │ │ │ │ │ │ ├── 65.mcfunction │ │ │ │ │ │ ├── 66.mcfunction │ │ │ │ │ │ ├── 67.mcfunction │ │ │ │ │ │ ├── 68.mcfunction │ │ │ │ │ │ ├── 69.mcfunction │ │ │ │ │ │ ├── 7.mcfunction │ │ │ │ │ │ ├── 70.mcfunction │ │ │ │ │ │ ├── 71.mcfunction │ │ │ │ │ │ ├── 72.mcfunction │ │ │ │ │ │ ├── 73.mcfunction │ │ │ │ │ │ ├── 74.mcfunction │ │ │ │ │ │ ├── 75.mcfunction │ │ │ │ │ │ ├── 76.mcfunction │ │ │ │ │ │ ├── 77.mcfunction │ │ │ │ │ │ ├── 78.mcfunction │ │ │ │ │ │ ├── 79.mcfunction │ │ │ │ │ │ ├── 8.mcfunction │ │ │ │ │ │ ├── 80.mcfunction │ │ │ │ │ │ └── 84.mcfunction │ │ │ │ │ ├── play.mcfunction │ │ │ │ │ ├── stop.mcfunction │ │ │ │ │ └── tree/ │ │ │ │ │ ├── 0_1.mcfunction │ │ │ │ │ ├── 0_127.mcfunction │ │ │ │ │ ├── 0_15.mcfunction │ │ │ │ │ ├── 0_3.mcfunction │ │ │ │ │ ├── 0_31.mcfunction │ │ │ │ │ ├── 0_63.mcfunction │ │ │ │ │ ├── 0_7.mcfunction │ │ │ │ │ ├── 10_11.mcfunction │ │ │ │ │ ├── 12_13.mcfunction │ │ │ │ │ ├── 12_15.mcfunction │ │ │ │ │ ├── 14_15.mcfunction │ │ │ │ │ ├── 16_17.mcfunction │ │ │ │ │ ├── 16_19.mcfunction │ │ │ │ │ ├── 16_23.mcfunction │ │ │ │ │ ├── 16_31.mcfunction │ │ │ │ │ ├── 20_21.mcfunction │ │ │ │ │ ├── 20_23.mcfunction │ │ │ │ │ ├── 22_23.mcfunction │ │ │ │ │ ├── 24_25.mcfunction │ │ │ │ │ ├── 24_27.mcfunction │ │ │ │ │ ├── 24_31.mcfunction │ │ │ │ │ ├── 26_27.mcfunction │ │ │ │ │ ├── 28_29.mcfunction │ │ │ │ │ ├── 28_31.mcfunction │ │ │ │ │ ├── 30_31.mcfunction │ │ │ │ │ ├── 32_33.mcfunction │ │ │ │ │ ├── 32_35.mcfunction │ │ │ │ │ ├── 32_39.mcfunction │ │ │ │ │ ├── 32_47.mcfunction │ │ │ │ │ ├── 32_63.mcfunction │ │ │ │ │ ├── 34_35.mcfunction │ │ │ │ │ ├── 36_37.mcfunction │ │ │ │ │ ├── 36_39.mcfunction │ │ │ │ │ ├── 38_39.mcfunction │ │ │ │ │ ├── 40_41.mcfunction │ │ │ │ │ ├── 40_43.mcfunction │ │ │ │ │ ├── 40_47.mcfunction │ │ │ │ │ ├── 42_43.mcfunction │ │ │ │ │ ├── 44_45.mcfunction │ │ │ │ │ ├── 44_47.mcfunction │ │ │ │ │ ├── 46_47.mcfunction │ │ │ │ │ ├── 48_49.mcfunction │ │ │ │ │ ├── 48_51.mcfunction │ │ │ │ │ ├── 48_55.mcfunction │ │ │ │ │ ├── 48_63.mcfunction │ │ │ │ │ ├── 4_5.mcfunction │ │ │ │ │ ├── 4_7.mcfunction │ │ │ │ │ ├── 50_51.mcfunction │ │ │ │ │ ├── 52_53.mcfunction │ │ │ │ │ ├── 52_55.mcfunction │ │ │ │ │ ├── 54_55.mcfunction │ │ │ │ │ ├── 56_57.mcfunction │ │ │ │ │ ├── 56_59.mcfunction │ │ │ │ │ ├── 56_63.mcfunction │ │ │ │ │ ├── 58_59.mcfunction │ │ │ │ │ ├── 60_61.mcfunction │ │ │ │ │ ├── 60_63.mcfunction │ │ │ │ │ ├── 62_63.mcfunction │ │ │ │ │ ├── 64_127.mcfunction │ │ │ │ │ ├── 64_65.mcfunction │ │ │ │ │ ├── 64_67.mcfunction │ │ │ │ │ ├── 64_71.mcfunction │ │ │ │ │ ├── 64_79.mcfunction │ │ │ │ │ ├── 64_95.mcfunction │ │ │ │ │ ├── 66_67.mcfunction │ │ │ │ │ ├── 68_69.mcfunction │ │ │ │ │ ├── 68_71.mcfunction │ │ │ │ │ ├── 6_7.mcfunction │ │ │ │ │ ├── 70_71.mcfunction │ │ │ │ │ ├── 72_73.mcfunction │ │ │ │ │ ├── 72_75.mcfunction │ │ │ │ │ ├── 72_79.mcfunction │ │ │ │ │ ├── 74_75.mcfunction │ │ │ │ │ ├── 76_77.mcfunction │ │ │ │ │ ├── 76_79.mcfunction │ │ │ │ │ ├── 78_79.mcfunction │ │ │ │ │ ├── 80_81.mcfunction │ │ │ │ │ ├── 80_83.mcfunction │ │ │ │ │ ├── 80_87.mcfunction │ │ │ │ │ ├── 80_95.mcfunction │ │ │ │ │ ├── 84_85.mcfunction │ │ │ │ │ ├── 84_87.mcfunction │ │ │ │ │ ├── 8_11.mcfunction │ │ │ │ │ ├── 8_15.mcfunction │ │ │ │ │ └── 8_9.mcfunction │ │ │ │ ├── load.mcfunction │ │ │ │ ├── log.mcfunction │ │ │ │ ├── log_start.mcfunction │ │ │ │ ├── log_wait.mcfunction │ │ │ │ ├── outdated_logs/ │ │ │ │ │ ├── outdated_start.mcfunction │ │ │ │ │ └── traverse.mcfunction │ │ │ │ ├── post_load.mcfunction │ │ │ │ └── upgrade_paths/ │ │ │ │ ├── changed_dimension.mcfunction │ │ │ │ ├── join_game.mcfunction │ │ │ │ ├── load.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ └── run_when_loaded.mcfunction │ │ │ ├── loot_table/ │ │ │ │ ├── air.json │ │ │ │ └── empty.json │ │ │ ├── structure/ │ │ │ │ ├── test_box.nbt │ │ │ │ ├── test_platform.nbt │ │ │ │ ├── test_platform_large.nbt │ │ │ │ └── test_tube.nbt │ │ │ └── tags/ │ │ │ ├── block/ │ │ │ │ ├── foliage.json │ │ │ │ ├── full_collision.json │ │ │ │ ├── no_collision.json │ │ │ │ ├── replaceable.json │ │ │ │ ├── water.json │ │ │ │ └── waterloggable.json │ │ │ └── entity_type/ │ │ │ ├── boss.json │ │ │ ├── chest_boats.json │ │ │ ├── hostile.json │ │ │ ├── minecarts.json │ │ │ ├── neutral.json │ │ │ ├── neutral_hostile.json │ │ │ ├── neutral_passive.json │ │ │ ├── non_living.json │ │ │ └── passive.json │ │ ├── load/ │ │ │ ├── function/ │ │ │ │ └── _private/ │ │ │ │ └── init.mcfunction │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── _private/ │ │ │ │ ├── init.json │ │ │ │ └── load.json │ │ │ ├── gm4/ │ │ │ │ ├── enumerate.json │ │ │ │ ├── resolve_load.json │ │ │ │ └── resolve_post_load.json │ │ │ ├── gm4.json │ │ │ ├── post_load.json │ │ │ └── pre_load.json │ │ └── minecraft/ │ │ ├── loot_table/ │ │ │ ├── blocks/ │ │ │ │ └── player_head.json │ │ │ └── empty.json │ │ └── tags/ │ │ └── function/ │ │ └── load.json │ └── mod.mcdoc ├── beet-dev.yaml ├── beet-release.yaml ├── beet-test.yaml ├── commands.json ├── docs/ │ ├── code-conventions.md │ ├── getting-started.md │ ├── making-a-module.md │ ├── releasing-a-module.md │ └── resource-pack-management.md ├── gm4/ │ ├── commands.py │ ├── contributors.json │ ├── plugins/ │ │ ├── annotations.py │ │ ├── autoload.py │ │ ├── backwards.py │ │ ├── extend.py │ │ ├── finished.py │ │ ├── include.py │ │ ├── manifest.py │ │ ├── module.py │ │ ├── output.py │ │ ├── player_heads.py │ │ ├── prefabs.py │ │ ├── readme_generator.py │ │ ├── resource_pack.py │ │ ├── test.py │ │ ├── upgrade_paths.py │ │ ├── versioning.py │ │ ├── worker.py │ │ └── write_mcmeta.py │ ├── skin_cache.json │ └── utils.py ├── gm4_animi_shamir/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_animi_shamir/ │ │ │ ├── advancement/ │ │ │ │ └── join.json │ │ │ ├── function/ │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── initialize_item.mcfunction │ │ │ │ ├── item_caching/ │ │ │ │ │ ├── add_entry.mcfunction │ │ │ │ │ ├── prepare_entry.mcfunction │ │ │ │ │ ├── search_entry.mcfunction │ │ │ │ │ └── unpack_entry.mcfunction │ │ │ │ ├── player/ │ │ │ │ │ ├── rejoin.mcfunction │ │ │ │ │ ├── respawn_inventory.mcfunction │ │ │ │ │ ├── upon_death.mcfunction │ │ │ │ │ ├── upon_respawn.mcfunction │ │ │ │ │ └── wait_for_respawn.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── animi_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ ├── keep_items.mcfunction │ │ │ └── smoosh.mcfunction │ │ ├── gm4_metallurgy/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── check_item_validity.json │ │ │ └── summon_band/ │ │ │ └── curies_bismium.json │ │ └── gm4_player_death/ │ │ └── tags/ │ │ └── function/ │ │ └── soul_bound.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_apple_trees/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_apple_trees/ │ │ │ └── models/ │ │ │ └── block/ │ │ │ └── apple_unripe.json │ │ ├── gm4_golden_apple_trees/ │ │ │ └── models/ │ │ │ └── block/ │ │ │ └── golden_apple_unripe.json │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_apple_trees/ │ │ ├── advancement/ │ │ │ ├── apple_hand_empty.json │ │ │ └── apple_hand_item.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── leaf/ │ │ │ │ ├── advance_stage.mcfunction │ │ │ │ ├── age.mcfunction │ │ │ │ ├── apple/ │ │ │ │ │ ├── destroy.mcfunction │ │ │ │ │ ├── drop.mcfunction │ │ │ │ │ ├── hand_interact.mcfunction │ │ │ │ │ ├── interact.mcfunction │ │ │ │ │ └── pick.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── initialize.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── set_stage/ │ │ │ │ ├── 0.mcfunction │ │ │ │ ├── 1.mcfunction │ │ │ │ └── 2.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── sapling/ │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── generate_tree.mcfunction │ │ │ │ ├── grow/ │ │ │ │ │ ├── generate_random_apple_leaf.mcfunction │ │ │ │ │ └── generate_random_tree.mcfunction │ │ │ │ ├── initialize.mcfunction │ │ │ │ └── podzol_rooting.mcfunction │ │ │ ├── slow_clock.mcfunction │ │ │ ├── upgrade_path/ │ │ │ │ ├── apple_leaf_markers.mcfunction │ │ │ │ └── fruiting_to_general.mcfunction │ │ │ └── verify/ │ │ │ ├── destroy_leaf.mcfunction │ │ │ ├── destroy_sapling.mcfunction │ │ │ ├── generate_tree.mcfunction │ │ │ ├── initialize_sapling.mcfunction │ │ │ └── upgrade_fruiting_to_general.mcfunction │ │ ├── guidebook/ │ │ │ └── apple_trees.json │ │ ├── item_modifier/ │ │ │ └── count.json │ │ ├── loot_table/ │ │ │ ├── blocks/ │ │ │ │ ├── apple.json │ │ │ │ └── apple_tree_leaf.json │ │ │ └── items/ │ │ │ └── apple_tree_sapling.json │ │ ├── predicate/ │ │ │ ├── apple_gen_chance.json │ │ │ ├── apple_holding.json │ │ │ ├── apple_picked.json │ │ │ ├── corner_leaf_gen_chance.json │ │ │ ├── overworld.json │ │ │ └── valid_placement.json │ │ ├── structure/ │ │ │ ├── sapling_growth/ │ │ │ │ ├── NOTICE.txt │ │ │ │ ├── apple_leaf.nbt │ │ │ │ ├── apple_tree_short_1.nbt │ │ │ │ ├── apple_tree_short_2.nbt │ │ │ │ ├── apple_tree_short_3.nbt │ │ │ │ ├── apple_tree_short_4.nbt │ │ │ │ ├── apple_tree_tall_1.nbt │ │ │ │ ├── apple_tree_tall_2.nbt │ │ │ │ ├── apple_tree_tall_3.nbt │ │ │ │ ├── apple_tree_tall_4.nbt │ │ │ │ ├── jigsaw_structure_convert.py │ │ │ │ └── structure_normalize_palette.py │ │ │ └── worldgen/ │ │ │ ├── apple_leaf.nbt │ │ │ ├── apple_tree_short_1.nbt │ │ │ ├── apple_tree_short_2.nbt │ │ │ ├── apple_tree_short_3.nbt │ │ │ ├── apple_tree_short_4.nbt │ │ │ ├── apple_tree_tall_1.nbt │ │ │ ├── apple_tree_tall_2.nbt │ │ │ ├── apple_tree_tall_3.nbt │ │ │ ├── apple_tree_tall_4.nbt │ │ │ └── corner_leaf.nbt │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ └── tree_placeable.json │ │ │ └── worldgen/ │ │ │ └── biome/ │ │ │ └── has_structure/ │ │ │ └── apple_tree.json │ │ ├── villager_trade/ │ │ │ └── emerald_apple_tree_sapling.json │ │ └── worldgen/ │ │ ├── structure/ │ │ │ └── apple_tree.json │ │ ├── structure_set/ │ │ │ └── apple_tree.json │ │ └── template_pool/ │ │ ├── apple_leaf.json │ │ ├── apple_trees.json │ │ └── corner_leaf.json │ ├── gm4_golden_apple_trees/ │ │ ├── advancement/ │ │ │ ├── apple_hand_empty.json │ │ │ └── apple_hand_item.json │ │ ├── function/ │ │ │ ├── leaf/ │ │ │ │ ├── advance_stage.mcfunction │ │ │ │ ├── age.mcfunction │ │ │ │ ├── apple/ │ │ │ │ │ ├── destroy.mcfunction │ │ │ │ │ ├── drop.mcfunction │ │ │ │ │ ├── hand_interact.mcfunction │ │ │ │ │ ├── interact.mcfunction │ │ │ │ │ └── pick.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── initialize.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── set_stage/ │ │ │ │ ├── 0.mcfunction │ │ │ │ ├── 1.mcfunction │ │ │ │ └── 2.mcfunction │ │ │ └── root/ │ │ │ ├── branch.mcfunction │ │ │ ├── grow.mcfunction │ │ │ ├── initialize.mcfunction │ │ │ ├── place.mcfunction │ │ │ ├── process.mcfunction │ │ │ └── raycast.mcfunction │ │ ├── loot_table/ │ │ │ └── blocks/ │ │ │ ├── golden_apple.json │ │ │ └── golden_apple_tree_leaf.json │ │ ├── predicate/ │ │ │ ├── apple_holding.json │ │ │ └── apple_picked.json │ │ ├── structure/ │ │ │ └── worldgen/ │ │ │ ├── golden_apple_leaf.nbt │ │ │ ├── golden_apple_tree_short_1.nbt │ │ │ ├── golden_apple_tree_short_2.nbt │ │ │ ├── golden_apple_tree_short_3.nbt │ │ │ ├── golden_apple_tree_short_4.nbt │ │ │ ├── golden_apple_tree_tall_1.nbt │ │ │ ├── golden_apple_tree_tall_2.nbt │ │ │ ├── golden_apple_tree_tall_3.nbt │ │ │ └── golden_apple_tree_tall_4.nbt │ │ ├── tags/ │ │ │ └── block/ │ │ │ └── rootable.json │ │ └── worldgen/ │ │ ├── structure/ │ │ │ └── golden_apple_tree.json │ │ ├── structure_set/ │ │ │ └── golden_apple_tree.json │ │ └── template_pool/ │ │ ├── golden_apple_leaf.json │ │ └── golden_apple_trees.json │ ├── gm4_podzol_rooting_soil/ │ │ └── tags/ │ │ └── function/ │ │ └── plant_custom_sapling.json │ ├── gm4_trees/ │ │ └── tags/ │ │ └── function/ │ │ ├── destroy_leaf.json │ │ ├── destroy_sapling.json │ │ ├── generate_tree.json │ │ ├── initialize_sapling.json │ │ └── upgrade_fruiting_to_general.json │ └── minecraft/ │ ├── loot_table/ │ │ └── blocks/ │ │ ├── dark_oak_leaves.json │ │ └── oak_leaves.json │ └── tags/ │ └── villager_trade/ │ └── wandering_trader/ │ └── common.json ├── gm4_audere_shamir/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_audere_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active_tool.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ ├── tools/ │ │ │ │ │ ├── materials/ │ │ │ │ │ │ ├── copper.mcfunction │ │ │ │ │ │ ├── diamond.mcfunction │ │ │ │ │ │ ├── gold.mcfunction │ │ │ │ │ │ ├── iron.mcfunction │ │ │ │ │ │ ├── netherite.mcfunction │ │ │ │ │ │ ├── stone.mcfunction │ │ │ │ │ │ └── wood.mcfunction │ │ │ │ │ └── shears.mcfunction │ │ │ │ └── update_netherite.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── audere_shamir.json │ │ │ ├── item_modifier/ │ │ │ │ └── update_netherite.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── holding_audere.json │ │ │ │ └── holding_netherite.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ ├── netherite_tools.json │ │ │ └── valid_items.json │ │ └── gm4_metallurgy/ │ │ └── tags/ │ │ └── function/ │ │ ├── check_item_validity.json │ │ └── summon_band/ │ │ └── barium.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_balloon_animals/ │ ├── README.md │ ├── animals.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── balloon_animals.json │ │ └── gm4_balloon_animals/ │ │ ├── advancement/ │ │ │ └── purchased_animal.json │ │ ├── function/ │ │ │ ├── balloon/ │ │ │ │ ├── check_leashed.mcfunction │ │ │ │ ├── fly_away/ │ │ │ │ │ ├── animate.mcfunction │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── start_animation.mcfunction │ │ │ │ └── kill_orphan.mcfunction │ │ │ ├── debug/ │ │ │ │ ├── init_trader.mcfunction │ │ │ │ └── summon_trader_with_llamas.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── purchase/ │ │ │ │ ├── animal/ │ │ │ │ │ ├── cleanse.mcfunction │ │ │ │ │ ├── locate_cleanse.mcfunction │ │ │ │ │ ├── search.mcfunction │ │ │ │ │ └── update.mcfunction │ │ │ │ └── trader/ │ │ │ │ ├── check_trade.mcfunction │ │ │ │ ├── parse_trades.mcfunction │ │ │ │ ├── search.mcfunction │ │ │ │ └── update_trade.mcfunction │ │ │ ├── purchased_animal.mcfunction │ │ │ └── wandering_trader/ │ │ │ ├── check_eligibility.mcfunction │ │ │ ├── init_trader.mcfunction │ │ │ ├── llama/ │ │ │ │ ├── check_leasher.mcfunction │ │ │ │ ├── delay/ │ │ │ │ │ ├── find_lead.mcfunction │ │ │ │ │ └── lead_cleanup.mcfunction │ │ │ │ └── kill.mcfunction │ │ │ ├── pick_two_animals.mcfunction │ │ │ └── trade/ │ │ │ ├── add_bee_nest.mcfunction │ │ │ ├── add_chicken_egg.mcfunction │ │ │ ├── add_lead.mcfunction │ │ │ ├── add_turtle_egg.mcfunction │ │ │ ├── init_animal.mcfunction │ │ │ ├── init_farm.mcfunction │ │ │ ├── init_wolf.mcfunction │ │ │ └── pick_animal.mcfunction │ │ ├── guidebook/ │ │ │ └── balloon_animals.json │ │ ├── loot_table/ │ │ │ ├── lead.json │ │ │ └── technical/ │ │ │ └── random/ │ │ │ ├── enumeration_value.json │ │ │ ├── pick_common.json │ │ │ └── pick_rare.json │ │ ├── predicate/ │ │ │ ├── balloon_trader_chance.json │ │ │ └── is_lead.json │ │ └── tags/ │ │ └── entity_type/ │ │ └── balloon_animal.json │ ├── generate.py │ ├── mod.mcdoc │ └── translations.csv ├── gm4_bat_grenades/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── bat_grenades.json │ ├── gm4_bat_grenades/ │ │ ├── function/ │ │ │ ├── explode.mcfunction │ │ │ ├── init.mcfunction │ │ │ └── main.mcfunction │ │ ├── guidebook/ │ │ │ └── bat_grenades.json │ │ ├── loot_table/ │ │ │ └── items/ │ │ │ └── bat_leather.json │ │ └── test/ │ │ └── boom.mcfunction │ └── minecraft/ │ └── loot_table/ │ └── entities/ │ └── bat.json ├── gm4_better_armour_stands/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── better_armour_stands.json │ │ └── gm4_better_armour_stands/ │ │ ├── advancement/ │ │ │ ├── book/ │ │ │ │ ├── take.json │ │ │ │ ├── tracking.json │ │ │ │ ├── use.json │ │ │ │ └── use_arms.json │ │ │ ├── join.json │ │ │ ├── place.json │ │ │ └── pose/ │ │ │ ├── invert.json │ │ │ └── set.json │ │ ├── function/ │ │ │ ├── book/ │ │ │ │ ├── apply.mcfunction │ │ │ │ ├── hold.mcfunction │ │ │ │ ├── invalid.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── ray_arms.mcfunction │ │ │ │ ├── take.mcfunction │ │ │ │ ├── use.mcfunction │ │ │ │ └── use_arms.mcfunction │ │ │ ├── default/ │ │ │ │ ├── all.mcfunction │ │ │ │ ├── check.mcfunction │ │ │ │ └── part.mcfunction │ │ │ ├── equip/ │ │ │ │ ├── hand.mcfunction │ │ │ │ ├── head.mcfunction │ │ │ │ ├── offhand.mcfunction │ │ │ │ ├── remove/ │ │ │ │ │ ├── hand.mcfunction │ │ │ │ │ ├── head.mcfunction │ │ │ │ │ └── offhand.mcfunction │ │ │ │ ├── select/ │ │ │ │ │ ├── small.mcfunction │ │ │ │ │ └── tall.mcfunction │ │ │ │ └── select.mcfunction │ │ │ ├── get_id.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── place/ │ │ │ │ ├── check.mcfunction │ │ │ │ ├── copy.mcfunction │ │ │ │ └── new.mcfunction │ │ │ ├── pose/ │ │ │ │ ├── check_no_player.mcfunction │ │ │ │ ├── copy.mcfunction │ │ │ │ ├── copy_entity_data.mcfunction │ │ │ │ ├── flip.mcfunction │ │ │ │ ├── invert.mcfunction │ │ │ │ ├── mirror/ │ │ │ │ │ ├── arm_left.mcfunction │ │ │ │ │ ├── arm_right.mcfunction │ │ │ │ │ ├── leg_left.mcfunction │ │ │ │ │ └── leg_right.mcfunction │ │ │ │ ├── move.mcfunction │ │ │ │ ├── paste.mcfunction │ │ │ │ ├── rotate.mcfunction │ │ │ │ ├── select/ │ │ │ │ │ ├── arm_left.mcfunction │ │ │ │ │ ├── arm_right.mcfunction │ │ │ │ │ ├── body.mcfunction │ │ │ │ │ ├── failure.mcfunction │ │ │ │ │ ├── head.mcfunction │ │ │ │ │ ├── leg_left.mcfunction │ │ │ │ │ ├── leg_right.mcfunction │ │ │ │ │ ├── move/ │ │ │ │ │ │ ├── move.mcfunction │ │ │ │ │ │ ├── offset.mcfunction │ │ │ │ │ │ └── ray.mcfunction │ │ │ │ │ ├── rotate.mcfunction │ │ │ │ │ ├── small.mcfunction │ │ │ │ │ ├── success.mcfunction │ │ │ │ │ └── tall.mcfunction │ │ │ │ ├── select.mcfunction │ │ │ │ ├── set.mcfunction │ │ │ │ ├── set_no_player.mcfunction │ │ │ │ ├── snap/ │ │ │ │ │ ├── pose.mcfunction │ │ │ │ │ ├── position.mcfunction │ │ │ │ │ └── rotation.mcfunction │ │ │ │ ├── track/ │ │ │ │ │ ├── arm_left.mcfunction │ │ │ │ │ ├── arm_right.mcfunction │ │ │ │ │ ├── body.mcfunction │ │ │ │ │ ├── clear.mcfunction │ │ │ │ │ ├── head.mcfunction │ │ │ │ │ ├── leg_left.mcfunction │ │ │ │ │ ├── leg_right.mcfunction │ │ │ │ │ ├── move.mcfunction │ │ │ │ │ ├── rotate.mcfunction │ │ │ │ │ ├── select_armour_stand.mcfunction │ │ │ │ │ ├── tick.mcfunction │ │ │ │ │ ├── update.mcfunction │ │ │ │ │ ├── update_joint.mcfunction │ │ │ │ │ ├── update_markers.mcfunction │ │ │ │ │ └── update_pose.mcfunction │ │ │ │ └── undo.mcfunction │ │ │ ├── tick.mcfunction │ │ │ ├── toggle/ │ │ │ │ ├── arms/ │ │ │ │ │ ├── arms.mcfunction │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── detect_interaction.mcfunction │ │ │ │ │ ├── remove_detection.mcfunction │ │ │ │ │ └── select.mcfunction │ │ │ │ ├── base.mcfunction │ │ │ │ ├── gravity.mcfunction │ │ │ │ ├── lock/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── detect_interaction.mcfunction │ │ │ │ │ ├── lock.mcfunction │ │ │ │ │ ├── remove_temp_unlock.mcfunction │ │ │ │ │ └── unlock.mcfunction │ │ │ │ ├── size.mcfunction │ │ │ │ ├── turn.mcfunction │ │ │ │ └── visible.mcfunction │ │ │ └── turn.mcfunction │ │ ├── guidebook/ │ │ │ └── better_armour_stands.json │ │ ├── item_modifier/ │ │ │ ├── add_ignore.json │ │ │ ├── copy.json │ │ │ ├── count.json │ │ │ ├── remove_ignore.json │ │ │ └── remove_item.json │ │ ├── loot_table/ │ │ │ └── replaced_item.json │ │ ├── predicate/ │ │ │ ├── coord_check.json │ │ │ ├── emptybook.json │ │ │ ├── holding/ │ │ │ │ ├── mainhand/ │ │ │ │ │ ├── armor_stand_copy.json │ │ │ │ │ ├── book_and_quill.json │ │ │ │ │ ├── book_arms.json │ │ │ │ │ ├── book_ignore.json │ │ │ │ │ ├── book_unlock.json │ │ │ │ │ └── book_visible.json │ │ │ │ └── offhand/ │ │ │ │ ├── armor_stand.json │ │ │ │ └── nothing.json │ │ │ ├── select/ │ │ │ │ ├── base.json │ │ │ │ ├── body.json │ │ │ │ ├── head.json │ │ │ │ ├── left_arm.json │ │ │ │ ├── left_leg.json │ │ │ │ ├── right_arm.json │ │ │ │ └── right_leg.json │ │ │ └── sneaking.json │ │ └── tags/ │ │ └── function/ │ │ ├── apply_book.json │ │ └── default.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_block_compressors/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_block_compressors/ │ │ │ └── models/ │ │ │ └── block/ │ │ │ ├── block_compressor_full.json │ │ │ └── block_compressor_plate.json │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── block_compressors.json │ │ │ └── block_compressors_compressed_diet.json │ │ ├── gm4_block_compressors/ │ │ │ ├── advancement/ │ │ │ │ └── recipes/ │ │ │ │ └── compressor.json │ │ │ ├── function/ │ │ │ │ ├── init.mcfunction │ │ │ │ ├── item/ │ │ │ │ │ ├── compress.mcfunction │ │ │ │ │ ├── decompress.mcfunction │ │ │ │ │ ├── set_lore.mcfunction │ │ │ │ │ ├── try_compress.mcfunction │ │ │ │ │ └── try_decompress.mcfunction │ │ │ │ ├── item.mcfunction │ │ │ │ ├── machine/ │ │ │ │ │ ├── create.mcfunction │ │ │ │ │ ├── destroy.mcfunction │ │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ │ └── verify_place_down.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── pressure_plate_down.mcfunction │ │ │ │ ├── pressure_plate_up.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── upgrade_paths/ │ │ │ │ └── 1.4.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── block_compressors.json │ │ │ ├── loot_table/ │ │ │ │ └── items/ │ │ │ │ └── block_compressor.json │ │ │ ├── recipe/ │ │ │ │ └── compressor.json │ │ │ └── test/ │ │ │ ├── compress_64.mcfunction │ │ │ ├── compress_7.mcfunction │ │ │ ├── decompress_64.mcfunction │ │ │ ├── destroy.mcfunction │ │ │ ├── fixed_uuid_present.mcfunction │ │ │ └── place.mcfunction │ │ └── gm4_machines/ │ │ └── tags/ │ │ └── function/ │ │ ├── destroy.json │ │ └── place_down.json │ └── mod.mcdoc ├── gm4_blossoming_pots/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_blossoming_pots/ │ │ ├── advancement/ │ │ │ ├── interact_with_decorated_pot.json │ │ │ ├── interact_with_flower_pot.json │ │ │ └── interact_with_vanilla_flower_pot.json │ │ ├── function/ │ │ │ ├── decorated/ │ │ │ │ ├── as_player.mcfunction │ │ │ │ ├── check_if_pot_empty.mcfunction │ │ │ │ ├── get_player_rotation.mcfunction │ │ │ │ ├── in_decorated_pot.mcfunction │ │ │ │ ├── prepare_data.mcfunction │ │ │ │ ├── raycast.mcfunction │ │ │ │ ├── set_count.mcfunction │ │ │ │ ├── set_displays.mcfunction │ │ │ │ ├── set_storage.mcfunction │ │ │ │ └── set_temp_data.mcfunction │ │ │ ├── flower/ │ │ │ │ ├── as_player.mcfunction │ │ │ │ ├── cleanup.mcfunction │ │ │ │ ├── get_player_data.mcfunction │ │ │ │ ├── give_item_to_player.mcfunction │ │ │ │ ├── in_flower_pot.mcfunction │ │ │ │ ├── prepare_data.mcfunction │ │ │ │ ├── raycast.mcfunction │ │ │ │ ├── remove_plant.mcfunction │ │ │ │ ├── set_displays.mcfunction │ │ │ │ ├── set_storage.mcfunction │ │ │ │ └── set_temp_data.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── play_sound.mcfunction │ │ │ ├── upgrade_paths/ │ │ │ │ ├── 3.1/ │ │ │ │ │ ├── check_legacy_flower_pot_in_storage.mcfunction │ │ │ │ │ ├── drop_legacy_items.mcfunction │ │ │ │ │ ├── legacy_decorated_pot.mcfunction │ │ │ │ │ └── legacy_flower_pot.mcfunction │ │ │ │ ├── 3.1.mcfunction │ │ │ │ ├── 3.4/ │ │ │ │ │ └── remove_perma_marker.mcfunction │ │ │ │ └── 3.4.mcfunction │ │ │ └── vanilla_pot_handling/ │ │ │ ├── as_marker.mcfunction │ │ │ ├── as_player.mcfunction │ │ │ ├── get_dropped_item.mcfunction │ │ │ ├── give_item_back.mcfunction │ │ │ ├── in_vanilla_flower_pot.mcfunction │ │ │ └── raycast.mcfunction │ │ ├── guidebook/ │ │ │ └── blossoming_pots.json │ │ ├── predicate/ │ │ │ └── item_potable.json │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ └── potted_plants.json │ │ │ └── item/ │ │ │ └── potable_plants.json │ │ └── test/ │ │ ├── decorated_pot_bounding_box.mcfunction │ │ ├── place_in_decorated_pot.mcfunction │ │ ├── place_in_flower_pot.mcfunction │ │ ├── upgrade_path_3.1.mcfunction │ │ ├── upgrade_path_3.4.mcfunction │ │ └── vanilla_pot_handling.mcfunction │ └── translations.csv ├── gm4_book_binders/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── book_binders.json │ │ │ ├── book_binders_bind.json │ │ │ └── book_binders_debind.json │ │ └── gm4_book_binders/ │ │ ├── advancement/ │ │ │ └── place_new_lectern.json │ │ ├── function/ │ │ │ ├── binder/ │ │ │ │ ├── hopper_grab.mcfunction │ │ │ │ ├── placement/ │ │ │ │ │ ├── detect_facing.mcfunction │ │ │ │ │ ├── disable.mcfunction │ │ │ │ │ ├── drop_hand_item.mcfunction │ │ │ │ │ ├── drop_stored_item.mcfunction │ │ │ │ │ ├── enable.mcfunction │ │ │ │ │ ├── find_lectern.mcfunction │ │ │ │ │ ├── kill.mcfunction │ │ │ │ │ └── revoke_advancement.mcfunction │ │ │ │ ├── recipes/ │ │ │ │ │ ├── bind.mcfunction │ │ │ │ │ ├── check_recipes.mcfunction │ │ │ │ │ ├── debind.mcfunction │ │ │ │ │ └── page.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── process_binders.mcfunction │ │ ├── guidebook/ │ │ │ └── book_binders.json │ │ ├── loot_table/ │ │ │ └── debind_book.json │ │ ├── predicate/ │ │ │ └── successful_process.json │ │ └── test/ │ │ ├── binding.mcfunction │ │ └── debinding.mcfunction │ └── mod.mcdoc ├── gm4_bookshelf_inspector/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_bookshelf_inspector/ │ │ ├── function/ │ │ │ ├── evaluate/ │ │ │ │ ├── raycast.mcfunction │ │ │ │ └── run.mcfunction │ │ │ ├── find_book/ │ │ │ │ ├── find_book.mcfunction │ │ │ │ ├── get_book_slot.mcfunction │ │ │ │ ├── get_rotation.mcfunction │ │ │ │ ├── prep.mcfunction │ │ │ │ └── raycast.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── process_display/ │ │ │ ├── check_location.mcfunction │ │ │ ├── locate_slot.mcfunction │ │ │ ├── remove/ │ │ │ │ ├── process.mcfunction │ │ │ │ ├── start.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── spawn/ │ │ │ │ ├── components_to_list.mcfunction │ │ │ │ ├── decide_name.mcfunction │ │ │ │ ├── eval_enchantment.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── list_enchantments.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── process_enchantments.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ └── update.mcfunction │ │ └── guidebook/ │ │ └── bookshelf_inspector.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_boots_of_ostara/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_boots_of_ostara/ │ │ │ └── optifine/ │ │ │ └── cit/ │ │ │ └── boots_of_ostara.properties │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── boots_of_ostara.json │ ├── gm4_boots_of_ostara/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ └── boots_of_ostara.json │ │ ├── function/ │ │ │ ├── block_desire_lines.mcfunction │ │ │ ├── convert.mcfunction │ │ │ ├── init.mcfunction │ │ │ └── main.mcfunction │ │ ├── guidebook/ │ │ │ └── boots_of_ostara.json │ │ ├── loot_table/ │ │ │ └── items/ │ │ │ └── boots_of_ostara.json │ │ ├── predicate/ │ │ │ └── boots_equipped.json │ │ ├── recipe/ │ │ │ └── boots_of_ostara.json │ │ ├── tags/ │ │ │ └── block/ │ │ │ ├── moss_replaceable.json │ │ │ └── mycelium_replaceable.json │ │ └── test/ │ │ ├── armor_stand_both.mcfunction │ │ ├── armor_stand_both_backwards.mcfunction │ │ ├── armor_stand_grass.mcfunction │ │ ├── armor_stand_moss.mcfunction │ │ ├── player_grass.mcfunction │ │ └── player_moss.mcfunction │ └── gm4_desire_lines/ │ └── tags/ │ └── function/ │ └── expansion.json ├── gm4_calling_bell/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── calling_bell.json │ │ └── gm4_calling_bell/ │ │ ├── advancement/ │ │ │ └── ring_bell.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── on_bell_interact.mcfunction │ │ │ ├── raycast.mcfunction │ │ │ └── summon_trader.mcfunction │ │ ├── guidebook/ │ │ │ └── calling_bell.json │ │ ├── item_modifier/ │ │ │ └── minus_one.json │ │ ├── predicate/ │ │ │ └── trader_hitbox_no_collision.json │ │ └── test/ │ │ ├── call.mcfunction │ │ └── call_blocked.mcfunction │ └── translations.csv ├── gm4_cement_mixers/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_cement_mixers/ │ │ │ ├── function/ │ │ │ │ ├── init.mcfunction │ │ │ │ ├── item_fill.mcfunction │ │ │ │ └── water_concrete.mcfunction │ │ │ └── guidebook/ │ │ │ └── cement_mixers.json │ │ └── gm4_liquid_tanks/ │ │ └── tags/ │ │ └── function/ │ │ └── item_fill.json │ └── translations.csv ├── gm4_chairs/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── chairs_creation.json │ │ │ └── chairs_sit.json │ │ └── gm4_chairs/ │ │ ├── advancement/ │ │ │ ├── hit.json │ │ │ └── lightning.json │ │ ├── function/ │ │ │ ├── create_chair.mcfunction │ │ │ ├── hit.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── kill.mcfunction │ │ │ ├── lightning/ │ │ │ │ ├── revive_chair.mcfunction │ │ │ │ └── tag.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── sit/ │ │ │ ├── check.mcfunction │ │ │ └── counter.mcfunction │ │ ├── guidebook/ │ │ │ └── chairs.json │ │ ├── loot_table/ │ │ │ └── drop_saddle.json │ │ ├── predicate/ │ │ │ └── sitting_in_chair.json │ │ └── test/ │ │ └── create.mcfunction │ └── translations.csv ├── gm4_cooler_caves/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_cooler_caves/ │ │ │ ├── function/ │ │ │ │ └── init.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── cooler_caves.json │ │ │ ├── tags/ │ │ │ │ └── block/ │ │ │ │ ├── badlands_ore_replaceables.json │ │ │ │ ├── base_desert_overworld.json │ │ │ │ └── base_snowy_overworld.json │ │ │ └── worldgen/ │ │ │ ├── configured_feature/ │ │ │ │ ├── badlands/ │ │ │ │ │ ├── glow_lichen.json │ │ │ │ │ ├── ore_coal.json │ │ │ │ │ ├── ore_coal_buried.json │ │ │ │ │ ├── ore_copper_small.json │ │ │ │ │ ├── ore_diamond_buried.json │ │ │ │ │ ├── ore_diamond_large.json │ │ │ │ │ ├── ore_diamond_small.json │ │ │ │ │ ├── ore_gold.json │ │ │ │ │ ├── ore_gold_buried.json │ │ │ │ │ ├── ore_iron.json │ │ │ │ │ ├── ore_iron_small.json │ │ │ │ │ ├── ore_lapis.json │ │ │ │ │ ├── ore_lapis_buried.json │ │ │ │ │ └── ore_redstone.json │ │ │ │ ├── desert/ │ │ │ │ │ ├── glow_lichen.json │ │ │ │ │ └── ore_sand.json │ │ │ │ └── snowy/ │ │ │ │ ├── glow_lichen.json │ │ │ │ ├── ore_blue_ice.json │ │ │ │ ├── ore_ice.json │ │ │ │ ├── ore_packed_ice.json │ │ │ │ ├── ore_packed_ice_small.json │ │ │ │ ├── ore_powder_snow.json │ │ │ │ └── trees.json │ │ │ └── placed_feature/ │ │ │ ├── badlands/ │ │ │ │ ├── glow_lichen.json │ │ │ │ ├── ore_coal_lower.json │ │ │ │ ├── ore_coal_upper.json │ │ │ │ ├── ore_copper.json │ │ │ │ ├── ore_diamond.json │ │ │ │ ├── ore_diamond_buried.json │ │ │ │ ├── ore_diamond_large.json │ │ │ │ ├── ore_gold.json │ │ │ │ ├── ore_gold_lower.json │ │ │ │ ├── ore_iron_middle.json │ │ │ │ ├── ore_iron_small.json │ │ │ │ ├── ore_iron_upper.json │ │ │ │ ├── ore_lapis.json │ │ │ │ ├── ore_lapis_buried.json │ │ │ │ ├── ore_redstone.json │ │ │ │ └── ore_redstone_lower.json │ │ │ ├── desert/ │ │ │ │ ├── glow_lichen.json │ │ │ │ └── ore_sand.json │ │ │ └── snowy/ │ │ │ ├── glow_lichen.json │ │ │ ├── ore_blue_ice_lower.json │ │ │ ├── ore_blue_ice_upper.json │ │ │ ├── ore_ice_lower.json │ │ │ ├── ore_ice_upper.json │ │ │ ├── ore_packed_ice_lower.json │ │ │ ├── ore_packed_ice_small.json │ │ │ ├── ore_packed_ice_upper.json │ │ │ ├── ore_powder_snow.json │ │ │ ├── patch_berry_rare.json │ │ │ ├── patch_snow_layer.json │ │ │ ├── trees.json │ │ │ └── trees_taiga.json │ │ └── minecraft/ │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ └── stone_ore_replaceables.json │ │ │ └── worldgen/ │ │ │ └── placed_feature/ │ │ │ ├── underground_ores/ │ │ │ │ └── in_biome/ │ │ │ │ ├── badlands.json │ │ │ │ ├── desert.json │ │ │ │ ├── eroded_badlands.json │ │ │ │ ├── frozen_peaks.json │ │ │ │ ├── frozen_river.json │ │ │ │ ├── grove.json │ │ │ │ ├── ice_spikes.json │ │ │ │ ├── snowy_beach.json │ │ │ │ ├── snowy_plains.json │ │ │ │ ├── snowy_slopes.json │ │ │ │ ├── snowy_taiga.json │ │ │ │ └── wooded_badlands.json │ │ │ └── vegetal_decoration/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── desert.json │ │ │ ├── eroded_badlands.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ └── wooded_badlands.json │ │ └── worldgen/ │ │ └── noise_settings/ │ │ └── overworld.json │ └── translations.csv ├── gm4_cozy_campfires/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_cozy_campfires/ │ │ ├── advancement/ │ │ │ └── place_campfire.json │ │ ├── function/ │ │ │ ├── cozy_campfire.mcfunction │ │ │ ├── cozy_player.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── placement/ │ │ │ ├── place.mcfunction │ │ │ └── ray.mcfunction │ │ ├── guidebook/ │ │ │ └── cozy_campfires.json │ │ └── test/ │ │ └── regeneration.mcfunction │ └── translations.csv ├── gm4_crossbow_cartridges/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── crossbow_cartridges_bucket.json │ │ │ └── crossbow_cartridges_string.json │ │ └── gm4_crossbow_cartridges/ │ │ ├── advancement/ │ │ │ └── shoot_crossbow.json │ │ ├── function/ │ │ │ ├── cables/ │ │ │ │ ├── determine_direction.mcfunction │ │ │ │ ├── hook_success.mcfunction │ │ │ │ ├── place_hook.mcfunction │ │ │ │ ├── place_tripwire.mcfunction │ │ │ │ ├── shoot_arrow.mcfunction │ │ │ │ └── unspool_string.mcfunction │ │ │ ├── check_projectile.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── projectile/ │ │ │ │ ├── arrow_motion.mcfunction │ │ │ │ ├── beehive.mcfunction │ │ │ │ ├── bucket/ │ │ │ │ │ ├── axolotl.mcfunction │ │ │ │ │ ├── cod.mcfunction │ │ │ │ │ ├── multishot/ │ │ │ │ │ │ ├── axolotl.mcfunction │ │ │ │ │ │ ├── cod.mcfunction │ │ │ │ │ │ ├── pufferfish.mcfunction │ │ │ │ │ │ ├── salmon.mcfunction │ │ │ │ │ │ ├── tadpole.mcfunction │ │ │ │ │ │ └── tropical.mcfunction │ │ │ │ │ ├── pufferfish.mcfunction │ │ │ │ │ ├── salmon.mcfunction │ │ │ │ │ ├── tadpole.mcfunction │ │ │ │ │ └── tropical.mcfunction │ │ │ │ ├── bucket.mcfunction │ │ │ │ ├── copper_torch/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── place.mcfunction │ │ │ │ ├── copper_torch.mcfunction │ │ │ │ ├── fireball.mcfunction │ │ │ │ ├── fireball_kill.mcfunction │ │ │ │ ├── potions.mcfunction │ │ │ │ ├── redstone_torch/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── place.mcfunction │ │ │ │ ├── redstone_torch.mcfunction │ │ │ │ ├── set_bees.mcfunction │ │ │ │ ├── soul_torch/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── place.mcfunction │ │ │ │ ├── soul_torch.mcfunction │ │ │ │ ├── tnt.mcfunction │ │ │ │ ├── torch/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── place.mcfunction │ │ │ │ ├── torch.mcfunction │ │ │ │ ├── wind_charge.mcfunction │ │ │ │ └── wind_charge_kill.mcfunction │ │ │ └── shoot/ │ │ │ ├── any_arrow.mcfunction │ │ │ ├── potion_effect.mcfunction │ │ │ ├── spectral.mcfunction │ │ │ └── tipped.mcfunction │ │ ├── guidebook/ │ │ │ └── crossbow_cartridges.json │ │ ├── item_modifier/ │ │ │ └── remove_item.json │ │ ├── predicate/ │ │ │ ├── check_block/ │ │ │ │ ├── below.json │ │ │ │ ├── east.json │ │ │ │ ├── north.json │ │ │ │ ├── south.json │ │ │ │ └── west.json │ │ │ └── items/ │ │ │ ├── axolotl.json │ │ │ ├── beehive.json │ │ │ ├── bucket.json │ │ │ ├── cod.json │ │ │ ├── copper_torch.json │ │ │ ├── fire_charge.json │ │ │ ├── lingering_potion.json │ │ │ ├── potions.json │ │ │ ├── pufferfish.json │ │ │ ├── redstone_torch.json │ │ │ ├── salmon.json │ │ │ ├── soul_torch.json │ │ │ ├── splash_potion.json │ │ │ ├── string.json │ │ │ ├── tadpole.json │ │ │ ├── tnt.json │ │ │ ├── torch.json │ │ │ ├── tropical.json │ │ │ └── wind_charge.json │ │ └── tags/ │ │ ├── block/ │ │ │ ├── string_replaceable.json │ │ │ ├── torch.json │ │ │ └── torch_placeable_top.json │ │ └── item/ │ │ ├── bucket.json │ │ └── valid_items.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_dangerous_dungeons/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_dangerous_dungeons/ │ │ ├── function/ │ │ │ └── init.mcfunction │ │ ├── guidebook/ │ │ │ └── dangerous_dungeons.json │ │ ├── structure/ │ │ │ └── dungeon/ │ │ │ ├── badlands/ │ │ │ │ ├── default.nbt │ │ │ │ ├── large/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── lower/ │ │ │ │ │ │ ├── a.nbt │ │ │ │ │ │ ├── b.nbt │ │ │ │ │ │ └── c.nbt │ │ │ │ │ └── upper/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ └── c.nbt │ │ │ │ ├── medium_1/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ ├── base_featured.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── medium_2/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ └── c.nbt │ │ │ │ └── tiny/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ ├── d.nbt │ │ │ │ └── e.nbt │ │ │ ├── deep_slate/ │ │ │ │ ├── large_1/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── chests/ │ │ │ │ │ │ ├── a.nbt │ │ │ │ │ │ └── b.nbt │ │ │ │ │ └── spawners/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ └── b.nbt │ │ │ │ ├── large_2/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── liquid/ │ │ │ │ │ │ ├── lava_1.nbt │ │ │ │ │ │ ├── lava_2.nbt │ │ │ │ │ │ ├── lava_3.nbt │ │ │ │ │ │ └── water.nbt │ │ │ │ │ └── upper/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── medium/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ ├── e.nbt │ │ │ │ │ ├── f.nbt │ │ │ │ │ ├── g.nbt │ │ │ │ │ └── h.nbt │ │ │ │ └── small/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── chests/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ └── spawners/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ └── d.nbt │ │ │ ├── default/ │ │ │ │ └── default.nbt │ │ │ ├── default.nbt │ │ │ ├── desert/ │ │ │ │ ├── default.nbt │ │ │ │ ├── large/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── lower/ │ │ │ │ │ │ ├── a.nbt │ │ │ │ │ │ ├── b.nbt │ │ │ │ │ │ └── c.nbt │ │ │ │ │ └── upper/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ └── c.nbt │ │ │ │ ├── medium_1/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ ├── base_featured.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── medium_2/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ └── c.nbt │ │ │ │ └── tiny/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ ├── d.nbt │ │ │ │ └── e.nbt │ │ │ ├── lush/ │ │ │ │ ├── grid_1/ │ │ │ │ │ └── base.nbt │ │ │ │ ├── grid_2/ │ │ │ │ │ └── base.nbt │ │ │ │ ├── grid_large/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ └── grid_small/ │ │ │ │ └── base.nbt │ │ │ ├── ocean/ │ │ │ │ ├── default.nbt │ │ │ │ ├── large/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── medium_1/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── medium_2/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── decor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ └── e.nbt │ │ │ │ └── small/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ └── d.nbt │ │ │ ├── ocean.nbt │ │ │ ├── snowy/ │ │ │ │ └── default.nbt │ │ │ └── stone/ │ │ │ ├── default.nbt │ │ │ ├── default2.nbt │ │ │ ├── large/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── center/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ └── corner/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ └── c.nbt │ │ │ ├── medium_1/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── long/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ └── e.nbt │ │ │ │ └── short/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ └── d.nbt │ │ │ ├── medium_2/ │ │ │ │ ├── base.nbt │ │ │ │ └── decor/ │ │ │ │ ├── lower_floor/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ └── e.nbt │ │ │ │ └── upper_floor/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ └── c.nbt │ │ │ └── temple/ │ │ │ ├── base.nbt │ │ │ └── decor/ │ │ │ ├── a.nbt │ │ │ └── b.nbt │ │ ├── tags/ │ │ │ └── worldgen/ │ │ │ └── biome/ │ │ │ ├── is_desert.json │ │ │ ├── is_lush.json │ │ │ ├── is_snowy.json │ │ │ └── is_stone_base.json │ │ └── worldgen/ │ │ ├── structure/ │ │ │ ├── badlands/ │ │ │ │ ├── lower.json │ │ │ │ └── upper.json │ │ │ ├── deep_slate.json │ │ │ ├── desert.json │ │ │ ├── lush.json │ │ │ ├── ocean/ │ │ │ │ ├── default.json │ │ │ │ └── surface.json │ │ │ ├── snowy.json │ │ │ └── stone/ │ │ │ ├── default.json │ │ │ └── ocean.json │ │ ├── structure_set/ │ │ │ ├── dungeons_lower.json │ │ │ ├── dungeons_upper.json │ │ │ └── ocean_surface.json │ │ └── template_pool/ │ │ ├── dungeon/ │ │ │ ├── badlands.json │ │ │ ├── deep_slate.json │ │ │ ├── desert.json │ │ │ ├── lush.json │ │ │ ├── ocean/ │ │ │ │ ├── default.json │ │ │ │ └── surface.json │ │ │ ├── snowy.json │ │ │ └── stone.json │ │ └── subpart/ │ │ ├── badlands/ │ │ │ ├── large/ │ │ │ │ ├── lower_features.json │ │ │ │ └── upper_features.json │ │ │ ├── medium_1_features.json │ │ │ ├── medium_2_features.json │ │ │ └── tiny_features.json │ │ ├── deep_slate/ │ │ │ ├── large_1/ │ │ │ │ ├── chests.json │ │ │ │ └── spawners.json │ │ │ ├── large_2/ │ │ │ │ ├── liquid.json │ │ │ │ └── upper.json │ │ │ ├── medium_features.json │ │ │ └── small/ │ │ │ ├── chest_sets.json │ │ │ └── spawner_sets.json │ │ ├── desert/ │ │ │ ├── large/ │ │ │ │ ├── lower_features.json │ │ │ │ └── upper_features.json │ │ │ ├── medium_1_features.json │ │ │ ├── medium_2_features.json │ │ │ └── tiny_features.json │ │ ├── lush/ │ │ │ └── grid_large_features.json │ │ ├── ocean/ │ │ │ ├── large_features.json │ │ │ ├── medium_1_features.json │ │ │ ├── medium_2_features.json │ │ │ └── small_features.json │ │ └── stone/ │ │ ├── large/ │ │ │ ├── center_features.json │ │ │ └── corner_features.json │ │ ├── medium_1/ │ │ │ ├── long_side.json │ │ │ └── short_side.json │ │ ├── medium_2/ │ │ │ ├── lower_floor.json │ │ │ └── upper_floor.json │ │ └── temple_side.json │ └── translations.csv ├── gm4_desire_lines/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── desire_lines_10000.json │ │ │ └── desire_lines_8000.json │ │ ├── gm4_celaro_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── celaro_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── shamir_active.json │ │ │ │ └── stealth_active.json │ │ │ └── tags/ │ │ │ ├── block/ │ │ │ │ └── tall_plants.json │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_desire_lines/ │ │ │ ├── function/ │ │ │ │ ├── init.mcfunction │ │ │ │ ├── path.mcfunction │ │ │ │ ├── player.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── desire_lines.json │ │ │ ├── predicate/ │ │ │ │ ├── can_coarse_dirt.json │ │ │ │ ├── feather_falling_fail.json │ │ │ │ └── is_affected.json │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── expansion.json │ │ │ └── load.json │ │ └── gm4_metallurgy/ │ │ └── tags/ │ │ └── function/ │ │ ├── check_item_validity.json │ │ └── summon_band/ │ │ └── aluminium.json │ └── translations.csv ├── gm4_disassemblers/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── disassemblers.json │ │ ├── gm4_disassemblers/ │ │ │ ├── advancement/ │ │ │ │ └── recipes/ │ │ │ │ └── disassembler.json │ │ │ ├── function/ │ │ │ │ ├── check_disassemble_recipe.mcfunction │ │ │ │ ├── check_item.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── machine/ │ │ │ │ │ ├── create.mcfunction │ │ │ │ │ ├── destroy.mcfunction │ │ │ │ │ ├── place_rotated.mcfunction │ │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ │ └── verify_place_down.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── upgrade_paths/ │ │ │ │ ├── 2.6/ │ │ │ │ │ └── item_display.mcfunction │ │ │ │ └── 2.6.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── disassemblers.json │ │ │ ├── loot_table/ │ │ │ │ └── items/ │ │ │ │ └── disassembler.json │ │ │ ├── recipe/ │ │ │ │ └── disassembler.json │ │ │ ├── tags/ │ │ │ │ └── function/ │ │ │ │ ├── after_base.json │ │ │ │ ├── before_base.json │ │ │ │ └── during_base.json │ │ │ └── test/ │ │ │ ├── disassemble.mcfunction │ │ │ └── place.mcfunction │ │ ├── gm4_machines/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── destroy.json │ │ │ └── place_down.json │ │ └── minecraft/ │ │ └── tags/ │ │ └── item/ │ │ ├── gold_tool_materials.json │ │ └── iron_tool_materials.json │ ├── generate_disassembly.py │ └── mod.mcdoc ├── gm4_display_frames/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── display_frames.json │ │ ├── gm4_display_frames/ │ │ │ ├── function/ │ │ │ │ ├── frame/ │ │ │ │ │ └── invisible/ │ │ │ │ │ ├── apply_invisibility.mcfunction │ │ │ │ │ ├── clear_invisibility.mcfunction │ │ │ │ │ ├── create.mcfunction │ │ │ │ │ └── process.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ └── potion_tracking/ │ │ │ │ ├── splash_item_frames.mcfunction │ │ │ │ ├── tag_potion.mcfunction │ │ │ │ └── verify_landed_potion.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── display_frames.json │ │ │ ├── tags/ │ │ │ │ └── entity_type/ │ │ │ │ └── potion_tracker.json │ │ │ └── test/ │ │ │ └── splash.mcfunction │ │ └── gm4_potion_tracking/ │ │ └── tags/ │ │ └── function/ │ │ ├── potion_landed.json │ │ └── tag_potion.json │ └── translations.csv ├── gm4_double_doors/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_double_doors/ │ │ ├── function/ │ │ │ ├── auto_toggle_marker/ │ │ │ │ ├── find.mcfunction │ │ │ │ ├── maintain.mcfunction │ │ │ │ ├── player_departed.mcfunction │ │ │ │ ├── player_present.mcfunction │ │ │ │ └── select_material.mcfunction │ │ │ └── init.mcfunction │ │ ├── guidebook/ │ │ │ └── double_doors.json │ │ ├── structure/ │ │ │ └── test/ │ │ │ ├── valid_door_east_inverted.nbt │ │ │ ├── valid_door_east_normal.nbt │ │ │ ├── valid_door_north_inverted.nbt │ │ │ ├── valid_door_north_normal.nbt │ │ │ ├── valid_door_south_inverted.nbt │ │ │ ├── valid_door_south_normal.nbt │ │ │ ├── valid_door_west_inverted.nbt │ │ │ └── valid_door_west_normal.nbt │ │ ├── templates/ │ │ │ ├── advancement/ │ │ │ │ ├── use_left_hinge_door.json │ │ │ │ └── use_right_hinge_door.json │ │ │ ├── function/ │ │ │ │ ├── door/ │ │ │ │ │ ├── left_hinge/ │ │ │ │ │ │ ├── east/ │ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ │ ├── get_facing.mcfunction │ │ │ │ │ │ ├── get_lower_half.mcfunction │ │ │ │ │ │ ├── north/ │ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ │ ├── south/ │ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ │ ├── use.mcfunction │ │ │ │ │ │ └── west/ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ └── right_hinge/ │ │ │ │ │ ├── east/ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ ├── get_facing.mcfunction │ │ │ │ │ ├── get_lower_half.mcfunction │ │ │ │ │ ├── north/ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ ├── south/ │ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ │ └── toggle.mcfunction │ │ │ │ │ ├── use.mcfunction │ │ │ │ │ └── west/ │ │ │ │ │ ├── find_neighbors.mcfunction │ │ │ │ │ ├── initialize_auto_toggle_marker.mcfunction │ │ │ │ │ └── toggle.mcfunction │ │ │ │ └── trapdoor/ │ │ │ │ ├── north_east/ │ │ │ │ │ ├── check_neighbours.mcfunction │ │ │ │ │ └── toggle.mcfunction │ │ │ │ ├── north_west/ │ │ │ │ │ ├── check_neighbours.mcfunction │ │ │ │ │ └── toggle.mcfunction │ │ │ │ ├── south_east/ │ │ │ │ │ ├── check_neighbours.mcfunction │ │ │ │ │ └── toggle.mcfunction │ │ │ │ └── south_west/ │ │ │ │ ├── check_neighbours.mcfunction │ │ │ │ └── toggle.mcfunction │ │ │ └── structure/ │ │ │ └── door/ │ │ │ ├── east/ │ │ │ │ ├── left/ │ │ │ │ │ ├── closed.snbt │ │ │ │ │ └── open.snbt │ │ │ │ └── right/ │ │ │ │ ├── closed.snbt │ │ │ │ └── open.snbt │ │ │ ├── north/ │ │ │ │ ├── left/ │ │ │ │ │ ├── closed.snbt │ │ │ │ │ └── open.snbt │ │ │ │ └── right/ │ │ │ │ ├── closed.snbt │ │ │ │ └── open.snbt │ │ │ ├── south/ │ │ │ │ ├── left/ │ │ │ │ │ ├── closed.snbt │ │ │ │ │ └── open.snbt │ │ │ │ └── right/ │ │ │ │ ├── closed.snbt │ │ │ │ └── open.snbt │ │ │ └── west/ │ │ │ ├── left/ │ │ │ │ ├── closed.snbt │ │ │ │ └── open.snbt │ │ │ └── right/ │ │ │ ├── closed.snbt │ │ │ └── open.snbt │ │ └── test/ │ │ ├── auto_toggle_east_inverted.mcfunction │ │ ├── auto_toggle_east_normal.mcfunction │ │ ├── auto_toggle_north_inverted.mcfunction │ │ ├── auto_toggle_north_normal.mcfunction │ │ ├── auto_toggle_south_inverted.mcfunction │ │ ├── auto_toggle_south_normal.mcfunction │ │ ├── auto_toggle_west_inverted.mcfunction │ │ ├── auto_toggle_west_normal.mcfunction │ │ ├── toggle_east_inverted.mcfunction │ │ ├── toggle_east_normal.mcfunction │ │ ├── toggle_north_inverted.mcfunction │ │ ├── toggle_north_normal.mcfunction │ │ ├── toggle_south_inverted.mcfunction │ │ ├── toggle_south_normal.mcfunction │ │ ├── toggle_west_inverted.mcfunction │ │ └── toggle_west_normal.mcfunction │ ├── generate.py │ ├── raw/ │ │ └── sound_names.csv │ └── translations.csv ├── gm4_dripleaf_filters/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_dripleaf_filters/ │ │ ├── function/ │ │ │ ├── check_hopper_filter.mcfunction │ │ │ ├── deposit_item.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── match_item.mcfunction │ │ │ └── on_leaf.mcfunction │ │ ├── guidebook/ │ │ │ └── dripleaf_filters.json │ │ ├── structure/ │ │ │ └── test_setup.nbt │ │ └── test/ │ │ ├── fallthrough.mcfunction │ │ └── slide.mcfunction │ ├── mod.mcdoc │ └── translations.csv ├── gm4_dripleaf_launchers/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_dripleaf_launchers/ │ │ ├── function/ │ │ │ ├── check.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── launch.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── tick.mcfunction │ │ ├── guidebook/ │ │ │ └── dripleaf_launchers.json │ │ ├── predicate/ │ │ │ ├── dripleaf_no_tilt.json │ │ │ ├── dripleaf_tilted.json │ │ │ └── dripleaf_triggered.json │ │ └── test/ │ │ └── launch.mcfunction │ └── translations.csv ├── gm4_end_fishing/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_end_fishing/ │ │ │ ├── models/ │ │ │ │ └── item/ │ │ │ │ ├── elytra/ │ │ │ │ │ ├── broken_captains_wings.json │ │ │ │ │ ├── broken_ravaged_wings.json │ │ │ │ │ ├── captains_wings.json │ │ │ │ │ └── ravaged_wings.json │ │ │ │ └── swords/ │ │ │ │ ├── diamond_sword_1.json │ │ │ │ ├── diamond_sword_10.json │ │ │ │ ├── diamond_sword_11.json │ │ │ │ ├── diamond_sword_12.json │ │ │ │ ├── diamond_sword_13.json │ │ │ │ ├── diamond_sword_14.json │ │ │ │ ├── diamond_sword_15.json │ │ │ │ ├── diamond_sword_16.json │ │ │ │ ├── diamond_sword_17.json │ │ │ │ ├── diamond_sword_18.json │ │ │ │ ├── diamond_sword_19.json │ │ │ │ ├── diamond_sword_2.json │ │ │ │ ├── diamond_sword_20.json │ │ │ │ ├── diamond_sword_3.json │ │ │ │ ├── diamond_sword_4.json │ │ │ │ ├── diamond_sword_5.json │ │ │ │ ├── diamond_sword_6.json │ │ │ │ ├── diamond_sword_7.json │ │ │ │ ├── diamond_sword_8.json │ │ │ │ ├── diamond_sword_9.json │ │ │ │ ├── iron_sword_1.json │ │ │ │ ├── iron_sword_10.json │ │ │ │ ├── iron_sword_11.json │ │ │ │ ├── iron_sword_12.json │ │ │ │ ├── iron_sword_13.json │ │ │ │ ├── iron_sword_14.json │ │ │ │ ├── iron_sword_15.json │ │ │ │ ├── iron_sword_16.json │ │ │ │ ├── iron_sword_17.json │ │ │ │ ├── iron_sword_18.json │ │ │ │ ├── iron_sword_19.json │ │ │ │ ├── iron_sword_2.json │ │ │ │ ├── iron_sword_20.json │ │ │ │ ├── iron_sword_3.json │ │ │ │ ├── iron_sword_4.json │ │ │ │ ├── iron_sword_5.json │ │ │ │ ├── iron_sword_6.json │ │ │ │ ├── iron_sword_7.json │ │ │ │ ├── iron_sword_8.json │ │ │ │ ├── iron_sword_9.json │ │ │ │ ├── netherite_sword_1.json │ │ │ │ ├── netherite_sword_10.json │ │ │ │ ├── netherite_sword_11.json │ │ │ │ ├── netherite_sword_12.json │ │ │ │ ├── netherite_sword_13.json │ │ │ │ ├── netherite_sword_14.json │ │ │ │ ├── netherite_sword_15.json │ │ │ │ ├── netherite_sword_16.json │ │ │ │ ├── netherite_sword_17.json │ │ │ │ ├── netherite_sword_18.json │ │ │ │ ├── netherite_sword_19.json │ │ │ │ ├── netherite_sword_2.json │ │ │ │ ├── netherite_sword_20.json │ │ │ │ ├── netherite_sword_3.json │ │ │ │ ├── netherite_sword_4.json │ │ │ │ ├── netherite_sword_5.json │ │ │ │ ├── netherite_sword_6.json │ │ │ │ ├── netherite_sword_7.json │ │ │ │ ├── netherite_sword_8.json │ │ │ │ └── netherite_sword_9.json │ │ │ └── optifine/ │ │ │ └── cit/ │ │ │ ├── captains_wings.properties │ │ │ └── ravaged_wings.properties │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── end_fishing.json │ │ │ ├── end_fishing_phantom.json │ │ │ └── end_fishing_swords.json │ │ └── gm4_end_fishing/ │ │ ├── advancement/ │ │ │ ├── check_inventory.json │ │ │ ├── reel_loot.json │ │ │ ├── reel_rod.json │ │ │ └── set_id.json │ │ ├── function/ │ │ │ ├── cast_rod/ │ │ │ │ ├── marker.mcfunction │ │ │ │ ├── randomize_timer.mcfunction │ │ │ │ ├── store_data.mcfunction │ │ │ │ ├── summon_bait.mcfunction │ │ │ │ └── update_bait.mcfunction │ │ │ ├── durability/ │ │ │ │ ├── calc_damage.mcfunction │ │ │ │ ├── check.mcfunction │ │ │ │ ├── prep_mainhand.mcfunction │ │ │ │ ├── prep_offhand.mcfunction │ │ │ │ ├── set_mainhand.mcfunction │ │ │ │ └── set_offhand.mcfunction │ │ │ ├── enderpuff/ │ │ │ │ ├── apply_levitation.mcfunction │ │ │ │ ├── apply_slow_falling.mcfunction │ │ │ │ ├── check_inventory.mcfunction │ │ │ │ ├── clear_levitation.mcfunction │ │ │ │ └── process.mcfunction │ │ │ ├── go_fish/ │ │ │ │ ├── bobber_animation.mcfunction │ │ │ │ ├── bobber_animation_clock.mcfunction │ │ │ │ ├── fish_particle_clock.mcfunction │ │ │ │ ├── move_fish_particle.mcfunction │ │ │ │ ├── summon_fish_particle.mcfunction │ │ │ │ └── update_bobber.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── process.mcfunction │ │ │ ├── reel_in/ │ │ │ │ ├── move_marker.mcfunction │ │ │ │ ├── reel_loot.mcfunction │ │ │ │ ├── reel_rod.mcfunction │ │ │ │ ├── set_marker_pos.mcfunction │ │ │ │ ├── spawn_phantom.mcfunction │ │ │ │ └── summon_entity.mcfunction │ │ │ ├── set_id.mcfunction │ │ │ └── tick.mcfunction │ │ ├── guidebook/ │ │ │ └── end_fishing.json │ │ ├── item_modifier/ │ │ │ ├── apply_damage.json │ │ │ └── prepare_rod.json │ │ ├── loot_table/ │ │ │ ├── entities/ │ │ │ │ ├── end_phantom.json │ │ │ │ └── endermite.json │ │ │ ├── gameplay/ │ │ │ │ ├── fish/ │ │ │ │ │ ├── debris.json │ │ │ │ │ ├── end_city_treasure/ │ │ │ │ │ │ ├── armor/ │ │ │ │ │ │ │ ├── generate.json │ │ │ │ │ │ │ └── type.json │ │ │ │ │ │ ├── base.json │ │ │ │ │ │ ├── horse_armor/ │ │ │ │ │ │ │ ├── generate.json │ │ │ │ │ │ │ └── type.json │ │ │ │ │ │ ├── ore/ │ │ │ │ │ │ │ ├── generate.json │ │ │ │ │ │ │ └── type.json │ │ │ │ │ │ ├── sword/ │ │ │ │ │ │ │ ├── generate.json │ │ │ │ │ │ │ └── type.json │ │ │ │ │ │ └── tool/ │ │ │ │ │ │ ├── generate.json │ │ │ │ │ │ └── type.json │ │ │ │ │ ├── scattered_treasure.json │ │ │ │ │ └── valuables.json │ │ │ │ └── fishing.json │ │ │ └── items/ │ │ │ ├── captains_wings.json │ │ │ ├── enderpuff.json │ │ │ └── ravaged_wings.json │ │ ├── predicate/ │ │ │ ├── carries_enderpuff.json │ │ │ ├── holding_enderpuff.json │ │ │ ├── holding_fishing_rod.json │ │ │ ├── on_ground.json │ │ │ └── slow_falling.json │ │ └── tags/ │ │ ├── item/ │ │ │ └── enderpuff.json │ │ └── worldgen/ │ │ └── biome/ │ │ ├── barrens.json │ │ ├── center.json │ │ ├── high.json │ │ ├── mid.json │ │ ├── mid_high.json │ │ ├── nullscape/ │ │ │ ├── crystal_peaks.json │ │ │ ├── shadowlands.json │ │ │ └── void_barrens.json │ │ └── outer.json │ ├── generate_optifine.py │ └── register_model_data.py ├── gm4_ender_hoppers/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_ender_hoppers/ │ │ │ └── models/ │ │ │ ├── block/ │ │ │ │ ├── ender_hopper.json │ │ │ │ ├── ender_hopper_minecart.json │ │ │ │ └── ender_hopper_side.json │ │ │ └── item/ │ │ │ └── ender_hopper_full.json │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_ender_hoppers/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ └── ender_hopper.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── machine/ │ │ │ │ ├── create.mcfunction │ │ │ │ ├── create_cart.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── destroy_cart/ │ │ │ │ │ ├── drop_item.mcfunction │ │ │ │ │ ├── scan_hoppers.mcfunction │ │ │ │ │ ├── update_hopper.mcfunction │ │ │ │ │ └── update_hopper_minecart.mcfunction │ │ │ │ ├── destroy_cart.mcfunction │ │ │ │ ├── rotate/ │ │ │ │ │ ├── down.mcfunction │ │ │ │ │ ├── east.mcfunction │ │ │ │ │ ├── north.mcfunction │ │ │ │ │ ├── south.mcfunction │ │ │ │ │ └── west.mcfunction │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ ├── verify_destroy_cart.mcfunction │ │ │ │ ├── verify_place_cart.mcfunction │ │ │ │ └── verify_place_down.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── process.mcfunction │ │ │ ├── process_cart.mcfunction │ │ │ ├── teleport.mcfunction │ │ │ └── upgrade_paths/ │ │ │ ├── 1.5/ │ │ │ │ ├── block_upgrade.mcfunction │ │ │ │ └── minecart_upgrade.mcfunction │ │ │ └── 1.5.mcfunction │ │ ├── guidebook/ │ │ │ └── ender_hoppers.json │ │ ├── loot_table/ │ │ │ ├── entities/ │ │ │ │ └── ender_hopper_minecart.json │ │ │ └── items/ │ │ │ ├── ender_hopper.json │ │ │ └── ender_hopper_minecart.json │ │ ├── recipe/ │ │ │ ├── ender_hopper.json │ │ │ └── ender_hopper_minecart.json │ │ ├── structure/ │ │ │ └── test_pickup.nbt │ │ └── test/ │ │ ├── pickup.mcfunction │ │ ├── place.mcfunction │ │ └── place_minecart.mcfunction │ └── gm4_machines/ │ └── tags/ │ └── function/ │ ├── destroy.json │ ├── destroy_cart.json │ ├── place_cart.json │ └── place_down.json ├── gm4_everstone/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── c/ │ │ └── tags/ │ │ └── worldgen/ │ │ └── biome/ │ │ ├── is_cold/ │ │ │ └── overworld.json │ │ ├── is_dry/ │ │ │ └── overworld.json │ │ └── is_swamp.json │ ├── gm4/ │ │ └── advancement/ │ │ └── everstone.json │ └── gm4_everstone/ │ ├── advancement/ │ │ └── kill_age_locked.json │ ├── function/ │ │ ├── age_locking/ │ │ │ ├── check.mcfunction │ │ │ ├── killed_age_locked.mcfunction │ │ │ └── lock_age.mcfunction │ │ ├── aging/ │ │ │ ├── age_mobs.mcfunction │ │ │ ├── convert/ │ │ │ │ ├── bogged.mcfunction │ │ │ │ ├── elder_guardian.mcfunction │ │ │ │ ├── evoker.mcfunction │ │ │ │ ├── husk.mcfunction │ │ │ │ ├── magma_cube.mcfunction │ │ │ │ ├── piglin_brute.mcfunction │ │ │ │ ├── skeleton.mcfunction │ │ │ │ └── stray.mcfunction │ │ │ ├── multiple.mcfunction │ │ │ ├── single.mcfunction │ │ │ └── update_age/ │ │ │ ├── bogged.mcfunction │ │ │ ├── check_mob.mcfunction │ │ │ ├── guardian.mcfunction │ │ │ ├── piglin.mcfunction │ │ │ ├── skeleton.mcfunction │ │ │ ├── slime.mcfunction │ │ │ ├── stray.mcfunction │ │ │ ├── vindicator.mcfunction │ │ │ └── zombie.mcfunction │ │ ├── aging_clock.mcfunction │ │ ├── init.mcfunction │ │ ├── main.mcfunction │ │ └── tick.mcfunction │ ├── guidebook/ │ │ └── everstone.json │ ├── loot_table/ │ │ ├── drop_chance.json │ │ └── everstone.json │ ├── predicate/ │ │ ├── in_bastion_remnant.json │ │ ├── in_dry_sunlight.json │ │ ├── in_frozen.json │ │ ├── in_frozen_sunlight.json │ │ ├── in_nether.json │ │ ├── in_swamp.json │ │ ├── in_swampy_water.json │ │ ├── is_full_moon.json │ │ └── sheared_and_out_of_swamp.json │ ├── tags/ │ │ ├── block/ │ │ │ └── contains_magic.json │ │ ├── entity_type/ │ │ │ ├── affected.json │ │ │ ├── aging_mob.json │ │ │ └── force_age_lock.json │ │ ├── function/ │ │ │ ├── age_locking_check.json │ │ │ └── update_age.json │ │ └── worldgen/ │ │ └── biome/ │ │ ├── bogs_skeletons.json │ │ ├── dries_zombies.json │ │ └── freezes_skeletons.json │ └── test/ │ └── age_locking.mcfunction ├── gm4_fulcio_shamir/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_fulcio_shamir/ │ │ ├── function/ │ │ │ ├── 4_tick.mcfunction │ │ │ ├── active.mcfunction │ │ │ ├── check_item_validity.mcfunction │ │ │ ├── create_block.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── particles.mcfunction │ │ │ ├── process_block.mcfunction │ │ │ ├── ray.mcfunction │ │ │ └── summon_band.mcfunction │ │ ├── guidebook/ │ │ │ └── fulcio_shamir.json │ │ ├── loot_table/ │ │ │ └── band.json │ │ ├── predicate/ │ │ │ └── holding_fulcio.json │ │ ├── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ └── test/ │ │ └── smoosh.mcfunction │ └── gm4_metallurgy/ │ └── tags/ │ └── function/ │ ├── check_item_validity.json │ └── summon_band/ │ └── barimium.json ├── gm4_guidebook/ │ ├── CONTRIBUTING.md │ ├── README.md │ ├── advances.json │ ├── assets/ │ │ ├── gm4/ │ │ │ ├── font/ │ │ │ │ ├── gm4_items.json │ │ │ │ ├── guidebook.json │ │ │ │ └── vanilla_items.json │ │ │ └── textures/ │ │ │ └── item/ │ │ │ └── NOTE.md │ │ ├── gm4_guidebook/ │ │ │ └── lang/ │ │ │ └── en_us.json │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ └── gm4_guidebook/ │ │ ├── advancement/ │ │ │ ├── first_join.json │ │ │ ├── lectern_id.json │ │ │ ├── loot_village_chest.json │ │ │ ├── open_guide_lectern.json │ │ │ ├── open_updating_lectern.json │ │ │ ├── root.json │ │ │ └── take_lectern_book.json │ │ ├── function/ │ │ │ ├── get_book/ │ │ │ │ ├── chest/ │ │ │ │ │ ├── insert_seed_random.mcfunction │ │ │ │ │ ├── looted.mcfunction │ │ │ │ │ └── ray.mcfunction │ │ │ │ ├── first_join.mcfunction │ │ │ │ ├── player.mcfunction │ │ │ │ └── zombie_villager.mcfunction │ │ │ ├── hand/ │ │ │ │ ├── get_pages.mcfunction │ │ │ │ ├── next_section/ │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── search.mcfunction │ │ │ │ ├── populate.mcfunction │ │ │ │ ├── prev_section/ │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ └── search.mcfunction │ │ │ │ └── update.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── lecterns/ │ │ │ │ ├── get_id.mcfunction │ │ │ │ ├── get_pages.mcfunction │ │ │ │ ├── populate.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── replace/ │ │ │ │ │ ├── find_lectern.mcfunction │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ └── update.mcfunction │ │ │ │ ├── restore/ │ │ │ │ │ ├── hotbar.mcfunction │ │ │ │ │ ├── inv_1.mcfunction │ │ │ │ │ ├── inv_2.mcfunction │ │ │ │ │ ├── inv_3.mcfunction │ │ │ │ │ └── search.mcfunction │ │ │ │ ├── section/ │ │ │ │ │ ├── check_page/ │ │ │ │ │ │ ├── normal.mcfunction │ │ │ │ │ │ └── toc.mcfunction │ │ │ │ │ ├── check_page.mcfunction │ │ │ │ │ ├── find_lectern.mcfunction │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ ├── toc/ │ │ │ │ │ │ ├── find_player.mcfunction │ │ │ │ │ │ ├── find_section.mcfunction │ │ │ │ │ │ └── jump.mcfunction │ │ │ │ │ ├── track.mcfunction │ │ │ │ │ ├── tracking.mcfunction │ │ │ │ │ └── update/ │ │ │ │ │ ├── next_section/ │ │ │ │ │ │ ├── find_player.mcfunction │ │ │ │ │ │ ├── find_section.mcfunction │ │ │ │ │ │ └── jump.mcfunction │ │ │ │ │ ├── prev_section/ │ │ │ │ │ │ ├── find_player.mcfunction │ │ │ │ │ │ ├── find_section.mcfunction │ │ │ │ │ │ └── jump.mcfunction │ │ │ │ │ ├── refresh/ │ │ │ │ │ │ ├── find_player.mcfunction │ │ │ │ │ │ └── jump.mcfunction │ │ │ │ │ └── toc/ │ │ │ │ │ └── jump.mcfunction │ │ │ │ └── update.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── player_db/ │ │ │ │ ├── get_trigger_name.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── update.mcfunction │ │ │ ├── tick.mcfunction │ │ │ └── update_storage/ │ │ │ ├── add_base.mcfunction │ │ │ ├── add_to_toc.mcfunction │ │ │ ├── build_line.mcfunction │ │ │ ├── build_page.mcfunction │ │ │ ├── build_toc.mcfunction │ │ │ ├── find_expansions.mcfunction │ │ │ ├── lectern/ │ │ │ │ ├── build_line.mcfunction │ │ │ │ ├── build_page.mcfunction │ │ │ │ └── click_event.mcfunction │ │ │ ├── mark_ready.mcfunction │ │ │ └── setup_markers.mcfunction │ │ ├── loot_table/ │ │ │ ├── items/ │ │ │ │ └── guidebook.json │ │ │ └── technical/ │ │ │ └── guidebook_with_count.json │ │ ├── predicate/ │ │ │ ├── book_in_mainhand.json │ │ │ ├── book_in_offhand.json │ │ │ ├── chance_chest.json │ │ │ ├── chance_zombie_villager.json │ │ │ ├── holding_book.json │ │ │ └── lectern_contents.json │ │ └── tags/ │ │ └── function/ │ │ ├── add_toc_line.json │ │ ├── setup_storage.json │ │ ├── summon_marker.json │ │ ├── update_hand.json │ │ └── update_lectern.json │ ├── generate_guidebooks.py │ ├── legacy_item_sheet.py │ ├── mod.mcdoc │ └── triggers.json ├── gm4_holographic_tags/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── holographic_tags.json │ │ └── gm4_holographic_tags/ │ │ ├── function/ │ │ │ ├── create_hologram.mcfunction │ │ │ ├── destroy_hologram.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── initialize_hologram.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── read_hologram_data.mcfunction │ │ │ ├── set_color.mcfunction │ │ │ └── upgrade_paths/ │ │ │ ├── 1.5/ │ │ │ │ └── convert_to_text_display.mcfunction │ │ │ └── 1.5.mcfunction │ │ ├── guidebook/ │ │ │ └── holographic_tags.json │ │ ├── predicate/ │ │ │ ├── has_item.json │ │ │ └── has_name_tag.json │ │ ├── tags/ │ │ │ └── entity_type/ │ │ │ └── item_frames.json │ │ └── test/ │ │ └── create_and_remove.mcfunction │ └── mod.mcdoc ├── gm4_iacio_shamir/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_iacio_shamir/ │ │ │ ├── advancement/ │ │ │ │ └── inventory_changed.json │ │ │ ├── function/ │ │ │ │ ├── add_motion.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── check_throw.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── iacio_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── structure/ │ │ │ │ └── test_long_platform.nbt │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── throw_item.mcfunction │ │ └── gm4_metallurgy/ │ │ └── tags/ │ │ └── function/ │ │ ├── check_item_validity.json │ │ └── summon_band/ │ │ └── barium.json │ └── translations.csv ├── gm4_ink_spitting_squid/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── glow_ink_spitting_squid.json │ │ │ └── ink_spitting_squid.json │ │ └── gm4_ink_spitting_squid/ │ │ ├── function/ │ │ │ ├── glow_squid_squirt.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── squid_squirt.mcfunction │ │ ├── guidebook/ │ │ │ └── ink_spitting_squid.json │ │ ├── predicate/ │ │ │ └── inkable.json │ │ ├── structure/ │ │ │ └── test_tank.nbt │ │ └── test/ │ │ └── squirt.mcfunction │ └── translations.csv ├── gm4_lavish_livestock/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_lavish_livestock/ │ │ ├── function/ │ │ │ └── init.mcfunction │ │ ├── guidebook/ │ │ │ └── lavish_livestock.json │ │ ├── tags/ │ │ │ └── entity_type/ │ │ │ └── livestock.json │ │ └── templates/ │ │ ├── advancement/ │ │ │ └── breed.json │ │ ├── function/ │ │ │ ├── determine_parent.mcfunction │ │ │ ├── find_baby.mcfunction │ │ │ ├── find_marker.mcfunction │ │ │ ├── initialize_marker.mcfunction │ │ │ ├── modify_baby.mcfunction │ │ │ └── revoke_advancement.mcfunction │ │ └── loot_table/ │ │ └── lavish_death.json │ ├── generate.py │ └── translations.csv ├── gm4_lightning_in_a_bottle/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_lightning_in_a_bottle/ │ │ │ └── textures/ │ │ │ └── item/ │ │ │ ├── lightning_in_a_bottle_overlay.png.mcmeta │ │ │ ├── lingering_lightning_in_a_bottle_overlay.png.mcmeta │ │ │ └── splash_lightning_in_a_bottle_overlay.png.mcmeta │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ ├── lightning_in_a_bottle_drink.json │ │ └── lightning_in_a_bottle_shulker.json │ ├── gm4_brewing/ │ │ └── tags/ │ │ └── function/ │ │ └── insert/ │ │ ├── lingering.json │ │ └── splash.json │ ├── gm4_lightning_in_a_bottle/ │ │ ├── advancement/ │ │ │ ├── drink_lightning.json │ │ │ ├── lightning_strike.json │ │ │ └── place_lightning_rod.json │ │ ├── function/ │ │ │ ├── brewing_stand/ │ │ │ │ ├── brew/ │ │ │ │ │ ├── lingering.mcfunction │ │ │ │ │ └── splash.mcfunction │ │ │ │ ├── check_fuel.mcfunction │ │ │ │ ├── check_potions.mcfunction │ │ │ │ ├── consume_fuel.mcfunction │ │ │ │ └── texture_connector/ │ │ │ │ ├── force_update.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── summon.mcfunction │ │ │ │ └── update.mcfunction │ │ │ ├── entity/ │ │ │ │ ├── evoker.mcfunction │ │ │ │ ├── guardian.mcfunction │ │ │ │ ├── illusioner.mcfunction │ │ │ │ └── shulker.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── lightning/ │ │ │ │ ├── check.mcfunction │ │ │ │ ├── locate.mcfunction │ │ │ │ └── strike_self.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── potion_tracking/ │ │ │ │ ├── modify_cloud.mcfunction │ │ │ │ ├── potion_landed.mcfunction │ │ │ │ ├── tag_potion.mcfunction │ │ │ │ └── verify_landed_potion.mcfunction │ │ │ ├── sustain_lingering_lightning.mcfunction │ │ │ └── upgrade_paths/ │ │ │ └── 1.4.mcfunction │ │ ├── guidebook/ │ │ │ └── lightning_in_a_bottle.json │ │ ├── item_modifier/ │ │ │ ├── bottle_of_lightning.json │ │ │ ├── brew_lightning.json │ │ │ ├── lingering_bottle_of_lightning.json │ │ │ ├── set_zero.json │ │ │ └── splash_bottle_of_lightning.json │ │ ├── loot_table/ │ │ │ ├── entities/ │ │ │ │ ├── charged_creeper.json │ │ │ │ ├── illusioner.json │ │ │ │ └── shulker.json │ │ │ ├── items/ │ │ │ │ ├── bottle_of_lightning.json │ │ │ │ ├── lingering_bottle_of_lightning.json │ │ │ │ └── splash_bottle_of_lightning.json │ │ │ └── technical/ │ │ │ └── brewing_stand/ │ │ │ ├── lingering.json │ │ │ └── splash.json │ │ ├── modules/ │ │ │ └── liquid_tanks/ │ │ │ └── liquid_features.bolt │ │ ├── predicate/ │ │ │ ├── on_fire.json │ │ │ └── random_strike.json │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ ├── exposed_lightning_rod.json │ │ │ │ ├── lightning_rod.json │ │ │ │ ├── normal_lightning_rod.json │ │ │ │ ├── oxidized_lightning_rod.json │ │ │ │ └── weathered_lightning_rod.json │ │ │ ├── entity_type/ │ │ │ │ └── potion_tracker.json │ │ │ ├── function/ │ │ │ │ └── lightning_strike.json │ │ │ └── item/ │ │ │ └── lightning_rod.json │ │ └── test/ │ │ ├── brew_splash.mcfunction │ │ ├── lightning_strike.mcfunction │ │ ├── throw.mcfunction │ │ ├── throw_evoker.mcfunction │ │ ├── throw_guardian.mcfunction │ │ ├── throw_illusioner.mcfunction │ │ └── throw_shulker.mcfunction │ └── gm4_potion_tracking/ │ └── tags/ │ └── function/ │ ├── potion_landed.json │ └── tag_potion.json ├── gm4_liquid_minecarts/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── liquid_minecarts_create.json │ ├── gm4_liquid_minecarts/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ └── liquid_minecart.json │ │ ├── function/ │ │ │ ├── compare_load_liquid.mcfunction │ │ │ ├── compare_unload_liquid.mcfunction │ │ │ ├── copy_tank_data.mcfunction │ │ │ ├── drain_minecart.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── init_liquid.mcfunction │ │ │ ├── init_tank.mcfunction │ │ │ ├── level_report.mcfunction │ │ │ ├── level_report_ray.mcfunction │ │ │ ├── liquid_value_update.mcfunction │ │ │ ├── load_check.mcfunction │ │ │ ├── load_liquid.mcfunction │ │ │ ├── machine/ │ │ │ │ ├── create_cart.mcfunction │ │ │ │ ├── destroy_cart/ │ │ │ │ │ ├── drop_item.mcfunction │ │ │ │ │ ├── scan_hoppers.mcfunction │ │ │ │ │ ├── update_hopper.mcfunction │ │ │ │ │ └── update_hopper_minecart.mcfunction │ │ │ │ ├── destroy_cart.mcfunction │ │ │ │ ├── verify_destroy_cart.mcfunction │ │ │ │ └── verify_place_cart.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── set_empty_data.mcfunction │ │ │ ├── try_to_load.mcfunction │ │ │ ├── try_to_unload.mcfunction │ │ │ ├── unload_liquid.mcfunction │ │ │ └── upgrade_paths/ │ │ │ ├── 1.8/ │ │ │ │ └── entity_replacement.mcfunction │ │ │ └── 1.8.mcfunction │ │ ├── guidebook/ │ │ │ └── liquid_minecarts.json │ │ ├── loot_table/ │ │ │ ├── entities/ │ │ │ │ └── liquid_minecart.json │ │ │ └── items/ │ │ │ └── liquid_minecart.json │ │ ├── recipe/ │ │ │ └── liquid_minecart.json │ │ ├── structure/ │ │ │ └── test_transport.nbt │ │ ├── tags/ │ │ │ └── function/ │ │ │ └── load.json │ │ └── test/ │ │ ├── place.mcfunction │ │ └── transport.mcfunction │ ├── gm4_liquid_tanks/ │ │ └── tags/ │ │ └── function/ │ │ └── load.json │ └── gm4_machines/ │ └── tags/ │ └── function/ │ ├── destroy_cart.json │ └── place_cart.json ├── gm4_liquid_tanks/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_liquid_tanks/ │ │ │ └── models/ │ │ │ ├── block/ │ │ │ │ └── liquid_tank.json │ │ │ └── item/ │ │ │ └── liquid_tank_full.json │ │ └── translations.csv │ ├── beet.yaml │ ├── bolt-docs.md │ ├── bolt_liquid_wrappers.py │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── liquid_tanks_create.json │ │ │ └── standard_liquids.json │ │ ├── gm4_liquid_tanks/ │ │ │ ├── advancement/ │ │ │ │ └── recipes/ │ │ │ │ └── liquid_tank.json │ │ │ ├── function/ │ │ │ │ ├── apply_output.mcfunction │ │ │ │ ├── empty.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── item_process.mcfunction │ │ │ │ ├── level_report_ray.mcfunction │ │ │ │ ├── liquid_value_update.mcfunction │ │ │ │ ├── machine/ │ │ │ │ │ ├── create.mcfunction │ │ │ │ │ ├── destroy.mcfunction │ │ │ │ │ ├── init_tank_scores.mcfunction │ │ │ │ │ ├── rotate/ │ │ │ │ │ │ ├── down.mcfunction │ │ │ │ │ │ ├── east.mcfunction │ │ │ │ │ │ ├── north.mcfunction │ │ │ │ │ │ ├── south.mcfunction │ │ │ │ │ │ └── west.mcfunction │ │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ │ └── verify_place_down.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── smart_item_drain.mcfunction │ │ │ │ ├── smart_item_fill.mcfunction │ │ │ │ ├── teleport_display_down.mcfunction │ │ │ │ ├── teleport_display_up.mcfunction │ │ │ │ └── upgrade_paths/ │ │ │ │ ├── 2.8/ │ │ │ │ │ └── entity_replacement.mcfunction │ │ │ │ └── 2.8.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── liquid_tanks.json │ │ │ ├── loot_table/ │ │ │ │ └── items/ │ │ │ │ └── liquid_tank.json │ │ │ ├── modules/ │ │ │ │ └── liquid_wrappers.bolt │ │ │ ├── recipe/ │ │ │ │ └── liquid_tank.json │ │ │ ├── structure/ │ │ │ │ └── test_setup.nbt │ │ │ ├── tags/ │ │ │ │ └── function/ │ │ │ │ ├── item_drain.json │ │ │ │ ├── item_fill.json │ │ │ │ ├── level_report_check.json │ │ │ │ ├── remove_liquid_tags.json │ │ │ │ ├── tank_init.json │ │ │ │ ├── util_above.json │ │ │ │ └── util_below.json │ │ │ └── test/ │ │ │ ├── change_type.mcfunction │ │ │ ├── deposit_xp.mcfunction │ │ │ ├── drain_xp.mcfunction │ │ │ ├── honey_cast.mcfunction │ │ │ ├── lava_fuel.mcfunction │ │ │ ├── lava_tank.mcfunction │ │ │ ├── milk_tank.mcfunction │ │ │ └── place.mcfunction │ │ ├── gm4_machines/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── destroy.json │ │ │ └── place_down.json │ │ └── gm4_standard_liquids/ │ │ ├── advancement/ │ │ │ ├── use_glow_ink_bottle_on_sign.json │ │ │ └── use_ink_bottle_on_sign.json │ │ ├── function/ │ │ │ ├── level_report/ │ │ │ │ ├── 100.mcfunction │ │ │ │ ├── 300.mcfunction │ │ │ │ ├── 400.mcfunction │ │ │ │ └── experience.mcfunction │ │ │ ├── level_report_check.mcfunction │ │ │ ├── util/ │ │ │ │ ├── cauldrons/ │ │ │ │ │ ├── drain_lava_cauldron.mcfunction │ │ │ │ │ ├── drain_powder_snow_cauldron.mcfunction │ │ │ │ │ ├── drain_water_cauldron.mcfunction │ │ │ │ │ ├── fill_lava_cauldron.mcfunction │ │ │ │ │ ├── fill_powder_snow_cauldron.mcfunction │ │ │ │ │ └── fill_water_cauldron.mcfunction │ │ │ │ ├── drain_cauldron.mcfunction │ │ │ │ ├── experience/ │ │ │ │ │ ├── deposit_levels.mcfunction │ │ │ │ │ ├── deposit_one_level.mcfunction │ │ │ │ │ ├── deposit_points.mcfunction │ │ │ │ │ ├── macro_experience.mcfunction │ │ │ │ │ ├── scheduled_deposit.mcfunction │ │ │ │ │ ├── scheduled_withdraw.mcfunction │ │ │ │ │ ├── withdraw_levels.mcfunction │ │ │ │ │ ├── withdraw_one_level.mcfunction │ │ │ │ │ └── withdraw_points.mcfunction │ │ │ │ ├── experience_orb.mcfunction │ │ │ │ ├── fill_cauldrons.mcfunction │ │ │ │ ├── furnace_fueling/ │ │ │ │ │ ├── fuel_furnace.mcfunction │ │ │ │ │ ├── furnace_start.mcfunction │ │ │ │ │ ├── lava_tank.mcfunction │ │ │ │ │ └── scheduled_furnace_fuel.mcfunction │ │ │ │ ├── honey_casting/ │ │ │ │ │ ├── honey_cauldron.mcfunction │ │ │ │ │ ├── honey_rise.mcfunction │ │ │ │ │ ├── honey_stop.mcfunction │ │ │ │ │ ├── honey_tank.mcfunction │ │ │ │ │ └── scheduled_honey_rise.mcfunction │ │ │ │ ├── link_blocks.mcfunction │ │ │ │ ├── liquid_dispensing/ │ │ │ │ │ ├── beetroot_soup.mcfunction │ │ │ │ │ ├── glow_ink.mcfunction │ │ │ │ │ ├── honey.mcfunction │ │ │ │ │ ├── ink.mcfunction │ │ │ │ │ ├── milk.mcfunction │ │ │ │ │ ├── mushroom_stew.mcfunction │ │ │ │ │ └── rabbit_stew.mcfunction │ │ │ │ ├── mobs/ │ │ │ │ │ ├── cow.mcfunction │ │ │ │ │ ├── glow_squid.mcfunction │ │ │ │ │ ├── mooshroom.mcfunction │ │ │ │ │ ├── snow_golem.mcfunction │ │ │ │ │ └── squid.mcfunction │ │ │ │ └── signs/ │ │ │ │ ├── apply_glow_ink_sac_back.mcfunction │ │ │ │ ├── apply_glow_ink_sac_front.mcfunction │ │ │ │ ├── apply_ink_sac_back.mcfunction │ │ │ │ ├── apply_ink_sac_front.mcfunction │ │ │ │ ├── front_back_detection.mcfunction │ │ │ │ ├── glow_ink_sign.mcfunction │ │ │ │ ├── ink_sign.mcfunction │ │ │ │ ├── ray.mcfunction │ │ │ │ └── sign_normal_lookup.mcfunction │ │ │ ├── util_above.mcfunction │ │ │ └── util_below.mcfunction │ │ ├── guidebook/ │ │ │ └── standard_liquids.json │ │ ├── loot_table/ │ │ │ ├── glow_ink_bottle.json │ │ │ └── ink_bottle.json │ │ ├── modules/ │ │ │ └── main.bolt │ │ ├── predicate/ │ │ │ ├── sneaking.json │ │ │ └── suspended_snow_golem.json │ │ └── tags/ │ │ └── block/ │ │ ├── double_speed.json │ │ └── furnace.json │ ├── mcmeta_stacksize.py │ ├── mod.mcdoc │ └── override_formatting.py ├── gm4_live_catch/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── live_catch.json │ │ └── gm4_live_catch/ │ │ ├── advancement/ │ │ │ ├── catch_cod.json │ │ │ ├── catch_pufferfish.json │ │ │ ├── catch_salmon.json │ │ │ └── catch_tropical_fish.json │ │ ├── function/ │ │ │ ├── fish/ │ │ │ │ ├── cod/ │ │ │ │ │ ├── catch.mcfunction │ │ │ │ │ ├── summon.mcfunction │ │ │ │ │ └── target.mcfunction │ │ │ │ ├── pufferfish/ │ │ │ │ │ ├── catch.mcfunction │ │ │ │ │ ├── summon.mcfunction │ │ │ │ │ └── target.mcfunction │ │ │ │ ├── salmon/ │ │ │ │ │ ├── catch.mcfunction │ │ │ │ │ ├── summon.mcfunction │ │ │ │ │ └── target.mcfunction │ │ │ │ └── tropical_fish/ │ │ │ │ ├── catch.mcfunction │ │ │ │ ├── summon.mcfunction │ │ │ │ └── target.mcfunction │ │ │ └── init.mcfunction │ │ └── guidebook/ │ │ └── live_catch.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_lively_lily_pads/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_lively_lily_pads/ │ │ ├── advancement/ │ │ │ ├── candle_rcd.json │ │ │ ├── id_init.json │ │ │ ├── placement_rcd.json │ │ │ ├── punch_perma_rcd.json │ │ │ ├── punch_placement_rcd.json │ │ │ ├── unwaxed_copper_rcd.json │ │ │ └── waxed_copper_rcd.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── mechanics/ │ │ │ │ ├── attacks/ │ │ │ │ │ ├── perma/ │ │ │ │ │ │ ├── hit_rcd.mcfunction │ │ │ │ │ │ └── process_interaction.mcfunction │ │ │ │ │ └── placement/ │ │ │ │ │ ├── hit_rcd.mcfunction │ │ │ │ │ └── process_interaction.mcfunction │ │ │ │ ├── cleanup/ │ │ │ │ │ ├── kill.mcfunction │ │ │ │ │ └── summon_item.mcfunction │ │ │ │ ├── interactions/ │ │ │ │ │ ├── candle/ │ │ │ │ │ │ ├── add_candle.mcfunction │ │ │ │ │ │ ├── find_igniter.mcfunction │ │ │ │ │ │ ├── get_mainhand_data.mcfunction │ │ │ │ │ │ ├── get_offhand_data.mcfunction │ │ │ │ │ │ ├── interact_rcd.mcfunction │ │ │ │ │ │ ├── light_candle.mcfunction │ │ │ │ │ │ ├── process_display.mcfunction │ │ │ │ │ │ ├── process_interaction.mcfunction │ │ │ │ │ │ ├── update_light_blocks.mcfunction │ │ │ │ │ │ ├── used_mainhand_fire_charge.mcfunction │ │ │ │ │ │ ├── used_mainhand_flint_and_steel.mcfunction │ │ │ │ │ │ ├── used_offhand_fire_charge.mcfunction │ │ │ │ │ │ └── used_offhand_flint_and_steel.mcfunction │ │ │ │ │ ├── placement/ │ │ │ │ │ │ ├── cactus_flower.mcfunction │ │ │ │ │ │ ├── candles.mcfunction │ │ │ │ │ │ ├── copper_lantern.mcfunction │ │ │ │ │ │ ├── copper_torch.mcfunction │ │ │ │ │ │ ├── coral_fan.mcfunction │ │ │ │ │ │ ├── dead_coral_fan.mcfunction │ │ │ │ │ │ ├── get_mainhand_data.mcfunction │ │ │ │ │ │ ├── get_offhand_data.mcfunction │ │ │ │ │ │ ├── interact_rcd.mcfunction │ │ │ │ │ │ ├── lantern.mcfunction │ │ │ │ │ │ ├── process_interaction.mcfunction │ │ │ │ │ │ ├── redstone_torch.mcfunction │ │ │ │ │ │ ├── soul_lantern.mcfunction │ │ │ │ │ │ ├── soul_torch.mcfunction │ │ │ │ │ │ ├── spore_blossom.mcfunction │ │ │ │ │ │ ├── torch.mcfunction │ │ │ │ │ │ └── waxed_copper_lantern.mcfunction │ │ │ │ │ ├── unwaxed_copper_lantern/ │ │ │ │ │ │ ├── attempt_oxidization.mcfunction │ │ │ │ │ │ ├── interact_rcd.mcfunction │ │ │ │ │ │ ├── process_display.mcfunction │ │ │ │ │ │ ├── process_interaction.mcfunction │ │ │ │ │ │ ├── scrape_display.mcfunction │ │ │ │ │ │ └── wax_display.mcfunction │ │ │ │ │ └── waxed_copper_lantern/ │ │ │ │ │ ├── damage_mainhand_axe.mcfunction │ │ │ │ │ ├── damage_offhand_axe.mcfunction │ │ │ │ │ ├── interact_rcd.mcfunction │ │ │ │ │ ├── max_durability_mainhand_axe.mcfunction │ │ │ │ │ ├── max_durability_offhand_axe.mcfunction │ │ │ │ │ ├── process_interaction.mcfunction │ │ │ │ │ ├── scrape_display.mcfunction │ │ │ │ │ ├── set_damage_mainhand.mcfunction │ │ │ │ │ ├── set_damage_offhand.mcfunction │ │ │ │ │ ├── used_mainhand_axe.mcfunction │ │ │ │ │ └── used_offhand_axe.mcfunction │ │ │ │ ├── particles/ │ │ │ │ │ ├── 1_candle.mcfunction │ │ │ │ │ ├── 2_candle.mcfunction │ │ │ │ │ ├── 3_candle.mcfunction │ │ │ │ │ ├── 4_candle.mcfunction │ │ │ │ │ ├── candle_count.mcfunction │ │ │ │ │ └── select_type.mcfunction │ │ │ │ └── right_click_detection/ │ │ │ │ ├── create.mcfunction │ │ │ │ ├── found.mcfunction │ │ │ │ ├── loop.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── ray.mcfunction │ │ │ ├── player/ │ │ │ │ ├── as.mcfunction │ │ │ │ ├── holding_item.mcfunction │ │ │ │ └── set_id.mcfunction │ │ │ ├── tick.mcfunction │ │ │ └── upgrade_paths/ │ │ │ ├── 3.0/ │ │ │ │ ├── update_legacy_display.mcfunction │ │ │ │ └── upgrade_candle.mcfunction │ │ │ ├── 3.0.mcfunction │ │ │ ├── 3.1.mcfunction │ │ │ └── 3.3.mcfunction │ │ ├── guidebook/ │ │ │ └── lively_lily_pads.json │ │ ├── predicate/ │ │ │ ├── holding_placeable_item.json │ │ │ ├── mainhand_placeable_item.json │ │ │ └── offhand_placeable_item.json │ │ └── tags/ │ │ └── item/ │ │ ├── candle_igniters.json │ │ ├── candle_interactable.json │ │ ├── copper_lanterns.json │ │ ├── coral_fan.json │ │ ├── dead_coral_fan.json │ │ ├── placeable_item.json │ │ └── waxed_copper_lanterns.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_lumos_shamir/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_lumos_shamir/ │ │ ├── function/ │ │ │ ├── active.mcfunction │ │ │ ├── check_item_validity.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── place_torch.mcfunction │ │ │ └── summon_band.mcfunction │ │ ├── guidebook/ │ │ │ └── lumos_shamir.json │ │ ├── loot_table/ │ │ │ └── band.json │ │ ├── predicate/ │ │ │ ├── check_air.json │ │ │ ├── check_block.json │ │ │ └── holding_lumos.json │ │ ├── structure/ │ │ │ └── test_dark.nbt │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ ├── torch_placeable.json │ │ │ │ └── torch_unplaceable.json │ │ │ └── item/ │ │ │ └── valid_items.json │ │ └── test/ │ │ ├── already_light.mcfunction │ │ ├── invalid_spot.mcfunction │ │ └── place_torch.mcfunction │ └── gm4_metallurgy/ │ └── tags/ │ └── function/ │ ├── check_item_validity.json │ └── summon_band/ │ └── curies_bismium.json ├── gm4_mending_tanks/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_liquid_tanks/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── item_fill.json │ │ └── gm4_mending_tanks/ │ │ ├── function/ │ │ │ ├── check_item.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── item_fill.mcfunction │ │ │ └── repair.mcfunction │ │ ├── guidebook/ │ │ │ └── mending_tanks.json │ │ └── test/ │ │ └── repair_item.mcfunction │ └── translations.csv ├── gm4_metallurgy/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_metallurgy/ │ │ │ ├── optifine/ │ │ │ │ ├── anim/ │ │ │ │ │ ├── aluminium/ │ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ │ ├── elytra.properties │ │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ │ ├── barimium/ │ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ │ ├── elytra.properties │ │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ │ ├── barium/ │ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ │ ├── elytra.properties │ │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ │ ├── bismuth/ │ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ │ ├── elytra.properties │ │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ │ ├── curies_bismium/ │ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ │ ├── elytra.properties │ │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ │ ├── spyglass.properties │ │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ │ └── thorium/ │ │ │ │ │ ├── chainmail_layer_1.properties │ │ │ │ │ ├── chainmail_layer_2.properties │ │ │ │ │ ├── diamond_layer_1.properties │ │ │ │ │ ├── diamond_layer_2.properties │ │ │ │ │ ├── elytra.properties │ │ │ │ │ ├── gold_layer_1.properties │ │ │ │ │ ├── gold_layer_2.properties │ │ │ │ │ ├── iron_layer_1.properties │ │ │ │ │ ├── iron_layer_2.properties │ │ │ │ │ ├── leather_layer_1.properties │ │ │ │ │ ├── leather_layer_1_overlay.properties │ │ │ │ │ ├── leather_layer_2.properties │ │ │ │ │ ├── leather_layer_2_overlay.properties │ │ │ │ │ ├── netherite_layer_1.properties │ │ │ │ │ ├── netherite_layer_2.properties │ │ │ │ │ └── turtle_layer_1.properties │ │ │ │ └── cit/ │ │ │ │ ├── barimium/ │ │ │ │ │ └── trident.png.mcmeta │ │ │ │ ├── curies_bismium/ │ │ │ │ │ ├── spyglass.png.mcmeta │ │ │ │ │ └── trident.png.mcmeta │ │ │ │ └── thorium/ │ │ │ │ └── trident.png.mcmeta │ │ │ └── textures/ │ │ │ └── item/ │ │ │ └── shamir/ │ │ │ ├── aluminium/ │ │ │ │ ├── axe.png.mcmeta │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── broken_elytra.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── elytra.png.mcmeta │ │ │ │ ├── helmet.png.mcmeta │ │ │ │ ├── hoe.png.mcmeta │ │ │ │ ├── leather_leggings.png.mcmeta │ │ │ │ ├── leggings.png.mcmeta │ │ │ │ ├── netherite_helmet.png.mcmeta │ │ │ │ ├── pickaxe.png.mcmeta │ │ │ │ ├── shears.png.mcmeta │ │ │ │ ├── shovel.png.mcmeta │ │ │ │ └── turtle_helmet.png.mcmeta │ │ │ ├── barimium/ │ │ │ │ ├── compass.png.mcmeta │ │ │ │ ├── hoe.png.mcmeta │ │ │ │ ├── sword.png.mcmeta │ │ │ │ └── trident.png.mcmeta │ │ │ ├── barium/ │ │ │ │ ├── axe.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── compass.png.mcmeta │ │ │ │ ├── hoe.png.mcmeta │ │ │ │ ├── pickaxe.png.mcmeta │ │ │ │ └── shovel.png.mcmeta │ │ │ ├── bismuth/ │ │ │ │ ├── axe.png.mcmeta │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── fishing_rod.png.mcmeta │ │ │ │ ├── pickaxe.png.mcmeta │ │ │ │ ├── shovel.png.mcmeta │ │ │ │ └── sword.png.mcmeta │ │ │ ├── curies_bismium/ │ │ │ │ ├── axe.png.mcmeta │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── bow.png.mcmeta │ │ │ │ ├── broken_elytra.png.mcmeta │ │ │ │ ├── bucket.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── clock.png.mcmeta │ │ │ │ ├── compass.png.mcmeta │ │ │ │ ├── crossbow.png.mcmeta │ │ │ │ ├── elytra.png.mcmeta │ │ │ │ ├── fishing_rod.png.mcmeta │ │ │ │ ├── flint_and_steel.png.mcmeta │ │ │ │ ├── helmet.png.mcmeta │ │ │ │ ├── hoe.png.mcmeta │ │ │ │ ├── leather_leggings.png.mcmeta │ │ │ │ ├── leggings.png.mcmeta │ │ │ │ ├── netherite_helmet.png.mcmeta │ │ │ │ ├── pickaxe.png.mcmeta │ │ │ │ ├── shears.png.mcmeta │ │ │ │ ├── shovel.png.mcmeta │ │ │ │ ├── spyglass.png.mcmeta │ │ │ │ ├── sword.png.mcmeta │ │ │ │ ├── trident.png.mcmeta │ │ │ │ └── turtle_helmet.png.mcmeta │ │ │ └── thorium/ │ │ │ ├── boots.png.mcmeta │ │ │ ├── sword.png.mcmeta │ │ │ └── trident.png.mcmeta │ │ ├── model_data.yaml │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── metallurgy_blast_ore.json │ │ │ ├── metallurgy_cast.json │ │ │ └── metallurgy_overheat_cast.json │ │ ├── gm4_arborenda_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── init_scoreboards.mcfunction │ │ │ │ ├── player/ │ │ │ │ │ ├── analyze_axe.mcfunction │ │ │ │ │ ├── check_for_axe.mcfunction │ │ │ │ │ ├── chop.mcfunction │ │ │ │ │ ├── modify_axe_durability.mcfunction │ │ │ │ │ └── set_damage.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ └── trunk/ │ │ │ │ ├── check_depth.mcfunction │ │ │ │ ├── destroy_block.mcfunction │ │ │ │ ├── destroy_sequenced.mcfunction │ │ │ │ ├── neighbors/ │ │ │ │ │ ├── mark.mcfunction │ │ │ │ │ ├── mark_bottom.mcfunction │ │ │ │ │ └── mark_top.mcfunction │ │ │ │ └── next_depth.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── arborenda_shamir.json │ │ │ ├── loot_table/ │ │ │ │ ├── band.json │ │ │ │ └── roll_binomial_distribution.json │ │ │ ├── tags/ │ │ │ │ ├── block/ │ │ │ │ │ ├── foliage.json │ │ │ │ │ └── trunks.json │ │ │ │ └── item/ │ │ │ │ ├── trunks.json │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── chop.mcfunction │ │ ├── gm4_defuse_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── defuse_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── creeper_defused.mcfunction │ │ ├── gm4_ender_bolt_shamir/ │ │ │ ├── advancement/ │ │ │ │ ├── join.json │ │ │ │ └── use.json │ │ │ ├── function/ │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── id/ │ │ │ │ │ ├── assign_pet.mcfunction │ │ │ │ │ └── assign_player.mcfunction │ │ │ │ ├── infection/ │ │ │ │ │ ├── active.mcfunction │ │ │ │ │ ├── check_ignore_list.mcfunction │ │ │ │ │ ├── end.mcfunction │ │ │ │ │ ├── infect.mcfunction │ │ │ │ │ ├── spread.mcfunction │ │ │ │ │ ├── start.mcfunction │ │ │ │ │ └── symptoms.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── ender_bolt_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── tags/ │ │ │ │ ├── entity_type/ │ │ │ │ │ └── pets.json │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── infect_and_spread.mcfunction │ │ ├── gm4_forterra_shamir/ │ │ │ ├── function/ │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── forterra_shamir.json │ │ │ ├── loot_table/ │ │ │ │ ├── band.json │ │ │ │ ├── deepslate.json │ │ │ │ └── stone.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_gemini_shamir/ │ │ │ ├── advancement/ │ │ │ │ ├── breed_allay.json │ │ │ │ ├── breed_armadillo.json │ │ │ │ ├── breed_axolotl.json │ │ │ │ ├── breed_bee.json │ │ │ │ ├── breed_cat.json │ │ │ │ ├── breed_chicken.json │ │ │ │ ├── breed_cow.json │ │ │ │ ├── breed_donkey.json │ │ │ │ ├── breed_fox.json │ │ │ │ ├── breed_frog.json │ │ │ │ ├── breed_goat.json │ │ │ │ ├── breed_hoglin.json │ │ │ │ ├── breed_horse.json │ │ │ │ ├── breed_llama.json │ │ │ │ ├── breed_mooshroom.json │ │ │ │ ├── breed_mule.json │ │ │ │ ├── breed_ocelot.json │ │ │ │ ├── breed_panda.json │ │ │ │ ├── breed_pig.json │ │ │ │ ├── breed_rabbit.json │ │ │ │ ├── breed_sheep.json │ │ │ │ ├── breed_strider.json │ │ │ │ ├── breed_trader_llama.json │ │ │ │ ├── breed_turtle.json │ │ │ │ └── breed_wolf.json │ │ │ ├── function/ │ │ │ │ ├── baby/ │ │ │ │ │ ├── find_baby.mcfunction │ │ │ │ │ ├── pick_type.mcfunction │ │ │ │ │ ├── spawn_axolotl.mcfunction │ │ │ │ │ ├── spawn_cat.mcfunction │ │ │ │ │ ├── spawn_chicken.mcfunction │ │ │ │ │ ├── spawn_cow.mcfunction │ │ │ │ │ ├── spawn_donkey.mcfunction │ │ │ │ │ ├── spawn_fox.mcfunction │ │ │ │ │ ├── spawn_goat.mcfunction │ │ │ │ │ ├── spawn_horse.mcfunction │ │ │ │ │ ├── spawn_llama.mcfunction │ │ │ │ │ ├── spawn_mule.mcfunction │ │ │ │ │ ├── spawn_ocelot.mcfunction │ │ │ │ │ ├── spawn_panda.mcfunction │ │ │ │ │ ├── spawn_pig.mcfunction │ │ │ │ │ ├── spawn_rabbit.mcfunction │ │ │ │ │ ├── spawn_sheep.mcfunction │ │ │ │ │ ├── spawn_trader_llama.mcfunction │ │ │ │ │ └── spawn_wolf.mcfunction │ │ │ │ ├── breed/ │ │ │ │ │ ├── check_allay.mcfunction │ │ │ │ │ ├── check_armadillo.mcfunction │ │ │ │ │ ├── check_axolotl.mcfunction │ │ │ │ │ ├── check_bee.mcfunction │ │ │ │ │ ├── check_cat.mcfunction │ │ │ │ │ ├── check_chicken.mcfunction │ │ │ │ │ ├── check_cow.mcfunction │ │ │ │ │ ├── check_donkey.mcfunction │ │ │ │ │ ├── check_fox.mcfunction │ │ │ │ │ ├── check_frog.mcfunction │ │ │ │ │ ├── check_goat.mcfunction │ │ │ │ │ ├── check_hoglin.mcfunction │ │ │ │ │ ├── check_horse.mcfunction │ │ │ │ │ ├── check_llama.mcfunction │ │ │ │ │ ├── check_mooshroom.mcfunction │ │ │ │ │ ├── check_ocelot.mcfunction │ │ │ │ │ ├── check_panda.mcfunction │ │ │ │ │ ├── check_pig.mcfunction │ │ │ │ │ ├── check_rabbit.mcfunction │ │ │ │ │ ├── check_sheep.mcfunction │ │ │ │ │ ├── check_strider.mcfunction │ │ │ │ │ ├── check_trader_llama.mcfunction │ │ │ │ │ ├── check_turtle.mcfunction │ │ │ │ │ └── check_wolf.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── gemini_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── holding_gemini.json │ │ │ │ └── test_is_baby.json │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── breed.mcfunction │ │ ├── gm4_hypexperia_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── double_xp.mcfunction │ │ │ │ ├── find_orbs.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── hypexperia_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_infinitas_shamir/ │ │ │ ├── advancement/ │ │ │ │ ├── bucket_inventory_change.json │ │ │ │ ├── empty/ │ │ │ │ │ ├── pickup_mainhand.json │ │ │ │ │ └── pickup_offhand.json │ │ │ │ ├── lava/ │ │ │ │ │ ├── place_mainhand.json │ │ │ │ │ └── place_offhand.json │ │ │ │ ├── milk/ │ │ │ │ │ ├── drink_mainhand.json │ │ │ │ │ └── drink_offhand.json │ │ │ │ ├── powder_snow/ │ │ │ │ │ ├── place_mainhand.json │ │ │ │ │ └── place_offhand.json │ │ │ │ ├── rejoin_bucket_check.json │ │ │ │ └── water/ │ │ │ │ ├── pickup_fish.json │ │ │ │ └── place.json │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── add_tags.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── clock/ │ │ │ │ │ ├── active.mcfunction │ │ │ │ │ └── inventory_check.mcfunction │ │ │ │ ├── debug/ │ │ │ │ │ └── clear.mcfunction │ │ │ │ ├── delayed_replace/ │ │ │ │ │ ├── call.mcfunction │ │ │ │ │ ├── check_tag.mcfunction │ │ │ │ │ ├── empty.mcfunction │ │ │ │ │ ├── fish/ │ │ │ │ │ │ ├── mainhand_check.mcfunction │ │ │ │ │ │ └── offhand_check.mcfunction │ │ │ │ │ ├── fish.mcfunction │ │ │ │ │ ├── lava.mcfunction │ │ │ │ │ ├── milk.mcfunction │ │ │ │ │ ├── powder_snow.mcfunction │ │ │ │ │ └── water.mcfunction │ │ │ │ ├── empty/ │ │ │ │ │ ├── check_holding.mcfunction │ │ │ │ │ ├── check_inventory.mcfunction │ │ │ │ │ ├── pickup.mcfunction │ │ │ │ │ └── remove_tag.mcfunction │ │ │ │ ├── lava/ │ │ │ │ │ ├── check_holding.mcfunction │ │ │ │ │ ├── check_inventory.mcfunction │ │ │ │ │ ├── place.mcfunction │ │ │ │ │ └── remove_tag.mcfunction │ │ │ │ ├── make_unstackable.mcfunction │ │ │ │ ├── milk/ │ │ │ │ │ └── drink.mcfunction │ │ │ │ ├── powder_snow/ │ │ │ │ │ ├── check_holding.mcfunction │ │ │ │ │ ├── check_inventory.mcfunction │ │ │ │ │ ├── place.mcfunction │ │ │ │ │ └── remove_tag.mcfunction │ │ │ │ ├── rejoin_check.mcfunction │ │ │ │ ├── spiral.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ └── water/ │ │ │ │ ├── check_holding.mcfunction │ │ │ │ ├── check_inventory.mcfunction │ │ │ │ ├── pickup.mcfunction │ │ │ │ ├── place.mcfunction │ │ │ │ └── remove_tag.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── infinitas_shamir.json │ │ │ ├── item_modifier/ │ │ │ │ ├── make_unstackable.json │ │ │ │ └── restore_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── mainhand/ │ │ │ │ │ ├── after/ │ │ │ │ │ │ ├── empty.json │ │ │ │ │ │ ├── pickup/ │ │ │ │ │ │ │ ├── axolotl.json │ │ │ │ │ │ │ ├── cod.json │ │ │ │ │ │ │ ├── pufferfish.json │ │ │ │ │ │ │ ├── salmon.json │ │ │ │ │ │ │ ├── tadpole.json │ │ │ │ │ │ │ └── tropical_fish.json │ │ │ │ │ │ ├── use_bucket.json │ │ │ │ │ │ ├── water.json │ │ │ │ │ │ └── water_advancement.json │ │ │ │ │ └── holding/ │ │ │ │ │ ├── empty.json │ │ │ │ │ ├── lava.json │ │ │ │ │ ├── powder_snow.json │ │ │ │ │ └── water.json │ │ │ │ └── offhand/ │ │ │ │ ├── after/ │ │ │ │ │ ├── empty.json │ │ │ │ │ ├── fish.json │ │ │ │ │ ├── pickup/ │ │ │ │ │ │ ├── axolotl.json │ │ │ │ │ │ ├── cod.json │ │ │ │ │ │ ├── pufferfish.json │ │ │ │ │ │ ├── salmon.json │ │ │ │ │ │ ├── tadpole.json │ │ │ │ │ │ └── tropical_fish.json │ │ │ │ │ ├── use_bucket.json │ │ │ │ │ ├── water.json │ │ │ │ │ └── water_advancement.json │ │ │ │ └── holding/ │ │ │ │ ├── empty.json │ │ │ │ ├── lava.json │ │ │ │ ├── powder_snow.json │ │ │ │ └── water.json │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ ├── valid_items.json │ │ │ │ ├── valid_items_lava.json │ │ │ │ └── valid_items_powder_snow.json │ │ │ └── test/ │ │ │ ├── check_empty_pickup.mcfunction │ │ │ └── check_unsmoosh_after_use.mcfunction │ │ ├── gm4_metallurgy/ │ │ │ ├── function/ │ │ │ │ ├── casting/ │ │ │ │ │ ├── add_metal/ │ │ │ │ │ │ ├── add_aluminium.mcfunction │ │ │ │ │ │ ├── add_barimium.mcfunction │ │ │ │ │ │ ├── add_barium.mcfunction │ │ │ │ │ │ ├── add_bismuth.mcfunction │ │ │ │ │ │ ├── add_copper.mcfunction │ │ │ │ │ │ ├── add_curies_bismium.mcfunction │ │ │ │ │ │ ├── add_thorium.mcfunction │ │ │ │ │ │ ├── add_thorium_brass.mcfunction │ │ │ │ │ │ └── initialize.mcfunction │ │ │ │ │ ├── create_mould.mcfunction │ │ │ │ │ ├── destroy_mould.mcfunction │ │ │ │ │ ├── finish_band.mcfunction │ │ │ │ │ ├── overheat_mould.mcfunction │ │ │ │ │ ├── prevent_duplicate_recast.mcfunction │ │ │ │ │ ├── set_mould.mcfunction │ │ │ │ │ ├── summon_band/ │ │ │ │ │ │ ├── aluminium.mcfunction │ │ │ │ │ │ ├── barimium.mcfunction │ │ │ │ │ │ ├── barium.mcfunction │ │ │ │ │ │ ├── bismuth.mcfunction │ │ │ │ │ │ ├── curies_bismium.mcfunction │ │ │ │ │ │ └── thorium.mcfunction │ │ │ │ │ └── sustain_mould.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── player.mcfunction │ │ │ │ ├── shamir_equipped.mcfunction │ │ │ │ ├── shamir_in_hand.mcfunction │ │ │ │ ├── smooshing/ │ │ │ │ │ ├── add_band/ │ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ │ ├── check_item.mcfunction │ │ │ │ │ │ └── found_item.mcfunction │ │ │ │ │ ├── anvil/ │ │ │ │ │ │ ├── degrade/ │ │ │ │ │ │ │ ├── anvil.mcfunction │ │ │ │ │ │ │ ├── chipped_anvil.mcfunction │ │ │ │ │ │ │ └── damaged_anvil.mcfunction │ │ │ │ │ │ ├── degrade.mcfunction │ │ │ │ │ │ └── use.mcfunction │ │ │ │ │ ├── item_on_anvil.mcfunction │ │ │ │ │ ├── prepare_transfer.mcfunction │ │ │ │ │ └── remove_band/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── clear_data.mcfunction │ │ │ │ │ ├── clear_legacy_lore.mcfunction │ │ │ │ │ ├── found_obsidian.mcfunction │ │ │ │ │ └── spawn_band.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── metallurgy.json │ │ │ ├── item_modifier/ │ │ │ │ ├── mould/ │ │ │ │ │ ├── cool_empty.json │ │ │ │ │ ├── cool_metal.json │ │ │ │ │ ├── hot_empty.json │ │ │ │ │ └── hot_metal.json │ │ │ │ └── slightly_damaged_obsidian.json │ │ │ ├── loot_table/ │ │ │ │ ├── aluminium_band.json │ │ │ │ ├── barimium_band.json │ │ │ │ ├── barium_band.json │ │ │ │ ├── baryte_lump.json │ │ │ │ ├── bauxite_lump.json │ │ │ │ ├── bismuth_band.json │ │ │ │ ├── bismutite_lump.json │ │ │ │ ├── copper_band.json │ │ │ │ ├── curies_bismium_band.json │ │ │ │ ├── malachite_lump.json │ │ │ │ ├── thorianite_lump.json │ │ │ │ ├── thorium_band.json │ │ │ │ └── thorium_brass_band.json │ │ │ ├── predicate/ │ │ │ │ ├── arborenda_active.json │ │ │ │ ├── carries_thorium.json │ │ │ │ ├── defuse_active.json │ │ │ │ ├── forterra_active.json │ │ │ │ ├── has_shamir.json │ │ │ │ ├── hypexperia_active.json │ │ │ │ ├── infinitas_active.json │ │ │ │ ├── is_castable.json │ │ │ │ ├── is_clay_ball.json │ │ │ │ ├── is_ender_bolt_trident.json │ │ │ │ ├── is_obsidian.json │ │ │ │ ├── levity_active.json │ │ │ │ ├── moneo_active.json │ │ │ │ ├── musical_active.json │ │ │ │ ├── on_ground.json │ │ │ │ ├── sensus_active.json │ │ │ │ ├── shamir_equipped.json │ │ │ │ ├── shamir_in_hand.json │ │ │ │ ├── smooshing/ │ │ │ │ │ ├── anvil_damage_chance.json │ │ │ │ │ ├── has_shamir.json │ │ │ │ │ └── valid_item.json │ │ │ │ ├── tinker_active.json │ │ │ │ └── vibro_active.json │ │ │ ├── structure/ │ │ │ │ ├── test_casting.nbt │ │ │ │ └── test_smooshing.nbt │ │ │ ├── tags/ │ │ │ │ └── function/ │ │ │ │ ├── apply_band.json │ │ │ │ ├── check_item_validity.json │ │ │ │ └── summon_band/ │ │ │ │ ├── aluminium.json │ │ │ │ ├── barimium.json │ │ │ │ ├── barium.json │ │ │ │ ├── bismuth.json │ │ │ │ ├── curies_bismium.json │ │ │ │ └── thorium.json │ │ │ └── test/ │ │ │ ├── cast_add_lumps.mcfunction │ │ │ ├── cast_create_and_destroy.mcfunction │ │ │ ├── cast_mundane.mcfunction │ │ │ ├── cast_overheat.mcfunction │ │ │ ├── cast_successful.mcfunction │ │ │ └── smoosh.mcfunction │ │ ├── gm4_moneo_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active_armor_chest.mcfunction │ │ │ │ ├── active_tool.mcfunction │ │ │ │ ├── armor/ │ │ │ │ │ └── elytra.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── store_maximum.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ ├── tools/ │ │ │ │ │ ├── materials/ │ │ │ │ │ │ ├── copper.mcfunction │ │ │ │ │ │ ├── diamond.mcfunction │ │ │ │ │ │ ├── gold.mcfunction │ │ │ │ │ │ ├── iron.mcfunction │ │ │ │ │ │ ├── netherite.mcfunction │ │ │ │ │ │ ├── stone.mcfunction │ │ │ │ │ │ └── wood.mcfunction │ │ │ │ │ └── shears.mcfunction │ │ │ │ └── update_netherite.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── moneo_shamir.json │ │ │ ├── item_modifier/ │ │ │ │ └── netherite_update.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── holding_moneo.json │ │ │ │ ├── holding_netherite.json │ │ │ │ └── wear_chest_moneo.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ ├── netherite_tools.json │ │ │ ├── valid_items.json │ │ │ └── valid_tools.json │ │ ├── gm4_musical_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── songs/ │ │ │ │ │ ├── chirp.mcfunction │ │ │ │ │ ├── mellohi.mcfunction │ │ │ │ │ ├── mellohi_end.mcfunction │ │ │ │ │ └── reset_player.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── musical_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── tags/ │ │ │ │ └── item/ │ │ │ │ └── valid_items.json │ │ │ └── test/ │ │ │ └── gain_buff.mcfunction │ │ ├── gm4_sensus_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── block_search/ │ │ │ │ │ ├── mark_coal_ore.mcfunction │ │ │ │ │ ├── mark_copper_ore.mcfunction │ │ │ │ │ ├── mark_diamond_ore.mcfunction │ │ │ │ │ ├── mark_emerald_ore.mcfunction │ │ │ │ │ ├── mark_gold_ore.mcfunction │ │ │ │ │ ├── mark_iron_ore.mcfunction │ │ │ │ │ ├── mark_lapis_ore.mcfunction │ │ │ │ │ ├── mark_nether/ │ │ │ │ │ │ ├── ancient_debris.mcfunction │ │ │ │ │ │ ├── nether_gold_ore.mcfunction │ │ │ │ │ │ └── nether_quartz_ore.mcfunction │ │ │ │ │ ├── mark_nether_quartz_ore.mcfunction │ │ │ │ │ ├── mark_overworld/ │ │ │ │ │ │ ├── coal_ore.mcfunction │ │ │ │ │ │ ├── copper_ore.mcfunction │ │ │ │ │ │ ├── deepslate_coal_ore.mcfunction │ │ │ │ │ │ ├── deepslate_copper_ore.mcfunction │ │ │ │ │ │ ├── deepslate_diamond_ore.mcfunction │ │ │ │ │ │ ├── deepslate_emerald_ore.mcfunction │ │ │ │ │ │ ├── deepslate_gold_ore.mcfunction │ │ │ │ │ │ ├── deepslate_iron_ore.mcfunction │ │ │ │ │ │ ├── deepslate_lapis_ore.mcfunction │ │ │ │ │ │ ├── deepslate_redstone_ore.mcfunction │ │ │ │ │ │ ├── diamond_ore.mcfunction │ │ │ │ │ │ ├── emerald_ore.mcfunction │ │ │ │ │ │ ├── gold_ore.mcfunction │ │ │ │ │ │ ├── iron_ore.mcfunction │ │ │ │ │ │ ├── lapis_ore.mcfunction │ │ │ │ │ │ └── redstone_ore.mcfunction │ │ │ │ │ ├── mark_redstone_ore.mcfunction │ │ │ │ │ └── search.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── sensus_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_tinker_shamir/ │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── compact/ │ │ │ │ │ ├── clay_ball.mcfunction │ │ │ │ │ ├── coal.mcfunction │ │ │ │ │ ├── copper_ingot.mcfunction │ │ │ │ │ ├── diamond.mcfunction │ │ │ │ │ ├── emerald.mcfunction │ │ │ │ │ ├── gold_ingot.mcfunction │ │ │ │ │ ├── gold_nugget.mcfunction │ │ │ │ │ ├── iron_ingot.mcfunction │ │ │ │ │ ├── iron_nugget.mcfunction │ │ │ │ │ ├── lapis_lazuli.mcfunction │ │ │ │ │ ├── melon_slice.mcfunction │ │ │ │ │ ├── netherite_ingot.mcfunction │ │ │ │ │ ├── raw_copper.mcfunction │ │ │ │ │ ├── raw_gold.mcfunction │ │ │ │ │ ├── raw_iron.mcfunction │ │ │ │ │ ├── redstone.mcfunction │ │ │ │ │ ├── slime_ball.mcfunction │ │ │ │ │ ├── snowball.mcfunction │ │ │ │ │ └── wheat.mcfunction │ │ │ │ ├── summon_band.mcfunction │ │ │ │ └── tool/ │ │ │ │ ├── hoe.mcfunction │ │ │ │ ├── pickaxe.mcfunction │ │ │ │ ├── shovel.mcfunction │ │ │ │ └── sword.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── tinker_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ └── has_full_stack/ │ │ │ │ ├── clay_ball.json │ │ │ │ ├── coal.json │ │ │ │ ├── copper_ingot.json │ │ │ │ ├── diamond.json │ │ │ │ ├── emerald.json │ │ │ │ ├── gold_ingot.json │ │ │ │ ├── gold_nugget.json │ │ │ │ ├── iron_ingot.json │ │ │ │ ├── iron_nugget.json │ │ │ │ ├── lapis_lazuli.json │ │ │ │ ├── melon_slice.json │ │ │ │ ├── netherite_ingot.json │ │ │ │ ├── raw_copper.json │ │ │ │ ├── raw_gold.json │ │ │ │ ├── raw_iron.json │ │ │ │ ├── redstone.json │ │ │ │ ├── slime_ball.json │ │ │ │ ├── snowball.json │ │ │ │ └── wheat.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_vibro_shamir/ │ │ │ ├── advancement/ │ │ │ │ └── vibro_fall_damage.json │ │ │ ├── function/ │ │ │ │ ├── active.mcfunction │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ ├── desire_lines.mcfunction │ │ │ │ ├── jump.mcfunction │ │ │ │ ├── remove_jump.mcfunction │ │ │ │ ├── shock/ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ ├── apply_mob.mcfunction │ │ │ │ │ ├── apply_player.mcfunction │ │ │ │ │ ├── calculate.mcfunction │ │ │ │ │ ├── check_shock.mcfunction │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ ├── ray_execute.mcfunction │ │ │ │ │ ├── revert_health.mcfunction │ │ │ │ │ └── user.mcfunction │ │ │ │ ├── shockwave.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── vibro_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ ├── predicate/ │ │ │ │ ├── desire_lines_chance_high.json │ │ │ │ ├── desire_lines_chance_low.json │ │ │ │ └── sneak_on_ground.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ └── minecraft/ │ │ └── loot_table/ │ │ └── blocks/ │ │ ├── andesite.json │ │ ├── deepslate.json │ │ ├── diorite.json │ │ ├── granite.json │ │ └── stone.json │ ├── mod.mcdoc │ └── shamir_model_template.py ├── gm4_midnight_menaces/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_enlarging_phantoms/ │ │ │ ├── function/ │ │ │ │ ├── dawn_active_check.mcfunction │ │ │ │ ├── event.mcfunction │ │ │ │ ├── initialise.mcfunction │ │ │ │ ├── set_pos.mcfunction │ │ │ │ ├── set_size.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── slow_clock.mcfunction │ │ │ └── guidebook/ │ │ │ └── enlarging_phantoms.json │ │ ├── gm4_icy_strays/ │ │ │ ├── function/ │ │ │ │ ├── event.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── stray_transform.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── icy_strays.json │ │ │ ├── loot_table/ │ │ │ │ └── entities/ │ │ │ │ └── icy_stray.json │ │ │ └── predicate/ │ │ │ └── stray_convert_chance.json │ │ ├── gm4_illusioner_nights/ │ │ │ ├── function/ │ │ │ │ ├── event.mcfunction │ │ │ │ ├── illusioner_transform.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── illusioner_nights.json │ │ │ ├── loot_table/ │ │ │ │ └── entities/ │ │ │ │ └── illusioner.json │ │ │ ├── predicate/ │ │ │ │ └── illusioner_convert_chance.json │ │ │ └── tags/ │ │ │ └── entity_type/ │ │ │ └── illusioner_convertable.json │ │ ├── gm4_menacing_goblins/ │ │ │ ├── function/ │ │ │ │ ├── event.mcfunction │ │ │ │ ├── goblin_steal/ │ │ │ │ │ ├── check_player.mcfunction │ │ │ │ │ ├── diamond.mcfunction │ │ │ │ │ ├── gold_ingot.mcfunction │ │ │ │ │ └── iron_ingot.mcfunction │ │ │ │ ├── goblin_transform.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── menacing_goblins.json │ │ │ ├── loot_table/ │ │ │ │ └── entities/ │ │ │ │ └── goblin.json │ │ │ ├── predicate/ │ │ │ │ ├── diamond_steal_chance.json │ │ │ │ ├── goblin_convert_chance.json │ │ │ │ ├── gold_steal_chance.json │ │ │ │ ├── iron_steal_chance.json │ │ │ │ └── store_chance.json │ │ │ └── tags/ │ │ │ └── entity_type/ │ │ │ └── goblin_convertable.json │ │ ├── gm4_midnight_menaces/ │ │ │ └── function/ │ │ │ ├── active_night.mcfunction │ │ │ └── init.mcfunction │ │ ├── gm4_mysterious_midnights/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── active_night.json │ │ │ ├── end_pulse.json │ │ │ ├── setup_common_expansion.json │ │ │ ├── setup_rare_expansion.json │ │ │ └── setup_uncommon_expansion.json │ │ ├── gm4_nightmare_nights/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── nightmare_night_expansion.json │ │ ├── gm4_sandy_husks/ │ │ │ ├── function/ │ │ │ │ ├── event.mcfunction │ │ │ │ ├── husk_transform.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── sandy_husks.json │ │ │ ├── loot_table/ │ │ │ │ └── entities/ │ │ │ │ └── sandy_husk.json │ │ │ └── predicate/ │ │ │ └── husk_convert_chance.json │ │ └── gm4_slime_fests/ │ │ ├── function/ │ │ │ ├── absorb_slime_ball.mcfunction │ │ │ ├── complete_merge.mcfunction │ │ │ ├── event.mcfunction │ │ │ ├── mark_slime_ball.mcfunction │ │ │ ├── merge_slimes.mcfunction │ │ │ ├── setup.mcfunction │ │ │ ├── slime_transform.mcfunction │ │ │ └── spawn_slime.mcfunction │ │ ├── guidebook/ │ │ │ └── slime_fests.json │ │ ├── loot_table/ │ │ │ └── entities/ │ │ │ └── giant_slime.json │ │ └── tags/ │ │ └── entity_type/ │ │ └── slime_convertable.json │ └── translations.csv ├── gm4_monsters_unbound/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_monsters_unbound/ │ │ │ └── models/ │ │ │ └── item/ │ │ │ ├── elite_headwear/ │ │ │ │ ├── glacial.json │ │ │ │ ├── mending.json │ │ │ │ └── pearlescent.json │ │ │ └── spore/ │ │ │ ├── cherry.json │ │ │ ├── default.json │ │ │ └── flowering.json │ │ └── model_data.yaml │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── monsters_unbound_elite_kill.json │ │ │ └── monsters_unbound_elite_kill_all.json │ │ ├── gm4_monsters_unbound/ │ │ │ ├── advancement/ │ │ │ │ ├── damaged/ │ │ │ │ │ └── attack_effect/ │ │ │ │ │ ├── charging.json │ │ │ │ │ ├── slowing.json │ │ │ │ │ ├── toxic.json │ │ │ │ │ └── weakness.json │ │ │ │ └── elite/ │ │ │ │ └── on_hit.json │ │ │ ├── function/ │ │ │ │ ├── check_item.mcfunction │ │ │ │ ├── clocks/ │ │ │ │ │ ├── effect/ │ │ │ │ │ │ ├── fear.mcfunction │ │ │ │ │ │ └── freeze.mcfunction │ │ │ │ │ └── elite/ │ │ │ │ │ ├── blazing_flare.mcfunction │ │ │ │ │ ├── glacial_death.mcfunction │ │ │ │ │ ├── volatile_pillar.mcfunction │ │ │ │ │ ├── vorpal_death.mcfunction │ │ │ │ │ └── zephyr_process.mcfunction │ │ │ │ ├── debug/ │ │ │ │ │ └── spawn_elite/ │ │ │ │ │ ├── blazing/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── gargantuan/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── glacial/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── mending/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── pearlescent/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── splitting/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── volatile/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ ├── vorpal/ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ └── zephyr/ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ └── zombie.mcfunction │ │ │ │ ├── effect/ │ │ │ │ │ ├── fear/ │ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ │ ├── playsound.mcfunction │ │ │ │ │ │ ├── remove.mcfunction │ │ │ │ │ │ └── tick.mcfunction │ │ │ │ │ └── freeze/ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ ├── apply_chill.mcfunction │ │ │ │ │ ├── apply_entity.mcfunction │ │ │ │ │ ├── apply_from_slow.mcfunction │ │ │ │ │ ├── apply_player.mcfunction │ │ │ │ │ ├── stack_slow.mcfunction │ │ │ │ │ ├── thaw_entity.mcfunction │ │ │ │ │ ├── thaw_player.mcfunction │ │ │ │ │ └── tick.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── mob/ │ │ │ │ │ ├── init/ │ │ │ │ │ │ ├── check_mob.mcfunction │ │ │ │ │ │ ├── elite/ │ │ │ │ │ │ │ ├── pick.mcfunction │ │ │ │ │ │ │ └── type/ │ │ │ │ │ │ │ ├── blazing.mcfunction │ │ │ │ │ │ │ ├── gargantuan.mcfunction │ │ │ │ │ │ │ ├── glacial.mcfunction │ │ │ │ │ │ │ ├── mending.mcfunction │ │ │ │ │ │ │ ├── pearlescent.mcfunction │ │ │ │ │ │ │ ├── splitting.mcfunction │ │ │ │ │ │ │ ├── volatile.mcfunction │ │ │ │ │ │ │ ├── vorpal.mcfunction │ │ │ │ │ │ │ └── zephyr.mcfunction │ │ │ │ │ │ ├── initialize.mcfunction │ │ │ │ │ │ ├── mob_type/ │ │ │ │ │ │ │ ├── creeper/ │ │ │ │ │ │ │ │ ├── base.mcfunction │ │ │ │ │ │ │ │ ├── dripstone_caves.mcfunction │ │ │ │ │ │ │ │ ├── flowering.mcfunction │ │ │ │ │ │ │ │ ├── mountainous.mcfunction │ │ │ │ │ │ │ │ └── snowy.mcfunction │ │ │ │ │ │ │ ├── enderman/ │ │ │ │ │ │ │ │ ├── base.mcfunction │ │ │ │ │ │ │ │ ├── dripstone_caves.mcfunction │ │ │ │ │ │ │ │ ├── flowering.mcfunction │ │ │ │ │ │ │ │ ├── growth.mcfunction │ │ │ │ │ │ │ │ ├── nether_wastes.mcfunction │ │ │ │ │ │ │ │ ├── soul_sand_valley.mcfunction │ │ │ │ │ │ │ │ ├── toxic.mcfunction │ │ │ │ │ │ │ │ └── underground.mcfunction │ │ │ │ │ │ │ ├── skeleton/ │ │ │ │ │ │ │ │ ├── base.mcfunction │ │ │ │ │ │ │ │ ├── flowering.mcfunction │ │ │ │ │ │ │ │ ├── growth.mcfunction │ │ │ │ │ │ │ │ ├── toxic.mcfunction │ │ │ │ │ │ │ │ └── underground.mcfunction │ │ │ │ │ │ │ ├── spider/ │ │ │ │ │ │ │ │ ├── cave_spider.mcfunction │ │ │ │ │ │ │ │ ├── gargantuan.mcfunction │ │ │ │ │ │ │ │ ├── lush_caves.mcfunction │ │ │ │ │ │ │ │ ├── spider.mcfunction │ │ │ │ │ │ │ │ ├── toxic.mcfunction │ │ │ │ │ │ │ │ └── underground/ │ │ │ │ │ │ │ │ ├── pick.mcfunction │ │ │ │ │ │ │ │ └── replace_with_cave_spider.mcfunction │ │ │ │ │ │ │ └── zombie/ │ │ │ │ │ │ │ ├── base.mcfunction │ │ │ │ │ │ │ ├── burned_husk.mcfunction │ │ │ │ │ │ │ ├── burned_husk_army.mcfunction │ │ │ │ │ │ │ ├── dripstone_caves/ │ │ │ │ │ │ │ │ ├── place.mcfunction │ │ │ │ │ │ │ │ ├── raycast.mcfunction │ │ │ │ │ │ │ │ └── try.mcfunction │ │ │ │ │ │ │ ├── equip_shield.mcfunction │ │ │ │ │ │ │ ├── flowering.mcfunction │ │ │ │ │ │ │ ├── growth.mcfunction │ │ │ │ │ │ │ ├── mountainous.mcfunction │ │ │ │ │ │ │ ├── reef_drowned.mcfunction │ │ │ │ │ │ │ ├── snowy.mcfunction │ │ │ │ │ │ │ ├── spawn_phantoms.mcfunction │ │ │ │ │ │ │ └── underground/ │ │ │ │ │ │ │ ├── offhand_weapon.mcfunction │ │ │ │ │ │ │ ├── pick.mcfunction │ │ │ │ │ │ │ └── replace_with_skeleton.mcfunction │ │ │ │ │ │ └── mob_type.mcfunction │ │ │ │ │ └── process/ │ │ │ │ │ ├── attack_effect/ │ │ │ │ │ │ ├── charging_attack.mcfunction │ │ │ │ │ │ ├── slowing_attack.mcfunction │ │ │ │ │ │ ├── toxic_attack.mcfunction │ │ │ │ │ │ └── weakness_attack.mcfunction │ │ │ │ │ ├── cloaked_creeper.mcfunction │ │ │ │ │ ├── elite/ │ │ │ │ │ │ ├── blazing/ │ │ │ │ │ │ │ ├── flare_damage.mcfunction │ │ │ │ │ │ │ ├── flare_explode.mcfunction │ │ │ │ │ │ │ ├── init_flare.mcfunction │ │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ │ └── process_flare.mcfunction │ │ │ │ │ │ ├── check_type.mcfunction │ │ │ │ │ │ ├── gargantuan/ │ │ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ │ │ ├── eval_stats.mcfunction │ │ │ │ │ │ │ ├── particle_ring.mcfunction │ │ │ │ │ │ │ ├── particle_ring_big.mcfunction │ │ │ │ │ │ │ ├── player_hit.mcfunction │ │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ │ └── update_stats.mcfunction │ │ │ │ │ │ ├── glacial/ │ │ │ │ │ │ │ ├── death.mcfunction │ │ │ │ │ │ │ ├── explode.mcfunction │ │ │ │ │ │ │ ├── process_explosion.mcfunction │ │ │ │ │ │ │ ├── warning_pitch_loop_big.mcfunction │ │ │ │ │ │ │ ├── warning_pitch_loop_small.mcfunction │ │ │ │ │ │ │ └── warning_yaw_loop.mcfunction │ │ │ │ │ │ ├── mending/ │ │ │ │ │ │ │ ├── check_los_raycast.mcfunction │ │ │ │ │ │ │ ├── check_target.mcfunction │ │ │ │ │ │ │ ├── particle_raycast.mcfunction │ │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ │ └── trigger.mcfunction │ │ │ │ │ │ ├── on_death/ │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ ├── on_hit/ │ │ │ │ │ │ │ ├── check_mob.mcfunction │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ ├── pearlescent/ │ │ │ │ │ │ │ ├── get_facing.mcfunction │ │ │ │ │ │ │ ├── laser.mcfunction │ │ │ │ │ │ │ ├── laser_damage.mcfunction │ │ │ │ │ │ │ ├── laser_raycast.mcfunction │ │ │ │ │ │ │ └── process.mcfunction │ │ │ │ │ │ ├── splitting/ │ │ │ │ │ │ │ ├── init_entity.mcfunction │ │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ │ └── zombie.mcfunction │ │ │ │ │ │ ├── volatile/ │ │ │ │ │ │ │ ├── death.mcfunction │ │ │ │ │ │ │ ├── pillar_damage.mcfunction │ │ │ │ │ │ │ ├── pillar_explode.mcfunction │ │ │ │ │ │ │ ├── pillar_location.mcfunction │ │ │ │ │ │ │ ├── pillar_location_y.mcfunction │ │ │ │ │ │ │ ├── pillar_particle_ring.mcfunction │ │ │ │ │ │ │ ├── pillar_process.mcfunction │ │ │ │ │ │ │ └── process.mcfunction │ │ │ │ │ │ ├── vorpal/ │ │ │ │ │ │ │ ├── fear_hit.mcfunction │ │ │ │ │ │ │ ├── init_fear_cloud.mcfunction │ │ │ │ │ │ │ ├── process_fear_cloud.mcfunction │ │ │ │ │ │ │ └── warp/ │ │ │ │ │ │ │ ├── randomize.mcfunction │ │ │ │ │ │ │ ├── run.mcfunction │ │ │ │ │ │ │ ├── set_ypos.mcfunction │ │ │ │ │ │ │ ├── spawn_marker.mcfunction │ │ │ │ │ │ │ └── tp_marker.mcfunction │ │ │ │ │ │ └── zephyr/ │ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ │ ├── charge_complete.mcfunction │ │ │ │ │ │ ├── hit_when_charging.mcfunction │ │ │ │ │ │ ├── lose_charge.mcfunction │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ └── skeleton/ │ │ │ │ │ │ ├── arrow_burst.mcfunction │ │ │ │ │ │ ├── get_target_pos.mcfunction │ │ │ │ │ │ ├── init_arrow.mcfunction │ │ │ │ │ │ └── start.mcfunction │ │ │ │ │ ├── reveal_dripstone_trap.mcfunction │ │ │ │ │ ├── reveal_snowy_trap.mcfunction │ │ │ │ │ ├── spore/ │ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ │ ├── advance.mcfunction │ │ │ │ │ │ ├── burn_on_head.mcfunction │ │ │ │ │ │ ├── initialise.mcfunction │ │ │ │ │ │ └── set_generation.mcfunction │ │ │ │ │ └── toxic_creeper.mcfunction │ │ │ │ ├── slow_clock.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── monsters_unbound.json │ │ │ ├── loot_table/ │ │ │ │ ├── elite/ │ │ │ │ │ ├── glacial.json │ │ │ │ │ ├── mending.json │ │ │ │ │ ├── pearlescent.json │ │ │ │ │ ├── splitting_skeleton.json │ │ │ │ │ ├── splitting_zombie.json │ │ │ │ │ ├── volatile.json │ │ │ │ │ └── vorpal.json │ │ │ │ └── mob/ │ │ │ │ ├── equip_armor/ │ │ │ │ │ └── spore.json │ │ │ │ └── equip_arrow/ │ │ │ │ ├── skeleton_toxic.json │ │ │ │ ├── stray_snowy.json │ │ │ │ └── stray_toxic.json │ │ │ ├── predicate/ │ │ │ │ ├── biome/ │ │ │ │ │ ├── burned.json │ │ │ │ │ ├── flowering.json │ │ │ │ │ ├── growth.json │ │ │ │ │ ├── mountainous.json │ │ │ │ │ ├── reef.json │ │ │ │ │ ├── snowy.json │ │ │ │ │ └── toxic.json │ │ │ │ ├── chance/ │ │ │ │ │ └── spawn_phantom.json │ │ │ │ └── technical/ │ │ │ │ ├── on_fire.json │ │ │ │ ├── underground.json │ │ │ │ └── valid_tp.json │ │ │ └── tags/ │ │ │ ├── block/ │ │ │ │ └── dripstone.json │ │ │ └── entity_type/ │ │ │ ├── elite_types.json │ │ │ ├── modify.json │ │ │ ├── modify_in_air.json │ │ │ ├── skeleton_types.json │ │ │ └── zombie_types.json │ │ └── gm4_survival_refightalized/ │ │ └── tags/ │ │ └── function/ │ │ └── init_mob.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_mysterious_midnights/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_falling_stars/ │ │ │ ├── function/ │ │ │ │ ├── event.mcfunction │ │ │ │ ├── falling_star/ │ │ │ │ │ ├── accumulate_impact_points.mcfunction │ │ │ │ │ ├── decay.mcfunction │ │ │ │ │ ├── initilize.mcfunction │ │ │ │ │ ├── select_spawn_location.mcfunction │ │ │ │ │ ├── spawn.mcfunction │ │ │ │ │ └── start_in_area.mcfunction │ │ │ │ ├── hatch_endermite.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── star_shower.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── falling_stars.json │ │ │ ├── loot_table/ │ │ │ │ ├── endermite_egg.json │ │ │ │ └── star_type.json │ │ │ ├── predicate/ │ │ │ │ ├── shower_chance.json │ │ │ │ └── spawn_chance.json │ │ │ └── tags/ │ │ │ └── entity_type/ │ │ │ └── falling_star.json │ │ ├── gm4_harvest_moons/ │ │ │ ├── function/ │ │ │ │ ├── dawn_active_check.mcfunction │ │ │ │ ├── dawn_event.mcfunction │ │ │ │ ├── event.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ └── guidebook/ │ │ │ └── harvest_moons.json │ │ ├── gm4_mysterious_midnights/ │ │ │ ├── function/ │ │ │ │ ├── calculate_difficulty.mcfunction │ │ │ │ ├── end_pulse.mcfunction │ │ │ │ ├── event_clock.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── roll_difficulty.mcfunction │ │ │ │ └── start_midnight.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── mysterious_midnights.json │ │ │ ├── predicate/ │ │ │ │ └── is_full_moon_night.json │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── active_night.json │ │ │ ├── end_pulse.json │ │ │ ├── setup_common_expansion.json │ │ │ ├── setup_rare_expansion.json │ │ │ └── setup_uncommon_expansion.json │ │ ├── gm4_nightmare_nights/ │ │ │ ├── function/ │ │ │ │ ├── dawn_active_check.mcfunction │ │ │ │ ├── dawn_event.mcfunction │ │ │ │ ├── event.mcfunction │ │ │ │ ├── initialise.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── nightmare_nights.json │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── nightmare_night_expansion.json │ │ ├── gm4_resurrecting_skeletons/ │ │ │ ├── function/ │ │ │ │ ├── absorb_bone.mcfunction │ │ │ │ ├── event.mcfunction │ │ │ │ ├── mark_bone.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── spawn_skeleton.mcfunction │ │ │ └── guidebook/ │ │ │ └── resurrecting_skeletons.json │ │ ├── gm4_resurrecting_zombies/ │ │ │ ├── function/ │ │ │ │ ├── absorb_rotten_flesh.mcfunction │ │ │ │ ├── event.mcfunction │ │ │ │ ├── mark_rotten_flesh.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── spawn_zombie.mcfunction │ │ │ └── guidebook/ │ │ │ └── resurrecting_zombies.json │ │ └── gm4_tipped_skeletons/ │ │ ├── function/ │ │ │ ├── event.mcfunction │ │ │ ├── setup.mcfunction │ │ │ └── tipp.mcfunction │ │ ├── guidebook/ │ │ │ └── tipped_skeletons.json │ │ └── loot_table/ │ │ └── tipped_type.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_note_block_interface/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_note_block_interface/ │ │ ├── advancement/ │ │ │ └── tune.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── interface/ │ │ │ │ ├── change.mcfunction │ │ │ │ └── create.mcfunction │ │ │ ├── play/ │ │ │ │ ├── loop.mcfunction │ │ │ │ └── setup.mcfunction │ │ │ ├── tick.mcfunction │ │ │ ├── tune/ │ │ │ │ ├── loop.mcfunction │ │ │ │ ├── setup.mcfunction │ │ │ │ └── sneak_loop.mcfunction │ │ │ └── tune.mcfunction │ │ ├── guidebook/ │ │ │ └── note_block_interface.json │ │ ├── predicate/ │ │ │ └── sneaking.json │ │ └── test/ │ │ ├── play_note.mcfunction │ │ ├── tune_down.mcfunction │ │ └── tune_up.mcfunction │ └── translations.csv ├── gm4_orb_of_ankou/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_orb_of_ankou/ │ │ │ └── optifine/ │ │ │ └── cit/ │ │ │ └── fire_sprite.properties │ │ ├── minecraft/ │ │ │ └── optifine/ │ │ │ ├── anim/ │ │ │ │ ├── bat2.properties │ │ │ │ ├── bat2_e.properties │ │ │ │ ├── endermite2.properties │ │ │ │ ├── endermite2_e.properties │ │ │ │ ├── phantom2.properties │ │ │ │ ├── silverfish3.properties │ │ │ │ └── silverfish3_e.properties │ │ │ ├── cem/ │ │ │ │ ├── bat.jem │ │ │ │ ├── endermite.jem │ │ │ │ └── silverfish.jem │ │ │ └── mob/ │ │ │ ├── bat.properties │ │ │ ├── endermite.properties │ │ │ └── silverfish.properties │ │ ├── model_data.yaml │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── all_pneumas.json │ │ │ ├── create_soul_forge.json │ │ │ ├── create_soul_shard.json │ │ │ ├── max_orb_of_ankou.json │ │ │ ├── obtain_soul_essence.json │ │ │ └── soaring_pneuma.json │ │ ├── gm4_animi_shamir/ │ │ │ └── function/ │ │ │ └── mark_orb_of_ankou.mcfunction │ │ ├── gm4_corripio_shamir/ │ │ │ ├── function/ │ │ │ │ ├── check_item_validity.mcfunction │ │ │ │ └── summon_band.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── corripio_shamir.json │ │ │ ├── loot_table/ │ │ │ │ └── band.json │ │ │ └── tags/ │ │ │ └── item/ │ │ │ └── valid_items.json │ │ ├── gm4_metallurgy/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── check_item_validity.json │ │ │ └── summon_band/ │ │ │ └── bismuth.json │ │ └── gm4_orb_of_ankou/ │ │ ├── advancement/ │ │ │ ├── check_player/ │ │ │ │ ├── check_inventory.json │ │ │ │ └── get_id.json │ │ │ ├── recipes/ │ │ │ │ └── orb_of_ankou.json │ │ │ └── triggers/ │ │ │ ├── damaged.json │ │ │ ├── fire_damaged.json │ │ │ ├── hunger_attack.json │ │ │ ├── magic_damaged_1.json │ │ │ ├── magic_damaged_2.json │ │ │ ├── magic_evoker_fang.json │ │ │ ├── poison_attack.json │ │ │ ├── poison_effect.json │ │ │ ├── shoot_crossbow.json │ │ │ ├── traded.json │ │ │ ├── wither_attack.json │ │ │ └── wither_effect.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── nether_main.mcfunction │ │ │ ├── nether_tick.mcfunction │ │ │ ├── player.mcfunction │ │ │ ├── pneumas/ │ │ │ │ ├── advancement_triggers/ │ │ │ │ │ ├── affected_by_poison.mcfunction │ │ │ │ │ ├── affected_by_wither.mcfunction │ │ │ │ │ ├── hunger_attack.mcfunction │ │ │ │ │ ├── magic_damaged_1.mcfunction │ │ │ │ │ ├── magic_damaged_2.mcfunction │ │ │ │ │ ├── magic_ignore.mcfunction │ │ │ │ │ ├── player_damaged.mcfunction │ │ │ │ │ ├── player_on_fire.mcfunction │ │ │ │ │ ├── player_traded.mcfunction │ │ │ │ │ ├── poison_attack.mcfunction │ │ │ │ │ ├── shot_crossbow.mcfunction │ │ │ │ │ └── wither_attack.mcfunction │ │ │ │ ├── blasting.mcfunction │ │ │ │ ├── bounding.mcfunction │ │ │ │ ├── conjuring/ │ │ │ │ │ ├── prepare.mcfunction │ │ │ │ │ ├── summon_fangs.mcfunction │ │ │ │ │ ├── temp_tick.mcfunction │ │ │ │ │ └── throw.mcfunction │ │ │ │ ├── dashing/ │ │ │ │ │ ├── prepare.mcfunction │ │ │ │ │ └── set_motion.mcfunction │ │ │ │ ├── draining/ │ │ │ │ │ ├── apply_effect.mcfunction │ │ │ │ │ └── search.mcfunction │ │ │ │ ├── expeditious/ │ │ │ │ │ ├── attempt.mcfunction │ │ │ │ │ ├── get_pos.mcfunction │ │ │ │ │ ├── randomize.mcfunction │ │ │ │ │ ├── set_ypos.mcfunction │ │ │ │ │ └── tp_player.mcfunction │ │ │ │ ├── feigning/ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ └── move_away.mcfunction │ │ │ │ ├── magic_damaged/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── magic_1.mcfunction │ │ │ │ │ └── magic_2.mcfunction │ │ │ │ ├── phasing/ │ │ │ │ │ ├── check_traversable.mcfunction │ │ │ │ │ └── tp.mcfunction │ │ │ │ ├── retreating.mcfunction │ │ │ │ ├── revert_invulnerable_item.mcfunction │ │ │ │ ├── rushing.mcfunction │ │ │ │ ├── shrieking/ │ │ │ │ │ ├── boom.mcfunction │ │ │ │ │ ├── boom_mob.mcfunction │ │ │ │ │ ├── boom_player.mcfunction │ │ │ │ │ ├── find_target.mcfunction │ │ │ │ │ ├── player_death.mcfunction │ │ │ │ │ └── release.mcfunction │ │ │ │ ├── sneak/ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ ├── sound.mcfunction │ │ │ │ │ └── stopped.mcfunction │ │ │ │ ├── sniffing.mcfunction │ │ │ │ ├── soaring/ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ ├── ascend.mcfunction │ │ │ │ │ ├── descend.mcfunction │ │ │ │ │ ├── idle.mcfunction │ │ │ │ │ ├── remove_fall_protection.mcfunction │ │ │ │ │ └── toggle.mcfunction │ │ │ │ ├── striding.mcfunction │ │ │ │ ├── synergetic/ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ └── check_wolf.mcfunction │ │ │ │ ├── temp_tick/ │ │ │ │ │ ├── debilitate.mcfunction │ │ │ │ │ ├── feigning_revert.mcfunction │ │ │ │ │ ├── freezing.mcfunction │ │ │ │ │ ├── hawkeye.mcfunction │ │ │ │ │ ├── magic_damaged.mcfunction │ │ │ │ │ ├── striding.mcfunction │ │ │ │ │ ├── striding_revert.mcfunction │ │ │ │ │ └── tranquilizing.mcfunction │ │ │ │ └── volatile.mcfunction │ │ │ ├── soul_forge/ │ │ │ │ ├── create.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── entities/ │ │ │ │ │ ├── fire_sprite.mcfunction │ │ │ │ │ ├── set_data/ │ │ │ │ │ │ ├── congealed_shard.mcfunction │ │ │ │ │ │ ├── get_orb_pneuma.mcfunction │ │ │ │ │ │ ├── living_orb.mcfunction │ │ │ │ │ │ ├── loop_orb_pneumas.mcfunction │ │ │ │ │ │ ├── randomize_motion.mcfunction │ │ │ │ │ │ └── severed_soul.mcfunction │ │ │ │ │ ├── summon_congealed_shard.mcfunction │ │ │ │ │ ├── summon_extra_essence.mcfunction │ │ │ │ │ ├── summon_extra_orb.mcfunction │ │ │ │ │ ├── summon_extra_shard.mcfunction │ │ │ │ │ ├── summon_failed_essence.mcfunction │ │ │ │ │ ├── summon_glowstone_sprite.mcfunction │ │ │ │ │ ├── summon_living_orb.mcfunction │ │ │ │ │ ├── summon_powder_sprite.mcfunction │ │ │ │ │ ├── summon_wandering_tear.mcfunction │ │ │ │ │ └── withering_magic.mcfunction │ │ │ │ ├── outputs/ │ │ │ │ │ ├── check_fuse.mcfunction │ │ │ │ │ ├── create_shard.mcfunction │ │ │ │ │ ├── fuse_pneuma.mcfunction │ │ │ │ │ └── set_shard_loot.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ ├── ray.mcfunction │ │ │ │ ├── ray_backup.mcfunction │ │ │ │ ├── recipes/ │ │ │ │ │ ├── add_blaze_powder.mcfunction │ │ │ │ │ ├── add_first_soul_essence.mcfunction │ │ │ │ │ ├── add_ghast_tear.mcfunction │ │ │ │ │ ├── add_glowstone_dust.mcfunction │ │ │ │ │ ├── add_orb.mcfunction │ │ │ │ │ ├── add_shard.mcfunction │ │ │ │ │ ├── add_soul_essence.mcfunction │ │ │ │ │ ├── check_item.mcfunction │ │ │ │ │ ├── check_orb.mcfunction │ │ │ │ │ ├── check_shard.mcfunction │ │ │ │ │ ├── check_soul_essence.mcfunction │ │ │ │ │ └── initiate_recipe_amounts.mcfunction │ │ │ │ ├── used_flint_and_steel.mcfunction │ │ │ │ └── wither_roses/ │ │ │ │ ├── consume.mcfunction │ │ │ │ ├── move_indicator.mcfunction │ │ │ │ ├── particle.mcfunction │ │ │ │ ├── steps.mcfunction │ │ │ │ └── summon_indicator.mcfunction │ │ │ ├── tick.mcfunction │ │ │ └── update_tags/ │ │ │ ├── check_offhand.mcfunction │ │ │ ├── check_pneuma.mcfunction │ │ │ ├── player_id.mcfunction │ │ │ └── remove_tags.mcfunction │ │ ├── guidebook/ │ │ │ └── orb_of_ankou.json │ │ ├── loot_table/ │ │ │ └── items/ │ │ │ ├── orb_of_ankou.json │ │ │ └── soul_shard/ │ │ │ ├── aggressive.json │ │ │ ├── agile.json │ │ │ ├── anchoring.json │ │ │ ├── bargaining.json │ │ │ ├── bashing.json │ │ │ ├── blasting.json │ │ │ ├── blinding.json │ │ │ ├── bounding.json │ │ │ ├── bubbly.json │ │ │ ├── conjuring.json │ │ │ ├── dashing.json │ │ │ ├── debilitate.json │ │ │ ├── depriving.json │ │ │ ├── draining.json │ │ │ ├── enduring.json │ │ │ ├── expeditious.json │ │ │ ├── feathery.json │ │ │ ├── feigning.json │ │ │ ├── freezing.json │ │ │ ├── gazing.json │ │ │ ├── gliding.json │ │ │ ├── hawkeye.json │ │ │ ├── incombustible.json │ │ │ ├── lifeless.json │ │ │ ├── neutralizing.json │ │ │ ├── phasing.json │ │ │ ├── pricking.json │ │ │ ├── retreating.json │ │ │ ├── rushing.json │ │ │ ├── scaling.json │ │ │ ├── shrieking.json │ │ │ ├── sniffing.json │ │ │ ├── soaring.json │ │ │ ├── striding.json │ │ │ ├── synergetic.json │ │ │ ├── tranquilizing.json │ │ │ ├── vanishing.json │ │ │ ├── venomous.json │ │ │ ├── volatile.json │ │ │ └── withering.json │ │ ├── predicate/ │ │ │ ├── has_multiblock.json │ │ │ ├── has_pneuma.json │ │ │ ├── in_water.json │ │ │ ├── matching_id.json │ │ │ ├── on_ground.json │ │ │ └── sniff_chance.json │ │ ├── recipe/ │ │ │ └── orb_of_ankou.json │ │ └── tags/ │ │ ├── entity_type/ │ │ │ ├── feigning_affected.json │ │ │ ├── hostile.json │ │ │ └── neutral.json │ │ ├── function/ │ │ │ └── pneumas/ │ │ │ └── expeditious/ │ │ │ └── tp_player.json │ │ └── item/ │ │ └── pneuma_container.json │ ├── generate_pneumas.py │ ├── mod.mcdoc │ ├── pneuma_model_template.py │ └── soul_essence.csv ├── gm4_particles_pack/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_better_armour_stands/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── apply_book.json │ │ │ └── default.json │ │ └── gm4_particles_pack/ │ │ ├── function/ │ │ │ ├── apply_book.mcfunction │ │ │ ├── default.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── particle.mcfunction │ │ └── guidebook/ │ │ └── particles_pack.json │ └── translations.csv ├── gm4_percurro_shamir/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_metallurgy/ │ │ └── tags/ │ │ └── function/ │ │ ├── check_item_validity.json │ │ └── summon_band/ │ │ └── curies_bismium.json │ └── gm4_percurro_shamir/ │ ├── advancement/ │ │ └── use.json │ ├── function/ │ │ ├── check_item_validity.mcfunction │ │ ├── check_teleport_destination/ │ │ │ ├── y_0.mcfunction │ │ │ ├── y_1.mcfunction │ │ │ ├── y_2.mcfunction │ │ │ ├── y_3.mcfunction │ │ │ ├── y_4.mcfunction │ │ │ ├── y_n1.mcfunction │ │ │ ├── y_n2.mcfunction │ │ │ └── y_n3.mcfunction │ │ ├── init.mcfunction │ │ ├── search_destination.mcfunction │ │ ├── summon_band.mcfunction │ │ └── teleport.mcfunction │ ├── guidebook/ │ │ └── percurro_shamir.json │ ├── loot_table/ │ │ └── band.json │ ├── tags/ │ │ ├── block/ │ │ │ └── valid_destination.json │ │ └── item/ │ │ └── valid_items.json │ └── test/ │ └── attack_player.mcfunction ├── gm4_phantom_scarecrows/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── phantom_scarecrows.json │ └── gm4_phantom_scarecrows/ │ ├── function/ │ │ ├── aim.mcfunction │ │ ├── create.mcfunction │ │ ├── explode.mcfunction │ │ ├── init.mcfunction │ │ ├── main.mcfunction │ │ ├── propulsion.mcfunction │ │ ├── shoot.mcfunction │ │ └── tick.mcfunction │ ├── guidebook/ │ │ └── phantom_scarecrows.json │ ├── tags/ │ │ └── item/ │ │ └── skulls.json │ └── test/ │ └── kill_phantom.mcfunction ├── gm4_pig_tractors/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── pig_tractors.json │ └── gm4_pig_tractors/ │ ├── advancement/ │ │ └── block_detection/ │ │ ├── air.json │ │ ├── beetroots.json │ │ ├── carrots.json │ │ ├── empty_farmland.json │ │ ├── potatoes.json │ │ └── wheat.json │ ├── function/ │ │ ├── harvest/ │ │ │ ├── beetroots.mcfunction │ │ │ ├── block/ │ │ │ │ ├── beetroots.mcfunction │ │ │ │ ├── carrots.mcfunction │ │ │ │ ├── potatoes.mcfunction │ │ │ │ └── wheat.mcfunction │ │ │ ├── carrots.mcfunction │ │ │ ├── empty_farmland.mcfunction │ │ │ ├── potatoes.mcfunction │ │ │ └── wheat.mcfunction │ │ ├── init.mcfunction │ │ ├── plant/ │ │ │ ├── block/ │ │ │ │ ├── beetroots.mcfunction │ │ │ │ ├── carrots.mcfunction │ │ │ │ ├── potatoes.mcfunction │ │ │ │ └── wheat.mcfunction │ │ │ ├── item/ │ │ │ │ ├── beetroot_seeds.mcfunction │ │ │ │ ├── carrot.mcfunction │ │ │ │ ├── potato.mcfunction │ │ │ │ └── wheat_seeds.mcfunction │ │ │ ├── select_type.mcfunction │ │ │ ├── use_mainhand_seeds.mcfunction │ │ │ ├── use_offhand_seeds.mcfunction │ │ │ └── use_predefined_order.mcfunction │ │ ├── till/ │ │ │ ├── block/ │ │ │ │ ├── coarse_dirt.mcfunction │ │ │ │ ├── dirt.mcfunction │ │ │ │ └── grass_block.mcfunction │ │ │ ├── select_position.mcfunction │ │ │ └── select_type.mcfunction │ │ └── utility/ │ │ └── item_magnet.mcfunction │ ├── guidebook/ │ │ └── pig_tractors.json │ ├── loot_table/ │ │ └── till/ │ │ ├── coarse_dirt.json │ │ ├── dirt.json │ │ └── grass_block.json │ ├── predicate/ │ │ └── player/ │ │ ├── equipment/ │ │ │ ├── holding_seeds.json │ │ │ ├── mainhand/ │ │ │ │ ├── beetroot_seeds.json │ │ │ │ ├── carrot.json │ │ │ │ ├── potato.json │ │ │ │ ├── seeds.json │ │ │ │ └── wheat_seeds.json │ │ │ └── offhand/ │ │ │ ├── beetroot_seeds.json │ │ │ ├── carrot.json │ │ │ ├── potato.json │ │ │ ├── seeds.json │ │ │ └── wheat_seeds.json │ │ └── vehicle/ │ │ └── pig/ │ │ ├── in_air.json │ │ └── in_farmland.json │ ├── tags/ │ │ ├── block/ │ │ │ ├── replaceable.json │ │ │ └── tillable.json │ │ └── item/ │ │ ├── hoes.json │ │ └── seeds.json │ └── test/ │ ├── harvest_carrots.mcfunction │ ├── plant_carrots.mcfunction │ └── till_soil.mcfunction ├── gm4_podzol_rooting_soil/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_podzol_rooting_soil/ │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── place_block.mcfunction │ │ │ ├── plant.mcfunction │ │ │ └── process_item.mcfunction │ │ ├── guidebook/ │ │ │ └── podzol_rooting_soil.json │ │ ├── predicate/ │ │ │ └── plantable_on_ground.json │ │ └── tags/ │ │ ├── block/ │ │ │ └── sapling_replaceable.json │ │ ├── function/ │ │ │ └── plant_custom_sapling.json │ │ └── item/ │ │ └── plantable.json │ └── translations.csv ├── gm4_potion_liquids/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── potion_liquids.json │ │ ├── gm4_brewing/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── insert/ │ │ │ ├── lingering.json │ │ │ └── splash.json │ │ ├── gm4_liquid_tanks/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── util_above.json │ │ └── gm4_potion_liquids/ │ │ ├── function/ │ │ │ ├── brewing_stand/ │ │ │ │ ├── lingering.mcfunction │ │ │ │ └── splash.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── util/ │ │ │ │ ├── random_witch_init.mcfunction │ │ │ │ ├── shulker.mcfunction │ │ │ │ └── witch.mcfunction │ │ │ └── util_above.mcfunction │ │ ├── guidebook/ │ │ │ └── potion_liquids.json │ │ ├── loot_table/ │ │ │ ├── floating_potion.json │ │ │ ├── lingering_floating_potion.json │ │ │ ├── splash_floating_potion.json │ │ │ └── technical/ │ │ │ └── brewing_stand/ │ │ │ ├── lingering.json │ │ │ └── splash.json │ │ └── modules/ │ │ └── main.bolt │ ├── effect_colors.json │ ├── potion_definitions.csv │ └── translations.csv ├── gm4_reeling_rods/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_hooked_entity/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── on_hooked_entity.json │ │ │ └── pre_hook_on_player.json │ │ ├── gm4_reeling_rods/ │ │ │ ├── enchantment/ │ │ │ │ ├── barbed.json │ │ │ │ └── reeling.json │ │ │ ├── function/ │ │ │ │ ├── barbed/ │ │ │ │ │ ├── apply.mcfunction │ │ │ │ │ ├── bleed.mcfunction │ │ │ │ │ ├── clear.mcfunction │ │ │ │ │ ├── find_affected.mcfunction │ │ │ │ │ ├── find_attacker.mcfunction │ │ │ │ │ ├── on_bleeding_death.mcfunction │ │ │ │ │ ├── on_scratch_death.mcfunction │ │ │ │ │ └── schedule_bleeding.mcfunction │ │ │ │ ├── get_execution_pos.mcfunction │ │ │ │ ├── get_lookup.mcfunction │ │ │ │ ├── get_motion_to_player.mcfunction │ │ │ │ ├── get_player_data.mcfunction │ │ │ │ ├── hooked_entity/ │ │ │ │ │ ├── end_crystal.mcfunction │ │ │ │ │ ├── is_passenger.mcfunction │ │ │ │ │ ├── item_frame.mcfunction │ │ │ │ │ ├── leash_knot/ │ │ │ │ │ │ ├── action.mcfunction │ │ │ │ │ │ ├── change_leader.mcfunction │ │ │ │ │ │ └── leaded_by_knot.mcfunction │ │ │ │ │ ├── painting.mcfunction │ │ │ │ │ ├── select_type.mcfunction │ │ │ │ │ └── shulker.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── pull_items.mcfunction │ │ │ │ ├── reeling/ │ │ │ │ │ ├── bee.mcfunction │ │ │ │ │ ├── chest_boat/ │ │ │ │ │ │ ├── action.mcfunction │ │ │ │ │ │ └── passenger_transfer.mcfunction │ │ │ │ │ ├── chested_horse.mcfunction │ │ │ │ │ ├── empty_container_entity.mcfunction │ │ │ │ │ ├── enderman/ │ │ │ │ │ │ ├── action.mcfunction │ │ │ │ │ │ └── falling_block.mcfunction │ │ │ │ │ ├── llama.mcfunction │ │ │ │ │ ├── minecart.mcfunction │ │ │ │ │ ├── mooshroom.mcfunction │ │ │ │ │ ├── sheep.mcfunction │ │ │ │ │ ├── snow_golem.mcfunction │ │ │ │ │ ├── stealable/ │ │ │ │ │ │ ├── break_slot/ │ │ │ │ │ │ │ └── mainhand.mcfunction │ │ │ │ │ │ ├── check_drop_chance.mcfunction │ │ │ │ │ │ ├── order/ │ │ │ │ │ │ │ ├── equipment_1.mcfunction │ │ │ │ │ │ │ ├── equipment_2.mcfunction │ │ │ │ │ │ │ ├── equipment_3.mcfunction │ │ │ │ │ │ │ ├── equipment_4.mcfunction │ │ │ │ │ │ │ ├── equipment_5.mcfunction │ │ │ │ │ │ │ └── equipment_6.mcfunction │ │ │ │ │ │ ├── steal_body_and_saddle.mcfunction │ │ │ │ │ │ ├── steal_equipment.mcfunction │ │ │ │ │ │ ├── steal_hand.mcfunction │ │ │ │ │ │ ├── steal_slot/ │ │ │ │ │ │ │ ├── body.mcfunction │ │ │ │ │ │ │ ├── chest.mcfunction │ │ │ │ │ │ │ ├── chested_horse.mcfunction │ │ │ │ │ │ │ ├── feet.mcfunction │ │ │ │ │ │ │ ├── head.mcfunction │ │ │ │ │ │ │ ├── legs.mcfunction │ │ │ │ │ │ │ ├── mainhand.mcfunction │ │ │ │ │ │ │ ├── offhand.mcfunction │ │ │ │ │ │ │ └── saddle.mcfunction │ │ │ │ │ │ └── zero_chance.mcfunction │ │ │ │ │ ├── summon_entity.mcfunction │ │ │ │ │ └── villager/ │ │ │ │ │ ├── action.mcfunction │ │ │ │ │ ├── add_gossip.mcfunction │ │ │ │ │ └── sell_out.mcfunction │ │ │ │ └── summon_item.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── reeling_rods.json │ │ │ ├── predicate/ │ │ │ │ ├── holding_barbed_rod/ │ │ │ │ │ ├── level_1.json │ │ │ │ │ ├── level_2.json │ │ │ │ │ ├── level_3.json │ │ │ │ │ ├── level_4.json │ │ │ │ │ └── level_5.json │ │ │ │ └── holding_reeling_rod.json │ │ │ └── tags/ │ │ │ └── entity_type/ │ │ │ ├── chested_horse.json │ │ │ ├── ignore.json │ │ │ ├── leashable.json │ │ │ ├── llamas.json │ │ │ ├── steal_body.json │ │ │ ├── steal_body_and_saddle.json │ │ │ ├── steal_equipment.json │ │ │ ├── steal_hand.json │ │ │ ├── steal_saddle.json │ │ │ └── support_death_message.json │ │ └── minecraft/ │ │ └── tags/ │ │ └── enchantment/ │ │ └── non_treasure.json │ ├── entities.csv │ ├── generate_files.py │ ├── mod.mcdoc │ └── translations.csv ├── gm4_rope_ladders/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── rope_ladders.json │ │ └── gm4_rope_ladders/ │ │ ├── advancement/ │ │ │ ├── id_init.json │ │ │ └── right_click_detection.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── mechanics/ │ │ │ │ ├── break_floating_ladders/ │ │ │ │ │ ├── break_ladder.mcfunction │ │ │ │ │ └── scan_column/ │ │ │ │ │ ├── init.mcfunction │ │ │ │ │ └── loop.mcfunction │ │ │ │ ├── ladder_placement/ │ │ │ │ │ ├── find_ladder.mcfunction │ │ │ │ │ ├── interact_right_click_detection.mcfunction │ │ │ │ │ ├── place_ladder.mcfunction │ │ │ │ │ ├── place_water_ladder.mcfunction │ │ │ │ │ ├── scan_column.mcfunction │ │ │ │ │ └── successful_place.mcfunction │ │ │ │ └── right_click_detection/ │ │ │ │ ├── detect_ladder_raycast/ │ │ │ │ │ ├── found.mcfunction │ │ │ │ │ └── ray.mcfunction │ │ │ │ ├── display_particles.mcfunction │ │ │ │ └── rcd_manager/ │ │ │ │ ├── create_rcd.mcfunction │ │ │ │ ├── loop.mcfunction │ │ │ │ └── process.mcfunction │ │ │ ├── player/ │ │ │ │ ├── as.mcfunction │ │ │ │ ├── broke_ladder.mcfunction │ │ │ │ ├── holding_ladder.mcfunction │ │ │ │ └── set_id.mcfunction │ │ │ └── tick.mcfunction │ │ ├── guidebook/ │ │ │ └── rope_ladders.json │ │ ├── predicate/ │ │ │ ├── holding_ladder.json │ │ │ └── is_ladder_item.json │ │ └── tags/ │ │ └── block/ │ │ └── ladder_scan.json │ └── translations.csv ├── gm4_scuba_gear/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_scuba_gear/ │ │ │ ├── equipment/ │ │ │ │ └── scuba.json │ │ │ ├── items/ │ │ │ │ ├── flippers.json │ │ │ │ ├── scuba_helmet.json │ │ │ │ ├── scuba_tank.json │ │ │ │ └── wetsuit.json │ │ │ ├── models/ │ │ │ │ └── item/ │ │ │ │ ├── flippers.json │ │ │ │ ├── scuba_helmet.json │ │ │ │ ├── scuba_tank.json │ │ │ │ └── wetsuit.json │ │ │ └── optifine/ │ │ │ └── cit/ │ │ │ ├── flippers.properties │ │ │ └── scuba_tank.properties │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── scuba_gear.json │ ├── gm4_scuba_gear/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ ├── flippers.json │ │ │ ├── scuba_helmet.json │ │ │ ├── scuba_tank.json │ │ │ └── wetsuit.json │ │ ├── enchantment/ │ │ │ ├── flippers.json │ │ │ └── wetsuit.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ └── wetsuit_buoyancy/ │ │ │ ├── clear.mcfunction │ │ │ ├── negative.mcfunction │ │ │ ├── neutral.mcfunction │ │ │ └── positive.mcfunction │ │ ├── guidebook/ │ │ │ └── scuba_gear.json │ │ ├── item_modifier/ │ │ │ └── wetsuit_buoyancy/ │ │ │ ├── clear.json │ │ │ ├── negative.json │ │ │ ├── neutral.json │ │ │ └── positive.json │ │ ├── loot_table/ │ │ │ └── items/ │ │ │ ├── flippers.json │ │ │ ├── scuba_helmet.json │ │ │ ├── scuba_tank.json │ │ │ └── wetsuit.json │ │ ├── predicate/ │ │ │ ├── all_gear_equipped.json │ │ │ ├── flippers_equipped.json │ │ │ ├── in_deep_water.json │ │ │ └── in_water.json │ │ └── recipe/ │ │ ├── flippers.json │ │ ├── scuba_helmet.json │ │ ├── scuba_tank.json │ │ └── wetsuit.json │ └── minecraft/ │ └── tags/ │ └── enchantment/ │ └── curse.json ├── gm4_shapeless_portals/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_shapeless_portals/ │ │ ├── advancement/ │ │ │ └── light_portal.json │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── portal_found.mcfunction │ │ │ ├── portal_lit.mcfunction │ │ │ ├── raycast.mcfunction │ │ │ ├── x/ │ │ │ │ ├── build.mcfunction │ │ │ │ ├── check_location.mcfunction │ │ │ │ └── flood_fill.mcfunction │ │ │ └── z/ │ │ │ ├── build.mcfunction │ │ │ ├── check_location.mcfunction │ │ │ └── flood_fill.mcfunction │ │ ├── guidebook/ │ │ │ └── shapeless_portals.json │ │ ├── predicate/ │ │ │ ├── portal_validity_x.json │ │ │ └── portal_validity_z.json │ │ ├── tags/ │ │ │ └── block/ │ │ │ └── portal_block.json │ │ └── test/ │ │ └── create_1x2_portal.mcfunction │ └── translations.csv ├── gm4_shroomites/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── shroomites.json │ │ └── gm4_shroomites/ │ │ ├── function/ │ │ │ ├── fast_clock.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── mooshroom/ │ │ │ │ ├── analyze_color.mcfunction │ │ │ │ ├── convert/ │ │ │ │ │ ├── brown.mcfunction │ │ │ │ │ └── red.mcfunction │ │ │ │ ├── initialize/ │ │ │ │ │ ├── brown.mcfunction │ │ │ │ │ └── red.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── shed_shroom.mcfunction │ │ │ ├── shroom/ │ │ │ │ ├── check_structure.mcfunction │ │ │ │ ├── create.mcfunction │ │ │ │ ├── place/ │ │ │ │ │ ├── brown.mcfunction │ │ │ │ │ └── red.mcfunction │ │ │ │ └── process.mcfunction │ │ │ ├── slow_clock.mcfunction │ │ │ └── spore/ │ │ │ ├── die.mcfunction │ │ │ ├── fertilize.mcfunction │ │ │ ├── initialize.mcfunction │ │ │ ├── move/ │ │ │ │ ├── horizontal.mcfunction │ │ │ │ ├── postmovement.mcfunction │ │ │ │ ├── step_up.mcfunction │ │ │ │ └── vertical.mcfunction │ │ │ ├── process.mcfunction │ │ │ ├── spawn.mcfunction │ │ │ └── track_age.mcfunction │ │ ├── guidebook/ │ │ │ └── shroomites.json │ │ ├── predicate/ │ │ │ ├── mooshroom/ │ │ │ │ └── shroom_spawn_chance.json │ │ │ ├── shroom/ │ │ │ │ └── spore_spawn_chance.json │ │ │ └── spore/ │ │ │ ├── descent_chance.json │ │ │ └── move_chance.json │ │ └── tags/ │ │ └── block/ │ │ ├── mushrooms.json │ │ ├── shroom_replacable.json │ │ ├── spore_convertable.json │ │ └── spore_opaque.json │ └── translations.csv ├── gm4_smelteries/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_smelteries/ │ │ │ └── models/ │ │ │ └── block/ │ │ │ └── ore_display.json │ │ ├── model_data.yaml │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── smelteries.json │ │ ├── gm4_machines/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── destroy.json │ │ │ └── place_down.json │ │ └── gm4_smelteries/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ └── smeltery.json │ │ ├── function/ │ │ │ ├── furnace_lit.mcfunction │ │ │ ├── furnace_unlit.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── machine/ │ │ │ │ ├── create.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── place_rotated.mcfunction │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ └── verify_place_down.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── process.mcfunction │ │ │ ├── smelt/ │ │ │ │ ├── check_cook_time.mcfunction │ │ │ │ ├── check_finish_smelt.mcfunction │ │ │ │ ├── finish_smelt.mcfunction │ │ │ │ ├── increase_output.mcfunction │ │ │ │ ├── modify_output.mcfunction │ │ │ │ ├── prep_finish_smelt.mcfunction │ │ │ │ └── smelting.mcfunction │ │ │ └── upgrade_paths/ │ │ │ ├── 1.9/ │ │ │ │ ├── cauldron_item_display.mcfunction │ │ │ │ └── smeltery_item_display.mcfunction │ │ │ └── 1.9.mcfunction │ │ ├── guidebook/ │ │ │ └── smelteries.json │ │ ├── loot_table/ │ │ │ └── items/ │ │ │ └── smeltery.json │ │ ├── predicate/ │ │ │ └── lava_cauldron_chance.json │ │ ├── recipe/ │ │ │ └── smeltery.json │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ └── valid_cauldron.json │ │ │ └── item/ │ │ │ └── can_double.json │ │ └── test/ │ │ └── construct_and_use.mcfunction │ └── ore_display.py ├── gm4_soul_glass/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── soul_glass.json │ ├── gm4_machines/ │ │ └── tags/ │ │ └── function/ │ │ └── destroy.json │ └── gm4_soul_glass/ │ ├── advancement/ │ │ ├── place_soul_glass.json │ │ └── recipes/ │ │ └── soul_glass.json │ ├── function/ │ │ ├── beacon_clock.mcfunction │ │ ├── effect/ │ │ │ ├── check.mcfunction │ │ │ ├── level_1.mcfunction │ │ │ ├── level_2.mcfunction │ │ │ ├── level_3.mcfunction │ │ │ ├── level_4.mcfunction │ │ │ ├── level_4_strong.mcfunction │ │ │ ├── obtain_numeric_primary_id.mcfunction │ │ │ ├── obtain_numeric_secondary_id.mcfunction │ │ │ ├── revert_effects.mcfunction │ │ │ └── update_effects.mcfunction │ │ ├── init.mcfunction │ │ ├── init_soul_glass_marker.mcfunction │ │ ├── machine/ │ │ │ ├── destroy.mcfunction │ │ │ └── verify_destroy.mcfunction │ │ ├── main.mcfunction │ │ ├── place_soul_glass.mcfunction │ │ ├── process.mcfunction │ │ └── ray.mcfunction │ ├── guidebook/ │ │ └── soul_glass.json │ ├── loot_table/ │ │ └── items/ │ │ └── soul_glass.json │ ├── predicate/ │ │ └── has_beam.json │ ├── recipe/ │ │ └── soul_glass.json │ ├── tags/ │ │ └── block/ │ │ ├── beacon_passable.json │ │ └── piston.json │ └── test/ │ └── smelt_soul_glass.mcfunction ├── gm4_spawner_minecarts/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── spawner_minecarts.json │ └── gm4_spawner_minecarts/ │ ├── function/ │ │ ├── capture_spawner.mcfunction │ │ ├── init.mcfunction │ │ ├── main.mcfunction │ │ └── process.mcfunction │ ├── guidebook/ │ │ └── spawner_minecarts.json │ ├── tags/ │ │ └── block/ │ │ └── piston.json │ └── test/ │ └── capture_spawner.mcfunction ├── gm4_speed_paths/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_speed_paths/ │ │ ├── function/ │ │ │ ├── apply_effects/ │ │ │ │ ├── add_speed.mcfunction │ │ │ │ ├── check_path.mcfunction │ │ │ │ └── remove_speed.mcfunction │ │ │ ├── init.mcfunction │ │ │ └── main.mcfunction │ │ └── guidebook/ │ │ └── speed_paths.json │ └── translations.csv ├── gm4_standard_crafting/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_standard_crafting/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ ├── amethyst_shard.json │ │ │ ├── bamboo_block_chest.json │ │ │ ├── bone_block.json │ │ │ ├── brown_dye.json │ │ │ ├── cherry_leaves.json │ │ │ ├── cobweb.json │ │ │ ├── copper_chain.json │ │ │ ├── diamond_horse_armor.json │ │ │ ├── dispenser.json │ │ │ ├── enchanted_golden_apple.json │ │ │ ├── golden_horse_armor.json │ │ │ ├── gravel.json │ │ │ ├── green_dye.json │ │ │ ├── honeycomb.json │ │ │ ├── iron_chain.json │ │ │ ├── iron_horse_armor.json │ │ │ ├── log_chest.json │ │ │ ├── pink_petals.json │ │ │ ├── pointed_dripstone.json │ │ │ ├── quartz.json │ │ │ ├── red_sand_conversion.json │ │ │ ├── red_sand_from_sandstone.json │ │ │ ├── sand.json │ │ │ └── string.json │ │ ├── function/ │ │ │ └── init.mcfunction │ │ ├── guidebook/ │ │ │ └── standard_crafting.json │ │ └── recipe/ │ │ ├── amethyst_shard.json │ │ ├── bamboo_block_chest.json │ │ ├── bone_block.json │ │ ├── brown_dye.json │ │ ├── cherry_leaves.json │ │ ├── cobweb.json │ │ ├── copper_chain.json │ │ ├── diamond_horse_armor.json │ │ ├── dispenser.json │ │ ├── enchanted_golden_apple.json │ │ ├── golden_horse_armor.json │ │ ├── gravel.json │ │ ├── green_dye.json │ │ ├── honeycomb.json │ │ ├── iron_chain.json │ │ ├── iron_horse_armor.json │ │ ├── log_chest.json │ │ ├── pink_petals.json │ │ ├── pointed_dripstone.json │ │ ├── quartz.json │ │ ├── red_sand_conversion.json │ │ ├── red_sand_from_sandstone.json │ │ ├── sand.json │ │ └── string.json │ ├── generate_recipes.py │ └── translations.csv ├── gm4_sunken_treasure/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_sunken_treasure/ │ │ │ └── optifine/ │ │ │ └── cit/ │ │ │ └── waders.properties │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── sunken_treasure.json │ │ └── gm4_sunken_treasure/ │ │ ├── function/ │ │ │ ├── check_gravel.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── spawn_entity.mcfunction │ │ │ ├── tick.mcfunction │ │ │ ├── treasure_flint.mcfunction │ │ │ ├── treasure_gravel.mcfunction │ │ │ └── treasure_sand.mcfunction │ │ ├── guidebook/ │ │ │ └── sunken_treasure.json │ │ ├── loot_table/ │ │ │ ├── chests/ │ │ │ │ └── treasure_chest.json │ │ │ └── gameplay/ │ │ │ ├── gravel_treasure.json │ │ │ ├── sand_treasure.json │ │ │ └── treasure_loot/ │ │ │ ├── audrey_bottle.json │ │ │ ├── gravel.json │ │ │ └── sand.json │ │ └── predicate/ │ │ ├── in_deep_water.json │ │ ├── in_lukewarm_ocean.json │ │ ├── in_ocean.json │ │ ├── in_river.json │ │ ├── in_warm_ocean.json │ │ ├── is_flint_item.json │ │ ├── is_gravel_item.json │ │ ├── is_sand_item.json │ │ └── is_spawn_entity_item.json │ └── mod.mcdoc ├── gm4_survival_refightalized/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── survival_refightalized_armor_damage.json │ │ │ ├── survival_refightalized_parry.json │ │ │ └── survival_refightalized_parry_lethal_damage.json │ │ ├── gm4_survival_refightalized/ │ │ │ ├── advancement/ │ │ │ │ ├── damaged.json │ │ │ │ ├── kill_mob.json │ │ │ │ ├── reach_tier/ │ │ │ │ │ ├── diamond_netherite.json │ │ │ │ │ └── iron_golden.json │ │ │ │ ├── using_custom_shield.json │ │ │ │ └── using_vanilla_shield.json │ │ │ ├── enchantment/ │ │ │ │ └── trident_damage_reduction.json │ │ │ ├── function/ │ │ │ │ ├── check_arrow.mcfunction │ │ │ │ ├── debug/ │ │ │ │ │ └── dont_run/ │ │ │ │ │ └── dev.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── mob/ │ │ │ │ │ ├── init/ │ │ │ │ │ │ ├── calc_difficulty_else.mcfunction │ │ │ │ │ │ ├── calc_difficulty_overworld.mcfunction │ │ │ │ │ │ ├── check_mob.mcfunction │ │ │ │ │ │ ├── get_world_surface.mcfunction │ │ │ │ │ │ ├── initiate.mcfunction │ │ │ │ │ │ ├── mob_type/ │ │ │ │ │ │ │ ├── cave_spider.mcfunction │ │ │ │ │ │ │ ├── creeper.mcfunction │ │ │ │ │ │ │ ├── enderman.mcfunction │ │ │ │ │ │ │ ├── phantom.mcfunction │ │ │ │ │ │ │ ├── piglin.mcfunction │ │ │ │ │ │ │ ├── piglin_brute.mcfunction │ │ │ │ │ │ │ ├── silverfish.mcfunction │ │ │ │ │ │ │ ├── skeleton.mcfunction │ │ │ │ │ │ │ ├── spider.mcfunction │ │ │ │ │ │ │ ├── wither_skeleton.mcfunction │ │ │ │ │ │ │ ├── zombie.mcfunction │ │ │ │ │ │ │ └── zombified_piglin.mcfunction │ │ │ │ │ │ ├── mob_type.mcfunction │ │ │ │ │ │ └── stat/ │ │ │ │ │ │ ├── check_damage_cap.mcfunction │ │ │ │ │ │ ├── check_damage_cap_schedule.mcfunction │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ ├── eval_damage_cap.mcfunction │ │ │ │ │ │ └── prep.mcfunction │ │ │ │ │ └── process/ │ │ │ │ │ └── arrow/ │ │ │ │ │ ├── clock_fire_delay.mcfunction │ │ │ │ │ └── run.mcfunction │ │ │ │ ├── player/ │ │ │ │ │ ├── absorption/ │ │ │ │ │ │ ├── eval_reduction.mcfunction │ │ │ │ │ │ └── restore_clock.mcfunction │ │ │ │ │ ├── armor/ │ │ │ │ │ │ ├── break.mcfunction │ │ │ │ │ │ ├── durability/ │ │ │ │ │ │ │ ├── check.mcfunction │ │ │ │ │ │ │ ├── chest/ │ │ │ │ │ │ │ │ ├── break.mcfunction │ │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ │ ├── find_durability.mcfunction │ │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ │ ├── feet/ │ │ │ │ │ │ │ │ ├── break.mcfunction │ │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ │ ├── find_durability.mcfunction │ │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ │ ├── head/ │ │ │ │ │ │ │ │ ├── break.mcfunction │ │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ │ ├── find_durability.mcfunction │ │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ │ └── legs/ │ │ │ │ │ │ │ ├── break.mcfunction │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ ├── find_durability.mcfunction │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ ├── eval_reduction.mcfunction │ │ │ │ │ │ ├── recharge.mcfunction │ │ │ │ │ │ └── timer.mcfunction │ │ │ │ │ ├── damage/ │ │ │ │ │ │ ├── calculate_breach_enchantment.mcfunction │ │ │ │ │ │ ├── calculate_damage.mcfunction │ │ │ │ │ │ ├── calculate_reduction.mcfunction │ │ │ │ │ │ ├── cave_spider_poison_reduction.mcfunction │ │ │ │ │ │ ├── reduction/ │ │ │ │ │ │ │ ├── armor_toughness.mcfunction │ │ │ │ │ │ │ └── enchantments/ │ │ │ │ │ │ │ ├── blast_protection.mcfunction │ │ │ │ │ │ │ ├── feather_falling.mcfunction │ │ │ │ │ │ │ ├── fire_protection.mcfunction │ │ │ │ │ │ │ ├── projectile_protection.mcfunction │ │ │ │ │ │ │ └── run.mcfunction │ │ │ │ │ │ ├── run.mcfunction │ │ │ │ │ │ ├── shield/ │ │ │ │ │ │ │ ├── blocked_damage.mcfunction │ │ │ │ │ │ │ ├── disable.mcfunction │ │ │ │ │ │ │ ├── parry.mcfunction │ │ │ │ │ │ │ ├── parry_effect.mcfunction │ │ │ │ │ │ │ ├── remove_using.mcfunction │ │ │ │ │ │ │ ├── update_vanilla_shield.mcfunction │ │ │ │ │ │ │ └── using.mcfunction │ │ │ │ │ │ └── witch_poison_reduction.mcfunction │ │ │ │ │ ├── death.mcfunction │ │ │ │ │ ├── health/ │ │ │ │ │ │ ├── calculate_hp.mcfunction │ │ │ │ │ │ ├── heal/ │ │ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ │ │ ├── context.mcfunction │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ └── revert.mcfunction │ │ │ │ │ │ ├── reduce/ │ │ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ │ │ ├── context.mcfunction │ │ │ │ │ │ │ ├── death.mcfunction │ │ │ │ │ │ │ ├── death_protection.mcfunction │ │ │ │ │ │ │ ├── eval.mcfunction │ │ │ │ │ │ │ └── revert.mcfunction │ │ │ │ │ │ └── regeneration/ │ │ │ │ │ │ ├── combat_health.mcfunction │ │ │ │ │ │ └── timer.mcfunction │ │ │ │ │ ├── killed_mob.mcfunction │ │ │ │ │ ├── reach_tier/ │ │ │ │ │ │ ├── diamond_netherite.mcfunction │ │ │ │ │ │ └── iron_golden.mcfunction │ │ │ │ │ └── resistance/ │ │ │ │ │ ├── reapply_loop.mcfunction │ │ │ │ │ └── remove.mcfunction │ │ │ │ ├── player_submain.mcfunction │ │ │ │ ├── slow_clock.mcfunction │ │ │ │ └── tick.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── survival_refightalized.json │ │ │ ├── loot_table/ │ │ │ │ ├── mob/ │ │ │ │ │ ├── generic/ │ │ │ │ │ │ ├── chest.json │ │ │ │ │ │ ├── feet.json │ │ │ │ │ │ ├── head.json │ │ │ │ │ │ └── legs.json │ │ │ │ │ ├── piglin/ │ │ │ │ │ │ ├── chest.json │ │ │ │ │ │ ├── feet.json │ │ │ │ │ │ ├── head.json │ │ │ │ │ │ └── legs.json │ │ │ │ │ ├── skeleton/ │ │ │ │ │ │ └── weapon.json │ │ │ │ │ └── wither_skeleton/ │ │ │ │ │ ├── arrow.json │ │ │ │ │ ├── chest.json │ │ │ │ │ ├── feet.json │ │ │ │ │ ├── head.json │ │ │ │ │ ├── legs.json │ │ │ │ │ └── weapon.json │ │ │ │ ├── randomize_stats/ │ │ │ │ │ ├── damage.json │ │ │ │ │ ├── health.json │ │ │ │ │ └── speed.json │ │ │ │ └── technical/ │ │ │ │ └── roll_damage.json │ │ │ ├── predicate/ │ │ │ │ ├── mob/ │ │ │ │ │ ├── has_weapon.json │ │ │ │ │ ├── material_check/ │ │ │ │ │ │ ├── chainmail.json │ │ │ │ │ │ ├── copper.json │ │ │ │ │ │ ├── diamond.json │ │ │ │ │ │ ├── golden.json │ │ │ │ │ │ ├── iron.json │ │ │ │ │ │ └── turtle_helmet.json │ │ │ │ │ └── underground.json │ │ │ │ └── technical/ │ │ │ │ ├── holding_vanilla_shield.json │ │ │ │ ├── in_witch_hut.json │ │ │ │ ├── night_time.json │ │ │ │ ├── raining.json │ │ │ │ └── thundering.json │ │ │ └── tags/ │ │ │ ├── damage_type/ │ │ │ │ ├── armor_piercing.json │ │ │ │ ├── combat.json │ │ │ │ └── ignore.json │ │ │ ├── entity_type/ │ │ │ │ ├── arrow.json │ │ │ │ ├── can_fire_arrows.json │ │ │ │ ├── modify.json │ │ │ │ ├── modify_in_air.json │ │ │ │ ├── skeleton_types.json │ │ │ │ └── zombie_types.json │ │ │ ├── function/ │ │ │ │ ├── armor_break.json │ │ │ │ ├── armor_recharge_timer.json │ │ │ │ ├── damage_taken.json │ │ │ │ ├── equip/ │ │ │ │ │ ├── piglin.json │ │ │ │ │ ├── skeleton.json │ │ │ │ │ ├── wither_skeleton.json │ │ │ │ │ └── zombie.json │ │ │ │ ├── health_regeneration.json │ │ │ │ ├── health_regeneration_timer.json │ │ │ │ ├── init_difficulty.json │ │ │ │ ├── init_mob.json │ │ │ │ └── player_fired_arrow.json │ │ │ └── item/ │ │ │ ├── armor.json │ │ │ └── weapon.json │ │ └── minecraft/ │ │ ├── enchantment/ │ │ │ ├── blast_protection.json │ │ │ ├── fire_protection.json │ │ │ ├── projectile_protection.json │ │ │ └── protection.json │ │ └── tags/ │ │ └── damage_type/ │ │ ├── bypasses_armor.json │ │ └── bypasses_shield.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_sweethearts/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── sweethearts.json │ └── gm4_sweethearts/ │ ├── function/ │ │ ├── delayed_revert.mcfunction │ │ ├── get_health.mcfunction │ │ ├── init.mcfunction │ │ ├── kill_donor.mcfunction │ │ ├── main.mcfunction │ │ ├── revert_health.mcfunction │ │ ├── transfer_donor.mcfunction │ │ ├── transfer_recipient.mcfunction │ │ └── transferring.mcfunction │ ├── guidebook/ │ │ └── sweethearts.json │ └── predicate/ │ └── valid_donor.json ├── gm4_teleportation_anchors/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_teleportation_anchors/ │ │ │ ├── models/ │ │ │ │ └── block/ │ │ │ │ └── teleportation_jammer.json │ │ │ └── textures/ │ │ │ └── block/ │ │ │ ├── eye_side1.png.mcmeta │ │ │ ├── eye_side2.png.mcmeta │ │ │ ├── eye_side3.png.mcmeta │ │ │ └── eye_side4.png.mcmeta │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── teleportation_anchors_anchor.json │ │ │ └── teleportation_anchors_jammer.json │ │ ├── gm4_machines/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── destroy.json │ │ │ └── place_down.json │ │ ├── gm4_orb_of_ankou/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── pneumas/ │ │ │ └── expeditious/ │ │ │ └── tp_player.json │ │ ├── gm4_teleportation_anchors/ │ │ │ ├── advancement/ │ │ │ │ ├── consume_chorus.json │ │ │ │ ├── enter_end_gateway.json │ │ │ │ ├── join.json │ │ │ │ └── recipes/ │ │ │ │ ├── teleportation_anchor.json │ │ │ │ └── teleportation_jammer.json │ │ │ ├── function/ │ │ │ │ ├── blocks/ │ │ │ │ │ ├── anchor/ │ │ │ │ │ │ ├── link.mcfunction │ │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ │ ├── rotate.mcfunction │ │ │ │ │ │ ├── scan.mcfunction │ │ │ │ │ │ └── search.mcfunction │ │ │ │ │ └── jammer/ │ │ │ │ │ ├── active.mcfunction │ │ │ │ │ ├── check_fuel.mcfunction │ │ │ │ │ ├── load_fuel.mcfunction │ │ │ │ │ └── process.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── machine/ │ │ │ │ │ ├── create_anchor.mcfunction │ │ │ │ │ ├── create_jammer.mcfunction │ │ │ │ │ ├── destroy_anchor.mcfunction │ │ │ │ │ ├── destroy_jammer.mcfunction │ │ │ │ │ ├── verify_destroy.mcfunction │ │ │ │ │ └── verify_place_down.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ ├── mob/ │ │ │ │ │ ├── anchor_tp.mcfunction │ │ │ │ │ ├── check_movement_type.mcfunction │ │ │ │ │ ├── check_pos.mcfunction │ │ │ │ │ ├── enter_end_gateway.mcfunction │ │ │ │ │ ├── jam_mob.mcfunction │ │ │ │ │ ├── move_mob.mcfunction │ │ │ │ │ ├── track_movement/ │ │ │ │ │ │ ├── check_d.mcfunction │ │ │ │ │ │ ├── check_dx.mcfunction │ │ │ │ │ │ ├── check_dy.mcfunction │ │ │ │ │ │ ├── check_dz.mcfunction │ │ │ │ │ │ ├── check_enderman_falling.mcfunction │ │ │ │ │ │ ├── initialize_pos.mcfunction │ │ │ │ │ │ └── update_pos.mcfunction │ │ │ │ │ └── visuals_jam.mcfunction │ │ │ │ ├── player/ │ │ │ │ │ ├── enter_end_gateway.mcfunction │ │ │ │ │ ├── jam_player.mcfunction │ │ │ │ │ ├── move_player.mcfunction │ │ │ │ │ ├── resolve_used_chorus.mcfunction │ │ │ │ │ ├── set_id.mcfunction │ │ │ │ │ ├── store_position.mcfunction │ │ │ │ │ ├── temp_tick.mcfunction │ │ │ │ │ ├── track_movement.mcfunction │ │ │ │ │ ├── used_chorus.mcfunction │ │ │ │ │ ├── visuals_anchor.mcfunction │ │ │ │ │ └── visuals_jam.mcfunction │ │ │ │ ├── tick.mcfunction │ │ │ │ └── upgrade_paths/ │ │ │ │ ├── 1.7/ │ │ │ │ │ ├── create_item_display_anchor.mcfunction │ │ │ │ │ └── create_item_display_jammer.mcfunction │ │ │ │ └── 1.7.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── teleportation_anchors.json │ │ │ ├── loot_table/ │ │ │ │ └── items/ │ │ │ │ ├── teleportation_anchor.json │ │ │ │ └── teleportation_jammer.json │ │ │ ├── predicate/ │ │ │ │ ├── has_pyramid_1.json │ │ │ │ ├── has_pyramid_2.json │ │ │ │ ├── has_pyramid_3.json │ │ │ │ ├── has_pyramid_4.json │ │ │ │ ├── has_speed_1.json │ │ │ │ ├── has_speed_2.json │ │ │ │ └── in_vehicle.json │ │ │ ├── recipe/ │ │ │ │ ├── teleportation_anchor.json │ │ │ │ └── teleportation_jammer.json │ │ │ └── tags/ │ │ │ ├── block/ │ │ │ │ └── jammer_base_blocks.json │ │ │ └── entity_type/ │ │ │ ├── affected.json │ │ │ └── teleporters.json │ │ └── gm4_zauber_cauldrons/ │ │ └── tags/ │ │ └── function/ │ │ └── player/ │ │ └── wormhole_targeting/ │ │ └── prepare_teleport.json │ └── mod.mcdoc ├── gm4_tower_structures/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_tower_structures/ │ │ ├── function/ │ │ │ └── init.mcfunction │ │ ├── guidebook/ │ │ │ └── tower_structures.json │ │ ├── loot_table/ │ │ │ ├── chests/ │ │ │ │ └── ship.json │ │ │ ├── entities/ │ │ │ │ ├── bow_pirate.json │ │ │ │ ├── sword_pirate.json │ │ │ │ ├── turtle_bow_pirate.json │ │ │ │ └── turtle_sword_pirate.json │ │ │ └── items/ │ │ │ ├── pirate_bow.json │ │ │ ├── pirate_hat.json │ │ │ ├── pirate_sword.json │ │ │ └── pirate_turtle_helmet.json │ │ ├── structure/ │ │ │ ├── segmented/ │ │ │ │ ├── cold/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── frozen/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── warm/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ ├── middle/ │ │ │ │ │ │ ├── frozen/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── warm/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ └── top/ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ └── 2.nbt │ │ │ │ ├── frozen/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── cold/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── frozen/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ ├── middle/ │ │ │ │ │ │ ├── cold/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── frozen/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ └── top/ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ └── 2.nbt │ │ │ │ ├── hot/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── hot/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── warm/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ ├── middle/ │ │ │ │ │ │ ├── hot/ │ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ │ └── warm/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ └── top/ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ └── 2.nbt │ │ │ │ └── warm/ │ │ │ │ ├── base/ │ │ │ │ │ ├── cold/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ └── hot/ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ └── 2.nbt │ │ │ │ ├── middle/ │ │ │ │ │ ├── cold/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ └── 2.nbt │ │ │ │ │ └── hot/ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ └── 2.nbt │ │ │ │ └── top/ │ │ │ │ ├── 1.nbt │ │ │ │ └── 2.nbt │ │ │ ├── spawner/ │ │ │ │ └── ship/ │ │ │ │ ├── drowned_down.nbt │ │ │ │ ├── drowned_side.nbt │ │ │ │ ├── drowned_up.nbt │ │ │ │ ├── skeleton_bow_down.nbt │ │ │ │ ├── skeleton_bow_side.nbt │ │ │ │ ├── skeleton_bow_up.nbt │ │ │ │ ├── skeleton_sword_down.nbt │ │ │ │ ├── skeleton_sword_side.nbt │ │ │ │ └── skeleton_sword_up.nbt │ │ │ └── tower/ │ │ │ ├── acacia.nbt │ │ │ ├── badlands/ │ │ │ │ ├── acacia.nbt │ │ │ │ ├── basic.nbt │ │ │ │ ├── sandy.nbt │ │ │ │ └── tall.nbt │ │ │ ├── default/ │ │ │ │ ├── basic.nbt │ │ │ │ ├── cobblestone1.nbt │ │ │ │ ├── cobblestone2.nbt │ │ │ │ ├── diorite.nbt │ │ │ │ ├── granite.nbt │ │ │ │ ├── small.nbt │ │ │ │ ├── small2.nbt │ │ │ │ ├── spruce.nbt │ │ │ │ └── tall.nbt │ │ │ ├── desert/ │ │ │ │ ├── basic.nbt │ │ │ │ ├── sandstone.nbt │ │ │ │ └── tall.nbt │ │ │ ├── diorite_dark.nbt │ │ │ ├── ocean/ │ │ │ │ ├── large_ship/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ ├── features/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ ├── 2.nbt │ │ │ │ │ │ ├── 3.nbt │ │ │ │ │ │ └── 4.nbt │ │ │ │ │ └── sail/ │ │ │ │ │ ├── black.nbt │ │ │ │ │ ├── blue.nbt │ │ │ │ │ ├── brown.nbt │ │ │ │ │ ├── cyan.nbt │ │ │ │ │ ├── green.nbt │ │ │ │ │ ├── grey.nbt │ │ │ │ │ ├── light_blue.nbt │ │ │ │ │ ├── light_grey.nbt │ │ │ │ │ ├── lime.nbt │ │ │ │ │ ├── magenta.nbt │ │ │ │ │ ├── orange.nbt │ │ │ │ │ ├── pink.nbt │ │ │ │ │ ├── purple.nbt │ │ │ │ │ ├── red.nbt │ │ │ │ │ ├── white.nbt │ │ │ │ │ └── yellow.nbt │ │ │ │ ├── medium_ship/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ ├── features/ │ │ │ │ │ │ ├── 1.nbt │ │ │ │ │ │ ├── 2.nbt │ │ │ │ │ │ ├── 3.nbt │ │ │ │ │ │ └── 4.nbt │ │ │ │ │ └── sail/ │ │ │ │ │ ├── black.nbt │ │ │ │ │ ├── blue.nbt │ │ │ │ │ ├── brown.nbt │ │ │ │ │ ├── cyan.nbt │ │ │ │ │ ├── green.nbt │ │ │ │ │ ├── grey.nbt │ │ │ │ │ ├── light_blue.nbt │ │ │ │ │ ├── light_grey.nbt │ │ │ │ │ ├── lime.nbt │ │ │ │ │ ├── magenta.nbt │ │ │ │ │ ├── orange.nbt │ │ │ │ │ ├── pink.nbt │ │ │ │ │ ├── purple.nbt │ │ │ │ │ ├── red.nbt │ │ │ │ │ ├── white.nbt │ │ │ │ │ └── yellow.nbt │ │ │ │ ├── raft/ │ │ │ │ │ ├── base.nbt │ │ │ │ │ └── sail/ │ │ │ │ │ ├── black.nbt │ │ │ │ │ ├── blue.nbt │ │ │ │ │ ├── brown.nbt │ │ │ │ │ ├── cyan.nbt │ │ │ │ │ ├── green.nbt │ │ │ │ │ ├── grey.nbt │ │ │ │ │ ├── light_blue.nbt │ │ │ │ │ ├── light_grey.nbt │ │ │ │ │ ├── lime.nbt │ │ │ │ │ ├── magenta.nbt │ │ │ │ │ ├── oranage.nbt │ │ │ │ │ ├── pink.nbt │ │ │ │ │ ├── purple.nbt │ │ │ │ │ ├── red.nbt │ │ │ │ │ ├── white.nbt │ │ │ │ │ └── yellow.nbt │ │ │ │ └── small_ship/ │ │ │ │ ├── base.nbt │ │ │ │ └── sail/ │ │ │ │ ├── black.nbt │ │ │ │ ├── blue.nbt │ │ │ │ ├── brown.nbt │ │ │ │ ├── cyan.nbt │ │ │ │ ├── green.nbt │ │ │ │ ├── grey.nbt │ │ │ │ ├── ligh_grey.nbt │ │ │ │ ├── light_blue.nbt │ │ │ │ ├── light_grey.nbt │ │ │ │ ├── lime.nbt │ │ │ │ ├── magenta.nbt │ │ │ │ ├── orange.nbt │ │ │ │ ├── pink.nbt │ │ │ │ ├── purple.nbt │ │ │ │ ├── red.nbt │ │ │ │ ├── white.nbt │ │ │ │ └── yellow.nbt │ │ │ ├── snowy/ │ │ │ │ ├── basic.nbt │ │ │ │ └── boxy.nbt │ │ │ └── spruce_scaffold.nbt │ │ ├── tags/ │ │ │ └── worldgen/ │ │ │ └── biome/ │ │ │ ├── is_default_spawnable.json │ │ │ ├── is_desert.json │ │ │ ├── is_snowy.json │ │ │ └── segmented/ │ │ │ ├── is_cold_frozen.json │ │ │ ├── is_frozen.json │ │ │ ├── is_hot.json │ │ │ ├── is_hot_warm.json │ │ │ └── is_warm_cold.json │ │ └── worldgen/ │ │ ├── structure/ │ │ │ ├── badlands.json │ │ │ ├── default.json │ │ │ ├── desert.json │ │ │ ├── ocean/ │ │ │ │ ├── large_ship.json │ │ │ │ ├── medium_ship.json │ │ │ │ ├── raft.json │ │ │ │ └── small_ship.json │ │ │ ├── segmented/ │ │ │ │ ├── cold_frozen.json │ │ │ │ ├── frozen.json │ │ │ │ ├── hot.json │ │ │ │ ├── hot_warm.json │ │ │ │ └── warm_cold.json │ │ │ └── snowy.json │ │ ├── structure_set/ │ │ │ ├── ships.json │ │ │ └── towers.json │ │ └── template_pool/ │ │ ├── segment/ │ │ │ ├── cold_frozen/ │ │ │ │ ├── middle.json │ │ │ │ └── top.json │ │ │ ├── frozen/ │ │ │ │ ├── middle.json │ │ │ │ └── top.json │ │ │ ├── hot/ │ │ │ │ ├── middle.json │ │ │ │ └── top.json │ │ │ ├── hot_warm/ │ │ │ │ ├── middle.json │ │ │ │ └── top.json │ │ │ └── warm_cold/ │ │ │ ├── middle.json │ │ │ └── top.json │ │ ├── spawner/ │ │ │ └── ship.json │ │ ├── subpart/ │ │ │ ├── large_ship/ │ │ │ │ ├── features.json │ │ │ │ └── sail.json │ │ │ ├── medium_ship/ │ │ │ │ ├── features.json │ │ │ │ └── sail.json │ │ │ ├── raft_sail.json │ │ │ └── small_ship_sail.json │ │ └── tower/ │ │ ├── badlands.json │ │ ├── default.json │ │ ├── desert.json │ │ ├── ocean/ │ │ │ ├── large_ship.json │ │ │ ├── medium_ship.json │ │ │ ├── raft.json │ │ │ └── small_ship.json │ │ ├── segmented/ │ │ │ ├── cold_frozen.json │ │ │ ├── frozen.json │ │ │ ├── hot.json │ │ │ ├── hot_warm.json │ │ │ └── warm_cold.json │ │ └── snowy.json │ └── translations.csv ├── gm4_towering_trees/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_towering_trees/ │ │ │ ├── advancement/ │ │ │ │ └── place_sapling.json │ │ │ ├── function/ │ │ │ │ ├── check_for_mega_tree.mcfunction │ │ │ │ ├── clear_sapling.mcfunction │ │ │ │ ├── generate_mega_tree.mcfunction │ │ │ │ ├── generate_small_tree.mcfunction │ │ │ │ ├── generate_tree.mcfunction │ │ │ │ ├── generate_tree_type/ │ │ │ │ │ └── mangrove/ │ │ │ │ │ ├── extra.mcfunction │ │ │ │ │ └── roots/ │ │ │ │ │ ├── loop.mcfunction │ │ │ │ │ ├── loop_to_ground.mcfunction │ │ │ │ │ ├── schedule.mcfunction │ │ │ │ │ └── start.mcfunction │ │ │ │ ├── init.mcfunction │ │ │ │ ├── initialize_sapling.mcfunction │ │ │ │ ├── place_sapling.mcfunction │ │ │ │ ├── replace_sapling.mcfunction │ │ │ │ └── verify/ │ │ │ │ ├── generate_tree.mcfunction │ │ │ │ └── initialize_sapling.mcfunction │ │ │ ├── guidebook/ │ │ │ │ └── towering_trees.json │ │ │ ├── structure/ │ │ │ │ ├── acacia/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ └── e.nbt │ │ │ │ ├── birch/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ ├── e.nbt │ │ │ │ │ └── f.nbt │ │ │ │ ├── cherry/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── dark_oak/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ ├── e.nbt │ │ │ │ │ ├── f.nbt │ │ │ │ │ ├── g.nbt │ │ │ │ │ ├── h.nbt │ │ │ │ │ ├── i.nbt │ │ │ │ │ └── j.nbt │ │ │ │ ├── mangrove/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ └── d.nbt │ │ │ │ ├── oak/ │ │ │ │ │ ├── a.nbt │ │ │ │ │ ├── b.nbt │ │ │ │ │ ├── c.nbt │ │ │ │ │ ├── d.nbt │ │ │ │ │ └── e.nbt │ │ │ │ └── pale_oak/ │ │ │ │ ├── a.nbt │ │ │ │ ├── b.nbt │ │ │ │ ├── c.nbt │ │ │ │ ├── d.nbt │ │ │ │ ├── e.nbt │ │ │ │ ├── f.nbt │ │ │ │ ├── g.nbt │ │ │ │ ├── h.nbt │ │ │ │ ├── i.nbt │ │ │ │ └── j.nbt │ │ │ ├── tags/ │ │ │ │ ├── block/ │ │ │ │ │ ├── mangrove_root_replaceable.json │ │ │ │ │ ├── supported_sapling.json │ │ │ │ │ └── tree_placeable.json │ │ │ │ └── item/ │ │ │ │ └── supported_sapling.json │ │ │ └── worldgen/ │ │ │ └── configured_feature/ │ │ │ ├── leaf_litter.json │ │ │ └── pink_petals.json │ │ └── gm4_trees/ │ │ └── tags/ │ │ └── functions/ │ │ ├── generate_tree.json │ │ └── initialize_sapling.json │ ├── generate.py │ ├── templates/ │ │ ├── pick_variant.mcfunction │ │ └── place_tree.mcfunction │ └── tree_data.csv ├── gm4_tunnel_bores/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── tunnel_bores.json │ │ ├── gm4_machines/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── destroy_cart.json │ │ │ └── place_cart.json │ │ └── gm4_tunnel_bores/ │ │ ├── advancement/ │ │ │ └── recipes/ │ │ │ └── piston_minecart.json │ │ ├── function/ │ │ │ ├── bore/ │ │ │ │ ├── activator_rail/ │ │ │ │ │ └── force_mine.mcfunction │ │ │ │ ├── check_cart_environment.mcfunction │ │ │ │ ├── direction/ │ │ │ │ │ ├── clear_rotation.mcfunction │ │ │ │ │ ├── restore_previous_direction.mcfunction │ │ │ │ │ ├── store_push_east_west.mcfunction │ │ │ │ │ ├── store_push_north_south.mcfunction │ │ │ │ │ ├── update_direction.mcfunction │ │ │ │ │ ├── update_rotation.mcfunction │ │ │ │ │ ├── update_rotation_east.mcfunction │ │ │ │ │ ├── update_rotation_north.mcfunction │ │ │ │ │ ├── update_rotation_south.mcfunction │ │ │ │ │ └── update_rotation_west.mcfunction │ │ │ │ ├── item_consumption/ │ │ │ │ │ ├── fuel/ │ │ │ │ │ │ ├── check_fuel_level.mcfunction │ │ │ │ │ │ ├── found_charcoal.mcfunction │ │ │ │ │ │ ├── found_coal.mcfunction │ │ │ │ │ │ ├── found_supply_cart.mcfunction │ │ │ │ │ │ ├── load_charcoal.mcfunction │ │ │ │ │ │ ├── load_coal.mcfunction │ │ │ │ │ │ └── search_fuel.mcfunction │ │ │ │ │ └── rail/ │ │ │ │ │ ├── check_solidity.mcfunction │ │ │ │ │ ├── found_rail.mcfunction │ │ │ │ │ ├── found_supply_cart.mcfunction │ │ │ │ │ ├── handle_rail.mcfunction │ │ │ │ │ ├── load_rail.mcfunction │ │ │ │ │ └── place_rail.mcfunction │ │ │ │ ├── mine/ │ │ │ │ │ ├── auto_mine.mcfunction │ │ │ │ │ ├── break_block.mcfunction │ │ │ │ │ ├── cooldown/ │ │ │ │ │ │ ├── calculate_clock_timings.mcfunction │ │ │ │ │ │ └── clock_control.mcfunction │ │ │ │ │ └── stop_cart.mcfunction │ │ │ │ └── tunnel_bore_5hz.mcfunction │ │ │ ├── furnace_cart_20hz.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── machine/ │ │ │ │ ├── create_cart.mcfunction │ │ │ │ ├── destroy_cart/ │ │ │ │ │ ├── drop_item.mcfunction │ │ │ │ │ ├── scan_hoppers.mcfunction │ │ │ │ │ ├── update_hopper.mcfunction │ │ │ │ │ └── update_hopper_minecart.mcfunction │ │ │ │ ├── destroy_cart.mcfunction │ │ │ │ ├── verify_destroy_cart.mcfunction │ │ │ │ └── verify_place_cart.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── pulse_check.mcfunction │ │ ├── guidebook/ │ │ │ └── tunnel_bores.json │ │ ├── loot_table/ │ │ │ ├── entities/ │ │ │ │ └── piston_minecart.json │ │ │ └── items/ │ │ │ └── piston_minecart.json │ │ ├── recipe/ │ │ │ ├── piston_minecart.json │ │ │ └── piston_minecart_from_furnace_minecart.json │ │ └── tags/ │ │ └── block/ │ │ ├── liquids.json │ │ ├── not_rail_solid.json │ │ ├── rail_replacable.json │ │ └── unbreakable.json │ └── mod.mcdoc ├── gm4_undead_players/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── undead_players.json │ │ ├── gm4_player_death/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── grave.json │ │ └── gm4_undead_players/ │ │ ├── function/ │ │ │ ├── died.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── init_drowned.mcfunction │ │ │ ├── init_zombie.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── process_drowning.mcfunction │ │ │ ├── summon_drowned.mcfunction │ │ │ └── summon_zombie.mcfunction │ │ ├── guidebook/ │ │ │ └── undead_players.json │ │ ├── item_modifier/ │ │ │ └── zombie_name.json │ │ └── loot_table/ │ │ └── player_head.json │ ├── mod.mcdoc │ └── translations.csv ├── gm4_vecto_shamir/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_metallurgy/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── check_item_validity.json │ │ │ └── summon_band/ │ │ │ └── bismuth.json │ │ └── gm4_vecto_shamir/ │ │ ├── advancement/ │ │ │ ├── join.json │ │ │ └── vehicle_check.json │ │ ├── function/ │ │ │ ├── active.mcfunction │ │ │ ├── check_item_validity.mcfunction │ │ │ ├── get_id.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── summon_band.mcfunction │ │ │ └── vehicle/ │ │ │ ├── check.mcfunction │ │ │ ├── check_boat_collision.mcfunction │ │ │ ├── position_check.mcfunction │ │ │ ├── remove.mcfunction │ │ │ ├── spawn_boat.mcfunction │ │ │ ├── spawn_boat_east.mcfunction │ │ │ ├── spawn_boat_north.mcfunction │ │ │ ├── spawn_boat_south.mcfunction │ │ │ ├── spawn_boat_west.mcfunction │ │ │ └── spawn_minecart.mcfunction │ │ ├── guidebook/ │ │ │ └── vecto_shamir.json │ │ ├── loot_table/ │ │ │ └── band.json │ │ ├── predicate/ │ │ │ ├── in_vehicle.json │ │ │ ├── sneak_validblock.json │ │ │ ├── sneaking.json │ │ │ └── water.json │ │ └── tags/ │ │ ├── entity_type/ │ │ │ └── vehicle.json │ │ ├── item/ │ │ │ └── valid_items.json │ │ └── worldgen/ │ │ └── biome/ │ │ ├── acacia.json │ │ ├── bamboo.json │ │ ├── birch.json │ │ ├── cherry.json │ │ ├── dark_oak.json │ │ ├── jungle.json │ │ ├── mangrove.json │ │ ├── non_oak.json │ │ ├── pale_oak.json │ │ └── spruce.json │ └── translations.csv ├── gm4_vertical_rails/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4/ │ │ └── advancement/ │ │ └── vertical_rails.json │ └── gm4_vertical_rails/ │ ├── function/ │ │ ├── init.mcfunction │ │ ├── main.mcfunction │ │ ├── momentum.mcfunction │ │ └── tick.mcfunction │ ├── guidebook/ │ │ └── vertical_rails.json │ ├── structure/ │ │ └── test_track.nbt │ └── test/ │ └── go_up.mcfunction ├── gm4_vigere_shamir/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_metallurgy/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── check_item_validity.json │ │ │ └── summon_band/ │ │ │ └── barimium.json │ │ └── gm4_vigere_shamir/ │ │ ├── function/ │ │ │ ├── check_heal.mcfunction │ │ │ ├── check_item_validity.mcfunction │ │ │ ├── heal.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── revert_health.mcfunction │ │ │ └── summon_band.mcfunction │ │ ├── guidebook/ │ │ │ └── vigere_shamir.json │ │ ├── item_modifier/ │ │ │ ├── use_durability_mainhand.json │ │ │ └── use_durability_offhand.json │ │ ├── loot_table/ │ │ │ └── band.json │ │ ├── predicate/ │ │ │ ├── vigere_active.json │ │ │ └── vigere_in_mainhand.json │ │ └── tags/ │ │ └── item/ │ │ └── valid_items.json │ └── translations.csv ├── gm4_washing_tanks/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_liquid_tanks/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── item_fill.json │ │ └── gm4_washing_tanks/ │ │ ├── function/ │ │ │ ├── init.mcfunction │ │ │ ├── item_fill.mcfunction │ │ │ └── wash.mcfunction │ │ ├── guidebook/ │ │ │ └── washing_tanks.json │ │ └── tags/ │ │ └── item/ │ │ ├── armour.json │ │ ├── bed.json │ │ ├── bundle.json │ │ ├── candle.json │ │ ├── carpet.json │ │ ├── glass.json │ │ ├── glass_pane.json │ │ ├── harness.json │ │ ├── shulker_box.json │ │ ├── terracotta.json │ │ └── wool.json │ └── translations.csv ├── gm4_weighted_armour/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_helious_shamir/ │ │ ├── function/ │ │ │ ├── apply_weight_effects.mcfunction │ │ │ ├── check_item_validity.mcfunction │ │ │ ├── summon_band.mcfunction │ │ │ └── weight_modifier.mcfunction │ │ ├── guidebook/ │ │ │ └── helious_shamir.json │ │ ├── loot_table/ │ │ │ └── band.json │ │ ├── predicate/ │ │ │ ├── helious_chest.json │ │ │ ├── helious_feet.json │ │ │ ├── helious_head.json │ │ │ └── helious_legs.json │ │ └── tags/ │ │ └── item/ │ │ └── valid_items.json │ ├── gm4_metallurgy/ │ │ └── tags/ │ │ └── function/ │ │ ├── check_item_validity.json │ │ └── summon_band/ │ │ └── aluminium.json │ └── gm4_weighted_armour/ │ ├── function/ │ │ ├── init.mcfunction │ │ ├── main.mcfunction │ │ └── player.mcfunction │ ├── guidebook/ │ │ └── weighted_armour.json │ └── tags/ │ └── function/ │ ├── weight_effects.json │ └── weight_modifiers.json ├── gm4_zauber_cauldrons/ │ ├── README.md │ ├── assets/ │ │ ├── gm4_zauber_cauldrons/ │ │ │ ├── models/ │ │ │ │ └── block/ │ │ │ │ └── zauber_cauldron.json │ │ │ ├── optifine/ │ │ │ │ ├── anim/ │ │ │ │ │ ├── zauber_armor_layer_1.properties │ │ │ │ │ ├── zauber_armor_layer_2.properties │ │ │ │ │ ├── zauber_attack_layer_1.properties │ │ │ │ │ ├── zauber_attack_layer_2.properties │ │ │ │ │ ├── zauber_health_layer_1.properties │ │ │ │ │ ├── zauber_health_layer_2.properties │ │ │ │ │ ├── zauber_speed_layer_1.properties │ │ │ │ │ └── zauber_speed_layer_2.properties │ │ │ │ └── cit/ │ │ │ │ ├── zauber_boots_armor.properties │ │ │ │ ├── zauber_boots_attack.properties │ │ │ │ ├── zauber_boots_health.properties │ │ │ │ ├── zauber_boots_speed.properties │ │ │ │ ├── zauber_chestplate_armor.properties │ │ │ │ ├── zauber_chestplate_attack.properties │ │ │ │ ├── zauber_chestplate_health.properties │ │ │ │ ├── zauber_chestplate_speed.properties │ │ │ │ ├── zauber_helmet_armor.properties │ │ │ │ ├── zauber_helmet_attack.properties │ │ │ │ ├── zauber_helmet_health.properties │ │ │ │ ├── zauber_helmet_speed.properties │ │ │ │ ├── zauber_leggings_armor.properties │ │ │ │ ├── zauber_leggings_attack.properties │ │ │ │ ├── zauber_leggings_health.properties │ │ │ │ └── zauber_leggings_speed.properties │ │ │ └── textures/ │ │ │ └── item/ │ │ │ ├── crystal/ │ │ │ │ ├── crystal.png.mcmeta │ │ │ │ ├── instant_damage.png.mcmeta │ │ │ │ ├── instant_health.png.mcmeta │ │ │ │ ├── jump_boost.png.mcmeta │ │ │ │ ├── poison.png.mcmeta │ │ │ │ ├── regeneration.png.mcmeta │ │ │ │ ├── speed.png.mcmeta │ │ │ │ └── strength.png.mcmeta │ │ │ ├── enchanted_prismarine_shard.png.mcmeta │ │ │ ├── magic_in_a_bottle.png.mcmeta │ │ │ ├── wormhole_in_a_bottle.png.mcmeta │ │ │ ├── wormhole_in_a_bottle_overlay.png.mcmeta │ │ │ └── zauber_armor/ │ │ │ ├── armor_boost/ │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── helmet.png.mcmeta │ │ │ │ └── leggings.png.mcmeta │ │ │ ├── attack_boost/ │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── helmet.png.mcmeta │ │ │ │ └── leggings.png.mcmeta │ │ │ ├── health_boost/ │ │ │ │ ├── boots.png.mcmeta │ │ │ │ ├── chestplate.png.mcmeta │ │ │ │ ├── helmet.png.mcmeta │ │ │ │ └── leggings.png.mcmeta │ │ │ └── speed_boost/ │ │ │ ├── boots.png.mcmeta │ │ │ ├── chestplate.png.mcmeta │ │ │ ├── helmet.png.mcmeta │ │ │ └── leggings.png.mcmeta │ │ ├── model_data.yaml │ │ └── translations.csv │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ ├── zauber_cauldrons_create.json │ │ │ ├── zauber_cauldrons_drink_all_magicol.json │ │ │ ├── zauber_cauldrons_drink_multi_use_bottle.json │ │ │ ├── zauber_cauldrons_full_armor.json │ │ │ ├── zauber_cauldrons_make_magicol.json │ │ │ ├── zauber_cauldrons_paint_biome.json │ │ │ ├── zauber_cauldrons_rabbit.json │ │ │ └── zauber_cauldrons_wormhole.json │ │ ├── gm4_brewing/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── insert/ │ │ │ ├── lingering.json │ │ │ └── splash.json │ │ ├── gm4_potion_tracking/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ ├── potion_landed.json │ │ │ └── tag_potion.json │ │ └── gm4_zauber_cauldrons/ │ │ ├── advancement/ │ │ │ ├── cauldron/ │ │ │ │ ├── level_0.json │ │ │ │ ├── level_1.json │ │ │ │ ├── level_2.json │ │ │ │ └── level_3.json │ │ │ ├── equipment/ │ │ │ │ ├── has_full_armor.json │ │ │ │ └── unequipped_armor.json │ │ │ ├── join.json │ │ │ └── use/ │ │ │ ├── multi_use_bottle.json │ │ │ └── wormhole.json │ │ ├── function/ │ │ │ ├── bottled_magicol/ │ │ │ │ ├── age_painters.mcfunction │ │ │ │ ├── fillbiome.mcfunction │ │ │ │ ├── maintain_magicol_painters.mcfunction │ │ │ │ ├── potion_landed.mcfunction │ │ │ │ └── prepare_fillbiome.mcfunction │ │ │ ├── brewing_stand/ │ │ │ │ ├── lingering.mcfunction │ │ │ │ └── splash.mcfunction │ │ │ ├── cauldron/ │ │ │ │ ├── extra_items/ │ │ │ │ │ ├── catch_possessed_items.mcfunction │ │ │ │ │ ├── create_possessed_items.mcfunction │ │ │ │ │ ├── failed_catch_possessed_items.mcfunction │ │ │ │ │ ├── prepare_bottle.mcfunction │ │ │ │ │ ├── process_bottled_vex_items.mcfunction │ │ │ │ │ └── release_from_bottle/ │ │ │ │ │ ├── check_timer.mcfunction │ │ │ │ │ ├── crack_bottle.mcfunction │ │ │ │ │ ├── initialize_bottle.mcfunction │ │ │ │ │ └── release.mcfunction │ │ │ │ ├── liquid/ │ │ │ │ │ ├── magicol/ │ │ │ │ │ │ ├── check_liquid_id.mcfunction │ │ │ │ │ │ ├── check_moon_phase.mcfunction │ │ │ │ │ │ └── particles.mcfunction │ │ │ │ │ └── update/ │ │ │ │ │ ├── from_score.mcfunction │ │ │ │ │ ├── level_0/ │ │ │ │ │ │ ├── find_cauldron.mcfunction │ │ │ │ │ │ ├── item_used/ │ │ │ │ │ │ │ ├── bucket.mcfunction │ │ │ │ │ │ │ └── glass_bottle.mcfunction │ │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ │ ├── reconstruct_interaction.mcfunction │ │ │ │ │ │ └── set.mcfunction │ │ │ │ │ ├── level_1/ │ │ │ │ │ │ ├── find_cauldron.mcfunction │ │ │ │ │ │ ├── item_used/ │ │ │ │ │ │ │ ├── glass_bottle.mcfunction │ │ │ │ │ │ │ └── water_bottle.mcfunction │ │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ │ ├── reconstruct_interaction.mcfunction │ │ │ │ │ │ └── set.mcfunction │ │ │ │ │ ├── level_2/ │ │ │ │ │ │ ├── find_cauldron.mcfunction │ │ │ │ │ │ ├── item_used/ │ │ │ │ │ │ │ ├── glass_bottle.mcfunction │ │ │ │ │ │ │ └── water_bottle.mcfunction │ │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ │ ├── reconstruct_interaction.mcfunction │ │ │ │ │ │ └── set.mcfunction │ │ │ │ │ ├── level_3/ │ │ │ │ │ │ ├── analyze_held_items/ │ │ │ │ │ │ │ ├── creative.mcfunction │ │ │ │ │ │ │ ├── select_gamemode.mcfunction │ │ │ │ │ │ │ └── survival_or_adventure.mcfunction │ │ │ │ │ │ ├── find_cauldron.mcfunction │ │ │ │ │ │ ├── item_used/ │ │ │ │ │ │ │ ├── analyze_held_items.mcfunction │ │ │ │ │ │ │ ├── filled_bucket.mcfunction │ │ │ │ │ │ │ └── water_bottle.mcfunction │ │ │ │ │ │ ├── ray.mcfunction │ │ │ │ │ │ ├── reconstruct_interaction.mcfunction │ │ │ │ │ │ └── set.mcfunction │ │ │ │ │ ├── return_bucket.mcfunction │ │ │ │ │ ├── return_glass_bottle.mcfunction │ │ │ │ │ └── return_water_bottle.mcfunction │ │ │ │ ├── rabbit_teleportation.mcfunction │ │ │ │ ├── recipe_checks.mcfunction │ │ │ │ ├── setup/ │ │ │ │ │ ├── animation/ │ │ │ │ │ │ ├── controller.mcfunction │ │ │ │ │ │ └── step.mcfunction │ │ │ │ │ ├── create.mcfunction │ │ │ │ │ ├── initialize_marker.mcfunction │ │ │ │ │ └── validate_structure.mcfunction │ │ │ │ └── structure/ │ │ │ │ ├── analyze/ │ │ │ │ │ ├── heatsource.mcfunction │ │ │ │ │ └── liquid.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── modify/ │ │ │ │ │ ├── use_liquid.mcfunction │ │ │ │ │ ├── use_powder_snow.mcfunction │ │ │ │ │ └── use_water.mcfunction │ │ │ │ ├── register_items.mcfunction │ │ │ │ ├── use_extra_items.mcfunction │ │ │ │ ├── valid.mcfunction │ │ │ │ └── validate/ │ │ │ │ ├── heatsource.mcfunction │ │ │ │ └── liquid.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── player/ │ │ │ │ ├── armor/ │ │ │ │ │ ├── apply_set_bonus.mcfunction │ │ │ │ │ ├── revoke_set_bonus.mcfunction │ │ │ │ │ └── set_bonus/ │ │ │ │ │ ├── armor_boost.mcfunction │ │ │ │ │ ├── attack_boost.mcfunction │ │ │ │ │ ├── health_boost.mcfunction │ │ │ │ │ └── speed_boost.mcfunction │ │ │ │ ├── assign_id.mcfunction │ │ │ │ ├── check_gamemode.mcfunction │ │ │ │ ├── crystal/ │ │ │ │ │ ├── activate.mcfunction │ │ │ │ │ ├── deactivate.mcfunction │ │ │ │ │ ├── effect/ │ │ │ │ │ │ ├── instant_health.mcfunction │ │ │ │ │ │ ├── speed.mcfunction │ │ │ │ │ │ └── strength.mcfunction │ │ │ │ │ ├── process.mcfunction │ │ │ │ │ └── read_effect.mcfunction │ │ │ │ ├── multi_use_bottle/ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ ├── dump.mcfunction │ │ │ │ │ │ ├── load.mcfunction │ │ │ │ │ │ └── populate.mcfunction │ │ │ │ │ ├── check_gamemode.mcfunction │ │ │ │ │ ├── modify_bottle.mcfunction │ │ │ │ │ ├── read_data/ │ │ │ │ │ │ ├── mainhand.mcfunction │ │ │ │ │ │ └── offhand.mcfunction │ │ │ │ │ └── restore_context.mcfunction │ │ │ │ ├── submain.mcfunction │ │ │ │ └── wormhole_targeting/ │ │ │ │ ├── acquire_destination_context.mcfunction │ │ │ │ ├── prepare_teleport.mcfunction │ │ │ │ ├── remove_speechmarks.mcfunction │ │ │ │ ├── teleport_user.mcfunction │ │ │ │ └── translate_numeric_dimension_id.mcfunction │ │ │ ├── recipes/ │ │ │ │ ├── armor/ │ │ │ │ │ ├── init_piece.mcfunction │ │ │ │ │ ├── select_piece.mcfunction │ │ │ │ │ └── use_cauldron.mcfunction │ │ │ │ ├── chorus/ │ │ │ │ │ ├── blurry_wormhole.mcfunction │ │ │ │ │ ├── count_chorus.mcfunction │ │ │ │ │ ├── initiate_chorus_amounts.mcfunction │ │ │ │ │ └── precise_wormhole.mcfunction │ │ │ │ ├── crystals/ │ │ │ │ │ ├── select_effect.mcfunction │ │ │ │ │ └── use_cauldron.mcfunction │ │ │ │ ├── flowers/ │ │ │ │ │ ├── check_normal_flowers.mcfunction │ │ │ │ │ ├── check_poisonous_flowers.mcfunction │ │ │ │ │ ├── initiate_flower_types.mcfunction │ │ │ │ │ ├── luck.mcfunction │ │ │ │ │ └── poison.mcfunction │ │ │ │ ├── magicol/ │ │ │ │ │ ├── bottled/ │ │ │ │ │ │ ├── select_bottle.mcfunction │ │ │ │ │ │ ├── use_cauldron.mcfunction │ │ │ │ │ │ └── wrong_moon_phase.mcfunction │ │ │ │ │ ├── initiate_moon_phase_offset.mcfunction │ │ │ │ │ ├── select_color.mcfunction │ │ │ │ │ └── use_cauldron.mcfunction │ │ │ │ ├── potions/ │ │ │ │ │ ├── drinkable/ │ │ │ │ │ │ └── check_liquid.mcfunction │ │ │ │ │ ├── environmental_effects/ │ │ │ │ │ │ ├── instant_damage.mcfunction │ │ │ │ │ │ ├── instant_health.mcfunction │ │ │ │ │ │ ├── jump_boost.mcfunction │ │ │ │ │ │ ├── poison.mcfunction │ │ │ │ │ │ ├── regeneration.mcfunction │ │ │ │ │ │ ├── speed.mcfunction │ │ │ │ │ │ └── strength.mcfunction │ │ │ │ │ ├── invalid_recipe.mcfunction │ │ │ │ │ ├── lingering/ │ │ │ │ │ │ └── check_liquid.mcfunction │ │ │ │ │ ├── select_bottle.mcfunction │ │ │ │ │ ├── splash/ │ │ │ │ │ │ └── check_liquid.mcfunction │ │ │ │ │ └── use_cauldron.mcfunction │ │ │ │ └── precursors/ │ │ │ │ └── enchanted_prismarine_shard.mcfunction │ │ │ ├── soulution/ │ │ │ │ ├── potion_landed.mcfunction │ │ │ │ ├── spawn_copy.mcfunction │ │ │ │ └── use_sip.mcfunction │ │ │ ├── thrown_potion_tracking/ │ │ │ │ ├── tag_potion.mcfunction │ │ │ │ └── verify_potion_nbt.mcfunction │ │ │ └── upgrade_paths/ │ │ │ └── 1.10.mcfunction │ │ ├── guidebook/ │ │ │ └── zauber_cauldrons.json │ │ ├── item_modifier/ │ │ │ └── soulution/ │ │ │ └── update_sips.json │ │ ├── loot_table/ │ │ │ ├── items/ │ │ │ │ ├── bottled_vex.json │ │ │ │ ├── enchanted_prismarine_shard.json │ │ │ │ └── wormhole.json │ │ │ └── wandering_trader/ │ │ │ ├── enchanted_prismarine_shard.json │ │ │ ├── golden_apple.json │ │ │ └── prismarine_crystals.json │ │ ├── predicate/ │ │ │ ├── cauldron/ │ │ │ │ ├── cave_spider_chance.json │ │ │ │ ├── clear_night.json │ │ │ │ ├── cobweb_chance.json │ │ │ │ └── fire_chance.json │ │ │ ├── player/ │ │ │ │ ├── advancement/ │ │ │ │ │ └── use/ │ │ │ │ │ └── multi_use_bottle.json │ │ │ │ ├── equipment/ │ │ │ │ │ ├── armor/ │ │ │ │ │ │ └── full.json │ │ │ │ │ ├── bucket/ │ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ │ └── in_offhand.json │ │ │ │ │ ├── crystal/ │ │ │ │ │ │ └── luck_and_in_offhand.json │ │ │ │ │ ├── enchanted_book/ │ │ │ │ │ │ └── in_mainhand.json │ │ │ │ │ ├── glass_bottle/ │ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ │ └── in_offhand.json │ │ │ │ │ ├── multi_use_bottle/ │ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ │ └── in_offhand.json │ │ │ │ │ ├── water_bottle/ │ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ │ └── in_offhand.json │ │ │ │ │ ├── water_bucket/ │ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ │ └── in_offhand.json │ │ │ │ │ └── wormhole/ │ │ │ │ │ ├── in_mainhand.json │ │ │ │ │ └── in_offhand.json │ │ │ │ └── survival_or_adventure.json │ │ │ └── wandering_trader/ │ │ │ ├── enchanted_prismarine_shard_chance.json │ │ │ ├── golden_apple_chance.json │ │ │ └── prismarine_crystals_chance.json │ │ ├── tags/ │ │ │ ├── block/ │ │ │ │ └── soul_fire_heatsource.json │ │ │ ├── function/ │ │ │ │ ├── cauldron/ │ │ │ │ │ └── liquid/ │ │ │ │ │ ├── cauldron_particles.json │ │ │ │ │ ├── drain_bottle_into_cauldron.json │ │ │ │ │ ├── drain_bucket_into_cauldron.json │ │ │ │ │ ├── fill_bottle_from_cauldron.json │ │ │ │ │ └── fill_bucket_from_cauldron.json │ │ │ │ └── player/ │ │ │ │ └── wormhole_targeting/ │ │ │ │ └── prepare_teleport.json │ │ │ └── item/ │ │ │ └── golden_armor.json │ │ ├── templates/ │ │ │ ├── function/ │ │ │ │ ├── armor/ │ │ │ │ │ ├── craft_piece.mcfunction │ │ │ │ │ └── select_flavor.mcfunction │ │ │ │ ├── bottled_magicol/ │ │ │ │ │ ├── color_biome.mcfunction │ │ │ │ │ └── select_weather_modifier.mcfunction │ │ │ │ ├── crystals/ │ │ │ │ │ └── craft_crystal.mcfunction │ │ │ │ ├── magicol/ │ │ │ │ │ ├── craft_bottled_magicol.mcfunction │ │ │ │ │ ├── craft_liquid_magicol.mcfunction │ │ │ │ │ ├── select_color.mcfunction │ │ │ │ │ └── select_weather_modifier.mcfunction │ │ │ │ └── potions/ │ │ │ │ ├── craft_potion.mcfunction │ │ │ │ └── select_effect.mcfunction │ │ │ ├── item_modifier/ │ │ │ │ └── zauber_armor.json │ │ │ ├── loot_table/ │ │ │ │ ├── bottled_magicol.json │ │ │ │ ├── zauber_armor.json │ │ │ │ ├── zauber_crystal.json │ │ │ │ └── zauber_potion.json │ │ │ └── worldgen/ │ │ │ ├── biome/ │ │ │ │ └── verzauberte_plains.json │ │ │ ├── configured_feature/ │ │ │ │ └── flower_patch.json │ │ │ └── placed_feature/ │ │ │ └── flower_patch.json │ │ ├── test/ │ │ │ └── rabbit_teleportation.mcfunction │ │ └── worldgen/ │ │ ├── configured_feature/ │ │ │ └── short_grass_patch.json │ │ └── placed_feature/ │ │ └── short_grass_patch.json │ ├── generate.py │ └── raw/ │ ├── armor_flavors.csv │ ├── armor_pieces.csv │ ├── crystal_effects.csv │ ├── crystal_lores.json │ ├── flower_types.csv │ ├── magicol_colors.csv │ ├── potion_bottles.csv │ ├── potion_effects.csv │ ├── potion_lores.json │ └── weather_modifiers.csv ├── gm4_zauber_liquids/ │ ├── README.md │ ├── assets/ │ │ └── translations.csv │ ├── beet.yaml │ └── data/ │ ├── gm4_liquid_tanks/ │ │ └── tags/ │ │ └── function/ │ │ ├── item_drain.json │ │ ├── item_fill.json │ │ ├── relocate/ │ │ │ ├── restore_liquid.json │ │ │ └── set_data.json │ │ ├── remove_liquid_tags.json │ │ ├── tank_init.json │ │ └── util_below.json │ └── gm4_zauber_liquids/ │ ├── function/ │ │ ├── init.mcfunction │ │ ├── item_drain/ │ │ │ ├── zauber_potion.mcfunction │ │ │ └── zauber_wormhole_potion.mcfunction │ │ ├── item_drain.mcfunction │ │ ├── item_fill/ │ │ │ ├── zauber_harming_potion.mcfunction │ │ │ ├── zauber_healing_potion.mcfunction │ │ │ ├── zauber_leaping_potion.mcfunction │ │ │ ├── zauber_poison_potion.mcfunction │ │ │ ├── zauber_regeneration_potion.mcfunction │ │ │ ├── zauber_strength_potion.mcfunction │ │ │ ├── zauber_swiftness_potion.mcfunction │ │ │ └── zauber_wormhole_potion.mcfunction │ │ ├── item_fill.mcfunction │ │ ├── liquid_init/ │ │ │ ├── harming.mcfunction │ │ │ ├── healing.mcfunction │ │ │ ├── leaping.mcfunction │ │ │ ├── poison.mcfunction │ │ │ ├── regeneration.mcfunction │ │ │ ├── strength.mcfunction │ │ │ ├── swiftness.mcfunction │ │ │ └── wormhole.mcfunction │ │ ├── relocate/ │ │ │ ├── restore_wormhole_scores.mcfunction │ │ │ └── store_wormhole_scores.mcfunction │ │ ├── remove_liquid_tags.mcfunction │ │ ├── tank_init.mcfunction │ │ ├── util/ │ │ │ ├── harming.mcfunction │ │ │ ├── healing.mcfunction │ │ │ ├── leaping.mcfunction │ │ │ ├── poison.mcfunction │ │ │ ├── regeneration.mcfunction │ │ │ ├── strength.mcfunction │ │ │ ├── swiftness.mcfunction │ │ │ └── wormhole.mcfunction │ │ └── util_below.mcfunction │ └── guidebook/ │ └── zauber_liquids.json ├── gm4_ziprails/ │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4/ │ │ │ └── advancement/ │ │ │ └── ziprails.json │ │ └── gm4_ziprails/ │ │ ├── function/ │ │ │ ├── check_cable.mcfunction │ │ │ ├── init.mcfunction │ │ │ ├── main.mcfunction │ │ │ └── ziprail/ │ │ │ ├── clear_tags.mcfunction │ │ │ ├── link.mcfunction │ │ │ └── zipping.mcfunction │ │ ├── guidebook/ │ │ │ └── ziprails.json │ │ └── tags/ │ │ └── block/ │ │ └── cable.json │ └── translations.csv ├── lib_brewing/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_brewing/ │ │ ├── advancement/ │ │ │ └── place_brewing_stand.json │ │ ├── function/ │ │ │ ├── check_brew.mcfunction │ │ │ ├── finalize_potions/ │ │ │ │ ├── get_brewing_stand.mcfunction │ │ │ │ ├── lingering/ │ │ │ │ │ ├── check_items.mcfunction │ │ │ │ │ ├── slot_0.mcfunction │ │ │ │ │ ├── slot_1.mcfunction │ │ │ │ │ └── slot_2.mcfunction │ │ │ │ └── splash/ │ │ │ │ ├── check_items.mcfunction │ │ │ │ ├── slot_0.mcfunction │ │ │ │ ├── slot_1.mcfunction │ │ │ │ └── slot_2.mcfunction │ │ │ ├── finish_brew.mcfunction │ │ │ ├── load.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── mark_adjacent_brewing_stand.mcfunction │ │ │ ├── mark_brewing_stand.mcfunction │ │ │ ├── place_brewing_stand.mcfunction │ │ │ ├── prep_finish_brew.mcfunction │ │ │ └── process.mcfunction │ │ ├── predicate/ │ │ │ └── is_custom_potion.json │ │ └── tags/ │ │ └── function/ │ │ ├── finish_brew.json │ │ └── insert/ │ │ ├── lingering.json │ │ └── splash.json │ ├── example_use/ │ │ ├── data/ │ │ │ ├── gm4_brewing/ │ │ │ │ └── tags/ │ │ │ │ └── functions/ │ │ │ │ ├── finish_brew.json │ │ │ │ └── insert/ │ │ │ │ ├── lingering.json │ │ │ │ └── splash.json │ │ │ ├── gm4_example_pack/ │ │ │ │ ├── functions/ │ │ │ │ │ └── brewing_stand/ │ │ │ │ │ ├── finish_brew.mcfunction │ │ │ │ │ ├── lingering.mcfunction │ │ │ │ │ └── splash.mcfunction │ │ │ │ └── loot_tables/ │ │ │ │ ├── items/ │ │ │ │ │ ├── booze.json │ │ │ │ │ ├── lingering_booze.json │ │ │ │ │ ├── lingering_resistance_potion.json │ │ │ │ │ ├── resistance_potion.json │ │ │ │ │ ├── splash_booze.json │ │ │ │ │ ├── splash_resistance_potion.json │ │ │ │ │ ├── splash_vanishing_potion.json │ │ │ │ │ └── vanishing_potion.json │ │ │ │ └── technical/ │ │ │ │ └── brewing_stand/ │ │ │ │ ├── lingering.json │ │ │ │ └── splash.json │ │ │ └── load/ │ │ │ └── tags/ │ │ │ └── functions/ │ │ │ ├── gm4_example_pack.json │ │ │ └── load.json │ │ └── pack.mcmeta │ └── mod.mcdoc ├── lib_forceload/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ └── data/ │ ├── gm4_forceload/ │ │ ├── advancement/ │ │ │ ├── change_dimension.json │ │ │ └── join.json │ │ ├── function/ │ │ │ ├── init_chunk.mcfunction │ │ │ ├── init_ow_chunk.mcfunction │ │ │ ├── load.mcfunction │ │ │ ├── mark_dimension.mcfunction │ │ │ └── set_marker_data.mcfunction │ │ └── tags/ │ │ └── function/ │ │ └── command_block_tick.json │ └── minecraft/ │ └── loot_table/ │ └── blocks/ │ └── yellow_shulker_box.json ├── lib_hooked_entity/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_hooked_entity/ │ │ ├── function/ │ │ │ ├── id/ │ │ │ │ ├── clear.mcfunction │ │ │ │ ├── get_next.mcfunction │ │ │ │ ├── loop.mcfunction │ │ │ │ ├── select_entities.mcfunction │ │ │ │ └── set.mcfunction │ │ │ ├── load.mcfunction │ │ │ ├── player/ │ │ │ │ ├── cast_line.mcfunction │ │ │ │ ├── find_hooked_entity.mcfunction │ │ │ │ ├── owns_bobber.mcfunction │ │ │ │ └── received_bit.mcfunction │ │ │ └── tick.mcfunction │ │ └── tags/ │ │ ├── entity_type/ │ │ │ └── ignore.json │ │ └── function/ │ │ ├── on_hooked_entity.json │ │ ├── post_hook_on_player.json │ │ └── pre_hook_on_player.json │ └── generate.py ├── lib_lore/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_lore/ │ │ ├── function/ │ │ │ ├── algorithms/ │ │ │ │ ├── insert.mcfunction │ │ │ │ ├── remove.mcfunction │ │ │ │ ├── replace.mcfunction │ │ │ │ └── search.mcfunction │ │ │ ├── load.mcfunction │ │ │ ├── resolve_algorithm/ │ │ │ │ ├── insert.mcfunction │ │ │ │ ├── remove.mcfunction │ │ │ │ ├── replace.mcfunction │ │ │ │ └── search.mcfunction │ │ │ └── utilities/ │ │ │ ├── clean_up.mcfunction │ │ │ ├── find_line.mcfunction │ │ │ ├── insert/ │ │ │ │ └── insert_after.mcfunction │ │ │ ├── prepare.mcfunction │ │ │ ├── remove/ │ │ │ │ ├── extra_lines.mcfunction │ │ │ │ └── remove_rest.mcfunction │ │ │ ├── start_after.mcfunction │ │ │ └── start_before.mcfunction │ │ └── tags/ │ │ └── function/ │ │ ├── insert.json │ │ ├── remove.json │ │ ├── replace.json │ │ ├── resolve_algorithm/ │ │ │ ├── insert.json │ │ │ ├── remove.json │ │ │ ├── replace.json │ │ │ └── search.json │ │ └── search.json │ ├── example_use/ │ │ ├── data/ │ │ │ ├── gm4_example_pack/ │ │ │ │ ├── functions/ │ │ │ │ │ ├── insert_examples.mcfunction │ │ │ │ │ ├── remove_examples.mcfunction │ │ │ │ │ ├── replace_examples.mcfunction │ │ │ │ │ └── search_examples.mcfunction │ │ │ │ └── item_modifiers/ │ │ │ │ └── update_player.json │ │ │ └── load/ │ │ │ └── tags/ │ │ │ └── functions/ │ │ │ ├── gm4_example_pack.json │ │ │ └── load.json │ │ └── pack.mcmeta │ └── mod.mcdoc ├── lib_machines/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_forceload/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── command_block_tick.json │ │ └── gm4_machines/ │ │ ├── advancement/ │ │ │ ├── place_machine_block.json │ │ │ └── place_machine_cart.json │ │ ├── function/ │ │ │ ├── load.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── place_down/ │ │ │ │ ├── check_layer.mcfunction │ │ │ │ ├── count_heads/ │ │ │ │ │ ├── east.mcfunction │ │ │ │ │ ├── north.mcfunction │ │ │ │ │ ├── south.mcfunction │ │ │ │ │ └── west.mcfunction │ │ │ │ ├── place_machine_block.mcfunction │ │ │ │ ├── place_machine_cart.mcfunction │ │ │ │ └── prep_place.mcfunction │ │ │ ├── resolve_tick.mcfunction │ │ │ └── tick.mcfunction │ │ ├── predicate/ │ │ │ └── has_vehicle.json │ │ └── tags/ │ │ ├── block/ │ │ │ ├── empty_block.json │ │ │ └── player_heads.json │ │ ├── function/ │ │ │ ├── destroy.json │ │ │ ├── destroy_cart.json │ │ │ ├── place_cart.json │ │ │ └── place_down.json │ │ └── item/ │ │ └── minecarts.json │ └── mod.mcdoc ├── lib_player_death/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ └── data/ │ └── gm4_player_death/ │ ├── advancement/ │ │ └── death.json │ ├── function/ │ │ ├── death.mcfunction │ │ └── load.mcfunction │ └── tags/ │ └── function/ │ └── _private/ │ └── death.json ├── lib_player_motion/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ └── data/ │ └── gm4_player_motion/ │ ├── function/ │ │ ├── api/ │ │ │ ├── launch_looking.mcfunction │ │ │ └── launch_xyz.mcfunction │ │ ├── internal/ │ │ │ ├── launch/ │ │ │ │ ├── exp_pos.mcfunction │ │ │ │ ├── gamemode/ │ │ │ │ │ ├── get.mcfunction │ │ │ │ │ └── restore.mcfunction │ │ │ │ └── main.mcfunction │ │ │ ├── math/ │ │ │ │ ├── eyelevel.mcfunction │ │ │ │ ├── full_power/ │ │ │ │ │ ├── sine.mcfunction │ │ │ │ │ ├── tp.mcfunction │ │ │ │ │ └── trig.mcfunction │ │ │ │ ├── looking_to_xyz.mcfunction │ │ │ │ ├── main.mcfunction │ │ │ │ └── trig/ │ │ │ │ ├── arcsine.mcfunction │ │ │ │ └── sine.mcfunction │ │ │ ├── summon/ │ │ │ │ ├── crystal.mcfunction │ │ │ │ ├── loop.mcfunction │ │ │ │ └── main.mcfunction │ │ │ └── technical/ │ │ │ ├── tick.mcfunction │ │ │ └── trig.mcfunction │ │ ├── load.mcfunction │ │ └── resolve_load/ │ │ ├── launch_looking.mcfunction │ │ └── launch_xyz.mcfunction │ └── tags/ │ └── function/ │ ├── launch_looking.json │ └── launch_xyz.json ├── lib_potion_tracking/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ ├── gm4_forceload/ │ │ │ └── tags/ │ │ │ └── function/ │ │ │ └── command_block_tick.json │ │ └── gm4_potion_tracking/ │ │ ├── function/ │ │ │ ├── load.mcfunction │ │ │ ├── potion.mcfunction │ │ │ ├── resolve_tick.mcfunction │ │ │ ├── tick.mcfunction │ │ │ └── track/ │ │ │ ├── check_marker.mcfunction │ │ │ ├── check_potion.mcfunction │ │ │ ├── initialize_potion.mcfunction │ │ │ ├── marker.mcfunction │ │ │ ├── potion.mcfunction │ │ │ └── potion_landed.mcfunction │ │ └── tags/ │ │ ├── entity_type/ │ │ │ └── potion.json │ │ └── function/ │ │ ├── potion_landed.json │ │ └── tag_potion.json │ └── mod.mcdoc ├── lib_trees/ │ ├── LICENSE.md │ ├── README.md │ ├── beet.yaml │ ├── data/ │ │ └── gm4_trees/ │ │ ├── advancement/ │ │ │ └── place_sapling.json │ │ ├── function/ │ │ │ ├── load.mcfunction │ │ │ ├── main.mcfunction │ │ │ ├── sapling/ │ │ │ │ ├── advance_stage.mcfunction │ │ │ │ ├── destroy.mcfunction │ │ │ │ ├── find_adjacent_sapling.mcfunction │ │ │ │ ├── find_sapling.mcfunction │ │ │ │ ├── place_sapling.mcfunction │ │ │ │ ├── process.mcfunction │ │ │ │ └── summon_marker.mcfunction │ │ │ └── tick.mcfunction │ │ └── tags/ │ │ ├── block/ │ │ │ └── empty_block.json │ │ └── function/ │ │ ├── destroy_leaf.json │ │ ├── destroy_sapling.json │ │ ├── generate_tree.json │ │ ├── initialize_sapling.json │ │ ├── place_sapling.json │ │ └── upgrade_fruiting_to_general.json │ ├── example_use/ │ │ ├── data/ │ │ │ ├── gm4_trees/ │ │ │ │ └── tags/ │ │ │ │ └── functions/ │ │ │ │ ├── destroy_leaf.json │ │ │ │ ├── destroy_sapling.json │ │ │ │ ├── generate_tree.json │ │ │ │ └── initialize_sapling.json │ │ │ ├── gm4_trees_example/ │ │ │ │ ├── functions/ │ │ │ │ │ ├── destroy_leaf.mcfunction │ │ │ │ │ ├── destroy_sapling.mcfunction │ │ │ │ │ ├── generate_tree.mcfunction │ │ │ │ │ ├── initialize_sapling.mcfunction │ │ │ │ │ └── verify/ │ │ │ │ │ ├── destroy_leaf.mcfunction │ │ │ │ │ ├── destroy_sapling.mcfunction │ │ │ │ │ ├── generate_tree.mcfunction │ │ │ │ │ └── initialize_sapling.mcfunction │ │ │ │ ├── loot_tables/ │ │ │ │ │ ├── blocks/ │ │ │ │ │ │ └── apple_tree_leaf.json │ │ │ │ │ └── items/ │ │ │ │ │ └── apple_tree_sapling.json │ │ │ │ ├── structures/ │ │ │ │ │ ├── apple_leaf.nbt │ │ │ │ │ ├── apple_tree_1.nbt │ │ │ │ │ ├── apple_tree_2.nbt │ │ │ │ │ └── corner_leaf.nbt │ │ │ │ ├── tags/ │ │ │ │ │ └── worldgen/ │ │ │ │ │ └── biome/ │ │ │ │ │ └── has_structure/ │ │ │ │ │ └── apple_tree.json │ │ │ │ └── worldgen/ │ │ │ │ ├── structure/ │ │ │ │ │ └── apple_tree.json │ │ │ │ ├── structure_set/ │ │ │ │ │ └── apple_tree.json │ │ │ │ └── template_pool/ │ │ │ │ ├── apple_leaf.json │ │ │ │ ├── apple_trees.json │ │ │ │ └── corner_leaf.json │ │ │ └── load/ │ │ │ └── tags/ │ │ │ └── functions/ │ │ │ ├── gm4_trees_example.json │ │ │ └── load.json │ │ └── pack.mcmeta │ └── mod.mcdoc ├── library.yaml ├── module.yaml ├── pfb_biome_extensions/ │ ├── beet.yaml │ └── data/ │ └── minecraft/ │ ├── tags/ │ │ └── worldgen/ │ │ ├── configured_carver/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ └── placed_feature/ │ │ ├── fluid_springs/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── lakes/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── local_modifications/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── raw_generation/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── strongholds/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── surface_structures/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── top_layer_modification/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── underground_decoration/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── underground_ores/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ ├── underground_structures/ │ │ │ └── in_biome/ │ │ │ ├── badlands.json │ │ │ ├── bamboo_jungle.json │ │ │ ├── basalt_deltas.json │ │ │ ├── beach.json │ │ │ ├── birch_forest.json │ │ │ ├── cherry_grove.json │ │ │ ├── cold_ocean.json │ │ │ ├── crimson_forest.json │ │ │ ├── dark_forest.json │ │ │ ├── deep_cold_ocean.json │ │ │ ├── deep_dark.json │ │ │ ├── deep_frozen_ocean.json │ │ │ ├── deep_lukewarm_ocean.json │ │ │ ├── deep_ocean.json │ │ │ ├── desert.json │ │ │ ├── dripstone_caves.json │ │ │ ├── end_barrens.json │ │ │ ├── end_highlands.json │ │ │ ├── end_midlands.json │ │ │ ├── eroded_badlands.json │ │ │ ├── flower_forest.json │ │ │ ├── forest.json │ │ │ ├── frozen_ocean.json │ │ │ ├── frozen_peaks.json │ │ │ ├── frozen_river.json │ │ │ ├── grove.json │ │ │ ├── ice_spikes.json │ │ │ ├── jagged_peaks.json │ │ │ ├── jungle.json │ │ │ ├── lukewarm_ocean.json │ │ │ ├── lush_caves.json │ │ │ ├── mangrove_swamp.json │ │ │ ├── meadow.json │ │ │ ├── mushroom_fields.json │ │ │ ├── nether_wastes.json │ │ │ ├── ocean.json │ │ │ ├── old_growth_birch_forest.json │ │ │ ├── old_growth_pine_taiga.json │ │ │ ├── old_growth_spruce_taiga.json │ │ │ ├── pale_garden.json │ │ │ ├── plains.json │ │ │ ├── river.json │ │ │ ├── savanna.json │ │ │ ├── savanna_plateau.json │ │ │ ├── small_end_islands.json │ │ │ ├── snowy_beach.json │ │ │ ├── snowy_plains.json │ │ │ ├── snowy_slopes.json │ │ │ ├── snowy_taiga.json │ │ │ ├── soul_sand_valley.json │ │ │ ├── sparse_jungle.json │ │ │ ├── stony_peaks.json │ │ │ ├── stony_shore.json │ │ │ ├── sunflower_plains.json │ │ │ ├── swamp.json │ │ │ ├── taiga.json │ │ │ ├── the_end.json │ │ │ ├── the_void.json │ │ │ ├── warm_ocean.json │ │ │ ├── warped_forest.json │ │ │ ├── windswept_forest.json │ │ │ ├── windswept_gravelly_hills.json │ │ │ ├── windswept_hills.json │ │ │ ├── windswept_savanna.json │ │ │ └── wooded_badlands.json │ │ └── vegetal_decoration/ │ │ └── in_biome/ │ │ ├── badlands.json │ │ ├── bamboo_jungle.json │ │ ├── basalt_deltas.json │ │ ├── beach.json │ │ ├── birch_forest.json │ │ ├── cherry_grove.json │ │ ├── cold_ocean.json │ │ ├── crimson_forest.json │ │ ├── dark_forest.json │ │ ├── deep_cold_ocean.json │ │ ├── deep_dark.json │ │ ├── deep_frozen_ocean.json │ │ ├── deep_lukewarm_ocean.json │ │ ├── deep_ocean.json │ │ ├── desert.json │ │ ├── dripstone_caves.json │ │ ├── end_barrens.json │ │ ├── end_highlands.json │ │ ├── end_midlands.json │ │ ├── eroded_badlands.json │ │ ├── flower_forest.json │ │ ├── forest.json │ │ ├── frozen_ocean.json │ │ ├── frozen_peaks.json │ │ ├── frozen_river.json │ │ ├── grove.json │ │ ├── ice_spikes.json │ │ ├── jagged_peaks.json │ │ ├── jungle.json │ │ ├── lukewarm_ocean.json │ │ ├── lush_caves.json │ │ ├── mangrove_swamp.json │ │ ├── meadow.json │ │ ├── mushroom_fields.json │ │ ├── nether_wastes.json │ │ ├── ocean.json │ │ ├── old_growth_birch_forest.json │ │ ├── old_growth_pine_taiga.json │ │ ├── old_growth_spruce_taiga.json │ │ ├── pale_garden.json │ │ ├── plains.json │ │ ├── river.json │ │ ├── savanna.json │ │ ├── savanna_plateau.json │ │ ├── small_end_islands.json │ │ ├── snowy_beach.json │ │ ├── snowy_plains.json │ │ ├── snowy_slopes.json │ │ ├── snowy_taiga.json │ │ ├── soul_sand_valley.json │ │ ├── sparse_jungle.json │ │ ├── stony_peaks.json │ │ ├── stony_shore.json │ │ ├── sunflower_plains.json │ │ ├── swamp.json │ │ ├── taiga.json │ │ ├── the_end.json │ │ ├── the_void.json │ │ ├── warm_ocean.json │ │ ├── warped_forest.json │ │ ├── windswept_forest.json │ │ ├── windswept_gravelly_hills.json │ │ ├── windswept_hills.json │ │ ├── windswept_savanna.json │ │ └── wooded_badlands.json │ └── worldgen/ │ └── biome/ │ ├── badlands.json │ ├── bamboo_jungle.json │ ├── basalt_deltas.json │ ├── beach.json │ ├── birch_forest.json │ ├── cherry_grove.json │ ├── cold_ocean.json │ ├── crimson_forest.json │ ├── dark_forest.json │ ├── deep_cold_ocean.json │ ├── deep_dark.json │ ├── deep_frozen_ocean.json │ ├── deep_lukewarm_ocean.json │ ├── deep_ocean.json │ ├── desert.json │ ├── dripstone_caves.json │ ├── end_barrens.json │ ├── end_highlands.json │ ├── end_midlands.json │ ├── eroded_badlands.json │ ├── flower_forest.json │ ├── forest.json │ ├── frozen_ocean.json │ ├── frozen_peaks.json │ ├── frozen_river.json │ ├── grove.json │ ├── ice_spikes.json │ ├── jagged_peaks.json │ ├── jungle.json │ ├── lukewarm_ocean.json │ ├── lush_caves.json │ ├── mangrove_swamp.json │ ├── meadow.json │ ├── mushroom_fields.json │ ├── nether_wastes.json │ ├── ocean.json │ ├── old_growth_birch_forest.json │ ├── old_growth_pine_taiga.json │ ├── old_growth_spruce_taiga.json │ ├── pale_garden.json │ ├── plains.json │ ├── river.json │ ├── savanna.json │ ├── savanna_plateau.json │ ├── small_end_islands.json │ ├── snowy_beach.json │ ├── snowy_plains.json │ ├── snowy_slopes.json │ ├── snowy_taiga.json │ ├── soul_sand_valley.json │ ├── sparse_jungle.json │ ├── stony_peaks.json │ ├── stony_shore.json │ ├── sunflower_plains.json │ ├── swamp.json │ ├── taiga.json │ ├── the_end.json │ ├── the_void.json │ ├── warm_ocean.json │ ├── warped_forest.json │ ├── windswept_forest.json │ ├── windswept_gravelly_hills.json │ ├── windswept_hills.json │ ├── windswept_savanna.json │ └── wooded_badlands.json ├── pfb_orbis/ │ ├── beet.yaml │ └── data/ │ └── gm4_orbis/ │ ├── loot_table/ │ │ ├── chests/ │ │ │ ├── dungeon/ │ │ │ │ ├── common.json │ │ │ │ ├── rare.json │ │ │ │ └── uncommon.json │ │ │ ├── dungeon.json │ │ │ ├── tower/ │ │ │ │ ├── common.json │ │ │ │ ├── rare.json │ │ │ │ └── uncommon.json │ │ │ └── tower.json │ │ ├── entities/ │ │ │ ├── cave_spider.json │ │ │ ├── creeper.json │ │ │ ├── drowned.json │ │ │ ├── glow_squid.json │ │ │ ├── guardian.json │ │ │ ├── pufferfish.json │ │ │ ├── skeleton.json │ │ │ ├── spider.json │ │ │ └── zombie.json │ │ └── traps/ │ │ └── arrow_dispenser.json │ ├── structure/ │ │ └── spawner/ │ │ ├── default/ │ │ │ ├── creeper_down.nbt │ │ │ ├── creeper_side.nbt │ │ │ ├── creeper_up.nbt │ │ │ ├── skeleton_down.nbt │ │ │ ├── skeleton_side.nbt │ │ │ ├── skeleton_up.nbt │ │ │ ├── spider_down.nbt │ │ │ ├── spider_side.nbt │ │ │ ├── spider_up.nbt │ │ │ ├── zombie_down.nbt │ │ │ ├── zombie_side.nbt │ │ │ └── zombie_up.nbt │ │ ├── extra/ │ │ │ ├── cave_spider_down.nbt │ │ │ ├── cave_spider_side.nbt │ │ │ └── cave_spider_up.nbt │ │ └── water/ │ │ ├── drowned_down.nbt │ │ ├── drowned_side.nbt │ │ ├── drowned_up.nbt │ │ ├── glow_squid_down.nbt │ │ ├── glow_squid_side.nbt │ │ ├── glow_squid_up.nbt │ │ ├── guardian_down.nbt │ │ ├── guardian_side.nbt │ │ ├── guardian_up.nbt │ │ ├── pufferfish_down.nbt │ │ ├── pufferfish_side.nbt │ │ └── pufferfish_up.nbt │ └── worldgen/ │ └── template_pool/ │ └── spawner/ │ ├── default.json │ ├── spider.json │ ├── undead.json │ └── water.json ├── pyproject.toml ├── resource_pack/ │ ├── beet.yaml │ ├── dev_description.py │ └── dev_warning.py └── spyglass.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms patreon: gamemode4 ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Report broken or unintended behavior title: '' labels: bug, needs investigation assignees: '' --- **Describe the bug** Tell us how this bug affects gameplay. **To Reproduce** Steps to reproduce the behavior: 1. Spawn a cat and '...' 2. Drop '....' onto the cat 3. Watch the cat eat '....' 4. cat.mcfunction stops working **Expected behavior** Describe what you expected to happen. **Fix** Outline how this bug could be fixed. **Screenshots** If applicable, add screenshots to help others understand your problem. **Environment** - Minecraft version: - Server version: - Installed Datapacks: - Installed Mods: **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feat_request.md ================================================ --- name: Feature Request about: Request a feature / change to a data pack title: '' labels: feature-update assignees: '' --- **Describe the feature** Give a headline summary of the feature. - What is the motivation - What data pack does it affect - Does credit need to be given? - Can you link to a discussion on Discord about it? ================================================ FILE: .github/workflows/main.yml ================================================ name: Build modules on: push: branches: [ master, ver/* ] pull_request: workflow_dispatch: env: VERSION: '26.1' COMMIT_MSG: ${{ github.event.head_commit.message }} jobs: build: runs-on: ubuntu-24.04 concurrency: group: ${{ github.event_name != 'pull_request' && 'release' || format('pr-{0}', github.event.number) }} steps: - uses: actions/checkout@v4 - name: Checkout release branch if: github.event_name != 'pull_request' uses: actions/checkout@v4 with: ref: release path: release - name: Fetch pull request base if: github.event_name == 'pull_request' run: git fetch origin ${{ github.base_ref }} - name: Set up uv uses: astral-sh/setup-uv@v7 - name: Build and publish all modules if: github.event_name != 'pull_request' run: uv run beet -p beet-release.yaml -l ${{ env.LOG_LEVEL }} build env: BEET_MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} BEET_SMITHED_TOKEN: ${{ secrets.SMITHED_TOKEN }} LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}} MASTER_BUILD: true - name: Build all modules for pull request if: github.event_name == 'pull_request' run: uv run beet -p beet-release.yaml -l ${{ env.LOG_LEVEL }} build env: LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}} - name: Remove non-modules for artifact if: github.event_name == 'pull_request' run: | rm -r release/$VERSION/generated rm release/$VERSION/lib_* rm release/$VERSION/meta.json - name: Upload artifact if: github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: 'Modules for pull request #${{ github.event.number }}' path: ${{ github.workspace }}/release/${{ env.VERSION }}/ - name: Commit release if: github.event_name != 'pull_request' run: | git config --global user.email "${{ github.event.head_commit.author.email }}" git config --global user.name "${{ github.event.head_commit.author.username }}" cd release git add . git commit -m "🚀 ${{ github.event.after }} $COMMIT_MSG" - name: Push release if: github.event_name != 'pull_request' uses: ad-m/github-push-action@v0.8.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} directory: release branch: release test: strategy: fail-fast: false matrix: include: # https://fabricmc.net/use/server/ # https://modrinth.com/mod/fabric-api/versions # https://modrinth.com/mod/packtest/versions - version: '26.1' fabric_server_url: https://meta.fabricmc.net/v2/versions/loader/26.1-snapshot-6/0.18.4/1.1.1/server/jar fabric_api_url: https://cdn.modrinth.com/data/P7dR8mSH/versions/WAZ95Yd8/fabric-api-0.143.2%2B26.1.jar packtest_url: https://cdn.modrinth.com/data/XsKUhp45/versions/eupLiv70/packtest-2.5.0-beta1.jar command_limit_tracer_url: https://cdn.modrinth.com/data/Ao12dSbt/versions/DxBN5h3K/commandlimittracer-0.2.0.jar name: 'test-${{ matrix.version }}' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Set up uv uses: astral-sh/setup-uv@v7 - name: Build all modules for tests run: uv run beet -p beet-test.yaml -l ${{ env.LOG_LEVEL }} build env: LOG_LEVEL: ${{ runner.debug == 1 && 'DEBUG' || 'INFO'}} - name: Setup Java uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '25' - name: Download server files run: | curl -o server.jar ${{ matrix.fabric_server_url }} mkdir mods curl -o mods/fabric-api.jar ${{ matrix.fabric_api_url }} curl -o mods/packtest.jar ${{ matrix.packtest_url }} curl -o mods/command_limit_tracer.jar ${{ matrix.command_limit_tracer_url }} - name: Copy packs to world run: | mkdir -p world/datapacks rm out/gm4_zauber_liquids.zip cp out/gm4_*.zip world/datapacks - name: Run test server id: run-tests run: | java -Xmx2G -Dpacktest.auto -Dpacktest.auto.annotations -jar server.jar nogui - name: Upload test world if: ${{ failure() && steps.run-tests.conclusion == 'failure' }} uses: actions/upload-artifact@v4 with: name: 'Test world in ${{ matrix.version }} for ${{ github.sha }}' path: ${{ github.workspace }}/world/ ================================================ FILE: .gitignore ================================================ ### macOS ### .DS_Store .AppleDouble .LSOverride ### Libre Office ### .~lock.* ### Python ### __pycache__/ *.py[cod] *$py.class *.egg-info/ ### Beet ### out/ release/ .beet_cache/ ================================================ FILE: .python-version ================================================ 3.14 ================================================ FILE: .vscode/settings.json ================================================ { "files.insertFinalNewline": true, "files.trimFinalNewlines": true } ================================================ FILE: .vscode/tasks.json ================================================ { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "Develop module", "type": "shell", "command": "beet", "args": ["--set", "'meta.dev=${input:module}'", "watch", "--link", "'${input:world}'"], "group": "build", "presentation": { "reveal": "always", "panel": "shared" }, "isBackground": true, "problemMatcher": { "pattern": { "regexp": "^dewrhfguyrwedjwgfw(.)(.)(.)(.)(.)$" }, "background": { "activeOnStart": true, "beginsPattern": "(\\d+ changes detected|Edited '.*')", "endsPattern": "\\[GM4\\] Generated development pack" } } } ], "inputs": [ { "id": "world", "type": "promptString", "description": "What world save should it be linked to?", }, { "id": "module", "type": "promptString", "description": "Which module should be watched?", "default": "bat_grenades", } ] } ================================================ FILE: LICENSE.md ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ # Gamemode 4 Data Packs > Gamemode 4 is an open-source data pack collection designed to augment the vanilla survival experience. [![Download our Data Packs](./docs/images/badges/gm4-website.svg)](https://gm4.co/modules) [![Available on Modrinth](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/modrinth_vector.svg)](https://modrinth.com/organization/gamemode4/) [![Chat with us on Discord](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/social/discord-plural_vector.svg)](https://gm4.co/discord) [![Read our Wiki](./docs/images/badges/gm4-wiki.svg)](https://wiki.gm4.co/Main_Page) ## Contributing Contributions are welcome! We use [Beet](https://mcbeet.dev) to build our modules. See [our documentation on how to get started](./docs/getting-started.md). Found a bug with one of our modules? You can [create an issue on GitHub](https://github.com/Gamemode4Dev/GM4_Datapacks/issues)! ================================================ FILE: base/assets/gm4/font/container_gui.json ================================================ { "providers": [ { "type": "space", "advances": { "\uf824": 5, "\uf808": -8 } } ] } ================================================ FILE: base/assets/gm4/font/default.json ================================================ { "providers": [ { "type": "reference", "id": "minecraft:default" } ] } ================================================ FILE: base/assets/gm4/font/half_invert.json ================================================ { "providers": [ { "type": "space", "advances": { "0": -3, "1": -3, "2": -3, "3": -3, "4": -3, "5": -3, "6": -3, "7": -3, "8": -3, "9": -3, "\u0000": -4.5, "\u0001": -4.5, "\u0002": -4.5, "\u0003": -4.5, "\u0004": -4.5, "\u0005": -4.5, "\u0006": -4.5, "\u0007": -4.5, "\b": -4.5, "\t": -4.5, "\n": -4.5, "\u000b": -4.5, "\f": -4.5, "\r": -4.5, "\u000e": -4.5, "\u000f": -4.5, "\u0010": -4.5, "\u0011": -4.5, "\u0012": -4.5, "\u0013": -4.5, "\u0014": -4.5, "\u0015": -4.5, "\u0016": -4.5, "\u0017": -4.5, "\u0018": -4.5, "\u0019": -4.5, "\u001a": -4.5, "\u001b": -4.5, "\u001c": -4.5, "\u001d": -4.5, "\u001e": -4.5, "\u001f": -4.5, " ": -2, "!": -1, "\"": -2, "#": -3, "$": -3, "%": -3, "&": -3, "'": -1, "(": -2, ")": -2, "*": -2, "+": -3, ",": -1, "-": -3, ".": -1, "/": -3, ":": -1, ";": -1, "<": -2.5, "=": -3, ">": -2.5, "?": -3, "@": -3.5, "A": -3, "B": -3, "C": -3, "D": -3, "E": -3, "F": -3, "G": -3, "H": -3, "I": -2, "J": -3, "K": -3, "L": -3, "M": -3, "N": -3, "O": -3, "P": -3, "Q": -3, "R": -3, "S": -3, "T": -3, "U": -3, "V": -3, "W": -3, "X": -3, "Y": -3, "Z": -3, "[": -2, "\\": -3, "]": -2, "^": -3, "_": -3, "`": -1.5, "a": -3, "b": -3, "c": -3, "d": -3, "e": -3, "f": -2.5, "g": -3, "h": -3, "i": -1, "j": -3, "k": -2.5, "l": -1.5, "m": -3, "n": -3, "o": -3, "p": -3, "q": -3, "r": -3, "s": -3, "t": -2, "u": -3, "v": -3, "w": -3, "x": -3, "y": -3, "z": -3, "{": -2, "|": -1, "}": -2, "~": -3.5, "\u007f": -4.5, "\u0080": -4.5, "\u0081": -4.5, "\u0082": -4.5, "\u0083": -4.5, "\u0084": -4.5, "\u0085": -4.5, "\u0086": -4.5, "\u0087": -4.5, "\u0088": -4.5, "\u0089": -4.5, "\u008a": -4.5, "\u008b": -4.5, "\u008c": -4.5, "\u008d": -4.5, "\u008e": -4.5, "\u008f": -4.5, "\u0090": -4.5, "\u0091": -4.5, "\u0092": -4.5, "\u0093": -4.5, "\u0094": -4.5, "\u0095": -4.5, "\u0096": -4.5, "\u0097": -4.5, "\u0098": -4.5, "\u0099": -4.5, "\u009a": -4.5, "\u009b": -4.5, "\u009c": -4.5, "\u009d": -4.5, "\u009e": -4.5, "\u009f": -4.5, "\u00a0": -4.5, "\u00a1": -1, "\u00a2": -3, "\u00a3": -3, "\u00a4": -4, "\u00a5": -3, "\u00a6": -1, "\u00a7": -3, "\u00a8": -2, "\u00a9": -4, "\u00aa": -2.5, "\u00ab": -3.5, "\u00ac": -3, "\u00ad": -2, "\u00ae": -4, "\u00af": -3, "\u00b0": -2.5, "\u00b1": -3, "\u00b2": -2.5, "\u00b3": -2.5, "\u00b4": -1.5, "\u00b5": -3, "\u00b6": -3.5, "\u00b7": -1, "\u00b8": -1, "\u00b9": -2, "\u00ba": -2.5, "\u00bb": -3.5, "\u00bc": -4, "\u00bd": -4, "\u00be": -4, "\u00bf": -3, "\u00c0": -3, "\u00c1": -3, "\u00c2": -3, "\u00c3": -3, "\u00c4": -3, "\u00c5": -3, "\u00c6": -5, "\u00c7": -3, "\u00c8": -3, "\u00c9": -3, "\u00ca": -3, "\u00cb": -3, "\u00cc": -2, "\u00cd": -2, "\u00ce": -2, "\u00cf": -2, "\u00d0": -3.5, "\u00d1": -3, "\u00d2": -3, "\u00d3": -3, "\u00d4": -3, "\u00d5": -3, "\u00d6": -3, "\u00d7": -3, "\u00d8": -3, "\u00d9": -3, "\u00da": -3, "\u00db": -3, "\u00dc": -3, "\u00dd": -3, "\u00de": -3, "\u00df": -3, "\u00e0": -3, "\u00e1": -3, "\u00e2": -3, "\u00e3": -3, "\u00e4": -3, "\u00e5": -3, "\u00e6": -5, "\u00e7": -3, "\u00e8": -3, "\u00e9": -3, "\u00ea": -3, "\u00eb": -3, "\u00ec": -1.5, "\u00ed": -1.5, "\u00ee": -2, "\u00ef": -2, "\u00f0": -3, "\u00f1": -3, "\u00f2": -3, "\u00f3": -3, "\u00f4": -3, "\u00f5": -3, "\u00f6": -3, "\u00f7": -3, "\u00f8": -3, "\u00f9": -3, "\u00fa": -3, "\u00fb": -3, "\u00fc": -3, "\u00fd": -3, "\u00fe": -3, "\u00ff": -3, "\u0192": -3, "\u2591": -4, "\u2592": -4.5, "\u2593": -4.5, "\u2502": -3, "\u2524": -3, "\u2561": -3, "\u2562": -4, "\u2556": -4, "\u2555": -3, "\u2563": -4, "\u2551": -4, "\u2557": -4, "\u255d": -4, "\u255c": -4, "\u255b": -3, "\u2510": -3, "\u2514": -4.5, "\u2534": -4.5, "\u252c": -4.5, "\u251c": -4.5, "\u2500": -4.5, "\u253c": -4.5, "\u255e": -4.5, "\u255f": -4.5, "\u255a": -4.5, "\u2554": -4.5, "\u2569": -4.5, "\u2566": -4.5, "\u2560": -4.5, "\u2550": -4.5, "\u256c": -4.5, "\u2567": -4.5, "\u2568": -4.5, "\u2564": -4.5, "\u2565": -4.5, "\u2559": -4.5, "\u2558": -4.5, "\u2552": -4.5, "\u2553": -4.5, "\u256b": -4.5, "\u256a": -4.5, "\u2518": -3, "\u250c": -4.5, "\u2588": -4.5, "\u2584": -4.5, "\u258c": -2.5, "\u2590": -4.5, "\u2580": -4.5, "\u2205": -4, "\u2208": -3, "\u2261": -3.5, "\u2265": -3, "\u2264": -3, "\u2320": -4, "\u2321": -2.5, "\u2248": -3.5, "\u2219": -3, "\u221a": -3.5, "\u207f": -2.5, "\u25a0": -3, "\u0100": -3, "\u0101": -3, "\u0102": -3, "\u0103": -3, "\u0104": -3, "\u0105": -3, "\u0106": -3, "\u0107": -3, "\u0108": -3, "\u0109": -3, "\u010a": -3, "\u010b": -3, "\u010c": -3, "\u010d": -3, "\u010e": -3, "\u010f": -4, "\u0110": -3.5, "\u0111": -3.5, "\u0112": -3, "\u0113": -3, "\u0114": -3, "\u0115": -3, "\u0116": -3, "\u0117": -3, "\u0118": -3, "\u0119": -3, "\u011a": -3, "\u011b": -3, "\u011c": -3, "\u011d": -3, "\u1e20": -3, "\u1e21": -3, "\u011e": -3, "\u011f": -3, "\u0120": -3, "\u0121": -3, "\u0122": -3, "\u0123": -3, "\u0124": -3, "\u0125": -3, "\u0126": -4, "\u0127": -3.5, "\u0128": -2.5, "\u0129": -2.5, "\u012a": -2, "\u012b": -2, "\u012c": -2.5, "\u012d": -2.5, "\u012e": -2, "\u012f": -1.5, "\u0130": -2, "\u0131": -1, "\u0134": -3, "\u0135": -3, "\u0136": -3, "\u0137": -2.5, "\u0139": -3, "\u013a": -1.5, "\u013b": -3, "\u013c": -1.5, "\u013d": -3, "\u013e": -2, "\u013f": -3, "\u0140": -2, "\u0141": -3.5, "\u0142": -2.5, "\u0143": -3, "\u0144": -3, "\u0145": -3, "\u0146": -3, "\u0147": -3, "\u0148": -3, "\u014a": -3, "\u014b": -3, "\u014c": -3, "\u014d": -3, "\u014e": -3, "\u014f": -3, "\u0150": -3, "\u0151": -3, "\u0152": -5, "\u0153": -5, "\u0154": -3, "\u0155": -3, "\u0156": -3, "\u0157": -3, "\u0158": -3, "\u0159": -3, "\u015a": -3, "\u015b": -3, "\u015c": -3, "\u015d": -3, "\u015e": -3, "\u015f": -3, "\u0160": -3, "\u0161": -3, "\u0162": -3, "\u0163": -2, "\u0164": -3, "\u0165": -2.5, "\u0166": -3, "\u0167": -2, "\u0168": -3, "\u0169": -3, "\u016a": -3, "\u016b": -3, "\u016c": -3, "\u016d": -3, "\u016e": -3, "\u016f": -3, "\u0170": -3, "\u0171": -3, "\u0172": -3, "\u0173": -3, "\u0174": -3, "\u0175": -3, "\u0176": -3, "\u0177": -3, "\u0178": -3, "\u0179": -3, "\u017a": -3, "\u017b": -3, "\u017c": -3, "\u017d": -3, "\u017e": -3, "\u01fc": -5, "\u01fd": -5, "\u01fe": -3, "\u01ff": -3, "\u0218": -3, "\u0219": -3, "\u021a": -3, "\u021b": -2, "\u0386": -4, "\u0388": -4, "\u0389": -4, "\u038a": -3, "\u038c": -4, "\u038e": -4, "\u038f": -4, "\u0390": -3, "\u03aa": -2, "\u03ab": -3, "\u03ac": -3, "\u03ad": -3, "\u03ae": -3, "\u03af": -1.5, "\u03b0": -3, "\u03ca": -2, "\u03cb": -3, "\u03cc": -3, "\u03cd": -3, "\u03ce": -4, "\u0400": -3, "\u0401": -3, "\u0403": -3, "\u0407": -2, "\u040c": -3, "\u040d": -3, "\u040e": -3, "\u0419": -3, "\u0439": -3, "\u0450": -3, "\u0451": -3, "\u0452": -3.5, "\u0453": -2.5, "\u0457": -2, "\u045b": -3.5, "\u045c": -2.5, "\u045d": -3, "\u045e": -3, "\u045f": -3, "\u0490": -3, "\u0491": -3, "\u1e02": -3, "\u1e03": -3, "\u1e0a": -3, "\u1e0b": -3, "\u1e1e": -3, "\u1e1f": -2.5, "\u1e22": -3, "\u1e23": -3, "\u1e30": -3, "\u1e31": -2.5, "\u1e40": -3, "\u1e41": -3, "\u1e56": -3, "\u1e57": -3, "\u1e60": -3, "\u1e61": -3, "\u1e6a": -3, "\u1e6b": -2, "\u1e80": -3, "\u1e81": -3, "\u1e82": -3, "\u1e83": -3, "\u1e84": -3, "\u1e85": -3, "\u1ef2": -3, "\u1ef3": -3, "\u0149": -4, "\u01e7": -3, "\u01eb": -3, "\u040f": -3, "\u1e0d": -3, "\u1e25": -3, "\u1e5b": -3, "\u1e6d": -2, "\u1e92": -3, "\u1eca": -2, "\u1ecb": -1, "\u1ecc": -3, "\u1ecd": -3, "\u1ee4": -3, "\u1ee5": -3, "\u2116": -5, "\u0207": -3, "\u0194": -3, "\u0263": -3, "\u0283": -3, "\u2047": -5, "\u01f1": -5, "\u01f2": -5, "\u01f3": -5, "\u01c4": -5, "\u01c5": -5, "\u01c6": -5, "\u01c7": -5, "\u01c8": -5, "\u01ca": -5, "\u01cb": -5, "\u01cc": -5, "\u2139": -5, "\u1d6b": -5, "\ua732": -5, "\ua733": -5, "\ua734": -5, "\ua735": -5, "\ua736": -5, "\ua737": -5, "\ua738": -5, "\ua73a": -5, "\ua73c": -5, "\ua73d": -4.5, "\ua74e": -5, "\ua74f": -5, "\ua760": -3, "\ua761": -3, "\ufb04": -5, "\ufb06": -5, "\u16a1": -2.5, "\u16b5": -2.5, "\u01a0": -4, "\u01a1": -4, "\u01af": -4, "\u01b0": -4, "\u1eae": -3, "\u1eaf": -3, "\u1ea4": -3, "\u1ea5": -3, "\u1ebe": -3, "\u1ebf": -3, "\u1ed1": -3, "\u1eda": -4, "\u1edb": -4, "\u1ee8": -4, "\u1ee9": -4, "\u1eb0": -3, "\u1eb1": -3, "\u1ea6": -3, "\u1ea7": -3, "\u1ec0": -3, "\u1ec1": -3, "\u1ed3": -3, "\u1edc": -4, "\u1edd": -4, "\u1eea": -4, "\u1eeb": -4, "\u1ea2": -3, "\u1ea3": -3, "\u1eb2": -3, "\u1eb3": -3, "\u1ea8": -3, "\u1ea9": -3, "\u1eba": -3, "\u1ebb": -3, "\u1ed5": -3, "\u1ede": -4, "\u1ec2": -3, "\u1ec3": -3, "\u1ec8": -2, "\u1ec9": -2, "\u1ece": -3, "\u1ecf": -3, "\u1ed4": -3, "\u1edf": -4, "\u1ee6": -3, "\u1ee7": -3, "\u1eec": -4, "\u1eed": -4, "\u1ef6": -3, "\u1ef7": -3, "\u1ea0": -3, "\u1ea1": -3, "\u1eb6": -3, "\u1eb7": -3, "\u1eac": -3, "\u1ead": -3, "\u1eb8": -3, "\u1eb9": -3, "\u1ec6": -3, "\u1ec7": -3, "\u1ed8": -3, "\u1ed9": -3, "\u1ee2": -4, "\u1ee3": -4, "\u1ef0": -4, "\u1ef1": -4, "\u1ef4": -3, "\u1ef5": -3, "\u1ed0": -3, "\u0195": -4.5, "\u1eaa": -3, "\u1eab": -3, "\u1ed6": -3, "\u1ed7": -3, "\u1eef": -4, "\u261e": -5, "\u261c": -5, "\u262e": -5, "\u1eb4": -3, "\u1eb5": -3, "\u1ebc": -3, "\u1ebd": -3, "\u1ec4": -3, "\u1ec5": -3, "\u1ed2": -3, "\u1ee0": -4, "\u1ee1": -4, "\u1eee": -4, "\u1ef8": -3, "\u1ef9": -3, "\u0498": -3, "\u0499": -3, "\u04a0": -3.5, "\u04a1": -3, "\u04aa": -3, "\u04ab": -3, "\u01f6": -4.5, "\u26a0": -5, "\u24ea": -5, "\u2460": -5, "\u2461": -5, "\u2462": -5, "\u2463": -5, "\u2464": -5, "\u2465": -5, "\u2466": -5, "\u2467": -5, "\u2468": -5, "\u2469": -5, "\u246a": -5, "\u246b": -5, "\u246c": -5, "\u246d": -5, "\u246e": -5, "\u246f": -5, "\u2470": -5, "\u2471": -5, "\u2472": -5, "\u2473": -5, "\u24b6": -5, "\u24b7": -5, "\u24b8": -5, "\u24b9": -5, "\u24ba": -5, "\u24bb": -5, "\u24bc": -5, "\u24bd": -5, "\u24be": -5, "\u24bf": -5, "\u24c0": -5, "\u24c1": -5, "\u24c2": -5, "\u24c3": -5, "\u24c4": -5, "\u24c5": -5, "\u24c6": -5, "\u24c7": -5, "\u24c8": -5, "\u24c9": -5, "\u24ca": -5, "\u24cb": -5, "\u24cc": -5, "\u24cd": -5, "\u24ce": -5, "\u24cf": -5, "\u24d0": -5, "\u24d1": -5, "\u24d2": -5, "\u24d3": -5, "\u24d4": -5, "\u24d5": -5, "\u24d6": -5, "\u24d7": -5, "\u24d8": -5, "\u24d9": -5, "\u24da": -5, "\u24db": -5, "\u24dc": -5, "\u24dd": -5, "\u24de": -5, "\u24df": -5, "\u24e0": -5, "\u24e1": -5, "\u24e2": -5, "\u24e3": -5, "\u24e4": -5, "\u24e5": -5, "\u24e6": -5, "\u24e7": -5, "\u24e8": -5, "\u24e9": -5, "\u0327": -1.5, "\u0282": -3, "\u0290": -3.5, "\u0276": -5, "\u01cd": -3, "\u01ce": -3, "\u01de": -3, "\u01df": -3, "\u01fa": -3, "\u01fb": -3, "\u0202": -3, "\u0203": -3, "\u0226": -3, "\u0227": -3, "\u01e0": -3, "\u01e1": -3, "\u1e00": -3, "\u1e01": -3, "\u0200": -3, "\u0201": -3, "\u1e06": -3, "\u1e07": -3, "\u1e04": -3, "\u1e05": -3, "\u1d6c": -4, "\u1e08": -3, "\u1e09": -3, "\u1e10": -3, "\u1e11": -3, "\u1e12": -3, "\u1e13": -3, "\u1e0e": -3, "\u1e0f": -3, "\u1e0c": -3, "\u1d6d": -4, "\u1e14": -3, "\u1e15": -3, "\u1e16": -3, "\u1e17": -3, "\u1e18": -3, "\u1e19": -3, "\u1e1c": -3, "\u1e1d": -3, "\u0228": -3, "\u0229": -3, "\u1e1a": -3, "\u1e1b": -3, "\u0204": -3, "\u0205": -3, "\u0206": -3, "\u1d6e": -3, "\u01f4": -3, "\u01f5": -3, "\u01e6": -3, "\u1e26": -3, "\u1e27": -3, "\u1e28": -3, "\u1e29": -3, "\u1e2a": -3, "\u1e2b": -3, "\u021e": -3, "\u021f": -3, "\u1e24": -3, "\u1e96": -3, "\u1e2e": -2, "\u1e2f": -2, "\u020a": -2.5, "\u020b": -2.5, "\u01cf": -2, "\u01d0": -2, "\u0208": -3, "\u0209": -3, "\u1e2c": -2.5, "\u1e2d": -2.5, "\u01f0": -3, "\u0237": -3, "\u01e8": -3, "\u01e9": -2.5, "\u1e32": -3, "\u1e33": -2.5, "\u1e34": -3, "\u1e35": -2.5, "\u1e3a": -3, "\u1e3b": -2, "\u1e3c": -3, "\u1e3d": -2, "\u1e36": -3, "\u1e37": -1.5, "\u1e38": -3, "\u1e39": -2, "\u2c62": -4, "\u1e3e": -3, "\u1e3f": -3, "\u1e42": -3, "\u1e43": -3, "\u1d6f": -4, "\u1e44": -3, "\u1e45": -3, "\u1e46": -3, "\u1e47": -3, "\u1e4a": -3, "\u1e4b": -3, "\u01f8": -3, "\u01f9": -3, "\u1e48": -3, "\u1e49": -3, "\u1d70": -4, "\u01ec": -3, "\u01ed": -3, "\u022c": -3, "\u022d": -3, "\u1e4c": -3, "\u1e4d": -3, "\u1e4e": -3, "\u1e4f": -3, "\u1e50": -3, "\u1e51": -3, "\u1e52": -3, "\u1e53": -3, "\u020e": -3, "\u020f": -3, "\u022a": -3, "\u022b": -3, "\u01d1": -3, "\u01d2": -3, "\u022e": -3, "\u022f": -3, "\u0230": -3, "\u0231": -3, "\u020c": -3, "\u020d": -3, "\u01ea": -3, "\u1e54": -3, "\u1e55": -3, "\u1d71": -4, "\u0212": -3, "\u0213": -3, "\u1e58": -3, "\u1e59": -3, "\u1e5c": -3, "\u1e5d": -3, "\u1e5e": -3, "\u1e5f": -3, "\u0210": -3, "\u0211": -3, "\u1e5a": -3, "\u1d73": -4, "\u1d72": -4, "\u1e64": -3, "\u1e65": -3, "\u1e66": -3, "\u1e67": -3, "\u1e62": -3, "\u1e63": -3, "\u1e68": -3, "\u1e69": -3, "\u1d74": -4, "\u1e70": -3, "\u1e71": -2, "\u1e6e": -3, "\u1e6f": -2, "\u1e6c": -3, "\u1e97": -2, "\u1d75": -3, "\u1e72": -3, "\u1e73": -3, "\u1e76": -3, "\u1e77": -3, "\u1e78": -3, "\u1e79": -3, "\u1e7a": -3, "\u1e7b": -3, "\u01d3": -3, "\u01d4": -3, "\u01d5": -3, "\u01d6": -3, "\u01d7": -3, "\u01d8": -3, "\u01d9": -3, "\u01da": -3, "\u01db": -3, "\u01dc": -3, "\u1e74": -3, "\u1e75": -3, "\u0214": -3, "\u0215": -3, "\u0216": -3, "\u1e7e": -3, "\u1e7f": -3, "\u1e7c": -3, "\u1e7d": -3, "\u1e86": -3, "\u1e87": -3, "\u1e88": -3, "\u1e89": -3, "\u1e98": -3, "\u1e8c": -3, "\u1e8d": -3, "\u1e8a": -3, "\u1e8b": -3, "\u0232": -3, "\u0233": -3, "\u1e8e": -3, "\u1e8f": -3, "\u1e99": -3, "\u1e94": -3, "\u1e95": -3, "\u1e90": -3, "\u1e91": -3, "\u1e93": -3, "\u1d76": -3, "\u01ee": -3, "\u01ef": -3, "\u1e9b": -2, "\ua73e": -3, "\ua73f": -3, "\u01e2": -5, "\u01e3": -5, "\u1d7a": -4.5, "\u1efb": -3.5, "\u1d02": -5, "\u1d14": -5, "\uab63": -5, "\u0238": -5, "\u02a3": -5, "\u02a5": -5, "\u02a4": -5, "\u02a9": -5, "\u02aa": -4, "\u02ab": -4, "\u0239": -5, "\u02a8": -4.5, "\u02a6": -4.5, "\u02a7": -4, "\uab50": -3, "\uab51": -3, "\u20a7": -5, "\u1efa": -4, "\ufb2e": -3, "\ufb2f": -3, "\u0180": -3.5, "\u0182": -3, "\u0183": -3, "\u0187": -3.5, "\u0188": -3.5, "\u018a": -4, "\u018b": -3, "\u018c": -3, "\u0193": -3.5, "\u01e4": -3.5, "\u01e5": -3.5, "\u0197": -2, "\u0196": -2, "\u0269": -1.5, "\u0198": -3, "\u0199": -2.5, "\u019d": -3.5, "\u01a4": -4, "\u01a5": -3, "\u027d": -3, "\u01a6": -3, "\u01ac": -3.5, "\u01ad": -2, "\u01ab": -2, "\u01ae": -3, "\u0217": -3, "\u01b1": -3, "\u019c": -3, "\u01b3": -3.5, "\u01b4": -4, "\u01b5": -3, "\u01b6": -3, "\u01a2": -4, "\u01a3": -4, "\u0222": -3, "\u0223": -3, "\u02ad": -3, "\u02ae": -3.5, "\u02af": -4, "\ufb14": -5, "\ufb15": -5, "\ufb17": -5, "\ufb16": -5, "\ufb13": -5, "\u04d0": -3, "\u04d1": -3, "\u04d2": -3, "\u04d3": -3, "\u04f6": -3, "\u04f7": -2.5, "\u0494": -3, "\u0495": -2.5, "\u04d6": -3, "\u04d7": -3, "\u04bc": -4, "\u04bd": -4, "\u04be": -4, "\u04bf": -4, "\u04da": -3, "\u04db": -3, "\u04dc": -4, "\u04dd": -3, "\u04c1": -4, "\u04c2": -3, "\u04de": -3, "\u04df": -3, "\u04e2": -3, "\u04e3": -3, "\u04e4": -3, "\u04e5": -3, "\u04e6": -3, "\u04e7": -3, "\u04ea": -3, "\u04eb": -3, "\u04f0": -3, "\u04f1": -3, "\u04ee": -3, "\u04ef": -3, "\u04f2": -3, "\u04f3": -3, "\u04f4": -3, "\u04f5": -3, "\u04f8": -4, "\u04f9": -3.5, "\u04ec": -3, "\u04ed": -3, "\u0476": -3.5, "\u0477": -3.5, "\u04d4": -5, "\u04fa": -3.5, "\u0502": -4.5, "\ua682": -3, "\ua680": -3.5, "\ua688": -3.5, "\u052a": -5, "\u052c": -3.5, "\ua684": -5, "\u0504": -4, "\u0510": -3, "\u04e0": -3, "\u0506": -3.5, "\u048a": -3.5, "\u04c3": -3, "\u049e": -3.5, "\u049c": -3, "\u051e": -3, "\u051a": -3, "\u04c5": -3.5, "\u052e": -3.5, "\u0512": -3, "\u0520": -4.5, "\u0508": -4.5, "\u0514": -4.5, "\u04cd": -3.5, "\u04c9": -3.5, "\u0528": -3.5, "\u04c7": -3, "\u04a4": -3.5, "\u0522": -4.5, "\u050a": -4.5, "\u04a8": -3.5, "\u0524": -3.5, "\u04a6": -4.5, "\u048e": -3, "\u0516": -4.5, "\u050c": -3, "\ua690": -3, "\u04ac": -3, "\ua68a": -3.5, "\ua68c": -3, "\u050e": -3.5, "\u04b2": -3.5, "\u04fc": -3, "\u04fe": -3, "\u0526": -3.5, "\ua694": -3, "\u04b4": -4, "\ua68e": -3.5, "\u04b6": -3.5, "\u04cb": -3, "\u04b8": -3, "\ua692": -3.5, "\ua696": -4.5, "\ua686": -3, "\u048c": -3.5, "\u0518": -5, "\u051c": -3, "\u04d5": -5, "\u04fb": -3, "\u0503": -4.5, "\ua683": -3, "\ua681": -3.5, "\ua689": -3.5, "\u052b": -5, "\u052d": -3.5, "\ua685": -4.5, "\u0505": -4, "\u0511": -3, "\u04e1": -3, "\u0507": -3.5, "\u048b": -3.5, "\u04c4": -2.5, "\u049f": -3, "\u049d": -3, "\u051f": -3, "\u051b": -3, "\u04c6": -3.5, "\u052f": -3.5, "\u0513": -3, "\u0521": -4.5, "\u0509": -4.5, "\u0515": -4.5, "\u04ce": -3.5, "\u04ca": -3.5, "\u0529": -3.5, "\u04c8": -3, "\u04a5": -3.5, "\u0523": -4.5, "\u050b": -4.5, "\u04a9": -3.5, "\u0525": -3.5, "\u04a7": -4.5, "\u048f": -3, "\u0517": -4.5, "\u050d": -3, "\ua691": -3, "\u04ad": -3, "\ua68b": -3.5, "\ua68d": -3, "\u050f": -3.5, "\u04b3": -3.5, "\u04fd": -3, "\u04ff": -3, "\u0527": -3.5, "\ua695": -3, "\u04b5": -3.5, "\ua68f": -3, "\u04b7": -3.5, "\u04cc": -3, "\u04b9": -3, "\ua693": -3.5, "\ua697": -3.5, "\ua687": -3, "\u048d": -3.5, "\u0519": -5, "\u051d": -3, "\u1f08": -4.5, "\u1f00": -3, "\u1f09": -4.5, "\u1f01": -3, "\u1f0a": -5, "\u1f02": -3, "\u1f0b": -5, "\u1f03": -3, "\u1f0c": -5, "\u1f04": -3, "\u1f0d": -5, "\u1f05": -3.5, "\u1f0e": -4.5, "\u1f06": -3, "\u1f0f": -4.5, "\u1f07": -3, "\u1fba": -4.5, "\u1f70": -3, "\u1fb8": -3, "\u1fb0": -3, "\u1fb9": -3, "\u1fb1": -3, "\u1fbb": -4.5, "\u1f71": -3, "\u1f88": -4.5, "\u1f80": -3, "\u1f89": -4.5, "\u1f81": -3, "\u1f8a": -5, "\u1f82": -3, "\u1f8b": -5, "\u1f83": -3, "\u1f8c": -5, "\u1f84": -3, "\u1f8d": -5, "\u1f85": -3, "\u1f8e": -4.5, "\u1f86": -3, "\u1f8f": -4.5, "\u1f87": -3, "\u1fbc": -3, "\u1fb4": -3, "\u1fb6": -3, "\u1fb7": -3, "\u1fb2": -3, "\u1fb3": -3, "\u1f18": -4.5, "\u1f10": -3, "\u1f19": -4.5, "\u1f11": -3, "\u1f1a": -5, "\u1f12": -3, "\u1f1b": -5, "\u1f13": -3, "\u1f1c": -5, "\u1f14": -3, "\u1f1d": -5, "\u1f15": -3, "\u1fc8": -4.5, "\u1fc9": -4.5, "\u1f72": -3, "\u1f73": -3, "\u1f28": -4.5, "\u1f20": -3, "\u1fca": -4.5, "\u1f74": -3, "\u1f29": -4.5, "\u1f21": -3, "\u1f2a": -5, "\u1f22": -3, "\u1f2b": -5, "\u1f23": -3, "\u1f2c": -5, "\u1f24": -3, "\u1f2d": -5, "\u1f25": -3, "\u1f2e": -4.5, "\u1f26": -3, "\u1f2f": -4.5, "\u1f27": -3, "\u1f98": -4.5, "\u1f90": -3, "\u1f99": -4.5, "\u1f91": -3, "\u1f9a": -5, "\u1f92": -3, "\u1f9b": -5, "\u1f93": -3, "\u1f9c": -5, "\u1f94": -3, "\u1f9d": -5, "\u1f95": -3, "\u1f9e": -4.5, "\u1f96": -3, "\u1f9f": -4.5, "\u1f97": -3, "\u1fcb": -4.5, "\u1f75": -3, "\u1fcc": -3, "\u1fc3": -3, "\u1fc2": -3, "\u1fc4": -3, "\u1fc6": -3, "\u1fc7": -3, "\u1fda": -3.5, "\u1f76": -2, "\u1fdb": -3.5, "\u1f77": -1.5, "\u1f38": -3.5, "\u1f30": -2, "\u1f39": -5, "\u1f31": -1.5, "\u1f3a": -4.5, "\u1f32": -3, "\u1f3b": -4, "\u1f33": -3, "\u1f3c": -4.5, "\u1f34": -3, "\u1f3d": -4, "\u1f35": -3, "\u1f3e": -3.5, "\u1f36": -2.5, "\u1f3f": -3.5, "\u1f37": -2.5, "\u1fd8": -2.5, "\u1fd0": -2.5, "\u1fd9": -2, "\u1fd1": -2, "\u1fd2": -2, "\u1fd3": -2, "\u1fd6": -2.5, "\u1fd7": -2.5, "\u1ff8": -4.5, "\u1f78": -3, "\u1ff9": -4.5, "\u1f79": -3, "\u1f48": -4.5, "\u1f40": -3, "\u1f49": -4.5, "\u1f41": -3, "\u1f4a": -5, "\u1f42": -3, "\u1f4b": -5, "\u1f43": -3, "\u1f4c": -5, "\u1f44": -3, "\u1f4d": -5, "\u1f45": -3, "\u1fec": -4.5, "\u1fe4": -3, "\u1fe5": -3, "\u1fea": -4.5, "\u1f7a": -3, "\u1feb": -4.5, "\u1f7b": -3, "\u1f59": -4.5, "\u1f51": -3, "\u1f5b": -5, "\u1f53": -3, "\u1f5d": -5, "\u1f55": -3, "\u1f5f": -4.5, "\u1f57": -3, "\u1fe8": -3, "\u1fe0": -3, "\u1fe9": -3, "\u1fe1": -3, "\u03d3": -5, "\u03d4": -3.5, "\u1fe2": -3, "\u1fe3": -3, "\u1fe7": -3, "\u1f50": -3, "\u1f52": -3, "\u1f54": -3, "\u1fe6": -3, "\u1f56": -3, "\u1ffa": -4.5, "\u1f7c": -4, "\u1ffb": -4.5, "\u1f7d": -4, "\u1f68": -4.5, "\u1f60": -4, "\u1f69": -4.5, "\u1f61": -4, "\u1f6a": -5, "\u1f62": -4, "\u1f6b": -5, "\u1f63": -4, "\u1f6c": -5, "\u1f64": -4, "\u1f6d": -5, "\u1f65": -4, "\u1f6e": -4.5, "\u1f66": -4, "\u1f6f": -5, "\u1f67": -4, "\u1fa8": -4.5, "\u1fa0": -4, "\u1fa9": -4.5, "\u1fa1": -4, "\u1faa": -5, "\u1fa2": -4, "\u1fab": -5, "\u1fa3": -4, "\u1fac": -5, "\u1fa4": -4, "\u1fad": -5, "\u1fa5": -4, "\u1fae": -4.5, "\u1fa6": -4, "\u1faf": -5, "\u1fa7": -4, "\u1ffc": -3, "\u1ff3": -4, "\u1ff2": -4, "\u1ff4": -4, "\u1ff6": -4, "\u1ff7": -4, "\u262f": -5, "\u2610": -5, "\u2611": -5, "\u2612": -5, "\u018d": -3, "\u01ba": -3, "\u2c7e": -3, "\u023f": -3, "\u2c7f": -3, "\u0240": -3, "\u1d80": -3, "\ua7c4": -3, "\ua794": -3, "\u1d81": -3.5, "\u1d82": -2.5, "\u1d83": -3.5, "\ua795": -3.5, "\u1d84": -3, "\u1d85": -1.5, "\u1d86": -3.5, "\u1d87": -3.5, "\u1d88": -3, "\u1d89": -3, "\u1d8a": -3, "\u1d8b": -3, "\u1d8c": -3, "\u1d8d": -3.5, "\ua7c6": -3.5, "\u1d8e": -3.5, "\u1d8f": -3.5, "\u1d90": -3.5, "\u1d92": -3.5, "\u1d93": -3.5, "\u1d94": -3, "\u1d95": -3.5, "\u1d96": -1.5, "\u1d97": -3.5, "\u1d98": -3, "\u1d99": -3.5, "\u1d9a": -3, "\u1e9a": -3, "\u2152": -5, "\u2158": -5, "\u20a8": -5, "\u20af": -5, "\u2030": -4, "\u20b4": -4, "\u2260": -3, "\u04bb": -3, "\u0391": -3, "\u0392": -3, "\u0393": -3, "\u0394": -3, "\u0395": -3, "\u0396": -3, "\u0397": -3, "\u0398": -3, "\u0399": -2, "\u039a": -3, "\u039b": -3, "\u039c": -3, "\u039d": -3, "\u039e": -3, "\u039f": -3, "\u03a0": -3, "\u03a1": -3, "\u03a3": -3, "\u03a4": -3, "\u03a5": -3, "\u03a6": -3, "\u03a7": -3, "\u03a8": -3, "\u03a9": -3, "\u03b1": -3, "\u03b2": -3, "\u03b3": -3, "\u03b4": -3, "\u03b5": -3, "\u03b6": -3, "\u03b7": -3, "\u03b8": -3, "\u03b9": -1.5, "\u03ba": -2.5, "\u03bb": -3, "\u03bc": -3, "\u03bd": -3, "\u03be": -3, "\u03bf": -3, "\u03c0": -3, "\u03c1": -3, "\u03c2": -3, "\u03c3": -3.5, "\u03c4": -3, "\u03c5": -3, "\u03c6": -3, "\u03c7": -3, "\u03c8": -3, "\u03c9": -4, "\u0402": -4, "\u0405": -3, "\u0406": -2, "\u0408": -3, "\u0409": -4, "\u040a": -3.5, "\u040b": -3.5, "\u0410": -3, "\u0411": -3, "\u0412": -3, "\u0413": -3, "\u0414": -3.5, "\u0415": -3, "\u0416": -4, "\u0417": -3, "\u0418": -3, "\u041a": -3, "\u041b": -3, "\u041c": -3, "\u041d": -3, "\u041e": -3, "\u041f": -3, "\u0420": -3, "\u0421": -3, "\u0422": -3, "\u0423": -3, "\u0424": -4, "\u0425": -3, "\u0426": -3.5, "\u0427": -3, "\u0428": -4, "\u0429": -4.5, "\u042a": -3.5, "\u042b": -4, "\u042c": -3, "\u042d": -3, "\u042e": -4, "\u042f": -3, "\u0430": -3, "\u0431": -3, "\u0432": -3, "\u0433": -2.5, "\u0434": -3.5, "\u0435": -3, "\u0436": -3, "\u0437": -3, "\u0438": -3, "\u043a": -2.5, "\u043b": -3, "\u043c": -3, "\u043d": -3, "\u043e": -3, "\u043f": -3, "\u0440": -3, "\u0441": -3, "\u0442": -3, "\u0443": -3, "\u0444": -3, "\u0445": -3, "\u0446": -3, "\u0447": -3, "\u0448": -3, "\u0449": -3.5, "\u044a": -3.5, "\u044b": -3.5, "\u044c": -3, "\u044d": -3, "\u044e": -4, "\u044f": -3, "\u0454": -3, "\u0455": -3, "\u0456": -1, "\u0458": -3, "\u0459": -4, "\u045a": -3.5, "\u2013": -3.5, "\u2014": -4.5, "\u2018": -1.5, "\u2019": -1.5, "\u201c": -2.5, "\u201d": -2.5, "\u201e": -2.5, "\u2026": -4, "\u204a": -2.5, "\u2190": -4, "\u2191": -3, "\u2192": -4, "\u2193": -3, "\u21c4": -4, "\uff0b": -3, "\u018f": -3, "\u0259": -3, "\u025b": -3, "\u026a": -2, "\u04ae": -3, "\u04af": -3, "\u04e8": -3, "\u04e9": -3, "\u02bb": -1, "\u02cc": -1, "\u037e": -1, "\u0138": -2.5, "\u1e9e": -3, "\u20bd": -3.5, "\u20ac": -3.5, "\u0462": -3.5, "\u0463": -3.5, "\u0474": -3.5, "\u0475": -3.5, "\u04c0": -2, "\u0472": -3, "\u0473": -3, "\u2070": -2.5, "\u2074": -2.5, "\u2075": -2.5, "\u2076": -2.5, "\u2077": -2.5, "\u2078": -2.5, "\u2079": -2.5, "\u207a": -2, "\u207b": -2, "\u207c": -2, "\u207d": -1.5, "\u207e": -1.5, "\u2071": -1, "\u2122": -4.5, "\u0294": -3, "\u0295": -3, "\u29c8": -4, "\u2694": -4, "\u2620": -4, "\u049a": -3.5, "\u049b": -3, "\u0492": -3.5, "\u0493": -3, "\u04b0": -3, "\u04b1": -3, "\u04d8": -3, "\u04d9": -3, "\u0496": -4.5, "\u0497": -3.5, "\u04a2": -3.5, "\u04a3": -3.5, "\u04ba": -3, "\u05d0": -3, "\u05d1": -3, "\u05d2": -2.5, "\u05d3": -3, "\u05d4": -3, "\u05d5": -1, "\u05d6": -2, "\u05d7": -3, "\u05d8": -3, "\u05d9": -1, "\u05db": -3, "\u05dc": -3, "\u05de": -3, "\u05dd": -3, "\u05e0": -2, "\u05df": -1, "\u05e1": -3, "\u05e2": -3, "\u05e4": -3, "\u05e3": -3, "\u05e6": -3, "\u05e5": -3, "\u05e7": -3, "\u05e8": -3, "\u0387": -1, "\u2010": -2, "\u201a": -1.5, "\u2020": -3, "\u2021": -3, "\u2022": -1.5, "\u2031": -4.5, "\u2032": -1.5, "\u2033": -2.5, "\u2034": -3.5, "\u2035": -1.5, "\u2036": -2.5, "\u2037": -3.5, "\u2039": -2, "\u203a": -2, "\u203b": -4, "\u203c": -2, "\u203d": -3, "\u2042": -4, "\u2048": -4, "\u2049": -4, "\u204b": -3.5, "\u204e": -2, "\u204f": -1, "\u2051": -2, "\u2052": -2, "\u2057": -4.5, "\u2117": -4, "\u2212": -3, "\u2213": -3, "\u221e": -4, "\u2600": -4.5, "\u2601": -4.5, "\u2608": -4, "\u0404": -3, "\u2632": -3, "\u2635": -3, "\u263d": -4.5, "\u2640": -2, "\u2642": -3, "\u26a5": -3, "\u2660": -3, "\u2663": -3, "\u2665": -3, "\u2666": -3, "\u2669": -2, "\u266a": -3, "\u266b": -4, "\u266c": -4, "\u266d": -2, "\u266e": -2, "\u266f": -3, "\u2680": -4, "\u2681": -4, "\u2682": -4, "\u2683": -4, "\u2684": -4, "\u2685": -4, "\u02ac": -3, "\u26a1": -3, "\u26cf": -4.5, "\u2714": -3.5, "\u2744": -4, "\u274c": -3.5, "\u2764": -4, "\u2b50": -4, "\u2e18": -3, "\u2e2e": -3, "\u2e35": -1, "\u2e38": -3, "\u2e41": -1, "\u2e4b": -3, "\u295d": -3, "\u1614": -3, "\u0190": -3, "\u07c8": -3, "\u03db": -3, "\u3125": -3, "\u2c6f": -3, "\u15fa": -3, "\u0186": -3, "\u15e1": -3, "\u018e": -3, "\u2132": -3, "\u2141": -3, "\ua7b0": -3, "\ua780": -3, "\u0500": -3, "\ua779": -3, "\u1d1a": -3, "\u27d8": -3, "\u2229": -3, "\u0245": -3, "\u2144": -3, "\u0250": -3, "\u0254": -3, "\u01dd": -3, "\u025f": -2.5, "\u1d77": -3, "\u0265": -3, "\u1d09": -1, "\u027e": -3, "\u029e": -2.5, "\ua781": -1.5, "\u026f": -3, "\u0279": -3, "\u0287": -2, "\u028c": -3, "\u028d": -3, "\u028e": -3, "\u0531": -3, "\u0532": -3, "\u0533": -3.5, "\u0534": -3.5, "\u0536": -3, "\u0537": -3, "\u0539": -3.5, "\u053a": -3.5, "\u053b": -3, "\u053c": -2.5, "\u053d": -3.5, "\u053e": -3, "\u053f": -3, "\u0540": -3, "\u0541": -3, "\u0542": -3.5, "\u0543": -3, "\u0544": -3.5, "\u0545": -3, "\u0546": -3, "\u0547": -3, "\u0548": -3, "\u0549": -3, "\u054b": -3, "\u054c": -3.5, "\u054d": -3, "\u054e": -3, "\u054f": -3, "\u0550": -3, "\u0551": -3, "\u0552": -2.5, "\u0553": -3, "\u0554": -3, "\u0555": -3, "\u0556": -3, "\u0559": -1.5, "\u0561": -3, "\u0562": -3, "\u0563": -3.5, "\u0564": -3.5, "\u0565": -3, "\u0566": -3.5, "\u0567": -2.5, "\u0568": -3, "\u0569": -3, "\u056a": -3.5, "\u056b": -3, "\u056c": -1.5, "\u056d": -3.5, "\u056e": -3, "\u056f": -3, "\u0570": -3, "\u0571": -3, "\u0572": -3.5, "\u0573": -3, "\u0574": -3.5, "\u0575": -3, "\u0576": -3.5, "\u0577": -3, "\u0578": -3, "\u0579": -3, "\u057a": -3, "\u057b": -3, "\u057c": -3, "\u057d": -3, "\u057e": -3.5, "\u057f": -4, "\u0580": -3, "\u0581": -3, "\u0582": -2.5, "\u0583": -4, "\u0584": -3.5, "\u0585": -3, "\u0586": -3, "\u0587": -3.5, "\u05e9": -3, "\u05ea": -3, "\u0538": -3, "\u055a": -1.5, "\u055b": -1.5, "\u055c": -2, "\u055d": -1.5, "\u055e": -2, "\u055f": -3, "\u0560": -3, "\u0588": -3.5, "\u058f": -3, "\u017f": -2, "\u01b7": -3, "\u0292": -3, "\u01f7": -3, "\u01bf": -3, "\u021c": -3, "\u021d": -3, "\u0224": -3, "\u0225": -3, "\u02d9": -1, "\ua75a": -3, "\ua75b": -2.5, "\u2011": -2, "\u214b": -3, "\u23cf": -3, "\u23e9": -3.5, "\u23ea": -3.5, "\u23ed": -4, "\u23ee": -4, "\u23ef": -3.5, "\u23f4": -2, "\u23f5": -2, "\u23f6": -3, "\u23f7": -3, "\u23f8": -2, "\u23f9": -3, "\u23fa": -3, "\u23fb": -4, "\u23fc": -4, "\u23fd": -1, "\u2b58": -4, "\u25b2": -3, "\u25b6": -3.5, "\u25bc": -3, "\u25c0": -3.5, "\u25cf": -2.5, "\u25e6": -2, "\u25d8": -2, "\u2693": -4, "\u26e8": -4, "\u0132": -3, "\u0133": -2.5, "\u01c9": -4, "\ua728": -4, "\ua729": -3.5, "\ua739": -4.5, "\ua73b": -4.5, "\ufb00": -4, "\ufb01": -3, "\ufb02": -3.5, "\ufb03": -4.5, "\ufb05": -3, "\ufffd": -4, "\u0535": -3, "\u054a": -3, "\u16a0": -2.5, "\u16a2": -3, "\u16a3": -3, "\u16a4": -3, "\u16a5": -3, "\u16a6": -2.5, "\u16a7": -2.5, "\u16a8": -2, "\u16a9": -2.5, "\u16aa": -2.5, "\u16ab": -2.5, "\u16ac": -3, "\u16ad": -2, "\u16ae": -2, "\u16af": -3, "\u16b0": -3, "\u16b1": -2.5, "\u16b2": -2, "\u16b3": -2.5, "\u16b4": -2.5, "\u16b6": -3, "\u16b7": -3, "\u16b8": -3, "\u16b9": -2.5, "\u16ba": -3, "\u16bb": -3, "\u16bc": -3, "\u16bd": -2, "\u16be": -3, "\u16bf": -2, "\u16c0": -3, "\u16c1": -1, "\u16c2": -2, "\u16c3": -3.5, "\u16c4": -3, "\u16c5": -3, "\u16c6": -2, "\u16c7": -3, "\u16c8": -2.5, "\u16c9": -3, "\u16ca": -2, "\u16cb": -3, "\u16cc": -1, "\u16cd": -2, "\u16ce": -3, "\u16cf": -3, "\u16d0": -2, "\u16d1": -2.5, "\u16d2": -2.5, "\u16d3": -2, "\u16d4": -2.5, "\u16d5": -2.5, "\u16d6": -3, "\u16d7": -3, "\u16d8": -3, "\u16d9": -2, "\u16da": -2, "\u16db": -2.5, "\u16dc": -3, "\u16dd": -3, "\u16de": -3, "\u16df": -3.5, "\u16e0": -4, "\u16e1": -3, "\u16e2": -4, "\u16e3": -3, "\u16e4": -3, "\u16e5": -3, "\u16e6": -3, "\u16e7": -1, "\u16e8": -3, "\u16e9": -2.5, "\u16ea": -4, "\u16eb": -1.5, "\u16ec": -1, "\u16ed": -3, "\u16ee": -3, "\u16ef": -3, "\u16f0": -3, "\u16f1": -3, "\u16f2": -3, "\u16f3": -4, "\u16f4": -2.5, "\u16f5": -1.5, "\u16f6": -3, "\u16f7": -3, "\u16f8": -3, "\u263a": -3, "\u263b": -4, "\u2639": -3, "\u05da": -3, "\u05f3": -1.5, "\u05f4": -2.5, "\u05f0": -2, "\u05f1": -2, "\u05f2": -2, "\u05be": -3, "\u05c3": -1, "\u05c6": -2, "\u1d00": -3, "\u0299": -3, "\u1d04": -3, "\u1d05": -3, "\u1d07": -3, "\ua730": -3, "\u0262": -3, "\u029c": -3, "\u1d0a": -3, "\u1d0b": -3, "\u029f": -3, "\u1d0d": -3, "\u0274": -3, "\u1d0f": -3, "\u1d18": -3, "\ua7af": -3, "\u0280": -3, "\ua731": -3, "\u1d1b": -3, "\u1d1c": -3, "\u1d20": -3, "\u1d21": -3, "\u028f": -3, "\u1d22": -3, "\u0271": -3, "\u0273": -3.5, "\u0272": -3.5, "\u0288": -2, "\u0256": -3.5, "\u0261": -3, "\u02a1": -3, "\u0255": -3, "\u0291": -3, "\u0278": -3, "\u029d": -3, "\u02a2": -3, "\u027b": -3.5, "\u0281": -3, "\u0266": -3, "\u028b": -3, "\u0270": -3, "\u026c": -2.5, "\u026e": -3, "\u0298": -3, "\u01c0": -1, "\u01c3": -1, "\u01c2": -3, "\u01c1": -2, "\u0253": -3, "\u0257": -3.5, "\u1d91": -3.5, "\u0284": -3.5, "\u0260": -3.5, "\u029b": -3.5, "\u0267": -3, "\u026b": -3, "\u0268": -2, "\u0289": -4, "\u028a": -3, "\u0258": -3, "\u0275": -3, "\u0264": -3, "\u025c": -3, "\u025e": -3, "\u0251": -3, "\u0252": -3, "\u025a": -4, "\u025d": -4, "\u0181": -4, "\u0189": -3.5, "\u0191": -3.5, "\u01a9": -3, "\u01b2": -3, "\u10a0": -3, "\u10a1": -4, "\u10a2": -4, "\u10a3": -3, "\u10a4": -3, "\u10a5": -4, "\u10a6": -4, "\u10a7": -4, "\u10a8": -3, "\u10a9": -3, "\u10aa": -4, "\u10ab": -3.5, "\u10ac": -3, "\u10ad": -4, "\u10ae": -4, "\u10af": -3.5, "\u10b0": -4, "\u10b1": -3, "\u10b2": -3, "\u10b3": -4, "\u10b4": -3, "\u10b5": -3, "\u10b6": -3, "\u10b7": -3, "\u10b8": -3, "\u10b9": -3, "\u10ba": -3, "\u10bb": -4, "\u10bc": -3, "\u10bd": -3, "\u10be": -3, "\u10bf": -3, "\u10c0": -4, "\u10c1": -3, "\u10c2": -3, "\u10c3": -3, "\u10c4": -3, "\u10c5": -4, "\u10c7": -3, "\u10cd": -3, "\u10d0": -3, "\u10d1": -3, "\u10d2": -3, "\u10d3": -3, "\u10d4": -3, "\u10d5": -3, "\u10d6": -3, "\u10d7": -3, "\u10d8": -3, "\u10d9": -3, "\u10da": -4, "\u10db": -3, "\u10dc": -3, "\u10dd": -3, "\u10de": -3, "\u10df": -3, "\u10e0": -3, "\u10e1": -3, "\u10e2": -3, "\u10e3": -3, "\u10e4": -3, "\u10e5": -3, "\u10e6": -3, "\u10e7": -3, "\u10e8": -3, "\u10e9": -3, "\u10ea": -3, "\u10eb": -3, "\u10ec": -3, "\u10ed": -3, "\u10ee": -3, "\u10ef": -2.5, "\u10f0": -3, "\u10f1": -3.5, "\u10f2": -3, "\u10f3": -3, "\u10f4": -3, "\u10f5": -3, "\u10f6": -3, "\u10f7": -3, "\u10f8": -3, "\u10f9": -3, "\u10fa": -3, "\u10fb": -2, "\u10fc": -2, "\u10fd": -3, "\u10fe": -3, "\u10ff": -3, "\ufb4a": -3, "\ufb2b": -3, "\ufb4e": -3, "\ufb44": -3, "\ufb3b": -2.5, "\ufb1f": -2, "\ufb1d": -1, "\ufb4b": -1.5, "\ufb35": -2, "\ufb4c": -3, "\ufb31": -3, "\ua727": -3, "\ua726": -3, "\u027a": -3, "\u2c71": -4, "\u02a0": -3.5, "\u0297": -3, "\u0296": -3, "\u026d": -1.5, "\u0277": -4, "\u027f": -3, "\u0285": -3, "\u0286": -3.5, "\u0293": -3, "\u029a": -3, "\u20aa": -4, "\u20be": -3.5, "\u058a": -3, "\u2d00": -3, "\u2d01": -3.5, "\u2d02": -3.5, "\u2d03": -3, "\u2d04": -3, "\u2d05": -3, "\u2d06": -3.5, "\u2d21": -3, "\u2d07": -3, "\u2d08": -3, "\u2d09": -3, "\u2d0a": -3, "\u2d0b": -3, "\u2d0c": -3, "\u2d22": -3, "\u2d0d": -3, "\u2d0e": -3.5, "\u2d0f": -3.5, "\u2d10": -3, "\u2d11": -3, "\u2d12": -3, "\u2d23": -3, "\u2d13": -3, "\u2d14": -3, "\u2d15": -3, "\u2d16": -3, "\u2d17": -3, "\u2d18": -3, "\u2d19": -3, "\u2d1a": -3, "\u2d1b": -3, "\u2d1c": -3, "\u2d1d": -3.5, "\u2d1e": -3, "\u2d24": -3, "\u2d1f": -3, "\u2d20": -3, "\u2d25": -3, "\u215b": -4.5, "\u215c": -4.5, "\u215d": -4.5, "\u215e": -4.5, "\u2153": -4.5, "\u2154": -4.5, "\u2709": -4, "\u2602": -4, "\u2614": -4, "\u2604": -4, "\u26c4": -3.5, "\u2603": -4, "\u231b": -4, "\u231a": -4, "\u2690": -4, "\u270e": -4, "\u2763": -3, "\u2664": -3, "\u2667": -3, "\u2661": -3, "\u2662": -3, "\u26c8": -4.5, "\u2630": -3, "\u2631": -3, "\u2633": -3, "\u2634": -3, "\u2636": -3, "\u2637": -3, "\u2194": -4.5, "\u21d2": -4.5, "\u21cf": -4.5, "\u21d4": -4.5, "\u21f5": -3.5, "\u2200": -4, "\u2203": -3, "\u2204": -3, "\u2209": -3, "\u220b": -3, "\u220c": -3, "\u2282": -3, "\u2283": -3, "\u2284": -3, "\u2285": -3, "\u2227": -3, "\u2228": -3, "\u22bb": -3, "\u22bc": -3, "\u22bd": -3, "\u2225": -2, "\u2262": -3.5, "\u22c6": -2, "\u2211": -3, "\u22a4": -3, "\u22a5": -3, "\u22a2": -3, "\u22a8": -3, "\u2254": -4, "\u2201": -2.5, "\u2234": -3, "\u2235": -3, "\u221b": -4, "\u221c": -4, "\u2202": -3, "\u22c3": -3, "\u2286": -3, "\u2287": -3, "\u25a1": -3, "\u25b3": -3, "\u25b7": -3.5, "\u25bd": -3, "\u25c1": -3.5, "\u25c6": -3, "\u25c7": -3, "\u25cb": -3, "\u25ce": -4, "\u2606": -4, "\u2605": -4, "\u2718": -3.5, "\u2080": -2.5, "\u2081": -2, "\u2082": -2.5, "\u2083": -2.5, "\u2084": -2.5, "\u2085": -2.5, "\u2086": -2.5, "\u2087": -2.5, "\u2088": -2.5, "\u2089": -2.5, "\u208a": -2, "\u208b": -2, "\u208c": -2, "\u208d": -1.5, "\u208e": -1.5, "\u222b": -3, "\u222e": -3, "\u221d": -3.5, "\u2300": -4, "\u2302": -4, "\u2318": -4, "\u3012": -3, "\u027c": -3, "\u0184": -3.5, "\u0185": -3.5, "\u1e9f": -3, "\u023d": -3.5, "\u019a": -2, "\u019b": -3, "\u0220": -3, "\u019e": -3, "\u019f": -3, "\u01a7": -3, "\u01a8": -3, "\u01aa": -3, "\u01b8": -3, "\u01b9": -3, "\u01bb": -3, "\u01bc": -3, "\u01bd": -3, "\u01be": -3, "\u0221": -4, "\u0234": -2, "\u0235": -4, "\u0236": -2.5, "\u023a": -3, "\u2c65": -3.5, "\u023b": -3, "\u023c": -3, "\u0246": -3, "\u0247": -3.5, "\u023e": -3, "\u2c66": -3, "\u0241": -3, "\u0242": -3, "\u0243": -3.5, "\u0244": -4, "\u0248": -3.5, "\u0249": -3.5, "\u024a": -3.5, "\u024b": -3.5, "\u024c": -3.5, "\u024d": -3.5, "\u024e": -4, "\u024f": -4, "\u1e9c": -2.5, "\u1e9d": -2.5, "\u1efc": -3, "\u1efd": -2.5, "\u1efe": -3, "\u1eff": -3.5, "\ua7a8": -3.5, "\ua7a9": -3, "\ud800\udf30": -3, "\ud800\udf31": -3, "\ud800\udf32": -3, "\ud800\udf33": -3, "\ud800\udf34": -3, "\ud800\udf35": -3, "\ud800\udf36": -3, "\ud800\udf37": -3, "\ud800\udf38": -3, "\ud800\udf39": -1, "\ud800\udf3a": -3, "\ud800\udf3b": -3, "\ud800\udf3c": -3, "\ud800\udf3d": -3, "\ud800\udf3e": -3, "\ud800\udf3f": -3, "\ud800\udf40": -3, "\ud800\udf41": -3, "\ud800\udf42": -3, "\ud800\udf43": -3, "\ud800\udf44": -3, "\ud800\udf45": -3, "\ud800\udf46": -3, "\ud800\udf47": -3, "\ud800\udf48": -3, "\ud800\udf49": -3, "\ud800\udf4a": -3, "\ud83c\udf27": -4.5, "\ud83d\udd25": -3.5, "\ud83c\udf0a": -4.5, "\u2150": -4.5, "\u2151": -4.5, "\u2155": -4.5, "\u2156": -4.5, "\u2157": -4.5, "\u2159": -4, "\u215a": -4, "\u215f": -3.5, "\u2189": -4.5, "\ud83d\udde1": -4.5, "\ud83c\udff9": -4.5, "\ud83e\ude93": -3.5, "\ud83d\udd31": -4.5, "\ud83c\udfa3": -4.5, "\ud83e\uddea": -4, "\u2697": -4, "\u2bea": -4, "\u2beb": -4, "\u2c6d": -3, "\ud83d\udee1": -4, "\u2702": -4, "\ud83c\udf56": -4.5, "\ud83e\udea3": -4, "\ud83d\udd14": -4, "\u23f3": -4, "\u2691": -4, "\u20a0": -3, "\u20a1": -3, "\u20a2": -3, "\u20a3": -3.5, "\u20a4": -3, "\u20a5": -3, "\u20a6": -4, "\u20a9": -4, "\u20ab": -3.5, "\u20ad": -3.5, "\u20ae": -3, "\u20b0": -3, "\u20b1": -4, "\u20b2": -3, "\u20b3": -4, "\u20b5": -3, "\u20b6": -3, "\u20b7": -4, "\u20b8": -3, "\u20b9": -3, "\u20ba": -3.5, "\u20bb": -4, "\u20bc": -3, "\u20bf": -3 } } ] } ================================================ FILE: base/assets/gm4/font/offscreen.json ================================================ { "providers": [ { "type": "space", "advances": { "0": 6, "1": 6, "2": 6, "3": 6, "4": 6, "5": 6, "6": 6, "7": 6, "8": 6, "9": 6, "\u0000": 9, "\u0001": 9, "\u0002": 9, "\u0003": 9, "\u0004": 9, "\u0005": 9, "\u0006": 9, "\u0007": 9, "\b": 9, "\t": 9, "\n": 9, "\u000b": 9, "\f": 9, "\r": 9, "\u000e": 9, "\u000f": 9, "\u0010": 9, "\u0011": 9, "\u0012": 9, "\u0013": 9, "\u0014": 9, "\u0015": 9, "\u0016": 9, "\u0017": 9, "\u0018": 9, "\u0019": 9, "\u001a": 9, "\u001b": 9, "\u001c": 9, "\u001d": 9, "\u001e": 9, "\u001f": 9, " ": 4, "!": 2, "\"": 4, "#": 6, "$": 6, "%": 6, "&": 6, "'": 2, "(": 4, ")": 4, "*": 4, "+": 6, ",": 2, "-": 6, ".": 2, "/": 6, ":": 2, ";": 2, "<": 5, "=": 6, ">": 5, "?": 6, "@": 7, "A": 6, "B": 6, "C": 6, "D": 6, "E": 6, "F": 6, "G": 6, "H": 6, "I": 4, "J": 6, "K": 6, "L": 6, "M": 6, "N": 6, "O": 6, "P": 6, "Q": 6, "R": 6, "S": 6, "T": 6, "U": 6, "V": 6, "W": 6, "X": 6, "Y": 6, "Z": 6, "[": 4, "\\": 6, "]": 4, "^": 6, "_": 6, "`": 3, "a": 6, "b": 6, "c": 6, "d": 6, "e": 6, "f": 5, "g": 6, "h": 6, "i": 2, "j": 6, "k": 5, "l": 3, "m": 6, "n": 6, "o": 6, "p": 6, "q": 6, "r": 6, "s": 6, "t": 4, "u": 6, "v": 6, "w": 6, "x": 6, "y": 6, "z": 6, "{": 4, "|": 2, "}": 4, "~": 7, "\u007f": 9, "\u0080": 9, "\u0081": 9, "\u0082": 9, "\u0083": 9, "\u0084": 9, "\u0085": 9, "\u0086": 9, "\u0087": 9, "\u0088": 9, "\u0089": 9, "\u008a": 9, "\u008b": 9, "\u008c": 9, "\u008d": 9, "\u008e": 9, "\u008f": 9, "\u0090": 9, "\u0091": 9, "\u0092": 9, "\u0093": 9, "\u0094": 9, "\u0095": 9, "\u0096": 9, "\u0097": 9, "\u0098": 9, "\u0099": 9, "\u009a": 9, "\u009b": 9, "\u009c": 9, "\u009d": 9, "\u009e": 9, "\u009f": 9, "\u00a0": 9, "\u00a1": 2, "\u00a2": 6, "\u00a3": 6, "\u00a4": 8, "\u00a5": 6, "\u00a6": 2, "\u00a7": 6, "\u00a8": 4, "\u00a9": 8, "\u00aa": 5, "\u00ab": 7, "\u00ac": 6, "\u00ad": 4, "\u00ae": 8, "\u00af": 6, "\u00b0": 5, "\u00b1": 6, "\u00b2": 5, "\u00b3": 5, "\u00b4": 3, "\u00b5": 6, "\u00b6": 7, "\u00b7": 2, "\u00b8": 2, "\u00b9": 4, "\u00ba": 5, "\u00bb": 7, "\u00bc": 8, "\u00bd": 8, "\u00be": 8, "\u00bf": 6, "\u00c0": 6, "\u00c1": 6, "\u00c2": 6, "\u00c3": 6, "\u00c4": 6, "\u00c5": 6, "\u00c6": 10, "\u00c7": 6, "\u00c8": 6, "\u00c9": 6, "\u00ca": 6, "\u00cb": 6, "\u00cc": 4, "\u00cd": 4, "\u00ce": 4, "\u00cf": 4, "\u00d0": 7, "\u00d1": 6, "\u00d2": 6, "\u00d3": 6, "\u00d4": 6, "\u00d5": 6, "\u00d6": 6, "\u00d7": 6, "\u00d8": 6, "\u00d9": 6, "\u00da": 6, "\u00db": 6, "\u00dc": 6, "\u00dd": 6, "\u00de": 6, "\u00df": 6, "\u00e0": 6, "\u00e1": 6, "\u00e2": 6, "\u00e3": 6, "\u00e4": 6, "\u00e5": 6, "\u00e6": 10, "\u00e7": 6, "\u00e8": 6, "\u00e9": 6, "\u00ea": 6, "\u00eb": 6, "\u00ec": 3, "\u00ed": 3, "\u00ee": 4, "\u00ef": 4, "\u00f0": 6, "\u00f1": 6, "\u00f2": 6, "\u00f3": 6, "\u00f4": 6, "\u00f5": 6, "\u00f6": 6, "\u00f7": 6, "\u00f8": 6, "\u00f9": 6, "\u00fa": 6, "\u00fb": 6, "\u00fc": 6, "\u00fd": 6, "\u00fe": 6, "\u00ff": 6, "\u0192": 6, "\u2591": 8, "\u2592": 9, "\u2593": 9, "\u2502": 6, "\u2524": 6, "\u2561": 6, "\u2562": 8, "\u2556": 8, "\u2555": 6, "\u2563": 8, "\u2551": 8, "\u2557": 8, "\u255d": 8, "\u255c": 8, "\u255b": 6, "\u2510": 6, "\u2514": 9, "\u2534": 9, "\u252c": 9, "\u251c": 9, "\u2500": 9, "\u253c": 9, "\u255e": 9, "\u255f": 9, "\u255a": 9, "\u2554": 9, "\u2569": 9, "\u2566": 9, "\u2560": 9, "\u2550": 9, "\u256c": 9, "\u2567": 9, "\u2568": 9, "\u2564": 9, "\u2565": 9, "\u2559": 9, "\u2558": 9, "\u2552": 9, "\u2553": 9, "\u256b": 9, "\u256a": 9, "\u2518": 6, "\u250c": 9, "\u2588": 9, "\u2584": 9, "\u258c": 5, "\u2590": 9, "\u2580": 9, "\u2205": 8, "\u2208": 6, "\u2261": 7, "\u2265": 6, "\u2264": 6, "\u2320": 8, "\u2321": 5, "\u2248": 7, "\u2219": 6, "\u221a": 7, "\u207f": 5, "\u25a0": 6, "\u0100": 6, "\u0101": 6, "\u0102": 6, "\u0103": 6, "\u0104": 6, "\u0105": 6, "\u0106": 6, "\u0107": 6, "\u0108": 6, "\u0109": 6, "\u010a": 6, "\u010b": 6, "\u010c": 6, "\u010d": 6, "\u010e": 6, "\u010f": 8, "\u0110": 7, "\u0111": 7, "\u0112": 6, "\u0113": 6, "\u0114": 6, "\u0115": 6, "\u0116": 6, "\u0117": 6, "\u0118": 6, "\u0119": 6, "\u011a": 6, "\u011b": 6, "\u011c": 6, "\u011d": 6, "\u1e20": 6, "\u1e21": 6, "\u011e": 6, "\u011f": 6, "\u0120": 6, "\u0121": 6, "\u0122": 6, "\u0123": 6, "\u0124": 6, "\u0125": 6, "\u0126": 8, "\u0127": 7, "\u0128": 5, "\u0129": 5, "\u012a": 4, "\u012b": 4, "\u012c": 5, "\u012d": 5, "\u012e": 4, "\u012f": 3, "\u0130": 4, "\u0131": 2, "\u0134": 6, "\u0135": 6, "\u0136": 6, "\u0137": 5, "\u0139": 6, "\u013a": 3, "\u013b": 6, "\u013c": 3, "\u013d": 6, "\u013e": 4, "\u013f": 6, "\u0140": 4, "\u0141": 7, "\u0142": 5, "\u0143": 6, "\u0144": 6, "\u0145": 6, "\u0146": 6, "\u0147": 6, "\u0148": 6, "\u014a": 6, "\u014b": 6, "\u014c": 6, "\u014d": 6, "\u014e": 6, "\u014f": 6, "\u0150": 6, "\u0151": 6, "\u0152": 10, "\u0153": 10, "\u0154": 6, "\u0155": 6, "\u0156": 6, "\u0157": 6, "\u0158": 6, "\u0159": 6, "\u015a": 6, "\u015b": 6, "\u015c": 6, "\u015d": 6, "\u015e": 6, "\u015f": 6, "\u0160": 6, "\u0161": 6, "\u0162": 6, "\u0163": 4, "\u0164": 6, "\u0165": 5, "\u0166": 6, "\u0167": 4, "\u0168": 6, "\u0169": 6, "\u016a": 6, "\u016b": 6, "\u016c": 6, "\u016d": 6, "\u016e": 6, "\u016f": 6, "\u0170": 6, "\u0171": 6, "\u0172": 6, "\u0173": 6, "\u0174": 6, "\u0175": 6, "\u0176": 6, "\u0177": 6, "\u0178": 6, "\u0179": 6, "\u017a": 6, "\u017b": 6, "\u017c": 6, "\u017d": 6, "\u017e": 6, "\u01fc": 10, "\u01fd": 10, "\u01fe": 6, "\u01ff": 6, "\u0218": 6, "\u0219": 6, "\u021a": 6, "\u021b": 4, "\u0386": 8, "\u0388": 8, "\u0389": 8, "\u038a": 6, "\u038c": 8, "\u038e": 8, "\u038f": 8, "\u0390": 6, "\u03aa": 4, "\u03ab": 6, "\u03ac": 6, "\u03ad": 6, "\u03ae": 6, "\u03af": 3, "\u03b0": 6, "\u03ca": 4, "\u03cb": 6, "\u03cc": 6, "\u03cd": 6, "\u03ce": 8, "\u0400": 6, "\u0401": 6, "\u0403": 6, "\u0407": 4, "\u040c": 6, "\u040d": 6, "\u040e": 6, "\u0419": 6, "\u0439": 6, "\u0450": 6, "\u0451": 6, "\u0452": 7, "\u0453": 5, "\u0457": 4, "\u045b": 7, "\u045c": 5, "\u045d": 6, "\u045e": 6, "\u045f": 6, "\u0490": 6, "\u0491": 6, "\u1e02": 6, "\u1e03": 6, "\u1e0a": 6, "\u1e0b": 6, "\u1e1e": 6, "\u1e1f": 5, "\u1e22": 6, "\u1e23": 6, "\u1e30": 6, "\u1e31": 5, "\u1e40": 6, "\u1e41": 6, "\u1e56": 6, "\u1e57": 6, "\u1e60": 6, "\u1e61": 6, "\u1e6a": 6, "\u1e6b": 4, "\u1e80": 6, "\u1e81": 6, "\u1e82": 6, "\u1e83": 6, "\u1e84": 6, "\u1e85": 6, "\u1ef2": 6, "\u1ef3": 6, "\u0149": 8, "\u01e7": 6, "\u01eb": 6, "\u040f": 6, "\u1e0d": 6, "\u1e25": 6, "\u1e5b": 6, "\u1e6d": 4, "\u1e92": 6, "\u1eca": 4, "\u1ecb": 2, "\u1ecc": 6, "\u1ecd": 6, "\u1ee4": 6, "\u1ee5": 6, "\u2116": 10, "\u0207": 6, "\u0194": 6, "\u0263": 6, "\u0283": 6, "\u2047": 10, "\u01f1": 10, "\u01f2": 10, "\u01f3": 10, "\u01c4": 10, "\u01c5": 10, "\u01c6": 10, "\u01c7": 10, "\u01c8": 10, "\u01ca": 10, "\u01cb": 10, "\u01cc": 10, "\u2139": 10, "\u1d6b": 10, "\ua732": 10, "\ua733": 10, "\ua734": 10, "\ua735": 10, "\ua736": 10, "\ua737": 10, "\ua738": 10, "\ua73a": 10, "\ua73c": 10, "\ua73d": 9, "\ua74e": 10, "\ua74f": 10, "\ua760": 6, "\ua761": 6, "\ufb04": 10, "\ufb06": 10, "\u16a1": 5, "\u16b5": 5, "\u01a0": 8, "\u01a1": 8, "\u01af": 8, "\u01b0": 8, "\u1eae": 6, "\u1eaf": 6, "\u1ea4": 6, "\u1ea5": 6, "\u1ebe": 6, "\u1ebf": 6, "\u1ed1": 6, "\u1eda": 8, "\u1edb": 8, "\u1ee8": 8, "\u1ee9": 8, "\u1eb0": 6, "\u1eb1": 6, "\u1ea6": 6, "\u1ea7": 6, "\u1ec0": 6, "\u1ec1": 6, "\u1ed3": 6, "\u1edc": 8, "\u1edd": 8, "\u1eea": 8, "\u1eeb": 8, "\u1ea2": 6, "\u1ea3": 6, "\u1eb2": 6, "\u1eb3": 6, "\u1ea8": 6, "\u1ea9": 6, "\u1eba": 6, "\u1ebb": 6, "\u1ed5": 6, "\u1ede": 8, "\u1ec2": 6, "\u1ec3": 6, "\u1ec8": 4, "\u1ec9": 4, "\u1ece": 6, "\u1ecf": 6, "\u1ed4": 6, "\u1edf": 8, "\u1ee6": 6, "\u1ee7": 6, "\u1eec": 8, "\u1eed": 8, "\u1ef6": 6, "\u1ef7": 6, "\u1ea0": 6, "\u1ea1": 6, "\u1eb6": 6, "\u1eb7": 6, "\u1eac": 6, "\u1ead": 6, "\u1eb8": 6, "\u1eb9": 6, "\u1ec6": 6, "\u1ec7": 6, "\u1ed8": 6, "\u1ed9": 6, "\u1ee2": 8, "\u1ee3": 8, "\u1ef0": 8, "\u1ef1": 8, "\u1ef4": 6, "\u1ef5": 6, "\u1ed0": 6, "\u0195": 9, "\u1eaa": 6, "\u1eab": 6, "\u1ed6": 6, "\u1ed7": 6, "\u1eef": 8, "\u261e": 10, "\u261c": 10, "\u262e": 10, "\u1eb4": 6, "\u1eb5": 6, "\u1ebc": 6, "\u1ebd": 6, "\u1ec4": 6, "\u1ec5": 6, "\u1ed2": 6, "\u1ee0": 8, "\u1ee1": 8, "\u1eee": 8, "\u1ef8": 6, "\u1ef9": 6, "\u0498": 6, "\u0499": 6, "\u04a0": 7, "\u04a1": 6, "\u04aa": 6, "\u04ab": 6, "\u01f6": 9, "\u26a0": 10, "\u24ea": 10, "\u2460": 10, "\u2461": 10, "\u2462": 10, "\u2463": 10, "\u2464": 10, "\u2465": 10, "\u2466": 10, "\u2467": 10, "\u2468": 10, "\u2469": 10, "\u246a": 10, "\u246b": 10, "\u246c": 10, "\u246d": 10, "\u246e": 10, "\u246f": 10, "\u2470": 10, "\u2471": 10, "\u2472": 10, "\u2473": 10, "\u24b6": 10, "\u24b7": 10, "\u24b8": 10, "\u24b9": 10, "\u24ba": 10, "\u24bb": 10, "\u24bc": 10, "\u24bd": 10, "\u24be": 10, "\u24bf": 10, "\u24c0": 10, "\u24c1": 10, "\u24c2": 10, "\u24c3": 10, "\u24c4": 10, "\u24c5": 10, "\u24c6": 10, "\u24c7": 10, "\u24c8": 10, "\u24c9": 10, "\u24ca": 10, "\u24cb": 10, "\u24cc": 10, "\u24cd": 10, "\u24ce": 10, "\u24cf": 10, "\u24d0": 10, "\u24d1": 10, "\u24d2": 10, "\u24d3": 10, "\u24d4": 10, "\u24d5": 10, "\u24d6": 10, "\u24d7": 10, "\u24d8": 10, "\u24d9": 10, "\u24da": 10, "\u24db": 10, "\u24dc": 10, "\u24dd": 10, "\u24de": 10, "\u24df": 10, "\u24e0": 10, "\u24e1": 10, "\u24e2": 10, "\u24e3": 10, "\u24e4": 10, "\u24e5": 10, "\u24e6": 10, "\u24e7": 10, "\u24e8": 10, "\u24e9": 10, "\u0327": 3, "\u0282": 6, "\u0290": 7, "\u0276": 10, "\u01cd": 6, "\u01ce": 6, "\u01de": 6, "\u01df": 6, "\u01fa": 6, "\u01fb": 6, "\u0202": 6, "\u0203": 6, "\u0226": 6, "\u0227": 6, "\u01e0": 6, "\u01e1": 6, "\u1e00": 6, "\u1e01": 6, "\u0200": 6, "\u0201": 6, "\u1e06": 6, "\u1e07": 6, "\u1e04": 6, "\u1e05": 6, "\u1d6c": 8, "\u1e08": 6, "\u1e09": 6, "\u1e10": 6, "\u1e11": 6, "\u1e12": 6, "\u1e13": 6, "\u1e0e": 6, "\u1e0f": 6, "\u1e0c": 6, "\u1d6d": 8, "\u1e14": 6, "\u1e15": 6, "\u1e16": 6, "\u1e17": 6, "\u1e18": 6, "\u1e19": 6, "\u1e1c": 6, "\u1e1d": 6, "\u0228": 6, "\u0229": 6, "\u1e1a": 6, "\u1e1b": 6, "\u0204": 6, "\u0205": 6, "\u0206": 6, "\u1d6e": 6, "\u01f4": 6, "\u01f5": 6, "\u01e6": 6, "\u1e26": 6, "\u1e27": 6, "\u1e28": 6, "\u1e29": 6, "\u1e2a": 6, "\u1e2b": 6, "\u021e": 6, "\u021f": 6, "\u1e24": 6, "\u1e96": 6, "\u1e2e": 4, "\u1e2f": 4, "\u020a": 5, "\u020b": 5, "\u01cf": 4, "\u01d0": 4, "\u0208": 6, "\u0209": 6, "\u1e2c": 5, "\u1e2d": 5, "\u01f0": 6, "\u0237": 6, "\u01e8": 6, "\u01e9": 5, "\u1e32": 6, "\u1e33": 5, "\u1e34": 6, "\u1e35": 5, "\u1e3a": 6, "\u1e3b": 4, "\u1e3c": 6, "\u1e3d": 4, "\u1e36": 6, "\u1e37": 3, "\u1e38": 6, "\u1e39": 4, "\u2c62": 8, "\u1e3e": 6, "\u1e3f": 6, "\u1e42": 6, "\u1e43": 6, "\u1d6f": 8, "\u1e44": 6, "\u1e45": 6, "\u1e46": 6, "\u1e47": 6, "\u1e4a": 6, "\u1e4b": 6, "\u01f8": 6, "\u01f9": 6, "\u1e48": 6, "\u1e49": 6, "\u1d70": 8, "\u01ec": 6, "\u01ed": 6, "\u022c": 6, "\u022d": 6, "\u1e4c": 6, "\u1e4d": 6, "\u1e4e": 6, "\u1e4f": 6, "\u1e50": 6, "\u1e51": 6, "\u1e52": 6, "\u1e53": 6, "\u020e": 6, "\u020f": 6, "\u022a": 6, "\u022b": 6, "\u01d1": 6, "\u01d2": 6, "\u022e": 6, "\u022f": 6, "\u0230": 6, "\u0231": 6, "\u020c": 6, "\u020d": 6, "\u01ea": 6, "\u1e54": 6, "\u1e55": 6, "\u1d71": 8, "\u0212": 6, "\u0213": 6, "\u1e58": 6, "\u1e59": 6, "\u1e5c": 6, "\u1e5d": 6, "\u1e5e": 6, "\u1e5f": 6, "\u0210": 6, "\u0211": 6, "\u1e5a": 6, "\u1d73": 8, "\u1d72": 8, "\u1e64": 6, "\u1e65": 6, "\u1e66": 6, "\u1e67": 6, "\u1e62": 6, "\u1e63": 6, "\u1e68": 6, "\u1e69": 6, "\u1d74": 8, "\u1e70": 6, "\u1e71": 4, "\u1e6e": 6, "\u1e6f": 4, "\u1e6c": 6, "\u1e97": 4, "\u1d75": 6, "\u1e72": 6, "\u1e73": 6, "\u1e76": 6, "\u1e77": 6, "\u1e78": 6, "\u1e79": 6, "\u1e7a": 6, "\u1e7b": 6, "\u01d3": 6, "\u01d4": 6, "\u01d5": 6, "\u01d6": 6, "\u01d7": 6, "\u01d8": 6, "\u01d9": 6, "\u01da": 6, "\u01db": 6, "\u01dc": 6, "\u1e74": 6, "\u1e75": 6, "\u0214": 6, "\u0215": 6, "\u0216": 6, "\u1e7e": 6, "\u1e7f": 6, "\u1e7c": 6, "\u1e7d": 6, "\u1e86": 6, "\u1e87": 6, "\u1e88": 6, "\u1e89": 6, "\u1e98": 6, "\u1e8c": 6, "\u1e8d": 6, "\u1e8a": 6, "\u1e8b": 6, "\u0232": 6, "\u0233": 6, "\u1e8e": 6, "\u1e8f": 6, "\u1e99": 6, "\u1e94": 6, "\u1e95": 6, "\u1e90": 6, "\u1e91": 6, "\u1e93": 6, "\u1d76": 6, "\u01ee": 6, "\u01ef": 6, "\u1e9b": 4, "\ua73e": 6, "\ua73f": 6, "\u01e2": 10, "\u01e3": 10, "\u1d7a": 9, "\u1efb": 7, "\u1d02": 10, "\u1d14": 10, "\uab63": 10, "\u0238": 10, "\u02a3": 10, "\u02a5": 10, "\u02a4": 10, "\u02a9": 10, "\u02aa": 8, "\u02ab": 8, "\u0239": 10, "\u02a8": 9, "\u02a6": 9, "\u02a7": 8, "\uab50": 6, "\uab51": 6, "\u20a7": 10, "\u1efa": 8, "\ufb2e": 6, "\ufb2f": 6, "\u0180": 7, "\u0182": 6, "\u0183": 6, "\u0187": 7, "\u0188": 7, "\u018a": 8, "\u018b": 6, "\u018c": 6, "\u0193": 7, "\u01e4": 7, "\u01e5": 7, "\u0197": 4, "\u0196": 4, "\u0269": 3, "\u0198": 6, "\u0199": 5, "\u019d": 7, "\u01a4": 8, "\u01a5": 6, "\u027d": 6, "\u01a6": 6, "\u01ac": 7, "\u01ad": 4, "\u01ab": 4, "\u01ae": 6, "\u0217": 6, "\u01b1": 6, "\u019c": 6, "\u01b3": 7, "\u01b4": 8, "\u01b5": 6, "\u01b6": 6, "\u01a2": 8, "\u01a3": 8, "\u0222": 6, "\u0223": 6, "\u02ad": 6, "\u02ae": 7, "\u02af": 8, "\ufb14": 10, "\ufb15": 10, "\ufb17": 10, "\ufb16": 10, "\ufb13": 10, "\u04d0": 6, "\u04d1": 6, "\u04d2": 6, "\u04d3": 6, "\u04f6": 6, "\u04f7": 5, "\u0494": 6, "\u0495": 5, "\u04d6": 6, "\u04d7": 6, "\u04bc": 8, "\u04bd": 8, "\u04be": 8, "\u04bf": 8, "\u04da": 6, "\u04db": 6, "\u04dc": 8, "\u04dd": 6, "\u04c1": 8, "\u04c2": 6, "\u04de": 6, "\u04df": 6, "\u04e2": 6, "\u04e3": 6, "\u04e4": 6, "\u04e5": 6, "\u04e6": 6, "\u04e7": 6, "\u04ea": 6, "\u04eb": 6, "\u04f0": 6, "\u04f1": 6, "\u04ee": 6, "\u04ef": 6, "\u04f2": 6, "\u04f3": 6, "\u04f4": 6, "\u04f5": 6, "\u04f8": 8, "\u04f9": 7, "\u04ec": 6, "\u04ed": 6, "\u0476": 7, "\u0477": 7, "\u04d4": 10, "\u04fa": 7, "\u0502": 9, "\ua682": 6, "\ua680": 7, "\ua688": 7, "\u052a": 10, "\u052c": 7, "\ua684": 10, "\u0504": 8, "\u0510": 6, "\u04e0": 6, "\u0506": 7, "\u048a": 7, "\u04c3": 6, "\u049e": 7, "\u049c": 6, "\u051e": 6, "\u051a": 6, "\u04c5": 7, "\u052e": 7, "\u0512": 6, "\u0520": 9, "\u0508": 9, "\u0514": 9, "\u04cd": 7, "\u04c9": 7, "\u0528": 7, "\u04c7": 6, "\u04a4": 7, "\u0522": 9, "\u050a": 9, "\u04a8": 7, "\u0524": 7, "\u04a6": 9, "\u048e": 6, "\u0516": 9, "\u050c": 6, "\ua690": 6, "\u04ac": 6, "\ua68a": 7, "\ua68c": 6, "\u050e": 7, "\u04b2": 7, "\u04fc": 6, "\u04fe": 6, "\u0526": 7, "\ua694": 6, "\u04b4": 8, "\ua68e": 7, "\u04b6": 7, "\u04cb": 6, "\u04b8": 6, "\ua692": 7, "\ua696": 9, "\ua686": 6, "\u048c": 7, "\u0518": 10, "\u051c": 6, "\u04d5": 10, "\u04fb": 6, "\u0503": 9, "\ua683": 6, "\ua681": 7, "\ua689": 7, "\u052b": 10, "\u052d": 7, "\ua685": 9, "\u0505": 8, "\u0511": 6, "\u04e1": 6, "\u0507": 7, "\u048b": 7, "\u04c4": 5, "\u049f": 6, "\u049d": 6, "\u051f": 6, "\u051b": 6, "\u04c6": 7, "\u052f": 7, "\u0513": 6, "\u0521": 9, "\u0509": 9, "\u0515": 9, "\u04ce": 7, "\u04ca": 7, "\u0529": 7, "\u04c8": 6, "\u04a5": 7, "\u0523": 9, "\u050b": 9, "\u04a9": 7, "\u0525": 7, "\u04a7": 9, "\u048f": 6, "\u0517": 9, "\u050d": 6, "\ua691": 6, "\u04ad": 6, "\ua68b": 7, "\ua68d": 6, "\u050f": 7, "\u04b3": 7, "\u04fd": 6, "\u04ff": 6, "\u0527": 7, "\ua695": 6, "\u04b5": 7, "\ua68f": 6, "\u04b7": 7, "\u04cc": 6, "\u04b9": 6, "\ua693": 7, "\ua697": 7, "\ua687": 6, "\u048d": 7, "\u0519": 10, "\u051d": 6, "\u1f08": 9, "\u1f00": 6, "\u1f09": 9, "\u1f01": 6, "\u1f0a": 10, "\u1f02": 6, "\u1f0b": 10, "\u1f03": 6, "\u1f0c": 10, "\u1f04": 6, "\u1f0d": 10, "\u1f05": 7, "\u1f0e": 9, "\u1f06": 6, "\u1f0f": 9, "\u1f07": 6, "\u1fba": 9, "\u1f70": 6, "\u1fb8": 6, "\u1fb0": 6, "\u1fb9": 6, "\u1fb1": 6, "\u1fbb": 9, "\u1f71": 6, "\u1f88": 9, "\u1f80": 6, "\u1f89": 9, "\u1f81": 6, "\u1f8a": 10, "\u1f82": 6, "\u1f8b": 10, "\u1f83": 6, "\u1f8c": 10, "\u1f84": 6, "\u1f8d": 10, "\u1f85": 6, "\u1f8e": 9, "\u1f86": 6, "\u1f8f": 9, "\u1f87": 6, "\u1fbc": 6, "\u1fb4": 6, "\u1fb6": 6, "\u1fb7": 6, "\u1fb2": 6, "\u1fb3": 6, "\u1f18": 9, "\u1f10": 6, "\u1f19": 9, "\u1f11": 6, "\u1f1a": 10, "\u1f12": 6, "\u1f1b": 10, "\u1f13": 6, "\u1f1c": 10, "\u1f14": 6, "\u1f1d": 10, "\u1f15": 6, "\u1fc8": 9, "\u1fc9": 9, "\u1f72": 6, "\u1f73": 6, "\u1f28": 9, "\u1f20": 6, "\u1fca": 9, "\u1f74": 6, "\u1f29": 9, "\u1f21": 6, "\u1f2a": 10, "\u1f22": 6, "\u1f2b": 10, "\u1f23": 6, "\u1f2c": 10, "\u1f24": 6, "\u1f2d": 10, "\u1f25": 6, "\u1f2e": 9, "\u1f26": 6, "\u1f2f": 9, "\u1f27": 6, "\u1f98": 9, "\u1f90": 6, "\u1f99": 9, "\u1f91": 6, "\u1f9a": 10, "\u1f92": 6, "\u1f9b": 10, "\u1f93": 6, "\u1f9c": 10, "\u1f94": 6, "\u1f9d": 10, "\u1f95": 6, "\u1f9e": 9, "\u1f96": 6, "\u1f9f": 9, "\u1f97": 6, "\u1fcb": 9, "\u1f75": 6, "\u1fcc": 6, "\u1fc3": 6, "\u1fc2": 6, "\u1fc4": 6, "\u1fc6": 6, "\u1fc7": 6, "\u1fda": 7, "\u1f76": 4, "\u1fdb": 7, "\u1f77": 3, "\u1f38": 7, "\u1f30": 4, "\u1f39": 10, "\u1f31": 3, "\u1f3a": 9, "\u1f32": 6, "\u1f3b": 8, "\u1f33": 6, "\u1f3c": 9, "\u1f34": 6, "\u1f3d": 8, "\u1f35": 6, "\u1f3e": 7, "\u1f36": 5, "\u1f3f": 7, "\u1f37": 5, "\u1fd8": 5, "\u1fd0": 5, "\u1fd9": 4, "\u1fd1": 4, "\u1fd2": 4, "\u1fd3": 4, "\u1fd6": 5, "\u1fd7": 5, "\u1ff8": 9, "\u1f78": 6, "\u1ff9": 9, "\u1f79": 6, "\u1f48": 9, "\u1f40": 6, "\u1f49": 9, "\u1f41": 6, "\u1f4a": 10, "\u1f42": 6, "\u1f4b": 10, "\u1f43": 6, "\u1f4c": 10, "\u1f44": 6, "\u1f4d": 10, "\u1f45": 6, "\u1fec": 9, "\u1fe4": 6, "\u1fe5": 6, "\u1fea": 9, "\u1f7a": 6, "\u1feb": 9, "\u1f7b": 6, "\u1f59": 9, "\u1f51": 6, "\u1f5b": 10, "\u1f53": 6, "\u1f5d": 10, "\u1f55": 6, "\u1f5f": 9, "\u1f57": 6, "\u1fe8": 6, "\u1fe0": 6, "\u1fe9": 6, "\u1fe1": 6, "\u03d3": 10, "\u03d4": 7, "\u1fe2": 6, "\u1fe3": 6, "\u1fe7": 6, "\u1f50": 6, "\u1f52": 6, "\u1f54": 6, "\u1fe6": 6, "\u1f56": 6, "\u1ffa": 9, "\u1f7c": 8, "\u1ffb": 9, "\u1f7d": 8, "\u1f68": 9, "\u1f60": 8, "\u1f69": 9, "\u1f61": 8, "\u1f6a": 10, "\u1f62": 8, "\u1f6b": 10, "\u1f63": 8, "\u1f6c": 10, "\u1f64": 8, "\u1f6d": 10, "\u1f65": 8, "\u1f6e": 9, "\u1f66": 8, "\u1f6f": 10, "\u1f67": 8, "\u1fa8": 9, "\u1fa0": 8, "\u1fa9": 9, "\u1fa1": 8, "\u1faa": 10, "\u1fa2": 8, "\u1fab": 10, "\u1fa3": 8, "\u1fac": 10, "\u1fa4": 8, "\u1fad": 10, "\u1fa5": 8, "\u1fae": 9, "\u1fa6": 8, "\u1faf": 10, "\u1fa7": 8, "\u1ffc": 6, "\u1ff3": 8, "\u1ff2": 8, "\u1ff4": 8, "\u1ff6": 8, "\u1ff7": 8, "\u262f": 10, "\u2610": 10, "\u2611": 10, "\u2612": 10, "\u018d": 6, "\u01ba": 6, "\u2c7e": 6, "\u023f": 6, "\u2c7f": 6, "\u0240": 6, "\u1d80": 6, "\ua7c4": 6, "\ua794": 6, "\u1d81": 7, "\u1d82": 5, "\u1d83": 7, "\ua795": 7, "\u1d84": 6, "\u1d85": 3, "\u1d86": 7, "\u1d87": 7, "\u1d88": 6, "\u1d89": 6, "\u1d8a": 6, "\u1d8b": 6, "\u1d8c": 6, "\u1d8d": 7, "\ua7c6": 7, "\u1d8e": 7, "\u1d8f": 7, "\u1d90": 7, "\u1d92": 7, "\u1d93": 7, "\u1d94": 6, "\u1d95": 7, "\u1d96": 3, "\u1d97": 7, "\u1d98": 6, "\u1d99": 7, "\u1d9a": 6, "\u1e9a": 6, "\u2152": 10, "\u2158": 10, "\u20a8": 10, "\u20af": 10, "\u2030": 8, "\u20b4": 8, "\u2260": 6, "\u04bb": 6, "\u0391": 6, "\u0392": 6, "\u0393": 6, "\u0394": 6, "\u0395": 6, "\u0396": 6, "\u0397": 6, "\u0398": 6, "\u0399": 4, "\u039a": 6, "\u039b": 6, "\u039c": 6, "\u039d": 6, "\u039e": 6, "\u039f": 6, "\u03a0": 6, "\u03a1": 6, "\u03a3": 6, "\u03a4": 6, "\u03a5": 6, "\u03a6": 6, "\u03a7": 6, "\u03a8": 6, "\u03a9": 6, "\u03b1": 6, "\u03b2": 6, "\u03b3": 6, "\u03b4": 6, "\u03b5": 6, "\u03b6": 6, "\u03b7": 6, "\u03b8": 6, "\u03b9": 3, "\u03ba": 5, "\u03bb": 6, "\u03bc": 6, "\u03bd": 6, "\u03be": 6, "\u03bf": 6, "\u03c0": 6, "\u03c1": 6, "\u03c2": 6, "\u03c3": 7, "\u03c4": 6, "\u03c5": 6, "\u03c6": 6, "\u03c7": 6, "\u03c8": 6, "\u03c9": 8, "\u0402": 8, "\u0405": 6, "\u0406": 4, "\u0408": 6, "\u0409": 8, "\u040a": 7, "\u040b": 7, "\u0410": 6, "\u0411": 6, "\u0412": 6, "\u0413": 6, "\u0414": 7, "\u0415": 6, "\u0416": 8, "\u0417": 6, "\u0418": 6, "\u041a": 6, "\u041b": 6, "\u041c": 6, "\u041d": 6, "\u041e": 6, "\u041f": 6, "\u0420": 6, "\u0421": 6, "\u0422": 6, "\u0423": 6, "\u0424": 8, "\u0425": 6, "\u0426": 7, "\u0427": 6, "\u0428": 8, "\u0429": 9, "\u042a": 7, "\u042b": 8, "\u042c": 6, "\u042d": 6, "\u042e": 8, "\u042f": 6, "\u0430": 6, "\u0431": 6, "\u0432": 6, "\u0433": 5, "\u0434": 7, "\u0435": 6, "\u0436": 6, "\u0437": 6, "\u0438": 6, "\u043a": 5, "\u043b": 6, "\u043c": 6, "\u043d": 6, "\u043e": 6, "\u043f": 6, "\u0440": 6, "\u0441": 6, "\u0442": 6, "\u0443": 6, "\u0444": 6, "\u0445": 6, "\u0446": 6, "\u0447": 6, "\u0448": 6, "\u0449": 7, "\u044a": 7, "\u044b": 7, "\u044c": 6, "\u044d": 6, "\u044e": 8, "\u044f": 6, "\u0454": 6, "\u0455": 6, "\u0456": 2, "\u0458": 6, "\u0459": 8, "\u045a": 7, "\u2013": 7, "\u2014": 9, "\u2018": 3, "\u2019": 3, "\u201c": 5, "\u201d": 5, "\u201e": 5, "\u2026": 8, "\u204a": 5, "\u2190": 8, "\u2191": 6, "\u2192": 8, "\u2193": 6, "\u21c4": 8, "\uff0b": 6, "\u018f": 6, "\u0259": 6, "\u025b": 6, "\u026a": 4, "\u04ae": 6, "\u04af": 6, "\u04e8": 6, "\u04e9": 6, "\u02bb": 2, "\u02cc": 2, "\u037e": 2, "\u0138": 5, "\u1e9e": 6, "\u20bd": 7, "\u20ac": 7, "\u0462": 7, "\u0463": 7, "\u0474": 7, "\u0475": 7, "\u04c0": 4, "\u0472": 6, "\u0473": 6, "\u2070": 5, "\u2074": 5, "\u2075": 5, "\u2076": 5, "\u2077": 5, "\u2078": 5, "\u2079": 5, "\u207a": 4, "\u207b": 4, "\u207c": 4, "\u207d": 3, "\u207e": 3, "\u2071": 2, "\u2122": 9, "\u0294": 6, "\u0295": 6, "\u29c8": 8, "\u2694": 8, "\u2620": 8, "\u049a": 7, "\u049b": 6, "\u0492": 7, "\u0493": 6, "\u04b0": 6, "\u04b1": 6, "\u04d8": 6, "\u04d9": 6, "\u0496": 9, "\u0497": 7, "\u04a2": 7, "\u04a3": 7, "\u04ba": 6, "\u05d0": 6, "\u05d1": 6, "\u05d2": 5, "\u05d3": 6, "\u05d4": 6, "\u05d5": 2, "\u05d6": 4, "\u05d7": 6, "\u05d8": 6, "\u05d9": 2, "\u05db": 6, "\u05dc": 6, "\u05de": 6, "\u05dd": 6, "\u05e0": 4, "\u05df": 2, "\u05e1": 6, "\u05e2": 6, "\u05e4": 6, "\u05e3": 6, "\u05e6": 6, "\u05e5": 6, "\u05e7": 6, "\u05e8": 6, "\u0387": 2, "\u2010": 4, "\u201a": 3, "\u2020": 6, "\u2021": 6, "\u2022": 3, "\u2031": 9, "\u2032": 3, "\u2033": 5, "\u2034": 7, "\u2035": 3, "\u2036": 5, "\u2037": 7, "\u2039": 4, "\u203a": 4, "\u203b": 8, "\u203c": 4, "\u203d": 6, "\u2042": 8, "\u2048": 8, "\u2049": 8, "\u204b": 7, "\u204e": 4, "\u204f": 2, "\u2051": 4, "\u2052": 4, "\u2057": 9, "\u2117": 8, "\u2212": 6, "\u2213": 6, "\u221e": 8, "\u2600": 9, "\u2601": 9, "\u2608": 8, "\u0404": 6, "\u2632": 6, "\u2635": 6, "\u263d": 9, "\u2640": 4, "\u2642": 6, "\u26a5": 6, "\u2660": 6, "\u2663": 6, "\u2665": 6, "\u2666": 6, "\u2669": 4, "\u266a": 6, "\u266b": 8, "\u266c": 8, "\u266d": 4, "\u266e": 4, "\u266f": 6, "\u2680": 8, "\u2681": 8, "\u2682": 8, "\u2683": 8, "\u2684": 8, "\u2685": 8, "\u02ac": 6, "\u26a1": 6, "\u26cf": 9, "\u2714": 7, "\u2744": 8, "\u274c": 7, "\u2764": 8, "\u2b50": 8, "\u2e18": 6, "\u2e2e": 6, "\u2e35": 2, "\u2e38": 6, "\u2e41": 2, "\u2e4b": 6, "\u295d": 6, "\u1614": 6, "\u0190": 6, "\u07c8": 6, "\u03db": 6, "\u3125": 6, "\u2c6f": 6, "\u15fa": 6, "\u0186": 6, "\u15e1": 6, "\u018e": 6, "\u2132": 6, "\u2141": 6, "\ua7b0": 6, "\ua780": 6, "\u0500": 6, "\ua779": 6, "\u1d1a": 6, "\u27d8": 6, "\u2229": 6, "\u0245": 6, "\u2144": 6, "\u0250": 6, "\u0254": 6, "\u01dd": 6, "\u025f": 5, "\u1d77": 6, "\u0265": 6, "\u1d09": 2, "\u027e": 6, "\u029e": 5, "\ua781": 3, "\u026f": 6, "\u0279": 6, "\u0287": 4, "\u028c": 6, "\u028d": 6, "\u028e": 6, "\u0531": 6, "\u0532": 6, "\u0533": 7, "\u0534": 7, "\u0536": 6, "\u0537": 6, "\u0539": 7, "\u053a": 7, "\u053b": 6, "\u053c": 5, "\u053d": 7, "\u053e": 6, "\u053f": 6, "\u0540": 6, "\u0541": 6, "\u0542": 7, "\u0543": 6, "\u0544": 7, "\u0545": 6, "\u0546": 6, "\u0547": 6, "\u0548": 6, "\u0549": 6, "\u054b": 6, "\u054c": 7, "\u054d": 6, "\u054e": 6, "\u054f": 6, "\u0550": 6, "\u0551": 6, "\u0552": 5, "\u0553": 6, "\u0554": 6, "\u0555": 6, "\u0556": 6, "\u0559": 3, "\u0561": 6, "\u0562": 6, "\u0563": 7, "\u0564": 7, "\u0565": 6, "\u0566": 7, "\u0567": 5, "\u0568": 6, "\u0569": 6, "\u056a": 7, "\u056b": 6, "\u056c": 3, "\u056d": 7, "\u056e": 6, "\u056f": 6, "\u0570": 6, "\u0571": 6, "\u0572": 7, "\u0573": 6, "\u0574": 7, "\u0575": 6, "\u0576": 7, "\u0577": 6, "\u0578": 6, "\u0579": 6, "\u057a": 6, "\u057b": 6, "\u057c": 6, "\u057d": 6, "\u057e": 7, "\u057f": 8, "\u0580": 6, "\u0581": 6, "\u0582": 5, "\u0583": 8, "\u0584": 7, "\u0585": 6, "\u0586": 6, "\u0587": 7, "\u05e9": 6, "\u05ea": 6, "\u0538": 6, "\u055a": 3, "\u055b": 3, "\u055c": 4, "\u055d": 3, "\u055e": 4, "\u055f": 6, "\u0560": 6, "\u0588": 7, "\u058f": 6, "\u017f": 4, "\u01b7": 6, "\u0292": 6, "\u01f7": 6, "\u01bf": 6, "\u021c": 6, "\u021d": 6, "\u0224": 6, "\u0225": 6, "\u02d9": 2, "\ua75a": 6, "\ua75b": 5, "\u2011": 4, "\u214b": 6, "\u23cf": 6, "\u23e9": 7, "\u23ea": 7, "\u23ed": 8, "\u23ee": 8, "\u23ef": 7, "\u23f4": 4, "\u23f5": 4, "\u23f6": 6, "\u23f7": 6, "\u23f8": 4, "\u23f9": 6, "\u23fa": 6, "\u23fb": 8, "\u23fc": 8, "\u23fd": 2, "\u2b58": 8, "\u25b2": 6, "\u25b6": 7, "\u25bc": 6, "\u25c0": 7, "\u25cf": 5, "\u25e6": 4, "\u25d8": 4, "\u2693": 8, "\u26e8": 8, "\u0132": 6, "\u0133": 5, "\u01c9": 8, "\ua728": 8, "\ua729": 7, "\ua739": 9, "\ua73b": 9, "\ufb00": 8, "\ufb01": 6, "\ufb02": 7, "\ufb03": 9, "\ufb05": 6, "\ufffd": 8, "\u0535": 6, "\u054a": 6, "\u16a0": 5, "\u16a2": 6, "\u16a3": 6, "\u16a4": 6, "\u16a5": 6, "\u16a6": 5, "\u16a7": 5, "\u16a8": 4, "\u16a9": 5, "\u16aa": 5, "\u16ab": 5, "\u16ac": 6, "\u16ad": 4, "\u16ae": 4, "\u16af": 6, "\u16b0": 6, "\u16b1": 5, "\u16b2": 4, "\u16b3": 5, "\u16b4": 5, "\u16b6": 6, "\u16b7": 6, "\u16b8": 6, "\u16b9": 5, "\u16ba": 6, "\u16bb": 6, "\u16bc": 6, "\u16bd": 4, "\u16be": 6, "\u16bf": 4, "\u16c0": 6, "\u16c1": 2, "\u16c2": 4, "\u16c3": 7, "\u16c4": 6, "\u16c5": 6, "\u16c6": 4, "\u16c7": 6, "\u16c8": 5, "\u16c9": 6, "\u16ca": 4, "\u16cb": 6, "\u16cc": 2, "\u16cd": 4, "\u16ce": 6, "\u16cf": 6, "\u16d0": 4, "\u16d1": 5, "\u16d2": 5, "\u16d3": 4, "\u16d4": 5, "\u16d5": 5, "\u16d6": 6, "\u16d7": 6, "\u16d8": 6, "\u16d9": 4, "\u16da": 4, "\u16db": 5, "\u16dc": 6, "\u16dd": 6, "\u16de": 6, "\u16df": 7, "\u16e0": 8, "\u16e1": 6, "\u16e2": 8, "\u16e3": 6, "\u16e4": 6, "\u16e5": 6, "\u16e6": 6, "\u16e7": 2, "\u16e8": 6, "\u16e9": 5, "\u16ea": 8, "\u16eb": 3, "\u16ec": 2, "\u16ed": 6, "\u16ee": 6, "\u16ef": 6, "\u16f0": 6, "\u16f1": 6, "\u16f2": 6, "\u16f3": 8, "\u16f4": 5, "\u16f5": 3, "\u16f6": 6, "\u16f7": 6, "\u16f8": 6, "\u263a": 6, "\u263b": 8, "\u2639": 6, "\u05da": 6, "\u05f3": 3, "\u05f4": 5, "\u05f0": 4, "\u05f1": 4, "\u05f2": 4, "\u05be": 6, "\u05c3": 2, "\u05c6": 4, "\u1d00": 6, "\u0299": 6, "\u1d04": 6, "\u1d05": 6, "\u1d07": 6, "\ua730": 6, "\u0262": 6, "\u029c": 6, "\u1d0a": 6, "\u1d0b": 6, "\u029f": 6, "\u1d0d": 6, "\u0274": 6, "\u1d0f": 6, "\u1d18": 6, "\ua7af": 6, "\u0280": 6, "\ua731": 6, "\u1d1b": 6, "\u1d1c": 6, "\u1d20": 6, "\u1d21": 6, "\u028f": 6, "\u1d22": 6, "\u0271": 6, "\u0273": 7, "\u0272": 7, "\u0288": 4, "\u0256": 7, "\u0261": 6, "\u02a1": 6, "\u0255": 6, "\u0291": 6, "\u0278": 6, "\u029d": 6, "\u02a2": 6, "\u027b": 7, "\u0281": 6, "\u0266": 6, "\u028b": 6, "\u0270": 6, "\u026c": 5, "\u026e": 6, "\u0298": 6, "\u01c0": 2, "\u01c3": 2, "\u01c2": 6, "\u01c1": 4, "\u0253": 6, "\u0257": 7, "\u1d91": 7, "\u0284": 7, "\u0260": 7, "\u029b": 7, "\u0267": 6, "\u026b": 6, "\u0268": 4, "\u0289": 8, "\u028a": 6, "\u0258": 6, "\u0275": 6, "\u0264": 6, "\u025c": 6, "\u025e": 6, "\u0251": 6, "\u0252": 6, "\u025a": 8, "\u025d": 8, "\u0181": 8, "\u0189": 7, "\u0191": 7, "\u01a9": 6, "\u01b2": 6, "\u10a0": 6, "\u10a1": 8, "\u10a2": 8, "\u10a3": 6, "\u10a4": 6, "\u10a5": 8, "\u10a6": 8, "\u10a7": 8, "\u10a8": 6, "\u10a9": 6, "\u10aa": 8, "\u10ab": 7, "\u10ac": 6, "\u10ad": 8, "\u10ae": 8, "\u10af": 7, "\u10b0": 8, "\u10b1": 6, "\u10b2": 6, "\u10b3": 8, "\u10b4": 6, "\u10b5": 6, "\u10b6": 6, "\u10b7": 6, "\u10b8": 6, "\u10b9": 6, "\u10ba": 6, "\u10bb": 8, "\u10bc": 6, "\u10bd": 6, "\u10be": 6, "\u10bf": 6, "\u10c0": 8, "\u10c1": 6, "\u10c2": 6, "\u10c3": 6, "\u10c4": 6, "\u10c5": 8, "\u10c7": 6, "\u10cd": 6, "\u10d0": 6, "\u10d1": 6, "\u10d2": 6, "\u10d3": 6, "\u10d4": 6, "\u10d5": 6, "\u10d6": 6, "\u10d7": 6, "\u10d8": 6, "\u10d9": 6, "\u10da": 8, "\u10db": 6, "\u10dc": 6, "\u10dd": 6, "\u10de": 6, "\u10df": 6, "\u10e0": 6, "\u10e1": 6, "\u10e2": 6, "\u10e3": 6, "\u10e4": 6, "\u10e5": 6, "\u10e6": 6, "\u10e7": 6, "\u10e8": 6, "\u10e9": 6, "\u10ea": 6, "\u10eb": 6, "\u10ec": 6, "\u10ed": 6, "\u10ee": 6, "\u10ef": 5, "\u10f0": 6, "\u10f1": 7, "\u10f2": 6, "\u10f3": 6, "\u10f4": 6, "\u10f5": 6, "\u10f6": 6, "\u10f7": 6, "\u10f8": 6, "\u10f9": 6, "\u10fa": 6, "\u10fb": 4, "\u10fc": 4, "\u10fd": 6, "\u10fe": 6, "\u10ff": 6, "\ufb4a": 6, "\ufb2b": 6, "\ufb4e": 6, "\ufb44": 6, "\ufb3b": 5, "\ufb1f": 4, "\ufb1d": 2, "\ufb4b": 3, "\ufb35": 4, "\ufb4c": 6, "\ufb31": 6, "\ua727": 6, "\ua726": 6, "\u027a": 6, "\u2c71": 8, "\u02a0": 7, "\u0297": 6, "\u0296": 6, "\u026d": 3, "\u0277": 8, "\u027f": 6, "\u0285": 6, "\u0286": 7, "\u0293": 6, "\u029a": 6, "\u20aa": 8, "\u20be": 7, "\u058a": 6, "\u2d00": 6, "\u2d01": 7, "\u2d02": 7, "\u2d03": 6, "\u2d04": 6, "\u2d05": 6, "\u2d06": 7, "\u2d21": 6, "\u2d07": 6, "\u2d08": 6, "\u2d09": 6, "\u2d0a": 6, "\u2d0b": 6, "\u2d0c": 6, "\u2d22": 6, "\u2d0d": 6, "\u2d0e": 7, "\u2d0f": 7, "\u2d10": 6, "\u2d11": 6, "\u2d12": 6, "\u2d23": 6, "\u2d13": 6, "\u2d14": 6, "\u2d15": 6, "\u2d16": 6, "\u2d17": 6, "\u2d18": 6, "\u2d19": 6, "\u2d1a": 6, "\u2d1b": 6, "\u2d1c": 6, "\u2d1d": 7, "\u2d1e": 6, "\u2d24": 6, "\u2d1f": 6, "\u2d20": 6, "\u2d25": 6, "\u215b": 9, "\u215c": 9, "\u215d": 9, "\u215e": 9, "\u2153": 9, "\u2154": 9, "\u2709": 8, "\u2602": 8, "\u2614": 8, "\u2604": 8, "\u26c4": 7, "\u2603": 8, "\u231b": 8, "\u231a": 8, "\u2690": 8, "\u270e": 8, "\u2763": 6, "\u2664": 6, "\u2667": 6, "\u2661": 6, "\u2662": 6, "\u26c8": 9, "\u2630": 6, "\u2631": 6, "\u2633": 6, "\u2634": 6, "\u2636": 6, "\u2637": 6, "\u2194": 9, "\u21d2": 9, "\u21cf": 9, "\u21d4": 9, "\u21f5": 7, "\u2200": 8, "\u2203": 6, "\u2204": 6, "\u2209": 6, "\u220b": 6, "\u220c": 6, "\u2282": 6, "\u2283": 6, "\u2284": 6, "\u2285": 6, "\u2227": 6, "\u2228": 6, "\u22bb": 6, "\u22bc": 6, "\u22bd": 6, "\u2225": 4, "\u2262": 7, "\u22c6": 4, "\u2211": 6, "\u22a4": 6, "\u22a5": 6, "\u22a2": 6, "\u22a8": 6, "\u2254": 8, "\u2201": 5, "\u2234": 6, "\u2235": 6, "\u221b": 8, "\u221c": 8, "\u2202": 6, "\u22c3": 6, "\u2286": 6, "\u2287": 6, "\u25a1": 6, "\u25b3": 6, "\u25b7": 7, "\u25bd": 6, "\u25c1": 7, "\u25c6": 6, "\u25c7": 6, "\u25cb": 6, "\u25ce": 8, "\u2606": 8, "\u2605": 8, "\u2718": 7, "\u2080": 5, "\u2081": 4, "\u2082": 5, "\u2083": 5, "\u2084": 5, "\u2085": 5, "\u2086": 5, "\u2087": 5, "\u2088": 5, "\u2089": 5, "\u208a": 4, "\u208b": 4, "\u208c": 4, "\u208d": 3, "\u208e": 3, "\u222b": 6, "\u222e": 6, "\u221d": 7, "\u2300": 8, "\u2302": 8, "\u2318": 8, "\u3012": 6, "\u027c": 6, "\u0184": 7, "\u0185": 7, "\u1e9f": 6, "\u023d": 7, "\u019a": 4, "\u019b": 6, "\u0220": 6, "\u019e": 6, "\u019f": 6, "\u01a7": 6, "\u01a8": 6, "\u01aa": 6, "\u01b8": 6, "\u01b9": 6, "\u01bb": 6, "\u01bc": 6, "\u01bd": 6, "\u01be": 6, "\u0221": 8, "\u0234": 4, "\u0235": 8, "\u0236": 5, "\u023a": 6, "\u2c65": 7, "\u023b": 6, "\u023c": 6, "\u0246": 6, "\u0247": 7, "\u023e": 6, "\u2c66": 6, "\u0241": 6, "\u0242": 6, "\u0243": 7, "\u0244": 8, "\u0248": 7, "\u0249": 7, "\u024a": 7, "\u024b": 7, "\u024c": 7, "\u024d": 7, "\u024e": 8, "\u024f": 8, "\u1e9c": 5, "\u1e9d": 5, "\u1efc": 6, "\u1efd": 5, "\u1efe": 6, "\u1eff": 7, "\ua7a8": 7, "\ua7a9": 6, "\ud800\udf30": 6, "\ud800\udf31": 6, "\ud800\udf32": 6, "\ud800\udf33": 6, "\ud800\udf34": 6, "\ud800\udf35": 6, "\ud800\udf36": 6, "\ud800\udf37": 6, "\ud800\udf38": 6, "\ud800\udf39": 2, "\ud800\udf3a": 6, "\ud800\udf3b": 6, "\ud800\udf3c": 6, "\ud800\udf3d": 6, "\ud800\udf3e": 6, "\ud800\udf3f": 6, "\ud800\udf40": 6, "\ud800\udf41": 6, "\ud800\udf42": 6, "\ud800\udf43": 6, "\ud800\udf44": 6, "\ud800\udf45": 6, "\ud800\udf46": 6, "\ud800\udf47": 6, "\ud800\udf48": 6, "\ud800\udf49": 6, "\ud800\udf4a": 6, "\ud83c\udf27": 9, "\ud83d\udd25": 7, "\ud83c\udf0a": 9, "\u2150": 9, "\u2151": 9, "\u2155": 9, "\u2156": 9, "\u2157": 9, "\u2159": 8, "\u215a": 8, "\u215f": 7, "\u2189": 9, "\ud83d\udde1": 9, "\ud83c\udff9": 9, "\ud83e\ude93": 7, "\ud83d\udd31": 9, "\ud83c\udfa3": 9, "\ud83e\uddea": 8, "\u2697": 8, "\u2bea": 8, "\u2beb": 8, "\u2c6d": 6, "\ud83d\udee1": 8, "\u2702": 8, "\ud83c\udf56": 9, "\ud83e\udea3": 8, "\ud83d\udd14": 8, "\u23f3": 8, "\u2691": 8, "\u20a0": 6, "\u20a1": 6, "\u20a2": 6, "\u20a3": 7, "\u20a4": 6, "\u20a5": 6, "\u20a6": 8, "\u20a9": 8, "\u20ab": 7, "\u20ad": 7, "\u20ae": 6, "\u20b0": 6, "\u20b1": 8, "\u20b2": 6, "\u20b3": 8, "\u20b5": 6, "\u20b6": 6, "\u20b7": 8, "\u20b8": 6, "\u20b9": 6, "\u20ba": 7, "\u20bb": 8, "\u20bc": 6, "\u20bf": 6 } } ] } ================================================ FILE: base/assets/gm4/lang/en_us.json ================================================ { "gm4.second": "%2$s" } ================================================ FILE: base/assets/gm4/models/block/cube_with_plate.json ================================================ { "parent": "minecraft:block/cube", "elements": [ { "name": "plate", "from": [ 1.0, 16.0, 1.0 ], "to": [ 15.0, 17.0, 15.0 ], "faces": { "north": { "texture": "#plate", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "east": { "texture": "#plate", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "south": { "texture": "#plate", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "west": { "texture": "#plate", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "up": { "texture": "#plate", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }, "down": { "texture": "#plate", "uv": [ 1.0, 1.0, 15.0, 15.0 ] } } }, { "name": "cube", "from": [ 0.0, 0.0, 0.0 ], "to": [ 16.0, 16.0, 16.0 ], "faces": { "north": { "texture": "#front", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, "east": { "texture": "#side", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, "south": { "texture": "#side", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, "west": { "texture": "#side", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, "up": { "texture": "#top", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, "down": { "texture": "#bottom", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } } } ] } ================================================ FILE: base/assets/gm4/models/block/plate.json ================================================ { "elements": [ { "name": "plate", "from": [ 1.0, 16.0, 1.0 ], "to": [ 15.0, 17.0, 15.0 ], "faces": { "north": { "texture": "#top", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "east": { "texture": "#top", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "south": { "texture": "#top", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "west": { "texture": "#top", "uv": [ 1.0, 0.0, 15.0, 1.0 ] }, "up": { "texture": "#top", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }, "down": { "texture": "#top", "uv": [ 1.0, 1.0, 15.0, 15.0 ] } } } ] } ================================================ FILE: base/assets/minecraft/atlases/items.json ================================================ { "sources": [ { "type": "directory", "source": "gui", "prefix": "gui/" }, { "type": "filter", "pattern":{ "namespace": "^((?!gm4).)*$", "path": "gui" } }, { "type": "filter", "pattern": { "namespace": "gm4_*", "path": "gui/container" } }, { "type": "filter", "pattern": { "namespace": "gm4_guidebook", "path": "gui/" } } ] } ================================================ FILE: base/assets/minecraft/optifine/emissive.properties ================================================ suffix.emissive=_e ================================================ FILE: base/assets/translations.csv ================================================ key,en_us advancement.gm4.root.title,Gamemode 4 advancement.gm4.root.description,Semi-funny blurb about GM4 ================================================ FILE: base/beet.yaml ================================================ version: 1.9.0 id: gm4 data_pack: load: data: data resource_pack: load: assets: assets require: - gm4.plugins.resource_pack pipeline: - beet.contrib.babelbox - gm4.plugins.resource_pack.build - gm4.plugins.versioning.base meta: gm4: versioning: extra_version_injections: advancements: - 'gm4:intro_song/play_song' model_data: - item: command_block reference: gm4:gui/advancement/root template: generated babelbox: load: assets/translations.csv namespace: gm4_translations dialect: excel ================================================ FILE: base/data/gm4/advancement/intro_song/invisible_root.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:impossible" } } } ================================================ FILE: base/data/gm4/advancement/intro_song/play_song.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_intro_walked": { "min": 1, "max": 9999 } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$first_join" }, "score": "gm4_intro_song" }, "range": 1 } ] } } }, "rewards": { "function": "gm4:intro_song/init_song" } } ================================================ FILE: base/data/gm4/advancement/intro_song/welcome_toast.json ================================================ { "display": { "icon": { "id": "minecraft:command_block", "components": { "minecraft:custom_model_data": { "floats": [ 3420001 ] } } }, "title": { "translate": "advancement.gm4.welcome_toast.title", "fallback": "This world is enhanced by Gamemode 4!" }, "description": { "text": "This should not be seen." }, "show_toast": true, "announce_to_chat": false }, "parent": "gm4:intro_song/invisible_root", "criteria": { "requirement": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4" }, "score": "gm4_modules" }, "range": { "min": 1 } } ] } } } } ================================================ FILE: base/data/gm4/advancement/upgrade_paths/changed_dimension.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:changed_dimension", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$disable_upgrade_paths" }, "score": "gm4_data" }, "range": { "min": 1 } } } ] } } }, "rewards": { "function": "gm4:upgrade_paths/changed_dimension" } } ================================================ FILE: base/data/gm4/advancement/upgrade_paths/join_game.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_up_leave_game": { "min": 1 } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$disable_upgrade_paths" }, "score": "gm4_data" }, "range": { "min": 1 } } } ] } } }, "rewards": { "function": "gm4:upgrade_paths/join_game" } } ================================================ FILE: base/data/gm4/function/conflict_logs/traverse.mcfunction ================================================ execute store success score #not_match gm4_data run data modify storage gm4:log traverse_versions[0].id set from storage gm4:log log.require_id execute if data storage gm4:log traverse_versions[0].from run data modify storage gm4:log temp set value [{"text":" (packaged in ","color":"red"},{"nbt":"traverse_versions[0].from","storage":"gm4:log","color":"red"},{"text":")","color":"red"}] execute if score #not_match gm4_data matches 0 run tellraw @a[tag=gm4_show_log] [{"nbt":"log.module","storage":"gm4:log","color":"red"},{"text":" is disabled. It requires ","color":"red"},{"nbt":"log.require","storage":"gm4:log","color":"red"},{"text":" v","color":"red"},{"nbt":"log.require_ver","storage":"gm4:log"},{"text":" but ","color":"red"},{"nbt":"traverse_versions[0].module","storage":"gm4:log"},{"text":" v"},{"nbt":"traverse_versions[0].version","storage":"gm4:log","color":"red"},{"text":" is installed instead","color":"red"},{"nbt":"temp","storage":"gm4:log","interpret":true}] data remove storage gm4:log temp execute if score #not_match gm4_data matches 1 run data remove storage gm4:log traverse_versions[0] execute store result score #match_size gm4_data run data get storage gm4:log traverse_versions execute if score #not_match gm4_data matches 1 if score #match_size gm4_data matches 1.. run function gm4:conflict_logs/traverse ================================================ FILE: base/data/gm4/function/conflict_logs/version_conflict_start.mcfunction ================================================ data modify storage gm4:log traverse_versions set from storage gm4:log versions function gm4:conflict_logs/traverse execute if score #not_match gm4_data matches 1 run tellraw @a[tag=gm4_show_log] [{"nbt":"log.module","storage":"gm4:log","color":"red"},{"text":" is disabled. It requires ","color":"red"},{"nbt":"log.require","storage":"gm4:log","color":"red"},{"text":" v","color":"red"},{"nbt":"log.require_ver","storage":"gm4:log"},{"text":" but ?Unknown Version? is installed instead","color":"red"}] data remove storage gm4:log traverse_versions ================================================ FILE: base/data/gm4/function/intro_song/init.mcfunction ================================================ # Scoreboard init, non-standard init so it is here instead of init scoreboard objectives add gm4_intro_song dummy scoreboard objectives add gm4_intro_song_t dummy scoreboard objectives add gm4_intro_walked minecraft.custom:walk_one_cm # to enable intro song on first join, run # /scoreboard players set $first_join gm4_intro_song 1 execute unless score $first_join gm4_intro_song matches 0.. run scoreboard players set $first_join gm4_intro_song 0 advancement grant @a only gm4:intro_song/play_song ================================================ FILE: base/data/gm4/function/intro_song/init_song.mcfunction ================================================ # Setup all online players # run from base install function, gm4:load, or first join advancement, gm4:intro_song/play_song tag @s add gm4_intro_playing scoreboard players set @s gm4_intro_song -240 scoreboard players set @s gm4_intro_song_t -1 schedule function gm4:intro_song/main 1t ================================================ FILE: base/data/gm4/function/intro_song/main.mcfunction ================================================ # plays the intro song to all players online during first install of Gamemode 4 execute as @a[tag=gm4_intro_playing] at @s run function gm4:intro_song/play execute if score $song_playing gm4_intro_song matches 1.. run schedule function gm4:intro_song/main 1t scoreboard players reset $song_playing gm4_intro_song ================================================ FILE: base/data/gm4/function/intro_song/notes/0.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 scoreboard players set @s gm4_intro_song_t 0 ================================================ FILE: base/data/gm4/function/intro_song/notes/10.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 scoreboard players set @s gm4_intro_song_t 10 ================================================ FILE: base/data/gm4/function/intro_song/notes/12.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 scoreboard players set @s gm4_intro_song_t 12 ================================================ FILE: base/data/gm4/function/intro_song/notes/14.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 scoreboard players set @s gm4_intro_song_t 14 ================================================ FILE: base/data/gm4/function/intro_song/notes/16.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1 scoreboard players set @s gm4_intro_song_t 16 ================================================ FILE: base/data/gm4/function/intro_song/notes/20.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 scoreboard players set @s gm4_intro_song_t 20 ================================================ FILE: base/data/gm4/function/intro_song/notes/23.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.017480 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.017480 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.017480 1 scoreboard players set @s gm4_intro_song_t 23 ================================================ FILE: base/data/gm4/function/intro_song/notes/24.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.059463 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 scoreboard players set @s gm4_intro_song_t 24 ================================================ FILE: base/data/gm4/function/intro_song/notes/26.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 scoreboard players set @s gm4_intro_song_t 26 ================================================ FILE: base/data/gm4/function/intro_song/notes/28.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 scoreboard players set @s gm4_intro_song_t 28 ================================================ FILE: base/data/gm4/function/intro_song/notes/30.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.122462 1 scoreboard players set @s gm4_intro_song_t 30 ================================================ FILE: base/data/gm4/function/intro_song/notes/32.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.63 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.70 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 32 ================================================ FILE: base/data/gm4/function/intro_song/notes/35.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.943874 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.943874 1 scoreboard players set @s gm4_intro_song_t 35 ================================================ FILE: base/data/gm4/function/intro_song/notes/36.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.498307 1 scoreboard players set @s gm4_intro_song_t 36 ================================================ FILE: base/data/gm4/function/intro_song/notes/38.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 38 ================================================ FILE: base/data/gm4/function/intro_song/notes/39.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.017480 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.017480 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.017480 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.334840 1 scoreboard players set @s gm4_intro_song_t 39 ================================================ FILE: base/data/gm4/function/intro_song/notes/4.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.498307 1 scoreboard players set @s gm4_intro_song_t 4 ================================================ FILE: base/data/gm4/function/intro_song/notes/40.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.059463 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.059463 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.059463 1 scoreboard players set @s gm4_intro_song_t 40 ================================================ FILE: base/data/gm4/function/intro_song/notes/41.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1 scoreboard players set @s gm4_intro_song_t 41 ================================================ FILE: base/data/gm4/function/intro_song/notes/42.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.561231 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.122462 1 scoreboard players set @s gm4_intro_song_t 42 ================================================ FILE: base/data/gm4/function/intro_song/notes/43.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1 scoreboard players set @s gm4_intro_song_t 43 ================================================ FILE: base/data/gm4/function/intro_song/notes/44.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.72 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.80 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.561231 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.122462 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 44 ================================================ FILE: base/data/gm4/function/intro_song/notes/45.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.529732 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 1.059463 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.059463 1 scoreboard players set @s gm4_intro_song_t 45 ================================================ FILE: base/data/gm4/function/intro_song/notes/46.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.943874 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.943874 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 0.943874 1 scoreboard players set @s gm4_intro_song_t 46 ================================================ FILE: base/data/gm4/function/intro_song/notes/47.mcfunction ================================================ playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.840896 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.840896 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 0.840896 1 scoreboard players set @s gm4_intro_song_t 47 ================================================ FILE: base/data/gm4/function/intro_song/notes/48.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.60 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 48 ================================================ FILE: base/data/gm4/function/intro_song/notes/51.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.943874 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 1 0.943874 1 scoreboard players set @s gm4_intro_song_t 51 ================================================ FILE: base/data/gm4/function/intro_song/notes/52.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 52 ================================================ FILE: base/data/gm4/function/intro_song/notes/54.mcfunction ================================================ playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 54 ================================================ FILE: base/data/gm4/function/intro_song/notes/55.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.077982 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.017480 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.077982 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1 scoreboard players set @s gm4_intro_song_t 55 ================================================ FILE: base/data/gm4/function/intro_song/notes/56.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1 scoreboard players set @s gm4_intro_song_t 56 ================================================ FILE: base/data/gm4/function/intro_song/notes/58.mcfunction ================================================ playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.259921 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.259921 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1 scoreboard players set @s gm4_intro_song_t 58 ================================================ FILE: base/data/gm4/function/intro_song/notes/60.mcfunction ================================================ playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.50 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.334840 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.334840 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.334840 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 60 ================================================ FILE: base/data/gm4/function/intro_song/notes/62.mcfunction ================================================ playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 1.122462 1 playsound minecraft:block.note_block.harp record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1 scoreboard players set @s gm4_intro_song_t 62 ================================================ FILE: base/data/gm4/function/intro_song/notes/64.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.40 0.629961 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.40 0.629961 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.629961 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.40 0.629961 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.27 0.629961 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.629961 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 64 ================================================ FILE: base/data/gm4/function/intro_song/notes/65.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.50 0.667420 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.50 0.667420 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.667420 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.50 0.667420 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.36 0.667420 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.667420 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1 scoreboard players set @s gm4_intro_song_t 65 ================================================ FILE: base/data/gm4/function/intro_song/notes/66.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.60 0.707107 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.60 0.707107 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.707107 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.60 0.707107 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.45 0.707107 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.707107 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1 scoreboard players set @s gm4_intro_song_t 66 ================================================ FILE: base/data/gm4/function/intro_song/notes/67.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.54 0.749154 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.40 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1 scoreboard players set @s gm4_intro_song_t 67 ================================================ FILE: base/data/gm4/function/intro_song/notes/68.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.793701 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.793701 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.793701 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.793701 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.793701 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.793701 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1 scoreboard players set @s gm4_intro_song_t 68 ================================================ FILE: base/data/gm4/function/intro_song/notes/69.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.840896 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.840896 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.840896 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.840896 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.840896 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.840896 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.10 0.749154 1 scoreboard players set @s gm4_intro_song_t 69 ================================================ FILE: base/data/gm4/function/intro_song/notes/7.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.017480 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.017480 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.017480 1 scoreboard players set @s gm4_intro_song_t 7 ================================================ FILE: base/data/gm4/function/intro_song/notes/70.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.890899 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.890899 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.890899 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.890899 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.890899 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.890899 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 70 ================================================ FILE: base/data/gm4/function/intro_song/notes/71.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.80 0.943874 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 0.943874 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.943874 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.80 0.943874 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.63 0.943874 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.50 0.943874 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1 scoreboard players set @s gm4_intro_song_t 71 ================================================ FILE: base/data/gm4/function/intro_song/notes/72.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.000000 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.000000 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.000000 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.000000 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.000000 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.000000 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1 scoreboard players set @s gm4_intro_song_t 72 ================================================ FILE: base/data/gm4/function/intro_song/notes/73.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.059463 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.059463 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.059463 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.059463 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.059463 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.059463 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1 scoreboard players set @s gm4_intro_song_t 73 ================================================ FILE: base/data/gm4/function/intro_song/notes/74.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.122462 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.122462 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1 scoreboard players set @s gm4_intro_song_t 74 ================================================ FILE: base/data/gm4/function/intro_song/notes/75.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 0.90 1.189207 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.90 1.189207 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.60 1.189207 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 0.90 1.189207 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.72 1.189207 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.60 1.189207 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.10 0.749154 1 scoreboard players set @s gm4_intro_song_t 75 ================================================ FILE: base/data/gm4/function/intro_song/notes/76.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.259921 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.54 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.60 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.60 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.40 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.259921 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.snare record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.hat record @s ^0 ^ ^ 1 1.498307 1 scoreboard players set @s gm4_intro_song_t 76 ================================================ FILE: base/data/gm4/function/intro_song/notes/77.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.334840 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.334840 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.334840 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.334840 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.334840 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.334840 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.50 0.749154 1 scoreboard players set @s gm4_intro_song_t 77 ================================================ FILE: base/data/gm4/function/intro_song/notes/78.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.259921 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.259921 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.259921 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.259921 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.40 0.749154 1 scoreboard players set @s gm4_intro_song_t 78 ================================================ FILE: base/data/gm4/function/intro_song/notes/79.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.122462 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.81 1.122462 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 1.122462 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.30 0.749154 1 scoreboard players set @s gm4_intro_song_t 79 ================================================ FILE: base/data/gm4/function/intro_song/notes/8.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.059463 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 0.80 1.059463 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.80 1.059463 1 scoreboard players set @s gm4_intro_song_t 8 ================================================ FILE: base/data/gm4/function/intro_song/notes/80.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.70 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 0.20 0.749154 1 scoreboard players set @s gm4_intro_song_t 80 ================================================ FILE: base/data/gm4/function/intro_song/notes/84.mcfunction ================================================ playsound minecraft:block.note_block.guitar record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.bass record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 0.90 1.498307 1 playsound minecraft:block.note_block.bell record @s ^0 ^ ^ 1 1.511345 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.80 1.472567 1 playsound minecraft:block.note_block.chime record @s ^0 ^ ^ 0.70 1.498307 1 playsound minecraft:block.note_block.xylophone record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 0.90 1.498307 1 playsound minecraft:block.note_block.iron_xylophone record @s ^0 ^ ^ 0.80 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.flute record @s ^0 ^ ^ 1 1.498307 1 playsound minecraft:block.note_block.didgeridoo record @s ^0 ^ ^ 1 0.749154 1 playsound minecraft:block.note_block.pling record @s ^0 ^ ^ 0.90 0.749154 1 function gm4:intro_song/stop ================================================ FILE: base/data/gm4/function/intro_song/play.mcfunction ================================================ #execute store success score intro_listener gm4_intro_song run scoreboard players add @s gm4_intro_song 40 function gm4:intro_song/tree/0_127 scoreboard players set $song_playing gm4_intro_song 1 ================================================ FILE: base/data/gm4/function/intro_song/stop.mcfunction ================================================ tag @s remove gm4_intro_playing scoreboard players reset @s gm4_intro_song scoreboard players reset @s gm4_intro_song_t ================================================ FILE: base/data/gm4/function/intro_song/tree/0_1.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..120,gm4_intro_song_t=..-1}] run function gm4:intro_song/notes/0 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_127.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..5160}] run function gm4:intro_song/tree/0_63 execute if entity @s[scores={gm4_intro_song=5120..10360}] run function gm4:intro_song/tree/64_127 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_15.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..680}] run function gm4:intro_song/tree/0_7 execute if entity @s[scores={gm4_intro_song=640..1400}] run function gm4:intro_song/tree/8_15 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_3.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..200}] run function gm4:intro_song/tree/0_1 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_31.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..1320}] run function gm4:intro_song/tree/0_15 execute if entity @s[scores={gm4_intro_song=1280..2680}] run function gm4:intro_song/tree/16_31 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..2600}] run function gm4:intro_song/tree/0_31 execute if entity @s[scores={gm4_intro_song=2560..5240}] run function gm4:intro_song/tree/32_63 ================================================ FILE: base/data/gm4/function/intro_song/tree/0_7.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=0..360}] run function gm4:intro_song/tree/0_3 execute if entity @s[scores={gm4_intro_song=320..760}] run function gm4:intro_song/tree/4_7 ================================================ FILE: base/data/gm4/function/intro_song/tree/10_11.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=800..920,gm4_intro_song_t=..9}] run function gm4:intro_song/notes/10 ================================================ FILE: base/data/gm4/function/intro_song/tree/12_13.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=960..1080,gm4_intro_song_t=..11}] run function gm4:intro_song/notes/12 ================================================ FILE: base/data/gm4/function/intro_song/tree/12_15.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=960..1160}] run function gm4:intro_song/tree/12_13 execute if entity @s[scores={gm4_intro_song=1120..1400}] run function gm4:intro_song/tree/14_15 ================================================ FILE: base/data/gm4/function/intro_song/tree/14_15.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1120..1240,gm4_intro_song_t=..13}] run function gm4:intro_song/notes/14 ================================================ FILE: base/data/gm4/function/intro_song/tree/16_17.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1280..1400,gm4_intro_song_t=..15}] run function gm4:intro_song/notes/16 ================================================ FILE: base/data/gm4/function/intro_song/tree/16_19.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1280..1480}] run function gm4:intro_song/tree/16_17 ================================================ FILE: base/data/gm4/function/intro_song/tree/16_23.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1280..1640}] run function gm4:intro_song/tree/16_19 execute if entity @s[scores={gm4_intro_song=1600..2040}] run function gm4:intro_song/tree/20_23 ================================================ FILE: base/data/gm4/function/intro_song/tree/16_31.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1280..1960}] run function gm4:intro_song/tree/16_23 execute if entity @s[scores={gm4_intro_song=1920..2680}] run function gm4:intro_song/tree/24_31 ================================================ FILE: base/data/gm4/function/intro_song/tree/20_21.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1600..1720,gm4_intro_song_t=..19}] run function gm4:intro_song/notes/20 ================================================ FILE: base/data/gm4/function/intro_song/tree/20_23.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1600..1800}] run function gm4:intro_song/tree/20_21 execute if entity @s[scores={gm4_intro_song=1760..2040}] run function gm4:intro_song/tree/22_23 ================================================ FILE: base/data/gm4/function/intro_song/tree/22_23.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1840..1960,gm4_intro_song_t=..22}] run function gm4:intro_song/notes/23 ================================================ FILE: base/data/gm4/function/intro_song/tree/24_25.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1920..2040,gm4_intro_song_t=..23}] run function gm4:intro_song/notes/24 ================================================ FILE: base/data/gm4/function/intro_song/tree/24_27.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1920..2120}] run function gm4:intro_song/tree/24_25 execute if entity @s[scores={gm4_intro_song=2080..2360}] run function gm4:intro_song/tree/26_27 ================================================ FILE: base/data/gm4/function/intro_song/tree/24_31.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=1920..2280}] run function gm4:intro_song/tree/24_27 execute if entity @s[scores={gm4_intro_song=2240..2680}] run function gm4:intro_song/tree/28_31 ================================================ FILE: base/data/gm4/function/intro_song/tree/26_27.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2080..2200,gm4_intro_song_t=..25}] run function gm4:intro_song/notes/26 ================================================ FILE: base/data/gm4/function/intro_song/tree/28_29.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2240..2360,gm4_intro_song_t=..27}] run function gm4:intro_song/notes/28 ================================================ FILE: base/data/gm4/function/intro_song/tree/28_31.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2240..2440}] run function gm4:intro_song/tree/28_29 execute if entity @s[scores={gm4_intro_song=2400..2680}] run function gm4:intro_song/tree/30_31 ================================================ FILE: base/data/gm4/function/intro_song/tree/30_31.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2400..2520,gm4_intro_song_t=..29}] run function gm4:intro_song/notes/30 ================================================ FILE: base/data/gm4/function/intro_song/tree/32_33.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2560..2680,gm4_intro_song_t=..31}] run function gm4:intro_song/notes/32 ================================================ FILE: base/data/gm4/function/intro_song/tree/32_35.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2560..2760}] run function gm4:intro_song/tree/32_33 execute if entity @s[scores={gm4_intro_song=2720..3000}] run function gm4:intro_song/tree/34_35 ================================================ FILE: base/data/gm4/function/intro_song/tree/32_39.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2560..2920}] run function gm4:intro_song/tree/32_35 execute if entity @s[scores={gm4_intro_song=2880..3320}] run function gm4:intro_song/tree/36_39 ================================================ FILE: base/data/gm4/function/intro_song/tree/32_47.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2560..3240}] run function gm4:intro_song/tree/32_39 execute if entity @s[scores={gm4_intro_song=3200..3960}] run function gm4:intro_song/tree/40_47 ================================================ FILE: base/data/gm4/function/intro_song/tree/32_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2560..3880}] run function gm4:intro_song/tree/32_47 execute if entity @s[scores={gm4_intro_song=3840..5240}] run function gm4:intro_song/tree/48_63 ================================================ FILE: base/data/gm4/function/intro_song/tree/34_35.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2800..2920,gm4_intro_song_t=..34}] run function gm4:intro_song/notes/35 ================================================ FILE: base/data/gm4/function/intro_song/tree/36_37.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2880..3000,gm4_intro_song_t=..35}] run function gm4:intro_song/notes/36 ================================================ FILE: base/data/gm4/function/intro_song/tree/36_39.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=2880..3080}] run function gm4:intro_song/tree/36_37 execute if entity @s[scores={gm4_intro_song=3040..3320}] run function gm4:intro_song/tree/38_39 ================================================ FILE: base/data/gm4/function/intro_song/tree/38_39.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3040..3160,gm4_intro_song_t=..37}] run function gm4:intro_song/notes/38 execute if entity @s[scores={gm4_intro_song=3120..3240,gm4_intro_song_t=..38}] run function gm4:intro_song/notes/39 ================================================ FILE: base/data/gm4/function/intro_song/tree/40_41.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3200..3320,gm4_intro_song_t=..39}] run function gm4:intro_song/notes/40 execute if entity @s[scores={gm4_intro_song=3280..3400,gm4_intro_song_t=..40}] run function gm4:intro_song/notes/41 ================================================ FILE: base/data/gm4/function/intro_song/tree/40_43.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3200..3400}] run function gm4:intro_song/tree/40_41 execute if entity @s[scores={gm4_intro_song=3360..3640}] run function gm4:intro_song/tree/42_43 ================================================ FILE: base/data/gm4/function/intro_song/tree/40_47.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3200..3560}] run function gm4:intro_song/tree/40_43 execute if entity @s[scores={gm4_intro_song=3520..3960}] run function gm4:intro_song/tree/44_47 ================================================ FILE: base/data/gm4/function/intro_song/tree/42_43.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3360..3480,gm4_intro_song_t=..41}] run function gm4:intro_song/notes/42 execute if entity @s[scores={gm4_intro_song=3440..3560,gm4_intro_song_t=..42}] run function gm4:intro_song/notes/43 ================================================ FILE: base/data/gm4/function/intro_song/tree/44_45.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3520..3640,gm4_intro_song_t=..43}] run function gm4:intro_song/notes/44 execute if entity @s[scores={gm4_intro_song=3600..3720,gm4_intro_song_t=..44}] run function gm4:intro_song/notes/45 ================================================ FILE: base/data/gm4/function/intro_song/tree/44_47.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3520..3720}] run function gm4:intro_song/tree/44_45 execute if entity @s[scores={gm4_intro_song=3680..3960}] run function gm4:intro_song/tree/46_47 ================================================ FILE: base/data/gm4/function/intro_song/tree/46_47.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3680..3800,gm4_intro_song_t=..45}] run function gm4:intro_song/notes/46 execute if entity @s[scores={gm4_intro_song=3760..3880,gm4_intro_song_t=..46}] run function gm4:intro_song/notes/47 ================================================ FILE: base/data/gm4/function/intro_song/tree/48_49.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3840..3960,gm4_intro_song_t=..47}] run function gm4:intro_song/notes/48 ================================================ FILE: base/data/gm4/function/intro_song/tree/48_51.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3840..4040}] run function gm4:intro_song/tree/48_49 execute if entity @s[scores={gm4_intro_song=4000..4280}] run function gm4:intro_song/tree/50_51 ================================================ FILE: base/data/gm4/function/intro_song/tree/48_55.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3840..4200}] run function gm4:intro_song/tree/48_51 execute if entity @s[scores={gm4_intro_song=4160..4600}] run function gm4:intro_song/tree/52_55 ================================================ FILE: base/data/gm4/function/intro_song/tree/48_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=3840..4520}] run function gm4:intro_song/tree/48_55 execute if entity @s[scores={gm4_intro_song=4480..5240}] run function gm4:intro_song/tree/56_63 ================================================ FILE: base/data/gm4/function/intro_song/tree/4_5.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=320..440,gm4_intro_song_t=..3}] run function gm4:intro_song/notes/4 ================================================ FILE: base/data/gm4/function/intro_song/tree/4_7.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=320..520}] run function gm4:intro_song/tree/4_5 execute if entity @s[scores={gm4_intro_song=480..760}] run function gm4:intro_song/tree/6_7 ================================================ FILE: base/data/gm4/function/intro_song/tree/50_51.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4080..4200,gm4_intro_song_t=..50}] run function gm4:intro_song/notes/51 ================================================ FILE: base/data/gm4/function/intro_song/tree/52_53.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4160..4280,gm4_intro_song_t=..51}] run function gm4:intro_song/notes/52 ================================================ FILE: base/data/gm4/function/intro_song/tree/52_55.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4160..4360}] run function gm4:intro_song/tree/52_53 execute if entity @s[scores={gm4_intro_song=4320..4600}] run function gm4:intro_song/tree/54_55 ================================================ FILE: base/data/gm4/function/intro_song/tree/54_55.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4320..4440,gm4_intro_song_t=..53}] run function gm4:intro_song/notes/54 execute if entity @s[scores={gm4_intro_song=4400..4520,gm4_intro_song_t=..54}] run function gm4:intro_song/notes/55 ================================================ FILE: base/data/gm4/function/intro_song/tree/56_57.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4480..4600,gm4_intro_song_t=..55}] run function gm4:intro_song/notes/56 ================================================ FILE: base/data/gm4/function/intro_song/tree/56_59.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4480..4680}] run function gm4:intro_song/tree/56_57 execute if entity @s[scores={gm4_intro_song=4640..4920}] run function gm4:intro_song/tree/58_59 ================================================ FILE: base/data/gm4/function/intro_song/tree/56_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4480..4840}] run function gm4:intro_song/tree/56_59 execute if entity @s[scores={gm4_intro_song=4800..5240}] run function gm4:intro_song/tree/60_63 ================================================ FILE: base/data/gm4/function/intro_song/tree/58_59.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4640..4760,gm4_intro_song_t=..57}] run function gm4:intro_song/notes/58 ================================================ FILE: base/data/gm4/function/intro_song/tree/60_61.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4800..4920,gm4_intro_song_t=..59}] run function gm4:intro_song/notes/60 ================================================ FILE: base/data/gm4/function/intro_song/tree/60_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4800..5000}] run function gm4:intro_song/tree/60_61 execute if entity @s[scores={gm4_intro_song=4960..5240}] run function gm4:intro_song/tree/62_63 ================================================ FILE: base/data/gm4/function/intro_song/tree/62_63.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=4960..5080,gm4_intro_song_t=..61}] run function gm4:intro_song/notes/62 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_127.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..7720}] run function gm4:intro_song/tree/64_95 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_65.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..5240,gm4_intro_song_t=..63}] run function gm4:intro_song/notes/64 execute if entity @s[scores={gm4_intro_song=5200..5320,gm4_intro_song_t=..64}] run function gm4:intro_song/notes/65 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_67.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..5320}] run function gm4:intro_song/tree/64_65 execute if entity @s[scores={gm4_intro_song=5280..5560}] run function gm4:intro_song/tree/66_67 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_71.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..5480}] run function gm4:intro_song/tree/64_67 execute if entity @s[scores={gm4_intro_song=5440..5880}] run function gm4:intro_song/tree/68_71 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_79.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..5800}] run function gm4:intro_song/tree/64_71 execute if entity @s[scores={gm4_intro_song=5760..6520}] run function gm4:intro_song/tree/72_79 ================================================ FILE: base/data/gm4/function/intro_song/tree/64_95.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5120..6440}] run function gm4:intro_song/tree/64_79 execute if entity @s[scores={gm4_intro_song=6400..7800}] run function gm4:intro_song/tree/80_95 ================================================ FILE: base/data/gm4/function/intro_song/tree/66_67.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5280..5400,gm4_intro_song_t=..65}] run function gm4:intro_song/notes/66 execute if entity @s[scores={gm4_intro_song=5360..5480,gm4_intro_song_t=..66}] run function gm4:intro_song/notes/67 ================================================ FILE: base/data/gm4/function/intro_song/tree/68_69.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5440..5560,gm4_intro_song_t=..67}] run function gm4:intro_song/notes/68 execute if entity @s[scores={gm4_intro_song=5520..5640,gm4_intro_song_t=..68}] run function gm4:intro_song/notes/69 ================================================ FILE: base/data/gm4/function/intro_song/tree/68_71.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5440..5640}] run function gm4:intro_song/tree/68_69 execute if entity @s[scores={gm4_intro_song=5600..5880}] run function gm4:intro_song/tree/70_71 ================================================ FILE: base/data/gm4/function/intro_song/tree/6_7.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=560..680,gm4_intro_song_t=..6}] run function gm4:intro_song/notes/7 ================================================ FILE: base/data/gm4/function/intro_song/tree/70_71.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5600..5720,gm4_intro_song_t=..69}] run function gm4:intro_song/notes/70 execute if entity @s[scores={gm4_intro_song=5680..5800,gm4_intro_song_t=..70}] run function gm4:intro_song/notes/71 ================================================ FILE: base/data/gm4/function/intro_song/tree/72_73.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5760..5880,gm4_intro_song_t=..71}] run function gm4:intro_song/notes/72 execute if entity @s[scores={gm4_intro_song=5840..5960,gm4_intro_song_t=..72}] run function gm4:intro_song/notes/73 ================================================ FILE: base/data/gm4/function/intro_song/tree/72_75.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5760..5960}] run function gm4:intro_song/tree/72_73 execute if entity @s[scores={gm4_intro_song=5920..6200}] run function gm4:intro_song/tree/74_75 ================================================ FILE: base/data/gm4/function/intro_song/tree/72_79.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5760..6120}] run function gm4:intro_song/tree/72_75 execute if entity @s[scores={gm4_intro_song=6080..6520}] run function gm4:intro_song/tree/76_79 ================================================ FILE: base/data/gm4/function/intro_song/tree/74_75.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=5920..6040,gm4_intro_song_t=..73}] run function gm4:intro_song/notes/74 execute if entity @s[scores={gm4_intro_song=6000..6120,gm4_intro_song_t=..74}] run function gm4:intro_song/notes/75 ================================================ FILE: base/data/gm4/function/intro_song/tree/76_77.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6080..6200,gm4_intro_song_t=..75}] run function gm4:intro_song/notes/76 execute if entity @s[scores={gm4_intro_song=6160..6280,gm4_intro_song_t=..76}] run function gm4:intro_song/notes/77 ================================================ FILE: base/data/gm4/function/intro_song/tree/76_79.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6080..6280}] run function gm4:intro_song/tree/76_77 execute if entity @s[scores={gm4_intro_song=6240..6520}] run function gm4:intro_song/tree/78_79 ================================================ FILE: base/data/gm4/function/intro_song/tree/78_79.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6240..6360,gm4_intro_song_t=..77}] run function gm4:intro_song/notes/78 execute if entity @s[scores={gm4_intro_song=6320..6440,gm4_intro_song_t=..78}] run function gm4:intro_song/notes/79 ================================================ FILE: base/data/gm4/function/intro_song/tree/80_81.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6400..6520,gm4_intro_song_t=..79}] run function gm4:intro_song/notes/80 ================================================ FILE: base/data/gm4/function/intro_song/tree/80_83.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6400..6600}] run function gm4:intro_song/tree/80_81 ================================================ FILE: base/data/gm4/function/intro_song/tree/80_87.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6400..6760}] run function gm4:intro_song/tree/80_83 execute if entity @s[scores={gm4_intro_song=6720..7160}] run function gm4:intro_song/tree/84_87 ================================================ FILE: base/data/gm4/function/intro_song/tree/80_95.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6400..7080}] run function gm4:intro_song/tree/80_87 ================================================ FILE: base/data/gm4/function/intro_song/tree/84_85.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6720..6840,gm4_intro_song_t=..83}] run function gm4:intro_song/notes/84 ================================================ FILE: base/data/gm4/function/intro_song/tree/84_87.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=6720..6920}] run function gm4:intro_song/tree/84_85 ================================================ FILE: base/data/gm4/function/intro_song/tree/8_11.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=640..840}] run function gm4:intro_song/tree/8_9 execute if entity @s[scores={gm4_intro_song=800..1080}] run function gm4:intro_song/tree/10_11 ================================================ FILE: base/data/gm4/function/intro_song/tree/8_15.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=640..1000}] run function gm4:intro_song/tree/8_11 execute if entity @s[scores={gm4_intro_song=960..1400}] run function gm4:intro_song/tree/12_15 ================================================ FILE: base/data/gm4/function/intro_song/tree/8_9.mcfunction ================================================ execute if entity @s[scores={gm4_intro_song=640..760,gm4_intro_song_t=..7}] run function gm4:intro_song/notes/8 ================================================ FILE: base/data/gm4/function/load.mcfunction ================================================ data merge storage gm4:log {queue:[],versions:[]} data modify storage gm4:log queue append value {type:"text",message:{"text":"[GM4]: Checking for updates...","color":"#4AA0C7"}} scoreboard objectives add gm4_modules dummy scoreboard objectives add gm4_data dummy function gm4:upgrade_paths/load # Counts the number of consecutive reloads the player has not been seen in creative scoreboard objectives add gm4_creative dummy # Counts the number of consecutive reloads that no creative player has been seen execute unless score $global gm4_creative matches 0.. run scoreboard players set $global gm4_creative 10 # Controls how long a player can keep seeing logs after they're no longer in creative execute unless score $cooldown gm4_creative matches 0.. run scoreboard players set $cooldown gm4_creative 10 # Controls how long after no creative players were seen it will show logs to all players # Setting this to 0 will always show logs to all players execute unless score $global_cooldown gm4_creative matches 0.. run scoreboard players set $global_cooldown gm4_creative 10 execute unless score gm4 gm4_modules matches 1.. run data modify storage gm4:log queue append value {type:"text",message:{"text":"[GM4]: Welcome to Gamemode 4. Initialising...","color":"green"}} execute unless score gm4 gm4_modules matches 1.. run schedule function gm4:intro_song/init 2s execute unless score gm4 gm4_modules matches 1.. run scoreboard players set gm4 gm4_modules 1 ================================================ FILE: base/data/gm4/function/log.mcfunction ================================================ data modify storage gm4:log log set from storage gm4:log queue[0] execute if data storage gm4:log log{type:"text"} run tellraw @a[tag=gm4_show_log] {"nbt":"log.message","storage":"gm4:log","interpret":true} execute if data storage gm4:log log{type:"install"} run tellraw @a[tag=gm4_show_log] [{"nbt":"log.module","storage":"gm4:log"},{"text":" Installed!","color":"white"}] execute if data storage gm4:log log{type:"missing"} run tellraw @a[tag=gm4_show_log] [{"nbt":"log.module","storage":"gm4:log","color":"red"},{"text":" is disabled because ","color":"red"},{"nbt":"log.require","storage":"gm4:log","color":"red"},{"text":" is not installed."}] execute if data storage gm4:log log{type:"outdated"} run function gm4:outdated_logs/outdated_start execute if data storage gm4:log log{type:"version_conflict"} run function gm4:conflict_logs/version_conflict_start data remove storage gm4:log queue[0] execute store result score #log_size gm4_data run data get storage gm4:log queue execute if score #log_size gm4_data matches 1.. run function gm4:log ================================================ FILE: base/data/gm4/function/log_start.mcfunction ================================================ scoreboard players set @a[gamemode=creative] gm4_creative 0 execute as @a[gamemode=!creative] unless score @s gm4_creative matches 0.. run scoreboard players operation @s gm4_creative = $cooldown gm4_creative scoreboard players add @a[gamemode=!creative] gm4_creative 1 execute if entity @a[gamemode=creative] run scoreboard players set $global gm4_creative 0 execute unless entity @a[gamemode=creative] run scoreboard players add $global gm4_creative 1 tag @a remove gm4_show_log execute as @a if score @s gm4_creative < $cooldown gm4_creative run tag @s add gm4_show_log execute if score $global gm4_creative >= $global_cooldown gm4_creative run tag @a add gm4_show_log function gm4:log ================================================ FILE: base/data/gm4/function/log_wait.mcfunction ================================================ execute if entity @a[limit=1] run function gm4:log_start execute unless entity @a[limit=1] run schedule function gm4:log_wait 2t replace ================================================ FILE: base/data/gm4/function/outdated_logs/outdated_start.mcfunction ================================================ tellraw @a[tag=gm4_show_log] [{"text":"The following modules are outdated! Click here to download the latest versions.","color":"gold","click_event":{"action":"open_url","url":"https://www.gm4.co/modules"},"hover_event":{"action":"show_text","value":{"text":"Click to visit gm4.co/modules","color":"#4AA0C7"}}}] data modify storage gm4:log outdated_list set from storage gm4:log queue data remove storage gm4:log outdated_list[{type:"text"}] data remove storage gm4:log outdated_list[{type:"install"}] data remove storage gm4:log outdated_list[{type:"missing"}] data remove storage gm4:log outdated_list[{type:"version_conflict"}] function gm4:outdated_logs/traverse data remove storage gm4:log outdated_list data remove storage gm4:log queue[{type:"outdated"}] data modify storage gm4:log queue prepend value {type:"outdated",module:"log_placeholder"} ================================================ FILE: base/data/gm4/function/outdated_logs/traverse.mcfunction ================================================ tellraw @a[tag=gm4_show_log] [{"text":" - ","color":"gold"},{"nbt":"outdated_list[0].render","storage":"gm4:log","color":"gold","interpret":true}] data remove storage gm4:log outdated_list[0] execute store result score #list_size gm4_data run data get storage gm4:log outdated_list execute if score #list_size gm4_data matches 1.. run function gm4:outdated_logs/traverse ================================================ FILE: base/data/gm4/function/post_load.mcfunction ================================================ execute unless data storage gm4:log queue[{type:"install"}] run data modify storage gm4:log queue append value {type:"text",message:{"text":"[GM4]: No updates found.","color":"#4AA0C7"}} execute if data storage gm4:log queue[{type:"install"}] run data modify storage gm4:log queue append value {type:"text",message:{"text":"[GM4]: Updates completed.","color":"#4AA0C7"}} function gm4:log_wait ================================================ FILE: base/data/gm4/function/upgrade_paths/changed_dimension.mcfunction ================================================ # @s = player who just changed dimension # at @s # run from gm4:upgrade_paths/changed_dimension advancement advancement revoke @s only gm4:upgrade_paths/changed_dimension tag @s add gm4_running_upgrade_path function gm4:upgrade_paths/run_when_loaded ================================================ FILE: base/data/gm4/function/upgrade_paths/join_game.mcfunction ================================================ # @s = runs as a player who has just rejoined the world # at @s # run from gm4:upgrade_paths/join_game advancement advancement revoke @s only gm4:upgrade_paths/join_game scoreboard players reset @s gm4_up_leave_game tag @s add gm4_running_upgrade_path function gm4:upgrade_paths/run_when_loaded ================================================ FILE: base/data/gm4/function/upgrade_paths/load.mcfunction ================================================ scoreboard objectives add gm4_earliest_version dummy scoreboard objectives add gm4_up_leave_game minecraft.custom:minecraft.leave_game # if upgrade paths auto-disabled, let it reevaluate any new modules execute if score $disable_upgrade_paths gm4_data matches 2 run scoreboard players reset $disable_upgrade_paths gm4_data function gm4:upgrade_paths/main ================================================ FILE: base/data/gm4/function/upgrade_paths/main.mcfunction ================================================ scoreboard players set $active_upgrade_paths gm4_data 0 execute as @a[limit=1] at @s run function #gm4_upgrade_paths:run # if no paths run, disable further checks until next reload execute if entity @a unless score $disable_upgrade_paths gm4_data matches 1 unless score $active_upgrade_paths gm4_data matches 1.. run scoreboard players set $disable_upgrade_paths gm4_data 2 execute unless score $disable_upgrade_paths gm4_data matches 1.. run schedule function gm4:upgrade_paths/main 300s ================================================ FILE: base/data/gm4/function/upgrade_paths/run_when_loaded.mcfunction ================================================ # @s = server # at world spawn # scheduled from self and advancement triggers scoreboard players set $success gm4_data 0 execute store success score $success gm4_data as @a[tag=gm4_running_upgrade_path] at @s if loaded ~ ~ ~ execute as @a[tag=gm4_running_upgrade_path] at @s if loaded ~ ~ ~ run function #gm4_upgrade_paths:run execute if score $success gm4_data matches 0 if entity @a[tag=gm4_running_upgrade_path] run schedule function gm4:upgrade_paths/run_when_loaded 1t scoreboard players reset $success gm4_data ================================================ FILE: base/data/gm4/loot_table/air.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:stick", "functions": [ { "function": "minecraft:set_count", "count": 0 } ] } ] } ] } ================================================ FILE: base/data/gm4/loot_table/empty.json ================================================ { "pools": [] } ================================================ FILE: base/data/gm4/tags/block/foliage.json ================================================ { "values": [ "#minecraft:small_flowers", "minecraft:sunflower", "minecraft:lilac", "minecraft:peony", "minecraft:rose_bush", "minecraft:pitcher_plant", "minecraft:azalea", "minecraft:flowering_azalea", "minecraft:big_dripleaf", "minecraft:big_dripleaf_stem", "minecraft:brown_mushroom", "minecraft:bush", "minecraft:cactus_flower", "minecraft:cave_vines", "minecraft:cave_vines_plant", "minecraft:crimson_fungus", "minecraft:crimson_roots", "minecraft:dead_bush", "minecraft:fern", "minecraft:firefly_bush", "minecraft:glow_lichen", "minecraft:short_dry_grass", "minecraft:short_grass", "minecraft:hanging_roots", "minecraft:large_fern", "minecraft:leaf_litter", "minecraft:mangrove_propagule", "minecraft:moss_carpet", "minecraft:nether_sprouts", "minecraft:pale_hanging_moss", "minecraft:pale_moss_carpet", "minecraft:pink_petals", "minecraft:red_mushroom", "minecraft:small_dripleaf", "minecraft:spore_blossom", "minecraft:sweet_berry_bush", "minecraft:tall_dry_grass", "minecraft:tall_grass", "minecraft:twisting_vines", "minecraft:twisting_vines_plant", "minecraft:vine", "minecraft:warped_fungus", "minecraft:warped_roots", "minecraft:weeping_vines", "minecraft:weeping_vines_plant", "minecraft:wildflowers" ] } ================================================ FILE: base/data/gm4/tags/block/full_collision.json ================================================ { "values": [ "#minecraft:substrate_overworld", "#minecraft:leaves", "#minecraft:logs", "#minecraft:planks", "#minecraft:shulker_boxes", "#minecraft:wool", "minecraft:amethyst_block", "minecraft:ancient_debris", "minecraft:andesite", "minecraft:bamboo_block", "minecraft:bamboo_mosaic", "minecraft:barrel", "minecraft:barrier", "minecraft:basalt", "minecraft:beacon", "minecraft:bedrock", "minecraft:bee_nest", "minecraft:beehive", "minecraft:black_concrete_powder", "minecraft:black_concrete", "minecraft:black_glazed_terracotta", "minecraft:black_stained_glass", "minecraft:black_terracotta", "minecraft:blackstone", "minecraft:blast_furnace", "minecraft:blue_concrete_powder", "minecraft:blue_concrete", "minecraft:blue_glazed_terracotta", "minecraft:blue_ice", "minecraft:blue_stained_glass", "minecraft:blue_terracotta", "minecraft:bone_block", "minecraft:bookshelf", "minecraft:brain_coral_block", "minecraft:bricks", "minecraft:brown_concrete_powder", "minecraft:brown_concrete", "minecraft:brown_glazed_terracotta", "minecraft:brown_mushroom_block", "minecraft:brown_stained_glass", "minecraft:brown_terracotta", "minecraft:bubble_coral_block", "minecraft:budding_amethyst", "minecraft:calcite", "minecraft:cartography_table", "minecraft:carved_pumpkin", "minecraft:chain_command_block", "minecraft:chiseled_bookshelf", "minecraft:chiseled_copper", "minecraft:chiseled_deepslate", "minecraft:chiseled_nether_bricks", "minecraft:chiseled_polished_blackstone", "minecraft:chiseled_quartz_block", "minecraft:chiseled_red_sandstone", "minecraft:chiseled_resin_bricks", "minecraft:chiseled_sandstone", "minecraft:chiseled_stone_bricks", "minecraft:chiseled_tuff", "minecraft:clay", "minecraft:coal_block", "minecraft:coal_ore", "minecraft:cobbled_deepslate", "minecraft:cobblestone", "minecraft:command_block", "minecraft:copper_block", "minecraft:copper_bulb", "minecraft:copper_grate", "minecraft:copper_ore", "minecraft:cracked_deepslate_bricks", "minecraft:cracked_deepslate_tiles", "minecraft:cracked_nether_bricks", "minecraft:cracked_polished_blackstone_bricks", "minecraft:cracked_stone_bricks", "minecraft:crafter", "minecraft:crafting_table", "minecraft:creaking_heart", "minecraft:crimson_nylium", "minecraft:crying_obsidian", "minecraft:cut_copper", "minecraft:cut_red_sandstone", "minecraft:cut_sandstone", "minecraft:cyan_concrete_powder", "minecraft:cyan_concrete", "minecraft:cyan_glazed_terracotta", "minecraft:cyan_stained_glass", "minecraft:cyan_terracotta", "minecraft:dark_prismarine", "minecraft:dead_brain_coral_block", "minecraft:dead_bubble_coral_block", "minecraft:dead_fire_coral_block", "minecraft:dead_horn_coral_block", "minecraft:dead_tube_coral_block", "minecraft:deepslate_bricks", "minecraft:deepslate_coal_ore", "minecraft:deepslate_copper_ore", "minecraft:deepslate_diamond_ore", "minecraft:deepslate_emerald_ore", "minecraft:deepslate_gold_ore", "minecraft:deepslate_iron_ore", "minecraft:deepslate_lapis_ore", "minecraft:deepslate_redstone_ore", "minecraft:deepslate_tiles", "minecraft:deepslate", "minecraft:diamond_block", "minecraft:diamond_ore", "minecraft:diorite", "minecraft:dispenser", "minecraft:dried_kelp_block", "minecraft:dripstone_block", "minecraft:dropper", "minecraft:emerald_block", "minecraft:emerald_ore", "minecraft:end_stone_bricks", "minecraft:end_stone", "minecraft:exposed_chiseled_copper", "minecraft:exposed_copper_bulb", "minecraft:exposed_copper_grate", "minecraft:exposed_copper", "minecraft:exposed_cut_copper", "minecraft:fire_coral_block", "minecraft:fletching_table", "minecraft:frosted_ice", "minecraft:furnace", "minecraft:gilded_blackstone", "minecraft:glass", "minecraft:glowstone", "minecraft:gold_block", "minecraft:gold_ore", "minecraft:granite", "minecraft:grass_block", "minecraft:gravel", "minecraft:gray_concrete_powder", "minecraft:gray_concrete", "minecraft:gray_glazed_terracotta", "minecraft:gray_stained_glass", "minecraft:gray_terracotta", "minecraft:green_concrete_powder", "minecraft:green_concrete", "minecraft:green_glazed_terracotta", "minecraft:green_stained_glass", "minecraft:green_terracotta", "minecraft:hay_block", "minecraft:honeycomb_block", "minecraft:horn_coral_block", "minecraft:ice", "minecraft:infested_chiseled_stone_bricks", "minecraft:infested_cobblestone", "minecraft:infested_cracked_stone_bricks", "minecraft:infested_deepslate", "minecraft:infested_mossy_stone_bricks", "minecraft:infested_stone_bricks", "minecraft:infested_stone", "minecraft:iron_block", "minecraft:iron_ore", "minecraft:jack_o_lantern", "minecraft:jigsaw", "minecraft:jukebox", "minecraft:lapis_block", "minecraft:lapis_ore", "minecraft:light_blue_concrete_powder", "minecraft:light_blue_concrete", "minecraft:light_blue_glazed_terracotta", "minecraft:light_blue_stained_glass", "minecraft:light_blue_terracotta", "minecraft:light_gray_concrete_powder", "minecraft:light_gray_concrete", "minecraft:light_gray_glazed_terracotta", "minecraft:light_gray_stained_glass", "minecraft:light_gray_terracotta", "minecraft:light_gray_wool", "minecraft:lime_concrete_powder", "minecraft:lime_concrete", "minecraft:lime_glazed_terracotta", "minecraft:lime_stained_glass", "minecraft:lime_terracotta", "minecraft:lodestone", "minecraft:loom", "minecraft:magenta_concrete_powder", "minecraft:magenta_concrete", "minecraft:magenta_glazed_terracotta", "minecraft:magenta_stained_glass", "minecraft:magenta_terracotta", "minecraft:magma_block", "minecraft:mangrove_roots", "minecraft:melon", "minecraft:moss_block", "minecraft:mossy_cobblestone", "minecraft:mossy_stone_bricks", "minecraft:mud_bricks", "minecraft:muddy_mangrove_roots", "minecraft:mushroom_stem", "minecraft:nether_bricks", "minecraft:nether_gold_ore", "minecraft:nether_quartz_ore", "minecraft:nether_wart_block", "minecraft:netherite_block", "minecraft:netherrack", "minecraft:note_block", "minecraft:observer", "minecraft:obsidian", "minecraft:ochre_froglight", "minecraft:orange_concrete_powder", "minecraft:orange_concrete", "minecraft:orange_glazed_terracotta", "minecraft:orange_stained_glass", "minecraft:orange_terracotta", "minecraft:oxidized_chiseled_copper", "minecraft:oxidized_copper_bulb", "minecraft:oxidized_copper_grate", "minecraft:oxidized_copper", "minecraft:oxidized_cut_copper", "minecraft:packed_ice", "minecraft:packed_mud", "minecraft:pearlescent_froglight", "minecraft:pink_concrete_powder", "minecraft:pink_concrete", "minecraft:pink_glazed_terracotta", "minecraft:pink_stained_glass", "minecraft:pink_terracotta", "minecraft:polished_andesite", "minecraft:polished_basalt", "minecraft:polished_blackstone_bricks", "minecraft:polished_blackstone", "minecraft:polished_deepslate", "minecraft:polished_diorite", "minecraft:polished_granite", "minecraft:polished_tuff", "minecraft:prismarine_bricks", "minecraft:prismarine", "minecraft:pumpkin", "minecraft:purple_concrete_powder", "minecraft:purple_concrete", "minecraft:purple_glazed_terracotta", "minecraft:purple_stained_glass", "minecraft:purple_terracotta", "minecraft:purpur_block", "minecraft:purpur_pillar", "minecraft:quartz_block", "minecraft:quartz_bricks", "minecraft:quartz_pillar", "minecraft:raw_copper_block", "minecraft:raw_gold_block", "minecraft:raw_iron_block", "minecraft:red_concrete_powder", "minecraft:red_concrete", "minecraft:red_glazed_terracotta", "minecraft:red_mushroom_block", "minecraft:red_nether_bricks", "minecraft:red_sand", "minecraft:red_sandstone", "minecraft:red_stained_glass", "minecraft:red_terracotta", "minecraft:redstone_block", "minecraft:redstone_lamp", "minecraft:redstone_ore", "minecraft:reinforced_deepslate", "minecraft:repeating_command_block", "minecraft:resin_block", "minecraft:resin_bricks", "minecraft:respawn_anchor", "minecraft:sand", "minecraft:sandstone", "minecraft:sculk_catalyst", "minecraft:sculk", "minecraft:sea_lantern", "minecraft:shroomlight", "minecraft:slime_block", "minecraft:smithing_table", "minecraft:smoker", "minecraft:smooth_basalt", "minecraft:smooth_quartz", "minecraft:smooth_red_sandstone", "minecraft:smooth_sandstone", "minecraft:smooth_stone", "minecraft:snow_block", "minecraft:soul_soil", "minecraft:spawner", "minecraft:sponge", "minecraft:stone_bricks", "minecraft:stone", "minecraft:structure_block", "minecraft:suspicious_gravel", "minecraft:suspicious_sand", "minecraft:target", "minecraft:terracotta", "minecraft:test_block", "minecraft:test_instance_block", "minecraft:tinted_glass", "minecraft:tnt", "minecraft:trial_spawner", "minecraft:tube_coral_block", "minecraft:tuff_bricks", "minecraft:tuff", "minecraft:vault", "minecraft:verdant_froglight", "minecraft:warped_nylium", "minecraft:warped_wart_block", "minecraft:waxed_chiseled_copper", "minecraft:waxed_copper_block", "minecraft:waxed_copper_bulb", "minecraft:waxed_copper_grate", "minecraft:waxed_cut_copper", "minecraft:waxed_exposed_chiseled_copper", "minecraft:waxed_exposed_copper_bulb", "minecraft:waxed_exposed_copper_grate", "minecraft:waxed_exposed_copper", "minecraft:waxed_exposed_cut_copper", "minecraft:waxed_oxidized_chiseled_copper", "minecraft:waxed_oxidized_copper_bulb", "minecraft:waxed_oxidized_copper_grate", "minecraft:waxed_oxidized_copper", "minecraft:waxed_oxidized_cut_copper", "minecraft:waxed_weathered_chiseled_copper", "minecraft:waxed_weathered_copper_bulb", "minecraft:waxed_weathered_copper_grate", "minecraft:waxed_weathered_copper", "minecraft:waxed_weathered_cut_copper", "minecraft:weathered_chiseled_copper", "minecraft:weathered_copper_bulb", "minecraft:weathered_copper_grate", "minecraft:weathered_copper", "minecraft:weathered_cut_copper", "minecraft:wet_sponge", "minecraft:white_concrete_powder", "minecraft:white_concrete", "minecraft:white_glazed_terracotta", "minecraft:white_stained_glass", "minecraft:white_terracotta", "minecraft:yellow_concrete_powder", "minecraft:yellow_concrete", "minecraft:yellow_glazed_terracotta", "minecraft:yellow_stained_glass", "minecraft:yellow_terracotta" ] } ================================================ FILE: base/data/gm4/tags/block/no_collision.json ================================================ { "values": [ "#gm4:water", "#minecraft:air", "#minecraft:banners", "#minecraft:buttons", "#minecraft:ceiling_hanging_signs", "#minecraft:corals", "#minecraft:crops", "#minecraft:fire", "#minecraft:portals", "#minecraft:pressure_plates", "#minecraft:rails", "#minecraft:signs", "#minecraft:small_flowers", "#minecraft:wall_corals", "minecraft:acacia_sapling", "minecraft:attached_melon_stem", "minecraft:attached_pumpkin_stem", "minecraft:bamboo_sapling", "minecraft:big_dripleaf_stem", "minecraft:birch_sapling", "minecraft:brown_mushroom", "minecraft:bush", "minecraft:cactus_flower", "minecraft:cave_vines", "minecraft:cave_vines_plant", "minecraft:cherry_sapling", "minecraft:cobweb", "minecraft:copper_torch", "minecraft:crimson_fungus", "minecraft:crimson_roots", "minecraft:dark_oak_sapling", "minecraft:dead_brain_coral_fan", "minecraft:dead_brain_coral_wall_fan", "minecraft:dead_brain_coral", "minecraft:dead_bubble_coral_fan", "minecraft:dead_bubble_coral_wall_fan", "minecraft:dead_bubble_coral", "minecraft:dead_bush", "minecraft:dead_fire_coral_fan", "minecraft:dead_fire_coral_wall_fan", "minecraft:dead_fire_coral", "minecraft:dead_horn_coral_fan", "minecraft:dead_horn_coral_wall_fan", "minecraft:dead_horn_coral", "minecraft:dead_tube_coral_fan", "minecraft:dead_tube_coral_wall_fan", "minecraft:dead_tube_coral", "minecraft:fern", "minecraft:firefly_bush", "minecraft:frogspawn", "minecraft:glow_lichen", "minecraft:short_dry_grass", "minecraft:short_grass", "minecraft:sunflower", "minecraft:hanging_roots", "minecraft:jungle_sapling", "minecraft:ladder", "minecraft:large_fern", "minecraft:lava", "minecraft:leaf_litter", "minecraft:lever", "minecraft:light", "minecraft:lilac", "minecraft:mangrove_propagule", "minecraft:nether_sprouts", "minecraft:nether_wart", "minecraft:oak_sapling", "minecraft:pale_hanging_moss", "minecraft:pale_oak_sapling", "minecraft:peony", "minecraft:pink_petals", "minecraft:pitcher_plant", "minecraft:powder_snow", "minecraft:red_mushroom", "minecraft:redstone_torch", "minecraft:redstone_wall_torch", "minecraft:redstone_wire", "minecraft:rose_bush", "minecraft:scaffolding", "minecraft:sculk_vein", "minecraft:small_dripleaf", "minecraft:soul_torch", "minecraft:soul_wall_torch", "minecraft:spore_blossom", "minecraft:spruce_sapling", "minecraft:structure_void", "minecraft:sugar_cane", "minecraft:sweet_berry_bush", "minecraft:tall_dry_grass", "minecraft:tall_grass", "minecraft:torch", "minecraft:tripwire_hook", "minecraft:tripwire", "minecraft:twisting_vines", "minecraft:twisting_vines_plant", "minecraft:vine", "minecraft:wall_torch", "minecraft:warped_fungus", "minecraft:warped_roots", "minecraft:weeping_vines", "minecraft:weeping_vines_plant", "minecraft:wildflowers" ] } ================================================ FILE: base/data/gm4/tags/block/replaceable.json ================================================ { "values": [ "#minecraft:replaceable", "minecraft:sculk_vein" ] } ================================================ FILE: base/data/gm4/tags/block/water.json ================================================ { "values": [ "minecraft:water", "minecraft:kelp", "minecraft:kelp_plant", "minecraft:seagrass", "minecraft:tall_seagrass", "minecraft:bubble_column" ] } ================================================ FILE: base/data/gm4/tags/block/waterloggable.json ================================================ { "values": [ "#minecraft:all_signs", "#minecraft:bars", "#minecraft:campfires", "#minecraft:candles", "#minecraft:chains", "#minecraft:copper_chests", "#minecraft:copper_golem_statues", "#minecraft:corals", "#minecraft:fences", "#minecraft:lanterns", "#minecraft:leaves", "#minecraft:lightning_rods", "#minecraft:rails", "#minecraft:slabs", "#minecraft:stairs", "#minecraft:trapdoors", "#minecraft:wall_corals", "#minecraft:wall_signs", "#minecraft:walls", "#minecraft:wooden_shelves", "minecraft:amethyst_cluster", "minecraft:big_dripleaf", "minecraft:big_dripleaf_stem", "minecraft:black_stained_glass_pane", "minecraft:blue_stained_glass_pane", "minecraft:brown_stained_glass_pane", "minecraft:calibrated_sculk_sensor", "minecraft:chest", "minecraft:conduit", "minecraft:cyan_stained_glass_pane", "minecraft:dead_brain_coral_fan", "minecraft:dead_brain_coral", "minecraft:dead_bubble_coral_fan", "minecraft:dead_bubble_coral", "minecraft:dead_fire_coral_fan", "minecraft:dead_fire_coral", "minecraft:dead_horn_coral_fan", "minecraft:dead_horn_coral", "minecraft:dead_tube_coral_fan", "minecraft:dead_tube_coral", "minecraft:decorated_pot", "minecraft:dried_ghast", "minecraft:ender_chest", "minecraft:glass_pane", "minecraft:glow_lichen", "minecraft:gray_stained_glass_pane", "minecraft:green_stained_glass_pane", "minecraft:hanging_roots", "minecraft:iron_bars", "minecraft:ladder", "minecraft:lantern", "minecraft:large_amethyst_bud", "minecraft:light", "minecraft:lightning_rod", "minecraft:light_blue_stained_glass_pane", "minecraft:light_gray_stained_glass_pane", "minecraft:lime_stained_glass_pane", "minecraft:magenta_stained_glass_pane", "minecraft:mangrove_propagule", "minecraft:mangrove_roots", "minecraft:medium_amethyst_bud", "minecraft:orange_stained_glass_pane", "minecraft:pink_stained_glass_pane", "minecraft:pointed_dripstone", "minecraft:purple_stained_glass_pane", "minecraft:red_stained_glass_pane", "minecraft:resin_clump", "minecraft:scaffolding", "minecraft:sculk_sensor", "minecraft:sculk_vein", "minecraft:sea_pickle", "minecraft:small_dripleaf", "minecraft:soul_lantern", "minecraft:trapped_chest", "minecraft:white_stained_glass_pane", "minecraft:yellow_stained_glass_pane" ] } ================================================ FILE: base/data/gm4/tags/entity_type/boss.json ================================================ { "values": [ "minecraft:ender_dragon", "minecraft:wither" ] } ================================================ FILE: base/data/gm4/tags/entity_type/chest_boats.json ================================================ { "values": [ "minecraft:oak_chest_boat", "minecraft:spruce_chest_boat", "minecraft:birch_chest_boat", "minecraft:jungle_chest_boat", "minecraft:acacia_chest_boat", "minecraft:cherry_chest_boat", "minecraft:dark_oak_chest_boat", "minecraft:mangrove_chest_boat", "minecraft:bamboo_chest_raft", "minecraft:pale_oak_chest_boat" ] } ================================================ FILE: base/data/gm4/tags/entity_type/hostile.json ================================================ { "values": [ "#gm4:boss", "minecraft:blaze", "minecraft:bogged", "minecraft:breeze", "minecraft:creeper", "minecraft:elder_guardian", "minecraft:endermite", "minecraft:evoker", "minecraft:ghast", "minecraft:guardian", "minecraft:hoglin", "minecraft:husk", "minecraft:magma_cube", "minecraft:parched", "minecraft:phantom", "minecraft:piglin_brute", "minecraft:pillager", "minecraft:ravager", "minecraft:shulker", "minecraft:silverfish", "minecraft:skeleton", "minecraft:slime", "minecraft:stray", "minecraft:vex", "minecraft:vindicator", "minecraft:warden", "minecraft:witch", "minecraft:wither_skeleton", "minecraft:zoglin", "minecraft:zombie", "minecraft:zombie_villager" ] } ================================================ FILE: base/data/gm4/tags/entity_type/minecarts.json ================================================ { "values": [ "minecraft:minecart", "minecraft:chest_minecart", "minecraft:hopper_minecart", "minecraft:furnace_minecart", "minecraft:spawner_minecart", "minecraft:tnt_minecart", "minecraft:command_block_minecart" ] } ================================================ FILE: base/data/gm4/tags/entity_type/neutral.json ================================================ { "values": [ "#gm4:neutral_hostile", "#gm4:neutral_passive" ] } ================================================ FILE: base/data/gm4/tags/entity_type/neutral_hostile.json ================================================ { "values": [ "minecraft:camel_husk", "minecraft:cave_spider", "minecraft:creaking", "minecraft:drowned", "minecraft:enderman", "minecraft:piglin", "minecraft:spider", "minecraft:zombie_nautilus", "minecraft:zombified_piglin" ] } ================================================ FILE: base/data/gm4/tags/entity_type/neutral_passive.json ================================================ { "values": [ "minecraft:bee", "minecraft:dolphin", "minecraft:fox", "minecraft:goat", "minecraft:iron_golem", "minecraft:llama", "minecraft:panda", "minecraft:polar_bear", "minecraft:trader_llama", "minecraft:wolf" ] } ================================================ FILE: base/data/gm4/tags/entity_type/non_living.json ================================================ { "values": [ "minecraft:area_effect_cloud", "minecraft:arrow", "minecraft:block_display", "#minecraft:boat", "minecraft:breeze_wind_charge", "#gm4:chest_boats", "minecraft:chest_minecart", "minecraft:command_block_minecart", "minecraft:dragon_fireball", "minecraft:egg", "minecraft:end_crystal", "minecraft:ender_pearl", "minecraft:evoker_fangs", "minecraft:experience_bottle", "minecraft:experience_orb", "minecraft:eye_of_ender", "minecraft:falling_block", "minecraft:fireball", "minecraft:firework_rocket", "minecraft:fishing_bobber", "minecraft:furnace_minecart", "minecraft:glow_item_frame", "minecraft:hopper_minecart", "minecraft:interaction", "minecraft:item", "minecraft:item_display", "minecraft:item_frame", "minecraft:leash_knot", "minecraft:lightning_bolt", "minecraft:lingering_potion", "minecraft:llama_spit", "minecraft:marker", "minecraft:minecart", "minecraft:ominous_item_spawner", "minecraft:painting", "minecraft:shulker_bullet", "minecraft:small_fireball", "minecraft:snowball", "minecraft:spawner_minecart", "minecraft:spectral_arrow", "minecraft:splash_potion", "minecraft:text_display", "minecraft:tnt", "minecraft:tnt_minecart", "minecraft:trident", "minecraft:wind_charge", "minecraft:wither_skull" ] } ================================================ FILE: base/data/gm4/tags/entity_type/passive.json ================================================ { "values": [ "minecraft:allay", "minecraft:armadillo", "minecraft:axolotl", "minecraft:bat", "minecraft:camel", "minecraft:cat", "minecraft:chicken", "minecraft:cod", "minecraft:copper_golem", "minecraft:cow", "minecraft:donkey", "minecraft:frog", "minecraft:glow_squid", "minecraft:happy_ghast", "minecraft:horse", "minecraft:mooshroom", "minecraft:mule", "minecraft:nautilus", "minecraft:ocelot", "minecraft:parrot", "minecraft:pig", "minecraft:pufferfish", "minecraft:rabbit", "minecraft:salmon", "minecraft:sheep", "minecraft:skeleton_horse", "minecraft:sniffer", "minecraft:snow_golem", "minecraft:squid", "minecraft:strider", "minecraft:tadpole", "minecraft:tropical_fish", "minecraft:turtle", "minecraft:villager", "minecraft:wandering_trader" ] } ================================================ FILE: base/data/load/function/_private/init.mcfunction ================================================ # Reset scoreboards so packs can set values accurate for current load. scoreboard objectives add load.status dummy scoreboard players reset * load.status ================================================ FILE: base/data/load/tags/function/_private/init.json ================================================ { "values": [ "load:_private/init" ] } ================================================ FILE: base/data/load/tags/function/_private/load.json ================================================ { "values": [ "#load:_private/init", {"id": "#load:pre_load", "required": false}, {"id": "#load:load", "required": false}, {"id": "#load:post_load", "required": false} ] } ================================================ FILE: base/data/load/tags/function/gm4/enumerate.json ================================================ { "values": [ "gm4:enumerate" ] } ================================================ FILE: base/data/load/tags/function/gm4/resolve_load.json ================================================ { "values": [ "gm4:resolve_load" ] } ================================================ FILE: base/data/load/tags/function/gm4/resolve_post_load.json ================================================ { "values": [ "gm4:resolve_post_load" ] } ================================================ FILE: base/data/load/tags/function/gm4.json ================================================ { "values": [ "#load:gm4/enumerate", "#load:gm4/resolve_load" ] } ================================================ FILE: base/data/load/tags/function/post_load.json ================================================ { "values": [ "#load:gm4/resolve_post_load" ] } ================================================ FILE: base/data/load/tags/function/pre_load.json ================================================ { "values": [ "#load:gm4" ] } ================================================ FILE: base/data/minecraft/loot_table/blocks/player_head.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "bonus_rolls": 0, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:copy_components", "source": "block_entity" } ] } ] } ], "random_sequence": "minecraft:blocks/player_head" } ================================================ FILE: base/data/minecraft/loot_table/empty.json ================================================ { "pools": [] } ================================================ FILE: base/data/minecraft/tags/function/load.json ================================================ { "values": [ "#load:_private/load" ] } ================================================ FILE: base/mod.mcdoc ================================================ use ::java::util::text::Text dispatch minecraft:storage[gm4:log] to struct Gm4Log { versions?: [LogVersion], traverse_versions?: [LogVersion], log?: struct { require_id?: string }, outdated_list?: [LogEntry], queue?: [LogEntry], temp?: Text, } struct LogVersion { id: string, module: string, version: string, from?: string, } struct LogEntry { type: ("text" | "install" | "outdated" | "missing" | "version_conflict"), ...gm4:log_entry[[type]], } dispatch gm4:log_entry[text] to struct { /// The text component message to display. message: Text, } dispatch gm4:log_entry[install] to struct { /// The name of the module that was just installed. module: string, } dispatch gm4:log_entry[outdated] to struct { module: string, download: #[url] string, render: Text, } dispatch gm4:log_entry[missing] to struct MissingLog { /// The name of the module. module: string, /// The ID of the module. id: string, /// The name of the dependency. require: string, /// The ID of the dependency. require_id: string, } dispatch gm4:log_entry[version_conflict] to struct { ...MissingLog, /// The required version of the dependency. require_ver: string, } ================================================ FILE: beet-dev.yaml ================================================ pipeline: - gm4.plugins.manifest.create - gm4.plugins.resource_pack.setup - broadcast: null extend: beet.yaml require: - gm4.plugins.output - gm4.plugins.player_heads - gm4.plugins.resource_pack - gm4.plugins.backwards - beet.contrib.optifine - beet.contrib.babelbox - gm4_guidebook.generate_guidebooks.load_page_data - gm4.plugins.test.load_tests pipeline: - gm4.plugins.write_mcmeta meta: gm4_dev: True mecha: formatting: layout: preserve nbt_compact: True cmd_compact: True babelbox: load: - assets/translations.csv - translations.csv namespace: gm4_translations unicode_escape: True dialect: excel - extend: beet.yaml directory: resource_pack pipeline: - resource_pack.dev_description - gm4.plugins.resource_pack.link_resource_pack - gm4.plugins.output.resource_pack - gm4.plugins.finished meta: autosave: link: false gm4_dev: True ignore: - gm4/skin_cache.json - gm4/modeldata_registry.json ================================================ FILE: beet-release.yaml ================================================ pipeline: - gm4.plugins.annotations - gm4.plugins.manifest.create - gm4.plugins.output.clear_release - gm4.plugins.resource_pack.setup - broadcast: 'lib_*' extend: 'beet.yaml' require: - gm4.plugins.annotations.add_module_dir_to_diagnostics - gm4.plugins.output.release - gm4.plugins.manifest.update_patch - gm4.plugins.versioning.isolated_library pipeline: - beet.contrib.lantern_load.base_data_pack - gm4.plugins.manifest.write_credits - gm4.plugins.test.strip_tests - require: [beet.contrib.copy_files] meta: copy_files: data_pack: LICENSE.md: "LICENSE.md" README.md: "README.md" pack.png: "pack.png" - gm4.plugins.module.default_pack_icon - gm4.plugins.readme_generator.libraries meta: mecha: formatting: layout: preserve nbt_compact: True - broadcast: 'gm4_*' extend: 'beet.yaml' require: - gm4.plugins.worker.clear_on_exit - gm4.plugins.worker.store_project - gm4.plugins.worker.freeze_last_stored - gm4.plugins.manifest.update_patch - gm4.plugins.player_heads - gm4.plugins.resource_pack - gm4.plugins.backwards - beet.contrib.optifine - beet.contrib.babelbox - gm4_guidebook.generate_guidebooks.load_page_data pipeline: - gm4.plugins.manifest.write_credits - gm4.plugins.test.strip_tests - require: [beet.contrib.copy_files] meta: {copy_files: {data_pack: {LICENSE.md: "../LICENSE.md"}}} - gm4.plugins.readme_generator meta: mecha: formatting: layout: preserve nbt_compact: True babelbox: load: - assets/translations.csv - translations.csv namespace: gm4_translations unicode_escape: True dialect: excel - pipeline: - gm4.plugins.worker.retrieve_and_run meta: plugins: - gm4.plugins.output.release - gm4.plugins.manifest.write_updates - gm4.plugins.write_mcmeta - gm4.plugins.worker.store_project - extend: beet.yaml directory: resource_pack require: - gm4.plugins.worker.retrieve_and_merge - gm4.plugins.output.release_resource_pack - gm4.plugins.write_mcmeta - gm4.plugins.manifest.update_patch meta: pack_scan: resource_pack - gm4.plugins.manifest.write_meta meta: autosave: link: false ================================================ FILE: beet-test.yaml ================================================ pipeline: - gm4.plugins.manifest.create - gm4.plugins.output.clear_release - gm4.plugins.resource_pack.setup - gm4.plugins.manifest.write_meta - broadcast: 'gm4_*' extend: 'beet.yaml' require: - gm4.plugins.output.test - gm4.plugins.player_heads - gm4.plugins.resource_pack - gm4.plugins.backwards - gm4_guidebook.generate_guidebooks.load_page_data - gm4.plugins.test.load_tests - gm4.plugins.test.skip_mecha_lint pipeline: - gm4.plugins.write_mcmeta meta: mecha: formatting: layout: preserve nbt_compact: True meta: autosave: link: false ================================================ FILE: commands.json ================================================ { "type": "root", "children": { "assert": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "block": { "type": "argument", "parser": "minecraft:block_predicate", "executable": true } } } } }, "chat": { "type": "literal", "children": { "pattern": { "type": "argument", "parser": "brigadier:string", "properties": { "type": "phrase" }, "executable": true, "children": { "receivers": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "players", "amount": "multiple" }, "executable": true } } } } }, "data": { "type": "literal", "children": { "block": { "type": "literal", "children": { "sourcePos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "entity": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "storage": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:resource_location", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "executable": true, "children": { "inside": { "type": "literal", "executable": true } } } } }, "items": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } } } }, "not": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "block": { "type": "argument", "parser": "minecraft:block_predicate", "executable": true } } } } }, "chat": { "type": "literal", "children": { "pattern": { "type": "argument", "parser": "brigadier:string", "properties": { "type": "phrase" }, "executable": true, "children": { "receivers": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "players", "amount": "multiple" }, "executable": true } } } } }, "data": { "type": "literal", "children": { "block": { "type": "literal", "children": { "sourcePos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "entity": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "storage": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:resource_location", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "executable": true, "children": { "inside": { "type": "literal", "executable": true } } } } }, "items": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } } } }, "predicate": { "type": "literal", "children": { "predicate": { "type": "argument", "parser": "minecraft:loot_predicate", "executable": true } } }, "score": { "type": "literal", "children": { "target": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "targetObjective": { "type": "argument", "parser": "minecraft:objective", "children": { "<": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "<=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, ">": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "matches": { "type": "literal", "children": { "range": { "type": "argument", "parser": "minecraft:int_range", "executable": true } } } } } } } } } } }, "predicate": { "type": "literal", "children": { "predicate": { "type": "argument", "parser": "minecraft:loot_predicate", "executable": true } } }, "score": { "type": "literal", "children": { "target": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "targetObjective": { "type": "argument", "parser": "minecraft:objective", "children": { "<": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "<=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, ">": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "matches": { "type": "literal", "children": { "range": { "type": "argument", "parser": "minecraft:int_range", "executable": true } } } } } } } } } } }, "await": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "block": { "type": "argument", "parser": "minecraft:block_predicate", "executable": true } } } } }, "chat": { "type": "literal", "children": { "pattern": { "type": "argument", "parser": "brigadier:string", "properties": { "type": "phrase" }, "executable": true, "children": { "receivers": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "players", "amount": "multiple" }, "executable": true } } } } }, "data": { "type": "literal", "children": { "block": { "type": "literal", "children": { "sourcePos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "entity": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "storage": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:resource_location", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } } } }, "delay": { "type": "literal", "children": { "time": { "type": "argument", "parser": "minecraft:time", "properties": { "min": 0 }, "executable": true } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "executable": true, "children": { "inside": { "type": "literal", "executable": true } } } } }, "items": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } } } }, "not": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "block": { "type": "argument", "parser": "minecraft:block_predicate", "executable": true } } } } }, "chat": { "type": "literal", "children": { "pattern": { "type": "argument", "parser": "brigadier:string", "properties": { "type": "phrase" }, "executable": true, "children": { "receivers": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "players", "amount": "multiple" }, "executable": true } } } } }, "data": { "type": "literal", "children": { "block": { "type": "literal", "children": { "sourcePos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "entity": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } }, "storage": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:resource_location", "children": { "path": { "type": "argument", "parser": "minecraft:nbt_path", "executable": true } } } } } } }, "delay": { "type": "literal", "children": { "time": { "type": "argument", "parser": "minecraft:time", "properties": { "min": 0 }, "executable": true } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "executable": true, "children": { "inside": { "type": "literal", "executable": true } } } } }, "items": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } }, "entity": { "type": "literal", "children": { "entities": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "multiple" }, "children": { "slots": { "type": "argument", "parser": "minecraft:item_slots", "children": { "item_predicate": { "type": "argument", "parser": "minecraft:item_predicate", "executable": true } } } } } } } } }, "predicate": { "type": "literal", "children": { "predicate": { "type": "argument", "parser": "minecraft:loot_predicate", "executable": true } } }, "score": { "type": "literal", "children": { "target": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "targetObjective": { "type": "argument", "parser": "minecraft:objective", "children": { "<": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "<=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, ">": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "matches": { "type": "literal", "children": { "range": { "type": "argument", "parser": "minecraft:int_range", "executable": true } } } } } } } } } } }, "predicate": { "type": "literal", "children": { "predicate": { "type": "argument", "parser": "minecraft:loot_predicate", "executable": true } } }, "score": { "type": "literal", "children": { "target": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "targetObjective": { "type": "argument", "parser": "minecraft:objective", "children": { "<": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "<=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "=": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, ">": { "type": "literal", "children": { "source": { "type": "argument", "parser": "minecraft:score_holder", "properties": { "amount": "single" }, "children": { "sourceObjective": { "type": "argument", "parser": "minecraft:objective", "executable": true } } } } }, "matches": { "type": "literal", "children": { "range": { "type": "argument", "parser": "minecraft:int_range", "executable": true } } } } } } } } } } }, "dummy": { "type": "literal", "children": { "dummy": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "children": { "attack": { "type": "literal", "children": { "entity": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "executable": true } } }, "drop": { "type": "literal", "executable": true, "children": { "all": { "type": "literal", "executable": true } } }, "jump": { "type": "literal", "executable": true }, "leave": { "type": "literal", "executable": true }, "mine": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:block_pos", "executable": true } } }, "respawn": { "type": "literal", "executable": true }, "selectslot": { "type": "literal", "children": { "slot": { "type": "argument", "parser": "brigadier:integer", "properties": { "max": 9, "min": 1 }, "executable": true } } }, "sneak": { "type": "literal", "children": { "active": { "type": "argument", "parser": "brigadier:bool", "executable": true } } }, "spawn": { "type": "literal", "executable": true }, "sprint": { "type": "literal", "children": { "active": { "type": "argument", "parser": "brigadier:bool", "executable": true } } }, "swap": { "type": "literal", "executable": true }, "use": { "type": "literal", "children": { "block": { "type": "literal", "children": { "pos": { "type": "argument", "parser": "minecraft:vec3", "executable": true, "children": { "direction": { "type": "argument", "parser": "brigadier:string", "properties": { "type": "word" }, "executable": true } } } } }, "entity": { "type": "literal", "children": { "entity": { "type": "argument", "parser": "minecraft:entity", "properties": { "type": "entities", "amount": "single" }, "executable": true, "children": { "pos": { "type": "argument", "parser": "minecraft:vec3", "executable": true } } } } }, "item": { "type": "literal", "executable": true } } } } } } }, "fail": { "type": "literal", "children": { "message": { "type": "argument", "parser": "minecraft:component", "executable": true } } }, "succeed": { "type": "literal", "executable": true } } } ================================================ FILE: docs/code-conventions.md ================================================ # Code Conventions ## Table of contents * [Naming](#naming) * [Comments](#comments) * [Function headers](#function-headers) * [Inline comments](#inline-comments) * [Smithed conventions](#smithed-conventions) * [Tag specification](#tag-specification) ## Naming - Names should be as clear and relevant as possible to avoid confusion or two modules sharing the same name by mistake. - Any name, scoreboard name or tag should be formatted as `lowercase_with_underscores`. - Scoreboards and tags should begin with the `gm4_` prefix. - Fake players used to store numbers for scoreboard operations should prefixed by "#" followed by the number, e.g. `scoreboard players set #100 gm4_some_scoreboard 100`. - Fake players that aren't constants should be prefixed by "$", e.g. `$has_soul_fire_heatsource`. - Entities that aren't visible to the player (markers) should have custom names beginning with `gm4_` if this does not interfere with functionality. - Lore on items should have the first word capitalized and no fullstop at the end of the sentence if there is only one sentence. Other punctuation (?!) can be added. Descriptions should be `"color":"gray","italic":false` whilst flavor text or commands (such as "Throw to use") should be `"color":"dark_gray","italic":true`. - Names on items should follow Minecraft's rarity colorscheme and should be `"italic":false`. ## Comments ### Function headers All functions should start with a header comment to make review and debugging easier. Such a header comment could look like: ```mcfunction # Demonstrates how header comments work. # @s = Player in survival, while tabbed-out # at @s align xyz rotated as @r # run from gm4:load # scheduled from gm4:main # with $id = Id of the player who's tabbed out # with $timestamp = Timestamp at which the player tabbed out in seconds ``` Some of the shown lines are optional, in which case the line can be omitted completely; do not replace the line with whitespace. The first three lines are positional: - **Line 1** [Optional]: `` A human-readable description of what this function does and, if needed, in which context it runs. Don't be too literal. - **Line 2** [Required]: `@s = ` A human-readable or pseudocode description of the executing entity. May also be "unspecified" in case no executor was set intentionally. - **Line 3** [Required]: `at ` A human-readable or pseudocode description of the location this function is run at. May also be "unspecified" in case no location was set intentionally. Additional lines may be present to indicate the context of the function. Each of the following may be specified multiple times, do **not** use a single line to specify multiple entries. - `run from ` The resource locator of a function that calls this function. Use of wildcards, e.g. `run from gm4:boats/*` is permitted. The namespace of the resource locator may be omitted, in which case the namespace of the current function is assumed. - `run from self` Indicate that a function calls itself. - `scheduled from ` The full resource locator of a function that schedules this function. Use of wildcards, e.g. `run from gm4:boats/*` is permitted. - `rewarded from ` The full resource locator of an advancement that rewards this function. Use of wildcards, e.g. `run from gm4:join/*` is permitted. - `run from ` A description or location of any other source that triggers this function. - `with $: ` The key of an nb tag used for the macro call of this function, as well as a description of the value the key holds. Do not specify this unless this function is a macro. Use of wildcards, e.g. `with $id_*: Set of 16 ids used to track runcows.` is permitted. ### Inline comments Inline comments should be placed to partition code into logical sections and `#` should be followed by a space, e.g. ```mcfunction # spawns items and kills player summon Item ~ ~ ~ {Item:{id:"minecraft:bone",count:1}} kill @s ``` ## Smithed conventions We follow the Smithed conventions in our data pack. For the full documentation, see the [Smithed Wiki](https://wiki.smithed.dev/conventions/). ### Tag specification Smithed defines a set of standard entity `/tag`s to ensure compatibility between different packs: * Custom entities need to get the `smithed.entity` tag * If the entity is a technical marker, also give it the `smithed.strict` tag * If the entity is a custom block marker, give it the `smithed.block` tag These tags can then be used in checks: * When you want to target all vanilla skeletons, use `@e[type=skeleton,tag=!smithed.entity]` * When you want to teleport nearby mobs, use `@e[tag=!smithed.strict]` * When you want to detect a vanilla block, use `align xyz if block ~ ~ ~ obsidian unless entity @e[tag=smithed.block,dx=0]` ================================================ FILE: docs/getting-started.md ================================================ # Getting Started This guide will show how to setup a local development environment to build, test, and contribute to our modules. ## Table of contents * [Installation](#installation) * [Building modules](#building-modules) * [Common issues](#common-issues) * [Submitting changes](#submitting-changes) ## Installation To contribute to our project you need to install [Git](https://git-scm.com/downloads) and a text editor. We recommend [VSCode](https://code.visualstudio.com/). Our modules are built using [beet](https://github.com/mcbeet/beet), which is a Python framework that allows us to automatically validate and generate part of our data packs and resource packs. You will need to install [uv](https://docs.astral.sh/uv/) as project manager. If you don't already have Python installed, uv will do that automatically. We currently use Python 3.14. ```sh # MacOS, Linux, or Git Bash (recommended) curl -LsSf https://astral.sh/uv/install.sh | sh # Powershell on Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` Create your own fork of this repository. ![Forking the repository on GitHub](images/create-fork.png) Clone your fork locally: ``` git clone https://github.com//GM4_Datapacks.git ``` Open the `GM4_Datapacks` folder in VScode. Then run `uv sync`. This will install beet and all our other dependencies. You are now ready to build our modules and make changes! ## Building modules The source of each module is stored in each `gm4_*` folder. To convert them to a valid data pack, you need to use Beet: ``` uv run beet dev --link --watch metallurgy *_shamir ``` * `uv run` makes sure that the command uses the correct Python dependencies * `beet dev` builds the data packs to the `out` folder * `--link ` copies the packs to a local world (filepath to the world's directory) * `--watch` watches for file changes and then rebuilds * `metallurgy *_shamir` specifies the list of module IDs to build Building the release version of all modules is also possible. It will output the zipped data packs in the `release/` folder. Running this could take a few minutes! ``` uv run beet -p beet-release.yaml build ``` ## Common issues When building the modules, sometimes you will encounter odd errors. If you get an error about a beet plugin exception, many times it can be resolved simply by refreshing the beet cache. ``` uv run beet cache --clear ``` ## Submitting changes To submit changes to our modules, start by creating a branch. This allows us to review every change separately and allows you to make other changes in the future. Make sure you are on the `master` branch when you do this. ![Creating a new branch in VSCode](images/create-branch.png) Alternatively, to create a branch, you can run: ``` git checkout -b ``` While making changes, test the data packs in a local world: ``` uv run beet dev --link --watch ``` When you are happy with the changes, create a commit on the branch. ![Creating a commit in VSCode](images/create-commit.png) Alternatively, to create a commit, you can run: ``` git add . git commit -m "" ``` After committing the changes locally, push them to your fork. Click on "Publish Branch". ![Pushing a commit in VSCode](images/push.png) Alternatively, to push to the fork, you can run: ``` git push -u origin ``` On GitHub, create a pull request for this new branch. Click on "Compare & pull request". ![Compare & pull request on GitHub](images/compare-and-pull-request.png) Then, write a short description of the changes you made, whether it fixes a bug or changes behavior of a module. Click on "Create pull request" when you're done. ![Writing the description of the pull request on GitHub](images/write-pull-request.png) Your changes are now ready to be reviewed by our contributors. Thank you! ================================================ FILE: docs/making-a-module.md ================================================ # Making a Module Before making a module, follow the [Getting Started](./getting-started.md) guide to setup development. ## Table of contents * [Module setup](#module-setup) * [Beet config](#beet-config) * [Load](#load) * [Writing the module](#writing-the-module) * [Guidebook pages](#guidebook-pages) * [Tests](#tests) * [Submitting a pull request](#submitting-a-pull-request) * [Finishing up for release](#finishing-up-for-release) * [Credits](#credits) * [Readme](#readme) * [Icon](#icon) * [Images](#images) * [Readme](#readme) * [Wiki page](#wiki-page) ## Module setup As with any changes to the repository, create a new branch: ``` git checkout -b my-new-module ``` Start by copying the `gm4_bat_grenades` folder to the new module ID. It is by far the smallest module so it's easy to use as a template. * Rename the folder `gm4_bat_grenades/data/gm4_bat_grenades` to `gm4_/data/gm4_`. * In the `functions` folder, find and replace all instances of `bat_grenades` with ``. ### Beet config Each module has a `beet.yaml` file that contains information on how to build the pack and some metadata used on the website. ```yaml # The ID and name of this module. The ID should always be the same as the current directory name id: gm4_disassemblers name: Disassemblers # Version "patch" value is managed by a github action. Leave it as 'X' version: '1.3.X' # Load the current directory data_pack: load: . # The build pipeline for this module pipeline: # First run any plugins to generate extra files or make changes programatically - gm4_disassemblers.generate_disassembly # Extend the default config for modules. This adds the base library and other boilerplate - gm4.plugins.extend.modules # Include any libraries - gm4.plugins.include.lib_machines # Metadata for the build and publishing on the website meta: gm4: versioning: # A list of minimum-required versions for libraries or other modules required: - lib_machines: 1.5.0 - gm4_bat_grenades: 1.7.0 # A list of any functions that create "schedule loop clocks". Necessary to turn off the module in case of a load failure schedule_loops: - main # namespace assumed to be the module id - gm4_bat_grenades:tick # but one can be manually specified website: # A description. This should be a good summary of what this module adds or achieves, to get someone interested in this module description: Break apart gold and iron tools and weapons for materials. Attach this to a mobfarm to finally make use of those extra armour sets! # Any recommended modules recommended: - gm4_resource_pack - gm4_bat_grenades # Important notes for people when they download the module. This can be empty notes: [] # Keywords used by gm4.co's search feature, may be omitted search_keywords: - shamir - enderpuff # Either null or a link to the YouTube video. Not needed if there is no video video: null # Either null or a link to the wiki page wiki: https://wiki.gm4.co/wiki/Disassemblers # The credits section. Can have different titles each being a list of names credits: Creator: - Sparks Textures by: - Kyrius modrinth: # This section is only necessary when publishing to Modrinth project_id: itk6Zfe2 smithed: # This section is only necessary when publiching to Smithed pack_id: gm4_disassemblers ``` ### Load Gamemode 4 uses [LanternMC Load](https://github.com/LanternMC/Load) so modules work nicely with other data packs. This allows modules to check which version of the gm4 base is loaded and prevents conflicts. It also allows checking whether reliant modules are installed. The required files to interact with LanternMC Load are generated automatically by a beet plugin included in the `extend.module` config, based on the metadata specified in `meta.gm4.versioning` of the `beet.yaml`. If all required dependencies are present, Lantern Load will call `init.mcfunction`. This function is written by the developer, and is responsible for adding necessary scoreboards and `/schedule`-ing any clocked functions, specified in `meta.gm4.versioning.schedule_loops`. #### Logging Messages can be logged during the load process. This can be done by appending to the `queue` field in the `gm4:log` storage. Here are a few examples: ```mcfunction data modify storage gm4:log queue append value {type:"text",message:{text:"We've been attempting to contact you about your car's extended warranty"}} data modify storage gm4:log queue append value {type:"install",module:"Bat Grenades"} ``` #### Ticking Gamemode 4 modules use `/schedule` to run functions every few ticks. There are 2 standard clock speeds. Both functions schedule itself. You are free to add a different clock speed, however these are the standards: - `tick.mcfunction` runs every tick. - `main.mcfunction` runs every 16 ticks. ## Writing the module When writing the data pack, make sure to follow our [Code Conventions](./code-conventions.md). ### Translatable text All text visible to survival players (names, lore, actionbar, advancements) should use translation fallbacks like this: ```json { "translate": "advancement.gm4.block_compressors.title", "fallback": "Clever Crushing" } ``` Additionally, every translation key defined by your data pack should be listed in the `translations.csv` babelbox file, along with its fallback as the `en_us` translation. ### Custom model data Gamemode 4 uses a custom beet plugin that enables the use of string references instead of hard-to-remember integers when dealing with custom model data. After configuring the custom model data values your data pack will use in the `beet.yaml` or `model_data`.yaml files, the plugin will auto-assign the unique integer values and substitute them into the data pack output by the beet build process. As a simple example: ```yaml # beet.yaml meta: gm4: model_data: - item: rabbit_hide reference: gm4_bat_grenades:item/bat_leather ``` ```mcfunction give @s rabbit_hide[custom_model_data="gm4_bat_grenades:item/bat_leather"] ``` This plugin also has infrastructure to auto-generate most parts of the resource pack. For more advanced usage, refer to [Resource Pack Management](./resource-pack-management.md) ### Guidebook pages Each Gamemode 4 module must include guidebook pages to aid in the explaination and progression of the module. Details on how to add a section to the guidebook can be found in [`gm4_guidebook/CONTRIBUTING.md`](https://github.com/Gamemode4Dev/GM4_Datapacks/blob/master/gm4_guidebook/CONTRIBUTING.md). ### Tests Automated tests for modules should be added in the `data/gm4_module_id/test` folder. The tests will automatically run in GitHub Actions when you submit a PR. For local development and for the full documentation, see the [PackTest](https://github.com/misode/packtest) project. ## Submitting a pull request At any point when you feel the module is ready to recieve feedback or testing, you can create a pull request. You can still make changes afterwards. *See also: [Getting Started § Submitting changes](./getting-started.md#submitting-changes)* ## Finishing up for release ### Credits Make sure to credit all relevant people in `beet.yaml`. Most modules credit the creator (`Creator`), updaters (`Updated by`) and the icon designer (`Icon Design`), however, you may add credits for any work relevant to the module. Each credits section consists of an array of strings, which hold the names of the contributors. If you also want a link to a social profile, add an entry to `gm4/contributors.json`: ```jsonc [ // ... { "name": "YourName", "links": ["https://github.com/yourname"] }, // ... ] ``` ### Icon If the module already has an icon, replace the `pack.png` and `pack.svg`. Otherwise, remove these files so the module will use the placeholder icon. ### Images Add promotional assets to an `images` folder. These can be gifs or pictures which showcase some of the module's features. ### Readme Create a `README.md` file in the root of the module directory. The contents of this file will be used on distribution platforms like Modrinth and Smithed. ### Wiki page After a module has been accepted, a wiki page may be created on [wiki.gm4.co](https://wiki.gm4.co/Main_Page). ================================================ FILE: docs/releasing-a-module.md ================================================ # Releasing a Module This guide is for maintainers that want to publish a new module on Modrinth and Smithed. Unlike our own website, this does require some manual setup. ## Table of contents * [Creating promo material](#creating-promo-material) * [Initial project setup](#initial-project-setup) * [Configuring the repo](#configuring-the-repo) * [Finishing the release](#finishing-the-release) ## Creating promo material Before a module is able to be released on Modrinth and Smithed, some promo material needs to be created: * Readme * Module icon * Short demo video ## Initial project setup ### Modrinth 1. Log in to your own account, go to the Gamemode 4 [organization settings](https://modrinth.com/organization/gamemode4/settings/projects) and click on "Create a project" 2. Set **Name** to the module name, for example `Holographic Tags` 3. Set **URL** to the module ID joined with dashes, for example `gm4-holographic-tags` 4. Set **Summary** to the website description, for example `Set up floating messages with a simple name tag!` 5. Upload the project **Icon** using the source `pack.png` 6. Set the **License** to `GNU General Public License v3` 7. Set the **External links** to github repo, wiki page, discord invite, and patreon link 8. If it exists, add a **Featured gallery image** from the gm4.co repo, preferably in `webp` format ### Smithed 1. Log in to the shared Gamemode 4 account and [create a new pack](https://smithed.net/edit?new=true) 2. Set **Project id** to the module ID, for example `gm4_holographic_tags` 3. Set **Project name** to the module name, combined with "Gamemode 4", for example `Holographic Tags | Gamemode 4` 4. Set **Short project description** to the website description, for example `Set up floating messages with a simple name tag!` 5. Set **Project website** to the module on gm4.co, for example `https://gm4.co/modules/holographic-tags` 6. On the **Versions** tab, add a dummy version using tag `0.0.1`, this will need to be removed later 7. Set the **Datapack URL** to the zip on the release branch, for example `https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/1.20/gm4_holographic_tags_1_20.zip` 8. Set **Supported Versions** to the latest release ## Configuring the repo Add the Modrinth and Smithed project IDs to the module's `beet.yaml` file. Commit or PR this change to the default branch and let the workflow run. For example: ```yaml # ... meta: gm4: # ... modrinth: project_id: AzpWemXn smithed: pack_id: gm4_holographic_tags ``` ## Finishing the release ### Modrinth 1. After the first version has been uploaded by the github action, add accurate **Tags** in settings 2. Submit the data pack for review ### Smithed 1. Remove the temporary `0.0.1` version ================================================ FILE: docs/resource-pack-management.md ================================================ # Resource Pack Management This document explains Gamemode 4's Resource Pack management tools, which use custom beet plugins to remove lots of redundancy in the source code. ## Table of Contents * [Getting Started](#getting-started) * [Building the Resource Pack](#building-the-resource-pack) * [Language Support](#language-support) * [Custom Model Data](#custom-model-data) * [Model Templates](#model-templates) * [Model Transforms](#model-transforms) * [Advanced Usage](#advanced-usage) * [`model_data` Config](#model_data-config) * [`gui_fonts` Config](#gui_fonts-config) * [`translation_linter_ignores` Config](#translation_linter_ignores-config) * [Custom Model Data Allocations](#custom-model-data-allocations) * [Extending `TemplateOptions`](#extending-templateoptions) * [Extending `TransformOptions`](#extending-transformoptions) * [Extending `ContainerGuiOptions`](#extending-containerguioptions) * [Extending `ItemModelOptions`](#extending-itemmodeloptions) ## Getting Started Just like how data pack resources are stored in a `data` directory, resource pack assets are stored in an `assets` directory for each module, and follow the same structure as an ordinary minecraft resource pack. Beet must be configured to load these files by adding to the `beet.yaml`: ```yaml resource_pack: load: . ``` ### Building the Resource Pack When building a single or list of modules with `beet dev`, a combined resource pack containing assets for the specified modules is built in the `out` directory. If the beet `--link` option is set, the pack will also be sent to Minecraft's resource packs folder. Since Gamemode 4 publishes a single resource pack that contains textures for all our modules combined, building a complete copy of the resource pack locally requires building every module. Since this often takes a while, developers are encouraged to only build the packs they are currently working on to save time. ## Language Support Support for additional languages is managed through babelbox, which uses a spreadsheet of translation keys and their corresponding values in multiple languages, which can be located at either `gm4_module_name/translations.csv` or `gm4_module_name/assets/translations.csv`. Individual language `.json` files are then generated by the build process. English (`en_us`) translation values are required for every translation key used in the pack. Other languages are optional and entries can be left empty if no translation is available. Example translations.csv: ```csv key,en_us,de_de item.gm4.bat_leather,Bat Leather,Fledermausleder text.gm4.bat_leather.1,"Would make for a very strange,","Würde eine ziemlich merkwürde," text.gm4.bat_leather.2,very tiny jacket,ziemlich kleine Jacke ergeben ``` Which if opened as a spreadsheet like excel or libreoffice is structured as |key|en_us|de_de| | - | --- | --- | |item.gm4.bat_leather|Bat Leather|Fledermausleder| |text.gm4.bat_leather.1|Would make for a very strange,|Würde eine ziemlich merkwürde,| |text.gm4.bat_leather.2|very tiny jacket|ziemlich kleine Jacke ergeben| English translations can also be auto-filled from text component fallbacks in other project files by setting `babelbox_backfill` to True in the build options. This is especially useful when adding guidebook translations, normally defined in `guidebook.json` to the `translations.csv`. ``` beet -s meta.gm4.babelbox_backfill=True dev bat_grenades ``` ## Custom Model Data The `model_data` field in `beet.yaml` can be used to generate models and item definitions in the resource pack. ```yaml model_data: - item: rabbit_hide reference: gm4_bat_grenades:item/bat_leather template: generated ``` ```mcfunction give @s rabbit_hide[custom_model_data={strings:["gm4_bat_grenades:item/bat_leather"]}] summon item ~ ~ ~ {Item:{id:"rabbit_hide",count:1,components:{"minecraft:custom_model_data":{strings:["gm4_bat_grenades:item/bat_leather"]}}}} ``` Make sure to include the namespace in the custom model data string. Starting in 26.1 this is no longer implicitly added by the resource pack plugin! For full details about the `model_data` config see [`model_data` Config](#model_data-config) ## Model Templates Templates allow for easy generation of common model file structures. Uses the `textures` field (or its default value of `reference`) to find the texture file(s). Available default templates are: - `custom`: does not generate a model file(s). - `generated`: generates a model of the minecraft:item/generated parent. Often used to turn a single texture image into a flat held item in-game. e.g. ```yaml - item: firework_star reference: item/everstone template: generated ``` - `generated_overlay`: generates a model with two layers, where the second texture is the same as the first, followed by `_overlay`. Intended for potions and other similar items - `handheld`: generates a mode of the `minecraft:item/handheld` parent. Used for turning single textures into a tool item in-game. - `vanilla`: use the vanilla item model. Often used when no textures exist yet but a CMD value should still be reserved. - `block`: generates a model of the minecraft:block/cube parent. Textures are specified in the order [top, bottom, front, side], or by mapping to their names. e.g. ```yaml - item: piston template: block reference: block/forming_press textures: front: block/forming_press_side side: block/forming_press_side top: block/forming_press_top_out bottom: block/forming_press_bottom - item: enchanting_table template: block reference: block/enchantment_extractor textures: - block/enchantment_extractor_top_out - minecraft:block/furnace_top - block/enchantment_extractor_side - block/enchantment_extractor_side ``` - `advancement`: generates a model to be used in an advancement icon. This is a different CMD from the actual item to facilitate retexturing just the advancement and not the whole item. Redirects to a specified forward model file. This template ignores the model config field. ```yaml - item: gunpowder reference: gui/advancement/bat_grenades template: name: advancement forward: item/bat_leather ``` - `legacy_machine_block`: generates a model following the block template, but with a set of transformations that scale and translate the model to match the position/scale of the "block on the head of a small armor stand" that is used in so many of our machine blocks. Individual modules can also create their own templates (see [here](#extending-templateoptions)) that may be imported and used. The most common of these is metallurgy's `shamir`, which generates models for a shamir band, and tool/armor models with the shamir applied. Has the following sub-config: - `textures_path`: directory of textures to use when the shamir is on a tool. Textures from metallurgy will be substituted for any missing textures. Unless the shamir has unique textures, its recommended to just use the metallurgy folder corresponding to the metal type. - `metal`: which metal this shamir is This template also overrides the item field of the config to allow more broad item groups, such as `armor`, `tools`, `weapons`, `axes`, `helmets` ect... ```yaml - item: swords reference: shamir/corripio template: name: shamir metal: bismuth textures_path: gm4_metallurgy:item/shamir/bismuth ``` ## Model Transforms The `transforms` field of model config is used to apply transformations (rotation/translation/scale) to a template-generated (or custom provided) model. The plugin only defines one available transform: - `item_display`. This transform does the convenience calculations for an item model that will be displayed by an item display entity. By first setting up the display entity without the resource pack, and providing the entite's display parameters, the specified model will be modified to a 1-block scale, aligned with the block grid. Accepts the required parameters `origin`, `scale`, and the optional parameters `translation=[0,0,0]`, `rotation=[0,0,0]`, `display=head` ```yaml - item: glass template: custom reference: block/liquid_tank transforms: - name: item_display origin: [0.5,0.9,0.5] scale: [0.438,0.438,0.438] translation: [0,0,0] display: head ``` ## Advanced Usage The following sections of this guide describes more advanced features of the resource pack plugin, that may be required for developers wishing to add additional templates or interact with special fonts. ### `model_data` Config All custom model data and model template config information is stored either in `meta.gm4.model_data` field of `beet.yaml`, or in the `model_data` field of the separate config file `assets/model_data.yaml`. This is a list of compounds, each of which accepts the following fields: - `item`: (required) item name, or list of item names this custom model data will be applied to. - `reference`: (required) the unique string reference to be used in source files e.g. item/bat_leather. If no namespace is specified, the module's namespace will be assumed. It is recommended to format references according to the type of item it applies to. e.g. `item/...`, `block/...`, `gui/...` ect, and especially recommended to use the model/texture file path where possible. - `model`: (optional) the model file(s) to display on items with this custom model data. If not specified, will default to the same value as `reference`. Accepts a string or list of strings, one for each item present in item. May be formatted as a dictionary mapping items to models e.g. ```yaml item: [apple, potato] model: apple: item/my_model_apple potato: item/my_model_potato ``` More complex model styles, like for items with multiple vanilla models (e.g. elytra & broken elytra, clock ect) are handled through a special-case syntax. Currently only broken elytra are supported, so packs utlizing conditions in item model definitions will need to provide handlers. ```yaml item: elytra model: type: condition_broken unbroken: item/elytra/captains_wings broken: item/elytra/broken_captains_wings ``` Items who have multiple vanilla models, like clocks, who do not utilize special-case providers in the model config will have the same provided model file applied to all variants. - `template` (optional), a model-file generating template to apply. Accepts a string name of a template, or a compound containing template configuration values. Defaults to `custom`, which generates no Model files. See [here](#model-templates) for details on available templates. - `transforms` (optional), a list of model transforms to apply. Accepts a compound of configuration data. See [here](#model-transforms) for details on available transforms. - `textures` (optional), a string, list of strings, or mapping of texture files to supply to the template. - `broadcast` (optional*), a list of sub-configs which will inherit the current config values. This reduces redundancy when defining many similar references. Due to the inheritance, each config need not contain every required field, so long as after the broadcast is carried out all required fields have a value. e.g. ```yaml model_data: - item: player_head template: generated broadcast: - textures: item/band/mundane_band reference: item/mundane_band - reference: item/lump/baryte - reference: item/lump/bauxite - reference: item/lump/bismutite - reference: item/lump/thorianite ``` - `base_model` (optional), a json (or yaml) object that will be merged into the base model's custom model data definition. This used when specific control over the minecraft base item model is required (e.g. adding a tints field for leather armor). The `base_model` json object will be merged into the `model` json object, overwriting existing fields. E.g. to acheive the following custom model data: ```json { "threshold": 3420002, "model": { "type": "minecraft:model", "model": "gm4_scuba_gear:item/flippers", "tints": [ { "type": "minecraft:dye", "default": -14455863 } ] } } ``` The following `base_model` config can be used: ```yaml model_data: - item: leather_boots reference: item/flippers template: generated_overlay base_model: tints: - type: minecraft:dye default: -14455863 ``` ### `gui_fonts` Config Custom textured GUIs using fonts can easily be setup using the `meta.gm4.gui_fonts` entry of `beet.yaml` or the `gui_fonts` entry of `model_data.yaml`. These will create a translation that displays a given image texture inside a container, like a dropper or hopper. Empty images of the correct size are available in the `base` to use as a starting point for custom GUIs. Available options are: - `translation`: the translation key that will become the texture. Recommended to follow the format `gui.gm4.my_container`. - `texture`: the image texture to display - `container`: the type of container the gui will display inside. Currently accepts `dropper`, and `hopper`. Additional containers formats can be added by [extending the ContainerGuiOptions class](#extending-containerguioptions). ```yaml gui_fonts: - translation: gui.gm4.auto_crafter container: dropper texture: gm4:gui/container/empty_dropper ``` ### `translation_linter_ignores` Config Individual translation keys can be excluded from the mecha linting process by adding them to the `meta.gm4.translation_linter_ignores` config in `beet.yaml`. This should only be used in unusual situations where translations are being used in other ways than displaying text. ### Extending TemplateOptions Individual modules may create and configure their own model templates by extending the `TemplateOptions` class in a beet plugin. The subclass must define its name as a class variable, and a `process` method which creates the models, mounts them to the pack, and returns them in a list. Additional instance attributes can be defined, and their values will be filled by any values provided in the `model_data` config under `template`. Has the following class attributes and methods that may be overridden: #### Properties - `name`: (required) A unique string that identifies this template and is set in the `template` field of `model_data`. - `default_transforms`: (optional) A list of `TransformOptions` instances. Used to give a template transformations that are applied by default, such as for a series of custom weapons with special offsets in the hand slots. - `texture_map`: (optional) A list of strings that defines the ordering of textures when configured in list form. Allows the model creation to access `config.textures` by key instead of index, which may be more robust. #### Methods - `process(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]:`: Creates the required model(s) instances defined by the `config`, mounts them to the pack `models_container` at the proper location, and returns the models for further transformation processing. - `add_namespace(self, namespace: str)`: Adds the pack namespace to any additional attributes added by this subclass, and returns a new instance of this `TemplateOptions` with that namespace applied. - `mutate_config(self, config: ModelData)`: Allows this template to mutate/mangle root level fields of the parent `ModelData`, such as `model` or `reference`. Used for unusual models like metallurgy's `shamir` that allow item groups in the `item` field for convenience. ### Extending TransformOptions Individual modules may create their own transformations by extending the `TransformOptions` class in a beet plugin. The subclass must define its name as a class variable, an `apply_transform` method that modifies a given model with the appropriate offsets, and any additional instance attributes required for that particular transform. #### Methods - `apply_transform(self, model: Model) -> None`: Modifies the given `Model` instance in-place with the desired display offset settings. ### Extending ContainerGuiOptions Individual modules may add containers to `gui_fonts` as needed by extending the `ContainerGuiOptions` class in a beet plugin. The subclass is responsible for requisitioning unicode characters from a central counter and returning the appropriate translation value and font providers. The inherited method `next_unicode(counter_cache: Cache)` can be used to easily get a unique unicode character. Additionally, there are two extendable subclasses already available for containers whose name is centered (like a dropper) and right-aligned (like a hopper). They are `CenteredContainerGui` and `RightAlignedGui` respectively. ` #### Methods - `process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]`: Requisitions unique characters and returns the translation value (usually made of these characters), and a list of font providers, which usually reference `config.texture`. ### Extending ItemModelOptions Individual modules may add additional handlers for special-case item model definitions by extending `ItemModelOptions` in a beet plugin. This subclass defines the additional config fields and a method that generates the model compound used in the item model definition. #### Methods - 'generate_json(self) -> dict[str,Any]`: Returns the model object used in the item model defintion. e.g. ```{"type": "minecraft:condition"...}``` ================================================ FILE: gm4/commands.py ================================================ import json import logging import os import shutil import re import glob from collections import defaultdict from pathlib import Path from tempfile import NamedTemporaryFile from typing import Any import beet.toolchain.commands as commands import click import yaml from beet import Project from beet.toolchain.cli import beet # NOTE pydantic does not allow reloading models with custom validators, which beet watch will do normally. # Importing them here prevents their reload on each watch cycle. from gm4.utils import MapOption # type: ignore from gm4.plugins.resource_pack import ModelData # type: ignore # import worker plugin to prevent 'worker reload' warnings import gm4.plugins.worker # type: ignore pass_project = click.make_pass_decorator(Project) # type: ignore @beet.command() @pass_project @click.pass_context @click.argument("modules", nargs=-1) @click.option("-w", "--watch", is_flag=True, help="Watch the project directory and build on file changes.") @click.option("-r", "--reload", is_flag=True, help="Enable live data pack reloading.") @click.option("-l", "--link", metavar="WORLD", help="Link the project before watching.") @click.option("-c", "--clean", is_flag=True, help="Clean the output folder.") @click.option("--log", default="INFO", type=str, help="Set the logger level.") @click.option("-nl", "--no-lint", is_flag=True, help="Skips the mecha linting step.") def dev(ctx: click.Context, project: Project, modules: tuple[str, ...], watch: bool, reload: bool, link: str | None, clean: bool, log: int | str, no_lint: bool): """Build or watch modules for development.""" module_folders = sorted(glob.glob("gm4_*")) module_aliases: defaultdict[str, list[str]] = defaultdict(list) for full_id in module_folders: alias = "".join(p[0] for p in full_id.removeprefix("gm4_").split("_")) module_aliases[alias].append(full_id) selected_modules: list[str] = [] for m in modules: alias = re.sub("\\d+$", "", m) if alias in module_aliases: if len(module_aliases[alias]) > 1: index = re.sub("^[a-z]+", "", m) if index.isdecimal() and 1 <= int(index) <= len(module_aliases): m = module_aliases[alias][int(index) - 1] else: click.echo(f"[GM4] Alias {alias} is ambiguous, add a number suffix ({', '.join(f'{i+1}: {a}' for i, a in enumerate(module_aliases[alias]))})") return else: m = module_aliases[alias][0] if not m.startswith("gm4_"): m = f"gm4_{m}" selected_modules.append(m) if len(selected_modules) == 0: click.echo("[GM4] You need at least one module") return if clean: click.echo(f"[GM4] Cleaning output folder...") shutil.rmtree("out", ignore_errors=True) click.echo(f"[GM4] Building {len(selected_modules)} module{'' if len(selected_modules) == 1 else 's'}: {', '.join(selected_modules)}") logger = logging.getLogger() logger.setLevel(log) # logger.addHandler(LogHandler()) # TODO configure the log handler to GM4's preferred formatting config = yaml.safe_load(Path("beet-dev.yaml").read_text()) # command-determined config options broadcast_config: dict[str, Any] = next((p for p in config["pipeline"] if isinstance(p, dict))) # type: ignore broadcast_config["broadcast"] = selected_modules if no_lint: broadcast_config["require"].insert(0, "gm4.plugins.test.skip_mecha_lint") if reload: broadcast_config["require"].insert(0, "beet.contrib.livereload") build_dynamic_config(config, ctx, project, watch, link) # start the project build @beet.command() def clean(): """Cleans the output folder.""" shutil.rmtree("out", ignore_errors=True) shutil.rmtree("release", ignore_errors=True) click.echo(f"[GM4] Cleaned output and release folder!") @beet.command() @pass_project @click.pass_context @click.argument("modules", nargs=-1) @click.option("-w", "--watch", is_flag=True, help="Watch the project directory and build on file changes.") @click.option("-c", "--clean", is_flag=True, help="Clean the output folder.") def readme_gen(ctx: click.Context, project: Project, modules: tuple[str, ...], watch: bool, clean: bool): """Generates all README files for manual uplaoad""" modules = tuple(m if m.startswith("gm4_") else f"gm4_{m}" for m in modules) if len(modules) == 0: click.echo("[GM4] You need at least one module") return if clean: click.echo(f"[GM4] Cleaning output folder...") shutil.rmtree("out", ignore_errors=True) click.echo(f"[GM4] Generating READMEs for: {', '.join(modules)}") # we want to only read in the metadata from each project fo make a readme, not run the whole build pipeline # so we have to manually expand the broadcast instead of relying on beet's broadcast option. subprojects: list[dict[str,Any]] = [] for module in modules: module_config = yaml.safe_load(Path(f"{module}/beet.yaml").read_text()) for key in ["data_pack", "resource_pack", "pipeline", "require"]: # remove pack resources module_config.pop(key, None) module_config["pipeline"] = [ "gm4.plugins.manifest.write_credits", "gm4.plugins.readme_generator", "gm4.plugins.output.readmes" ] subprojects.append(module_config) config = { "pipeline": [ *subprojects, "gm4.plugins.finished" ], "meta": { "autosave": { "link": False } } } build_dynamic_config(config, ctx, project, watch, link=None) def build_dynamic_config(config: dict[str,Any], ctx: click.Context, project: Project, watch: bool, link: str|None): """Creates a tempfile on disk to pass to beet. Enables runtime dynamic setup of the build process that is compatiable with `beet watch`""" config["directory"] = str(project.directory) # set working directory to where CLI was invoked with NamedTemporaryFile(mode="wt", delete=False, suffix=".json") as f: project.config_path = f.name json.dump(config, f, indent=1) project.reset() # delete previously resolved config ctx.invoke(commands.watch if watch else commands.build, link=link) os.remove(f.name) # delete tempfile ================================================ FILE: gm4/contributors.json ================================================ [ { "name": "15Redstones", "links": ["https://twitter.com/15Redstones"] }, { "name": "dvitski", "links": ["https://bsky.app/profile/dvitski.cc"] }, { "name": "Bloo", "links": ["https://bsky.app/profile/bloo.boo"] }, { "name": "BPR", "links": ["https://bsky.app/profile/bpr02.com"] }, { "name": "Bunnygamers", "links": ["https://bsky.app/profile/bunnygamers.bsky.social"] }, { "name": "catter1", "links": ["https://bsky.app/profile/catter.dev"] }, { "name": "Chopper2112", "links": ["https://twitter.com/TheChopper2112"] }, { "name": "Denniss", "links": ["https://github.com/Dennis-0"] }, { "name": "Dinoguin_Jess", "links": ["https://github.com/Dinoguin-Jess"] }, { "name": "Djones", "links": ["https://bsky.app/profile/thanathor.bsky.social"] }, { "name": "DuckJr", "links": ["https://twitter.com/DuckJr94"] }, { "name": "Energyxxer", "links": ["https://youtube.com/user/Energyxxer"] }, { "name":"foodiebonus", "links":[] }, { "name": "Fyid", "links": ["https://twitter.com/FyidRants"] }, { "name":"Hozz", "links":[] }, { "name": "JP12", "links": ["https://github.com/jpeterik12"] }, { "name": "kindabland", "links": ["https://github.com/kindabland"] }, { "name": "Kroppeb", "links": ["https://tech.lgbt/@Kroppeb"] }, { "name": "Kruthers", "links": ["https://twitter.com/Pandakruthers"] }, { "name": "Kyrius", "links": ["https://bsky.app/profile/kyriuspixels.bsky.social"] }, { "name": "Lue", "links": ["https://github.com/Luexa"] }, { "name": "Lune6", "links": ["https://bsky.app/profile/lune6.bsky.social"] }, { "name": "Modulorium", "links": ["https://www.modulorium.dev"] }, { "name": "Misode", "links": ["https://bsky.app/profile/misode.dev"] }, { "name": "Memo", "links": ["https://linktr.ee/miraku_memo"] }, { "name": "Nik3141", "links": ["https://youtube.com/channel/UCgKd6elt0L3w-d7ryLw-7HQ"] }, { "name": "runcows", "links": ["https://bsky.app/profile/runcows.bsky.social"] }, { "name": "Scommander", "links": ["https://github.com/Scommander"] }, { "name": "SethBling", "links": ["https://youtube.com/user/SethBling"] }, { "name": "SiberianHat", "links": ["https://twitter.com/SiberianHat"] }, { "name": "SirSheepe", "links": ["https://bsky.app/profile/sirsheepe.bsky.social"] }, { "name": "Sparks", "links": ["https://bsky.app/profile/selcouthsparks.bsky.social"] }, { "name": "SpecialBuilder32", "links": ["https://bsky.app/profile/specialbuilder32.bsky.social"] }, { "name": "The8BitMonkey", "links": ["https://youtube.com/the8bitmonkey"] }, { "name": "torbray", "links": ["https://twitter.com/torbray00"] }, { "name": "Wumpacraft", "links": ["https://twitter.com/wumpacraft"] }, { "name": "Venomousbirds", "links": ["https://venomousbirds.artstation.com/"] }, { "name": "MulverineX", "links": ["https://modrinth.com/user/MulverineX"] } ] ================================================ FILE: gm4/plugins/annotations.py ================================================ import logging import logging.handlers import os import re from functools import partial from pathlib import Path from typing import Any from beet import Context, ProjectCache from gm4.plugins.manifest import ManifestCacheModel, ManifestFileModel def beet_default(ctx: Context): """Sets up a logging handlers to emit build log entries with the github action annotation format, and create a summary with useful build information.""" root_logger = logging.getLogger(None) # get root logger # annotation handler emits throughout build to stderr ann_handler = logging.StreamHandler() ann_handler.setFormatter(AnnotationFormatter()) def filter(record: logging.LogRecord): if record.name == "time": return False # disable annotations for time - is spammy in debug mode return True ann_handler.addFilter(filter) root_logger.handlers.clear() # clear the handler set by beet CLI toolchain root_logger.addHandler(ann_handler) # summary handler holds onto certain records until the exit phase when it emits to a markdown summary sum_handler = SummaryHandler(1000, ctx.cache) logging.getLogger("gm4.output").addHandler(sum_handler) logging.getLogger("gm4.manifest.update_patch").addHandler(sum_handler) # after the whole build, flush the stored records and form the markdown summary yield sum_handler.flush() LEVEL_CONVERSION = { logging.DEBUG: "debug", logging.INFO: "notice", logging.WARNING: "warning", logging.ERROR: "error", logging.CRITICAL: "error" } class AnnotationFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: expl = record.getMessage().replace("\n", "%0A") # use urlencoded newline level = LEVEL_CONVERSION.get(record.levelno, LEVEL_CONVERSION[logging.INFO]) filename = None line = None col = None if getattr(record, "gh_annotate_skip", False): # disable annotations for any gm4 log events flagged manually return f"{level.capitalize()}: {record.name} {expl}" # formatted to resemble annotated entry match = re.match(r"(.+):(\d+):(\d+)", getattr(record, "annotate", "")) # extract filename and location from mecha annotation if match: filename, line, col = match.groups() return f"::{level} file={filename},line={line},col={col},title={record.name}::{record.name} {expl}" return f"::{level} title={record.name}::{record.name} {expl}" class SummaryHandler(logging.handlers.BufferingHandler): def __init__(self, capacity: int, beet_cache: ProjectCache): super().__init__(capacity) self.beet_cache = beet_cache self.summary_created = False def flush(self): summary_entries: dict[str, Any] = {} this_manifest = ManifestCacheModel.model_validate(self.beet_cache["gm4_manifest"].json) last_manifest = ManifestFileModel.model_validate(self.beet_cache["previous_manifest"].json) this_versions = {id: entry.version for id, entry in (this_manifest.modules | this_manifest.libraries).items()} last_versions = {id: entry.version for id, entry in ({e.id: e for e in last_manifest.modules} | last_manifest.libraries).items()} library_ids = [e.id for e in this_manifest.libraries.values()] for record in self.buffer: if record.name.startswith("gm4.output"): _, _, service, module_id = record.name.split('.') elif record.name.startswith("gm4.manifest.update_patch"): module_id = getattr(record, "project_id") service = "gamemode4" else: continue if module_id in library_ids: # manifests store with "lib_" prefix module_id = module_id.replace("gm4_", "lib_") # init row if module_id not in summary_entries: last_version_num = last_versions.get(module_id, '?.?.?') this_version_num = this_versions.get(("gm4_resource_pack" if module_id=="resource_pack" else module_id), '?.?.?') summary_entries[module_id] = { "name": module_id, "ver_update": f"{last_version_num} → {this_version_num}", "logs": [] # list of tuples ("smithed", log_message) } # append to logs summary_entries[module_id]["logs"].append((service, record.getMessage())) # form table entries from entries table = "Module | Version Update | Logs \n |-|:-:|-|" for entry in dict(sorted(summary_entries.items())).values(): nested_table = "
" for service, message in entry['logs']: nested_table += f"" nested_table += "
{service}{message}
" table += f"\n {entry['name']} | {entry['ver_update']} | {nested_table}" summary = "# :rocket: Build Deployment Summary :rocket:\n"+table if not self.summary_created: env_file = os.getenv("GITHUB_STEP_SUMMARY") if env_file: with open(env_file, "a") as f: f.write(summary) # python normally has no access to env variables, so we go direct to the action env file. self.summary_created = True self.buffer.clear() def add_module_dir_to_diagnostics(ctx: Context): """Sets up a logging record filter that prepends the proper module folder to mecha diagnostics""" local_filter = partial(add_mecha_subproject_dir, subproject_dir=ctx.directory.stem) mc_logger = logging.getLogger("mecha") mc_logger.addFilter(local_filter) yield mc_logger.removeFilter(local_filter) # clear the filter once done (after mecha) def add_mecha_subproject_dir(record: logging.LogRecord, subproject_dir: str|Path = ""): if d:=getattr(record, "annotate"): record.annotate = f"{subproject_dir}/{d}" # modify record in place return True ================================================ FILE: gm4/plugins/autoload.py ================================================ from beet import Context def beet_default(ctx: Context): """Loads plugins auto-added to every beet subproject. Configured in pyproject.toml Used primarily to load custom-merge-rules that will apply between broadcast packs, at least until a better option is available in beet""" ctx.require( "beet.contrib.default", "gm4.plugins.resource_pack.merge_policy", "gm4_metallurgy.shamir_model_template.merge_policy" ) ================================================ FILE: gm4/plugins/backwards.py ================================================ import logging from typing import Any, Tuple, Callable from beet import Context, Pack, NamespaceFile logger = logging.getLogger("gm4.backwards") # Generates overlays to support older versions def beet_default(ctx: Context): yield def backport(pack: Pack[Any], format: int, run: Callable[[str, NamespaceFile], NamespaceFile | None]): resources: dict[Tuple[type[NamespaceFile], str], NamespaceFile] = dict() for file_type in pack.resolve_scope_map().values(): proxy = pack[file_type] for path in proxy.keys(): resources[(file_type, path)] = proxy[path] for overlay in pack.overlays.values(): if check_formats(overlay, format): for file_type in overlay.resolve_scope_map().values(): proxy = overlay[file_type] for path in proxy.keys(): resources[(file_type, path)] = proxy[path] for (file_type, path), resource in resources.items(): try: new_resource = run(path, resource) except BaseException as e: e.add_note(f"Failed to backport[{run.__name__}] {file_type.snake_name} {path}") raise e if new_resource: overlay = pack.overlays[f"backport_{format}"] overlay.supported_formats = { "min_inclusive": 1, "max_inclusive": format } overlay.min_format = 1 overlay.max_format = format overlay[path] = new_resource def check_formats(overlay: Pack[Any], format: int): if overlay.min_format and overlay.max_format: return get_major(overlay.min_format) <= format <= get_major(overlay.max_format) if overlay.supported_formats: match overlay.supported_formats: case int(value): return value == format case [min, max]: return min <= format <= max case { "min_inclusive": min, "max_inclusive": max }: return min <= format <= max case _: raise ValueError(f"Unknown supported_formats structure {overlay.supported_formats}") if overlay.pack_format: return overlay.pack_format == format return False def get_major(format: int | tuple[int] | tuple[int, int]): return format if isinstance(format, int) else format[0] ================================================ FILE: gm4/plugins/extend.py ================================================ from beet import Context, subproject from pathlib import Path import yaml def _generate_extend_plugin(name: str): def plugin(ctx: Context): """Extends the specified project config within a pipeline without losing necessary parent context - necessary to run "boilerplate" plugins in the middle of a build pipeline""" with open(Path(name)) as f: conf = yaml.safe_load(f) with ctx.override(**conf.get('meta', {})): for process in conf['pipeline']: # manually call each pipeline entry as if it were in the parent config if type(process) is dict: process = subproject({"pipeline": [process], "meta": conf.get('meta', {})}) # else, it's a plugin name str ctx.require(process) return plugin library = _generate_extend_plugin('library.yaml') module = _generate_extend_plugin('module.yaml') ================================================ FILE: gm4/plugins/finished.py ================================================ from beet import Context import logging logger = logging.getLogger("gm4") def beet_default(ctx: Context): logger.info("Finished!") ================================================ FILE: gm4/plugins/include.py ================================================ from beet import Context, subproject from functools import cache # for importing libraries into a module, with logic to prevent double imports __path__ = "" @cache def __getattr__(name: str): # redirect plugin calls to the right library dynamically def plugin(ctx: Context): # load subproject, if not already present added_libs = ctx.cache['currently_building'].json['added_libs'] if name not in added_libs: ctx.require(subproject({'directory': f'../{name}', 'extend': 'beet.yaml'})) added_libs.append(name) return plugin ================================================ FILE: gm4/plugins/manifest.py ================================================ import datetime import hashlib import json import logging import os import sys from gzip import GzipFile from io import BytesIO from pathlib import Path from typing import Any, Optional import yaml from beet import Context, InvalidProjectConfig, PluginOptions, TextFile, load_config, Function from beet.library.base import _dump_files # type: ignore ; private method used to deterministicify pack dumping from nbtlib.contrib.minecraft import StructureFileData, StructureFile # type: ignore ; no stub from pydantic import BaseModel from repro_zipfile import ReproducibleZipFile # type: ignore ; no stub from gm4.plugins.versioning import VersioningConfig from gm4.utils import Version, run parent_logger = logging.getLogger("gm4.manifest") SUPPORTED_GAME_VERSIONS = ["26.1"] # config models for beet.yaml metas CreditsModel = dict[str, list[str]] class WebsiteConfig(PluginOptions): description: str recommended: list[str] = [] notes: list[str] = [] search_keywords: list[str] = [] class ModrinthConfig(PluginOptions): project_id: str class SmithedConfig(PluginOptions): pack_id: str class PMCConfig(PluginOptions): uid: int class ManifestConfig(PluginOptions, extra="ignore"): minecraft: list[str] = SUPPORTED_GAME_VERSIONS versioning: Optional[VersioningConfig] = None # distribution website: Optional[WebsiteConfig] = None modrinth: Optional[ModrinthConfig] = None smithed: Optional[SmithedConfig] = None pmc: Optional[PMCConfig] = None # promo video: str|None = None wiki: str|None = None credits: CreditsModel # models for meta.json and cached manifest class ManifestModuleModel(BaseModel): """Single module's entry in manifest""" id: str name: str version: str hash: str video_link: str = "" wiki_link: str = "" credits: CreditsModel requires: list[str] = [] description: str recommends: list[str] = [] minecraft: list[str] = [] hidden: bool = False important_note: Optional[str] search_keywords: list[str] = [] publish_date: Optional[str] modrinth_id: Optional[str] smithed_link: Optional[str] pmc_link: Optional[int] class ManifestCacheModel(BaseModel): """describes the structure of the cached manifest""" last_commit: str modules: dict[str, ManifestModuleModel] libraries: dict[str, ManifestModuleModel] base: Any contributors: Any class ManifestFileModel(BaseModel): """describes the structure of the meta.json saved to disk""" last_commit: str modules: list[ManifestModuleModel] # straight list for website backward compat libraries: dict[str, ManifestModuleModel] contributors: Any def create(ctx: Context): """Collect a manifest for all modules from respective beet.yaml files.""" manifest = ManifestCacheModel(last_commit=run(["git", "rev-parse", "HEAD"]), modules={}, libraries={}, base={}, contributors=None) logger = parent_logger.getChild("create") for glob, manifest_section in [("gm4_*", manifest.modules), ("lib_*", manifest.libraries), ("resource_pack", manifest.modules)]: for pack_id in [p.name for p in sorted(ctx.directory.glob(glob))]: try: config = load_config(Path(pack_id) / "beet.yaml") gm4_meta = ctx.validate("gm4", validator=ManifestConfig, options=config.meta["gm4"]) # manually parse config into models manifest_section[pack_id] = ManifestModuleModel( id = config.id, name = config.name, version = config.version, hash = "", video_link = gm4_meta.video or "", wiki_link = gm4_meta.wiki or "", credits = gm4_meta.credits, requires = [e for e in gm4_meta.versioning.required.keys() if not e.startswith("lib")] if gm4_meta.versioning else [], description = gm4_meta.website.description if gm4_meta.website else "", recommends = gm4_meta.website.recommended if gm4_meta.website else [], important_note = gm4_meta.website.notes[0] if gm4_meta.website and len(gm4_meta.website.notes) > 0 else None, minecraft = gm4_meta.minecraft, hidden = len(gm4_meta.minecraft) == 0 or gm4_meta.website is None, publish_date = None, search_keywords = gm4_meta.website.search_keywords if gm4_meta.website else [], modrinth_id = gm4_meta.modrinth.project_id if gm4_meta.modrinth else None, smithed_link = gm4_meta.smithed.pack_id if gm4_meta.smithed else None, pmc_link = gm4_meta.pmc.uid if gm4_meta.pmc else None, ) except InvalidProjectConfig as exc: logger.debug(exc.explanation) # Read the contributors metadata contributors_file = Path("gm4/contributors.json") if contributors_file.exists(): contributors_list = json.loads(contributors_file.read_text()) manifest.contributors = {c["name"]: c for c in contributors_list} else: logger.debug("No contributors.json found") manifest.contributors = [] # Read the gm4 base module metadata base_file = Path("base/beet.yaml") base_config = yaml.safe_load(base_file.read_text()) manifest.base = {"version": base_config["version"]} # Cache the new manifest, so sub-pipelines can access it ctx.cache["gm4_manifest"].json = manifest.model_dump() # Read in the previous manifest, if found version = os.getenv("VERSION", "26.1") release_dir = Path('release') / version manifest_file = release_dir / "meta.json" if manifest_file.exists(): ctx.cache["previous_manifest"].json = json.loads(manifest_file.read_text()) else: if not ctx.meta.get("gm4_dev"): if os.getenv("MASTER_BUILD"): # gh actions is building - forgetting to add a meta.json breaks things logger.error("No existing meta.json manifest file was located. Build was cancelled to avoid faulty releases.") sys.exit(1) # quit the build and mark the github action as failed else: logger.warning("No existing meta.json manifest file was located") ctx.cache["previous_manifest"].json = ManifestFileModel(last_commit="",modules=[],libraries={},contributors=[]).model_dump() def update_patch(ctx: Context): """Checks the datapack files for changes from last build, and increments patch number""" yield logger = parent_logger.getChild("update_patch") # load current manifest from cache this_manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) pack = ({e.id:e for e in (this_manifest.libraries|this_manifest.modules).values()})[ctx.project_id] # attempt to load prior meta.json manifest last_manifest = ManifestFileModel.model_validate(ctx.cache["previous_manifest"].json) released_modules: dict[str, ManifestModuleModel] = {m.id:m for m in last_manifest.modules if m.version}|{l.id:l for l in last_manifest.libraries.values()} # determine this modules status released = released_modules.get(ctx.project_id, None) last_ver = Version(released.version) if released else Version("0.0.0") this_ver = Version(ctx.project_version) publish_date = released.publish_date if released else None pack.publish_date = publish_date or datetime.datetime.now().date().isoformat() old_hash = released.hash if released else "" # watch for output file changes fileobj = BytesIO() scanned_pack = ctx.packs[0 if ctx.meta.get("pack_scan")=="resource_pack" else 1] with ReproducibleZipFile(fileobj, mode='w') as zf: _dump_files(zf, sorted(scanned_pack.list_files())) # write datapack to temporary memory # beet's default dump depends on file load order, which is nondeterministic # here we recreate the ctx.data.dump(zf) behavior but by sorting the files first new_hash = hashlib.sha1(fileobj.getvalue()).hexdigest() pack.hash = new_hash # first release of a module if not released: pack.version = pack.version.replace("X", "0") logger.debug(f"First release of {ctx.project_id}", extra={"project_id": ctx.project_id}) # otherwise check for changes else: if (this_ver != last_ver.replace(patch=None)) or (new_hash != old_hash): # changes were made, bump the patch if this_ver.minor > last_ver.minor or this_ver.major > last_ver.major: # type: ignore this_ver.patch = 0 logger.info(f"Feature update for {ctx.project_id}, setting version to {this_ver}", extra={"gh_annotate_skip": True, "project_id": ctx.project_id}) else: this_ver.patch = last_ver.patch + 1 # type: ignore logger.info(f"Patch update for {ctx.project_id}, incrementing to {this_ver}", extra={"gh_annotate_skip": True, "project_id": ctx.project_id}) pack.version = str(this_ver) else: # no changes, keep the patch pack.version = released.version ctx.cache["gm4_manifest"].json = this_manifest.model_dump() def write_meta(ctx: Context): """Write the updated meta.json file.""" version = os.getenv("VERSION", "26.1") release_dir = Path('release') / version os.makedirs(release_dir, exist_ok=True) manifest_file = release_dir / "meta.json" manifest = ctx.cache["gm4_manifest"].json.copy() manifest["modules"] = list(manifest["modules"].values()) # convert modules dict down to list for backwards compatability manifest.pop("base") manifest_file.write_text(json.dumps(manifest, indent=2)) def write_credits(ctx: Context): """Writes the credits metadata to CREDITS.md. and collects for README.md""" manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) contributors = manifest.contributors module = manifest.modules.get(ctx.project_id) credits = module.credits if module else {} if len(credits) == 0: return # traverses contributors and associates name with links for printing linked_credits: CreditsModel = {} for title in credits: people = credits[title] if len(people) == 0: continue linked_credits[title] = [] for p in people: contributor = contributors.get(p, { "name": p }) name = contributor.get("name", p) links: list[str] | str = contributor.get("links", []) if isinstance(links, list) and len(links) >= 1: linked_credits[title].append(f"[{name}]({links[0]})") else: linked_credits[title].append(f"{name}") # format credits for CREDITS.md text = "# Credits\n" for title in linked_credits: text += f"\n## {title}\n" for link in linked_credits[title]: text += f'- {link}\n' ctx.data.extra["CREDITS.md"] = TextFile(text) ctx.meta['linked_credits'] = linked_credits # pass data to README portion of pipeline def write_updates(ctx: Context): """Writes the module update commands to this module's init function.""" for overlay in ctx.data.overlays.values(): write_update_function(overlay.functions.get(f"{ctx.project_id}:init"), ctx) write_update_function(ctx.data.functions.get(f"{ctx.project_id}:init"), ctx) def write_update_function(init: Optional[Function], ctx: Context): if not init: return manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) modules = manifest.modules score = f"{ctx.project_id.removeprefix('gm4_')} gm4_modules" version = Version(modules[ctx.project_id].version) # Update score setter for this module, and add version to gm4:log last_i=-1 for i, line in enumerate(init.lines): if "gm4_modules" in line: init.lines[i] = line.replace(f"{score} 1", f"{score} {version.int_rep()}").replace(f"{score} matches 1", f"{score} matches {version.int_rep()}") last_i = i init.lines.insert(last_i+1, f"data modify storage gm4:log versions append value {{id:\"{ctx.project_id}\",module:\"{ctx.project_name}\",version:\"{version}\"}}") # Remove the marker if it exists if "#$moduleUpdateList" in init.lines: init.lines.remove("#$moduleUpdateList") # Append the module update list regardless if the marker existed init.lines.append("# Module update list") init.lines.append("data remove storage gm4:log queue[{type:'outdated'}]") for i, m in modules.items(): if not i.startswith("gm4_"): continue # not a datapack (ie the rp) and has score to print version = Version(m.version).int_rep() website = f"https://gm4.co/modules/{m.id[4:].replace('_','-')}" init.lines.append(f"execute if score {m.id} load.status matches -1.. if score {m.id.removeprefix('gm4_')} gm4_modules matches ..{version - 1} run data modify storage gm4:log queue append value {{type:'outdated',module:'{m.name}',download:'{website}',render:{{'text':'{m.name}','click_event':{{'action':'open_url','url':'{website}'}},'hover_event':{{'action':'show_text','value':{{'text':'Click to visit {website}','color':'#4AA0C7'}}}}}}}}") def repro_structure_to_bytes(content: StructureFileData) -> bytes: """a modified Structure.to_bytes from beet, which ensures the GZip does not add the current time.time to the nbt file header. Used for deterministic pack builds and auto-patch detection""" dst = BytesIO() with GzipFile(fileobj=dst, mode="wb", mtime=0) as fileobj: StructureFile(content).write(fileobj) # type: ignore ; nbtlib has no type annotations return dst.getvalue() ================================================ FILE: gm4/plugins/module.py ================================================ from beet import Context, PngFile, Advancement from pathlib import Path def default_pack_icon(ctx: Context): """Adds the default pack.png from base to the build, if one does not already exist""" if "pack.png" not in ctx.data.extra: ctx.data.extra["pack.png"] = PngFile(source_path=Path("base/pack.png")) def gm4_root_advancement(ctx: Context): """Adds the root display advancement gm4:root, if the module has any display advancements""" if len(ctx.data["gm4"].advancements.keys()) > 0: ctx.data.advancements["gm4:root"] = Advancement( { "display": { "icon": { "id": "command_block", "components": { "minecraft:custom_model_data": { "strings": [ "gm4:gui/advancement/root" ] } } }, "title": { "translate": "advancement.gm4.root.title", "fallback": "Gamemode 4" }, "description": { "translate": "advancement.gm4.root.description", "fallback": "Semi-funny blurb about GM4", "color": "gray" }, "background": "block/light_blue_concrete_powder", "announce_to_chat": False }, "criteria": { "automatic": { "trigger": "minecraft:tick" } } } ) ================================================ FILE: gm4/plugins/output.py ================================================ from beet import Context from pathlib import Path import os import json import re import requests import shutil import logging from gm4.utils import run, Version, NoneAttribute from gm4.plugins.manifest import ManifestConfig, ManifestCacheModel parent_logger = logging.getLogger("gm4.output") MODRINTH_API = "https://api.modrinth.com/v2" MODRINTH_AUTH_KEY = "BEET_MODRINTH_TOKEN" SMITHED_API = "https://api.smithed.dev/v2" SMITHED_AUTH_KEY = "BEET_SMITHED_TOKEN" USER_AGENT = "Gamemode4Dev/GM4_Datapacks/release-pipeline (gamemode4official@gmail.com)" def beet_default(ctx: Context): """Saves the datapack to the ./out folder in it's exit phase. Should be first in pipeline to properly wrap all other plugins cleanup phases""" version = os.getenv("VERSION", "26.1") out_dir = Path("out") yield # wait for exit phase, after other plugins cleanup ctx.data.save( path=out_dir / f"{ctx.project_id}_{version.replace('.', '_')}", overwrite=True, ) def resource_pack(ctx: Context): """Saves the resourcepack to the ./out folder.""" version = os.getenv("VERSION", "26.1") out_dir = Path("out") ctx.assets.save( path=out_dir / f"gm4_resource_pack_{version.replace('.', '_')}", overwrite=True ) def release_resource_pack(ctx: Context): """Saves the resourcepack to the ./out folder.""" version = os.getenv("VERSION", "26.1") release_dir = Path("release") / version yield ctx.assets.save( path=release_dir / f"gm4_resource_pack_{version.replace('.', '_')}.zip", overwrite=True, zipped=True ) def test(ctx: Context): """Saves the zipped datapack to the ./out folder in it's exit phase. Should be first in pipeline to properly wrap all other plugins cleanup phases""" out_dir = Path("out") yield # wait for exit phase, after other plugins cleanup ctx.data.save( path=out_dir / ctx.project_id, overwrite=True, zipped=True, ) def release(ctx: Context): """ Saves the zipped datapack and metadata to the ./release/{version} folder. Should be first in pipeline to properly wrap all other plugins cleanup phases If the module has the `version` and `meta.modrinth.project_id` fields, and `BEET_MODRINTH_TOKEN` environment variable is set, will try to publish a new version to Modrinth if it doesn't already exist. Similarly, if the module has the `version` and `meta.smithed.pack_id` fields, and `BEET_SMITHED_TOKEN` environment variable is set, will try to publish a new version to Smithed if it doesn't already exist. """ version_dir = os.getenv("VERSION", "26.1") release_dir = Path("release") / version_dir corrected_project_id = stem if (stem:=ctx.directory.stem).startswith("lib") else ctx.project_id file_name = f"{corrected_project_id}_{version_dir.replace('.', '_')}.zip" yield # wait for exit phase, after other plugins cleanup ctx.data.save( path=release_dir / file_name, overwrite=True, zipped=True, ) generated_dir = release_dir / "generated" pack_icon_dir = generated_dir / "pack_icons" os.makedirs(pack_icon_dir, exist_ok=True) if "pack.png" in ctx.data.extra: ctx.data.extra["pack.png"].dump(pack_icon_dir, f"{corrected_project_id}.png") smithed_readme_dir = generated_dir / "smithed_readmes" os.makedirs(smithed_readme_dir, exist_ok=True) if "smithed_readme" in ctx.meta: ctx.meta['smithed_readme'].dump(smithed_readme_dir, f"{corrected_project_id}.md") config = ctx.validate("gm4", ManifestConfig) # publish to download platforms publish_modrinth(ctx, config, release_dir, file_name) publish_smithed(ctx, config, file_name) def publish_modrinth(ctx: Context, config: ManifestConfig, release_dir: Path, file_name: str): '''Attempts to publish pack to modrinth''' auth_token = os.getenv(MODRINTH_AUTH_KEY, None) logger = parent_logger.getChild(f"modrinth.{ctx.project_id}") if config.modrinth and auth_token: # update page description res = requests.get(f"{MODRINTH_API}/project/{config.modrinth.project_id}", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}) if not (200 <= res.status_code < 300): if res.status_code == 404: logger.warning(f"Cannot edit description of modrinth project {config.modrinth.project_id} as it doesn't exist.") else: logger.warning(f"Failed to get project: {res.status_code} {res.text}") return existing_readme = res.json()["body"] if existing_readme != (d:=ctx.meta['modrinth_readme'].text): logger.debug("Readme and modrinth-page content differ. Updating webpage body") res = requests.patch(f"{MODRINTH_API}/project/{config.modrinth.project_id}", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, json={"body": d}) if not (200 <= res.status_code < 300): logger.warning(f"Failed to update description: {res.status_code} {res.text}") logger.info(f"Successfully updated description of {ctx.project_name}", extra={"gh_annotate_skip": True}) # upload datapack zip if ctx.project_version: version = ctx.cache["gm4_manifest"].json["modules"].get(ctx.project_id, {}).get("version", None) if version is None: logger.warning("Full version number not available in ctx.meta. Skipping publishing") return res = requests.get(f"{MODRINTH_API}/project/{config.modrinth.project_id}/version", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}) if not (200 <= res.status_code < 300): if res.status_code == 404: logger.warning(f"Cannot publish to modrinth project {config.modrinth.project_id} as it doesn't exist.") else: logger.warning(f"Failed to get project versions: {res.status_code} {res.text}") return project_data = res.json() matching_version = next((v for v in project_data if v["version_number"] == str(version)), None) if matching_version is not None: # patch version already exists # update mc versions if necessary if len(config.minecraft) > 0 and not set(matching_version["game_versions"]) == set(config.minecraft): # supported versions has changed and is not empty logger.debug("Additional MC version support has been added to an existing patch version. Updating existing modrinth version data") res = requests.patch(f"{MODRINTH_API}/version/{matching_version['id']}", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, json={ "game_versions": config.minecraft }) if not (200 <= res.status_code < 300): logger.warning(f"Failed to patch project versions: {res.status_code} {res.text}") return if len(config.minecraft) > 0: # supported versions is not empty, post new version with open(release_dir / file_name, "rb") as f: file_bytes = f.read() changelog = run(["git", "log", "-1", "--format=%s"]) changelog = re.sub(r"\(#(\d+)\)", "([#\\1](https://github.com/Gamemode4Dev/GM4_Datapacks/pull/\\1))", changelog) res = requests.post(f"{MODRINTH_API}/version", headers={'Authorization': auth_token, 'User-Agent': USER_AGENT}, files={ "data": json.dumps({ "name": f"{ctx.project_name} v{version}", "version_number": version, "changelog": changelog, "dependencies": [], "game_versions": config.minecraft, "version_type": "release", "loaders": ["datapack"], "featured": False, "project_id": config.modrinth.project_id, "file_parts": [file_name], }), file_name: file_bytes, }) if not (200 <= res.status_code < 300): logger.warning(f"Failed to publish new version version: {res.status_code} {res.text}") return logger.info(f"Successfully published {res.json()['name']}", extra={"gh_annotate_skip": True}) def publish_smithed(ctx: Context, config: ManifestConfig, file_name: str): """Attempts to publish pack to smithed""" auth_token = os.getenv(SMITHED_AUTH_KEY, None) logger = parent_logger.getChild(f"smithed.{ctx.project_id}") mc_version_dir = os.getenv("VERSION", "26.1") manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) project_id = stem if (stem:=ctx.directory.stem).startswith("lib") else ctx.project_id if config.smithed and auth_token: version = (manifest.modules|manifest.libraries).get(project_id, NoneAttribute()).version or "" # get project data and existing versions res = requests.get(f"{SMITHED_API}/packs/{config.smithed.pack_id}") if not (200 <= res.status_code < 300): if res.status_code == 404: logger.warning(f"Cannot publish to smithed project {config.smithed.pack_id} as it doesn't exist.") else: logger.warning(f"Failed to get project: {res.status_code} {res.text}") return project_data = res.json() # update description and pack image # ensures they point to the most up-to-date mc version branch project_versions = project_data["versions"] newest_version = sorted([Version(v["name"]) for v in project_versions])[-1] if Version(version) > newest_version: # only update the description if we're not patching an old version project_display = project_data["display"] current_icon = f"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/generated/pack_icons/{project_id}.png" current_readme = f"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/generated/smithed_readmes/{project_id}.md" if project_display["icon"] != current_icon or project_display["webPage"] != current_readme: logger.debug("Pack Icon or Readme hyperlink is incorrect. Updating project") res = requests.patch(f"{SMITHED_API}/packs/{config.smithed.pack_id}", params={'token': auth_token}, json={"data": { "display": { "icon": current_icon, "webPage": current_readme, }, }}) if not (200 <= res.status_code < 300): logger.warning(f"Failed to update descripion: {res.status_code} {res.text}") logger.info(f"{ctx.project_name} {res.text}", extra={"gh_annotate_skip": True}) matching_version = next((v for v in project_versions if v["name"] == str(version)), None) if matching_version is not None: # patch version already exists # update MC version if necessary if len(config.minecraft) > 0 and not set(matching_version["supports"]) == set(config.minecraft): # supported versions has changed and is not empty logger.debug("Additional MC version support has been added to an existing patch version. Updating existing smithed version data") res = requests.patch(f"{SMITHED_API}/packs/{config.smithed.pack_id}/versions/{matching_version['name']}", params={'token': auth_token}, json={ "data": { "supports": config.minecraft } }) if not (200 <= res.status_code < 300): logger.warning(f"Failed to patch project versions: {res.status_code} {res.text}") return # permalink previous version (in that MC version) to the git history commit_hash = run("cd release && git log -1 --format=%H") matching_mc_versions = sorted((Version(v["name"]) for v in project_versions if set(v['supports']) & set(config.minecraft))) prior_version_in_mc_version = matching_mc_versions[-1] if len(matching_mc_versions) > 0 else None # newest version number, with any MC overlap prior_url: str = next((v["downloads"]["datapack"] for v in project_versions if Version(v["name"]) == prior_version_in_mc_version), "") if "https://github.com/Gamemode4Dev/GM4_Datapacks/blob/" not in prior_url and prior_version_in_mc_version: res = requests.patch(f"{SMITHED_API}/packs/{config.smithed.pack_id}/versions/{prior_version_in_mc_version}", params={'token': auth_token}, json={ "data":{ "downloads": { "datapack": f"https://github.com/Gamemode4Dev/GM4_Datapacks/blob/{commit_hash}/{mc_version_dir}/{file_name}?raw=true", "resourcepack": "" } } }) if not (200 <= res.status_code < 300): logger.warning(f"Failed to permalink {project_id} version {prior_version_in_mc_version}: {res.status_code} {res.text}") else: logger.info(f"Permalinked {project_id} {prior_version_in_mc_version} to git history: {res.text}", extra={"gh_annotate_skip": True}) if len(config.minecraft) > 0: # supported versions is not empty, post new version res = requests.post(f"{SMITHED_API}/packs/{config.smithed.pack_id}/versions", params={'token': auth_token, 'version': version}, json={"data":{ "downloads":{ "datapack": f"https://raw.githubusercontent.com/Gamemode4Dev/GM4_Datapacks/release/{mc_version_dir}/{file_name}", "resourcepack": "" }, "name": version, "supports": config.minecraft, "dependencies": [] }} ) if not (200 <= res.status_code < 300): logger.warning(f"Failed to publish new version of {ctx.project_name}: {res.status_code} {res.text}") return logger.info(f"{ctx.project_name} {res.text}", extra={"gh_annotate_skip": True}) def clear_release(ctx: Context): """ Empties the release folder preparing it to be overwritten. This makes sure that 1. Deleted modules no longer stick around in the current version 2. Changes to the build system (such as renamed files/folders) are properly reflected """ version = os.getenv("VERSION", "26.1") release_dir = Path("release") / version shutil.rmtree(release_dir, ignore_errors=True) os.makedirs(release_dir, exist_ok=True) def readmes(ctx: Context): """Saves all READMEs intended for download sites to the ./out/readmes folder.""" readme_dir = Path("out/readmes") base_path = readme_dir / ctx.project_id if "README.md" in ctx.data.extra: os.makedirs(base_path, exist_ok=True) ctx.data.extra["README.md"].dump(base_path, "GM4_README.md") else: parent_logger.info(f"[GM4] {ctx.project_id} has no README.md") for file, ext in {"modrinth_readme":"md", "smithed_readme":"md", "pmc_readme":"txt"}.items(): if file in ctx.meta: ctx.meta[file].dump(base_path, f"{file.upper()}.{ext}") ================================================ FILE: gm4/plugins/player_heads.py ================================================ import base64 import hashlib import json import logging import os import sys import time from dataclasses import replace from io import BytesIO from typing import Any, Callable, ClassVar import requests from beet import Context, FileDeserialize, JsonFile, PngFile, NamespaceFileScope from mecha import Diagnostic, Mecha, MutatingReducer, rule from mecha.ast import ( AstJsonObject, AstJsonObjectEntry, AstJsonObjectKey, AstNbtCompound, AstNbtCompoundEntry, AstNbtCompoundKey, AstNbtValue, ) from nbtlib import String # type: ignore from PIL.Image import Image parent_logger = logging.getLogger("gm4.player_heads") USER_AGENT = "Gamemode4Dev/GM4_Datapacks/player_head_management (gamemode4official@gmail.com)" MISSING_TEXTURE_SKIN = "eyJ0ZXh0dXJlcyIgOiB7ICJTS0lOIiA6IHsgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9kYWUyOTA0YTI4NmI5NTNmYWI4ZWNlNTFkNjJiZmNjYjMyY2IwMjc0OGY0NjdjMDBiYzMxODg1NTk4MDUwNThiIn19fQ==" def beet_default(ctx: Context): ctx.data.extend_namespace.append(Skin) # register new filetype to datapack tf = ctx.inject(SkinNbtTransformer) ctx.inject(Mecha).transform.extend(tf) # register new ruleset to mecha ctx.require("mecha.contrib.json_files") yield tf.cache_nonnative_references() tf.log_unused_textures() tf.output_skin_cache() ctx.data[Skin].clear() # cleanup skin files from output pack class Skin(PngFile): """Class representing a skin texture file.""" scope: ClassVar[NamespaceFileScope] = ("skins",) extension: ClassVar[str] = ".png" image: ClassVar[FileDeserialize[Image]] = FileDeserialize() # purely here to solve type-warnings on PIL images class SkinNbtTransformer(MutatingReducer): """Reducer class defining custom mecha parsing rules for skin texture data, and storing needed data for those operations""" def __init__(self, ctx: Context): self.ctx: Context = ctx self.skin_cache = JsonFile(source_path="gm4/skin_cache.json").data self.used_textures: list[str] = [] super().__init__() @rule(AstJsonObjectEntry, key=AstJsonObjectKey(value='minecraft:profile')) def json_substitutions(self, node: AstJsonObjectEntry, **kwargs: Any): reference = node.value.evaluate() if isinstance(reference, str) and reference.startswith("$"): skin_val, uuid, d = self.retrieve_texture(reference, **kwargs) if d: yield d node = replace(node, value=AstJsonObject.from_value({ "id": uuid, "properties": [ { "name": "textures", "value": skin_val, } ] })) return node @rule(AstNbtCompoundEntry, key=AstNbtCompoundKey(value='minecraft:profile')) def cmd_substitutions_nbt(self, node: AstNbtCompoundEntry, **kwargs: Any): if isinstance(node.value, AstNbtValue) and isinstance(node.value.value, String) and node.value.value.startswith("$"): skin_val, uuid, d = self.retrieve_texture(node.value.value, **kwargs) if d: yield d node = replace(node, value=AstNbtCompound.from_value({ "id": uuid, "properties": [ { "name": "textures", "value": skin_val, } ] })) return node def retrieve_texture(self, skin_name: str, **kwargs: Any) -> tuple[str, list[int], Diagnostic|None]: skin_name = skin_name.lstrip("$") if ":" not in skin_name: skin_name = f"{self.ctx.project_id}:{skin_name}" self.used_textures.append(skin_name) cached_data = self.skin_cache["skins"].get(skin_name, {"hash": None, "parent_module": self.ctx.project_id}) if cached_data["parent_module"] == self.ctx.project_id: # if the skin belongs to another module, just trust the cache to be right. The skin.png file isn't available to check try: skin_file: Skin = self.ctx.data[Skin][skin_name] except KeyError: d = Diagnostic("error", f"Unknown skin \'{skin_name}\'", filename=kwargs.get("filename"), file=kwargs.get("file") ) return MISSING_TEXTURE_SKIN, [0,0,0,0], d else: skin_hash = hashlib.sha1(skin_file.image.tobytes()).hexdigest() #type: ignore if skin_hash != cached_data["hash"]: # the image file contents have changed - upload the new image value, uuid = self.mineskin_upload(skin_file, f"{skin_name.split(':')[-1]}.png") if value is None or uuid is None: return MISSING_TEXTURE_SKIN, [0,0,0,0], None # skin upload failed, don't cache the result and return missing texture self.skin_cache["skins"][skin_name] = { "uuid": uuid, "value": value, "hash": skin_hash, "parent_module": self.ctx.project_id } return value, uuid, None return cached_data["value"], cached_data["uuid"], None def mineskin_upload(self, skin: Skin, filename: str) -> tuple[str|None, list[int]|None]: logger = parent_logger.getChild(f"mineskin_upload.{self.ctx.project_id}") if os.getenv("GITHUB_ACTIONS"): logger.error(f"Failed to upload {filename}. Github Actions cannot upload skins via the mineskin api") sys.exit(1) # quit the build and mark the github action as failed token = self.ctx.inject(MineskinAuthManager).token buf = BytesIO() skin.image.save(buf, format="PNG") # type: ignore res = requests.post( url='https://api.mineskin.org/generate/upload', data={"name":"GM4_Skin", "visibility":0}, files={"file":(filename, buf.getvalue(), 'text/x-spam')}, headers={"User-Agent": USER_AGENT, "Authorization": "Bearer "+token} ) if res.status_code == 429: logger.info(f"Mineskin request ratelimited! Waiting and trying again") next_request_time = res.json()["nextRequest"] wait_time = max(next_request_time - time.time(), 0) time.sleep(wait_time) return self.mineskin_upload(skin, filename) elif res.status_code != 200: logger.error(f"Mineskin upload failed: {res.status_code} {res.text}") return None, None logger.info(f"New skin texture \'{filename}\' successfully uploaded via Mineskin") # strip out unnecessary fields encoded within texture value value = res.json()["data"]["texture"]["value"] decoded_value = json.loads(base64.b64decode(value).decode('utf-8')) trimmed_decoded_value = {"textures": {"SKIN": {"url": decoded_value["textures"]["SKIN"]["url"]}}} trimmed_value = str(base64.b64encode(str(trimmed_decoded_value).encode('utf-8')), 'utf-8') # split hex uuid into 4 ints uuid = res.json()["uuid"] i = range(0,33,8) segmented_uuid = [uuid[a:b] for a,b in zip(i, i[1:])] signed_int: Callable[[str], int] = lambda s: int.from_bytes(bytes.fromhex(s), byteorder="big", signed=True) uuid_arr = list(map(signed_int, segmented_uuid)) return trimmed_value, uuid_arr def log_unused_textures(self): logger = parent_logger.getChild(self.ctx.project_id) cached_member_textures = [e for e in self.skin_cache["skins"].keys() if e.split(":")[0] == self.ctx.project_id] for tex in set(cached_member_textures) - set(self.used_textures): logger.info(f"Cached skin texture {tex} is not referenced. Consider manually cleaning up skin_cache.json") def cache_nonnative_references(self): """Adds any skin references from another module into skin_cache.json, so changes can trigger patch increments""" if (nonnative_refs := set(self.used_textures) - set(self.ctx.data[Skin])): self.skin_cache["nonnative_references"][self.ctx.project_id] = sorted(nonnative_refs) else: self.skin_cache["nonnative_references"].pop(self.ctx.project_id, None) def output_skin_cache(self): JsonFile(self.skin_cache).dump(origin="", path="gm4/skin_cache.json") class MineskinAuthManager(): """A process for managing mineskin access credentials, prompting the user if needed""" def __init__(self, ctx: Context): token_cache = ctx.cache.get("mineskin").json.get("token") # type: ignore , cache.get ensures cache exists if token_cache is None: # request token from user print(("\033[93mThis build has detected a changed skin file, but no Mineskin API key is available locally.\n\t" "Visit mineskin.org/account, login or create an account with google, and create an API key.\n\t" "Beet will cache your token locally, but save the api key and key secret in a secure location in case the cache resets.\n\t" "You do not need to provide mineskin with your Minecraft account details unless you wish to\033[0m.")) self.token = input("API Key >>") ctx.cache["mineskin"].json = {"token": self.token} return self.token = token_cache ================================================ FILE: gm4/plugins/prefabs.py ================================================ from beet import Context, PluginOptions, configurable from beet.contrib.find_replace import find_replace from beet.contrib.rename_files import rename_files import nbtlib # type: ignore ; no stub file import re from gm4.plugins.manifest import repro_structure_to_bytes class PrefabConfig(PluginOptions, extra="ignore"): prefabs: list[str] def beet_default(ctx: Context): """Handles renaming of prefab assets as they merge into a for modules use""" prefab_namespace = ctx.project_id module_namsepace = ctx.cache["currently_building"].json["id"] structure_deep_rename(ctx, prefab_namespace, module_namsepace) @configurable("gm4", validator=PrefabConfig) def module_asset_rename(ctx: Context, opts: PrefabConfig): """Handles renaming of prefab assets already present in module folder""" for prefab in opts.prefabs: structure_deep_rename(ctx, prefab, ctx.project_id) def structure_deep_rename(ctx: Context, find_namespace: str, repl_namespace: str): """Renames and updates file references, including those contained within structure block data such as loot tables and structure pools""" # rename files ctx.require(rename_files(data_pack={ "match": "*", "find": f"{find_namespace}:([a-z0-9_/]+)", "replace": f"{repl_namespace}:\\1" })) # rename text-file references ctx.require(find_replace(data_pack={"match": "*"}, substitute={ "find": f"{find_namespace}:([a-z0-9_/]+)", "replace": f"{repl_namespace}:\\1" })) # rename structure-file references for s in ctx.data.structures: blocks = ctx.data.structures[s].data["blocks"].snbt() # type: ignore ; nbtlib typing missing updated_blocks_data = re.sub(f"{find_namespace}:([a-z0-9_/]+)", f"{repl_namespace}:\\1", blocks) # type: ignore ; nbtlib typing missing ctx.data.structures[s].serializer = repro_structure_to_bytes ctx.data.structures[s].data["blocks"] = nbtlib.parse_nbt(updated_blocks_data) # type: ignore ; nbtlib typing missing ================================================ FILE: gm4/plugins/readme_generator.py ================================================ from beet import Context, TextFile, configurable import re from pathlib import Path from typing import Any from gm4.plugins.manifest import write_credits, ManifestConfig @configurable("gm4", validator=ManifestConfig) def beet_default(ctx: Context, opts: ManifestConfig): """Loads the README.md and modifies: - converts local images to URLs pointed at the repo - download links for respective download sites - pulls credits from beet.yaml and contributors.json - pulls YT link from beet.yaml - performs some site-specific replacements - generates a BBCode translation of the markdown file""" readme_path = Path(ctx.project_id) / "README.md" if not readme_path.exists(): return global_readme = TextFile(source_path=readme_path) global_contents = global_readme.text running_readme_gen = ctx.meta.get("readme-gen", False) # used to disable pmc replacements on normal release global_replacements: dict[str, str] = {} # Append standard footer content footer = "\n### More Info\n" # Youtube Info if opts.video is not None: footer += ( f"[ " f"**Watch on Youtube**]({opts.video})" "\n\n" ) # Wiki Info footer += ( f"[ " f"**Read the Wiki**]({opts.wiki})" "\n\n" ) footer += "### Credits\n" # Credits ctx.require(write_credits) # requires data from traversing credits files linked_credits = ctx.meta['linked_credits'] credits_text = "" for title in linked_credits: credits_text += f"- {title}: {', '.join(linked_credits[title])}\n" footer += credits_text # Info Blurb footer += ( "\n---\n" "## About Gamemode 4 \"Gamemode\n" "Gamemode 4 is a series of command-powered creations that are designed to change and enhance the survival experience. " "All of our modules are designed to work together flawlessly, and are balanced for usage in a survival setting. " "Pick and choose your favorites from our [website](https://gm4.co), or wherever you get datapacks." ) global_contents += footer # Local Images to raw.githubusercontent URLs global_replacements.update({ r"([!<].*?[\"(])(.*?)([\")].*) *" }) # Perform global replacements for pattern, repl in global_replacements.items(): global_contents = re.sub(pattern, repl, global_contents) # download-site specific edits site_replacements: dict[str, dict[str, str]] = { "gm4": {}, "modrinth": {}, "smithed": {}, "pmc": {} } # Remove lingering comments in main readme site_replacements["gm4"].update({r"\n?": ""}) # Recommended modules dynamic linking; from gm4.co to modrinth/smithed/pmc manifest = ctx.cache["gm4_manifest"].json rec_modules = re.findall(r"\(.+\)", global_contents) # TODO relative links, if they are better for m in rec_modules: manifest_m_entry: dict[str, Any] = manifest["modules"].get(m, {}) if (v:=manifest_m_entry.get('modrinth_id')): site_replacements["modrinth"].update({ f"\\(.+\\)": f"(https://modrinth.com/datapack/{v})" }) if (v:=manifest_m_entry.get('smithed_link')): site_replacements["smithed"].update({ f"\\(.+\\)": f"(https://beta.smithed.dev/packs/{v})" # NOTE links to in-beta browser smithed access }) if running_readme_gen and (v:=manifest_m_entry.get('pmc_link')): site_replacements["pmc"].update({ f"\\(.+\\)": f"(https://planetminecraft.com/data-pack/{v})" }) # Modrinth Youtube Video Embed if 'video' in ctx.meta['gm4'] and ctx.meta['gm4']['video'] is not None: embed_url = re.sub(r'https:\/\/www.youtube.com\/watch\?v=(\w+)', r'https://www.youtube.com/embed/\1', ctx.meta['gm4']['video']) site_replacements["modrinth"].update({ r"(.+)\n((?:.+\n)+)', global_contents) for table in tables: repl = "[table]\n" for line in table.strip('\n').split('\n'): if set(line).issubset(set("| -:")): continue repl += "[tr]\n" for value in [v for v in line.split('|') if v != ""]: repl += f"\t[td]{value.strip()}[/td]\n" repl += "[/tr]" repl += "[/table]" site_replacements['pmc'].update({ f'\n{re.escape(table)}': repl }) # static BBCode translations site_replacements['pmc'].update({ r"(.+)": "" }) # Apply site-specific edits for site, replacements in site_replacements.items(): site_contents = global_contents for pattern, repl in replacements.items(): site_contents = re.sub(pattern, repl, site_contents) if site == "gm4": ctx.data.extra["README.md"] = TextFile(site_contents) else: ctx.meta[f'{site}_readme'] = TextFile(site_contents) def libraries(ctx: Context): """Dumps the README (library docs) to the "smithed_readme" meta, so it ends up in the generated folder. No edits are made""" ctx.meta['smithed_readme'] = ctx.data.extra["README.md"] # relies on copy_files to load into datapack container. ================================================ FILE: gm4/plugins/resource_pack.py ================================================ import csv import glob import logging from copy import deepcopy from functools import cache from itertools import cycle from typing import Annotated, Any, ClassVar, Literal, Optional, Union import numpy as np from beet import ( Cache, Context, Font, ItemModel, InvalidOptions, Language, ListOption, Model, NamespaceProxy, PluginOptions, YamlFile, ResourcePack ) from beet.contrib.link import LinkManager from beet.contrib.vanilla import Vanilla, ClientJar from beet.core.utils import format_validation_error from mecha import ( AstJsonObject, AstNbtCompound, Diagnostic, Mecha, Reducer, rule, ) from nbtlib import String # type: ignore ; nbtlib missing stubfile from pydantic import BaseModel, Field, TypeAdapter, ValidationError, ValidationInfo, field_validator from tokenstream import set_location from gm4.utils import ( MapOption, add_namespace, ) JsonType = dict[str,Any] MINECRAFT_REFERENCE_VERSION = "26.1" parent_logger = logging.getLogger("gm4.resource_pack") #== Pydantic Plugin Config Models ==# class ModelData(BaseModel): """A complete config for a single model""" item: ListOption[str] reference: str model: 'MapOption[str]' = Field(default="", validate_default=True) template: TemplateOptions = Field(default="custom", validate_default=True) transforms: list[TransformOptions] = Field(default_factory=list, validate_default=True) textures: MapOption[str] = Field(default_factory=list, validate_default=True) base_model: Optional[JsonType] = None @field_validator('model', mode="before") @classmethod def default_model(cls, model: Any, info: ValidationInfo) -> dict[str, str]: if isinstance(model, str) or (isinstance(model, dict) and "type" in model): model = [model] # so we can check len for number of items if not model and "reference" in info.data: # no reference set, default to reference string return {item: info.data["reference"] for item in info.data['item'].entries()} if len(model)!=len(info.data["item"].entries()) and len(model)>1 and "type" not in model: # a single model name may be broadcast to all items, but otherwise lengths match # type: ignore ; 'model' inherits list[Unknown] from previous isinstance check raise ValueError("length of 'item' and 'model' do not match") if isinstance(model, list): # apply item->model map data model = dict(zip(info.data['item'].entries(), cycle(model))) # type: ignore if isinstance(model, dict) and set(model.keys())!=set(info.data['item'].entries()): # make sure the map keys match the item types # type: ignore ; model is Unknown type raise ValueError("dict keys do not match values in 'item'") return model # model is already a mapped dict, of the same length as item # type: ignore @field_validator("template", mode="before") @classmethod def template_validator(cls, template: Any) -> TemplateOptions: return downcast(TemplateOptions, "name", template) @field_validator("transforms", mode="before") @classmethod def transforms_validator(cls, transforms: Any) -> list[TransformOptions]: if not transforms: return [] return [ downcast(TransformOptions, "name", transform) for transform in transforms ] @field_validator('textures', mode="before") @classmethod def default_texture(cls, textures: MapOption[str], info: ValidationInfo) -> MapOption[str]: empty_list = False if textures is None: # type: ignore empty_list = True elif isinstance(textures, (list,dict)): empty_list = len(textures)==0 elif isinstance(textures, MapOption): # type: ignore empty_list = len(textures.entries())==0 if empty_list and isinstance(v:=info.data.get("reference"), str): return MapOption([v]) return textures def add_namespace(self, namespace: str) -> 'ModelData': """Returns a new ModelData with the given given namespace applied to any fields""" ret_dict = self.model_dump(serialize_as_any=True) ret_dict["reference"] = add_namespace(self.reference, namespace) ret_model = deepcopy(self.model.entries()) for i, model_name in enumerate(ret_model): ret_model[i] = add_namespace(model_name, namespace) # accessed by index to overwrite original ret_dict["model"] = ret_model if self.textures: if isinstance(self.textures.root, list): ret_dict["textures"] = [add_namespace(t, namespace) for t in self.textures.entries()] else: # isinstance(self.textures.root, dict): ret_dict["textures"] = {k: add_namespace(v, namespace) for k, v in self.textures.items()} ret_dict["template"] = self.template.add_namespace(namespace) return ModelData.model_validate(ret_dict) class NestedModelData(BaseModel): """A potentially incomplete config, allowing for nested inheritance of fields""" item: Optional[ListOption[str]] = None reference: Optional[str] = None model: Optional[MapOption[str]] = None # defalts to reference template: Optional[str | TemplateOptions] = "custom" transforms: Optional[list[str | TransformOptions]] = None textures: Optional[MapOption[str]] = None base_model: Optional[JsonType] = None broadcast: Optional[list['NestedModelData']] = [] def collapse_broadcast(self) -> list['NestedModelData']: """Recursively collapses broadcast fields into a list of NestedModelData""" if not self.broadcast: return [self] ret_list: list[NestedModelData] = [] for child in self.broadcast: m = NestedModelData.model_validate(self.model_dump(exclude_unset=True,exclude={"broadcast"}, serialize_as_any=True) | child.model_dump(exclude_unset=True, serialize_as_any=True)) if m.broadcast: m = m.collapse_broadcast() ret_list.extend(m) else: ret_list.append(m) return ret_list class GuiFont(BaseModel): """config for a single container gui using custom fonts""" translation: str container: ContainerGuiOptions = Field(validate_default=True) texture: str @field_validator("container", mode="before") @classmethod def container_validator(cls, container: Any) -> ContainerGuiOptions: return downcast(ContainerGuiOptions, "container", container) def add_namespace(self, namespace: str) -> 'GuiFont': """returns a new GuiFont with the texture field namespaced""" return GuiFont( translation=self.translation, container=self.container, texture=add_namespace(self.texture, namespace) ) class FlatResourcePackOptions(BaseModel): """Contains a flat list of complete rp config objects""" model_data: list[ModelData] gui_fonts: list[GuiFont] def add_namespace(self, namespace:str): self.model_data=[m.add_namespace(namespace) for m in self.model_data] self.gui_fonts=[g.add_namespace(namespace) for g in self.gui_fonts] def template_mutations(self): for m in self.model_data: m.template.mutate_config(m) class ResourcePackOptions(PluginOptions, extra="ignore"): model_data: list[NestedModelData] = [] gui_fonts: list[GuiFont] = [] def process_inheritance(self) -> FlatResourcePackOptions: """Collapses and returns any broadcast fields into processed flat list""" ret: list[ModelData] = [] errors: list[tuple[int, ValidationError]] = [] for i, model in enumerate(self.model_data): try: ret.extend([ModelData.model_validate(m.model_dump(serialize_as_any=True)) for m in model.collapse_broadcast()]) except ValidationError as exc: errors.append((i, exc)) if errors: # Only show the first error for now raise InvalidOptions("gm4", format_validation_error("gm4", errors[0][1])) return FlatResourcePackOptions(model_data=ret, gui_fonts=self.gui_fonts) class TranslationLinterOptions(PluginOptions, extra="ignore"): translation_linter_ignores: list[str] = [] #== Configurable Base Classes ==# def downcast[T](base: type[T], discriminator: str, x: Any) -> Any: """Looks up and returns the proper subclass for config resolution i.e. TemplateOptions converts to BlankTemplate/VanillaTemplate ect... based upon its name id""" subclasses = {cls.__name__: cls for cls in base.__subclasses__()} return TypeAdapter[T]( Annotated[Union[*subclasses.values()], Field(discriminator=discriminator)] ).validate_python({discriminator: x} if isinstance(x, str) else x) class TemplateOptions(BaseModel, extra="allow"): """A pydantic model to extend for configured model templates, which generate model files for common""" default_transforms: ClassVar[list['TransformOptions']] = [] texture_map: ClassVar[list[str]|None] = None def __init_subclass__(cls) -> None: cls.model_config["extra"] = "ignore" # prevent subclasses from inheriting "allow" def generate_model(self, config: ModelData, models_container: NamespaceProxy[Model]) -> None: """Processes the template, and applies transforms""" if self.texture_map and config.textures and isinstance(config.textures.root, list): config = ModelData(**config.model_dump(serialize_as_any=True) | {"textures": dict(zip(self.texture_map, config.textures.entries()))}) for output_model in self.create_models(config, models_container): # for each returned pointer, add transforms as needed for transform in self.default_transforms: transform.apply_transform(output_model) for transform in config.transforms: transform.apply_transform(output_model) def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: """Overridden to create and mount the model object, and return pointers to them""" raise NotImplementedError() def get_item_def_entry(self, config: ModelData, item: str) -> None|JsonType: """Overridden to return the entry for the item-model-definition, or None to point to ModelData.model string""" return None def add_namespace(self, namespace: str): """Overridden to add namespace data to sub-config fields added by a template""" return self.model_dump(serialize_as_any=True) def mutate_config(self, config: ModelData): """Overridden to let a template mutate/mangle root level fields of ModelData""" pass class TransformOptions(BaseModel, extra="allow"): """A pydantic model to extend for configured model transformers, which add model offset/scale ect.. to model files""" def __init_subclass__(cls) -> None: cls.model_config["extra"] = "ignore" # prevent subclasses from inheriting "allow" def apply_transform(self, model: Model) -> None: """Modifies the given model, applying transformation data to the display compound""" raise NotImplementedError() class ContainerGuiOptions(BaseModel, extra="allow"): """a pydantic model to extend for container gui fonts""" def __init_subclass__(cls) -> None: cls.model_config["extra"] = "ignore" # prevent subclasses from inheriting "allow" def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[JsonType]]: """requisitions unicode characters and returns the translation and font providers that make it up""" raise NotImplementedError() def next_unicode(self, counter_cache: Cache) -> str: ret = counter_cache.json["__next__"] counter_cache.json["__next__"] += 1 return chr(ret) NestedModelData.model_rebuild() ModelData.model_rebuild() GuiFont.model_rebuild() #== Beet Plugins ==# def beet_default(ctx: Context): rp = ctx.inject(GM4ResourcePack) tl = ctx.inject(TranslationLinter) ctx.require("mecha.contrib.json_files") # mecha register ctx.inject(Mecha).lint.extend(tl) logging.getLogger("beet.contrib.babelbox").addFilter(block_incomplete_translation) logging.getLogger("mecha").addFilter(limit_mecha_diagnostics) # attach context to template classes VanillaTemplate.vanilla = Vanilla(ctx) VanillaTemplate.vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION VanillaTemplate.vanilla_jar = VanillaTemplate.vanilla.mount("assets/minecraft/items") yield tl.warn_unused_translations() tl.apply_babelbox_backfill() rp.lint_model_textures() def build(ctx: Context): rp = ctx.inject(GM4ResourcePack) rp.resolve_config() rp.generate_gui_fonts() rp.generate_model_files() rp.generate_item_definitions() if not ctx.assets.extra.get("pack.png") and ctx.data.extra.get("pack.png"): ctx.assets.icon = ctx.data.icon def setup(ctx: Context): # init font counter ctx.cache["gui_font_counter"].json = { "__next__": ord("\u9000") } # check for CLI meta-variable for backfilling the translations.csv ## beet -s meta.gm4.babelbox_backfill=True dev bat_grenades babelbox_backfill: bool = ctx.meta.get("gm4",{}).get("babelbox_backfill", False) # clear and compile cross-module translation key list ctx.cache["translations"].clear() keys: list[str] = [] for path in glob.glob("*/assets/translations.csv"): with open(path) as f: reader = csv.DictReader(f) if reader.fieldnames and reader.fieldnames[0] != "key": raise KeyError(f"{path} must contain a column named 'key'") keys.extend([row['key'] for row in reader]) # type: ignore ; csv only contains strings ctx.cache["translations"].json = {"keys": list(set(keys)), "backfill": babelbox_backfill} def merge_policy(ctx: Context): ctx.assets.merge_policy.extend_namespace(ItemModel, item_definition_merging) def link_resource_pack(ctx: Context): """manually links the combined resource pack to minecraft's RP folder when using 'beet dev'""" ctx.assets.name = "DEV gm4_resource_pack" lm = ctx.inject(LinkManager) # clear DP link, we only want to send a RP to minecraft dp_dir = lm.data_pack lm.data_pack = None lm.autosave_handler(ctx) # send RP to minecraft lm.data_pack = dp_dir # restore the DP link class GM4ResourcePack: """Service Object handling custom_model_data and generated item models""" def __init__(self, ctx: Context): self.ctx = ctx self.logger = parent_logger.getChild(ctx.project_id) self._opts = FlatResourcePackOptions(model_data=[], gui_fonts=[]) # unloaded config super().__init__() @property def opts(self) -> FlatResourcePackOptions: return self._opts def resolve_config(self): if (p:=self.ctx.directory/"assets/model_data.yaml").exists(): addtl_config = YamlFile(source_path=p).data.get("model_data") self.ctx.meta["gm4"].setdefault("model_data",[]).extend(addtl_config) self._opts = self.ctx.validate("gm4", validator=ResourcePackOptions).process_inheritance() self._opts.add_namespace(self.ctx.project_id) self._opts.template_mutations() def generate_item_definitions(self): """Generates item-model-definition files in the 'minecraft' namespace, adding select cases for each custom_model_data value""" vanilla = self.ctx.inject(Vanilla) vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION vanilla_item_defs_jar = vanilla.mount("assets/minecraft/items") # group models by item id for item_id in {i for m in self.opts.model_data for i in m.item.entries()}: models = filter(lambda m: item_id in m.item.entries(), self.opts.model_data) # with this item_id vanilla_itemdef = vanilla_item_defs_jar.assets.item_models[f"minecraft:{item_id}"].data["model"] new_itemdef: dict[str, Any] = { "model": { "type": "minecraft:select", "property": "minecraft:custom_model_data", "cases": [], "fallback": vanilla_itemdef } } for model in models: if not (m:=model.template.get_item_def_entry(model, item_id)): # no special handling, just point to model file by name m = model.model[item_id] # model string for this particular item id model_json: JsonType = { "type": "minecraft:model", "model": m } else: model_json = m if model.base_model: model_json.update(model.base_model) new_itemdef["model"]["cases"].append({ "when": model.reference, "model": model_json }) self.ctx.assets.item_models[f"minecraft:{item_id}"] = ItemModel(new_itemdef) #== Model file generation ==# def generate_model_files(self): """Create individual models for each item/block according to its config""" for model in self.opts.model_data: # generate model and mount to the pack model.template.generate_model(model, self.ctx.assets.models) def lint_model_textures(self): """Checks model files to ensure referenced textures exist""" for name, model in list(self.ctx.assets.models.items()): if name.startswith("minecraft:"): continue # vanilla model - will have vanilla textures so do not check for tex in model.data.get("textures", {}).values(): if not tex.startswith("minecraft:") and tex not in self.ctx.assets.textures: self.logger.warning(f"Missing texture '{tex}' in {name}") #== Font-Gui file generation ==# def generate_gui_fonts(self): for gui in self.opts.gui_fonts: translation, providers = gui.container.process(gui, self.ctx.cache["gui_font_counter"]) self.ctx.generate("gm4:en_us", merge=Language({ gui.translation: translation })) self.ctx.generate("gm4:container_gui", merge=Font({ "providers": providers })) def item_definition_merging(pack: ResourcePack, path: str, current: ItemModel, conflict: ItemModel) -> bool: """ItemModel beet merge rule for combining select properly""" if current.data["model"].get("type") != "minecraft:select" or conflict.data["model"].get("type") != "minecraft:select": parent_logger.warning(f"item model {path} was sent to merging but only one file uses 'select'") return False merged_cases: list[Any] = current.data["model"]["cases"] merged_cases.extend(conflict.data["model"]["cases"]) # remove duplicate cases - relying on each CMD to be unique already seen_values: set[int] = set() for entry in merged_cases.copy(): if (v:=entry["when"]) not in seen_values: seen_values.add(v) else: # otherwise its a duplicate merged_cases.remove(entry) return True class TranslationLinter(Reducer): """Mecha linter ensuring all translation keys are registered in translations.csv""" def __init__(self, ctx: Context): self.ctx = ctx self.mecha_database = ctx.inject(Mecha).database vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = MINECRAFT_REFERENCE_VERSION vanilla_lang = vanilla.mount("assets/minecraft/lang/en_us.json") self.vanilla_keys = set(vanilla_lang.assets.languages["minecraft:en_us"].data.keys()) self.total_keys: set[str] = set() self.local_keys: set[str] = set() self.used_keys: set[str] = set() self.logger = parent_logger.getChild(ctx.project_id) self.backfill_enable: bool = ctx.cache["translations"].json["backfill"] self.backfill_values: dict[str, str] = {} self.ignored_keys: set[str] = set(ctx.validate("gm4", TranslationLinterOptions).translation_linter_ignores) super().__init__() @rule(AstNbtCompound) @rule(AstJsonObject) def missing_en_us_translations(self, node: Union[AstNbtCompound, AstJsonObject]): self.setup_translation_lookups() # manually skip gm4 root advancement, which contains globally defined translations resource_location = self.mecha_database[self.mecha_database.current].resource_location or "null:null" if resource_location == "gm4:root": return # check node fallback contents against babelbox translations translate_entry = next((e for e in node.entries if e.key.value == "translate"), None) if not translate_entry: return transl_key = str(translate_entry.value.evaluate()) fallback_extry = next((e for e in node.entries if e.key.value == "fallback"), None) if fallback_extry: fallback = str(fallback_extry.value.evaluate()) if transl_key.startswith("gui.gm4") or transl_key=="gm4.second": # gui-texture translations from other modules are defined in their gui_fonts segment of beet.yaml, so they won't be # known to the linter easily. For now, we just ignore their warnings return if self.babelbox_lang.get(transl_key) != fallback: if transl_key in self.babelbox_lang and not self.backfill_enable: yield set_location(Diagnostic("info", f"Fallback for {transl_key} does not match that provided in 'translations.csv'"), node) elif self.backfill_enable and transl_key not in self.backfill_values and transl_key not in self.foreign_keys: self.logger.info(f"Backfilling the fallback for {transl_key} into 'translations.csv'") self.backfill_values[transl_key] = fallback yield self.check_key(transl_key, node) else: if self.babelbox_lang.get(transl_key): yield set_location(Diagnostic("warn", f"No translation fallback specified for {transl_key}"), node) yield self.check_key(transl_key, node) def check_key(self, transl_key: str, node: Any): self.used_keys.add(transl_key) if transl_key not in self.total_keys and not self.backfill_enable: return set_location(Diagnostic("warn", f"Translation key not defined in en_us: {transl_key}"), node) return def setup_translation_lookups(self): # setup lookup list if first invocation if not self.total_keys: self.babelbox_lang = self.ctx.assets.languages.get("gm4_translations:en_us", Language()).data self.local_keys = ( set(self.babelbox_lang.keys()) | set(self.ctx.assets.languages.get("gm4:en_us", Language()).data.keys()) ) self.total_keys = ( self.vanilla_keys | self.local_keys | self.ignored_keys | set(Language(source_path="base/assets/gm4/lang/en_us.json").data.keys()) | self.get_guidebook_translations() | set(self.ctx.cache["translations"].json["keys"]) | {"%1$s%3427655$s", "%1$s%3427656$s"} # manual old keys ) self.foreign_keys = self.total_keys - self.local_keys @cache def get_guidebook_translations(self) -> set[str]: # internally loads keys in guidebook translations.csv, cached for each subproject build with open("gm4_guidebook/assets/translations.csv", 'r') as csvfile: reader = csv.DictReader(csvfile) return {row["key"] for row in reader} def warn_unused_translations(self): for key in self.ctx.assets.languages.get("gm4_translations:en_us", Language()).data: if key not in self.used_keys and key not in self.ignored_keys and key in self.local_keys: self.logger.warning(f"Translation '{key}' is defined but not used") def apply_babelbox_backfill(self): """Takes found out-of-date fallbacks and saves them to the translations.csv table""" if not self.backfill_enable: return if (c:=self.ctx.directory / "assets" / "translations.csv").exists(): babelbox_path = c elif (c:=self.ctx.directory / "translations.csv").exists(): babelbox_path = c else: if self.backfill_values: self.logger.warning("Babelbox backfill was enabled but no 'translations.csv' file was found") return # no file to update with open(babelbox_path, 'r', encoding='utf-8', newline='') as csvfile: reader = csv.DictReader(csvfile) fieldnames = reader.fieldnames if not fieldnames: self.logger.warning("Babelbox backfill failed - fieldnames could not be automatically detected") return translations = list([row for row in reader]) with open(babelbox_path, 'w', encoding='utf-8', newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames, extrasaction='ignore') writer.writeheader() for row in translations: new_fallback = {"en_us": fbk.replace("\n", "\\n")} if (fbk:=self.backfill_values.pop(row["key"], None)) else {} writer.writerow(row | new_fallback) for key, fbk in self.backfill_values.items(): # any remaining new entries not already in file writer.writerow({"key": key, "en_us": fbk.replace("\n", "\\n")}) #== Logging Filters ==# def block_incomplete_translation(record: logging.LogRecord): """logger filter to hide missing translations for anything but default english""" locale: str = record.args[0] # type: ignore ; babelbox only issues one logger event, this will be a string return locale == 'en_us' def limit_mecha_diagnostics(record: logging.LogRecord): """hard limits the printed length of a mecha diagnostic line""" TRUNCATION_LENGTH = 1_000 truncated: list[str] = [] for line in record.args[0].splitlines(): # type: ignore ; arg 0 is a paragraph of diagnostic text truncated.append(line if len(line) < TRUNCATION_LENGTH else line[:TRUNCATION_LENGTH-3] + "...") # type: ignore ; line is a str record.args = ("\n".join(truncated),) return True #== Default Templates, Transforms and Item Model Special Cases ==# def ensure_single_model_config(template_name: str, config: ModelData) -> str: """Does common error checking for templates that only work when creating a single model file""" if len(config.model.entries()) > 1: raise InvalidOptions("gm4.model_data", f"{config.reference}; Template '{template_name}' only supports single entry 'model' fields.") return config.model.entries()[0] class BlankTemplate(TemplateOptions): name: Literal["custom"] = "custom" def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: """A model file will be provided in source - do not generate a model. Will process any specified transforms and add them to the model file""" if config.transforms: ret_list: list[Model] = [] for m in config.model.entries(): try: ret_list.append(models_container[m]) except: parent_logger.warning(f"Custom specified model {m} does not exist, but was configured to recieve transforms.") return ret_list return [] class GeneratedTemplate(TemplateOptions): name: Literal["generated"] = "generated" def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: if len(config.textures.entries()) > 1: raise InvalidOptions("gm4.model_data", f"{config.reference}; Template 'generated' currently only supports a single texture.") # NOTE in the future, `generated` could accept a map for textures to provide a different texture for each model. But packs may be better served by simply creating those models themselves ret_list: list[Model] = [] for model_name in config.model.entries(): m = models_container[model_name] = Model({ "parent": "minecraft:item/generated", "textures": { "layer0": f"{config.textures.entries()[0]}" } }) ret_list.append(m) return ret_list class GeneratedOverlayTemplate(TemplateOptions): name: Literal["generated_overlay"] = "generated_overlay" def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: """A special-case 'generated' template, where an 'overlay' texture is specified by appending '_overlay' to its filename""" model_name = ensure_single_model_config(self.name, config) m = models_container[model_name] = Model({ "parent": "minecraft:item/generated", "textures": { "layer0": f"{config.textures.entries()[0]}", "layer1": f"{config.textures.entries()[0]}_overlay" } }) return [m] class HandheldTemplate(TemplateOptions): name: Literal["handheld"] = "handheld" def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]): model_name = ensure_single_model_config(self.name, config) m = models_container[model_name] = Model({ "parent": "minecraft:item/handheld", "textures": { "layer0": f"{config.textures.entries()[0]}" } }) return [m] class VanillaTemplate(TemplateOptions): name: Literal["vanilla"] = "vanilla" vanilla: ClassVar[Vanilla] # mounted to by beet plugin since it requires context access vanilla_jar: ClassVar[ClientJar] _item_def_map: dict[str, JsonType] = {} def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]): model_names = config.model.entries() if len(set(model_names)) == 1 and len(config.item.entries()) > 1: model_names = [f"{model_names[0]}_{item}" for item in config.item.entries()] # if only one model name given, make one model per item id model_def_map: dict[str,JsonType] = {} ret_list: list[Model] = [] for item, model_name in zip(config.item.entries(), model_names): model_compound = self.vanilla_jar.assets.item_models[add_namespace(item, "minecraft")].data.get("model", {}) if model_compound["type"] == "minecraft:select": # template off the fallback model, (e.g. non-festive chest) model_compound = model_compound["fallback"] if model_compound["type"] == "minecraft:special": # uses some special handling vanilla_model_path: str = model_compound["base"] # covers player_head use case. Others may not be handled properly yet. special_model = True else: vanilla_model_path = model_compound.get("model", "") special_model = False m = models_container[model_name] = Model({ "parent": vanilla_model_path }) ret_list.append(m) model_def_map[item] = { "type": "minecraft:special" if special_model else "minecraft:model", "model": model_compound["model"] if special_model else model_name, } | ( {"base": model_name} if special_model else {} ) | ( {"tints": t} if (t:=model_compound.get("tints")) else {} ) self._item_def_map.update(model_def_map) return ret_list def get_item_def_entry(self, config: ModelData, item: str): return self._item_def_map.get(item) class AdvancementIconTemplate(VanillaTemplate, TemplateOptions): # TODO make this inheritance work properly. Treat as single-vanilla forward or create new where needed """Creates a model for advancement icons, either pointing to the vanilla model, or to a specified other item model""" name: Literal["advancement"] = "advancement" # type: ignore forward: Optional[str] = None tints: Optional[ListOption[int|tuple[float,float,float]]] = None # optional constant tints to apply to the item model # NOTE since advancements are all in the gm4 namespace, so are these models. This template ignores the 'model' field of ModelData def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: advancement_name = config.reference.split("/")[-1] item = config.item.entries()[0] if not self.forward: # then we use the vanilla item's model and settings - inheriting from VanillaTemplate for this config_copy = config.model_copy(update={"model": MapOption({item: f"gm4:gui/advancement/{advancement_name}"})}) m = VanillaTemplate.create_models(self, config_copy, models_container)[0] else: m = models_container[f"gm4:gui/advancement/{advancement_name}"] = Model({ "parent": self.forward }) config.model = MapOption({item: f"gm4:gui/advancement/{advancement_name}"}) return [m] def get_item_def_entry(self, config: ModelData, item: str): if not self.forward: # use item def from VanillaTemplate return VanillaTemplate.get_item_def_entry(self, config, item) else: if self.tints: return { "type": "model", "model": config.model.entries()[0], "tints": [ { "type": "minecraft:constant", "value": tint } for tint in self.tints.entries() ] } return None def add_namespace(self, namespace: str): return self.model_dump(serialize_as_any=True) | ({"forward": add_namespace(self.forward, namespace)} if self.forward else {}) class BlockTemplate(TemplateOptions): name: Literal["block"] = "block" texture_map = ["top", "bottom", "front", "side"] def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]): model_name = ensure_single_model_config(self.name, config) m = models_container[model_name] = Model({ "parent": "minecraft:block/cube", "textures": { "particle": config.textures['side'], "down": config.textures['bottom'], "up": config.textures['top'], "north": config.textures['front'], "south": config.textures['side'], "west": config.textures['side'], "east": config.textures['side'] } }) return [m] class ConditionTemplate(BlankTemplate, TemplateOptions): """Custom models using boolean condition variants (ie. broken/repaired elytra, cast/uncast fishing rods...)""" name: Literal["condition"] = "condition" # type: ignore property: str on_true: str on_false: str def get_item_def_entry(self, config: ModelData, item: str) -> JsonType: return { "type": "minecraft:condition", "property": self.property, "on_false": { "type": "minecraft:model", "model": self.on_false }, "on_true": { "type": "minecraft:model", "model": self.on_true } } def add_namespace(self, namespace: str): return self.model_dump(serialize_as_any=True) | {"on_true": add_namespace(self.on_true, namespace), "on_false": add_namespace(self.on_false, namespace)} class ItemDisplayModel(TransformOptions): """Calculates the model transform for an item_display entity, located at the specified origin, facing south, for the model to align with the block-grid""" origin: list[float] = Field(max_length=3, min_length=3) scale: list[float] = Field(max_length=3, min_length=3) translation: list[float] = Field(default=[0,0,0], max_length=3, min_length=3) rotation: list[float] = Field(default=[0.,0.,0.], max_length=3, min_length=3) # euler angle form of total rotation. NOTE only accounts for simple angles (90,180 ect...) display: Literal["none", "thirdperson_lefthand", "thirdperson_righthand", "firstperson_lefthand", "firstperson_righthand", "head", "gui", "ground", "fixed"] = "head" name: Literal["item_display"] = "item_display" def apply_transform(self, model: Model): model.data.setdefault("display", {})[self.display] = { "rotation": list(-1*np.array(self.rotation)), "translation": list(16 * (np.array([-0.5,0.5,-0.5])+(np.array(self.origin)*np.array([1,-1,1]))-np.array(self.translation)) / np.array(self.scale)), "scale": list(1/np.array(self.scale)*1.006) } #== Convience Template/Transform Presets ==# class LegacyMachineArmorStand(BlockTemplate, TemplateOptions): """An 'block' template preset with the 'item_display' transformer for the legacy small-armor-stand-head-slot of some machines""" default_transforms = [ ItemDisplayModel( origin=[0.5, 1, 0.5], scale=[0.438, 0.438, 0.438], translation=[0, 0, 0], display='head' ) ] name: Literal["legacy_machine_block"] = "legacy_machine_block" # type: ignore #== Default Gui-Font Generators ==# class CenteredContainerGui(ContainerGuiOptions): container: Literal["_centered"] = "_centered" def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]: u1 = self.next_unicode(counter_cache) u2 = self.next_unicode(counter_cache) return u2+u1+u2, [ { "type": "bitmap", "file": config.texture+".png", "ascent": 13, "height": 166, "chars": [u1] }, { "type": "bitmap", "file": config.texture+".png", "ascent": -32768, "height": -83, "chars": [u2] } ] class LeftAlignContainerGui(ContainerGuiOptions): container: Literal["_left_align"] = "_left_align" def process(self, config: GuiFont, counter_cache: Cache) -> tuple[str, list[dict[str, Any]]]: u1 = self.next_unicode(counter_cache) u2 = self.next_unicode(counter_cache) return "\uf808"+u1+u2+"\uf824", [ { "type": "bitmap", "file": config.texture+".png", "ascent": 13, "height": 133, "chars": [u1] }, { "type": "bitmap", "file": config.texture+".png", "ascent": -32768, "height": -133, "chars": [u2] }, ] class HopperContainerGui(LeftAlignContainerGui, ContainerGuiOptions): container: Literal["hopper"] = "hopper" # type: ignore class DropperContainerGui(CenteredContainerGui, ContainerGuiOptions): container: Literal["dropper"] = "dropper" # type: ignore ================================================ FILE: gm4/plugins/test.py ================================================ from beet import Context, TextFile, NamespaceFileScope from typing import ClassVar from mecha import Mecha def load_tests(ctx: Context): ctx.data.extend_namespace += [TestFile] class TestFile(TextFile): """Class representing an test function.""" scope: ClassVar[NamespaceFileScope] = ("test",) extension: ClassVar[str] = ".mcfunction" def strip_tests(ctx: Context): for structure in ctx.data.structures.match("*:test_*", "*:test/*"): del ctx.data.structures[structure] for predicate in ctx.data.predicates.match("*:test_*", "*:test/*"): del ctx.data.predicates[predicate] def skip_mecha_lint(ctx: Context): """Disables the mecha linting step. Linting errors will be reported by the main project build""" mc = ctx.inject(Mecha) mc.steps.remove(mc.lint) ================================================ FILE: gm4/plugins/upgrade_paths.py ================================================ from beet import Context, Function, configurable, PluginOptions from gm4.plugins.manifest import ManifestCacheModel from gm4.utils import Version, NoneAttribute class UpgradePathsConfig(PluginOptions, extra="ignore"): upgrade_paths: list[str] = [] # additional upgrade paths to process @configurable("gm4", validator=UpgradePathsConfig) def beet_default(ctx: Context, opts: UpgradePathsConfig): '''Processes upgrade paths for module data that persists in the world between minecraft / module versions, such as the type of technical entity used to mark a place.''' run_func = Function([], tags=["gm4_upgrade_paths:run"]) upgrade_paths_dirs = [f'{ctx.project_id}:upgrade_paths'] # gm4_bat_grenades:upgrade_paths/... is processed by default upgrade_paths_dirs.extend(opts.upgrade_paths) # module:upgrade_paths/run # handles checking which paths should be run score_holder = ctx.project_id.removeprefix('gm4_') newest_version_with_upgrades = 0.0 for ns, direc in map(lambda a: a.split(':'), upgrade_paths_dirs): upgrade_paths_tree = ctx.data[ns].functions.generate_tree(direc) if upgrade_paths_tree: newest_version_with_upgrades = max(newest_version_with_upgrades, max(map(float, upgrade_paths_tree.keys()))) for path in upgrade_paths_tree.keys(): run_func.append(f'execute if score {score_holder} gm4_earliest_version matches ..{Version(path+".0").int_rep() -1} run function {ns}:{direc}/{path}') if len(run_func.lines) > 0: run_func.append(f'execute if score {score_holder} gm4_earliest_version matches ..{Version(str(newest_version_with_upgrades)+".0").int_rep() -1} run scoreboard players add $active_upgrade_paths gm4_data 1') run_func.append(f'tag @s remove gm4_running_upgrade_path') ctx.data[f'{ctx.project_id}:upgrade_paths/run'] = run_func def lib(ctx: Context): """Runs additional processing to assign libraries a psudo gm4_modules score for comparison""" score_holder = ctx.project_id.removeprefix('gm4_') manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) ver_str = manifest.libraries.get(ctx.project_id.replace("gm4_", "lib_"), NoneAttribute()).version or "0.0.0" ver = Version(ver_str) if ver.patch is None: ver.patch = 0 # when beet-dev is run, pipeline has no patch number record, but dev builds should still allow int conversion ver_int = ver.int_rep() ctx.data.functions[f'{ctx.project_id}:load'].append(f'execute unless score {score_holder} gm4_earliest_version matches ..{ver_int} run scoreboard players set {score_holder} gm4_earliest_version {ver_int}') beet_default(ctx) ================================================ FILE: gm4/plugins/versioning.py ================================================ from beet import Context, Function, FunctionTag, PluginOptions, configurable from beet.contrib.rename_files import rename_files from beet.contrib.find_replace import find_replace from pydantic import Field import warnings from gm4.utils import Version, NoneAttribute import gm4.plugins.manifest # for ManifestCacheModel; a runtime circular dependency class VersionInjectionConfig(PluginOptions): functions: list[str] = [] advancements: list[str] = [] class VersioningConfig(PluginOptions, extra="ignore"): schedule_loops: list[str] = [] required: dict[str, str] = {} extra_version_injections: VersionInjectionConfig = Field(default=VersionInjectionConfig()) @configurable("gm4.versioning", validator=VersioningConfig) def modules(ctx: Context, opts: VersioningConfig): """Assembles version-functions for modules from dependency information: - load:{module_name}.json - {module_name}:load.mcfunction - load:load.json""" ctx.cache["currently_building"].json = {"name": ctx.project_name, "id": ctx.project_id, "added_libs": []} # cache module's project id for access within library pipelines dependencies = opts.required manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) lines = ["execute ", ""] # {{module_name}}.json tag load_tag = dependency_load_tags(ctx, dependencies) load_tag.add(f"{ctx.project_id}:load") ctx.data.function_tags[f"load:{ctx.project_id}"] = load_tag # load.mcfunction base_ver = manifest.base["version"] dependencies = {"gm4":base_ver}|dependencies # manually insert base version as dependency, assumed to be current base version for dep_id, ver_str in dependencies.items(): dep_ver = Version(ver_str) warn_on_future_version(ctx, dep_id, dep_ver) name_default_dict = {"name":"Gamemode 4 Base"} if dep_id == "gm4" else {"name":dep_id} manifest_entry = manifest.modules.get(dep_id) dep_name = manifest_entry.name if manifest_entry else name_default_dict["name"] if dep_id not in manifest.modules and dep_id != "gm4": dep_id = manifest.libraries.get(dep_id, NoneAttribute()).id # append to startup check lines[0] += f"if score {dep_id} load.status matches {dep_ver.major} if score {dep_id}_minor load.status matches {dep_ver.minor}.. " # failure logs lines.append(f"execute unless score {dep_id} load.status matches 1.. run data modify storage gm4:log queue append value {{type:\"missing\",module:\"{ctx.project_name}\",id:\"{ctx.project_id}\",require:\"{dep_name}\",require_id:\"{dep_id}\"}}") log_data = f"{{type:\"version_conflict\",module:\"{ctx.project_name}\",id:\"{ctx.project_id}\",require:\"{dep_name}\",require_id:\"{dep_id}\",require_ver:\"{dep_ver}\"}}" lines.append(f"execute if score {dep_id} load.status matches 1.. unless score {dep_id} load.status matches {dep_ver.major} run data modify storage gm4:log queue append value {log_data}") lines.append(f"execute if score {dep_id} load.status matches {dep_ver.major} unless score {dep_id}_minor load.status matches {dep_ver.minor}.. run data modify storage gm4:log queue append value {log_data}") # finalize startup check module_ver = Version(ctx.project_version) lines[1] = lines[0] + f"run scoreboard players set {ctx.project_id}_minor load.status {module_ver.minor}" lines[0] += f"run scoreboard players set {ctx.project_id} load.status {module_ver.major}" # otherwise, log failed startup with -1 load.status lines.append(f"execute unless score {ctx.project_id} load.status matches 1.. run scoreboard players set {ctx.project_id} load.status -1") lines.append('') # start module clocks lines.append(f"execute if score {ctx.project_id} load.status matches {module_ver.major} run function {ctx.project_id}:init") # unschedule clocks for function in opts.schedule_loops: namespaced_function = f"{ctx.project_id}:{function}" if ":" not in function else function lines.append(f"execute unless score {ctx.project_id} load.status matches {module_ver.major} run schedule clear {namespaced_function}") ctx.data.functions[f"{ctx.project_id}:load"] = Function(lines) # load.json tag ctx.data.function_tags["load:load"] = FunctionTag({ "values": [ f"#load:{ctx.project_id}" ] }) # inject module load success checks (load.status 1..) into technical and display advancements # advancements get score checks injected into every criteria versioned_advancements(ctx, Version("X.X.X"), [a for a in ctx.data.advancements.keys() if not a=="gm4:root"], False) @configurable("gm4.versioning", validator=VersioningConfig) def libraries(ctx: Context, opts: VersioningConfig): """Assembles version-functions for libraries from dependency information: - {lib_name}:enumerate.mcfunction - {lib_name}:resolve_load.mcfunction - load:{lib_name}.json - load:{lib_name}/enumerate.json - load:{lib_name}/resolve_load.json - load:{lib_name}/dependencies.json""" dependencies = opts.required manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) lib_ver = Version(ctx.project_version) # enumerate.mcfunction lines = [ f"execute if score {ctx.project_id} load.status matches {lib_ver.major} unless score {ctx.project_id}_minor load.status matches {lib_ver.minor}.. run scoreboard players set {ctx.project_id}_minor load.status {lib_ver.minor}", "", ] dep_check_line = "execute " for dep_id, ver_str in dependencies.items(): dep_ver = Version(ver_str) warn_on_future_version(ctx, dep_id, dep_ver) if dep_id not in manifest.modules: dep_id = manifest.libraries.get(dep_id, NoneAttribute()).id dep_check_line += f"if score {dep_id} load.status matches {dep_ver.major} if score {dep_id}_minor load.status matches {dep_ver.minor}.. " dep_check_line += f"unless score {ctx.project_id} load.status matches {lib_ver.major}.. run scoreboard players set " lines.append(dep_check_line + f"{ctx.project_id}_minor load.status {lib_ver.minor}") lines.append(dep_check_line + f"{ctx.project_id} load.status {lib_ver.major}") ctx.data.functions[f"{ctx.project_id}:enumerate"] = Function(lines) # resolve_load.mcfunction lines = [f"execute if score {ctx.project_id} load.status matches {lib_ver.major} if score {ctx.project_id}_minor load.status matches {lib_ver.minor} run function {ctx.project_id}:load"] for func in opts.schedule_loops: lines.append(f"execute unless score {ctx.project_id} load.status matches {lib_ver.major} run schedule clear {ctx.project_id}:{func}") lines.append(f"execute unless score {ctx.project_id}_minor load.status matches {lib_ver.minor} run schedule clear {ctx.project_id}:{func}") ctx.data.functions[f"{ctx.project_id}:resolve_load"] = Function(lines) # load/tags {{ lib name }}.json ctx.data.function_tags[f"load:{ctx.project_id}"] = FunctionTag({ "values": [ f"#load:{ctx.project_id}/enumerate", f"#load:{ctx.project_id}/resolve_load" ] }) # load/tags enumerate.json ctx.data.function_tags[f"load:{ctx.project_id}/enumerate"] = FunctionTag({ "values": [ f"{ctx.project_id}:enumerate" ] }) # load/tags resolve_load.json ctx.data.function_tags[f"load:{ctx.project_id}/resolve_load"] = FunctionTag({ "values": [ f"{ctx.project_id}:resolve_load" ] }) # load/tags dependencies.json if len(dependencies) > 0: dep_tag = dependency_load_tags(ctx, dependencies) ctx.data.function_tags[f"load:{ctx.project_id}/dependencies"] = dep_tag ctx.data.function_tags[f"load:{ctx.project_id}"].prepend(FunctionTag({ "values": [ f"#load:{ctx.project_id}/dependencies" ] })) # additional version injections # NOTE functions get version checks replaced onto `load.status` checks ctx.require(find_replace(data_pack={"match": { "functions": [f if ':' in f else f"{ctx.project_id}:{f}" for f in opts.extra_version_injections.functions]} }, substitute={ "find": f"{ctx.project_id} load\\.status matches \\d(?: if score {ctx.project_id}_minor load\\.status matches \\d)?", "replace": f"{ctx.project_id} load.status matches {lib_ver.major} if score {ctx.project_id}_minor load.status matches {lib_ver.minor}" } )) # stamp version number and module bring packaged into into load.mcfunction handle = ctx.data.functions[f"{ctx.project_id}:load"] handle.append([ "\n", f"data modify storage gm4:log versions append value {{id:\"{ctx.project_id}\",module:\"{ctx.project_id.replace('gm4', 'lib')}\",version:\"{ctx.project_version}\",from:\"{ctx.cache['currently_building'].json.get('name', 'standalone')}\"}}" ]) # strict version checks on advancements versioned_advancements(ctx, lib_ver, opts.extra_version_injections.advancements, strict=True) # NOTE it may be possible/desirable to just automatically inject version checks into *all* library advancements # put library version number in namespace versioned_namespace(ctx, lib_ver) @configurable("gm4.versioning", validator=VersioningConfig) def base(ctx: Context, opts: VersioningConfig): """Fills in version information to the base functions from the beet.yaml""" ver = Version(ctx.project_version) # enumerate.mcfunction lines = [ f"execute if score gm4 load.status matches {ver.major} unless score gm4_minor load.status matches {ver.minor}.. run scoreboard players set gm4_minor load.status {ver.minor}", "", f"execute unless score gm4 load.status matches {ver.major}.. run scoreboard players set gm4_minor load.status {ver.minor}", f"execute unless score gm4 load.status matches {ver.major}.. run scoreboard players set gm4 load.status {ver.major}" ] ctx.data.functions[f"gm4:enumerate"] = Function(lines) # resolve_load.mcfunction lines = f"execute if score gm4 load.status matches {ver.major} if score gm4_minor load.status matches {ver.minor} run function gm4:load" ctx.data.functions[f"gm4:resolve_load"] = Function(lines) # resolve_post_load.mcfunction lines = f"execute if score gm4 load.status matches {ver.major} if score gm4_minor load.status matches {ver.minor} run function gm4:post_load" ctx.data.functions[f"gm4:resolve_post_load"] = Function(lines) versioned_advancements(ctx, ver, opts.extra_version_injections.advancements, strict=True) #type:ignore versioned_namespace(ctx, ver) def versioned_namespace(ctx: Context, version: Version): """Puts the project version into the namespace, and renames all references to match Used for libraries that may have multiple versions exist in a world at once without file overwrites""" namespace = ctx.project_id if ctx.project_id != 'base' else 'gm4' versioned_namespace = f"{namespace}-{version.major}.{version.minor}" ctx.require(rename_files(data_pack={ "match": {"functions": "*", "advancements": "*", "loot_tables": "*", "predicates": "*"} if namespace != 'gm4' else {"functions": "*", "advancements": "*"}, "find": f"{namespace}:([a-z_/]+)", "replace": f"{versioned_namespace}:\\1" })) ctx.require(find_replace(data_pack={"match": "*"}, substitute={ "find": f"(? FunctionTag: """Assembles dependency information into tag format. Ensures a pack's dependencies get processed by lantern load before the primary startup checks for the module itself""" dep_tag = FunctionTag() manifest = gm4.plugins.manifest.ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) for dep_id in dependencies.keys(): if dep_id not in manifest.modules: # retrieve "gm4_" prefixed id for libraries, which are named "lib_" lib = manifest.libraries.get(dep_id) if lib is None: raise ValueError(f"{dep_id} is not a valid library id") dep_id = lib.id dep_tag.append(FunctionTag( {"values":[ {"id": f"#load:{dep_id}", "required": False} ]} )) return dep_tag def versioned_advancements(ctx: Context, ver: Version, targets: list[str], strict:bool=False): """Adds versioning to advancements, either strict checks for libraries or load checks for most modules""" # NOTE advancements get score checks injected into every criteria assemble_value_check = lambda name_field, range_field: { # type:ignore "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": name_field }, "score": "load.status" }, "range": range_field } for entry in targets: if ":" in entry: handle = ctx.data.advancements[entry] else: handle = ctx.data.advancements[f"{ctx.project_id}:{entry}"] for criteria in handle.data["criteria"].values(): player_conditions = criteria.setdefault("conditions", {}).setdefault("player", []) if type(player_conditions) is dict: raise ValueError(f"{entry} is using legacy player conditions, which does not support load.status injections.") if strict: player_conditions.append(assemble_value_check(ctx.project_id, ver.major)) player_conditions.append(assemble_value_check(f"{ctx.project_id}_minor", ver.minor)) else: player_conditions.append(assemble_value_check(ctx.project_id, {"min": 1})) def warn_on_future_version(ctx: Context, dep_id: str, ver: Version): """Issues a console warning if the dependancy version a module requires is greater than the current version of that dependancy""" if dep_id == "gm4": return # the base version is not in the manifest, tis a special case if "lib" in dep_id: cache_compound = ctx.cache["gm4_manifest"].json["libraries"] else: cache_compound = ctx.cache["gm4_manifest"].json["modules"] latest_dep_ver = Version(cache_compound.get(dep_id, {}).get("version", '0.0.0')) if (latest_dep_ver.major == ver.major and latest_dep_ver.minor < ver.minor) or (latest_dep_ver.major < ver.major): # type: ignore message = f"{ctx.project_id} depends on a future version {dep_id} v{ver}, but the latest available is {latest_dep_ver}" warnings.warn(message) def isolated_library(ctx: Context): """Generates the #load:load function tag when building libraries in isloation""" ctx.cache["currently_building"].json = {"name": ctx.project_name, "id": ctx.project_id, "added_libs": []} # load.json tag ctx.data.function_tags["load:load"] = FunctionTag({ "values": [ f"#load:{ctx.project_id}" ] }) ================================================ FILE: gm4/plugins/worker.py ================================================ from beet import Connection, Context, Pipeline, ResourcePack, DataPack from typing import Any RETRIEVE_ALL_PROJECTS = 0 RETRIEVE_LAST_PROJECT = 1 ProjectPacket = tuple[ResourcePack, DataPack, dict[str, Any]] def store_project(ctx: Context): """Stores the current project object in a beet worker""" with ctx.worker(bridge) as channel: rp, dp = ctx.packs ctx_params = {k:getattr(ctx, k) for k in ("project_id", "project_name", "project_description", "project_author", "project_version", "project_root", "minecraft_version", "directory", "output_directory", "meta", "cache", "worker", "template")} channel.send((rp, dp, ctx_params)) def freeze_last_stored(ctx: Context): """'Freezes' the state of the last stored project by making it a shallow copy, allowing the original to be cleared""" yield # wait for exit phase with ctx.worker(bridge) as channel: channel.send(RETRIEVE_LAST_PROJECT) for last_project in channel: rp, dp, params = last_project[0] # only one project is passed in list frozen_rp = rp.copy(shallow=True) frozen_dp = dp.copy(shallow=True) # send back the frozen packs with ctx.worker(bridge) as channel: channel.send((frozen_rp, frozen_dp, params)) def clear_on_exit(ctx: Context): """Clears the packs on the exit phase - prevents faulty race condition merges into the parent subproject in a pipeline""" yield ctx.data.clear() ctx.assets.clear() def retrieve_and_run(ctx: Context): """Retrieves projects stored by the worker, reconstructs a Context() and runs the specified plugins on each one""" plugins = ctx.meta.get("plugins",[]) with ctx.worker(bridge) as channel: channel.send(RETRIEVE_ALL_PROJECTS) for stored_project in channel: for rp, dp, ctx_params in stored_project: c = Context(**ctx_params, assets=rp, data=dp) c.activate() c.require(*plugins) c.inject(Pipeline).run() # manually run plugin's exit phases as this context is "headless" def retrieve_and_merge(ctx: Context): """Retrieves stored contexts and merges their packs into the current/parent context""" with ctx.worker(bridge) as channel: channel.send(RETRIEVE_ALL_PROJECTS) for stored_project in channel: for rp, dp, _ in stored_project: #NOTE build hangs when fonts are merged from one ResourcePack to another... why is unknown # this is a manual work around to merge the font files without causing the strange hang for f, font in rp.fonts.items(): ctx.generate(f, merge=font) rp.fonts.clear() # clear mcmeta entries to the current context can properly make its own del dp.mcmeta del rp.mcmeta ctx.data.merge(dp) ctx.assets.merge(rp) def bridge(connection: Connection[ProjectPacket|int, list[ProjectPacket]]): # incoming types `ProjectPacket|int` and outgoing types `list[ProjectPacket]` project_storage: list[tuple[ResourcePack, DataPack, dict[str, Any]]] = [] for client in connection: # iterable is kept open throughout the life of the build # each `channel.send` causes a new element immediately processed here for request in client: # request is the actual payload - here the Context object if isinstance(request, tuple): project_storage.append(request) if request == RETRIEVE_ALL_PROJECTS: client.send(project_storage) project_storage = [] if request == RETRIEVE_LAST_PROJECT: client.send([project_storage.pop(-1)]) ================================================ FILE: gm4/plugins/write_mcmeta.py ================================================ from beet import Context from gm4.utils import run, NoneAttribute from gm4.plugins.manifest import ManifestCacheModel def beet_default(ctx: Context): """Writes the pack.mcmeta based on the module name and version.""" yield # wait for exit phase manifest = ManifestCacheModel.model_validate(ctx.cache["gm4_manifest"].json) manifest_entry = {v.id:v for v in (manifest.modules|manifest.libraries).values()}.get(ctx.project_id, NoneAttribute()) ctx.data.min_format = 101 ctx.data.max_format = 101 ctx.assets.min_format = 84 ctx.assets.max_format = 84 for pack in ctx.packs: pack.description = [ ctx.project_name, "\n", { "text": f"Gamemode 4 for 26.1", "color": "#4AA0C7" } ] pack.mcmeta.data.update({ "version":manifest_entry.version, "commit_hash": run(["git", "log", "-1", "--format=%h"]) }) ================================================ FILE: gm4/skin_cache.json ================================================ { "skins": { "gm4_metallurgy:band/curies_bismium": { "uuid": [ -1332644679, 659216762, 2108439484, 664728976 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyODAyOTI2NzM2NiwKICAicHJvZmlsZUlkIiA6ICI3ZmIyOGQ1N2FhZmQ0MmQ1YTcwNWNlZjE4YWI1MzEzZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJjaXJjdWl0MTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2MzMTBmZDk3YjFhN2Q3MDkwOGExODc2N2FjZmRjYzYwZDJhMTU1NTY5Zjk0YThmYjZhZWUxYTMzMWE5MjM4IgogICAgfQogIH0KfQ==", "hash": "9ed097b3f89227e8c37120243968e5bccaf7d228", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:band/barium": { "uuid": [ -758190455, 118414880, 1677653096, 2076204799 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyODg4MzkzODA4MiwKICAicHJvZmlsZUlkIiA6ICJmNThkZWJkNTlmNTA0MjIyOGY2MDIyMjExZDRjMTQwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1bnZlbnRpdmV0YWxlbnQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxMzcwMGVlMGViYzgwOTU2N2IxYTNjOTFhYzhjMWFhMmJiNWNlYjQ4YWRlNzZlOGJkN2QzMWE5Y2EzYjdkIgogICAgfQogIH0KfQ==", "hash": "14cd3ff955967271ebdf82b44d3f3844dc837f41", "parent_module": "gm4_metallurgy" }, "gm4_auto_crafting:auto_crafter": { "uuid": [ 925477182, 1548502938, -926454109, -774539107 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY1NjM4MTc3MTIyMywKICAicHJvZmlsZUlkIiA6ICJjMTNkYzkxZjg1YjA0ZWM4OGU2NDk5YzdjZDc4Zjk3MSIsCiAgInByb2ZpbGVOYW1lIiA6ICJjYXNzdGhlY3J5cHRpZCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9jZjI4NWUwYjc1NGNhMDU3NDllODYzMjA0MmZkZmEyZGRkYjIyMjNhYWVmNGU3NjczOTdlNzg5Y2ZjYTYzYjFhIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", "hash": "122bb193187f87d87f97abb6b83b7b02a7349912", "parent_module": "gm4_auto_crafting" }, "gm4_block_compressors:block_compressor": { "uuid": [ 788137431, 1839549415, -1633195690, -1508391925 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1MzYzMTM1MiwKICAicHJvZmlsZUlkIiA6ICI0ZWQ4MjMzNzFhMmU0YmI3YTVlYWJmY2ZmZGE4NDk1NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJGaXJlYnlyZDg4IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZmYTkzMjMxZjZmNjVkNjc1NDI2NjgyMzE3NWIwOWFmNGNhN2E1NzQ1NDQzYjMyNjFlZGE3OGUzNTk5NTgyYmYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "4550bb57cbcacc21036cbb3be9dfb3429df74d26", "parent_module": "gm4_block_compressors" }, "gm4_metallurgy:band/aluminium": { "uuid": [ 1961294324, 1560605478, 885901402, 915511979 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyODc4ODAzNjY3NCwKICAicHJvZmlsZUlkIiA6ICI2MjM5ZWRhM2ExY2Y0YjJiYWMyODk2NGQ0NmNlOWVhOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJGYXRGYXRHb2QiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGQ3MTQ5OTY0MDNlMTNhNGE4ZTc4OTQ0OWNjN2I5OGRhMmI4NDc1NTRjNDgwZGUyMDUxOTcwYjIxODIzZGJkOSIKICAgIH0KICB9Cn0=", "hash": "d9c35bd3db598c7748165543b54b2a9a23e7e76c", "parent_module": "gm4_metallurgy" }, "gm4_disassemblers:disassembler": { "uuid": [ -1561282646, -258324274, -1153094374, -693854673 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDAzMTQ2MywKICAicHJvZmlsZUlkIiA6ICJjNDM5NDI3Y2U1NGQ0NDMwYTYzOGU5OTdlYzc2YTBhOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVNYXN0ZXJHb2xkZW4iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODFjNzQ2NzEwZjQ3ODZiYzgxZTI1ZWVmOTM5ODI3ZjNiNDMzMjFhODQ1ZmYyNmU4N2E3MjVmZDBkMzU2Y2Y5MCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "78c3082f5e32d9545c7ea81734776ce28eaefac1", "parent_module": "gm4_disassemblers" }, "gm4_enchantment_extractors:enchantment_extractor": { "uuid": [ -395669705, 959204555, -1473222203, -686353911 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDA4MzE3NiwKICAicHJvZmlsZUlkIiA6ICIxYTc1ZTNiYmI1NTk0MTc2OTVjMmY4NTY1YzNlMDAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZXJvZmFyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIyZTRiMWM2ODExYjhkOTgyNTg3NTNmZWNkNGYyOWUzY2Y2MjJmODFhN2FlZTEyNTIwMTc1MmM0NGVkM2EyNDEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "356988a3785fc31cf1f15f833aa1d71ca5cb6c2a", "parent_module": "gm4_enchantment_extractors" }, "gm4_ender_hoppers:ender_hopper_display": { "uuid": [ -1738045610, -1151472894, -1829437163, 677674665 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTIwMTExNywKICAicHJvZmlsZUlkIiA6ICI5NTE3OTkxNjljYzE0MGY1OGM2MmRjOGZmZTU3NjBiZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJPcmRpbmFsQ2FyZGluYWwiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTI4NzVlODdmNzBkODMzNjcxYTEzMWJjZjE2OGI2Y2VjYWQ4YmIwNjlhYTkwM2ZiOTFiOGVhMWYwOWRhZDQ1NyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "6bb95eece3cb1ee8ec0265aa12620ebc88c6f9e9", "parent_module": "gm4_ender_hoppers" }, "gm4_ender_hoppers:ender_hopper": { "uuid": [ -1638903124, -1364335607, -1999291957, -1538083823 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTAzMTI1MywKICAicHJvZmlsZUlkIiA6ICI5ZWEyMTQ0NGFiNjI0MWZkYjg5YjE2NDFhNDg2MGZiZiIsCiAgInByb2ZpbGVOYW1lIiA6ICI3QUJDSE9VTiIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80MjBjOThjYTlhZjRjYTY1N2ZjN2M5MTc4Yzc5ZjQ5MDM4YmU2ODExMzllNjIwZDEzMmJhNTJmMzA3YjAxMTcyIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", "hash": "4881cf1a003e7dcb239fd97f75eaaa729324115b", "parent_module": "gm4_ender_hoppers" }, "gm4_end_fishing:enderpuff": { "uuid": [ -749248143, 1561284060, -1964497486, 1336566238 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYxNzM3NjU5NjgxNiwKICAicHJvZmlsZUlkIiA6ICI4NDMwMDNlM2JlNTY0M2Q5OTQxMTBkMzJhMzU2MTk2MCIsCiAgInByb2ZpbGVOYW1lIiA6ICJHYWJvTWNHYW1lciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lYjIzNTI3MWNhNTZlOGExYTQzMWViMWU2NWNlODIwYWE3ZTUwMWYwNmMxZjEzNTZhY2ViN2U4NjJmMTRhMjgiCiAgICB9CiAgfQp9", "hash": "d77a8f7ba43aca49a4f98a096b22ef0712876d5f", "parent_module": "gm4_end_fishing" }, "gm4_forming_press:forming_press": { "uuid": [ -1176243816, 418006447, -1230055084, 297056131 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NTQ0MTc1NywKICAicHJvZmlsZUlkIiA6ICJjNjEwOTExMDhlOTQ0MWRhODQyZDA5MDVmMDAyOWVhOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJkZVlvbm8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjM0YWQ1NDAyYzAxMzAzYzA0NmI1MTJlZjBiMzYyYmQwNjJjMWI3ZTg1MTU5YTYzODMzMGQyMjg0NTYzMWNmYSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "d5356175300c7f90d4638f826e7a7ce73f5411f4", "parent_module": "gm4_forming_press" }, "gm4_metallurgy:band/barimium": { "uuid": [ -340714413, 1525011343, 50560746, -1948445052 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyODc5MjUwNDk5MiwKICAicHJvZmlsZUlkIiA6ICI5MWYwNGZlOTBmMzY0M2I1OGYyMGUzMzc1Zjg2ZDM5ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTdG9ybVN0b3JteSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS85MzU2MjZhYzgwZmZmYWFiOTkyOWMwYWViNTg5N2RkN2FlOThjOWI5NTY1NjVjZTc3YTEyNjE0MjExYWI2NTg0IgogICAgfQogIH0KfQ==", "hash": "f75253001a1bababc6715a25f883cd19fa6f2d11", "parent_module": "gm4_metallurgy" }, "gm4_heart_canisters:heart_canister_tier_1": { "uuid": [ 1567268555, 400377645, -2090593244, -1749540666 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYxNjM4NTc2NTU0MSwKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjkxNzBhNzY4ZGY1MDQ1OTcwM2JkYWRkYjNlZGI2OTMyNmJkY2NjY2JmNDQxODM4MDM0YTI0N2I2NDFiN2UyZiIKICAgIH0KICB9Cn0=", "hash": "c36f3f29070e940d4bd0e8994c3f6d390e2e9c77", "parent_module": "gm4_heart_canisters" }, "gm4_heart_canisters:heart_canister_tier_2": { "uuid": [ -320501529, -244889622, -2022276390, -292592904 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYxNjM4NTgyOTM1NSwKICAicHJvZmlsZUlkIiA6ICI0ZTMwZjUwZTdiYWU0M2YzYWZkMmE3NDUyY2ViZTI5YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJfdG9tYXRvel8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzgxZmU0ZjA2YTM1ZWU3YzQyMzA5ZDM5M2MyNWJjMTFjZDFiNWIxNTBhMTllZGYzODllOGVjY2E0ZmNlMWRkZiIKICAgIH0KICB9Cn0=", "hash": "e451ff78653c15dc5976ba6b9f650503b7f0ea57", "parent_module": "gm4_heart_canisters" }, "gm4_lightning_in_a_bottle:texture_connector": { "uuid": [ 1196754309, 1130089731, -1851853423, 152678880 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYzNzc3MDAzOTc2OCwKICAicHJvZmlsZUlkIiA6ICJmODJmNTQ1MDIzZDA0MTFkYmVlYzU4YWI4Y2JlMTNjNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZXNwb25kZW50cyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzEzZjIxN2U5NmJmY2VhNjIwZTc3YTIzNjRjYTBkNmE0ZTdhN2UwOGMzNzAzNzI3ODI4MTQ4ZjQxNjM0YmVjIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", "hash": "68071514c7ccaa2f5e14f9061a013bb14fb5e6d5", "parent_module": "gm4_lightning_in_a_bottle" }, "gm4_lightning_in_a_bottle:lightning_liquid": { "uuid": [ 2130271109, -1138570753, -1614258158, -884567317 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYzODMwMzcyNDQ2NywKICAicHJvZmlsZUlkIiA6ICI4MmM2MDZjNWM2NTI0Yjc5OGI5MWExMmQzYTYxNjk3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJOb3ROb3RvcmlvdXNOZW1vIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y3ZjA1OWRiZTJhZDIxZTlmMzZiY2U3NmYyY2YyOGI5ZDdlOGFmN2Q4OTE0MDdhYWYwYTE2OTk3MTJhMmE2YmEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "ca9b10a25c2a9bbcc2dc60e8e0be64a377315874", "parent_module": "gm4_lightning_in_a_bottle" }, "gm4_liquid_minecarts:liquid_minecart_display/low": { "uuid": [ 1120840726, 453134473, -1920599881, -1587040077 ], "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTEzNjg2ZjIxMDY1YTRiZTZjYzU3MDYxZDhlNzM2MDQ3MzQ2YzU4NmEzYTU1OWMwMzdhMDMxNGJjNDUyOTA4MSJ9fX0=", "hash": "ad8328a889382d1dc3e54cd6e1913f70a70b3624", "parent_module": "gm4_liquid_minecarts" }, "gm4_liquid_minecarts:liquid_minecart_display/high": { "uuid": [ -325521224, -1751038048, -1752797071, -316499442 ], "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFjOTBjM2ZmNWI5NzBhNTIyNTliNTdhNDlmMjFmOGE1NTdmZmIxYTM2ZmNjNDkwMDQyMTQzNDZkOWViN2RmZCJ9fX0=", "hash": "d5be0eb8f20d9861f23989dc63a292519ac9a4b8", "parent_module": "gm4_liquid_minecarts" }, "gm4_liquid_minecarts:liquid_minecart_display/full": { "uuid": [ -6800160, 1470582470, -1663082352, -568664979 ], "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2M5OTI4ODgxNGY1ODVjN2JjMmU1NWQ0NDY0ZDUzOGQwZDlkOWM4YjE4NzRiZTA5ZDc4Yjk3YzA3YzAwYWIxYSJ9fX0=", "hash": "74867e13b52f18a58a6cdbdbd1e70518409382ac", "parent_module": "gm4_liquid_minecarts" }, "gm4_liquid_minecarts:liquid_minecart_display/empty": { "uuid": [ 119585825, 206784598, -1119495979, -520523912 ], "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjhiMjU1MjJjMzFiZmU0Y2VhMTAxMDA4MGQ1YTFiOWIwOGU3NWJhZTUzOGRhODk3MmNiZGQ2YTk0Mzk5MjEyYSJ9fX0=", "hash": "d1f2877b30e215cdaf922cd0005a01192a66eac2", "parent_module": "gm4_liquid_minecarts" }, "gm4_standard_liquids:liquids/beetroot_soup": { "uuid": [ 76960881, 2041792394, -1393666914, 2103407100 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTI0MjRjYjQxNDY2ZmFlNjk5ZjgyNjk2NTJkOGQxYjBjZjgzZjBkMmFkZDBkNjUzZjA5ZTlkMzFiMmY5YTk0OCd9fX0=", "hash": "3bbbd041e4ddc003e7f6447fad8f2a2b9391a0ef", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/experience": { "uuid": [ -745806368, -1045543603, -1458236618, 515537139 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGNiMGNmY2FjMDJiM2E3ZjZkZWI4N2E4YWZjZDgxYTUyMzdlMWNlNWVlMWI5NWMzNWVhM2U3NDkxMDNiNjc0ZCd9fX0=", "hash": "d3d8dcc50faf62ea44e33377f860f2fb923be0bb", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/glow_ink": { "uuid": [ 2130271109, -1138570753, -1614258158, -884567317 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyNzQyMDQ0MTc4MiwKICAicHJvZmlsZUlkIiA6ICIyMjg0NDBlODcyYzg0ZGM3ODM0OGIyNzc1ODUwMzRjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTcGVjaWFsQnVpbGRlcjMyIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2ZjYjc1NzljZWQ1NTRiZWU0ZmQ5ZmZhMGYzYjQ5NGU0YjJhOWE4MDBmM2ZiNmI4Yjc0YjVlMmU3MThjMTgzYmEiCiAgICB9CiAgfQp9", "hash": "e17f603217f2d39c1b610f8849882ffb504b6636", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/honey": { "uuid": [ 1093018679, -1629534446, -2052300824, -1187268546 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhhYzUxZTBjNWM5MWNmOGNlN2RiMjAyYmY5MWIxNmFkOTQ3NDkwODU0YWM3MjUyMjNmMGIwNDU0MGE1NWYyMCd9fX0=", "hash": "ea675cd17ceb3e5913936bd1fb39b9a239ee7f22", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/ink": { "uuid": [ 2112341109, -1138570753, -1614258018, -889714137 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyNzQyMDI0MjQ3OCwKICAicHJvZmlsZUlkIiA6ICIyMjg0NDBlODcyYzg0ZGM3ODM0OGIyNzc1ODUwMzRjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJTcGVjaWFsQnVpbGRlcjMyIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q5NjAzYmMyODg0M2RhYjVjOTEzYTkxNmVkMzIxZGZhNTFlMzlkZGVjZDA5YWIyMzNiZjViZDNhMDM1ZjlhNWMiCiAgICB9CiAgfQp9", "hash": "5e1a124e3999963e0914b175f00c040f79b3f1f7", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/lava": { "uuid": [ 2084309355, 294864792, -1353120517, -2139917050 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2M5OTkzMzI2M2ZjYmNhOGJlYTI1Yjc1MjU1Y2Y4M2E3NTc4MWZiOTkxY2RlYTBmODA0M2RhZjQzMTgxODE1MSd9fX0=", "hash": "2faed9fa93d0cfd9286096e7965571c1adf9d4d6", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/milk": { "uuid": [ -1652105090, -613725561, -1717347128, 1926135093 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDMyODNiOTRjYzhiYWM3YTVkNDQ4ZDUyMTQ0MmFkNDY1MjY1MjM1NzYzYTNmYTJhMGIyODdiMGRiOTIyOWQ4Yyd9fX0=", "hash": "70a5421e48597699dd6284381b07e81e978ff42a", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/mushroom_stew": { "uuid": [ -851826350, -819969624, -1341610165, -2102026501 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmVlMmMwMjBiYzg2NTBhYWFlN2NkYzhjY2VmYjRhYWI3ZGRkOGNlMjhlYTlmOWJkMDQ0OGIxMWY0Y2M1OGRiZCd9fX0=", "hash": "ab5933443964922f4cfcaf186ba2a62981a243cf", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/powder_snow": { "uuid": [ 793744989, -1949546447, -1499784649, 2041283293 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDBiYWVkOWYwYjJhOGM3NTM0YTk0MTY1MjAzYThkZjJlY2JmY2Q2ZDNmZmM2ZjY3ZmVkZTNkYTQ2YzZlMzA2ZSd9fX0=", "hash": "e01a0deac23275e98e459e5d8b721c4819574d88", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/rabbit_stew": { "uuid": [ -898957329, 1308640890, -1080612430, 1170134979 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTA1OWJlZWJmOTVlZTQzYzc1NDcyOWZlNmYzYWU5OWUxYzYwZTQ2ODJjNGUyZDZjZDJiYTQwNzBjZTlhZjBlOCd9fX0=", "hash": "f3b45e34be5a61311f53ec938b90cb8956d522de", "parent_module": "gm4_liquid_tanks" }, "gm4_standard_liquids:liquids/water": { "uuid": [ -2087209360, 1395149785, -1312941628, -799708652 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTllNDg5MGZkZjNiMTZlYjE2NjZlMDA5NmE2YjA0MDhiNTY2YzE4MzRiZjMyNTcwYjFkZWIxNjU4MzczOWUxZSd9fX0=", "hash": "04b5cd8c45121fe3d18037c26863f84b10967124", "parent_module": "gm4_liquid_tanks" }, "gm4_liquid_tanks:liquid_tank": { "uuid": [ 506554253, 2099987480, -1876292803, 1704690390 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDI1OTYyNSwKICAicHJvZmlsZUlkIiA6ICJiNzVjZDRmMThkZjg0MmNlYjJhY2MxNTU5MTNiMjA0YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJLcmlzdGlqb25hczEzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFlOGI5ZjNiODgwNjIzZDNlM2ZmZGZkNmUyZTljYTY0OWQ0ODcyMDY0YzY0NmUyNWNjNDEyZGYzYTZjNmRlMTkiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "51f68953f83b6158bf973801537f19ca87f7e890", "parent_module": "gm4_liquid_tanks" }, "gm4_metallurgy:mould/hot_metal": { "uuid": [ 140191582, -1151712444, -1271433465, -1758951935 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE0MTE2NTQxODksInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODZkMTEwNmNjZDhhY2E3NDg4N2Q1ODIwNTU0YmZiMzM5YzdhM2NmOTJjNDY1MTU2MmM2NmZiNzZkMTQ0In0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==", "hash": "4b169331a5c86b0a5607df6b938f21c7854dba9e", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:mould/cool_empty": { "uuid": [ 140191582, -1151712444, -1271441790, 1896239124 ], "value": "eyJ0aW1lc3RhbXAiOjE0Nzk4NTI1MDM5MzksInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWZhYmExYzg3NTFjYWIzZjEyZjJlODgwMTRjZjRlYmY2N2ZjNWQ3NGNmY2U5YmUyNTI1YWQ0OWE5MjFkY2YyIn0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==", "hash": "69a13a9f3e6e40d6428d50fcee10979c2328b682", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:band/mundane": { "uuid": [ 2090045838, 1070000930, -1136417339, 1085846924 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE2NjMzMzg5MDksInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzQ4MGNjMjY3M2ZmMjhkNTEzNDY0MTMxN2FiYzUzMWU5ZTFjZWU3MTFlYWJmYWY3YzJhZDY1M2E0NmQxZmI3In19fQ==", "hash": "228842822c2bb932c4411d9e81d6c3a8641c2af6", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:mould/hot_empty": { "uuid": [ 140191582, -1151712444, -1271434748, 932201856 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE0MTE3MjM4MDYsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc0NTVkNjg3MjJkOTU3ZmI1ZGVjZGNjY2NjMWI2MWU4NzlhOTY3ZjFiZGM3YzJhMmZkMTlhYTI3OWU4ODUifSwiQ0FQRSI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVjM2NhN2VlMmE0OThmMWI1ZDI1OGQ1ZmE5MjdlNjNlNDMzMTQzYWRkNTUzOGNmNjNiNmE5Yjc4YWU3MzUifX19", "hash": "8f66eaf882905a9de8e1f81969f9eaf23a6e9450", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:mould/cool_metal": { "uuid": [ 140191582, -1151712444, -1271443335, 826741136 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE0MTE1NjYwMjQsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjM3ZjE2Zjc2MTk1ZWM3OWI4MzFmMzc5ZjkzYjYwYzg2MWZkNGNhYmYyZTI5ZDNmZTlkYTJmODU4OTJkY2EifSwiQ0FQRSI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVjM2NhN2VlMmE0OThmMWI1ZDI1OGQ1ZmE5MjdlNjNlNDMzMTQzYWRkNTUzOGNmNjNiNmE5Yjc4YWU3MzUifX19", "hash": "9bda9bad8b236e64155957cbcfd74d4763bde9d1", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:ore/aluminium": { "uuid": [ 140191582, -1151712444, -1271445916, 307298631 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDMzNDA1MiwKICAicHJvZmlsZUlkIiA6ICI3ZmIyOGQ1N2FhZmQ0MmQ1YTcwNWNlZjE4YWI1MzEzZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJjaXJjdWl0MTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjU1MTdhNjYyYTgzY2FhYWFjMWE3MTMzMmUzODFiYmZmYzkxYjJhNjBhODc1Y2NhZDhmZTM4ZGM3NWRlZDU0OSIKICAgIH0KICB9Cn0=", "hash": "36974013a30dbe991e98bcaacd83332a2a473878", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:ore/barium": { "uuid": [ 140191582, -1151712444, -1271442552, 1879524245 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDI1Njk5MSwKICAicHJvZmlsZUlkIiA6ICJiMGQ0YjI4YmMxZDc0ODg5YWYwZTg2NjFjZWU5NmFhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaW5lU2tpbl9vcmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjg5ZjJlZjhmZTJlMzhlM2I1YzliMzU0N2M3ZTFmODUzYTlhNDQ4MjFiZDllZTI1YmQ2ODhiYTY0MzcwZTk2MyIKICAgIH0KICB9Cn0=", "hash": "0b490877e69de3270e478b6166f1ba792c281961", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:ore/bismuth": { "uuid": [ 140254582, -1151718614, -1277548307, 1366135037 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDM0MzA2MCwKICAicHJvZmlsZUlkIiA6ICI0OWIzODUyNDdhMWY0NTM3YjBmN2MwZTFmMTVjMTc2NCIsCiAgInByb2ZpbGVOYW1lIiA6ICJiY2QyMDMzYzYzZWM0YmY4IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EwODFiMmY2Nzk3ZDk2YzcxMGYyMjk1YmQ2MGJmYjc3NTE5ZDU4Yzk3NGEwYjM0YjViZDcyZmNkNzc3OTYyMWIiCiAgICB9LAogICAgIkNBUEUiIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIzNDBjMGUwM2RkMjRhMTFiMTVhOGIzM2MyYTdlOWUzMmFiYjIwNTFiMjQ4MWQwYmE3ZGVmZDYzNWNhN2E5MzMiCiAgICB9CiAgfQp9", "hash": "5b34fa6299f5ebbf3e97dcf2afe61c5ca09ad1a0", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:ore/thorium": { "uuid": [ 140191582, -1151712444, -1271454064, -1822255261 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyOTY4NDM2MzM0MywKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjcxYWQ1MTBhMTBjNWMxYzZkMGY3NzVjYWRkNWVmMTliZWRkODY2NTQwNmE5ZWY1NTI0ZGJmOGZiNjQ2MmViIgogICAgfQogIH0KfQ==", "hash": "3727bbe1dc210a6a23aed1754132d6bc54cc8c4b", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:band/thorium": { "uuid": [ 1709100198, -881135263, -295939255, 1602156123 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE2NjM1MTAwNzIsInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYzOTJhNmQ5OWY5MzE5ZWU3YzRmNGMxYTE5NzQ5ZDY4N2NkY2M4ZWVjOGZjNjY4ZTczZDM3YTZkYWY3N2EifX19", "hash": "266361d64d25b321b9e1da7f2555410c1cfa1da9", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:band/bismuth": { "uuid": [ -359255454, 30123560, -1513962184, -616842323 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyODAxNDc0OTQ2MSwKICAicHJvZmlsZUlkIiA6ICJiMWMyNWQ0YjMwZDU0N2Y4YTk3NmZlYTllOGU1YzBjMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJvd29FbmRlciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NmM0ODcwYmNiMDdkYWJjMjNiNTZkMzJlNzI5OWI5NTE4ZTU1N2VmMzU2YTNiZGRmNDBkNGM3MDIwYzI3MTdhIgogICAgfQogIH0KfQ==", "hash": "3013a7a04e1eace26fb8ec20af7cbca563e2a430", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:band/copper_RETIRED": { "uuid": [ -359695444, 30126360, -1513204284, -616246813 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODg0Njc2ODYwNDksInByb2ZpbGVJZCI6IjkxYTBlZmEyM2QxODQ5Y2ZiM2JkMGExNzdjZjM3Nzg4IiwicHJvZmlsZU5hbWUiOiJEdWNrSnIiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjMyNjQ2OGE2N2NlZTNkYTJlYzE0MDJiZGU1MzhlNGZjOGU5ZGVmZGFmOGNlMzVjZGJiYjEzY2RjZTE1ZSJ9fX0=", "hash": "c5c13cf0c8130a161363402f87a7e1dbb0afe516", "parent_module": "gm4_metallurgy" }, "gm4_metallurgy:ore/copper_RETIRED": { "uuid": [ 140191582, -1151712444, -1271449307, 1366570837 ], "value": "eyJ0aW1lc3RhbXAiOjE0ODE0MTA4Mjk2OTAsInByb2ZpbGVJZCI6Ijk4NWIyNzVlYmI1YTQzNDRiNDM3Njg5NTI4NjNhNjNmIiwicHJvZmlsZU5hbWUiOiJTcGFya3MiLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDNjMWE3ZGEyZWJkZGI0YTk3YzI3NDA0N2RlNzFkN2RjZWJjMTc2YTBlNjE3MzBmZmQzMzIzODUzNTNlIn0sIkNBUEUiOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YzNjYTdlZTJhNDk4ZjFiNWQyNThkNWZhOTI3ZTYzZTQzMzE0M2FkZDU1MzhjZjYzYjZhOWI3OGFlNzM1In19fQ==", "hash": "915a5cc5ebbf4d799049f4e5e0846d539253ff38", "parent_module": "gm4_metallurgy" }, "gm4_potion_liquids:liquids/fire_resistance": { "uuid": [ 2130832668, -69843189, -1628986667, -1615730322 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDI5ZmE3YjFmNDZhMjgzNjgwOTlmMjA4ZmU5NGQ3NzY2NzdkZTUyZWNkMjY0YjhmOTI4MzdjODQ5ZDZmN2NjNCd9fX0=", "hash": "2398626d300f895b4d62aabfefae73e77370be52", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/floating": { "uuid": [ 32752701, 1442140104, -2121835220, 212039422 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmZiNjAxOGVjNzM4NWU4YTE5MTE3OWRjOWE1M2Y4MGY5NGQ4MjIzZWQ5YWEwNDgwMDcyNzdiNzUzMGNlZjgwZCd9fX0=", "hash": "c54b1eb1be2154c9ae542ee87bfd1efa101457c6", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/harming": { "uuid": [ -1211340845, -910802362, -2144368484, -211827793 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2Y4MGUyMjc1N2UxZTUzM2RkMGI3ZTRlZTU2YTE3OWJlYmJlN2RmODE4NzRkMzVmNTkyZDQ1YmM1YWZiNjRhMyd9fX0=", "hash": "c2f87b8817311d26cbd31b1e064105ba98ccf71a", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/healing": { "uuid": [ -575407116, -2057942971, -1081937529, 601872280 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWVkZDU2OWQ1MTM2YThlNzRjM2IyZTliYjdjZTI4NDk4OTFlNTc2ZGFkNjkyNjQwNWNhY2I4ODdhNjk5NWJmNCd9fX0=", "hash": "73a0fdf1bfec33b5ab2fe0621ba35a08b988c749", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/invisibility": { "uuid": [ -332185350, 1698318266, -1646469451, 1142033314 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjk5OTU0NTAxOTY5MDQ3ZjE4NjQ3NjFhN2Q4ZWFiNzJmMjIwM2JiYzBmZGFiY2FiNjJjOWUxZDU3M2YxN2ZlOSd9fX0=", "hash": "684edcc54546a42d94e7775ceec3ce2ea37f6ac6", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/leaping": { "uuid": [ 822748764, -913751735, -2104548355, 1076203816 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjJmZTE2ZWFjMDFhNjIyZmE0YTg0ZTYwMDM5MzBiY2E1ZjBiZmZhOThhYTMxOWJmMGRlN2U4YmQ4ZjMwYjAwZid9fX0=", "hash": "58419073ee28986d29008da1d7bd8d342c34f8e8", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/luck": { "uuid": [ 1998983973, 799228293, -1480289059, -30160010 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTg4ODJmMmQzNzM2YmM5YWYxMTMxMDQxYTg3OTc4ZDg1NGUxNTk1MjE1ODU5YjEwM2Q3ZjY0M2U1ZTZiMTk5OCd9fX0=", "hash": "be8cd5206b554f01bb1ddbe3a3296f1e076bf81a", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/night_vision": { "uuid": [ 1591024166, -1403895054, -1150690056, -208826299 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODQ3ZTUxOWU3ODMxMTNkNzY0MWVhZGQ5NzFjYzZkNDE2Y2E2M2Q4MmY3MDdhNzE5NjBmYjQ5YzMzNzQ1ODJjNSd9fX0=", "hash": "2710022ddb4c3944ea4a20d579867f8b49ec041e", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/poison": { "uuid": [ 809108775, -1144238335, -1966668314, 1676984478 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTY2OWViYmU5NTk3NzQzZmI3ODUzODA1YTk3MTU3ZWVmMTlhZTEwOGI5NWFhZGM0MjI2ZTQ4ZjQyN2FjMmFiNSd9fX0=", "hash": "3f8a4881a694f447f79fff06d4afd42b6ab71626", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/regeneration": { "uuid": [ 175112486, -350270963, -1804632664, -1472362007 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM2OTEzNmNlMGU5MjZhZjg5MTUzNGNlNGI1OGY4NDVmODFlNWRiYTNhZGNlMzA4NzE0YzdjZmZjNmUxZTgyZSd9fX0=", "hash": "af5e903c6b94e36e3a38feb99e6edf9be9640408", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/slow_falling": { "uuid": [ 1401295760, -1001370020, -1237459354, -1996662618 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIwNmUxYjgwOGJiZGE1ZjYxYzc5MjdiYTA2N2ViMDQ4ZDFmY2I3MmEyY2E4OThiOWY3YWQxMDY4YzY0MGM2Yyd9fX0=", "hash": "12881ca86bfcfd8a67c0b09f8233c7625aae5990", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/slowness": { "uuid": [ 2073042102, -128102461, -1871962475, 708373893 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWNiM2E4ZTUwNTkxZGE4NTk3NWI3NDU0NjcxMmZmMzc2YTZiMWNjZmI5M2EyNDQ0ZjEwZDdkZTA4MTc2NmFkZid9fX0=", "hash": "5a88aa4ac65d59cc33d81f9d8e35856f6b2305cb", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/strength": { "uuid": [ -1380259552, 1048462685, -2136230086, -2011000224 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmFkOWJlMjY2Y2JlM2RmYTFlMWMwNzdjNjRlZDA3MjllZjEwNDFkZDZkZTFmYzViOTcwMTBiZDdmM2RjMzkyOSd9fX0=", "hash": "72b5105c05c916ea7b8e57fa07dc19b4edfb84a3", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/swiftness": { "uuid": [ 628694958, -4831928, -1207352243, 134819399 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODE3MGJhYWJhYjg3YzhmM2YyMjkzYjQyZjY4ZmI2M2RiZGQ1ODhjNzhjMDllNzcyNTI1YjVjODUxYjJiNDEzNSd9fX0=", "hash": "c81b184c72db50cb84ccc27a6e9ea758a9886167", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/turtle_master": { "uuid": [ 363269321, 1718175205, -1985643155, 497739307 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTc0Zjk5NzNhZDhmZjQ0MThhNWFmNjI4MWM3NDEyYTRjYmNhNmQzMGYzMGMxYWY5M2M2Mzc3Zjc4YzNhZTczJ319fQ==", "hash": "69f1773d5c561a8616901a3d62bc00c62b3bdea0", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/water_breathing": { "uuid": [ 2087529956, -762951532, -2088462039, 585618953 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGFkZmFlNTE0OWNkMDViN2RkODYwOWYwMDIzMWQyODhiZTAyOWRlZmFmMTc3YzNiY2M3NTNhNjM2YzFiMGI1OSd9fX0=", "hash": "965aaf4a242305a774eded7eea9a831d396ac107", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/weakness": { "uuid": [ 1194584133, 959795039, -2040976206, 1339213576 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTQ1YjZhYzVmZjU4MzVjNzc3ZjAxMzdlZGY1ZDBlMjg4OGVkNjg2MTE5NTMxNmQ3MjhlNDRkZWVkOGM2NDJmMCd9fX0=", "hash": "ff283cb7ab9bd87333fc675a7791bde5180a7f79", "parent_module": "gm4_potion_liquids" }, "gm4_relocators:relocator_empty": { "uuid": [ 939288592, -1692047561, -1963748291, -978837126 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTU0MDM1NCwKICAicHJvZmlsZUlkIiA6ICIxYTc1ZTNiYmI1NTk0MTc2OTVjMmY4NTY1YzNlMDAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZXJvZmFyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y3YmJiZTlkNzY0MTM3NjRkNmEyNzc0MWJhMTA5ZTViY2E1Mjg1NjFmMGE2NjJlMGE0N2UwZjM1NTc0YTI3OTkiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "05940a886ac9e528d2e20ea2c5412e6ad0678160", "parent_module": "gm4_relocators" }, "gm4_relocators:relocator_full": { "uuid": [ 938288371, -119475667, -177364551, -680664510 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDM1MTY1ODg2NiwKICAicHJvZmlsZUlkIiA6ICJmZDYwZjM2ZjU4NjE0ZjEyYjNjZDQ3YzJkODU1Mjk5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWFkIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE3OTE5NTFiNjQ5ZmZmMDI2OGUyZTBkYWZhMGQxZDQ0YjYzNTU4NTg1YTkzYjMyZWMyYzQxMjRmYzM5NmQyNTYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "7ec650f7cee4d232b2f48833d2095448ca2f39c3", "parent_module": "gm4_relocators" }, "gm4_scuba_gear:scuba_helmet": { "uuid": [ -1411342862, -1228846809, -1234065086, 1387403600 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWY2YWVlYzM2ZjQ2MmRlYjUzOTc0NWFhMzY4MThiNmQ0NGIwYzk1OGViNTY4NTJlYTAyZTM0YzMzZmRiZGZmMCd9fX0=", "hash": "4a257159fd9d30ceff7484d393efe9ed2e399abf", "parent_module": "gm4_scuba_gear" }, "gm4_smelteries:smeltery": { "uuid": [ 1784636653, -1150006069, -1125092353, -1658708865 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDMwMDcwMywKICAicHJvZmlsZUlkIiA6ICI3NzI3ZDM1NjY5Zjk0MTUxODAyM2Q2MmM2ODE3NTkxOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJsaWJyYXJ5ZnJlYWsiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWM3MjJlYmQxNzdlNDI3MDUzMmMyNGMyNTFhNGY1NzY4OGNiZDg3YTJmNTlmNGE2NjQ5ZGMxZmFjMGI1YmRlOCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "ca86945a8f7b2a0321cf5a13c4aa3ac4eca84685", "parent_module": "gm4_smelteries" }, "gm4_teleportation_anchors:teleportation_anchor": { "uuid": [ 772836475, 993526495, -815540237, -2046417388 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDQ3MTM3OTY2MSwKICAicHJvZmlsZUlkIiA6ICI5ZDQyNWFiOGFmZjg0MGU1OWM3NzUzZjc5Mjg5YjMyZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUb21wa2luNDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTFiZTRkYzdkMTUyOWViYzFlYmZjMWU5MGY5NDM3MDg0NzE2NTAxNzE2ZDA1ODNjOWZjMWNhNmI3OGY5MDhmYyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "dbf6c4d20f0c8c8ec499c7dd8585d8abd8020cee", "parent_module": "gm4_teleportation_anchors" }, "gm4_teleportation_anchors:teleportation_jammer": { "uuid": [ 878310477, 672930541, -264551059, -1299384752 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0NDQ3MTUyNDc4NSwKICAicHJvZmlsZUlkIiA6ICIzZmM3ZmRmOTM5NjM0YzQxOTExOTliYTNmN2NjM2ZlZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJZZWxlaGEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzI4MDdlOGM2YjcwMzI2ZjU2Y2I4ZDU1NTQzNWU2MjYwMmM5YWJhYzc4NWM0ZmQ4ZjJjY2IwOGMwMDNmY2ZlZCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "1019c31eb601ab9cbc21482eaa72759805b57917", "parent_module": "gm4_teleportation_anchors" }, "gm4_tinkering_compressors:tinkering_compressor": { "uuid": [ 1102824805, -1759752670, -1411440773, 621305304 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1NDM0MjA3MiwKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJJb3lhbCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xZDYwOWQzYTNiNjRiNjlmZTE0MDhjZmE0NjY3YjU1ZTU1YWE3NTI3OWQ2ZjAyOTU4MjEzOTYyYTlkZDBkMTQ4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", "hash": "eaafd00738b3b1ee0d14552ae99e739fa34c0af0", "parent_module": "gm4_tinkering_compressors" }, "gm4_tnt_landmines:landmine": { "uuid": [ -1172284621, -1030471482, -1585707380, -40076772 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQxMDExMjEsInByb2ZpbGVJZCI6IjU3MGIwNWJhMjZmMzRhOGViZmRiODBlY2JjZDdlNjIwIiwicHJvZmlsZU5hbWUiOiJMb3JkU29ubnkiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2RkZWM2M2RlNWY4MmYyM2ExNTdmNTVkYTcyMmFiOTI3NDgzZTdkODk4YmU5MDg3MzQwOTE5ODZlNjY1MWQ4YTgifX19", "hash": "fec9ecbe79a210db8262dd9ccc8a21172509e229", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/crafting_table": { "uuid": [ -893485270, -1979301661, -1601571774, -1580648190 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQyODI1NTUsInByb2ZpbGVJZCI6Ijc1MTQ0NDgxOTFlNjQ1NDY4Yzk3MzlhNmUzOTU3YmViIiwicHJvZmlsZU5hbWUiOiJUaGFua3NNb2phbmciLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzY2ODBmZmEyMTE5MzAwZGU2NWQzNjE4ODVkNjE0YjNlYTM3Y2QwODhiODc5OTAzMjc0MzNkNGMxMWU1ZjNjNSJ9fX0=", "hash": "66e39f516b02b31b3f2a876e3ff9bb433d04b8a6", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/dirt": { "uuid": [ -634349232, -591641614, -2012334048, -805394230 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQ0MjA4NDgsInByb2ZpbGVJZCI6IjkxZjA0ZmU5MGYzNjQzYjU4ZjIwZTMzNzVmODZkMzllIiwicHJvZmlsZU5hbWUiOiJTdG9ybVN0b3JteSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGI1Mzc5ZjE2NWE1Y2M3YmI4YzM4MmZlOTJlMjRlODYwN2NiODU1Y2FjNmU4M2Q4NjJjNjBlZmNlZTA5MTE3NSJ9fX0=", "hash": "a7b113596757108380739cf10902fdf96f1360b0", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/grass": { "uuid": [ 940595468, 1686389043, -1269390340, 931805603 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQwMDkwMDUsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZiMzBmZTgxYWZlNTI2NjkxZGM1MDlhYzEwN2EzYjNjYTk1NTdjNDExZmYwZGMyZmNiNWE4YTlkNzc1ZTk0ODMifX19", "hash": "685c824fe2a2654290b1a27cc04be1703b8e439e", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/invisible": { "uuid": [ 1874250570, -1321581040, -1389990572, -1166592501 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQzODQ0NTUsInByb2ZpbGVJZCI6IjU3MGIwNWJhMjZmMzRhOGViZmRiODBlY2JjZDdlNjIwIiwicHJvZmlsZU5hbWUiOiJMb3JkU29ubnkiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVlY2NhZmZlN2UwMWJjNjFiNjdmMDZkNGRmNjU2ZjQxZjdjMGJkODE3NzllNjFkMmEzYjk2YjE0MDVlYWQ1ODYifX19", "hash": "b5048c04f4385966eac9158f6ae5da85707b5f42", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/netherrack": { "uuid": [ -1280943243, -877575330, -1094757423, 425228596 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQzNDQyNzYsInByb2ZpbGVJZCI6IjVkMjRiYTBiMjg4YzQyOTM4YmExMGVjOTkwNjRkMjU5IiwicHJvZmlsZU5hbWUiOiIxbnYzbnQxdjN0NGwzbnQiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIwYmVlZWE4OTQ1MzAxOGMzNTVmZGZjZTg5YTM1ZTEyOGUwOWQyMzRlNWY5MGU0YzE4ZWE3MDI5NDYxOTFmNjIifX19", "hash": "ae94a831f4a04529a02fe14d67d5438ab54be56a", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/stone_bricks": { "uuid": [ 737008073, -1254863835, -1725289382, -810892737 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQyMjMxMzEsInByb2ZpbGVJZCI6ImIwZDczMmZlMDBmNzQwN2U5ZTdmNzQ2MzAxY2Q5OGNhIiwicHJvZmlsZU5hbWUiOiJPUHBscyIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDJhOGE5NDk5MjE5NTk1NzEyYjI1ODdlZmViMzViMWY2NTU2ZGExMmIzZWU4ODI5NGUwMzk0MDM0YmZjMjhlOCJ9fX0=", "hash": "ac05faafa2bdeeb490c9cbbe866254a3a92617fb", "parent_module": "gm4_tnt_landmines" }, "gm4_tnt_landmines:disguised/stone": { "uuid": [ -334658666, 974668440, -2077434217, -1973492282 ], "value": "eyJ0aW1lc3RhbXAiOjE1NTQ0NzQxODg2MTMsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzNjNjk4ZTE5MDllMWI4MzMxYmVhOGQ1YzU3N2NkMGM2M2I4YWVjMDFmYjg4ZjY0OWUwMGYwZmU5NjY1NDdjNWIifX19", "hash": "f7f4c047b8fe2b1babea1a6d8d9e20f2fe600ae3", "parent_module": "gm4_tnt_landmines" }, "gm4_zauber_cauldrons:crystal/instant_damage": { "uuid": [ 470245391, 1887978766, -1504051068, 1918240691 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzc5MGEwZDY5MTFiYzg4OTI1Nzc1ZWMyYjNmNWFhZDVhZGVlNDRlMTIxM2YzNWQ0OTA5MzE5OTQ1MjQwZjZmNyd9fX0=", "hash": "85058d7509650d94fc1787a09da2aea5a259f732", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/instant_health": { "uuid": [ -306488150, 400956517, 403523013, -700259582 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyNzU4Nzc2NjExMSwKICAicHJvZmlsZUlkIiA6ICI2NGExOGZiZmQ0YWY0Yzg0YjliN2FjZmNlNDRmMTAzZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJieVJPTkFMX1lUIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIxY2Y1YmM2OTJjZmQwZjI3YzkzNTUyOWJjNjE1ZmRjYjc0ZmZkZWJlYWFlY2JkOTU3OGFhOGUwMzFjNDRjYmYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "adf0e109b8b866d452db2cff2460234033d87805", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/jump_boost": { "uuid": [ 1384053766, -356430469, -1755842415, 436879590 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODRlYzgzNmNjZTA2ZTFlZDgxYmQ3MDBmNzc1NDhmNWZlMDkyNDYxZmY5YTJlNjBhNzUyNjQ1YjFkMDVhMjIxOCd9fX0=", "hash": "cfb3d8417b03f6d8ca360c22e64c66fb5eff90a8", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/poison": { "uuid": [ -1452394982, -1051244258, -1129278374, 2134833677 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E0YjY4ZGFiY2JjNDQ4YjBmY2ExNTdhYWU4YTg3YjcwMDlhNmExZmE0Zjg5ZjhkMDVkOTI4MDNkZmY0NTRmMCd9fX0=", "hash": "f63d55839798a67a0e81a64833dae0ee3ad2baba", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/regeneration": { "uuid": [ -503854593, 212580059, -440694433, -647960158 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTYyNzU4Nzg1ODA5NywKICAicHJvZmlsZUlkIiA6ICJmNDY0NTcxNDNkMTU0ZmEwOTkxNjBlNGJmNzI3ZGNiOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWxhcGFnbzA1IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2FmNzM2MDQwYmRlNDk2OTRhZjc4OGI4YmEzY2U1ODk0MWZlYTY4MzBkOTIzYzczMmY3ZWJjNDA5NDlkMDIzMTQiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", "hash": "6375366e84e2ebb0ee57ec82ff73d7a5c40c9f06", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/speed": { "uuid": [ -565293039, 1449936483, -1314907026, -480547454 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjBiNmViMTAyZDRmYjM2YTJiMDMwNTVmOGIwYWZkMTg4MWMxZjBiOGNiYzRiODk3YmYxMTA1ZTdhNzFiNDc1Zid9fX0=", "hash": "1a78314b2c4cd93f28861c03f5e20fea903ed354", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_cauldrons:crystal/strength": { "uuid": [ 944420826, 983911599, -1709524351, 1416885906 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTY5M2YwYjc1NGUyNzcwMGNiYWM2MGFjOTMwMGI2YzY2M2NmZDVlMjc1YjkwZjkyYmZmNjczNjY3YzViOWY1Nid9fX0=", "hash": "f0eb5b0c9c1ed40a7c48dd9af588e196b3661429", "parent_module": "gm4_zauber_cauldrons" }, "gm4_zauber_liquids:liquids/wormhole": { "uuid": [ -1903127985, 893928782, -1710128554, 467590157 ], "value": "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODQ5M2Q5OTRlODBmOTc0NWNiZWFiYWMwN2VkYmE2MTk5YTgyNGM3YTJhYTJjNDI1MjhkMDNkMzAzYzVhN2M5YSJ9fX0=", "hash": "034d4ea119fcfe3d2f981c7f199c0a69774a5029", "parent_module": "gm4_zauber_liquids" }, "gm4_custom_crafters:custom_crafter": { "uuid": [ -141969460, 1701595331, -2105287834, 13831947 ], "value": "ewogICJ0aW1lc3RhbXAiIDogMTY0Mjg1Mzk1Mjk4NiwKICAicHJvZmlsZUlkIiA6ICJhYjlkYmMzZjk4NGE0ZWI4YTVmY2RlYWMzNzEzZWFkMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJDeWJvcm51dDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTE1ZDUwNmI2MzlhMzI1OWVlNDhkMTcyMjYzZWI2NzljY2NhNDQzNjVmY2VlMTllZDllYjI3NzU1YjAxN2IyYyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "hash": "18bab6e06c67bcfeba73698c923d43d78cd82ee7", "parent_module": "gm4_custom_crafters" }, "gm4_metallurgy:band/thorium_brass_RETIRED": { "uuid": [ -1284920301, -2083305742, -2124503944, -860338126 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzA1YTY0N2YzYmY2YzMzZGQwNWI5M2JkZTJiNzRlYzViOWE5YTMxODQxM2FlZWRkZGE3ZDFhYjk3NDVkZmE5OCd9fX0=", "hash": "b1173eacf6e07f062e2301d25669acc1a3a0ac20", "parent_module": "gm4_metallurgy" }, "gm4_lightning_in_a_bottle:texture_connector_exposed": { "uuid": [ 1105086427, -2014818885, -2050456398, 1819890536 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjU0ZTFmZmZlNzNiMjljMGU1NzVhOTg2OTI3OTJhZTIxYzQwNDUzZmMxNDRiYjYxZjE4ZDBmZjhmMjY3N2IxMSd9fX0=", "hash": "3ba0bc3626c0acf3c8c19ecd9801db477e5f4ef4", "parent_module": "gm4_lightning_in_a_bottle" }, "gm4_lightning_in_a_bottle:texture_connector_weathered": { "uuid": [ -53579126, -1276100194, -1254675310, 1810892024 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTExYjlhYjJlZmY4ZDMzYzU3ZWUyMjVjYWQ5ZmNkMTFmN2JmN2I4MzI2YWJlMTVhOWQ1MzUwNjNmOTZkOGZjMCd9fX0=", "hash": "4ae3138c18bcb10d5074aa45c403f7a2192a79b8", "parent_module": "gm4_lightning_in_a_bottle" }, "gm4_lightning_in_a_bottle:texture_connector_oxidized": { "uuid": [ -1160792602, 948128354, -1355641425, 1430620480 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDY1ZGQ5Njg5MzIyNDZjZjgwODA3Y2E2NmY4M2Y0MThjNjc5YTIzMjI5MDdiYmNkMWYxN2I4ZTQ3NWUwYzE4J319fQ==", "hash": "0ec19a60309722db4e5d57cba06c29bc62d5051f", "parent_module": "gm4_lightning_in_a_bottle" }, "gm4_potion_liquids:liquids/infested": { "uuid": [ -1996504295, 1552826831, -2054795441, -1569665209 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM1ZGFiNjQzOGFmZjA1M2VmZDI0NjMzOWZkMjAxNjJmMzViZmJmMjg4MGFiNGVkNmI4NmFmMDllNTQwOTZiMyd9fX0=", "hash": "50aa38faf483a78bd9a33a437d30713901459ec9", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/oozing": { "uuid": [ -783904090, 1232292212, -1545737453, -1152375565 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjEyYTBkN2E5YmMzYzczZjQwNTZhYWY3N2FmMmFhNzBmNmRjMjk2MGY2NjRmMjdlZWNjMzVkM2Y2NzMyMDcyOCd9fX0=", "hash": "a8e2a88fb261b67b80278dade5546dc13a789f64", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/weaving": { "uuid": [ 842038238, 472862371, -1885580302, 123777373 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjNlZDM4MWU0MWVmOWJlOWE4OGY5ZGYzOTAzMmJhOGY3OTliYjBiYmM1ODU2ZTk5YzI0YTU3MGFjMjI1OWY1Yyd9fX0=", "hash": "fb4b712349e985159d1b5dbf20c2ed56f6a47262", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/wind_charged": { "uuid": [ -1085379822, 1256014354, -2139157479, -487046405 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODJiYTI0NDYzY2FjYTc5MjAzNGVkMGNhNzc4YTUwM2M1OWU1ZTg4YjU2ODBhMTIxM2UxNmIwZmFhZWE5YzMwOSd9fX0=", "hash": "8d5ed9cbae9e0fc0191d9c140e33adfdd2905ace", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/awkward": { "uuid": [ 594379978, -2079439988, -2142727791, 2046532997 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==", "hash": "4a3fbe092f343e239311835b44cadd819686e558", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/mundane": { "uuid": [ 594379978, -2079439988, -2142727791, 2046532997 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==", "hash": "4a3fbe092f343e239311835b44cadd819686e558", "parent_module": "gm4_potion_liquids" }, "gm4_potion_liquids:liquids/thick": { "uuid": [ 594379978, -2079439988, -2142727791, 2046532997 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjc2ZTI2ZmRmZGU4YmY5ZjY0MWM0YjdlZDViNmY3NjNhZmFiZDM5OGIzZjc5MjRhOTViYzA4YjM4N2FhM2MxJ319fQ==", "hash": "4a3fbe092f343e239311835b44cadd819686e558", "parent_module": "gm4_potion_liquids" }, "gm4_standard_liquids:liquids/ominous_bottle": { "uuid": [ -421500789, -352567252, -1207743241, -1662338326 ], "value": "eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGNkOGI2YzYzMjE2ZTViYjYxYzg4ZGQwNTUwNjg3YmMxNDZmODY3NjdkMTA5YzVmMjk0MjY2NmY1MTI4MDQxMyd9fX0=", "hash": "73367ae720fb1df246057aaccb4ff07e298e1869", "parent_module": "gm4_liquid_tanks" } }, "nonnative_references": { "gm4_tinkering_compressors": [ "gm4_metallurgy:band/curies_bismium" ], "gm4_vecto_shamir": [ "gm4_metallurgy:band/bismuth" ], "gm4_weighted_armour": [ "gm4_metallurgy:band/aluminium" ], "gm4_zauber_liquids": [ "gm4_potion_liquids:liquids/harming", "gm4_potion_liquids:liquids/healing", "gm4_potion_liquids:liquids/leaping", "gm4_potion_liquids:liquids/poison", "gm4_potion_liquids:liquids/regeneration", "gm4_potion_liquids:liquids/strength", "gm4_potion_liquids:liquids/swiftness" ], "gm4_audere_shamir": [ "gm4_metallurgy:band/barium" ], "gm4_auto_crafting": [ "gm4_custom_crafters:custom_crafter" ] } } ================================================ FILE: gm4/utils.py ================================================ import subprocess import warnings from dataclasses import asdict, dataclass from functools import total_ordering from typing import Any, Generic, List, TypeVar from beet import ListOption from pydantic import RootModel, field_validator T = TypeVar('T') import csv from pathlib import Path def run(cmd: list[str]|str) -> str: """Run a shell command and return the stdout.""" return subprocess.run(cmd, capture_output=True, encoding="utf8", shell=isinstance(cmd, str)).stdout.strip() def X_int(val: str) -> int | None: """Int casting that accepts character 'X' and returns None""" return None if val.lower() == 'x' else int(val) def add_namespace(val: str, namespace: str) -> str: """Adds a namsepace prefix to a string, if one does not already exist""" if ":" not in val: return f"{namespace}:{val}" return val @dataclass @total_ordering class Version(): """Class with methods useful for semver versions in the gm4 build pipeline""" major: int|None minor: int|None patch: int|None def __init__(self, input: str): self.major, self.minor, self.patch = map(X_int, input.split(".")) def __str__(self): if type(None) in map(type, [self.major, self.minor, self.patch]): warnings.warn(f"Version number was printed to string when one or more fields are not set") return f"{self.major}.{self.minor}.{self.patch}" def int_rep(self) -> int: """returns integer representation of version, for use in datapack scoreboards""" if type(None) in map(type, [self.major, self.minor, self.patch]): raise TypeError(f"Version number cannot be converted to integer when one or more fields are not set") return 100_000*self.major + 1_000*self.minor + self.patch # type: ignore def __eq__(self, other: object) -> bool: if other is None: return False elif isinstance(other, Version): return self.major==other.major and self.minor==other.minor and self.patch==other.patch raise TypeError def __lt__(self, other: object) -> bool: if isinstance(other, Version): if self.major is None or self.minor is None or self.patch is None \ or other.major is None or other.minor is None or other.patch is None: raise TypeError(f"Version numbers cannot be compared when one or more fields are not set") if self.major < other.major: return True elif self.major == other.major: if self.minor < other.minor: return True elif self.minor == other.minor: if self.patch < other.patch: return True return False raise TypeError def replace(self, **changes: Any): params = asdict(self) | changes params = {k:(v if v is not None else 'X') for k,v in params.items()} return Version(f"{params['major']}.{params['minor']}.{params['patch']}") def nested_get(d: dict[str, Any], key: str) -> list[Any]: """Recursively traverses a string-keyed dict (like minecraft json files) for the specified key, returning all that exist returns empty list and throws no errors if key does not exist""" ret_list: list[Any] = [] for k, v in d.items(): if k == key: ret_list.append(d[k]) elif isinstance(v, dict): ret_list.extend(nested_get(d[k], key)) elif isinstance(v, list): for elem in d[k]: if isinstance(elem, dict): ret_list.extend(nested_get(elem, key)) #type: ignore ; NBT is hard to type due to its nested nature return ret_list class NoneAttribute(): """Object which returns None for any arbitrary attribute access. Used for default members""" def __getattribute__(self, __name: str) -> None: return None class MapOption(RootModel[list[T]|dict[str,T]], Generic[T]): """A union-like type of dict and list, supporting common methods for both - Written for use in resource_pack plugin's texture lists""" root: list[T]|dict[str,T] = [] def entries(self) -> list[T]: if isinstance(self.root, list): return self.root return list(self.root.values()) def __getitem__(self, key: str|int) -> T: if isinstance(key, int): return self.entries()[key] if isinstance(self.root, list): raise KeyError(f"MapOption has no mapping data keys. Could not retrieve {key}") return self.root[key] def items(self): if isinstance(self.root, dict): return self.root.items() raise KeyError("MapOption has no mapping data keys. Can not retrieve items()") @field_validator("root", mode="before") @classmethod def validate_root(cls, value: list[T]|dict[str,T]|T) -> list[T]|dict[str,T]: if value is None: value = [] elif isinstance(value, ListOption): value = value.entries() if not isinstance(value, (list, tuple, dict)): # single element value = [value] return value # type: ignore # CSV READING UTILS class CSVCell(str): """ String wrapper for contents of a CSVCell, supports interpreting the content as different formats. """ DEC = 'dec' # for numbers formatted 16777215 HEX = 'hex' # for numbers formatted #AB0EFF FLOAT = 'float' # for numbers formatted [0.5, 0.2, 0.9] def as_integer(self) -> int: """ Interprets the string contained in this CSVCell as an integer. Supported formats are: - base 10 integers (no prefix) - prefixed hex color codes (# prefix and 6 digits) - prefixed hex, octal, or binary (0x, 0o, or 0b and some amount of digits) - bool (True or False, case insensitive) Returns a integer representation of the value. """ if self.startswith('#') and len(self) == 7: # alternative way of marking base 16 (hex colors) return CSVCell('0x' + self.lstrip('#')).as_integer() if self.startswith('0x'): # check if the string is in base 2 return int(self, 16) if self.startswith('0o'): # check if the string is in base 8 return int(self, 8) if self.startswith('0b'): # check if the string is in base 16 return int(self, 2) if self.casefold() == 'true': return 1 if self.casefold() == 'false': return 0 return int(self) # default case, interpret as base 10 def as_bool(self) -> bool: """ Interprets the string contained in this CSVCell as a boolean. Returns `True` if the cell's content is: - `TRUE` in any capitalization - A positive number greater or equal to `1` Returns `False` if the cell's content is: - `FALSE` in any capitalization - `0` or any number that truncates to zero Raises a `ValueError` in all other cases. """ match self.casefold(): case 'true': # TRUE / FALSE keywords return True case 'false': return False case other: try: # test if contents can be parsed as a number other = int(other) if 0 <= other: # only positive numbers can be interpreted as a boolean return 1 <= other except ValueError: pass # not a number raise ValueError(f"Couldn't interpret CSVCell contents ('{self}') as a boolean.") def to_color_code(self, encoding: str) -> 'CSVCell': """ Interprets the string contained in this CSVCell as a color code using the given encoding and returns a new CSVCell with that interpretation as its content. E.g. if the CSVCell this function was called on contains '#4AA0C7' and 'CSVCell.DEC' is given as an encoding, a new CSVCell with content '4890823' is returned. """ if encoding == CSVCell.HEX: return CSVCell('#' + hex(self.as_integer()).lstrip('0x')) if encoding == CSVCell.DEC: return CSVCell(self.as_integer()) if encoding == CSVCell.FLOAT: dec = self.as_integer() return CSVCell([(dec >> 16) / 255, ((dec >> 8) & 0xFF) / 255, (dec & 0xFF) / 255]) raise ValueError( f"Invalid encoding '{encoding}'. Must be '{CSVCell.DEC}', '{CSVCell.HEX}', or '{CSVCell.FLOAT}'.") class CSVRow(): """ Read-only dict wrapper which represents a row of data from a .csv file. """ def __init__(self, column_names: List[str] | None = None, data: List[CSVCell] | None = None) -> None: """ Initialize a new CSVRow object using the supplied column names and data. CSVRow objects are read-only by design. If no data and no column names are supplied the resulting CSVRow object will evaluate to false in boolean expressions. Access data within this CSVRow via the `get(key, default)` method or using `[]`. """ if not column_names: column_names = [] if not data: data = [] if len(column_names) != len(data): raise ValueError( f"Could not build CSVRow from supplied column names and data; Number of supplied column names ({len(column_names)}) does not match number of supplied data entries ({len(data)}).") self._data = {column_names[column_index] : value for column_index, value in enumerate(data)} def __bool__(self): """ Allow for the use of CSVRow instances in if statements; If the CSVRow has no keys it is equivalent to `False`. """ return len(self._data.keys()) != 0 def __getitem__(self, key: str): try: return self._data[key] except KeyError as ke: raise ValueError( f"Failed to select column named '{ke.args[0]}' from CSVRow with columns {[key for key in self._data]}.") def __repr__(self) -> str: return str(self._data) def get(self, key: str, default: str | Any) -> CSVCell: """ Returns the value corresponding to the key if it exists and is not the empty string. Else returns the provided default. The provided default is cast to a string internally. """ value = self._data.get(key, CSVCell(default)) if value: return value else: return CSVCell(default) class CSV(): """ List-of-Rows representation of a .csv file which can be iteraded over using for ... in. Optimized for row-first access, i.e. select a row, then a column. Also provides a `find_row` function for column-first, i.e. select a column, then a row, access. However, the latter is is more expensive. All access methods return CSVRow objects which are dynamically created upon calling an access method. """ @staticmethod def from_file(path: Path) -> 'CSV': """ Reads in a csv file and returns a list of rows. Each row consists of a dictionary which contains labeled values. """ with open(path, mode='r') as file: csv_file = csv.reader(file) header = next(csv_file) return CSV(column_names=header, rows=[[CSVCell(cell) for cell in row] for row in csv_file]) def __init__(self, column_names: List[str], rows: List[List[CSVCell]]) -> None: """ Initialize a new CSV from a list of column names (headers) and a list of rows. The latter contain actual data, whilst the former only holds names of columns. """ self._column_names = column_names self._rows = rows def __iter__(self): "Iterate over `CSVRow` objects contained within this `CSV`. Traverses in order, starting with the topmost row." self.__current = 0 self.__last = len(self._rows) return self def __next__(self) -> CSVRow: current = self.__current self.__current += 1 if current < self.__last: return CSVRow(self._column_names, self._rows[current]) raise StopIteration() def __getitem__(self, row_index: int): return CSVRow(self._column_names, self._rows[row_index]) def __repr__(self): return str([CSVRow(self._column_names, data) for data in self._rows]) def find_row(self, value: str, by_column: str | int = 0) -> CSVRow: """ Finds and returns the first row in this CSV which has `value` in column `by_column`. `by_column` can either be a str, in which case it is treated as a column name and the header line is searched for a matching string, or an int n, in which case the nth column is selected. `by_column` defaults to `0`. Returns an empty `CSVRow` if no match was found. """ if isinstance(by_column, str): by_column = self._column_names.index(by_column) for row in self._rows: if row[by_column] == value: return CSVRow(self._column_names, row) return CSVRow() ================================================ FILE: gm4_animi_shamir/README.md ================================================ # Animi Shamir You can now cheat death! Or... at least your items can. ### Features - Any items with the Animi Shamir on them will survive after you die and then respawn - like the modded "Soulbound" enchantment - Builds on Gamemode 4's comprehensive and fun take on enchantments with the [Metallurgy]($dynamicLink:gm4_metallurgy) system. - Respects "Curse of Vanishing", so items will not return if on a tool with the Curse and you die. ================================================ FILE: gm4_animi_shamir/beet.yaml ================================================ id: gm4_animi_shamir name: Animi Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module - gm4.plugins.include.lib_player_death meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 lib_player_death: 1.4.0 schedule_loops: [main] model_data: - reference: shamir/animi item: [armor, tools, weapons, elytra, bow, crossbow, fishing_rod, warped_fungus_on_a_stick, carrot_on_a_stick, shield, flint_and_steel, shears, clock, compass, recovery_compass, spyglass] template: name: shamir metal: curies_bismium textures_path: gm4_metallurgy:item/shamir/curies_bismium website: description: Adds the Animi Shamir to Metallurgy. Items with Animi will respawn with you when you die! recommended: [] notes: - Modifies items right after a player died, and might fight over those items with other Datapacks that do the same. modrinth: project_id: bPnAELDm wiki: https://wiki.gm4.co/wiki/Metallurgy/Animi_Shamir credits: Creator: - Bloo Icon Design: - Hozz ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/advancement/join.json ================================================ { "criteria": { "join_world": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_animi_leave": { "min": 1 } } } ] } } }, "rewards": { "function": "gm4_animi_shamir:player/rejoin" } } ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'animi'}}] if items entity @s contents #gm4_animi_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/init.mcfunction ================================================ scoreboard objectives add gm4_animi_deaths deathCount scoreboard objectives add gm4_animi_leave minecraft.custom:minecraft.leave_game execute unless score animi_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Animi Shamir"} execute unless score animi_shamir gm4_earliest_version < animi_shamir gm4_modules run scoreboard players operation animi_shamir gm4_earliest_version = animi_shamir gm4_modules scoreboard players set animi_shamir gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/initialize_item.mcfunction ================================================ # sets the item's data from cache # @s = @e[type=item,tag=gm4_respawned_animi_item,limit=1] # at owner player location # run from gm4_animi_shamir:item_caching/unpack_entry # set owner data modify entity @s Owner set from storage gm4_animi_shamir:cache prepared_entry.owner # copy NBT data modify entity @s Item set from storage gm4_animi_shamir:cache prepared_entry.inventory[0] # remove tag tag @s remove gm4_respawned_animi_item ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/add_entry.mcfunction ================================================ # adds a prepared entry to the cache # @s = a player who has died whilst carrying animi items # run from gm4_animi_shamir:player/upon_death # read player data data modify storage gm4_animi_shamir:cache prepared_entry.owner set from entity @s UUID # read inventory data modify storage gm4_animi_shamir:cache inventories append from storage gm4_animi_shamir:cache prepared_entry # remember that this player died with animi items tag @s add gm4_animi_user # sound playsound minecraft:particle.soul_escape player @a[distance=..8] ~ ~ ~ 1 0.7 # wait for respawn function gm4_animi_shamir:player/wait_for_respawn ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/prepare_entry.mcfunction ================================================ # copies item data of items with animi shamir into cache and deletes them from the world after they were dropped by a dying player # @s = item with animi shamir, just dropped by a dying player # at location of dying player # run from gm4_animi_shamir:player/upon_death # add this item nbt to storage data modify storage gm4_animi_shamir:cache prepared_entry.inventory append from entity @s Item # visuals particle minecraft:soul ~ ~0.9 ~ 0.2 0.6 0.2 0.04 1 # remove this item from the world kill @s ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/search_entry.mcfunction ================================================ # searches for an entry with owner = prepared_entry.owner. Stores the last match into prepared_entry.inventory. Deletes all duplicates. # run from gm4_animi_shamir:player/respawn_inventory # load target UUID into temp field data modify storage gm4_animi_shamir:cache temp_entry.owner set from storage gm4_animi_shamir:cache prepared_entry.owner # compare against UUID from list execute store result score $success gm4_animi_deaths run data modify storage gm4_animi_shamir:cache temp_entry.owner set from storage gm4_animi_shamir:cache inventories[0].owner # store entry into named field if a match is detected execute if score $success gm4_animi_deaths matches 0 run data modify storage gm4_animi_shamir:cache prepared_entry.inventory set from storage gm4_animi_shamir:cache inventories[0].inventory # cycle entries and delete entry if UUID matched execute if score $success gm4_animi_deaths matches 1.. run data modify storage gm4_animi_shamir:cache inventories append from storage gm4_animi_shamir:cache inventories[0] data remove storage gm4_animi_shamir:cache inventories[0] # loop until all entries are checked scoreboard players remove $loop gm4_animi_deaths 1 execute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/search_entry ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/item_caching/unpack_entry.mcfunction ================================================ # unpacks prepared_entry into items by summoning one item for each elements in prepared_entry.inventory # @s = player who has died recently # at @s # run from gm4_animi_shamir:player/respawn_inventory # summon item and populate item NBT summon item ~ ~ ~ {Tags:["gm4_respawned_animi_item"],PickupDelay:0s,Item:{count:1,id:"minecraft:stone"}} execute as @e[type=item,tag=gm4_respawned_animi_item,limit=1] run function gm4_animi_shamir:initialize_item # visuals particle minecraft:soul ~ ~0.9 ~ 0.2 0.6 0.2 0.04 1 # shift pointer forwards and loop data remove storage gm4_animi_shamir:cache prepared_entry.inventory[0] scoreboard players remove $loop gm4_animi_deaths 1 execute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/unpack_entry ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/player/rejoin.mcfunction ================================================ # Revokes advancement and restarts wait_for_respawn clock # @s = player that has re-joined with a gm4_animi_deaths score # at @s # run from advancement gm4_animi_shamir:join # reset advancement and score advancement revoke @s only gm4_animi_shamir:join scoreboard players reset @s gm4_animi_leave # if the player has a gm4_animi_deaths score, restart waiting_for_respawn clock execute if score @s gm4_animi_deaths matches 1.. run schedule function gm4_animi_shamir:player/wait_for_respawn 1t ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/player/respawn_inventory.mcfunction ================================================ # respawns an animi item # @s = player who has died recently # at @s # run from gm4_animi_shamir:player/upon_respawn # look for entries in cache data modify storage gm4_animi_shamir:cache prepared_entry.owner set from entity @s UUID execute store result score $loop gm4_animi_deaths run data get storage gm4_animi_shamir:cache inventories function gm4_animi_shamir:item_caching/search_entry # summon item(s) execute store result score $loop gm4_animi_deaths run data get storage gm4_animi_shamir:cache prepared_entry.inventory execute if score $loop gm4_animi_deaths matches 1.. run function gm4_animi_shamir:item_caching/unpack_entry # sound playsound minecraft:particle.soul_escape player @a[distance=..8] ~ ~ ~ 1 0.7 # remove tag tag @s remove gm4_animi_user ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/player/upon_death.mcfunction ================================================ # @s = player who has died # at @s # run from #gm4_player_death:soul_bound # compile item list data remove storage gm4_animi_shamir:cache prepared_entry execute positioned ~ ~0.66 ~ as @e[type=item,distance=..0.67] if items entity @s contents *[custom_data~{gm4_metallurgy:{active_shamir:'animi'}}] if entity @s[nbt={Age:0s}] run function gm4_animi_shamir:item_caching/prepare_entry # add entry to chache if any animi items were found execute if data storage gm4_animi_shamir:cache prepared_entry.inventory run function gm4_animi_shamir:item_caching/add_entry ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/player/upon_respawn.mcfunction ================================================ # runs once a player has respawned # @s a player that died and has now respawned # at @s # run from gm4_animi_shamir:player/wait_for_respawn # reset score and advancement advancement revoke @s only gm4_animi_shamir:death scoreboard players reset @s gm4_animi_deaths # return animi item(s) if this player had at least one animi item execute if entity @s[tag=gm4_animi_user,gamemode=!spectator] run function gm4_animi_shamir:player/respawn_inventory ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/player/wait_for_respawn.mcfunction ================================================ # Active if a player died with an animi item. Self-schedules until that player either logs out or respawns. # @s = none # at world spawn # self schduled or run from gm4_animi_shamir:item_caching/add_entry or gm4_animi_shamir:player/rejoin # look for players that just respawned (@e only selects living entities) and has loaded the chunks around themselves execute as @e[type=player,scores={gm4_animi_deaths=1..}] at @s if loaded ~ ~ ~ run function gm4_animi_shamir:player/upon_respawn # reschedule if there is a player (dead or alive) with a gm4_animi_deaths score (@a also selects dead players) execute if entity @p[scores={gm4_animi_deaths=1..}] run schedule function gm4_animi_shamir:player/wait_for_respawn 1t ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/template via #gm4_metallurgy:summon_band/template loot spawn ~ ~ ~ loot gm4_animi_shamir:band ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/guidebook/animi_shamir.json ================================================ { "id": "animi_shamir", "name": "Animi Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_animi_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'animi'}}" } } ] } }, "obtain_animi_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'animi'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.animi_shamir.description", "fallback": "Animi allows items to return to their owner upon death." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_animi_shamir", "obtain_animi_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.animi_shamir.usage", "fallback": "The Animi Shamir is found on Curie's Bismium Bands. It can be placed onto tools, armour, weapons, and elytra.\n\nAnimi items do not drop when the owner dies, instead appearing in their inventory upon respawning." } ] ] } ] } ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:curies_bismium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_animi_shamir:shamir/animi"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'animi'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.animi", "fallback": "Animi Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:axes", "#minecraft:chest_armor", "#minecraft:compasses", "#minecraft:foot_armor", "#minecraft:head_armor", "#minecraft:hoes", "#minecraft:leg_armor", "#minecraft:pickaxes", "#minecraft:shovels", "#minecraft:swords", "minecraft:bow", "minecraft:carrot_on_a_stick", "minecraft:clock", "minecraft:crossbow", "minecraft:elytra", "minecraft:fishing_rod", "minecraft:flint_and_steel", "minecraft:mace", "minecraft:shears", "minecraft:shield", "minecraft:spyglass", "minecraft:trident", "minecraft:warped_fungus_on_a_stick" ] } ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/test/keep_items.mcfunction ================================================ # @template gm4:test_tube # @dummy ~1 ~1 ~1 # @optional give @s golden_leggings[custom_data={gm4_metallurgy:{active_shamir:"animi"}}] give @s wooden_sword kill @s assert items entity @e[type=item,distance=..3] contents wooden_sword assert not items entity @e[type=item,distance=..3] contents golden_leggings await delay 1s kill @e[type=zombie,distance=..3] kill @e[type=item,distance=..3] await delay 1s dummy @s respawn await items entity @p container.* golden_leggings[custom_data~{gm4_metallurgy:{active_shamir:"animi"}}] ================================================ FILE: gm4_animi_shamir/data/gm4_animi_shamir/test/smoosh.mcfunction ================================================ # @template gm4_metallurgy:test_smooshing loot spawn ~1.5 ~2.5 ~1.8 loot gm4_animi_shamir:band summon item ~1.5 ~2.5 ~1.8 {Item:{id:"minecraft:diamond_leggings"}} await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..4] contents diamond_leggings[custom_data~{gm4_metallurgy:{active_shamir:"animi"}}] assert items entity @e[type=item,distance=..4] contents obsidian ================================================ FILE: gm4_animi_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_animi_shamir:check_item_validity" ] } ================================================ FILE: gm4_animi_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json ================================================ { "values": [ "gm4_animi_shamir:summon_band" ] } ================================================ FILE: gm4_animi_shamir/data/gm4_player_death/tags/function/soul_bound.json ================================================ { "values": [ "gm4_animi_shamir:player/upon_death" ] } ================================================ FILE: gm4_animi_shamir/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_animi_shamir:cache] to struct { prepared_entry?: Entry, temp_entry?: Entry, inventories?: [Entry], } struct Entry { owner?: #[uuid] int[] @ 4, inventory?: [ItemStack], } ================================================ FILE: gm4_animi_shamir/translations.csv ================================================ key,en_us item.gm4.shamir.animi,Animi Shamir text.gm4.guidebook.module_desc.animi_shamir,Adds the Animi Shamir to Metallurgy. Items with Animi will respawn with you when you die! text.gm4.guidebook.animi_shamir.description,Animi allows items to return to their owner upon death. text.gm4.guidebook.animi_shamir.usage,"The Animi Shamir is found on Curie's Bismium Bands. It can be placed onto tools, armour, weapons, and elytra.\n\nAnimi items do not drop when the owner dies, instead appearing in their inventory upon respawning." ================================================ FILE: gm4_apple_trees/README.md ================================================ # Apple Trees Apples don't grow on oak trees, silly Mojang! This data pack adds actual apple trees. Find them in forests or buy a sapling from a Wandering Trader. Apple Tree in a Forest ### Features - Apple trees naturally generate in Forests - Pick fully grown apples, or wait for them to fall on their own - Apples regrow every three 3 days - Apple Saplings drop from chopped down trees, or can be bought from Wandering Traders - If you're lucky, you might even find an ultra-rare golden apple tree in the wild ================================================ FILE: gm4_apple_trees/assets/gm4_apple_trees/models/block/apple_unripe.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_apple_trees:block/apple_unripe" }, "display": { "thirdperson_righthand": { "translation" :[ 1 , -0.5, 0], "scale": [ 1.1, 1.1, 1.1] } } } ================================================ FILE: gm4_apple_trees/assets/gm4_golden_apple_trees/models/block/golden_apple_unripe.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_golden_apple_trees:block/golden_apple_unripe" }, "display": { "thirdperson_righthand": { "translation" :[ 1 , -0.5, 0], "scale": [ 1.1, 1.1, 1.1] } } } ================================================ FILE: gm4_apple_trees/assets/translations.csv ================================================ key,en_us,de_de,en_ws item.gm4.apple_tree_sapling,Apple Tree Sapling,,Ye Small Apple Tree text.gm4.guidebook.module_desc.apple_trees,Introduces fruit-bearing apple trees! Trade for apple saplings with wandering traders or find them growing in forests!,, text.gm4.guidebook.apple_trees.leaf_changes,Apples do not drop from oak or dark oak trees. Another source of apples must be discovered.,, text.gm4.guidebook.apple_trees.obtaining_apples,"Apple trees are found naturally occurring in forest biomes.\n\nWandering traders will also sell apple tree saplings.\n\nWhen planted, these saplings grow into apple trees.",, text.gm4.guidebook.apple_trees.golden_apple_trees,"Golden apple trees can also be found in forests.\n\nThese trees don't drop saplings, and cannot be replanted.\n\nThey also have a golden root which grows through stone and dirt.",, text.gm4.guidebook.apple_trees.new_apples,"New apples will grow every 3 day cycles. Once ripe, they can be picked or will fall from the tree after a while.\n\nBreaking an apple bearing leaf has a 75% chance to drop an apple tree sapling.",, ================================================ FILE: gm4_apple_trees/beet.yaml ================================================ id: gm4_apple_trees name: Apple Trees version: 2.6.X require: - bolt data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_trees meta: gm4: versioning: required: lib_trees: 1.5.0 schedule_loops: - main - slow_clock website: description: Introduces fruit-bearing apple trees! Trade for apple saplings with wandering traders or find them growing in forests! recommended: - gm4_resource_pack - gm4_orbis - gm4_podzol_rooting_soil notes: - Modifies the oak leaves loot table to no longer contain apples. May cause incompatibilities with Datapacks that also modify this loot table. modrinth: project_id: Afacz65w smithed: pack_id: gm4_apple_trees wiki: https://wiki.gm4.co/wiki/Apple_Trees credits: Creators: - Bloo - BPR - SpecialBuilder32 Icon Design: - BPR model_data: - item: apple reference: block/apple_unripe model: block/apple_unripe - item: oak_sapling reference: item/apple_tree_sapling template: generated - item: golden_apple reference: block/golden_apple_unripe model: gm4_golden_apple_trees:block/golden_apple_unripe ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/advancement/apple_hand_empty.json ================================================ { "criteria": { "apple": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_apple_trees" }, "score": "load.status" }, "range": { "min": 1 } } ], "item": { "count": 0 }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_apple\",\"gm4_ripe_apple\"]}" } } ] } } }, "rewards": { "function": "gm4_apple_trees:leaf/apple/hand_interact" } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/advancement/apple_hand_item.json ================================================ { "criteria": { "apple": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_apple_trees" }, "score": "load.status" }, "range": { "min": 1 } } ], "item": { "count": { "min": 1, "max": 64 } }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_apple\",\"gm4_ripe_apple\"]}" } } ] } } }, "rewards": { "function": "gm4_apple_trees:leaf/apple/interact" } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/init.mcfunction ================================================ execute unless score apple_trees gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Apple Trees"} execute unless score apple_trees gm4_earliest_version < apple_trees gm4_modules run scoreboard players operation apple_trees gm4_earliest_version = apple_trees gm4_modules scoreboard players set apple_trees gm4_modules 1 # scoreboards and constants scoreboard objectives add gm4_entity_version dummy scoreboard objectives add gm4_fruit_age dummy scoreboard objectives add gm4_fruit_stage dummy scoreboard objectives add gm4_apple_data dummy scoreboard objectives add gm4_ga_root dummy scoreboard objectives add gm4_ga_root_count dummy scoreboard players set #stage_1_start gm4_apple_data 20 scoreboard players set #stage_2_start gm4_apple_data 40 scoreboard players set #stage_0_start gm4_apple_data 60 scoreboard players set #golden_root_time gm4_ga_root 4500 scoreboard players set #3600 gm4_ga_root 3600 scoreboard players set #10 gm4_ga_root 10 scoreboard players set #4 gm4_ga_root 4 scoreboard players set #gapple_stage_1_start gm4_apple_data 80 scoreboard players set #gapple_stage_2_start gm4_apple_data 220 scoreboard players set #gapple_stage_0_start gm4_apple_data 240 schedule function gm4_apple_trees:main 10t schedule function gm4_apple_trees:slow_clock 12t #$moduleUpdateList ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/advance_stage.mcfunction ================================================ # advances the stage of the fruit # @s = apple_fruiting_leaf armor stand # located at @s align xyz # run from gm4_apple_trees:leaf/age # set the visual stage of the fruit depending the score execute if score @s gm4_fruit_age = #stage_1_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/1 execute if score @s gm4_fruit_age = #stage_2_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/2 execute if score @s gm4_fruit_age = #stage_0_start gm4_apple_data run function gm4_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/age.mcfunction ================================================ # decreases the age of a fruiting leaf. If it hits 0, the expansion will have to perform some stage change (e.g. grow fruit bigger or drop fruit) # @s = gm4_fruiting_leaf marker # located at world spawn # run from gm4_apple_trees:slow_clock # increases age scoreboard players add @s gm4_fruit_age 1 execute if score @s gm4_fruit_age >= @s gm4_fruit_stage at @s align xyz run function gm4_apple_trees:leaf/advance_stage ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/destroy.mcfunction ================================================ # removes a ripe apple leaf armor stand if it is not inside a leaf anymore # @s = gm4_ripe_apple armor stand that's holding an apple # located at @s align xyz # run from gm4_apple_trees:leaf/destroy # drop apple execute if predicate gm4_apple_trees:apple_holding positioned ~0.5 ~2.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_apple_trees:leaf/apple/drop # kill kill @s ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/drop.mcfunction ================================================ # spawns an apple # @s = gm4_apple_leaf switching to stage 0 # at loot spawn location (in head of armor stand or leaf block above the armor stand) # run from gm4_apple_trees:leaf/set_stage/0 # and from gm4_apple_trees:leaf/apple/destroy # spawn apple item playsound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6 item replace entity @s weapon.offhand with minecraft:air item replace entity @s weapon.mainhand with minecraft:air # visuals loot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/hand_interact.mcfunction ================================================ # update leaf stage # @s = player taking apple from tree with empty hand # located at @s # run from advancement apple_hand_empty advancement revoke @s only gm4_apple_trees:apple_hand_empty playsound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6 # update armour stand execute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=!gm4_apple_trees:apple_holding] at @s align xyz run function gm4_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/interact.mcfunction ================================================ # update leaf marker and update player's hand items # @s = player taking apple from tree while holding an item # located at @s # run from advancement apple_hand_item advancement revoke @s only gm4_apple_trees:apple_hand_item tag @s add gm4_apple_take execute store result score $item_count gm4_apple_data run data get entity @s SelectedItem.count execute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=gm4_apple_trees:apple_picked] at @s align xyz run function gm4_apple_trees:leaf/apple/pick tag @s remove gm4_apple_take ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/apple/pick.mcfunction ================================================ # update stack count and leaf stage # @s = armor_stand, with apple taken from apple tree # at @s align xyz # run from gm4_apple_trees:leaf/apple/interact # return item to player item replace entity @a[tag=gm4_apple_take,limit=1,gamemode=!creative] weapon.mainhand from entity @s weapon.mainhand gm4_apple_trees:count # update armour stand function gm4_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/destroy.mcfunction ================================================ # removes a leaf marker # @s = gm4_apple_leaf marker # located at @s # run from gm4_apple_trees:verify/destroy_leaf # drop sapling loot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple_tree_leaf # kill apple armor stands execute as @e[type=armor_stand,distance=..3,tag=gm4_apple,tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s execute as @e[type=armor_stand,distance=..3,tag=gm4_apple,tag=gm4_ripe_apple] at @s align xyz unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_apple_trees:leaf/apple/destroy # kill kill @s ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/initialize.mcfunction ================================================ # initializes the apple leaf scores # @s = gm4_apple armor stand # located at world spawn # run from gm4_apple_trees:main # and from gm4_apple_trees:sapling/generate_tree # set scores scoreboard players set @s gm4_entity_version 2 scoreboard players operation @s gm4_fruit_stage = #stage_0_start gm4_apple_data scoreboard players operation @s gm4_fruit_age = #stage_2_start gm4_apple_data tag @s remove gm4_apple_uninitialized ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/process.mcfunction ================================================ # removes an apple leaf armor stand if it is not inside a leaf anymore # @s = gm4_apple armor stand # located at @s align xyz # run from gm4_apple_trees:main # kill apple armor stands execute if entity @s[tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s execute if entity @s[tag=gm4_ripe_apple] at @s unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_apple_trees:leaf/apple/destroy ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/0.mcfunction ================================================ # sets this apple leaf's stage to 0 (final stage) # @s = gm4_apple_leaf on stage 2 (big apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #stage_1_start gm4_apple_data # reset age scoreboard players operation @s gm4_fruit_age -= #stage_0_start gm4_apple_data # visuals execute if predicate gm4_apple_trees:apple_holding positioned ~0.5 ~1.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_apple_trees:leaf/apple/drop data merge entity @s {Marker:1b,equipment:{},ShowArms:1b,Small:1b,DisabledSlots:2171166,Tags:["gm4_no_edit","gm4_apple","smithed.entity","smithed.strict"]} tp @s ~0.5 ~1.05 ~0.5 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/1.mcfunction ================================================ # sets this apple leaf's stage to 1 # @s = gm4_apple_leaf on stage 0 (no apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #stage_2_start gm4_apple_data # visuals playsound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4 data merge entity @s {Marker:0b,ShowArms:1b,equipment:{offhand:{id:"minecraft:apple",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_apple_trees:block/apple_unripe"]}}}},Pose:{LeftArm:[0.0f,90.0f,90.0f]}} ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/leaf/set_stage/2.mcfunction ================================================ # sets this apple leaf's stage to 2 # @s = gm4_apple_leaf on stage 1 (small apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #stage_0_start gm4_apple_data # visuals playsound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4 data merge entity @s {equipment:{offhand:{id:"minecraft:apple",count:1}},ShowArms:1b,Small:0b,DisabledSlots:30,Tags:["gm4_no_edit","gm4_apple","gm4_ripe_apple","smithed.entity","smithed.strict"],Pose:{LeftArm:[0.0f,90.0f,90.0f]}} tp @s ~0.5 ~-0.9 ~0.5 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/main.mcfunction ================================================ schedule function gm4_apple_trees:main 16t # upgrade old entities execute as @e[type=armor_stand,tag=gm4_apple_leaf] run function gm4_apple_trees:upgrade_path/apple_leaf_markers # process apples execute as @e[type=armor_stand,tag=gm4_apple_uninitialized] run function gm4_apple_trees:leaf/initialize execute as @e[type=armor_stand,tag=gm4_apple] at @s align xyz run function gm4_apple_trees:leaf/process # process golden apples execute as @e[type=armor_stand,tag=gm4_golden_apple_uninitialized] run function gm4_golden_apple_trees:leaf/initialize execute as @e[type=armor_stand,tag=gm4_golden_apple] at @s run function gm4_golden_apple_trees:leaf/process # process golden roots execute as @e[type=marker,tag=gm4_golden_root_uninitialized] at @s run function gm4_golden_apple_trees:root/initialize execute as @e[type=marker,tag=gm4_golden_root] at @s run function gm4_golden_apple_trees:root/process ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/destroy.mcfunction ================================================ # restores the data of the sapling when breaking the block # @s = apple tree sapling marker # located at @s # run from gm4_apple_trees:verify/destroy_sapling execute align xyz store success score $dropped_item gm4_apple_data run kill @e[type=item,nbt={Item:{id:"minecraft:oak_sapling",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] execute if score $dropped_item gm4_apple_data matches 1.. run loot spawn ~ ~ ~ loot gm4_apple_trees:items/apple_tree_sapling scoreboard players reset $dropped_item gm4_apple_data ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/generate_tree.mcfunction ================================================ # generates the apple tree # @s = apple sapling marker # located at @s # run from gm4_apple_trees:verify/generate_tree # place jigsaw gm4_apple_trees:apple_trees gm4_apple_trees:trunk 2 ~ ~1 ~ # jigsaw generation not usable after world-gen due to inherent position-based randomizaton execute unless predicate gm4_apple_trees:valid_placement run return fail function gm4_apple_trees:sapling/grow/generate_random_tree execute if block ~ ~-1 ~ grass_block run setblock ~ ~-1 ~ dirt execute positioned ~ ~1 ~ as @e[type=armor_stand,tag=gm4_apple_uninitialized,distance=..6] run function gm4_apple_trees:leaf/initialize kill @s ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/grow/generate_random_apple_leaf.mcfunction ================================================ # generates an apple armor-stand at a random orientation # @s = gm4_apple_leaf jigsaw marker, created by structure file # positioned ^ ^ ^1 # run from gm4_apple_trees:sapling/grow/generate_random_tree # pick a random facing direction shape execute store result score $random gm4_apple_data run random value 0..3 # place apple at given orientation execute if score $random gm4_apple_data matches 0 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ none execute if score $random gm4_apple_data matches 1 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ clockwise_90 execute if score $random gm4_apple_data matches 2 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ 180 execute if score $random gm4_apple_data matches 3 run place template gm4_apple_trees:sapling_growth/apple_leaf ~ ~-1 ~ counterclockwise_90 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/grow/generate_random_tree.mcfunction ================================================ # randomly selects a tree structure and places it, mimicing jigsaw behavior without location-based random # @s = apple sapling marker # located at @s (the sapling) # run from gm4_apple_trees:sapling/generate_tree # pick a random tree shape execute store result score $tree_shape gm4_apple_data run random value 0..7 execute store result score $rotation gm4_apple_data run random value 0..3 # place the chosen tree execute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 none execute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 clockwise_90 execute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 180 execute if score $tree_shape gm4_apple_data matches 0 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_1 ^-2 ^-1 ^-2 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 none execute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 clockwise_90 execute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 180 execute if score $tree_shape gm4_apple_data matches 1 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_2 ^-2 ^-1 ^-4 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 none execute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 clockwise_90 execute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 180 execute if score $tree_shape gm4_apple_data matches 2 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_3 ^-2 ^-1 ^-2 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 none execute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 clockwise_90 execute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 180 execute if score $tree_shape gm4_apple_data matches 3 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_short_4 ^-2 ^-1 ^-3 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 none execute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 clockwise_90 execute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 180 execute if score $tree_shape gm4_apple_data matches 4 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_1 ^-2 ^-1 ^-2 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 none execute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 clockwise_90 execute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 180 execute if score $tree_shape gm4_apple_data matches 5 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_2 ^-2 ^-1 ^-4 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 none execute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 clockwise_90 execute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 180 execute if score $tree_shape gm4_apple_data matches 6 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_3 ^-2 ^-1 ^-2 counterclockwise_90 execute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 0 rotated ~ ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 none execute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 1 rotated ~90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 clockwise_90 execute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 2 rotated ~180 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 180 execute if score $tree_shape gm4_apple_data matches 7 if score $rotation gm4_apple_data matches 3 rotated ~-90 ~ run place template gm4_apple_trees:sapling_growth/apple_tree_tall_4 ^-2 ^-1 ^-3 counterclockwise_90 # generate apple leaves execute as @e[type=marker,tag=gm4_jpool_apple_leaf] if predicate gm4_apple_trees:apple_gen_chance at @s positioned ^ ^ ^1 run function gm4_apple_trees:sapling/grow/generate_random_apple_leaf # generate corner leaves execute as @e[type=marker,tag=gm4_jpool_corner_leaf] if predicate gm4_apple_trees:corner_leaf_gen_chance at @s positioned ^ ^ ^1 run setblock ~ ~ ~ oak_leaves[persistent=false,distance=3] kill @e[type=marker,tag=gm4_jigsaw_marker] ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/initialize.mcfunction ================================================ # initializes the apple tree's marker # @s = player who placed down the apple tree sapling # located at the center of the placed sapling # run from gm4_apple_trees:verify/initialize_sapling summon marker ~ ~ ~ {CustomName:"gm4_apple_tree_sapling",Tags:["gm4_tree_sapling","gm4_apple_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} scoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_sap_growth 2 scoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_entity_version 1 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/sapling/podzol_rooting.mcfunction ================================================ # plants apple tree saplings to be planted with podzol rooting soil # @s = any sapling item that was rooted with podzol_rooting_soil # located at @s # run from #gm4_podzol_rooting_soil:plant_custom_sapling execute if score gm4_apple_trees load.status matches 1.. if items entity @s contents *[custom_data~{gm4_podzol_rooting_soil:{id:"apple_tree_sapling"}}] align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_apple_trees:sapling/initialize ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/slow_clock.mcfunction ================================================ schedule function gm4_apple_trees:slow_clock 60s execute as @e[type=armor_stand,tag=gm4_apple] run function gm4_apple_trees:leaf/age execute as @e[type=armor_stand,tag=gm4_golden_apple] run function gm4_golden_apple_trees:leaf/age ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/upgrade_path/apple_leaf_markers.mcfunction ================================================ tag @s remove gm4_apple_leaf tag @s remove gm4_fruiting_leaf tag @s add gm4_apple tag @s remove smithed.block tag @s add smithed.entity tag @s add smithed.strict scoreboard players set @s gm4_entity_version 2 execute if entity @s[tag=gm4_ripe_apple] align xyz run summon marker ~0.5 ~2.5 ~0.5 {CustomName:"gm4_apple_leaf",Tags:["gm4_tree_leaf","gm4_apple_leaf","smithed.entity","smithed.strict","smithed.block"]} execute if entity @s[tag=!gm4_ripe_apple] align xyz run summon marker ~0.5 ~1.5 ~0.5 {CustomName:"gm4_apple_leaf",Tags:["gm4_tree_leaf","gm4_apple_leaf","smithed.entity","smithed.strict","smithed.block"]} ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/upgrade_path/fruiting_to_general.mcfunction ================================================ # updates entities with new tags # @s = old sapling marker # located at world spawn # run from gm4_apple_trees:verify/upgrade_fruiting_to_general data merge entity @s {CustomName:"gm4_apple_tree_sapling",Tags:["gm4_tree_sapling","gm4_apple_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} scoreboard players set @s gm4_entity_version 1 ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/verify/destroy_leaf.mcfunction ================================================ # verifies that the module is enabled and that the leaf type is from this module # @s = gm4_tree_leaf marker # located at @s # run from gm4_trees-1.0:tick via #gm4_trees:destroy_leaf execute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_leaf] run function gm4_apple_trees:leaf/destroy execute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_golden_apple_leaf] run function gm4_golden_apple_trees:leaf/destroy ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/verify/destroy_sapling.mcfunction ================================================ # verifies that the module is enabled and that the sapling type is from this module # @s = gm4_tree_sapling marker # located at @s # run from gm4_trees-1.0:sapling/process via #gm4_trees:destroy_sapling execute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:sapling/destroy ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/verify/generate_tree.mcfunction ================================================ # verifies that the module is enabled and that the sapling type is from this module # @s = gm4_tree_sapling marker # located at @s # run from gm4_trees-1.0:advance_stage via #gm4_trees:generate_tree execute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:sapling/generate_tree ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/verify/initialize_sapling.mcfunction ================================================ # verifies that the module is enabled and that the sapling type is from this module # @s = player who just placed down a custom sapling # located at the center sapling block # run from gm4_trees-1.0:sapling/summon marker via #gm4_trees:initialize_sapling execute if score gm4_apple_trees load.status matches 1.. if data storage gm4_trees:temp sapling{type:"apple"} run function gm4_apple_trees:sapling/initialize ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/function/verify/upgrade_fruiting_to_general.mcfunction ================================================ # verifies that the module is enabled and that the sapling type is from this module # @s = gm4_tree_sapling marker # located at world spawn # run from gm4_trees-1.0:tick via #gm4_trees:upgrade_fruiting_to_general execute if score gm4_apple_trees load.status matches 1.. if entity @s[tag=gm4_apple_tree_sapling] run function gm4_apple_trees:upgrade_path/fruiting_to_general ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/guidebook/apple_trees.json ================================================ { "id": "apple_trees", "name": "Apple Trees", "module_type": "module", "icon": { "id": "minecraft:apple" }, "criteria": { "obtain_apple_sapling": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:oak_sapling" ], "predicates": { "minecraft:custom_data": "{gm4_trees:{item:{type:\"apple\"}}}" } } ] } }, "pick_apple": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_apple\"]}" } } ] } } }, "sections": [ { "name": "leaf_changes", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.apple_trees.leaf_changes", "fallback": "Apples do not drop from oak or dark oak trees. Another source of apples must be discovered." } ] ] }, { "name": "obtaining_apples", "enable": [], "requirements": [ [ "obtain_apple_sapling" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.apple_trees.obtaining_apples", "fallback": "Apple trees are found naturally occurring in forest biomes.\n\nWandering traders will also sell apple tree saplings.\n\nWhen planted, these saplings grow into apple trees." } ], [ { "translate": "text.gm4.guidebook.apple_trees.golden_apple_trees", "fallback": "Golden apple trees can also be found in forests.\n\nThese trees don't drop saplings, and cannot be replanted.\n\nThey also have a golden root which grows through stone and dirt." } ] ] }, { "name": "new_apples", "enable": [], "requirements": [ [ "pick_apple" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.apple_trees.new_apples", "fallback": "New apples will grow every 3 day cycles. Once ripe, they can be picked or will fall from the tree after a while.\n\nBreaking an apple bearing leaf has a 75% chance to drop an apple tree sapling." } ] ], "grants": [ "obtaining_apples" ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/item_modifier/count.json ================================================ { "function": "minecraft:set_count", "count": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$item_count" }, "score": "gm4_apple_data" }, "add": true } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/loot_table/blocks/apple.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:apple" } ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/loot_table/blocks/apple_tree_leaf.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_apple_trees:items/apple_tree_sapling", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.75 } ] } ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/loot_table/items/apple_tree_sapling.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:oak_sapling", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.apple_tree_sapling", "fallback": "Apple Tree Sapling" } }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_apple_trees:item/apple_tree_sapling"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_trees:{item:{id:'sapling',type:'apple'}},gm4_podzol_rooting_soil:{id:'apple_tree_sapling'}}" } ] } ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/apple_gen_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.1667 } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/apple_holding.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:apple" ] } } } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/apple_picked.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "count": 1 }, "offhand": { "items": [ "minecraft:apple" ] } } } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/corner_leaf_gen_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.3333 } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/overworld.json ================================================ { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:overworld" } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/predicate/valid_placement.json ================================================ check = [] for x in range(-4,5): for y in range(1,8): for z in range(-4,5): check.append( { "condition": "minecraft:location_check", "offsetX": x, "offsetY": y, "offsetZ": z, "predicate": { "block": { "blocks": "#gm4_apple_trees:tree_placeable" } } } ) { "condition": "minecraft:all_of", "terms": check } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/NOTICE.txt ================================================ NOTE. The following files in this directory were generated programatically from their worldgen structure counterparts. it is suggested that if you wish to edit the tree shapes, to do so in the jigsaw based versions and regenerate these files to match them. apple_tree_short_1.nbt apple_tree_short_2.nbt apple_tree_short_3.nbt apple_tree_short_4.nbt apple_tree_tall_1.nbt apple_tree_tall_2.nbt apple_tree_tall_3.nbt apple_tree_tall_4.nbt apple_leaf.nbt ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/jigsaw_structure_convert.py ================================================ # converts a jigsaw structure to an function-emulated jigsaw structure for use post-worldgen # written for convertting apple trees structure files with marker entities. import amulet_nbt import numpy as np from structure_normalize_palette import normalize_palette def jigsaw_convert(structure_file): # locate which blocks are jigsaws by the block type in palette # and extract facing information for each jigsaws_in_palette = {idx: val['Properties']['orientation'].py_str for idx, val in enumerate(structure_file.tag['palette']) \ if val['Name'].py_str == 'minecraft:jigsaw' } # facing to rotation direction mapping rotation_map = { "north_up": "[180f, 0f]", "east_up": "[-90f, 0f]", "south_up": "[0f, 0f]", "west_up": "[90f, 0f]", "up_east": "[0.0f, -90f]", "up_north": "[0.0f, -90f]", "up_south": "[0.0f, -90f]", "up_west": "[0.0f, -90f]", "down": "[0.f, 90f]", "down_east": "[0.f, 90f]", "down_north": "[0.f, 90f]", "down_south": "[0.f, 90f]", "down_west": "[0.f, 90f]" } # locate block positions from palette state(index)s for jigsaw_compound in structure_file.tag['blocks']: if jigsaws_in_palette.get(state_id:=jigsaw_compound['state'].py_int) is not None: # add entity to the entity list # with this jigsaw's direction and position blockPos = np.array(list(map(lambda e:e.py_int, jigsaw_compound['pos']))) jigsaw_pool = 'gm4_jpool_' + jigsaw_compound['nbt']['pool'].py_str.split(':')[1] entity_snbt = f'''{{ nbt:{{id:"minecraft:marker",Tags:["gm4_jigsaw_marker","{jigsaw_pool}"], Rotation:{rotation_map[jigsaws_in_palette[state_id]]}}}, blockPos:{np.array2string( blockPos, separator=",")}, pos:{np.array2string( blockPos+[0.5]*3, separator=",")} }}''' entity_entry = amulet_nbt.from_snbt(entity_snbt) structure_file.tag['entities'].append(entity_entry) # convert the jigsaw block into its final-state block final_name, *final_props = jigsaw_compound['nbt']['final_state'].py_str.split('[') if len(final_props)>0: final_props = final_props[0].strip(']').split(',') final_props = dict((s.split('=') for s in final_props)) palette_snbt = f'''{{ Name:"{final_name}", Properties:{final_props} }}''' palette_entry = amulet_nbt.from_snbt(palette_snbt) structure_file.tag['palette'].append(palette_entry) new_state_id = len(structure_file.tag['palette'])-1 jigsaw_compound['state'] = amulet_nbt.IntTag(new_state_id) del jigsaw_compound['nbt'] # replace all air with structure-voids (an empty entry) air_state = structure_file.tag['palette'].index(amulet_nbt.CompoundTag({'Name': amulet_nbt.StringTag('minecraft:air')})) air_to_remove = [] for idx, b_compound in enumerate(structure_file.tag['blocks']): if b_compound['state'].py_int == air_state: air_to_remove.append(idx) for idx in reversed(air_to_remove): del structure_file.tag['blocks'][idx] # air entry in palette will be cleaned up by normalize # normalize blocks and palette to remove repeated values normalized_struct = normalize_palette(structure_file) return normalized_struct if __name__ == '__main__': # processed desired files into entity-based structures input_files = [ "data\gm4_apple_trees\structures\worldgen\\apple_tree_short_1.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_short_2.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_short_3.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_short_4.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_tall_1.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_tall_2.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_tall_3.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_tree_tall_4.nbt", "data\gm4_apple_trees\structures\worldgen\\apple_leaf.nbt" ] output_dir_map = ('worldgen', 'sapling_growth') for filepath in input_files: structure_file = amulet_nbt.load(filepath) processed_file = jigsaw_convert(structure_file) processed_file.save_to(filepath.replace(*output_dir_map)) ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/structure/sapling_growth/structure_normalize_palette.py ================================================ # normalizes a minecraft structure file's palette and removes unused or duplicated # entries. This is useful when manipulating structure files via script or by hand, # as it reduces filesize and mimics the form of structure blocks produced naturally # by the game import amulet_nbt def normalize_palette(structure): # first generate list of non-repeating palette entries state_map = dict() # maps old->new {old:new} non_repeating_palette = [] repeated_idxs = [] for idx, p_member in enumerate(structure.tag['palette'].copy()): if p_member not in non_repeating_palette: non_repeating_palette.append(p_member) state_map[idx] = idx else: state_map[idx] = non_repeating_palette.index(p_member) # then mark for palette entry deletion repeated_idxs.append(idx) for idx in reversed(repeated_idxs): del structure.tag['palette'][idx] for k in state_map.keys(): if k > idx and k not in repeated_idxs: state_map[k] -= 1 # then search through list of blocks and remove unused palette members used_states = set() for b_member in structure.tag['blocks']: used_states.add(b_member['state'].py_int) unused_states = set(state_map.keys()).difference(used_states) old_state_map = state_map.copy() for idx in unused_states: # adjust palette state mapping for removed entry del state_map[idx] for k, v in old_state_map.items(): if v > idx: state_map[k] -= 1 for idx in reversed(list(unused_states)): del structure.tag['palette'][idx] # finally adjust block state references with new palette for b_member in structure.tag['blocks']: b_member['state'] = amulet_nbt.IntTag(state_map[b_member['state'].py_int]) return structure if __name__ == '__main__': LOAD_FILE = 'data\gm4_golden_apple_trees\structures\golden_apple_tree_short_2' test_file = amulet_nbt.load(LOAD_FILE+'.nbt') ret = normalize_palette(test_file) ret.save_to(LOAD_FILE+'_normalized.nbt') ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/tags/block/tree_placeable.json ================================================ { "values": [ "#minecraft:air", "#minecraft:logs", "#minecraft:replaceable_by_trees", "#minecraft:saplings" ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/tags/worldgen/biome/has_structure/apple_tree.json ================================================ { "values": [ "minecraft:dark_forest", "minecraft:flower_forest", "minecraft:forest" ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/villager_trade/emerald_apple_tree_sapling.json ================================================ { "wants": { "id": "minecraft:emerald", "count": 5 }, "gives": { "id": "minecraft:oak_sapling", "components": { "minecraft:custom_data": "{gm4_trees:{item:{id:'sapling',type:'apple'}},gm4_podzol_rooting_soil:{id:'apple_tree_sapling'}}", "minecraft:custom_model_data": {"strings":["gm4_apple_trees:item/apple_tree_sapling"]}, "minecraft:item_name": { "translate": "item.gm4.apple_tree_sapling", "fallback": "Apple Tree Sapling" } } }, "max_uses": 8, "xp": 1 } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/worldgen/structure/apple_tree.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_apple_trees:has_structure/apple_tree", "step": "vegetal_decoration", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_apple_trees:apple_trees", "size": 6, "start_height": { "absolute": 0 }, "start_jigsaw_name": "gm4_apple_trees:trunk", "project_start_to_heightmap": "MOTION_BLOCKING_NO_LEAVES", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/worldgen/structure_set/apple_tree.json ================================================ { "structures": [ { "structure": "gm4_apple_trees:apple_tree", "weight": 1 } ], "placement": { "type": "minecraft:random_spread", "salt": 314989258, "frequency_reduction_method": "default", "frequency": 0.4, "locate_offset": [ 7, 0, 7 ], "spacing": 3, "separation": 0 } } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/apple_leaf.json ================================================ { "name": "gm4_apple_trees:apple_leaf", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_leaf", "processors": "minecraft:empty" } }, { "weight": 5, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid" } } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/apple_trees.json ================================================ { "name": "gm4_apple_trees:apple_trees", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_short_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_short_2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_short_3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_short_4", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_tall_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_tall_2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_tall_3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/apple_tree_tall_4", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_apple_trees/data/gm4_apple_trees/worldgen/template_pool/corner_leaf.json ================================================ { "name": "gm4_apple_trees:corner_leaf", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_apple_trees:worldgen/corner_leaf", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid" } } ] } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/advancement/apple_hand_empty.json ================================================ { "criteria": { "apple": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_apple_trees" }, "score": "load.status" }, "range": { "min": 1 } } ], "item": { "count": 0 }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_golden_apple\",\"gm4_ripe_apple\"]}" } } ] } } }, "rewards": { "function": "gm4_golden_apple_trees:leaf/apple/hand_interact" } } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/advancement/apple_hand_item.json ================================================ { "criteria": { "apple": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_apple_trees" }, "score": "load.status" }, "range": { "min": 1 } } ], "item": { "count": { "min": 1, "max": 64 } }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_golden_apple\",\"gm4_ripe_apple\"]}" } } ] } } }, "rewards": { "function": "gm4_golden_apple_trees:leaf/apple/interact" } } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/advance_stage.mcfunction ================================================ # advances the stage of the fruit # @s = apple_fruiting_leaf armor stand # located at @s align xyz # run from gm4_apple_trees:leaf/age # set the visual stage of the fruit depending the score execute if score @s gm4_fruit_age = #gapple_stage_1_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/1 execute if score @s gm4_fruit_age = #gapple_stage_2_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/2 execute if score @s gm4_fruit_age = #gapple_stage_0_start gm4_apple_data run function gm4_golden_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/age.mcfunction ================================================ # decreases the age of a fruiting leaf. If it hits 0, the expansion will have to perform some stage change (e.g. grow fruit bigger or drop fruit) # @s = gm4_fruiting_leaf marker # located at world spawn # run from gm4_apple_trees:slow_clock # increases age scoreboard players add @s gm4_fruit_age 1 execute if score @s gm4_fruit_age >= @s gm4_fruit_stage at @s align xyz run function gm4_golden_apple_trees:leaf/advance_stage ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/destroy.mcfunction ================================================ # removes a ripe apple leaf armor stand if it is not inside a leaf anymore # @s = gm4_ripe_apple armor stand that's holding an apple # located at @s align xyz # run from gm4_apple_trees:leaf/destroy # drop apple execute if predicate gm4_golden_apple_trees:apple_holding positioned ~0.5 ~2.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_golden_apple_trees:leaf/apple/drop # kill kill @s ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/drop.mcfunction ================================================ # spawns an apple # @s = gm4_apple_leaf switching to stage 0 # at loot spawn location (in head of armor stand or leaf block above the armor stand) # run from gm4_apple_trees:leaf/set_stage/0 # and from gm4_apple_trees:leaf/apple/destroy # spawn apple item playsound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6 item replace entity @s weapon.offhand with minecraft:air item replace entity @s weapon.mainhand with minecraft:air # visuals loot spawn ~ ~ ~ loot gm4_golden_apple_trees:blocks/golden_apple ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/hand_interact.mcfunction ================================================ # update leaf stage # @s = player taking apple from tree with empty hand # located at @s # run from advancement apple_hand_empty advancement revoke @s only gm4_golden_apple_trees:apple_hand_empty playsound minecraft:entity.item_frame.remove_item block @a[distance=..8] ~ ~ ~ 0.3 0.6 # update armour stand execute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_golden_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=!gm4_golden_apple_trees:apple_holding] at @s align xyz run function gm4_golden_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/interact.mcfunction ================================================ # update leaf marker and update player's hand items # @s = player taking apple from tree while holding an item # located at @s # run from advancement apple_hand_item advancement revoke @s only gm4_golden_apple_trees:apple_hand_item tag @s add gm4_apple_take execute store result score $item_count gm4_apple_data run data get entity @s SelectedItem.count execute positioned ^ ^ ^2.5 as @e[type=minecraft:armor_stand,tag=gm4_golden_apple,tag=gm4_ripe_apple,distance=..3,sort=nearest,limit=1,predicate=gm4_golden_apple_trees:apple_picked] at @s align xyz run function gm4_golden_apple_trees:leaf/apple/pick tag @s remove gm4_apple_take ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/apple/pick.mcfunction ================================================ # update stack count and leaf stage # @s = armor_stand, with apple taken from apple tree # at @s align xyz # run from gm4_apple_trees:leaf/apple/interact # return item to player item replace entity @a[tag=gm4_apple_take,limit=1,gamemode=!creative] weapon.mainhand from entity @s weapon.mainhand gm4_apple_trees:count # update armour stand function gm4_golden_apple_trees:leaf/set_stage/0 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/destroy.mcfunction ================================================ # removes a leaf marker # @s = gm4_apple_leaf marker # located at @s # run from gm4_apple_trees:verify/destroy_leaf # drop sapling loot spawn ~ ~ ~ loot gm4_apple_trees:blocks/apple_tree_leaf # kill apple armor stands execute as @e[type=armor_stand,distance=..3,tag=gm4_golden_apple,tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s execute as @e[type=armor_stand,distance=..3,tag=gm4_golden_apple,tag=gm4_ripe_apple] at @s align xyz unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_golden_apple_trees:leaf/apple/destroy # kill kill @s ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/initialize.mcfunction ================================================ # initializes the apple leaf scores # @s = gm4_apple armor stand # located at world spawn # run from gm4_apple_trees:main # and from gm4_apple_trees:sapling/generate_tree # set scores scoreboard players set @s gm4_entity_version 1 scoreboard players operation @s gm4_fruit_stage = #gapple_stage_0_start gm4_apple_data scoreboard players operation @s gm4_fruit_age = #gapple_stage_2_start gm4_apple_data tag @s remove gm4_golden_apple_uninitialized ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/process.mcfunction ================================================ # removes a golden apple leaf armor stand if it is not inside a leaf anymore # @s = gm4_golden_apple # located at @s align xyz # run from gm4_apple_trees:main # kill apple armor stands execute if entity @s[tag=!gm4_ripe_apple] at @s unless block ~ ~1 ~ minecraft:oak_leaves run kill @s execute if entity @s[tag=gm4_ripe_apple] at @s unless block ~ ~2 ~ minecraft:oak_leaves run function gm4_golden_apple_trees:leaf/apple/destroy ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/0.mcfunction ================================================ # sets this apple leaf's stage to 0 (final stage) # @s = gm4_apple_leaf on stage 2 (big apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #gapple_stage_1_start gm4_apple_data # reset age scoreboard players operation @s gm4_fruit_age -= #gapple_stage_0_start gm4_apple_data # visuals execute if predicate gm4_golden_apple_trees:apple_holding positioned ~0.5 ~1.5 ~0.5 positioned ^-.25 ^ ^.1 run function gm4_golden_apple_trees:leaf/apple/drop data merge entity @s {Marker:1b,equipment:{},ShowArms:1b,Small:1b,DisabledSlots:2171166,Tags:["gm4_no_edit","gm4_golden_apple","smithed.entity","smithed.strict"]} tp @s ~0.5 ~1.05 ~0.5 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/1.mcfunction ================================================ # sets this apple leaf's stage to 1 # @s = gm4_apple_leaf on stage 0 (no apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #gapple_stage_2_start gm4_apple_data # visuals playsound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4 data merge entity @s {Marker:0b,ShowArms:1b,equipment:{offhand:{id:"minecraft:golden_apple",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_apple_trees:block/golden_apple_unripe"]}}}},Pose:{LeftArm:[0.0f,90.0f,90.0f]}} ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/leaf/set_stage/2.mcfunction ================================================ # sets this apple leaf's stage to 2 # @s = gm4_apple_leaf on stage 1 (small apple) which should drop its apple # located at @s align xyz # run from gm4_apple_trees:tree/leaf/fruiting/advance_stage # set leaf's next stage change age scoreboard players operation @s gm4_fruit_stage = #gapple_stage_0_start gm4_apple_data # visuals playsound minecraft:block.beehive.drip block @a[distance=..8] ~ ~ ~ 0.3 1.4 data merge entity @s {equipment:{offhand:{id:"minecraft:golden_apple",count:1}},ShowArms:1b,Small:0b,DisabledSlots:30,Tags:["gm4_no_edit","gm4_golden_apple","gm4_ripe_apple","smithed.entity","smithed.strict"],Pose:{LeftArm:[0.0f,90.0f,90.0f]}} tp @s ~0.5 ~-0.9 ~0.5 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/branch.mcfunction ================================================ # handles branching golden apple roots # @s = gm4_golden_root_ray marker # located at @s # run from gm4_golden_apple_trees:root/raycast summon marker ~ ~ ~ {Tags:["gm4_golden_apple_root_ray","gm4_golden_apple_root_branch","smithed.entity","smithed.strict"]} execute if score @s gm4_ga_root_count matches 5 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~160 ~ execute if score @s gm4_ga_root_count matches 8 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~-130 ~ execute if score @s gm4_ga_root_count matches 11 run tp @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] ~ ~ ~ ~100 ~ scoreboard players set @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] gm4_ga_root_count 12 execute as @e[type=marker,tag=gm4_golden_apple_root_branch,limit=1] at @s run function gm4_golden_apple_trees:root/raycast ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/grow.mcfunction ================================================ # handles growth of golden apple roots # @s = gm4_golden_root marker # located at @s # run from gm4_golden_apple_trees:root/process # rotate to next root location tp @s ~ ~ ~ ~120 0 # grow the root summon marker ^ ^-1 ^1 {Tags:["gm4_golden_apple_root_ray"]} tp @e[type=marker,tag=gm4_golden_apple_root_ray,limit=1] @s execute as @e[type=marker,tag=gm4_golden_apple_root_ray,limit=1] at @s if block ~ ~ ~ gold_ore run function gm4_golden_apple_trees:root/raycast execute at @e[type=marker,tag=gm4_golden_apple_root_ray] if block ~ ~ ~ #gm4_golden_apple_trees:rootable run function gm4_golden_apple_trees:root/place # clean up scoreboard players reset @s gm4_ga_root scoreboard players reset @e[type=marker,tag=gm4_golden_apple_root_ray] gm4_ga_root_count kill @e[type=marker,tag=gm4_golden_apple_root_ray] ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/initialize.mcfunction ================================================ # initializes the golden root # @s = uninitialized golden root marker # located at @s # run from gm4_apple_trees:main # set salt based on seed and position execute store result score $x gm4_ga_root run data get entity @s Pos[0] execute store result score $y gm4_ga_root run data get entity @s Pos[1] execute store result score $z gm4_ga_root run data get entity @s Pos[2] execute store result score $salt gm4_ga_root run seed scoreboard players operation $salt gm4_ga_root *= $x gm4_ga_root scoreboard players operation $salt gm4_ga_root *= $y gm4_ga_root scoreboard players operation $salt gm4_ga_root *= $z gm4_ga_root # set initial rotation scoreboard players operation $rotation gm4_ga_root = $salt gm4_ga_root scoreboard players operation $rotation gm4_ga_root %= #3600 gm4_ga_root execute store result entity @s Rotation[0] float 0.1 run scoreboard players get $rotation gm4_ga_root scoreboard players reset $rotation gm4_ga_root # set offset scoreboard players operation $offset gm4_ga_root = $salt gm4_ga_root scoreboard players operation $rotation gm4_ga_root %= #4 gm4_ga_root execute if score $offset gm4_ga_root matches 0 run tp @s ~0.1 ~ ~ execute if score $offset gm4_ga_root matches 1 run tp @s ~-0.1 ~ ~ execute if score $offset gm4_ga_root matches 2 run tp @s ~ ~ ~0.1 execute if score $offset gm4_ga_root matches 3 run tp @s ~ ~ ~-0.1 scoreboard players reset $offset gm4_ga_root # update tags data merge entity @s {Tags:["gm4_golden_root","smithed.entity","smithed.strict"]} ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/place.mcfunction ================================================ # replaces the stone with a gold ore # @s = gm4_golden_root_ray marker in stone # located at @s # run from gm4_golden_apple_trees:tree/root/grow setblock ~ ~ ~ gold_ore # visuals particle minecraft:block{block_state:"minecraft:gold_block"} ~ ~ ~ 0.7 0.7 0.7 0.02 15 playsound minecraft:block.ancient_debris.place block @a[distance=..8] ~ ~ ~ 0.5 0.3 ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/process.mcfunction ================================================ # handles operations on golden apple roots # @s = gm4_golden_root marker # located at @s # run from gm4_apple_trees:main scoreboard players add @s gm4_ga_root 1 execute if block ~ ~ ~ gold_ore if score @s gm4_ga_root >= #golden_root_time gm4_ga_root run function gm4_golden_apple_trees:root/grow execute unless block ~ ~ ~ gold_ore run kill @s ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/function/root/raycast.mcfunction ================================================ # handles checking golden apple roots # @s = gm4_golden_root_ray marker # located at @s # run from gm4_golden_apple_trees:root/grow tag @s remove gm4_golden_apple_root_branch tp @s ^ ^-1 ^0.6 execute if score @s gm4_ga_root_count matches 5 run function gm4_golden_apple_trees:root/branch execute if score @s gm4_ga_root_count matches 8 run function gm4_golden_apple_trees:root/branch execute if score @s gm4_ga_root_count matches 11 run function gm4_golden_apple_trees:root/branch scoreboard players add @s gm4_ga_root_count 1 execute unless score @s gm4_ga_root_count matches 16.. at @s if block ~ ~ ~ gold_ore run function gm4_golden_apple_trees:root/raycast ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/loot_table/blocks/golden_apple.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:golden_apple" } ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/loot_table/blocks/golden_apple_tree_leaf.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_apple_trees:items/apple_tree_sapling", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.8 } ] } ] } ] } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/predicate/apple_holding.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:golden_apple" ] } } } } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/predicate/apple_picked.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "count": 1 }, "offhand": { "items": [ "minecraft:golden_apple" ] } } } } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/tags/block/rootable.json ================================================ { "values": [ "#minecraft:base_stone_overworld", "#minecraft:substrate_overworld" ] } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/structure/golden_apple_tree.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_apple_trees:has_structure/apple_tree", "step": "vegetal_decoration", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_golden_apple_trees:golden_apple_trees", "size": 6, "start_height": { "absolute": 0 }, "start_jigsaw_name": "gm4_apple_trees:trunk", "project_start_to_heightmap": "MOTION_BLOCKING_NO_LEAVES", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/structure_set/golden_apple_tree.json ================================================ { "structures": [ { "structure": "gm4_golden_apple_trees:golden_apple_tree", "weight": 1 } ], "placement": { "type": "minecraft:random_spread", "salt": 193324921, "frequency_reduction_method": "default", "frequency": 0.1, "locate_offset": [ 14, 0, 3 ], "spacing": 5, "separation": 2 } } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/template_pool/golden_apple_leaf.json ================================================ { "name": "gm4_golden_apple_trees:golden_apple_leaf", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_leaf", "processors": "minecraft:empty" } }, { "weight": 6, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid" } } ] } ================================================ FILE: gm4_apple_trees/data/gm4_golden_apple_trees/worldgen/template_pool/golden_apple_trees.json ================================================ { "name": "gm4_golden_apple_trees:golden_apple_trees", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_short_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_short_2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_short_3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_short_4", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_golden_apple_trees:worldgen/golden_apple_tree_tall_4", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_apple_trees/data/gm4_podzol_rooting_soil/tags/function/plant_custom_sapling.json ================================================ { "values":[ "gm4_apple_trees:sapling/podzol_rooting" ] } ================================================ FILE: gm4_apple_trees/data/gm4_trees/tags/function/destroy_leaf.json ================================================ { "values": [ "gm4_apple_trees:verify/destroy_leaf" ] } ================================================ FILE: gm4_apple_trees/data/gm4_trees/tags/function/destroy_sapling.json ================================================ { "values": [ "gm4_apple_trees:verify/destroy_sapling" ] } ================================================ FILE: gm4_apple_trees/data/gm4_trees/tags/function/generate_tree.json ================================================ { "values": [ "gm4_apple_trees:verify/generate_tree" ] } ================================================ FILE: gm4_apple_trees/data/gm4_trees/tags/function/initialize_sapling.json ================================================ { "values": [ "gm4_apple_trees:verify/initialize_sapling" ] } ================================================ FILE: gm4_apple_trees/data/gm4_trees/tags/function/upgrade_fruiting_to_general.json ================================================ { "values": [ "gm4_apple_trees:verify/upgrade_fruiting_to_general" ] } ================================================ FILE: gm4_apple_trees/data/minecraft/loot_table/blocks/dark_oak_leaves.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:shears" ] } }, { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ] } ], "name": "minecraft:dark_oak_leaves" }, { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:survives_explosion" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0.05, 0.0625, 0.083333336, 0.1 ] } ], "name": "minecraft:dark_oak_sapling" } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0.02, 0.022222223, 0.025, 0.033333335, 0.1 ] } ], "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2, "type": "minecraft:uniform" } }, { "function": "minecraft:explosion_decay" } ], "name": "minecraft:stick" } ], "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:shears" ] } }, { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ] } } ] } ], "random_sequence": "minecraft:blocks/dark_oak_leaves", "__smithed__": { "rules": [ { "type": "smithed:merge", "target": "pools", "source": { "type": "smithed:reference", "path": "pools" } } ], "priority": { "default": 99 } } } ================================================ FILE: gm4_apple_trees/data/minecraft/loot_table/blocks/oak_leaves.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:shears" ] } }, { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ] } ], "name": "minecraft:oak_leaves" }, { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:survives_explosion" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0.05, 0.0625, 0.083333336, 0.1 ] } ], "name": "minecraft:oak_sapling" } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0.02, 0.022222223, 0.025, 0.033333335, 0.1 ] } ], "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2, "type": "minecraft:uniform" } }, { "function": "minecraft:explosion_decay" } ], "name": "minecraft:stick" } ], "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:shears" ] } }, { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ] } } ] } ], "random_sequence": "minecraft:blocks/oak_leaves", "__smithed__": { "rules": [ { "type": "smithed:merge", "target": "pools", "source": { "type": "smithed:reference", "path": "pools" } } ], "priority": { "default": 99 } } } ================================================ FILE: gm4_apple_trees/data/minecraft/tags/villager_trade/wandering_trader/common.json ================================================ { "values": [ "gm4_apple_trees:emerald_apple_tree_sapling" ] } ================================================ FILE: gm4_audere_shamir/README.md ================================================ # Audere Shamir Play the risky game and nearly break your tools! The lower your durability, the faster you mine! ### Features - Get up to Haste 4 when your durability is really low - Works across all tool types and all tool tiers (Wood to Netherrite) - Builds on Gamemode 4's comprehensive and fun take on enchantments with the [Metallurgy]($dynamicLink:gm4_metallurgy) system. ================================================ FILE: gm4_audere_shamir/beet.yaml ================================================ id: gm4_audere_shamir name: Audere Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 schedule_loops: [main] model_data: - item: tools reference: shamir/audere template: name: shamir metal: barium textures_path: gm4_metallurgy:item/shamir/barium website: description: Adds the shamir 'Audere' to Metallurgy. Gain Haste with low durability tools. recommended: [] notes: [] modrinth: project_id: 2rSIqoh7 wiki: https://wiki.gm4.co/wiki/Metallurgy/Audere_Shamir credits: Creator: - Kattacka Icon Design: - BPR ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/active_tool.mcfunction ================================================ # @s = players holding an Audere tool # at @s # run from main data modify storage gm4_audere_shamir:temp/player/tool SelectedItem set from entity @s SelectedItem execute store result score $tool_current_damage gm4_ml_data run data get storage gm4_audere_shamir:temp/player/tool SelectedItem.components."minecraft:damage" execute store result score $tool_max_damage gm4_ml_data run data get storage gm4_audere_shamir:temp/player/tool SelectedItem.components."minecraft:custom_data".MaxDurability # | MaxDamage is set by gm4_moneo_shamir:store_maximum # update newly upgraded netherite gear execute if score $tool_max_damage gm4_ml_data matches 1561 if predicate gm4_audere_shamir:holding_netherite run function gm4_audere_shamir:update_netherite # activate audere execute if score $tool_max_damage gm4_ml_data matches 59 run function gm4_audere_shamir:tools/materials/wood execute if score $tool_max_damage gm4_ml_data matches 131 run function gm4_audere_shamir:tools/materials/stone execute if score $tool_max_damage gm4_ml_data matches 190 run function gm4_audere_shamir:tools/materials/copper execute if score $tool_max_damage gm4_ml_data matches 250 run function gm4_audere_shamir:tools/materials/iron execute if score $tool_max_damage gm4_ml_data matches 1561 run function gm4_audere_shamir:tools/materials/diamond execute if score $tool_max_damage gm4_ml_data matches 2031 run function gm4_audere_shamir:tools/materials/netherite # | gold used to be listed as 33 max damage, this is kept for compatibility with old items execute if score $tool_max_damage gm4_ml_data matches 32..33 run function gm4_audere_shamir:tools/materials/gold execute if score $tool_max_damage gm4_ml_data matches 237 run function gm4_audere_shamir:tools/shears # reset storage and fake players data remove storage gm4_audere_shamir:temp/player/tool SelectedItem scoreboard players reset $tool_current_damage gm4_ml_data scoreboard players reset $tool_max_damage gm4_ml_data ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'audere'}}] if items entity @s contents #gm4_audere_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/init.mcfunction ================================================ execute unless score audere_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Audere Shamir"} execute unless score audere_shamir gm4_earliest_version < audere_shamir gm4_modules run scoreboard players operation audere_shamir gm4_earliest_version = audere_shamir gm4_modules scoreboard players set audere_shamir gm4_modules 1 schedule function gm4_audere_shamir:main 16t #$moduleUpdateList ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/main.mcfunction ================================================ execute as @a[gamemode=!spectator,predicate=gm4_audere_shamir:holding_audere] at @s run function gm4_audere_shamir:active_tool schedule function gm4_audere_shamir:main 16t ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium loot spawn ~ ~ ~ loot gm4_audere_shamir:band ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/copper.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 52..139 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 20..51 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 8..19 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..7 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/diamond.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 424..1148 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 156..423 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 59..155 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..57 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/gold.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 10..24 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 4..9 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 2..3 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..1 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/iron.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 69..184 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 26..68 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 10..25 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..9 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/netherite.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 551..1494 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 203..550 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 75..202 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..74 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/stone.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 36..96 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 14..35 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 6..13 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..5 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/materials/wood.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 17..43 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 7..16 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 3..6 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..2 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/tools/shears.mcfunction ================================================ # @s = player holding an Audere tool # at @s # run from active_tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 65..174 run effect give @s minecraft:haste 2 0 execute if score $tool_max_damage gm4_ml_data matches 25..64 run effect give @s minecraft:haste 2 1 execute if score $tool_max_damage gm4_ml_data matches 10..24 run effect give @s minecraft:haste 2 2 execute if score $tool_max_damage gm4_ml_data matches ..9 run effect give @s minecraft:haste 2 3 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/function/update_netherite.mcfunction ================================================ # @s = player holding a netherite audere tool that has the wrong gm4_audere_shamir.max_durability # run from active_tool # item modifier item modify entity @s weapon.mainhand gm4_audere_shamir:update_netherite # correctly set the max damage scoreboard players set $tool_max_damage gm4_ml_data 2031 ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/guidebook/audere_shamir.json ================================================ { "id": "audere_shamir", "name": "Audere Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_audere_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'audere'}}" } } ] } }, "obtain_audere_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'audere'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.audere_shamir.description", "fallback": "Audere buffs mining speed, as durability decreases." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_audere_shamir", "obtain_audere_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.audere_shamir.usage", "fallback": "The Audere Shamir is found on Barium Bands. It can be placed onto tools.\n\nHigher levels of Haste are awarded for lower durability (percentage-based).\n\nThe maximum level of Haste is IV." } ] ] } ] } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/item_modifier/update_netherite.json ================================================ { "function": "minecraft:set_custom_data", "tag": "{gm4_audere_shamir:{max_durability:2031}}" } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_audere_shamir:shamir/audere"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'audere'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.audere", "fallback": "Audere Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/predicate/holding_audere.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_audere_shamir:valid_items", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'audere'}}" } } } } } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/predicate/holding_netherite.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_audere_shamir:netherite_tools" } } } } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/tags/item/netherite_tools.json ================================================ { "values": [ "minecraft:netherite_shovel", "minecraft:netherite_pickaxe", "minecraft:netherite_hoe", "minecraft:netherite_axe" ] } ================================================ FILE: gm4_audere_shamir/data/gm4_audere_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:axes", "#minecraft:pickaxes", "#minecraft:shovels", "#minecraft:hoes", "minecraft:shears" ] } ================================================ FILE: gm4_audere_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_audere_shamir:check_item_validity" ] } ================================================ FILE: gm4_audere_shamir/data/gm4_metallurgy/tags/function/summon_band/barium.json ================================================ { "values":[ "gm4_audere_shamir:summon_band" ] } ================================================ FILE: gm4_audere_shamir/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_audere_shamir:temp/player/tool] to struct { SelectedItem?: ItemStack, } ================================================ FILE: gm4_audere_shamir/translations.csv ================================================ key,en_us item.gm4.shamir.audere,Audere Shamir text.gm4.guidebook.module_desc.audere_shamir,Adds the shamir 'Audere' to Metallurgy. Gain Haste with low durability tools. text.gm4.guidebook.audere_shamir.description,"Audere buffs mining speed, as durability decreases." text.gm4.guidebook.audere_shamir.usage,The Audere Shamir is found on Barium Bands. It can be placed onto tools.\n\nHigher levels of Haste are awarded for lower durability (percentage-based).\n\nThe maximum level of Haste is IV. ================================================ FILE: gm4_balloon_animals/README.md ================================================ # Balloon Animals Wandering traders needed more pizazz, so now they trade other types of animals! ### Features - Wandering Traders now have a chance of trading live animals in their trade list. - Instead of having llamas follow them, Wandering Traders now can randomly have other mobs - When buying an animal, it will slowly float down from a collection being dragged along by the trader ================================================ FILE: gm4_balloon_animals/animals.csv ================================================ type,id,rare,function,names Cow,minecraft:cow,FALSE,init_farm,"Abigail,Beef,Belle,Bessie,Clarabell,Delilah,Duchess,Maggie,Moo,Wellington,Wendy" Pig,minecraft:pig,FALSE,init_farm,"Bacon,Betty,Hamm,Hoagie,Piglet,Pua,Pumbaa,Sharla,Swinton" Sheep,minecraft:sheep,FALSE,init_animal,"Baabra,Bellwether,Blackie,Doug,Gruff,Lamb,Lambie,Sheera,Woolensworth,Woolter" Horse,minecraft:horse,FALSE,init_animal,"Achilles,Buck,Bullseye,Galahad,Khan,Lancelot,Major,Maximus,Pearl,Shadow" Rabbit,minecraft:rabbit,FALSE,init_animal,"Berry,Bouncy,Bushy,Clover,Houdini,Jack,Judy,March,Nibbles,Oswald,Roger,Squirt,Thumper" Wolf,minecraft:wolf,FALSE,init_wolf,"Beast,Bolt,Briar,Bruno,Buddy,Duke,Fenrir,Maugrim,Wolfie,Wolfsbane" Llama,minecraft:llama,FALSE,init_animal,"Andes,Carl,Carlos,Flower,Kuzco,Paul,Roxy,Ruby,Wendy" Frog,minecraft:frog,FALSE,init_animal,"Carlos,Croaker,Croaky,Flizard,Frankie,Frogini,Garko,Kermit,Naveen,Ribbiton,Sylvia,Stumpy,Tiana,Toadie" Bee,minecraft:bee,FALSE,add_bee_nest, Chicken,minecraft:chicken,FALSE,add_chicken_egg, Fox,minecraft:fox,TRUE,init_animal,"Astuto,Bhati,Fergus,Foxy,Frida,Marian,Nick,Vixen,Vixey,Robin,Sproingo,Tod,Whiskers,Zuzo" Parrot,minecraft:parrot,TRUE,init_animal,"Barker,Beaks,Duncan,Fritz,Iago,Jose,Michael,Pedro,Pierre,Peghook,Polly,Skully,Talon" Donkey,minecraft:donkey,TRUE,init_animal,"Alexander,Dapple,Duchess,Eeyore,Jack,Lampwick" Panda,minecraft:panda,TRUE,init_animal,"Chen,Dopey,Dumpling,Helen,Kai,Lily,Mei,Ping,Po,Thunder" Camel,minecraft:camel,TRUE,init_animal,"Camelot,Camille,Cammy,Caramel,Eden,Jacchus,Kennedy,Mirage,Sarah" Goat,minecraft:goat,TRUE,init_animal,"Bill,Billy,Djali,Gertrude,Gideon,Joe,Joey,Kid,Phil,Philoctetes,Valentino" Ocelot,minecraft:ocelot,TRUE,init_animal,"Catnip,Clawhauser,Dinah,Felicia,Figaro,Hissy,Jagular,Lucifer,Tallulah" Armadillo,minecraft:armadillo,TRUE,init_animal,"Annette,Dave,Dharma,Lari,Mighty,Poly,Roly,Tuk-tuk" Turtle,minecraft:turtle,TRUE,add_turtle_egg, ================================================ FILE: gm4_balloon_animals/beet.yaml ================================================ id: gm4_balloon_animals name: Balloon Animals version: 1.4.X data_pack: load: . pipeline: - gm4_balloon_animals.generate - gm4.plugins.extend.module require: - bolt meta: gm4: versioning: schedule_loops: [main] website: description: Looking for exotic animals? This module makes some Wandering Traders sell cute baby animals! modrinth: project_id: zKRZZHQ3 wiki: https://wiki.gm4.co/wiki/Balloon_Animals credits: Creator: - TheEpyonProject Icon Design: - Hozz model_data: - item: lead reference: gui/advancement/balloon_animals template: name: advancement forward: minecraft:item/lead ================================================ FILE: gm4_balloon_animals/data/gm4/advancement/balloon_animals.json ================================================ { "display": { "icon": { "id": "lead", "components": { "minecraft:custom_model_data": {"strings":["gm4_balloon_animals:gui/advancement/balloon_animals"]} } }, "title": { "translate": "advancement.gm4.balloon_animals.title", "fallback": "Party Animals" }, "description": { "translate": "advancement.gm4.balloon_animals.description", "fallback": "Buy a Balloon Animal from a Wandering Trader", "color": "gray" } }, "parent": "gm4:root", "criteria": { "balloon_animals": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/advancement/purchased_animal.json ================================================ { "criteria": { "primary_animal": { "trigger": "minecraft:villager_trade", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_balloon_animals:{trade:1b}}" } } } }, "secondary_animal": { "trigger": "minecraft:villager_trade", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_balloon_animals:{trade:2b}}" } } } } }, "requirements": [ [ "primary_animal", "secondary_animal" ] ], "rewards": { "function": "gm4_balloon_animals:purchased_animal" } } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/check_leashed.mcfunction ================================================ # @s = animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased # at world spawn # run from main execute store success score $leashed gm4_balloon_animals_data if data entity @s leash execute if score $leashed gm4_balloon_animals_data matches 1 store success score $leashed gm4_balloon_animals_data on leasher if entity @s[type=wandering_trader] execute if score $leashed gm4_balloon_animals_data matches 0 run function gm4_balloon_animals:balloon/fly_away/start_animation # prevent aging data modify entity @s Age set value -2147483648 # clean up scoreboard players reset $leashed gm4_balloon_animals_data ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/animate.mcfunction ================================================ # @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased # run from balloon/fly_away/loop scoreboard players add @s gm4_balloon_animals_data 1 effect give @s[scores={gm4_balloon_animals_data=1}] levitation infinite 3 effect give @s[scores={gm4_balloon_animals_data=2}] levitation infinite 7 effect give @s[scores={gm4_balloon_animals_data=3}] levitation infinite 15 effect give @s[scores={gm4_balloon_animals_data=4..}] levitation infinite 31 execute if entity @s[scores={gm4_balloon_animals_data=4..}] at @s run function gm4_balloon_animals:balloon/kill_orphan ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/loop.mcfunction ================================================ # @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased # run from balloon/fly_away/start_animation execute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_fly_away] run function gm4_balloon_animals:balloon/fly_away/animate execute if entity @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_fly_away,limit=1] run schedule function gm4_balloon_animals:balloon/fly_away/loop 16t ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/fly_away/start_animation.mcfunction ================================================ # @s = orphaned animal, tag=gm4_balloon_animal,tag=gm4_balloon_animal_purchased # run from balloon/check_leashed scoreboard players set @s gm4_balloon_animals_data 0 tag @s add gm4_balloon_animal_fly_away schedule function gm4_balloon_animals:balloon/fly_away/loop 16t ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/balloon/kill_orphan.mcfunction ================================================ # @s = orphaned animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased # at @s # run from balloon/fly_away/animate particle poof ~ ~ ~ 0 0 0 0.1 10 tp @s ~ ~-4096 ~ kill @s ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/debug/init_trader.mcfunction ================================================ # Initializes and saves trader data # run from debug/summon_trader_with_llamas data modify entity @s DespawnDelay set value 48000 data modify storage gm4_balloon_animals:temp trader.uuid set from entity @s UUID ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/debug/summon_trader_with_llamas.mcfunction ================================================ # summons wandering trader with 2 llamas, as if it were a natural trader # run manually execute summon wandering_trader run function gm4_balloon_animals:debug/init_trader execute summon trader_llama run data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid execute summon trader_llama run data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/init.mcfunction ================================================ scoreboard objectives add gm4_balloon_animals_data dummy scoreboard objectives add gm4_balloon_animals_id dummy execute unless score balloon_animals gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Balloon Animals"} execute unless score balloon_animals gm4_earliest_version < balloon_animals gm4_modules run scoreboard players operation balloon_animals gm4_earliest_version = balloon_animals gm4_modules scoreboard players set balloon_animals gm4_modules 1 schedule function gm4_balloon_animals:main 1t ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/main.mcfunction ================================================ execute as @e[type=minecraft:wandering_trader,tag=!gm4_balloon_animal_eligible_ignore,tag=!smithed.entity] at @s run function gm4_balloon_animals:wandering_trader/check_eligibility execute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased] run function gm4_balloon_animals:balloon/check_leashed schedule function gm4_balloon_animals:main 4s ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/cleanse.mcfunction ================================================ # Removes effects that protected and kept afloat the balloon animal # @s = newly purchased balloon animal, tag=gm4_balloon_animal_purchased,tag=gm4_balloon_animal_newly_purchased # at world spawn # run from purchase/animal/locate_cleanse tag @s remove gm4_balloon_animal_newly_purchased # remove balloon effects effect clear @s levitation effect clear @s slow_falling effect clear @s resistance # temporary protection effect give @s slow_falling 5 effect give @s resistance 5 4 # allow aging data modify entity @s Age set value -12000 ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/locate_cleanse.mcfunction ================================================ # Delayed activation of cleansing newly purchased animals # at world spawn # scheduled by purchase/animal/update execute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal_newly_purchased] run function gm4_balloon_animals:purchase/animal/cleanse ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/search.mcfunction ================================================ # Searches through unpurchased balloon animals for the one that matches the id of the recently purchased animal # @s = a random animal, tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased # at wandering trader, player just traded with # run from purchase/trader/check_trade # load animal score id execute store result score $id gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp temp_source[-1].sell.components."minecraft:custom_data".gm4_balloon_animals.id # checks all unpurchased balloon animals, if their id matches the recently purchased one then continue execute as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased] if score @s gm4_balloon_animals_id = $id gm4_balloon_animals_data run function gm4_balloon_animals:purchase/animal/update # if animal not found, refund player (in purchased_animal) execute unless score $trade_success gm4_balloon_animals_data matches 1 run playsound entity.villager.no neutral @a[distance=..8] ~ ~ ~ ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/animal/update.mcfunction ================================================ # Tag and complete the ownership of the purchased balloon animal to the player # @s = purchased balloon animal # at wandering trader, player just traded with # run from purchase/animal/search tag @s add gm4_balloon_animal_purchased scoreboard players set $trade_success gm4_balloon_animals_data 1 # switch the leasher from the trader to the player data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp player.uuid # don't know why but having all of these in one file prevents the above line from working properly tag @s add gm4_balloon_animal_newly_purchased schedule function gm4_balloon_animals:purchase/animal/locate_cleanse 10t ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/check_trade.mcfunction ================================================ # Checks the uses count for a specific gm4_balloon_animal trade # @s = wandering trader, tag=gm4_balloon_animal_trader # at player # run from purchase/trades/parse_trades execute store result score $uses gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp temp_source[-1].uses # if uses and maxUses matches, this is the trade we are looking for. # continue with searching for purchased animal, reposition to trader for playsound execute if score $uses gm4_balloon_animals_data matches 1 at @s as @e[type=#gm4_balloon_animals:balloon_animal,tag=gm4_balloon_animal,tag=!gm4_balloon_animal_purchased,limit=1] run function gm4_balloon_animals:purchase/animal/search # update the trade as processed execute if score $uses gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:purchase/trader/update_trade # Typically balloon animal trades' uses will be 0 or 2. # The maxUses is 1, but we can set any value including higher ones. # If the uses is 0, we know that it has not been purchased, # but if uses is 1, we can set the value higher after checking, # which guarantees us that trades with a uses of 1 are the specific trade we are looking for ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/parse_trades.mcfunction ================================================ # Checks each trader's trade for a gm4_balloon_animals.trade nbt # @s = random wandering trader, tag=gm4_balloon_animal_trader # at player # run from purchase/trades/search and self data modify storage gm4_balloon_animals:temp temp_source append from storage gm4_balloon_animals:temp trades[0] data remove storage gm4_balloon_animals:temp trades[0] # if current trade is a balloon animal trade, check if it is the one we are looking for execute store success score $trade_applicable gm4_balloon_animals_data if data storage gm4_balloon_animals:temp temp_source[-1].sell.components."minecraft:custom_data".gm4_balloon_animals.trade execute if score $trade_applicable gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:purchase/trader/check_trade # if any remaining trades, continue looping execute store result score $trade_count gm4_balloon_animals_data run data get storage gm4_balloon_animals:temp trades execute if score $trade_found gm4_balloon_animals_data matches 0 if score $trade_count gm4_balloon_animals_data matches 1.. run function gm4_balloon_animals:purchase/trader/parse_trades ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/search.mcfunction ================================================ # Search through traders' trades to find the trade that activated the advancement # @s = wandering trader, tag=gm4_balloon_animal_trader, initially nearest # at player # run from purchased_animal or self # reset end values scoreboard players set $trade_found gm4_balloon_animals_data 0 data remove storage gm4_balloon_animals:temp temp_source # load trades, prepare for search data modify storage gm4_balloon_animals:temp trades set from entity @s Offers.Recipes function gm4_balloon_animals:purchase/trader/parse_trades tag @s add gm4_balloon_animal_trader_processed # if not the trader we are looking for, loop unprocessed traders execute if score $trade_found gm4_balloon_animals_data matches 0 as @e[type=wandering_trader,tag=!smithed.entity,tag=gm4_balloon_animal_trader,tag=!gm4_balloon_animal_trader_processed,limit=1] run function gm4_balloon_animals:purchase/trader/search ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchase/trader/update_trade.mcfunction ================================================ # Update the uses count for balloon animal trader's trade # @s = wandering trader, tag=gm4_balloon_animal_trader # at player # run from purchase/trades/check_trade # update trade, such that uses (2) > maxUses (1) data modify storage gm4_balloon_animals:temp temp_source[-1].uses set value 2 # update trader with the updated trade data modify storage gm4_balloon_animals:temp temp_source append from storage gm4_balloon_animals:temp trades[] data modify entity @s Offers.Recipes set from storage gm4_balloon_animals:temp temp_source ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/purchased_animal.mcfunction ================================================ # Granted upon purchasing a balloon animal from a wandering trader # @s = trading player # at @s # run from advancement purchased_animal scoreboard players reset $trade_success gm4_balloon_animals_data data modify storage gm4_balloon_animals:temp player.uuid set from entity @s UUID # locate trader execute as @e[type=wandering_trader,tag=gm4_balloon_animal_trader,limit=1,sort=nearest] run function gm4_balloon_animals:purchase/trader/search execute if score $trade_success gm4_balloon_animals_data matches 1 run advancement grant @s only gm4:balloon_animals execute unless score $trade_success gm4_balloon_animals_data matches 1 run give @s emerald 12 # clean up advancement revoke @s only gm4_balloon_animals:purchased_animal clear @s lead[custom_data~{gm4_balloon_animals:{trade:1b}}|custom_data~{gm4_balloon_animals:{trade:2b}}] scoreboard players reset $trade_applicable gm4_balloon_animals_data scoreboard players reset $trade_count gm4_balloon_animals_data scoreboard players reset $uses gm4_balloon_animals_data tag @e[type=wandering_trader,tag=gm4_balloon_animal_trader_processed] remove gm4_balloon_animal_trader_processed ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/check_eligibility.mcfunction ================================================ # @s = a wandering trader # at @s # run from gm4_balloon_animals:main # ensure that this wandering trader is not checked again tag @s add gm4_balloon_animal_eligible_ignore execute unless predicate gm4_balloon_animals:balloon_trader_chance run return 0 # must have 2 llamas leashed scoreboard players set $trader_llama_count gm4_balloon_animals_data 0 tag @s add gm4_balloon_animal_trader_eligible_check execute as @e[type=trader_llama,tag=!smithed.entity,distance=..6] on leasher if entity @s[tag=gm4_balloon_animal_trader_eligible_check] run scoreboard players add $trader_llama_count gm4_balloon_animals_data 1 tag @s remove gm4_balloon_animal_trader_eligible_check execute unless score $trader_llama_count gm4_balloon_animals_data matches 2 run return 0 scoreboard players reset $trader_llama_count gm4_balloon_animals_data data modify storage gm4_balloon_animals:temp trader.uuid set from entity @s UUID function gm4_balloon_animals:wandering_trader/init_trader ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/init_trader.mcfunction ================================================ # @s = a wandering trader with exactly 2 trader llamas # at @s # run from wandering_trader/check_eligibility # mark that this trader was modified tag @s add gm4_balloon_animal_trader # find leashed llamas tag @s add gm4_balloon_animal_trader_new execute as @e[type=trader_llama,tag=!smithed.entity,distance=..6] run function gm4_balloon_animals:wandering_trader/llama/check_leasher tag @s remove gm4_balloon_animal_trader_new # pick two animals and set up trades function gm4_balloon_animals:wandering_trader/pick_two_animals ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/check_leasher.mcfunction ================================================ # Checks that this trader llama is attached to the wandering trader that is being checked # @s = a llama within 6 blocks of the wandering trader being checked # at @s # run from wandering_trader/init_trader execute store result score $trader_llama_check gm4_balloon_animals_data on leasher if entity @s[tag=gm4_balloon_animal_trader_new] execute if score $trader_llama_check gm4_balloon_animals_data matches 1 run function gm4_balloon_animals:wandering_trader/llama/kill scoreboard players reset $trader_llama_check gm4_balloon_animals_data ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/delay/find_lead.mcfunction ================================================ # @s = marker, tag=gm4_balloon_animal_item_cleanup # at @s # run from wandering_trader/llama/delay/lead_cleanup kill @e[type=item,distance=..5,nbt={Age:1s},limit=2] kill @s ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/delay/lead_cleanup.mcfunction ================================================ # Look for gm4_balloon_animal_item_cleanup markers # at world spawn # scheduled by wandering_trader/llama/kill execute as @e[type=marker,tag=gm4_balloon_animal_item_cleanup] at @s run function gm4_balloon_animals:wandering_trader/llama/delay/find_lead ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/llama/kill.mcfunction ================================================ # @s = a llama within 6 blocks of the wandering trader being checked # at @s # run from wandering_trader/llama/check_leasher execute on leasher at @s unless entity @e[type=marker,tag=gm4_balloon_animal_item_cleanup,distance=..0.01,limit=1] summon marker run tag @s add gm4_balloon_animal_item_cleanup tp @s ~ ~-4096 ~ kill @s schedule function gm4_balloon_animals:wandering_trader/llama/delay/lead_cleanup 1t ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/pick_two_animals.mcfunction ================================================ # @s = a wandering trader with no trader llamas, tag=gm4_balloon_animal_trader # at @s # run from wandering_trader/init_trader data modify storage gm4_balloon_animals:temp gm4_balloon_animals set value {trade:1b} function gm4_balloon_animals:wandering_trader/trade/pick_animal data modify storage gm4_balloon_animals:temp gm4_balloon_animals set value {trade:2b} function gm4_balloon_animals:wandering_trader/trade/pick_animal ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_bee_nest.mcfunction ================================================ # @s = wandering trader # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal data modify storage gm4_balloon_animals:temp trade set value {buy:{id:"minecraft:emerald",count:8},sell:{id:"minecraft:bee_nest",components:{"minecraft:bees":[{entity_data:{id:"minecraft:bee"},ticks_in_hive:0,min_ticks_in_hive:0}]}},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f} ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_chicken_egg.mcfunction ================================================ # @s = wandering trader # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal data modify storage gm4_balloon_animals:temp trade set value {buy:{id:"minecraft:emerald",count:2},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f} execute store result score $variant_id gm4_balloon_animals_data run random value 0..2 execute if score $variant_id gm4_balloon_animals_data matches 0 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:"minecraft:egg",count:8} execute if score $variant_id gm4_balloon_animals_data matches 1 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:"minecraft:blue_egg",count:8} execute if score $variant_id gm4_balloon_animals_data matches 2 run data modify storage gm4_balloon_animals:temp trade.sell set value {id:"minecraft:brown_egg",count:8} ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_lead.mcfunction ================================================ # @s = animal to be attached to trader # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/init_[animal|wolf|farm] data modify storage gm4_balloon_animals:temp trade set value {buy:{id:"minecraft:emerald",count:12},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f} loot spawn ~ -4096 ~ loot gm4_balloon_animals:lead execute positioned ~ -4096 ~ run data modify storage gm4_balloon_animals:temp trade.sell set from entity @e[type=item,predicate=gm4_balloon_animals:is_lead,distance=..1,limit=1] Item execute positioned ~ -4096 ~ run kill @e[type=item,predicate=gm4_balloon_animals:is_lead,distance=..1,limit=1] data modify entity @s CustomName set from storage gm4_balloon_animals:temp trade.sell.components."minecraft:lore"[0].text ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/add_turtle_egg.mcfunction ================================================ # @s = wandering trader # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal data modify storage gm4_balloon_animals:temp trade set value {buy:{id:"minecraft:emerald",count:8},sell:{id:"minecraft:turtle_egg",count:1},maxUses:1,rewardExp:1b,xp:1,priceMultiplier:0.05f} ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_animal.mcfunction ================================================ # @s = animal to be attached to trader, type=#gm4_balloon_animals:balloon_animal # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal tag @s add gm4_balloon_animal effect give @s levitation infinite 0 true effect give @s slow_falling infinite 0 true effect give @s resistance infinite 4 true data modify entity @s Age set value -2147483648 data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid execute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1 execute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id function gm4_balloon_animals:wandering_trader/trade/add_lead ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_farm.mcfunction ================================================ # @s = farm animal to be attached to trader, type=#gm4_balloon_animals:balloon_animal # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal tag @s add gm4_balloon_animal effect give @s levitation infinite 0 true effect give @s slow_falling infinite 0 true effect give @s resistance infinite 4 true data modify entity @s Age set value -2147483648 data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid execute store result score $variant_id gm4_balloon_animals_data run random value 0..2 execute if score $variant_id gm4_balloon_animals_data matches 0 run data modify entity @s variant set value "minecraft:warm" execute if score $variant_id gm4_balloon_animals_data matches 1 run data modify entity @s variant set value "minecraft:temperate" execute if score $variant_id gm4_balloon_animals_data matches 2 run data modify entity @s variant set value "minecraft:cold" execute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1 execute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id function gm4_balloon_animals:wandering_trader/trade/add_lead ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/init_wolf.mcfunction ================================================ # @s = wolf to be attached to trader, type=#gm4_balloon_animals:balloon_animal # at wandering trader with no llamas, tag=gm4_balloon_animal_trader # run from wandering_trader/trade/pick_animal tag @s add gm4_balloon_animal effect give @s levitation infinite 0 true effect give @s slow_falling infinite 0 true effect give @s resistance infinite 4 true data modify entity @s Age set value -2147483648 data modify entity @s leash.UUID set from storage gm4_balloon_animals:temp trader.uuid execute store result score $variant_id gm4_balloon_animals_data run random value 0..8 execute if score $variant_id gm4_balloon_animals_data matches 0 run data modify entity @s variant set value "minecraft:pale" execute if score $variant_id gm4_balloon_animals_data matches 1 run data modify entity @s variant set value "minecraft:ashen" execute if score $variant_id gm4_balloon_animals_data matches 2 run data modify entity @s variant set value "minecraft:black" execute if score $variant_id gm4_balloon_animals_data matches 3 run data modify entity @s variant set value "minecraft:chestnut" execute if score $variant_id gm4_balloon_animals_data matches 4 run data modify entity @s variant set value "minecraft:rusty" execute if score $variant_id gm4_balloon_animals_data matches 5 run data modify entity @s variant set value "minecraft:snowy" execute if score $variant_id gm4_balloon_animals_data matches 6 run data modify entity @s variant set value "minecraft:spotted" execute if score $variant_id gm4_balloon_animals_data matches 7 run data modify entity @s variant set value "minecraft:striped" execute if score $variant_id gm4_balloon_animals_data matches 7 run data modify entity @s variant set value "minecraft:woods" execute store result score @s gm4_balloon_animals_id run scoreboard players add $id gm4_balloon_animals_id 1 execute store result storage gm4_balloon_animals:temp gm4_balloon_animals.id int 1 run scoreboard players get $id gm4_balloon_animals_id function gm4_balloon_animals:wandering_trader/trade/add_lead ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/function/wandering_trader/trade/pick_animal.mcfunction ================================================ # @s = wandering trader and no trader llamas, tag=gm4_balloon_animal_trader # at @s # run from wandering_trader/pick_two_animals execute store result score $animal_id gm4_balloon_animals_data run loot spawn ~ ~-4096 ~ loot gm4_balloon_animals:technical/random/enumeration_value for animal in ctx.meta['animals']: if animal['function'] not in ['init_animal', 'init_wolf','init_farm']: execute if score $animal_id gm4_balloon_animals_data matches ctx.meta['enumeration'].index(animal['id']) run function f"gm4_balloon_animals:wandering_trader/trade/{animal['function']}" continue execute if score $animal_id gm4_balloon_animals_data matches ctx.meta['enumeration'].index(animal['id']) summon animal['id'] run function f"gm4_balloon_animals:wandering_trader/trade/{animal['function']}" data modify entity @s Offers.Recipes append from storage gm4_balloon_animals:temp trade data remove storage gm4_balloon_animals:temp trade ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/guidebook/balloon_animals.json ================================================ { "id": "balloon_animals", "name": "Balloon Animals", "module_type": "module", "icon": { "id": "minecraft:lead" }, "criteria": { "interact_trader": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_balloon_animal_trader\"]}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "interact_trader" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.balloon_animals.description", "fallback": "Balloon Animals introduces animal trades to some wandering traders." } ] ] } ] } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/loot_table/lead.json ================================================ entries = [] for animal in ctx.meta['animals']: if animal['function'] not in ["init_animal", "init_wolf", "init_farm"]: continue for name in map(str.strip, animal['names'].split(',')): entries.append( { "type": "minecraft:item", "name": "minecraft:lead", "functions": [ { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_balloon_animals:temp" }, "ops": [ { "source": "gm4_balloon_animals", "target": "gm4_balloon_animals", "op": "merge" } ] }, { "function": "minecraft:set_name", "entity": "this", "target": "item_name", "name": animal['type'] }, { "function": "minecraft:set_lore", "entity": "this", "lore": [ { "text": name, "color": "gray" } ], "mode": "replace_all" } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$animal_id" }, "score": "gm4_balloon_animals_data" }, "range": ctx.meta['enumeration'].index(animal['id']) } ] } ) { "pools": [ { "rolls": 1, "entries": entries } ] } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/enumeration_value.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "weight": 3, "value": "gm4_balloon_animals:technical/random/pick_common" }, { "type": "minecraft:loot_table", "weight": 7, "value": "gm4_balloon_animals:technical/random/pick_rare" } ] } ] } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/pick_common.json ================================================ { "pools": [ { "rolls": { "min": 0, "max": int(f"{ctx.meta['rare_start']-1}") }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/loot_table/technical/random/pick_rare.json ================================================ { "pools": [ { "rolls": { "min": ctx.meta['rare_start'], "max": int(f"{len(ctx.meta['enumeration'])-1}") }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/predicate/balloon_trader_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/predicate/is_lead.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:lead", "predicates": { "minecraft:custom_data": "{gm4_balloon_animals:{}}" } } } } } ================================================ FILE: gm4_balloon_animals/data/gm4_balloon_animals/tags/entity_type/balloon_animal.json ================================================ animals_list = [] for animal in ctx.meta['animals']: animals_list.append(f"{animal['id']}",) { "values": sorted(animals_list) } ================================================ FILE: gm4_balloon_animals/generate.py ================================================ from pathlib import Path from typing import List from beet import Context from gm4.utils import CSV def beet_default(ctx: Context): # read csv file animals = CSV.from_file(Path('gm4_balloon_animals','animals.csv')) # sort animals into a common and a rare group rare_animals: List[str] = [] common_animals: List[str] = [] for animal in animals: if animal['rare'] == "TRUE": rare_animals.append(str(animal['id'])) continue common_animals.append(str(animal['id'])) # sort each group alphabetically to ensure .csv-independent id assignments rare_animals.sort() common_animals.sort() # store to meta ctx.meta['animals'] = animals ctx.meta['enumeration'] = [*common_animals, *rare_animals] ctx.meta['rare_start'] = len(common_animals) ================================================ FILE: gm4_balloon_animals/mod.mcdoc ================================================ use ::java::world::entity::mob::breedable::villager::Recipe dispatch minecraft:storage[gm4_balloon_animals:temp] to struct { player?: struct { uuid: #[uuid] int[] @ 4, }, trader?: struct { uuid: #[uuid] int[] @ 4, }, temp_source?: [Recipe], trades?: [Recipe], trade?: Recipe, gm4_balloon_animals?: BalloonAnimalsData, } dispatch mcdoc:custom_data[gm4_balloon_animals] to struct BalloonAnimalsData { trade?: byte, id?: int, } ================================================ FILE: gm4_balloon_animals/translations.csv ================================================ key,en_us advancement.gm4.balloon_animals.title,Party Animals advancement.gm4.balloon_animals.description,Buy a Balloon Animal from a Wandering Trader text.gm4.guidebook.module_desc.balloon_animals,Looking for exotic animals? This module makes some Wandering Traders sell cute baby animals! text.gm4.guidebook.balloon_animals.description,Balloon Animals introduces animal trades to some wandering traders. ================================================ FILE: gm4_bat_grenades/README.md ================================================ # Bat Grenades Tired of the uselessness of bats? Need something to spice up your caving adventures? This modular data pack kills those two birds, er bats, with one stone, and turns bats into tiny furry flying balls of boom! ### Features - Bats that fly within 7 blocks of a player squeak a warning, and explode if they get within 3 blocks of the player. - Bats explode with about 1/3 the strength of a creeper, easily survivable except on low health. - Adds a custom advancement obtainable for that unlucky soul who dies via bat. - Bats, if you manage to kill them, drop a few pieces of gunpowder. ================================================ FILE: gm4_bat_grenades/assets/translations.csv ================================================ key,en_us,de_de item.gm4.bat_leather,Bat Leather,Fledermausleder text.gm4.bat_leather.1,"Would make for a very strange,","Würde eine ziemlich merkwürde," text.gm4.bat_leather.2,very tiny jacket,ziemlich kleine Jacke ergeben advancement.gm4.bat_grenades.title,Batboozled, advancement.gm4.bat_grenades.description,Get blown up by a Bat Grenade, text.gm4.guidebook.module_desc.bat_grenades,Tired of the uselessness of bats? This module will turn them into tiny furry flying balls of boom!, text.gm4.guidebook.bat_grenades.description,"Bats create a weak explosion when nearby.\n\nWhen killed, bats will drop gunpowder and bat leather—a material equivalent to rabbit hide.", ================================================ FILE: gm4_bat_grenades/beet.yaml ================================================ id: gm4_bat_grenades name: Bat Grenades version: 1.7.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Tired of the uselessness of bats? This module will turn them into tiny furry flying balls of boom! recommended: - gm4_enderman_support_class - gm4_metallurgy notes: - Modifies the bat loot table. May cause incompatibilities with Datapacks that also modify this loot table. modrinth: project_id: qWQqEQMY smithed: pack_id: gm4_bat_grenades planetminecraft: uid: 4293806 video: https://www.youtube.com/watch?v=uUoEKtte1GQ wiki: https://wiki.gm4.co/wiki/Bat_Grenades credits: Creator: - Sparks Icon Design: - Sparks model_data: - item: rabbit_hide reference: item/bat_leather template: generated - item: gunpowder reference: gui/advancement/bat_grenades template: name: advancement forward: item/bat_leather ================================================ FILE: gm4_bat_grenades/data/gm4/advancement/bat_grenades.json ================================================ { "display": { "icon": { "id": "gunpowder", "components": { "minecraft:custom_model_data": {"strings":["gm4_bat_grenades:gui/advancement/bat_grenades"]} } }, "title": { "translate": "advancement.gm4.bat_grenades.title", "fallback": "Batboozled" }, "description": { "translate": "advancement.gm4.bat_grenades.description", "fallback": "Get blown up by a Bat Grenade", "color": "gray" } }, "parent": "gm4:root", "criteria": { "killed_by_bat": { "trigger": "minecraft:entity_killed_player", "conditions": { "entity": { "type": "creeper", "nbt": "{Tags:[\"gm4_bat_grenade\"]}" } } } } } ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/function/explode.mcfunction ================================================ summon creeper ~ ~ ~ {CustomName:{"translate": "entity.minecraft.bat"},ExplosionRadius:1b,ignited:1b,Fuse:0s,Tags:["gm4_bat_grenade"]} teleport @s ~ -1000 ~ data merge entity @s {DeathTime:19,Health:0.0f} ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/function/init.mcfunction ================================================ execute unless score bat_grenades gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Bat Grenades"} execute unless score bat_grenades gm4_earliest_version < bat_grenades gm4_modules run scoreboard players operation bat_grenades gm4_earliest_version = bat_grenades gm4_modules scoreboard players set bat_grenades gm4_modules 1 schedule function gm4_bat_grenades:main 1t #$moduleUpdateList ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/function/main.mcfunction ================================================ execute at @e[type=bat,tag=!gm4_defused_bat,tag=!smithed.entity] run playsound minecraft:entity.bat.ambient hostile @a[gamemode=!creative,gamemode=!spectator,distance=..7] execute as @e[type=bat,tag=!gm4_defused_bat,tag=!smithed.entity] at @s if entity @a[gamemode=!creative,gamemode=!spectator,distance=..3] unless entity @s[nbt={NoAI:1b}] run function gm4_bat_grenades:explode schedule function gm4_bat_grenades:main 16t ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/guidebook/bat_grenades.json ================================================ { "id": "bat_grenades", "name": "Bat Grenades", "module_type": "module", "icon": { "id": "minecraft:gunpowder" }, "criteria": { "hurt_by_exploding_bat": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "source_entity": { "type": "minecraft:creeper", "nbt": "{Tags:[\"gm4_bat_grenade\"]}" } } } } }, "sections": [ { "name": "bat_explosions", "enable": [], "requirements": [ [ "hurt_by_exploding_bat" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.bat_grenades.description", "fallback": "Bats create a weak explosion when nearby.\n\nWhen killed, bats will drop gunpowder and bat leather—a material equivalent to rabbit hide." } ] ] } ] } ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/loot_table/items/bat_leather.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:rabbit_hide", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_bat_grenades:item/bat_leather"]} } }, { "function": "set_name", "target": "item_name", "name": { "translate": "item.gm4.bat_leather", "fallback": "Bat Leather" } }, { "function": "set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.bat_leather.1", "fallback": "Would make for a very strange,", "italic": true, "color": "dark_gray" }, { "translate": "text.gm4.bat_leather.2", "fallback": "very tiny jacket", "italic": true, "color": "dark_gray" } ] } ] } ] } ] } ================================================ FILE: gm4_bat_grenades/data/gm4_bat_grenades/test/boom.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~1 # @timeout 200 summon bat ~1 ~2 ~1 {Tags:[gm4_test_bat]} await not entity @e[tag=gm4_test_bat,dx=2,dy=2,dz=2] ================================================ FILE: gm4_bat_grenades/data/minecraft/loot_table/entities/bat.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:gunpowder", "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_bat_grenades:items/bat_leather", "weight": 1 }, { "type": "empty", "weight": 5 } ] } ], "random_sequence": "minecraft:entities/bat", "__smithed__": { "rules": [ { "type": "smithed:append", "target": "pools", "source": { "type": "smithed:reference", "path": "pools[0]" } }, { "type": "smithed:append", "target": "pools", "source": { "type": "smithed:reference", "path": "pools[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_better_armour_stands/README.md ================================================ # Better Armour Stands Ever felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands. Better Armour Stands Example ### Features - All armour stands have arms by default - Write commands into a Book and Quill to control your armour stands - [Click Here](https://wiki.gm4.co/wiki/Better_Armour_Stands#Codes) to see a full list of codes - Copy and Paste poses - Make custom statues - Survival Friendly! ### Posing Codes |Code |Description | | :---: |-----------------------------------------------| |`arms` |toggle arm visibility | |`base` |toggle base-plate visibility | |`size` |toggle small/tall size | |`gravity` |toggle gravity | |`visible` |toggle invisibility | |`turn` |slowly spin right or left | |`lock` |disable interactions | |`unlock` |enable interactions | |`pose` |select and move body parts | |`default` |restore the default pose | |`copy` |copies pose to armour stand in offhand | |`paste` |pastes pose from armour stand in offhand | |`equip` |transfer player offhand to selected body part | ### Expansion Packs Want some preset poses? Download the [Poses Pack Expansion]($dynamicLink:gm4_poses_pack) Add particles to your builds with the [Particles Pack Expansion]($dynamicLink:gm4_particles_pack) ================================================ FILE: gm4_better_armour_stands/beet.yaml ================================================ id: gm4_better_armour_stands name: Better Armour Stands version: 2.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick website: description: Ever felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands. recommended: - gm4_poses_pack - gm4_particles_pack notes: [] modrinth: project_id: ib7YfS5V smithed: pack_id: gm4_better_armour_stands video: https://www.youtube.com/watch?v=ZBqmGpAXqmw wiki: https://wiki.gm4.co/wiki/Better_Armour_Stands credits: Creator: - Sparks Updated by: - SpecialBuilder32 - Misode - Denniss Icon Design: - Sparks model_data: - item: armor_stand reference: gui/advancement/better_armour_stands template: advancement ================================================ FILE: gm4_better_armour_stands/data/gm4/advancement/better_armour_stands.json ================================================ { "display": { "icon": { "id": "armor_stand", "components": { "minecraft:custom_model_data": {"strings":["gm4_better_armour_stands:gui/advancement/better_armour_stands"]} } }, "title": { "translate": "advancement.gm4.better_armour_stands.title", "fallback": "Gettin' Handsy" }, "description": { "translate": "advancement.gm4.better_armour_stands.description", "fallback": "Customize an armour stand", "color": "gray" } }, "parent": "gm4:root", "criteria": { "arm_armor_stand": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/take.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ], "predicates": { "minecraft:custom_data": "{gm4_bas_ignore:1b}" } } } } } ], "entity": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ] } } } } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:book/take" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/tracking.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_bas_track\"]}" } } ], "item": { "items": [ "minecraft:writable_book" ] }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_better_armour_stands:holding/mainhand/book_ignore" } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:pose/set" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/use.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "item": { "items": [ "minecraft:writable_book" ] }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:armor_stand" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_better_armour_stands:holding/mainhand/book_ignore" } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:book/use" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/book/use_arms.json ================================================ { "criteria": { "stop_track": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "item": { "items": [ "minecraft:writable_book" ] }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_bas_arms_detect\"]}" } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:book/use_arms" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/join.json ================================================ { "criteria": { "join": { "trigger": "minecraft:location" } }, "rewards": { "function": "gm4_better_armour_stands:get_id" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/place.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:armor_stand" ] } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:place/check" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/pose/invert.json ================================================ { "criteria": { "invert": { "trigger": "minecraft:player_hurt_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_bas_track\"]}" } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction" } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:pose/invert" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/advancement/pose/set.json ================================================ { "criteria": { "stop_track": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_bas_track\"]}" } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction" } } ] } } }, "rewards": { "function": "gm4_better_armour_stands:pose/set" } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/apply.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/process # restore armor_stand state to default execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"default"}]} run function gm4_better_armour_stands:default/check # remove armor_stand arms execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"arms"}]} run function gm4_better_armour_stands:toggle/arms/arms # toggle armor_stand base execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"base"}]} run function gm4_better_armour_stands:toggle/base # toggle armor_stand height execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"size"}]} run function gm4_better_armour_stands:toggle/size # toggle armor_stand visibility execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"visible"}]} run function gm4_better_armour_stands:toggle/visible # toggle armor_stand gravity execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"gravity"}]} run function gm4_better_armour_stands:toggle/gravity # rotate the armor_stand by predefined intervals execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"turn"}]} run function gm4_better_armour_stands:toggle/turn # equip item into specified slot execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"equip"}]} run function gm4_better_armour_stands:equip/select # flip full pose of armor_stand execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"flip"}]} run function gm4_better_armour_stands:pose/flip # copy and paste from armor_stand item execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"copy"}]} if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:holding/offhand/armor_stand] run function gm4_better_armour_stands:pose/copy execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"paste"}]} if items entity @a[tag=gm4_bas_active,limit=1] weapon.offhand *[entity_data] run function gm4_better_armour_stands:pose/paste # change armor_stand poses execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"pose"}]} run function gm4_better_armour_stands:pose/select execute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:"pose mirror"}]} run function gm4_better_armour_stands:pose/select # move/rotate execute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:"move"}]} run function gm4_better_armour_stands:pose/move execute unless score @s gm4_bas_mode matches 1.. if data storage gm4_better_armour_stands:temp {pages:[{raw:"rotate"}]} run function gm4_better_armour_stands:pose/rotate # disable armor_stand interaction execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"lock"}]} unless entity @s[tag=gm4_bas_locked] run function gm4_better_armour_stands:toggle/lock/lock execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"unlock"}]} if entity @s[tag=gm4_bas_locked] run function gm4_better_armour_stands:toggle/lock/unlock ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/hold.mcfunction ================================================ # @s = player holding writable_book # at @s # run from main # reveal invisible armor_stand execute if predicate gm4_better_armour_stands:holding/mainhand/book_visible run effect give @e[type=armor_stand,tag=!gm4_no_edit,tag=!smithed.entity,distance=..6,nbt={Invisible:1b}] glowing 2 0 # enable right click detection for nearby armor_stand execute if predicate gm4_better_armour_stands:holding/mainhand/book_arms positioned ^ ^ ^2.5 as @e[type=armor_stand,tag=!gm4_bas_no_arms,tag=!gm4_no_edit,tag=!smithed.entity,distance=..2.5,nbt={ShowArms:0b}] at @s run function gm4_better_armour_stands:toggle/arms/detect_interaction # remove ignore tag from writable_book item modify entity @s[predicate=gm4_better_armour_stands:holding/mainhand/book_ignore] weapon.mainhand gm4_better_armour_stands:remove_ignore # enable temporary interaction for locked armor_stand execute if predicate gm4_better_armour_stands:holding/mainhand/book_unlock positioned ^ ^ ^2.5 as @e[type=armor_stand,tag=gm4_bas_locked,tag=!gm4_bas_temp_unlock,distance=..2.5] at @s run function gm4_better_armour_stands:toggle/lock/detect_interaction # tracking check execute if entity @s[tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/track/tick 1t append ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/invalid.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/process particle minecraft:block_marker{block_state:"minecraft:barrier"} ~ ~.7 ~ 0 0 0 0 1 force @a[tag=gm4_bas_active,limit=1] playsound minecraft:item.book.put player @a[tag=gm4_bas_active,limit=1] ~ ~ ~ 1 .8 title @a[tag=gm4_bas_active,limit=1] actionbar {"translate":"tooltip.gm4.better_armour_stands.invalid_code","fallback":"Invalid code"} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/process.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/use # get book pages data modify storage gm4_better_armour_stands:temp pages set from entity @s equipment.mainhand.components."minecraft:writable_book_content".pages # restore item held by armor stand and book from player item replace entity @a[tag=gm4_bas_active,limit=1,gamemode=creative,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill,predicate=!gm4_better_armour_stands:holding/mainhand/book_ignore] weapon.mainhand with minecraft:air # swap items between armor stand and player, using player.cursor as temporary slot item replace entity @a[tag=gm4_bas_active,limit=1] player.cursor from entity @s weapon.mainhand item replace entity @s weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1] weapon.mainhand item replace entity @a[tag=gm4_bas_active,limit=1] weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1] player.cursor item replace entity @a[tag=gm4_bas_active,limit=1] player.cursor with minecraft:air # check valid codes and apply to armor_stand scoreboard players reset $valid_code gm4_bas_data function #gm4_better_armour_stands:apply_book execute unless score $valid_code gm4_bas_data matches 1 run function gm4_better_armour_stands:book/invalid # show invisible armour stand effect give @s[nbt={Invisible:1b}] glowing 2 0 # reset storage data remove storage gm4_better_armour_stands:temp pages # schedule checks in case it stopped early (e.g. player logging out) execute if entity @e[type=armor_stand,tag=gm4_bas_no_arms] run schedule function gm4_better_armour_stands:toggle/arms/check 16t execute if entity @e[type=armor_stand,tag=gm4_bas_temp_unlock] run schedule function gm4_better_armour_stands:toggle/lock/check 16t execute if entity @e[type=armor_stand,tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/check_no_player 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/ray_arms.mcfunction ================================================ # @s = player right clicking armor_stand with writable_book # at @s # run from book/use_arms and book/ray_arms # select armor_stand without arms execute positioned ~-.2 ~-.2 ~-.2 as @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,dx=0,limit=1] positioned ~-.6 ~-.6 ~-.6 run tag @s[dx=0] add gm4_bas_selected # continue searching if not inside armor_stand execute unless entity @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,tag=gm4_bas_selected,limit=1] unless entity @s[distance=6..] positioned ^ ^ ^.5 run function gm4_better_armour_stands:book/ray_arms # found armor_stand holding writable_book execute as @e[type=minecraft:armor_stand,tag=gm4_bas_no_arms,tag=gm4_bas_selected,limit=1] at @s run function gm4_better_armour_stands:toggle/arms/select ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/take.mcfunction ================================================ # @s = player taking writable_book from armor_stand # at @s # run from advancement book/take advancement revoke @s only gm4_better_armour_stands:book/take # remove ignore tag from writable_book item modify entity @s weapon.mainhand gm4_better_armour_stands:remove_ignore ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/use.mcfunction ================================================ # @s = player giving writable_book to armor_stand # at @s # run from advancement book/use # select targeted armor_stand and process book tag @s add gm4_bas_active execute as @e[type=minecraft:armor_stand,tag=!gm4_no_edit,tag=!smithed.entity,distance=..6,limit=1,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill,predicate=!gm4_better_armour_stands:holding/mainhand/book_ignore] at @s run function gm4_better_armour_stands:book/process tag @s remove gm4_bas_active advancement revoke @s[tag=!gm4_bas_track] only gm4_better_armour_stands:book/use ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/book/use_arms.mcfunction ================================================ # @s = player giving writable_book to armor_stand # at @s # run from advancement book/use_arms advancement revoke @s only gm4_better_armour_stands:book/use_arms # tag player and start ray in direction of targeted armor_stand tag @s add gm4_bas_active execute anchored eyes run function gm4_better_armour_stands:book/ray_arms tag @s remove gm4_bas_active ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/all.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # reset pose and other features data modify entity @s Pose set from storage gm4_better_armour_stands:default Pose data merge entity @s {ShowArms:1b,Small:0b,NoBasePlate:0b,NoGravity:0b,Invisible:0b} scoreboard players reset @s gm4_bas_turn effect clear @s glowing playsound minecraft:entity.armor_stand.hit block @a[distance=..6] ~ ~ ~ 0.5 1 ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/check.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # reset armor_stand execute unless entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run function #gm4_better_armour_stands:default # reset pose of specific armor_stand part execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:default/part ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/default/part.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from default/check # check size, spawn part detectors execute store result score $size gm4_bas_data run data get entity @s Small execute if score $size gm4_bas_data matches 0 run function gm4_better_armour_stands:pose/select/tall execute if score $size gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/select/small # detect part player is looking at tp @s ~ ~100 ~ execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] store success score $default gm4_bas_data run data modify entity @s Pose.Head set from storage gm4_better_armour_stands:default Pose.Head execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/body] store success score $default gm4_bas_data run data modify entity @s Pose.Body set from storage gm4_better_armour_stands:default Pose.Body execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] store success score $default gm4_bas_data run data modify entity @s Pose.LeftArm set from storage gm4_better_armour_stands:default Pose.LeftArm execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] store success score $default gm4_bas_data run data modify entity @s Pose.RightArm set from storage gm4_better_armour_stands:default Pose.RightArm execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_leg] store success score $default gm4_bas_data run data modify entity @s Pose.LeftLeg set from storage gm4_better_armour_stands:default Pose.LeftLeg execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_leg] store success score $default gm4_bas_data run data modify entity @s Pose.RightLeg set from storage gm4_better_armour_stands:default Pose.RightLeg tp @s ~ ~ ~ execute if score $default gm4_bas_data matches 1 run playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1 scoreboard players reset $default gm4_bas_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/hand.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/select # check for item in hand slot execute if items entity @s weapon.mainhand * run function gm4_better_armour_stands:equip/remove/hand # move item from player to armor_stand item replace entity @s weapon.mainhand from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count item modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item # add ignore tag to writable_book item modify entity @s[predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill] weapon.mainhand gm4_better_armour_stands:add_ignore ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/head.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/select # check for item in head slot execute if items entity @s armor.head * run function gm4_better_armour_stands:equip/remove/head # move item from player to armour stand item replace entity @s armor.head from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count item modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/offhand.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/select # check for item in offhand slot execute if items entity @s weapon.offhand * run function gm4_better_armour_stands:equip/remove/offhand # move item from player to armour stand item replace entity @s weapon.offhand from entity @a[tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:count item modify entity @a[gamemode=!creative,tag=gm4_bas_active,limit=1,predicate=!gm4_better_armour_stands:holding/offhand/nothing] weapon.offhand gm4_better_armour_stands:remove_item ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/hand.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/hand loot spawn ~ ~1 ~ loot gm4_better_armour_stands:replaced_item execute positioned ~ ~1 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{"minecraft:custom_data":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s weapon.mainhand item replace entity @s weapon.mainhand with minecraft:air ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/head.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/head loot spawn ~ ~1.5 ~ loot gm4_better_armour_stands:replaced_item execute positioned ~ ~1.5 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{"minecraft:custom_data":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s armor.head item replace entity @s armor.head with minecraft:air ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/remove/offhand.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/offhand loot spawn ~ ~1 ~ loot gm4_better_armour_stands:replaced_item execute positioned ~ ~1 ~ run item replace entity @e[type=item,distance=..1,sort=nearest,limit=1,nbt={Item:{components:{"minecraft:custom_data":{gm4_better_armour_stands_replaced_item:1b}}}}] contents from entity @s weapon.offhand item replace entity @s weapon.offhand with minecraft:air ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select/small.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/select # head summon minecraft:area_effect_cloud ~ ~.45 ~ {Radius:.08f,Tags:["gm4_bas_head"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # arms summon minecraft:area_effect_cloud ^.18 ^ ^ {Radius:.09f,Tags:["gm4_bas_left_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} summon minecraft:area_effect_cloud ^-.18 ^ ^ {Radius:.09f,Tags:["gm4_bas_right_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select/tall.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from equip/select # head summon minecraft:area_effect_cloud ~ ~.5 ~ {Radius:.1f,Tags:["gm4_bas_head"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # arms summon minecraft:area_effect_cloud ^.3 ^ ^ {Radius:.15f,Tags:["gm4_bas_left_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} summon minecraft:area_effect_cloud ^-.3 ^ ^ {Radius:.15f,Tags:["gm4_bas_right_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/equip/select.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/apply scoreboard players set $valid_code gm4_bas_data 1 # check size, spawn part detectors execute store result score $size gm4_bas_data run data get entity @s Small execute if score $size gm4_bas_data matches 0 positioned ~ ~1 ~ run function gm4_better_armour_stands:equip/select/tall execute if score $size gm4_bas_data matches 1 positioned ~ ~.3 ~ run function gm4_better_armour_stands:equip/select/small # detect part player is looking at tp @s ~ ~100 ~ execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] run function gm4_better_armour_stands:equip/head execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] run function gm4_better_armour_stands:equip/hand execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] run function gm4_better_armour_stands:equip/offhand tp @s ~ ~ ~ ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/get_id.mcfunction ================================================ # @s = new player # at @s # run from advancement join execute store result score @s gm4_bas_id run data get entity @s UUID[0] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/init.mcfunction ================================================ scoreboard objectives add gm4_bas_id dummy scoreboard objectives add gm4_bas_data dummy scoreboard objectives add gm4_bas_mode dummy scoreboard objectives add gm4_bas_turn dummy scoreboard objectives add gm4_bas_dist dummy scoreboard objectives add gm4_bas_dx dummy scoreboard objectives add gm4_bas_dy dummy scoreboard objectives add gm4_bas_dz dummy scoreboard players set #1500 gm4_bas_data 1500 team add gm4_bas team modify gm4_bas collisionRule never data modify storage gm4_better_armour_stands:default Pose set value {Head:[0.01f, 0.0f, 0.0f],Body:[0.01f, 0.0f, 0.0f],LeftArm:[-10.01f, 0.0f, -10.0f],RightArm:[-15.01f, 0.0f, 10.0f],LeftLeg:[-1.01f, 0.0f, -1.0f],RightLeg:[1.01f, 0.0f, 1.0f]} execute unless score better_armour_stands gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Better Armour Stands"} execute unless score better_armour_stands gm4_earliest_version < better_armour_stands gm4_modules run scoreboard players operation better_armour_stands gm4_earliest_version = better_armour_stands gm4_modules scoreboard players set better_armour_stands gm4_modules 1 schedule function gm4_better_armour_stands:main 1t schedule function gm4_better_armour_stands:tick 1t #$moduleUpdateList ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/main.mcfunction ================================================ # player holding writable_book execute as @a[gamemode=!spectator,predicate=gm4_better_armour_stands:holding/mainhand/book_and_quill] at @s run function gm4_better_armour_stands:book/hold schedule function gm4_better_armour_stands:main 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/check.mcfunction ================================================ # @s = player placing an armor_stand # at @s # run from advancement place advancement revoke @s only gm4_better_armour_stands:place # add arms to new armor_stand and remove randomness. tag= matches armor stands with no existing tags execute positioned ^ ^ ^3 as @e[type=armor_stand,tag=,distance=..3] run function gm4_better_armour_stands:place/new # copy exact pose from copied armor_stand item to remove randomness # TODO 1.20.5: this doesn't seem to be necessary (anymore?) execute as @e[type=armor_stand,tag=gm4_bas_copy,distance=..6,limit=1] run function gm4_better_armour_stands:place/copy ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/copy.mcfunction ================================================ # @s = new armor_stand with copied data # at player who placed armor_stand # run from place/check tag @s remove gm4_bas_copy # copy exact pose from copied armor_stand item to remove randomness data modify entity @s Pose set from entity @p[predicate=gm4_better_armour_stands:holding/mainhand/armor_stand_copy] SelectedItem.components."minecraft:entity_data".Pose ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/place/new.mcfunction ================================================ # @s = new armor_stand # run from place/check tag @s add gm4_bas_placed # give arms data modify entity @s ShowArms set value 1b # set pose values and remove randomness data modify entity @s Pose set from storage gm4_better_armour_stands:default Pose ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/check_no_player.mcfunction ================================================ # scheduled from pose/select/success # no tracked player within range execute as @e[type=armor_stand,tag=gm4_bas_track] at @s unless entity @p[tag=gm4_bas_track,distance=..10] run function gm4_better_armour_stands:pose/set_no_player # repeat check execute if entity @e[type=armor_stand,tag=gm4_bas_track] run schedule function gm4_better_armour_stands:pose/check_no_player 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/copy.mcfunction ================================================ # @s = armor_stand to be copied # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # prepare to copy armor_stand tags to item entity data modify storage gm4_better_armour_stands:temp entity_data.id set value "minecraft:armor_stand" data modify storage gm4_better_armour_stands:temp entity_data.Pose set from entity @s Pose data modify storage gm4_better_armour_stands:temp entity_data.ShowArms set from entity @s ShowArms data modify storage gm4_better_armour_stands:temp entity_data.NoBasePlate set from entity @s NoBasePlate data modify storage gm4_better_armour_stands:temp entity_data.Small set from entity @s Small data modify storage gm4_better_armour_stands:temp entity_data.NoGravity set from entity @s NoGravity data modify storage gm4_better_armour_stands:temp entity_data.Invisible set from entity @s Invisible data modify storage gm4_better_armour_stands:temp entity_data.Tags set value ["gm4_bas_placed","gm4_bas_copy"] # copy tags from armor_stand to item entity item modify entity @a[tag=gm4_bas_active,limit=1] weapon.offhand gm4_better_armour_stands:copy execute as @a[tag=gm4_bas_active,limit=1] run function gm4_better_armour_stands:pose/copy_entity_data with storage gm4_better_armour_stands:temp # display particles and play a sound to confirm particle minecraft:item{item:"minecraft:armor_stand"} ~ ~ ~ .2 1 .2 0 20 playsound minecraft:block.wood.break player @a[distance=..6] ~ ~ ~ 0.5 1 # reset storage data remove storage gm4_better_armour_stands:temp entity_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/copy_entity_data.mcfunction ================================================ # run from pose/copy $item modify entity @s weapon.offhand {function:"minecraft:set_components",components:{"minecraft:entity_data":$(entity_data)}} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/flip.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # store current pose data modify storage gm4_better_armour_stands:temp CurrentPose set from entity @s Pose data modify storage gm4_better_armour_stands:temp Pose set from storage gm4_better_armour_stands:default Pose # copy/mirror poses data modify storage gm4_better_armour_stands:temp Pose.LeftArm[0] set from storage gm4_better_armour_stands:temp CurrentPose.RightArm[0] data modify storage gm4_better_armour_stands:temp Pose.RightArm[0] set from storage gm4_better_armour_stands:temp CurrentPose.LeftArm[0] data modify storage gm4_better_armour_stands:temp Pose.LeftLeg[0] set from storage gm4_better_armour_stands:temp CurrentPose.RightLeg[0] data modify storage gm4_better_armour_stands:temp Pose.RightLeg[0] set from storage gm4_better_armour_stands:temp CurrentPose.LeftLeg[0] data modify storage gm4_better_armour_stands:temp Pose.Head[0] set from storage gm4_better_armour_stands:temp CurrentPose.Head[0] data modify storage gm4_better_armour_stands:temp Pose.Body[0] set from storage gm4_better_armour_stands:temp CurrentPose.Body[0] execute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.RightArm[1] execute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.LeftArm[1] execute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.RightLeg[1] execute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.LeftLeg[1] execute store result storage gm4_better_armour_stands:temp Pose.Head[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.Head[1] execute store result storage gm4_better_armour_stands:temp Pose.Body[1] float -1 run data get storage gm4_better_armour_stands:temp CurrentPose.Body[1] # apply pose to armor_stand data modify entity @s Pose set from storage gm4_better_armour_stands:temp Pose # reset storage data remove storage gm4_better_armour_stands:temp CurrentPose data remove storage gm4_better_armour_stands:temp Pose # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/invert.mcfunction ================================================ # @s = player hitting armor_stand # at @s # run from advancement pose/invert advancement revoke @a only gm4_better_armour_stands:pose/invert # get current player id scoreboard players operation $current gm4_bas_id = @s gm4_bas_id # toggle invert mode execute as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id store success score $invert gm4_bas_data run tag @s remove gm4_bas_invert execute if score $invert gm4_bas_data matches 0 as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id run tag @s add gm4_bas_invert ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/arm_left.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/track/arm_left # initialize data modify storage gm4_better_armour_stands:temp Pose merge value {RightArm:[0f,0f,0f]} # copy pose from other arm and mirror rotation data modify storage gm4_better_armour_stands:temp Pose.RightArm[0] set from storage gm4_better_armour_stands:temp Pose.LeftArm[0] execute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.RightArm[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.LeftArm[2] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/arm_right.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/track/arm_right # initialize data modify storage gm4_better_armour_stands:temp Pose merge value {LeftArm:[0f,0f,0f]} # copy pose from other arm and mirror rotation data modify storage gm4_better_armour_stands:temp Pose.LeftArm[0] set from storage gm4_better_armour_stands:temp Pose.RightArm[0] execute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.LeftArm[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.RightArm[2] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/leg_left.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/track/leg_left # initialize data modify storage gm4_better_armour_stands:temp Pose merge value {RightLeg:[0f,0f,0f]} # copy pose from other arm and mirror rotation data modify storage gm4_better_armour_stands:temp Pose.RightLeg[0] set from storage gm4_better_armour_stands:temp Pose.LeftLeg[0] execute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.RightLeg[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.LeftLeg[2] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/mirror/leg_right.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/track/leg_right # initialize data modify storage gm4_better_armour_stands:temp Pose merge value {LeftLeg:[0f,0f,0f]} # copy pose from other arm and mirror rotation data modify storage gm4_better_armour_stands:temp Pose.LeftLeg[0] set from storage gm4_better_armour_stands:temp Pose.RightLeg[0] execute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float -0.01 run scoreboard players get $joint_rot_y gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[2] float -1 run data get storage gm4_better_armour_stands:temp Pose.RightLeg[2] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/move.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 scoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id function gm4_better_armour_stands:pose/select/move/move function gm4_better_armour_stands:pose/select/success ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/paste.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # copy item data to armor_stand data modify entity @s {} merge from entity @a[tag=gm4_bas_active,limit=1] equipment.offhand.components."minecraft:entity_data" # play a sound to confirm playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1 ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/rotate.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 scoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id scoreboard players set @s gm4_bas_mode 8 function gm4_better_armour_stands:pose/select/success ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/arm_left.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 3 # spawn markers execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run summon marker ^.3 ^ ^ {CustomName:"gm4_bas_left_arm",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_left_arm","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run summon marker ^.15 ^ ^ {CustomName:"gm4_bas_left_arm",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_left_arm","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.LeftArm set from entity @s Pose.LeftArm ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/arm_right.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 4 # spawn markers execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run summon marker ^-.3 ^ ^ {CustomName:"gm4_bas_right_arm",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_right_arm","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run summon marker ^-.15 ^ ^ {CustomName:"gm4_bas_right_arm",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_right_arm","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.RightArm set from entity @s Pose.RightArm ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/body.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 2 # spawn markers execute if score $size gm4_bas_data matches 0 run summon marker ~ ~1.5 ~ {CustomName:"gm4_bas_body",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_body","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 run summon marker ~ ~.7 ~ {CustomName:"gm4_bas_body",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_body","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.Body set from entity @s Pose.Body ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/failure.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select title @a[tag=gm4_bas_active,limit=1] actionbar {"translate":"tooltip.gm4.better_armour_stands.invalid_right_click_location","fallback":"Right click the joint of a part to start editing"} scoreboard players reset @s gm4_bas_id playsound minecraft:entity.villager.no block @a[tag=gm4_bas_active,limit=1] ~ ~ ~ 0.5 2 particle electric_spark ~ ~.1 ~ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 run particle electric_spark ~ ~1.6 ~ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 run particle electric_spark ~ ~0.9 ~ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 run particle electric_spark ~ ~1.3 ~ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 run particle electric_spark ~ ~0.7 ~ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle electric_spark ^.3 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 positioned ~ ~0.7 ~ run particle electric_spark ^.15 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle electric_spark ^-.3 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 positioned ~ ~0.7 ~ run particle electric_spark ^-.15 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 positioned ~ ~0.8 ~ run particle electric_spark ^.15 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 positioned ~ ~0.4 ~ run particle electric_spark ^.05 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 0 positioned ~ ~0.8 ~ run particle electric_spark ^-.15 ^ ^ 0 0 0 0 1 execute if score $size gm4_bas_data matches 1 positioned ~ ~0.4 ~ run particle electric_spark ^-.05 ^ ^ 0 0 0 0 1 ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/head.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 1 # spawn markers execute if score $size gm4_bas_data matches 0 run summon marker ~ ~1.4 ~ {CustomName:"gm4_bas_head",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_head","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 run summon marker ~ ~.7 ~ {CustomName:"gm4_bas_head",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_head","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.Head set from entity @s Pose.Head ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/leg_left.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 5 # spawn markers execute if score $size gm4_bas_data matches 0 positioned ~ ~.8 ~ run summon marker ^.15 ^ ^ {CustomName:"gm4_bas_left_leg",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_left_leg","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 positioned ~ ~.4 ~ run summon marker ^.05 ^ ^ {CustomName:"gm4_bas_left_leg",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_left_leg","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.LeftLeg set from entity @s Pose.LeftLeg ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/leg_right.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 6 # spawn markers execute if score $size gm4_bas_data matches 0 positioned ~ ~.8 ~ run summon marker ^-.15 ^ ^ {CustomName:"gm4_bas_right_leg",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_right_leg","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} execute if score $size gm4_bas_data matches 1 positioned ~ ~.4 ~ run summon marker ^-.05 ^ ^ {CustomName:"gm4_bas_right_leg",Tags:["smithed.entity","smithed.strict","gm4_bas_joint","gm4_bas_right_leg","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} # store current data data modify storage gm4_better_armour_stands:temp Data.Pose.RightLeg set from entity @s Pose.RightLeg ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/move.mcfunction ================================================ # @s = armor_stand to be moved # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 7 tp @s ~ ~ ~ # reset previous data scoreboard players reset @s gm4_bas_dist scoreboard players reset @s gm4_bas_dx scoreboard players reset @s gm4_bas_dy scoreboard players reset @s gm4_bas_dz # skip some calculations if coordinate values too high (>2M) tag @s remove gm4_bas_move_alt tag @s[predicate=!gm4_better_armour_stands:coord_check] add gm4_bas_move_alt # calculate distance/offset execute at @a[tag=gm4_bas_active,limit=1] positioned ~ ~1.6 ~ positioned ^ ^ ^.5 run function gm4_better_armour_stands:pose/select/move/ray # store current data data modify storage gm4_better_armour_stands:temp Data.Pos set from entity @s Pos ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/offset.mcfunction ================================================ # @s = armor_stand to be moved # at @s # run from pose/select/move/ray tag @e remove gm4_bas_stop_ray summon marker ~ ~ ~ {Tags:["gm4_bas_temp_offset"]} # player position execute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dx run data get entity @s Pos[0] 1000 execute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dy run data get entity @s Pos[1] 1000 execute as @e[type=marker,tag=gm4_bas_temp_offset,limit=1] store result score @s gm4_bas_dz run data get entity @s Pos[2] 1000 # armour stand position execute store result score @s gm4_bas_dx run data get entity @s Pos[0] 1000 execute store result score @s gm4_bas_dy run data get entity @s Pos[1] 1000 execute store result score @s gm4_bas_dz run data get entity @s Pos[2] 1000 # difference in positions scoreboard players operation @s gm4_bas_dx -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dx scoreboard players operation @s gm4_bas_dy -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dy scoreboard players operation @s gm4_bas_dz -= @e[type=marker,tag=gm4_bas_temp_offset,limit=1] gm4_bas_dz kill @e[type=marker,tag=gm4_bas_temp_offset,distance=..1] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/move/ray.mcfunction ================================================ # @s = armor_stand to be moved # at @s # run from functions in pose/select/move/ scoreboard players add @s gm4_bas_dist 5 execute positioned ~-.2 ~-.2 ~-.2 as @s[dx=0] positioned ~-.6 ~-.6 ~-.6 run tag @s[dx=0] add gm4_bas_stop_ray # continue searching if not inside armor_stand execute unless entity @s[tag=gm4_bas_stop_ray] unless score @s gm4_bas_dist matches 50.. positioned ^ ^ ^.5 run function gm4_better_armour_stands:pose/select/move/ray # found armor_stand execute as @s[tag=gm4_bas_stop_ray] run function gm4_better_armour_stands:pose/select/move/offset ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/rotate.mcfunction ================================================ # @s = armor_stand to be moved # at @s # run from pose/select scoreboard players set @s gm4_bas_mode 8 # store current data data modify storage gm4_better_armour_stands:temp Data.Rotation set from entity @s Rotation ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/small.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select and default/part # base summon minecraft:area_effect_cloud ~ ~-.25 ~ {Radius:.2f,Tags:["gm4_bas_base"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # head summon minecraft:area_effect_cloud ~ ~.75 ~ {Radius:.08f,Tags:["gm4_bas_head"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # body summon minecraft:area_effect_cloud ~ ~.25 ~ {Radius:.09f,Tags:["gm4_bas_body"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # arms execute positioned ~ ~.3 ~ run summon minecraft:area_effect_cloud ^.18 ^ ^ {Radius:.09f,Tags:["gm4_bas_left_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} execute positioned ~ ~.3 ~ run summon minecraft:area_effect_cloud ^-.18 ^ ^ {Radius:.09f,Tags:["gm4_bas_right_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # legs summon minecraft:area_effect_cloud ^.1 ^ ^ {Radius:.1f,Tags:["gm4_bas_left_leg"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} summon minecraft:area_effect_cloud ^-.1 ^ ^ {Radius:.1f,Tags:["gm4_bas_right_leg"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/success.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1 tag @s add gm4_bas_track tag @a[tag=gm4_bas_active,limit=1] add gm4_bas_track data modify entity @s DisabledSlots set value 4144959 data modify entity @s[nbt={Invisible:1b}] Glowing set value 1b # right click detection summon minecraft:interaction ~ ~ ~ {Tags:["smithed.entity","smithed.strict","gm4_bas_detect","gm4_bas_new","gm4_bas_temp"],height:2,width:1} # spawn marker for player offset and current armour stand data summon marker ~ ~ ~ {CustomName:"gm4_bas_player_offset",Tags:["smithed.entity","smithed.strict","gm4_bas_player_offset","gm4_bas_marker","gm4_bas_new","gm4_bas_temp"]} data modify entity @e[type=minecraft:marker,tag=gm4_bas_player_offset,tag=gm4_bas_new,distance=..1,limit=1] data set from storage gm4_better_armour_stands:temp Data data remove storage gm4_better_armour_stands:temp Data # copy player id to entities execute if score @s gm4_bas_mode matches 1.. run scoreboard players operation @e[type=interaction,tag=gm4_bas_new,distance=..1] gm4_bas_id = @s gm4_bas_id tag @e[type=interaction,tag=gm4_bas_new,limit=1] remove gm4_bas_new execute if score @s gm4_bas_mode matches 1.. run scoreboard players operation @e[type=marker,tag=gm4_bas_new,distance=..2] gm4_bas_id = @s gm4_bas_id tag @e[type=marker,tag=gm4_bas_new,distance=..2,limit=2] remove gm4_bas_new # optional checks execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"pose mirror"}]} run tag @s add gm4_bas_mirror execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:sneaking] run tag @s add gm4_bas_alt # start tracking clock schedule function gm4_better_armour_stands:pose/track/tick 1t schedule function gm4_better_armour_stands:pose/check_no_player 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select/tall.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/select and default/part # base summon minecraft:area_effect_cloud ~ ~-.4 ~ {Radius:.375f,Tags:["gm4_bas_base"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # head summon minecraft:area_effect_cloud ~ ~1.5 ~ {Radius:.1f,Tags:["gm4_bas_head"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # body summon minecraft:area_effect_cloud ~ ~1 ~ {Radius:.15f,Tags:["gm4_bas_body"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # arms execute positioned ~ ~1 ~ run summon minecraft:area_effect_cloud ^.3 ^ ^ {Radius:.15f,Tags:["gm4_bas_left_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} execute positioned ~ ~1 ~ run summon minecraft:area_effect_cloud ^-.3 ^ ^ {Radius:.15f,Tags:["gm4_bas_right_arm"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} # legs execute positioned ~ ~.4 ~ run summon minecraft:area_effect_cloud ^.15 ^ ^ {Radius:.15f,Tags:["gm4_bas_left_leg"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} execute positioned ~ ~.4 ~ run summon minecraft:area_effect_cloud ^-.15 ^ ^ {Radius:.15f,Tags:["gm4_bas_right_leg"],Duration:0,WaitTime:2,custom_particle:{type:"minecraft:item",item:"minecraft:armor_stand"}} ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/select.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 scoreboard players operation @s gm4_bas_id = @a[tag=gm4_bas_active,limit=1] gm4_bas_id # check size, spawn part detectors execute store result score $size gm4_bas_data run data get entity @s Small execute if score $size gm4_bas_data matches 0 run function gm4_better_armour_stands:pose/select/tall execute if score $size gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/select/small # detect part player is looking at tp @s ~ ~100 ~ execute if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/head] run function gm4_better_armour_stands:pose/select/head execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/body] run function gm4_better_armour_stands:pose/select/body execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_arm] run function gm4_better_armour_stands:pose/select/arm_left execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_arm] run function gm4_better_armour_stands:pose/select/arm_right execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/left_leg] run function gm4_better_armour_stands:pose/select/leg_left execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/right_leg] run function gm4_better_armour_stands:pose/select/leg_right execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/base,predicate=!gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/select/move/move execute unless score @s gm4_bas_mode matches 1.. if entity @a[tag=gm4_bas_active,limit=1,predicate=gm4_better_armour_stands:select/base,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/select/rotate tp @s ~ ~ ~ # start editing if success, otherwise feedback execute if score @s gm4_bas_mode matches 1.. run function gm4_better_armour_stands:pose/select/success execute unless score @s gm4_bas_mode matches 1.. positioned ^ ^ ^.1 run function gm4_better_armour_stands:pose/select/failure ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/set.mcfunction ================================================ # @s = player modifying armor_stand # at @s # run from advancement pose/set, pose/undo advancement revoke @s only gm4_better_armour_stands:book/use advancement revoke @s only gm4_better_armour_stands:pose/set advancement revoke @s only gm4_better_armour_stands:book/tracking # advancement for customizing armor_stand advancement grant @s only gm4:better_armour_stands # get current player id scoreboard players operation $current gm4_bas_id = @s gm4_bas_id # reset/remove linked entities execute as @e[type=armor_stand,tag=gm4_bas_track] if score @s gm4_bas_id = $current gm4_bas_id at @s run function gm4_better_armour_stands:pose/track/clear execute as @e[type=marker,tag=gm4_bas_marker] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s execute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s # reset tag tag @s remove gm4_bas_track ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/set_no_player.mcfunction ================================================ # @s = armor_stand with no nearby tracked player # at @s # run from pose/check_no_player # get current armor_stand id scoreboard players operation $current gm4_bas_id = @s gm4_bas_id # remove linked entities execute as @e[type=marker,tag=gm4_bas_marker] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s execute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id at @s run kill @s # reset tracking data function gm4_better_armour_stands:pose/track/clear ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/pose.mcfunction ================================================ # @s = player modifying armor_stand # at @s # run from pose/track/update scoreboard players add $joint_rot_x gm4_bas_data 750 scoreboard players operation $joint_rot_x gm4_bas_data /= #1500 gm4_bas_data scoreboard players operation $joint_rot_x gm4_bas_data *= #1500 gm4_bas_data scoreboard players add $joint_rot_y gm4_bas_data 750 scoreboard players operation $joint_rot_y gm4_bas_data /= #1500 gm4_bas_data scoreboard players operation $joint_rot_y gm4_bas_data *= #1500 gm4_bas_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/position.mcfunction ================================================ # @s = armor_stand being moved # at @s # run from pose/track/move # round to nearest 1/8th of a block execute store result entity @s Pos[0] double .125 run data get entity @s Pos[0] 8 execute store result entity @s Pos[1] double .125 run data get entity @s Pos[1] 8 execute store result entity @s Pos[2] double .125 run data get entity @s Pos[2] 8 ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/snap/rotation.mcfunction ================================================ # @s = armor_stand being rotated # at @s # run from pose/track/rotate # round to nearest 15 degrees of a block execute store result score $as_rot_y gm4_bas_data run data get entity @s Rotation[0] .06667 execute store result entity @s Rotation[0] float 15 run scoreboard players get $as_rot_y gm4_bas_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/arm_left.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {LeftArm:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.LeftArm[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000 execute store result storage gm4_better_armour_stands:temp Pose.LeftArm[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data # mirror to other arm execute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/arm_left ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/arm_right.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {RightArm:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.RightArm[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000 execute store result storage gm4_better_armour_stands:temp Pose.RightArm[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data # mirror to other arm execute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/arm_right ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/body.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {Body:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.Body[0] float 0.01 run scoreboard players get $joint_rot_x gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.Body[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/clear.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from pose/set scoreboard players reset @s gm4_bas_id scoreboard players reset @s gm4_bas_mode tag @s remove gm4_bas_track tag @s remove gm4_bas_mirror tag @s remove gm4_bas_alt tag @s remove gm4_bas_invert data remove entity @s DisabledSlots data remove entity @s Glowing playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1 # undo changes if ran from pose/undo execute if score $undo gm4_bas_data matches 1 run data modify entity @s {} merge from storage gm4_better_armour_stands:temp Undo ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/head.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {Head:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.Head[0] float 0.01 run scoreboard players get $joint_rot_x gm4_bas_data execute store result storage gm4_better_armour_stands:temp Pose.Head[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/leg_left.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {LeftLeg:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000 execute store result storage gm4_better_armour_stands:temp Pose.LeftLeg[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data # mirror to other leg execute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/leg_left ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/leg_right.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # convert scores to rotation in storage data modify storage gm4_better_armour_stands:temp Pose set value {RightLeg:[0f,0f,0f]} execute store result storage gm4_better_armour_stands:temp Pose.RightLeg[0] float 0.01 run scoreboard players remove $joint_rot_x gm4_bas_data 9000 execute store result storage gm4_better_armour_stands:temp Pose.RightLeg[1] float 0.01 run scoreboard players get $joint_rot_y gm4_bas_data # mirror to other leg execute if entity @s[tag=gm4_bas_mirror] run function gm4_better_armour_stands:pose/mirror/leg_right ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/move.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # move armor_stand in front of player execute if score @s gm4_bas_dist matches 5 run tp @s ^ ^ ^.5 execute if score @s gm4_bas_dist matches 10 run tp @s ^ ^ ^1 execute if score @s gm4_bas_dist matches 15 run tp @s ^ ^ ^1.5 execute if score @s gm4_bas_dist matches 20 run tp @s ^ ^ ^2 execute if score @s gm4_bas_dist matches 25 run tp @s ^ ^ ^2.5 execute if score @s gm4_bas_dist matches 30 run tp @s ^ ^ ^3 execute if score @s gm4_bas_dist matches 35 run tp @s ^ ^ ^3.5 execute if score @s gm4_bas_dist matches 40 run tp @s ^ ^ ^4 execute if score @s gm4_bas_dist matches 45 run tp @s ^ ^ ^4.5 execute if score @s gm4_bas_dist matches 50 run tp @s ^ ^ ^5 # armour stand position execute store result score $as_pos_x gm4_bas_data run data get entity @s[tag=!gm4_bas_move_alt] Pos[0] 1000 execute store result score $as_pos_z gm4_bas_data run data get entity @s[tag=!gm4_bas_move_alt] Pos[2] 1000 execute store result score $as_pos_y gm4_bas_data run data get entity @s Pos[1] 1000 # add difference to position execute store result entity @s[tag=!gm4_bas_move_alt] Pos[0] double .001 run scoreboard players operation $as_pos_x gm4_bas_data += @s gm4_bas_dx execute store result entity @s[tag=!gm4_bas_move_alt] Pos[2] double .001 run scoreboard players operation $as_pos_z gm4_bas_data += @s gm4_bas_dz execute store result entity @s Pos[1] double .001 run scoreboard players operation $as_pos_y gm4_bas_data += @s gm4_bas_dy # round up position to multiples of 1/8th of a block execute if entity @p[tag=gm4_bas_track,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/snap/position ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/rotate.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # rotate armor_stand towards marker execute at @s run tp @s ~ ~ ~ facing entity @e[type=marker,tag=gm4_bas_player_offset,sort=nearest,limit=1] # round up rotation to multiples of 15 degrees execute if entity @p[tag=gm4_bas_track,predicate=gm4_better_armour_stands:sneaking] run function gm4_better_armour_stands:pose/snap/rotation ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/select_armour_stand.mcfunction ================================================ # @s = player modifying armor_stand # at @s # run from pose/track/tick # get current player id scoreboard players operation $current gm4_bas_id = @s gm4_bas_id # select armor_stand linked to player scoreboard players reset $success gm4_bas_data execute if predicate gm4_better_armour_stands:holding/mainhand/book_and_quill as @e[type=armor_stand,tag=gm4_bas_track,distance=..6] if score @s gm4_bas_id = $current gm4_bas_id positioned ~ ~1.6 ~ run function gm4_better_armour_stands:pose/track/update # undo changes if no linked armor_stand found, or if player not holding book_and_quill execute unless score $success gm4_bas_data matches 1 run function gm4_better_armour_stands:pose/undo ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/tick.mcfunction ================================================ # update values for tracked armor_stand, for pose/move/rotate execute as @a[tag=gm4_bas_track] at @s run function gm4_better_armour_stands:pose/track/select_armour_stand # repeat tracking loop execute if entity @a[tag=gm4_bas_track,limit=1] run schedule function gm4_better_armour_stands:pose/track/tick 1t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from tick scoreboard players set $success gm4_bas_data 1 # keep interaction in front of player execute as @e[type=interaction,tag=gm4_bas_detect] if score @s gm4_bas_id = $current gm4_bas_id positioned ~ ~-1 ~ run tp @s ^ ^ ^.5 # move offset marker, rotate joint marker facing offset marker, and update rotation scores execute as @e[type=marker,tag=gm4_bas_player_offset] if score @s gm4_bas_id = $current gm4_bas_id run function gm4_better_armour_stands:pose/track/update_markers # update armor_stand part pose execute if score @s gm4_bas_mode matches 1..6 run function gm4_better_armour_stands:pose/track/update_pose # update for move/rotate execute if score @s gm4_bas_mode matches 7 run function gm4_better_armour_stands:pose/track/move execute if score @s gm4_bas_mode matches 8 run function gm4_better_armour_stands:pose/track/rotate ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_joint.mcfunction ================================================ # @s = @e[type=marker,tag=gm4_bas_player_offset] # at @e[type=marker,tag=gm4_bas_joint] # run from pose/track/update_markers # rotate joint marker to face offset marker tp @e[type=marker,tag=gm4_bas_joint,distance=..1,sort=nearest,limit=1] ~ ~ ~ facing entity @s # store player and armor_stand rotation in scoreboard so rotation offset can be applied. execute store result score $joint_rot_x gm4_bas_data run data get entity @e[type=marker,tag=gm4_bas_joint,sort=nearest,limit=1] Rotation[1] 100 execute store result score $joint_rot_y gm4_bas_data run data get entity @e[type=marker,tag=gm4_bas_joint,sort=nearest,limit=1] Rotation[0] 100 ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_markers.mcfunction ================================================ # @s = @e[type=marker,tag=gm4_bas_player_offset] # at @p[tag=gm4_bas_track] # run from pose/track/update # keep offset marker in front of player tp @s ^ ^ ^2 # rotate joint marker to face offset marker and update rotation scores execute at @e[type=marker,tag=gm4_bas_joint] if score @e[type=marker,tag=gm4_bas_joint,distance=..1,sort=nearest,limit=1] gm4_bas_id = @s gm4_bas_id run function gm4_better_armour_stands:pose/track/update_joint ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/track/update_pose.mcfunction ================================================ # @s = armor_stand to be modified # at @p[tag=gm4_bas_track] positioned ~ ~1.6 ~ # run from pose/track/update # update rotation calculations execute store result score $as_rot_y gm4_bas_data run data get entity @s Rotation[0] 100 scoreboard players operation $joint_rot_y gm4_bas_data -= $as_rot_y gm4_bas_data # snap pose execute as @p[tag=gm4_bas_track] if predicate gm4_better_armour_stands:sneaking run function gm4_better_armour_stands:pose/snap/pose # apply optional modifiers execute if entity @s[tag=gm4_bas_invert] run scoreboard players add $joint_rot_x gm4_bas_data 18000 execute if entity @s[tag=gm4_bas_alt] run scoreboard players add $joint_rot_x gm4_bas_data 9000 # check for armor_stand part execute if score @s gm4_bas_mode matches 1 run function gm4_better_armour_stands:pose/track/head execute if score @s gm4_bas_mode matches 2 run function gm4_better_armour_stands:pose/track/body execute if score @s gm4_bas_mode matches 3 run function gm4_better_armour_stands:pose/track/arm_left execute if score @s gm4_bas_mode matches 4 run function gm4_better_armour_stands:pose/track/arm_right execute if score @s gm4_bas_mode matches 5 run function gm4_better_armour_stands:pose/track/leg_left execute if score @s gm4_bas_mode matches 6 run function gm4_better_armour_stands:pose/track/leg_right # copy pose data from storage to entity. data modify entity @s Pose merge from storage gm4_better_armour_stands:temp Pose data remove storage gm4_better_armour_stands:temp Pose ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/pose/undo.mcfunction ================================================ # @s = player modifying armor_stand # at @s # run from pose/track/select_armour_stand # move undo data from marker to storage execute as @e[type=marker,tag=gm4_bas_player_offset] if score @s gm4_bas_id = $current gm4_bas_id run data modify storage gm4_better_armour_stands:temp Undo set from entity @s data # stop tracking scoreboard players set $undo gm4_bas_data 1 function gm4_better_armour_stands:pose/set playsound minecraft:entity.armor_stand.hit block @s ~ ~ ~ 0.5 1 # reset undo data scoreboard players reset $undo gm4_bas_data data remove storage gm4_better_armour_stands:temp Undo ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/tick.mcfunction ================================================ # turn armor_stand execute as @e[type=armor_stand,scores={gm4_bas_turn=1..}] at @s run function gm4_better_armour_stands:turn schedule function gm4_better_armour_stands:tick 1t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/arms.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # toggle arms execute store result score $arms gm4_bas_data run data get entity @s ShowArms execute if score $arms gm4_bas_data matches 0 run data modify entity @s ShowArms set value 1 execute if score $arms gm4_bas_data matches 0 run playsound minecraft:entity.armor_stand.place block @a[distance=..6] ~ ~ ~ 0.5 1.5 execute if score $arms gm4_bas_data matches 1 run data modify entity @s ShowArms set value 0 execute if score $arms gm4_bas_data matches 1 run playsound minecraft:entity.armor_stand.break block @a[distance=..6] ~ ~ ~ 0.5 1.5 execute if score $arms gm4_bas_data matches 1 run function gm4_better_armour_stands:toggle/arms/detect_interaction # check size and show particles execute store result score $size gm4_bas_data run data get entity @s Small execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle minecraft:block{block_state:"minecraft:oak_planks"} ^.35 ^ ^ 0 0 0 0 4 execute if score $size gm4_bas_data matches 0 positioned ~ ~1.4 ~ run particle minecraft:block{block_state:"minecraft:oak_planks"} ^-.35 ^ ^ 0 0 0 0 4 execute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run particle minecraft:block{block_state:"minecraft:oak_planks"} ^.2 ^ ^ 0 0 0 0 4 execute if score $size gm4_bas_data matches 1 positioned ~ ~.7 ~ run particle minecraft:block{block_state:"minecraft:oak_planks"} ^-.2 ^ ^ 0 0 0 0 4 # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/check.mcfunction ================================================ # scheduled from toggle/arms/detect_interaction # remove right click detection on armor_stand with no arms if player is too far away execute as @e[type=armor_stand,tag=gm4_bas_no_arms] at @s unless entity @p[distance=..6,predicate=gm4_better_armour_stands:holding/mainhand/book_arms] run function gm4_better_armour_stands:toggle/arms/remove_detection # repeat check execute if entity @e[type=armor_stand,tag=gm4_bas_no_arms] run schedule function gm4_better_armour_stands:toggle/arms/check 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/detect_interaction.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/hold and toggle/arms/arms tag @s add gm4_bas_no_arms # size check execute store result score $size gm4_bas_data run data get entity @s Small # place interaction inside armor_stand to detect right click execute if score $size gm4_bas_data matches 0 run summon minecraft:interaction ~ ~-0.01 ~ {Tags:["smithed.entity","smithed.strict","gm4_bas_arms_detect"],height:2,width:0.51} execute if score $size gm4_bas_data matches 1 run summon minecraft:interaction ~ ~-0.01 ~ {Tags:["smithed.entity","smithed.strict","gm4_bas_arms_detect"],height:1,width:0.251} # start check loop to remove interaction schedule function gm4_better_armour_stands:toggle/arms/check 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/remove_detection.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from toggle/arms/check and toggle/arms/select kill @e[type=interaction,tag=gm4_bas_arms_detect,distance=..1,sort=nearest,limit=1] tag @s remove gm4_bas_no_arms ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/arms/select.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/ray_arms # get book data data modify storage gm4_better_armour_stands:temp pages set from entity @a[tag=gm4_bas_active,limit=1] SelectedItem.components."minecraft:writable_book_content".pages # apply to armor_stand function #gm4_better_armour_stands:apply_book # remove detection function gm4_better_armour_stands:toggle/arms/remove_detection tag @s remove gm4_bas_selected ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/base.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # toggle base plate execute store result score $base gm4_bas_data run data get entity @s NoBasePlate execute if score $base gm4_bas_data matches 0 run data modify entity @s NoBasePlate set value 1b execute if score $base gm4_bas_data matches 0 run playsound minecraft:block.stone.break block @a[distance=..6] ~ ~ ~ 0.5 1 execute if score $base gm4_bas_data matches 0 run particle minecraft:block{block_state:"minecraft:smooth_stone"} ~ ~ ~ .15 0 .15 0 10 execute if score $base gm4_bas_data matches 1 run data modify entity @s NoBasePlate set value 0b execute if score $base gm4_bas_data matches 1 run playsound minecraft:block.stone.place block @a[distance=..6] ~ ~ ~ 0.5 1 # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/gravity.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # toggle gravity execute store result score $gravity gm4_bas_data run data get entity @s NoGravity playsound minecraft:item.chorus_fruit.teleport block @a[distance=..6] ~ ~ ~ 0.5 2 execute if score $gravity gm4_bas_data matches 0 run data modify entity @s NoGravity set value 1b execute if score $gravity gm4_bas_data matches 0 run particle minecraft:reverse_portal ~ ~ ~ .2 1 .2 0 20 execute if score $gravity gm4_bas_data matches 1 run data modify entity @s NoGravity set value 0b execute if score $gravity gm4_bas_data matches 1 run particle minecraft:portal ~ ~ ~ .2 1 .2 0 20 # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/check.mcfunction ================================================ # scheduled from toggle/lock/detect_interaction # remove temporary interaction with locked armor_stand execute as @e[type=armor_stand,tag=gm4_bas_temp_unlock] at @s unless entity @p[predicate=gm4_better_armour_stands:holding/mainhand/book_unlock,distance=..6] run function gm4_better_armour_stands:toggle/lock/remove_temp_unlock # repeat check execute if entity @e[type=armor_stand,tag=gm4_bas_temp_unlock] run schedule function gm4_better_armour_stands:toggle/lock/check 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/detect_interaction.mcfunction ================================================ # @s = locked armor_stand # at @s # run from book/hold # enable temporary interaction data merge entity @s {Marker:0b,Glowing:1b} tag @s add gm4_bas_temp_unlock # start check loop to remove temporary unlock schedule function gm4_better_armour_stands:toggle/lock/check 16t ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/lock.mcfunction ================================================ # @s = armor_stand # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # lock armor_stand data merge entity @s {Marker:1b,NoGravity:1b} playsound minecraft:block.wooden_trapdoor.close block @a[distance=..6] ~ ~ ~ 0.5 2 particle minecraft:enchant ~ ~.5 ~ .15 .5 .15 .3 10 tag @s add gm4_bas_locked ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/remove_temp_unlock.mcfunction ================================================ # @s = temporarily unlocked armor_stand # at @s # run from toggle/lock/check data merge entity @s {Marker:1b,Glowing:0b} tag @s remove gm4_bas_temp_unlock ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/lock/unlock.mcfunction ================================================ # @s = armor_stand # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # unlock armor_stand data modify entity @s Glowing set value 0b playsound minecraft:block.wooden_trapdoor.open block @a[distance=..6] ~ ~ ~ 0.5 2 particle minecraft:enchant ~ ~.5 ~ .15 .5 .15 0 10 tag @s remove gm4_bas_locked tag @s remove gm4_bas_temp_unlock ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/size.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # toggle size execute store result score $size gm4_bas_data run data get entity @s Small playsound minecraft:entity.armor_stand.fall block @a[distance=..6] ~ ~ ~ 0.5 1 execute if score $size gm4_bas_data matches 0 run data modify entity @s Small set value 1b execute if score $size gm4_bas_data matches 0 run playsound minecraft:entity.puffer_fish.blow_out block @a[distance=..6] ~ ~ ~ .3 2 execute if score $size gm4_bas_data matches 1 run data modify entity @s Small set value 0b execute if score $size gm4_bas_data matches 1 run playsound minecraft:entity.puffer_fish.blow_up block @a[distance=..6] ~ ~ ~ .3 2 # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/turn.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # rotate through turn options scoreboard players add @s gm4_bas_turn 1 execute unless score @s gm4_bas_turn matches 0..2 run scoreboard players set @s gm4_bas_turn 0 execute if score @s gm4_bas_turn matches 0 run playsound minecraft:entity.armor_stand.hit block @a[distance=..6] ~ ~ ~ .2 2 execute if score @s gm4_bas_turn matches 1..2 run playsound minecraft:entity.item_frame.rotate_item master @a[distance=..6] ~ ~ ~ 0.5 2 # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/toggle/visible.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from book/apply scoreboard players set $valid_code gm4_bas_data 1 # toggle visibility execute store result score $invisible gm4_bas_data run data get entity @s Invisible playsound minecraft:entity.player.attack.nodamage neutral @a[distance=..6] ~ ~ ~ 0.5 0.6 execute if score $invisible gm4_bas_data matches 0 run data modify entity @s Invisible set value 1b execute if score $invisible gm4_bas_data matches 0 run effect give @s glowing 2 0 execute if score $invisible gm4_bas_data matches 1 run data modify entity @s Invisible set value 0b execute if score $invisible gm4_bas_data matches 1 run effect clear @s glowing # advancement for customizing armor_stand advancement grant @a[tag=gm4_bas_active,limit=1] only gm4:better_armour_stands ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/function/turn.mcfunction ================================================ # @s = armor_stand # at @s # run from tick execute if score @s gm4_bas_turn matches 1 run tp @s ~ ~ ~ ~-1 ~ execute if score @s gm4_bas_turn matches 2 run tp @s ~ ~ ~ ~1 ~ ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/guidebook/better_armour_stands.json ================================================ { "id": "better_armour_stands", "name": "Better Armour Stands", "module_type": "base", "icon": { "id": "minecraft:writable_book" }, "criteria": { "place_armor_stand": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:armor_stand" ] } } ] } }, "obtain_book_and_quill": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:writable_book" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "place_armor_stand" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.better_armour_stands.description", "fallback": "Armour stands will have arms by default, and can be altered with a book and quill.\n\nThis allows one to create custom statues and interesting displays." } ] ] }, { "name": "codes", "enable": [], "requirements": [ [ "obtain_book_and_quill" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.better_armour_stands.applying", "fallback": "To modify an armour stand, write one of the codes in a book and quill, then use it on the armour stand.\n\nMultiple codes can be written on separate pages to apply multiple modifiers at once." } ], [ { "translate": "text.gm4.guidebook.better_armour_stands.toggle_codes", "fallback": "The following codes will toggle the specific feature:" }, { "text": "\n- " }, { "text": "arms", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.arms", "fallback": "Toggle the arms of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "arms" } }, { "text": "\n- " }, { "text": "base", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.base", "fallback": "Toggle the base plate of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "base" } }, { "text": "\n- " }, { "text": "size", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.size", "fallback": "Toggle the size of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "size" } }, { "text": "\n- " }, { "text": "gravity", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.gravity", "fallback": "Toggle the gravity of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "gravity" } }, { "text": "\n- " }, { "text": "visible", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.visible", "fallback": "Toggle the visibility of the armour stand.\nHolding a book with this code will reveal\nnearby invisible armour stands.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "visible" } }, { "text": "\n- " }, { "text": "turn", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.turn", "fallback": "Toggle rotating of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "turn" } }, { "text": "\n\n- " }, { "text": "lock", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.lock", "fallback": "Disable interactions with the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "lock" } }, { "text": " / " }, { "text": "unlock", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.unlock", "fallback": "Enable interactions with the armour stand.\nHolding a book with this code will reveal\nnearby locked armour stands.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "unlock" } } ], [ { "translate": "text.gm4.guidebook.better_armour_stands.part_editing", "fallback": "The following codes activate editing of armour stand parts:" }, { "text": "\n- " }, { "text": "pose", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.pose", "fallback": "Edit a part of the armour stand by looking at its \"joint\".\n- Hold sneak to enable \"snapping\"\n- Left click to invert this pose\n- Right click to stop editing", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "pose" } }, { "text": "\n- " }, { "text": "pose mirror", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.pose_mirror", "fallback": "Edit a part of the armour stand by looking at its \"joint\".\nIf an arm/leg is selected, the other arm/leg pose is mirrored.\n- Hold sneak to enable \"snapping\"\n- Left click to invert this pose\n- Right click to stop editing", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "pose mirror" } }, { "text": "\n- " }, { "text": "move", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.move", "fallback": "Move the armour stand around you.\n- Hold sneak to enable \"snapping\"\n- Right click to stop editing", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "move" } }, { "text": "\n- " }, { "text": "rotate", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.rotate", "fallback": "Rotate the armour stand.\n- Hold sneak to enable \"snapping\"\n- Right click to stop editing", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "rotate" } }, { "text": "\n\n- " }, { "text": "flip", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.flip", "fallback": "Flip the full pose of the armour stand", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "flip" } }, { "text": "\n\n- " }, { "text": "default", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.default", "fallback": "- Look at a part of the armour stand to reset this pose.\n- Sneak to fully reset the armour stand.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "default" } } ], [ { "translate": "text.gm4.guidebook.better_armour_stands.equipping", "fallback": "Items can be placed in the head or arm slots:" }, { "text": "\n- " }, { "text": "equip", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.equip", "fallback": "Look at the head or shoulders of the armour stand to place an item from the offhand into this slot.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "equip" } }, { "text": "\n\n" }, { "translate": "text.gm4.guidebook.better_armour_stands.copy_and_paste", "fallback": "Armour stand data can be copied and pasted:" }, { "text": "\n- " }, { "text": "copy", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy", "fallback": "Copy modified features onto the armour stand items in your offhand.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "copy" } }, { "text": "\n- " }, { "text": "paste", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.paste", "fallback": "Copy features from the copied armour stand items in your offhand to the armour stand.", "color": "gray" }, "\n", { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "paste" } } ] ] } ] } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/add_ignore.json ================================================ { "function": "minecraft:set_custom_data", "tag": "{gm4_bas_ignore:1b}" } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/copy.json ================================================ [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true } }, { "function": "minecraft:set_lore", "mode": "replace_all", "entity": "this", "lore": [ [ { "translate": "item.gm4.better_armour_stands.copied_armor_stand.author", "fallback": "Copied by: ", "color": "gray", "italic": false, "extra": [ { "selector": "@a[tag=gm4_bas_active,limit=1]" } ] } ] ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "text": "● ", "color": "gray", "italic": false }, { "translate": "item.gm4.better_armour_stands.copied_armor_stand.property.custom_pose", "fallback": "Custom pose", "color": "gray", "italic": false } ] ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "text": "● ", "color": "gray", "italic": false }, { "translate": "item.gm4.better_armour_stands.copied_armor_stand.property.small", "fallback": "Small", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Small:1b}" } } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "text": "● ", "color": "gray", "italic": false }, { "translate": "item.gm4.better_armour_stands.copied_armor_stand.property.no_base", "fallback": "No base plate", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{NoBasePlate:1b}" } } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "text": "● ", "color": "gray", "italic": false }, { "translate": "item.gm4.better_armour_stands.copied_armor_stand.property.no_gravity", "fallback": "No gravity", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{NoGravity:1b}" } } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "text": "● ", "color": "gray", "italic": false }, { "translate": "item.gm4.better_armour_stands.copied_armor_stand.property.invisible", "fallback": "Invisible", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Invisible:1b}" } } ] } ] ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/count.json ================================================ { "function": "minecraft:set_count", "count": 1, "add": false } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/remove_ignore.json ================================================ { "function": "minecraft:set_custom_data", "tag": "{gm4_bas_ignore:0b}" } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/item_modifier/remove_item.json ================================================ { "function": "minecraft:set_count", "count": -1, "add": true } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/loot_table/replaced_item.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:stick", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_better_armour_stands_replaced_item:1b}" } ] } ] } ] } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/coord_check.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "position": { "x": { "min": -2000000, "max": 2000000 }, "z": { "min": -2000000, "max": 2000000 } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/emptybook.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ], "components": { "minecraft:writable_book_content": { "pages": [] } } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/armor_stand_copy.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:armor_stand" ], "components": { "minecraft:enchantment_glint_override": true } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_and_quill.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ] } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_arms.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ], "components": { "minecraft:writable_book_content": { "pages": [ "arms" ] } } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_ignore.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_bas_ignore:1b}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "components": { "minecraft:writable_book_content": { "pages": [] } } } } } } ] } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_unlock.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ], "components": { "minecraft:writable_book_content": { "pages": [ "unlock" ] } } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/mainhand/book_visible.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:writable_book" ], "components": { "minecraft:writable_book_content": { "pages": [ "visible" ] } } } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/offhand/armor_stand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:armor_stand" ] } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/holding/offhand/nothing.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "count": 0 } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/base.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_base\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/body.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_body\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/head.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_head\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/left_arm.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_left_arm\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/left_leg.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_left_leg\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/right_arm.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_right_arm\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/select/right_leg.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "nbt": "{Tags:[\"gm4_bas_right_leg\"]}" } } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/predicate/sneaking.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/tags/function/apply_book.json ================================================ { "values": [ "gm4_better_armour_stands:book/apply" ] } ================================================ FILE: gm4_better_armour_stands/data/gm4_better_armour_stands/tags/function/default.json ================================================ { "values": [ "gm4_better_armour_stands:default/all" ] } ================================================ FILE: gm4_better_armour_stands/mod.mcdoc ================================================ use ::java::world::entity::mob::armor_stand::Pose use ::java::world::entity::AnyEntity use ::java::util::Filterable dispatch minecraft:storage[gm4_better_armour_stands:default] to struct { Pose?: Pose } dispatch minecraft:storage[gm4_better_armour_stands:temp] to struct { pages?: [Filterable], entity_data?: AnyEntity, CurrentPose?: Pose, Pose?: Pose, Undo?: any, Data?: struct { Pose?: Pose, Rotation?: [float] @ 2, Pos?: [double] @ 3, }, } ================================================ FILE: gm4_better_armour_stands/translations.csv ================================================ key,en_us advancement.gm4.better_armour_stands.description,Customize an armour stand advancement.gm4.better_armour_stands.title,Gettin' Handsy item.gm4.better_armour_stands.copied_armor_stand.author,Copied by: item.gm4.better_armour_stands.copied_armor_stand.property.custom_pose,Custom pose item.gm4.better_armour_stands.copied_armor_stand.property.invisible,Invisible item.gm4.better_armour_stands.copied_armor_stand.property.no_base,No base plate item.gm4.better_armour_stands.copied_armor_stand.property.no_gravity,No gravity item.gm4.better_armour_stands.copied_armor_stand.property.small,Small tooltip.gm4.better_armour_stands.invalid_code,Invalid code tooltip.gm4.better_armour_stands.invalid_right_click_location,Right click the joint of a part to start editing text.gm4.guidebook.module_desc.better_armour_stands,Ever felt like Armour Stands looked a bit boring? Better Armour Stands lets your Armour Stands strike all the poses you want! Simply use a Book and Quill to edit Armour Stands. text.gm4.guidebook.better_armour_stands.description,"Armour stands will have arms by default, and can be altered with a book and quill.\n\nThis allows one to create custom statues and interesting displays." text.gm4.guidebook.better_armour_stands.applying,"To modify an armour stand, write one of the codes in a book and quill, then use it on the armour stand.\n\nMultiple codes can be written on separate pages to apply multiple modifiers at once." text.gm4.guidebook.better_armour_stands.toggle_codes,The following codes will toggle the specific feature: text.gm4.guidebook.better_armour_stands.arms,Toggle the arms of the armour stand text.gm4.guidebook.better_armour_stands.copy_code,Click to copy text.gm4.guidebook.better_armour_stands.base,Toggle the base plate of the armour stand text.gm4.guidebook.better_armour_stands.size,Toggle the size of the armour stand text.gm4.guidebook.better_armour_stands.gravity,Toggle the gravity of the armour stand text.gm4.guidebook.better_armour_stands.visible,Toggle the visibility of the armour stand.\nHolding a book with this code will reveal\nnearby invisible armour stands. text.gm4.guidebook.better_armour_stands.turn,Toggle rotating of the armour stand text.gm4.guidebook.better_armour_stands.lock,Disable interactions with the armour stand text.gm4.guidebook.better_armour_stands.unlock,Enable interactions with the armour stand.\nHolding a book with this code will reveal\nnearby locked armour stands. text.gm4.guidebook.better_armour_stands.part_editing,The following codes activate editing of armour stand parts: text.gm4.guidebook.better_armour_stands.pose,"Edit a part of the armour stand by looking at its ""joint"".\n- Hold sneak to enable ""snapping""\n- Left click to invert this pose\n- Right click to stop editing" text.gm4.guidebook.better_armour_stands.pose_mirror,"Edit a part of the armour stand by looking at its ""joint"".\nIf an arm/leg is selected, the other arm/leg pose is mirrored.\n- Hold sneak to enable ""snapping""\n- Left click to invert this pose\n- Right click to stop editing" text.gm4.guidebook.better_armour_stands.move,"Move the armour stand around you.\n- Hold sneak to enable ""snapping""\n- Right click to stop editing" text.gm4.guidebook.better_armour_stands.rotate,"Rotate the armour stand.\n- Hold sneak to enable ""snapping""\n- Right click to stop editing" text.gm4.guidebook.better_armour_stands.flip,Flip the full pose of the armour stand text.gm4.guidebook.better_armour_stands.default,- Look at a part of the armour stand to reset this pose.\n- Sneak to fully reset the armour stand. text.gm4.guidebook.better_armour_stands.equipping,Items can be placed in the head or arm slots: text.gm4.guidebook.better_armour_stands.equip,Look at the head or shoulders of the armour stand to place an item from the offhand into this slot. text.gm4.guidebook.better_armour_stands.copy_and_paste,Armour stand data can be copied and pasted: text.gm4.guidebook.better_armour_stands.copy,Copy modified features onto the armour stand items in your offhand. text.gm4.guidebook.better_armour_stands.paste,Copy features from the copied armour stand items in your offhand to the armour stand. ================================================ FILE: gm4_block_compressors/README.md ================================================ # Block Compressors Store even more blocks in a single slot by squishing them within an inch of their cubic-self. ### Features - The same item type can be compressed to 1/64 of its size - eg 64 wool blocks becomes 1 compressed wool block, which itself can be stacked to 64. - Adds a machine block that can automate compression for storage systems - A chest full of shulker boxes, each full of *64 compressed items, can hold 2,985,984 items... think of the efficiency! ================================================ FILE: gm4_block_compressors/assets/gm4_block_compressors/models/block/block_compressor_full.json ================================================ { "parent": "gm4:block/cube_with_plate", "textures": { "side": "gm4_block_compressors:block/block_compressor_side", "bottom": "minecraft:block/furnace_top", "top": "gm4_block_compressors:block/block_compressor_top", "front": "gm4_block_compressors:block/block_compressor_side", "plate": "gm4_block_compressors:block/block_compressor_plate", "particle": "gm4_block_compressors:block/block_compressor_side" } } ================================================ FILE: gm4_block_compressors/assets/gm4_block_compressors/models/block/block_compressor_plate.json ================================================ { "parent": "gm4:block/plate", "textures": { "top": "gm4_block_compressors:block/block_compressor_plate", "particle": "gm4_block_compressors:block/block_compressor_plate" } } ================================================ FILE: gm4_block_compressors/assets/translations.csv ================================================ key,en_us advancement.gm4.block_compressors.compressed_diet.description,Eat too much of everything. This can't be good for you... advancement.gm4.block_compressors.compressed_diet.title,A Compressed Diet advancement.gm4.block_compressors.description,Make yourself a Block Compressor advancement.gm4.block_compressors.title,Clever Crushing block.gm4.block_compressor,Compressor container.gm4.block_compressor,Compression Amount text.gm4.block_compressors.compressed,Compressed ×%s text.gm4.guidebook.module_desc.block_compressors,"Chest space won't be an issue with this module! Use a Block Compressor to compress stacks of items, turning a stack of items into a single item for long-term storage. Make sure to uncompress your items before using them again, though!" text.gm4.guidebook.block_compressors.description,"Block Compressors can be used to cut down on bulk storage. Item stacks can be compressed into a single item, and vice versa." text.gm4.guidebook.block_compressors.crafting,A Block Compressor can be crafted in a crafting table: text.gm4.guidebook.block_compressors.usage,"To select the amount of compression, put that amount of items inside the block compressor, then drop the items on top of the compressor.\n\nPutting 1 item in the compressor will decompress any items on top." ================================================ FILE: gm4_block_compressors/beet.yaml ================================================ id: gm4_block_compressors name: Block Compressors version: 1.7.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: [main] translation_linter_ignores: - text.gm4.block_compressors.compressed model_data: - item: purpur_block reference: block/block_compressor_plate transforms: - name: item_display origin: [0.5, 0.5, 0.5] scale: [0.625, 0.625, 0.625] translation: [0, -0.225, 0] rotation: [180, 0, 0] - item: stone reference: block/block_compressor template: block textures: top: gm4_block_compressors:block/block_compressor_top bottom: minecraft:block/furnace_top front: gm4_block_compressors:block/block_compressor_side side: gm4_block_compressors:block/block_compressor_side transforms: - name: item_display origin: [0.5, 0.5, 0.5] scale: [0.5, 0.5, 0.5] - item: player_head reference: block/block_compressor_full - item: piston reference: gui/advancement/block_compressors template: name: advancement forward: block/block_compressor_full gui_fonts: - translation: gui.gm4.block_compressor container: dropper texture: gui/container/block_compressor website: description: Chest space won't be an issue with this module! Use a Block Compressor to compress stacks of items, turning a stack of items into a single item for long-term storage. Make sure to uncompress your items before using them again, though! recommended: - gm4_resource_pack - gm4_standard_crafting - gm4_ender_hoppers - gm4_enchantment_extractors - gm4_forming_press - gm4_disassemblers - gm4_tunnel_bores - gm4_boots_of_ostara - gm4_heart_canisters - gm4_smelteries - gm4_liquid_tanks notes: [] modrinth: project_id: TSz8iiMD planetminecraft: uid: 4344954 video: https://www.youtube.com/watch?v=sdrTJYjL8C0 wiki: https://wiki.gm4.co/wiki/Block_Compressors credits: Creator: - Sparks Updated by: - SunderB - Misode - JP12 - BPR Textures by: - Kyrius Icon Design: - Sparks ================================================ FILE: gm4_block_compressors/data/gm4/advancement/block_compressors.json ================================================ { "display": { "icon": { "id": "piston", "components": { "minecraft:custom_model_data": {"strings":["gm4_block_compressors:gui/advancement/block_compressors"]} } }, "title": { "translate": "advancement.gm4.block_compressors.title", "fallback": "Clever Crushing" }, "description": { "translate": "advancement.gm4.block_compressors.description", "fallback": "Make yourself a Block Compressor", "color": "gray" } }, "parent": "gm4:root", "criteria": { "obtain_block_compressor": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"block_compressor\"}}" } } ] } } } } ================================================ FILE: gm4_block_compressors/data/gm4/advancement/block_compressors_compressed_diet.json ================================================ { "display": { "icon": { "id": "minecraft:apple", "components": { "minecraft:enchantment_glint_override": true } }, "title": { "translate": "advancement.gm4.block_compressors.compressed_diet.title", "fallback": "A Compressed Diet" }, "description": { "translate": "advancement.gm4.block_compressors.compressed_diet.description", "fallback": "Eat too much of everything. This can't be good for you...", "color": "gray" }, "frame": "challenge", "hidden": true }, "parent": "gm4:block_compressors", "criteria": { "apple": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:apple" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "bread": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:bread" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "porkchop": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:porkchop" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_porkchop": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_porkchop" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "golden_apple": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:golden_apple" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cod": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cod" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "salmon": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:salmon" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "tropical_fish": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:tropical_fish" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "pufferfish": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:pufferfish" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_cod": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_cod" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_salmon": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_salmon" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cookie": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cookie" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "melon_slice": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:melon_slice" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "beef": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:beef" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_beef": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_beef" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "chicken": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:chicken" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_chicken": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_chicken" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "rotten_flesh": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:rotten_flesh" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "spider_eye": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:spider_eye" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "carrot": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:carrot" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "potato": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:potato" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "baked_potato": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:baked_potato" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "poisonous_potato": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:poisonous_potato" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "golden_carrot": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:golden_carrot" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "pumpkin_pie": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:pumpkin_pie" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "rabbit": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:rabbit" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_rabbit": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_rabbit" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "mutton": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:mutton" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "cooked_mutton": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:cooked_mutton" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "chorus_fruit": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:chorus_fruit" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "beetroot": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:beetroot" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "dried_kelp": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:dried_kelp" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "sweet_berries": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:sweet_berries" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } }, "honey_bottle": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:honey_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:16}}" } } } }, "glow_berries": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:glow_berries" ], "predicates": { "minecraft:custom_data": "{gm4_block_compressors:{compression_level:64}}" } } } } }, "requirements": [ [ "apple" ], [ "bread" ], [ "porkchop" ], [ "cooked_porkchop" ], [ "golden_apple" ], [ "cod" ], [ "salmon" ], [ "tropical_fish" ], [ "pufferfish" ], [ "cooked_cod" ], [ "cooked_salmon" ], [ "cookie" ], [ "melon_slice" ], [ "beef" ], [ "cooked_beef" ], [ "chicken" ], [ "cooked_chicken" ], [ "rotten_flesh" ], [ "spider_eye" ], [ "carrot" ], [ "potato" ], [ "baked_potato" ], [ "poisonous_potato" ], [ "golden_carrot" ], [ "pumpkin_pie" ], [ "rabbit" ], [ "cooked_rabbit" ], [ "mutton" ], [ "cooked_mutton" ], [ "chorus_fruit" ], [ "beetroot" ], [ "dried_kelp" ], [ "sweet_berries" ], [ "honey_bottle" ], [ "glow_berries" ] ], "rewards": { "experience": 500 } } ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/advancement/recipes/compressor.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_block_compressors:compressor" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:purpur_block", "minecraft:purpur_pillar", "minecraft:piston", "minecraft:obsidian" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_block_compressors:compressor" ] } } ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/init.mcfunction ================================================ execute unless score block_compressors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Block Compressors"} execute unless score block_compressors gm4_earliest_version < block_compressors gm4_modules run scoreboard players operation block_compressors gm4_earliest_version = block_compressors gm4_modules scoreboard players set block_compressors gm4_modules 1 scoreboard objectives add gm4_bc_data dummy schedule function gm4_block_compressors:main 1t #$moduleUpdateList ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item/compress.mcfunction ================================================ # @s = item entity to be compressed # at location of dropper (compressor) # run from block_compressors:item # compresses item by setting count, storing current item tag, and adding lore/enchantment glint # copy existing data for restoration at decompression, second line fixes bug where gm4_block_compressors gets saved to old_components data modify storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_components set from storage gm4_block_compressors:temp/item_stack Item.components data remove storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_components."minecraft:custom_data".gm4_block_compressors # add tag to indicate store compression size execute store result storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.compression_level int 1 run data get storage gm4_block_compressors:temp/item_stack Item.count # set count to 1 and add compressed item visuals data merge storage gm4_block_compressors:temp/item_stack {Item:{count:1,components:{"minecraft:enchantment_glint_override":true}}} function gm4_block_compressors:item/set_lore with storage gm4_block_compressors:temp/item_stack Item.components.'minecraft:custom_data'.gm4_block_compressors # clone data to original item entity data modify entity @s Item set from storage gm4_block_compressors:temp/item_stack Item data modify entity @s PickupDelay set value 4 playsound block.piston.extend block @a ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item/decompress.mcfunction ================================================ # @s = item entity to be decompressed # at location of dropper (compressor) # run from block_compressors:item # decompresses item by setting count and restoring old item tag # code automatically handles archaic items, this newer old items data modify storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.compression_level set from storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_compressed.value data modify storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_tag set from storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_precompression_tag data modify storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_components."minecraft:custom_data" merge from storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_tag # set item count data modify storage gm4_block_compressors:temp/item_stack Item.count set from storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.compression_level # remove components if it does not have gm4_block_compressors.old_components execute unless data storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_components run data remove storage gm4_block_compressors:temp/item_stack Item.components # restore original item components, overwriting components from compression data modify storage gm4_block_compressors:temp/item_stack Item.components set from storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors.old_components data modify entity @s Item set from storage gm4_block_compressors:temp/item_stack Item data modify entity @s PickupDelay set value 4 playsound entity.firework_rocket.blast block @a ~ ~ ~ 1 .1 ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item/set_lore.mcfunction ================================================ # Uses a macro to append the compressed lore line to the item in storage # @s = item entity to be compressed # run from gm4_block_compressors:item/compress $data modify storage gm4_block_compressors:temp/item_stack Item.components."minecraft:lore" append value {translate:"text.gm4.block_compressors.compressed",fallback:"Compressed ×%s",with:[$(compression_level)],color:"gray",italic:false} ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item/try_compress.mcfunction ================================================ # @s = item above block compressor # at location of dropper (compressor) # run from process # checks if item's count is matched anywhere in dropper, then compresses data modify storage gm4_block_compressors:temp/compressor Items set from block ~ ~ ~ Items execute if data storage gm4_block_compressors:temp/compressor Items[0] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[0].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[1] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[1].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[2] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[2].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[3] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[3].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[4] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[4].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[5] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[5].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[6] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[6].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[7] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[7].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 1 if data storage gm4_block_compressors:temp/compressor Items[8] store success score @s gm4_bc_data run data modify storage gm4_block_compressors:temp/compressor Items[8].count set from storage gm4_block_compressors:temp/item_stack Item.count execute if score @s gm4_bc_data matches 0 run function gm4_block_compressors:item/compress data remove storage gm4_block_compressors:temp/compressor Items ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item/try_decompress.mcfunction ================================================ # @s = item above block compressor # at location of dropper (compressor) # run from process # checks if item is a compressed item, prevents further checks scoreboard players set $decompressing gm4_bc_data 1 data modify storage gm4_block_compressors:temp/compressor Items set from block ~ ~ ~ Items execute if data storage gm4_block_compressors:temp/compressor {Items:[{count:1}]} if data storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors run function gm4_block_compressors:item/decompress # grandfather in older items execute if data storage gm4_block_compressors:temp/compressor {Items:[{count:1}]} if data storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_compressed run function gm4_block_compressors:item/decompress data remove storage gm4_block_compressors:temp/compressor Items ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/item.mcfunction ================================================ # @s = item above block compressor # at location of dropper (compressor) # run from process # tries to compress/decompress the current item entity. # $decompressing's states are 0:try compresss, 1:try decompress data modify storage gm4_block_compressors:temp/item_stack Item set from entity @s Item scoreboard players set $decompressing gm4_bc_data 0 execute if data storage gm4_block_compressors:temp/item_stack Item{count:1} run function gm4_block_compressors:item/try_decompress execute unless score $decompressing gm4_bc_data matches 1 unless data storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_block_compressors unless data storage gm4_block_compressors:temp/item_stack Item.components."minecraft:custom_data".gm4_compressed run function gm4_block_compressors:item/try_compress scoreboard players reset $decompressing gm4_bc_data data remove storage gm4_block_compressors:temp/item_stack Item ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/machine/create.mcfunction ================================================ # places the block_compressor down # @s = player who placed the block_compressor # located at the center of the placed block # run from gm4_block_compressors:machine/verify_place_down # place dropper setblock ~ ~ ~ dropper[facing=down]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.block_compressor","fallback":"Compression Amount"},[{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.block_compressor","fallback":"Compression Amount","font":"gm4:half_invert"},{"translate":"container.gm4.block_compressor","fallback":"Compression Amount","font":"gm4:offscreen"},{"translate":"gui.gm4.block_compressor","fallback":"","font":"gm4:container_gui","color":"white"},{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.block_compressor","fallback":"Compression Amount","font":"gm4:half_invert"},{"translate":"container.gm4.block_compressor","fallback":"Compression Amount","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {Tags:["gm4_block_compressor_plate","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_block_compressor_plate",item:{id:"minecraft:purpur_block",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_block_compressors:block/block_compressor_plate"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[1f,0f,0f,0f],translation:[0.0,0.225,0.0],scale:[0.625,0.625,0.625]},brightness:{block:15,sky:15},item_display:"head"} summon item_display ~ ~ ~ {Tags:["gm4_block_compressor_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_block_compressor_display",item:{id:"minecraft:stone",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_block_compressors:block/block_compressor"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.5,0.5,0.5]},brightness:{block:15,sky:15},item_display:"head"} summon marker ~ ~ ~ {Tags:["gm4_block_compressor","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_block_compressor",Rotation:[0.0f,0.0f]} # mark block as placed playsound minecraft:block.piston.contract block @a[distance=..5] scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/machine/destroy.mcfunction ================================================ # destroys the block_compressor # @s = block_compressor marker # located at @s # run from gm4_block_compressors:machine/verify_destroy # kill entities related to machine block execute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_block_compressor_plate,limit=1,distance=..0.1] execute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_block_compressor_display,limit=1,distance=..0.1] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:dropper",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle minecraft:block{block_state:"minecraft:piston"} ~ ~ ~ .1 .25 .1 .05 30 normal @a execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_block_compressors:items/block_compressor ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_block_compressor] run function gm4_block_compressors:machine/destroy ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"block_compressor"} run function gm4_block_compressors:machine/create ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/main.mcfunction ================================================ # process machine execute as @e[type=marker,tag=gm4_block_compressor] at @s run function gm4_block_compressors:process schedule function gm4_block_compressors:main 16t ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/pressure_plate_down.mcfunction ================================================ # @s = compressor armor stand that needs to be moved down # located at @s # run from process tp @s ~ ~-0.03 ~ tag @s add gm4_compressor_depressed tag @e[type=marker,tag=gm4_block_compressor_processing,limit=1] add gm4_compressor_sound ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/pressure_plate_up.mcfunction ================================================ # @s = compressor armor stand that needs to be reset # located at @s # run from process tp @s ~ ~0.03 ~ tag @s remove gm4_compressor_depressed tag @e[type=marker,tag=gm4_block_compressor_processing,limit=1] remove gm4_compressor_sound playsound block.stone_pressure_plate.click_off block @a[distance=..6] ~ ~0.35 ~ 0.7 0.3 ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/process.mcfunction ================================================ # @s = block compressor # located at @s # run from main tag @s add gm4_block_compressor_processing execute positioned ~-0.5 ~0.5 ~-0.5 as @e[type=item,dx=0] positioned ~0.5 ~-0.9 ~0.5 run function gm4_block_compressors:item particle portal ~ ~0.7 ~ 0 0 0 0.1 20 # simulate pressure plate execute positioned ~ ~-0.03 ~ as @e[type=item_display,tag=gm4_block_compressor_plate,tag=gm4_compressor_depressed,distance=..0.01,limit=1] positioned ~-0.5 ~0.5 ~-0.5 unless entity @e[dx=0] at @s run function gm4_block_compressors:pressure_plate_up execute positioned ~-0.5 ~0.5 ~-0.5 if entity @e[dx=0] positioned ~0.5 ~-0.5 ~0.5 as @e[type=item_display,tag=gm4_block_compressor_plate,tag=!gm4_compressor_depressed,distance=..0.01,limit=1] at @s run function gm4_block_compressors:pressure_plate_down execute if entity @s[tag=gm4_compressor_sound] run playsound block.stone_pressure_plate.click_on block @a[distance=..6] ~ ~0.35 ~ 0.7 0.6 # clean up tag @s remove gm4_compressor_sound tag @s remove gm4_block_compressor_processing ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/function/upgrade_paths/1.4.mcfunction ================================================ execute as @e[type=armor_stand,tag=gm4_block_compressor_stand] at @s positioned ~ ~0.965 ~ align y run summon item_display ~ ~0.5 ~ {Tags:["gm4_block_compressor_plate","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_block_compressor_plate",item:{id:"minecraft:purpur_block",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_block_compressors:block/block_compressor_plate"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[1f,0f,0f,0f],translation:[0.0,0.225,0.0],scale:[0.625,0.625,0.625]},brightness:{block:15,sky:15},item_display:"head"} execute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s align y run summon item_display ~ ~0.5 ~ {Tags:["gm4_block_compressor_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_block_compressor_display",item:{id:"minecraft:stone",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_block_compressors:block/block_compressor"]}}},transformation:{right_rotation:[0f,0f,0f,1f],left_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.5,0.5,0.5]},brightness:{block:15,sky:15},item_display:"head"} execute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s run scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 execute as @e[type=armor_stand,tag=gm4_block_compressor_display] at @s run tag @e[distance=..2] remove gm4_new_machine kill @e[type=armor_stand,tag=gm4_block_compressor_display] kill @e[type=armor_stand,tag=gm4_block_compressor_stand] ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/guidebook/block_compressors.json ================================================ { "id": "block_compressors", "name": "Block Compressors", "module_type": "module", "icon": { "id": "minecraft:piston" }, "criteria": { "obtain_obsidian": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:obsidian" ] } ] } }, "obtain_piston": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:piston" ] } ] } }, "obtain_block_compressor": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"block_compressor\"}}" } } ] } }, "open_block_compressor": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:dropper" ], "nbt": "{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\"},{\"text\":\" \",\"extra\":[{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.block_compressor\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.block_compressor\",\"fallback\":\"Compression Amount\",\"font\":\"gm4:default\",\"color\":\"#404040\"}],\"font\":\"gm4:half_invert\"}]}}" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.block_compressors.description", "fallback": "Block Compressors can be used to cut down on bulk storage. Item stacks can be compressed into a single item, and vice versa." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_obsidian", "obtain_piston" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.block_compressors.crafting", "fallback": "A Block Compressor can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_block_compressors:compressor" } ] ], "prerequisites": [ "description" ] }, { "name": "usage", "enable": [], "requirements": [ [ "open_block_compressor", "obtain_block_compressor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.block_compressors.usage", "fallback": "To select the amount of compression, put that amount of items inside the block compressor, then drop the items on top of the compressor.\n\nPutting 1 item in the compressor will decompress any items on top." } ] ], "grants": [ "crafting" ] } ] } ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/loot_table/items/block_compressor.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_block_compressors:block/block_compressor_full"]}, "minecraft:profile": "$block_compressor" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'block_compressor'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.block_compressor", "fallback": "Compressor", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/recipe/compressor.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "IPI", "pOp", "CCC" ], "key": { "I": "minecraft:iron_ingot", "P": "minecraft:purpur_block", "p": "minecraft:piston", "O": "minecraft:obsidian", "C": "minecraft:cobblestone" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_block_compressors:block/block_compressor_full"]}, "minecraft:profile": "$block_compressor", "minecraft:custom_data": "{gm4_machines:{id:'block_compressor'}}", "minecraft:custom_name": {"translate":"block.gm4.block_compressor","fallback":"Compressor","color":"white","italic":false} } } } ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/compress_64.mcfunction ================================================ # @template gm4:test_platform # @skyaccess execute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create item replace block ~1 ~1 ~1 container.0 with cobblestone 64 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:diamond",count:64}} await items entity @e[type=item,distance=..4] contents diamond[custom_data~{gm4_block_compressors:{compression_level:64}}] ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/compress_7.mcfunction ================================================ # @template gm4:test_platform # @skyaccess execute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create item replace block ~1 ~1 ~1 container.0 with cobblestone 7 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:diamond",count:7}} await items entity @e[type=item,distance=..4] contents diamond[custom_data~{gm4_block_compressors:{compression_level:7}}] ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/decompress_64.mcfunction ================================================ # @template gm4:test_platform # @skyaccess execute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create item replace block ~1 ~1 ~1 container.0 with cobblestone summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:diamond",components:{"minecraft:custom_data":{gm4_block_compressors:{compression_level:64}}}}} await items entity @e[type=item,distance=..4] contents minecraft:diamond[!custom_data~{gm4_block_compressors:{}}] ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/destroy.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ execute positioned ~1.5 ~1.5 ~1.5 run function gm4_block_compressors:machine/create give @s diamond_pickaxe dummy @s mine ~1 ~1 ~1 assert items entity @e[type=item,distance=..3] contents minecraft:dropper[count=1] await items entity @e[type=item,distance=..3] contents minecraft:player_head[count=1,custom_data~{gm4_machines:{id:"block_compressor"}}] ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/fixed_uuid_present.mcfunction ================================================ # Make sure that the armor stand with fixed UUID is present assert entity 344d47-4-4-4-f04ce104d ================================================ FILE: gm4_block_compressors/data/gm4_block_compressors/test/place.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ loot give @s loot gm4_block_compressors:items/block_compressor execute at @s run tp @s ~ ~ ~ facing ~1 ~-0.5 ~1 dummy @s use block ~1 ~1 ~1 assert block ~1 ~1 ~1 dropper assert entity @e[tag=gm4_block_compressor,distance=..3] ================================================ FILE: gm4_block_compressors/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_block_compressors:machine/verify_destroy" ] } ================================================ FILE: gm4_block_compressors/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_block_compressors:machine/verify_place_down" ] } ================================================ FILE: gm4_block_compressors/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_block_compressors:temp/item_stack] to struct { Item?: ItemStack, gm4_compressed?: boolean, } dispatch minecraft:storage[gm4_block_compressors:temp/compressor] to struct { Items?: [ItemStack], } ================================================ FILE: gm4_blossoming_pots/README.md ================================================ # Blossoming Pots Greatly expands the selection of potable plants. Use Decorated Pots as abnormally large Flower Pots. Decorate in Style! Plant in Decorated Pots and Flower Pots alike ### Features - To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item. - Flower Pots from this module can be emptied by interacting with an empty hand, just like vanilla Flower Pots. To empty a Decorated Pot of its plant, it must be broken. - Decorated Pot plants often have multiple stages for a plant. A full list of supported items can be found on the [Wiki](https://wiki.gm4.co/Blossoming_Pots#Supported_Items) ================================================ FILE: gm4_blossoming_pots/beet.yaml ================================================ id: gm4_blossoming_pots name: Blossoming Pots version: 3.5.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Greatly expands the selection of potable plants. Use Decorated Pots as abnormally large flower pots. Decorate in Style! recommended: - gm4_lively_lily_pads notes: [] search_keywords: - flowering - plant modrinth: project_id: wOnn6VDU smithed: pack_id: gm4_blossoming_pots planetminecraft: uid: 6135276 wiki: https://wiki.gm4.co/wiki/Blossoming_Pots credits: Creator: - runcows Icon Design: - runcows ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_decorated_pot.json ================================================ { "criteria": { "use_pot": { "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:decorated_pot" ] } } } ] }, "trigger": "minecraft:any_block_use" } }, "rewards": { "function": "gm4_blossoming_pots:decorated/as_player" } } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_flower_pot.json ================================================ { "criteria": { "use_pot": { "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:flower_pot" ] } } } ] }, "trigger": "minecraft:any_block_use" } }, "rewards": { "function": "gm4_blossoming_pots:flower/as_player" } } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/advancement/interact_with_vanilla_flower_pot.json ================================================ { "criteria": { "use_pot": { "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4_blossoming_pots:potted_plants" } } } ] }, "trigger": "minecraft:any_block_use" } }, "rewards": { "function": "gm4_blossoming_pots:vanilla_pot_handling/as_player" } } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/as_player.mcfunction ================================================ # Raycasts for pot the player interacted with, then proceeds if necessary # @s = player who interacted with a decorated pot # at @s # run from advancement gm4_blossoming_pots:interact_with_decorated_pot # Reset advancement advancement revoke @s only gm4_blossoming_pots:interact_with_decorated_pot # run upgrade paths if needed execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot execute if score blossoming_pots gm4_earliest_version matches ..304000 \ as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker # Reset temp data remove storage gm4_blossoming_pots:decorated_pots temp function gm4_blossoming_pots:decorated/get_player_rotation # raycast execute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200 execute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:decorated/raycast ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/check_if_pot_empty.mcfunction ================================================ # Checks if decorated pot has any items inside before trying to instantiate macro # @s = temp marker inside decorated pot # at @s align xyz positioned ~.5 ~.5 ~.5 # run from decorated/raycast # kills marker and returns, if pot empty execute unless data block ~ ~ ~ item run return run kill @s # fail if smithed.block execute align xyz if entity @e[tag=smithed.block,dx=0,dz=0,dy=0,limit=1] run return run kill @s # continues if not empty function gm4_blossoming_pots:decorated/set_count with block ~ ~ ~ item ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/get_player_rotation.mcfunction ================================================ # Gets player rotation data for later # @s = player who interacted with a decorated pot # at @s # run from decorated/as_player # player facing west execute if entity @s[y_rotation=45..135] unless entity @s[y_rotation=45] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 0 # player facing north execute if entity @s[y_rotation=135..225] unless entity @s[y_rotation=135] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 90 # player facing east execute if entity @s[y_rotation=225..315] unless entity @s[y_rotation=225] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value 180 # player facing south execute if entity @s[y_rotation=315..405] unless entity @s[y_rotation=315] run return run data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set value -90 ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/in_decorated_pot.mcfunction ================================================ # Checks the temp markers physical location in the block, to see if it is in the collision box of the decorated pot # @s = temp marker summoned in parent function # at @s # run from decorated/raycast # merge marker data for if it doesn't get killed data merge entity @s {Tags:["gm4_blossoming_pots.temp.decorated_pot","smithed.strict","smithed.entity"],CustomName:{"text":"gm4_blossoming_pots.temp_marker"}} # if temp marker in physical hit box, return 1 # dxdydz all 0 bc of MC-123441. execute at @s align xyz positioned ~0.062499 ~ ~0.062499 if entity @s[dx=0,dy=0,dz=0] \ at @s align xyz positioned ~-0.062499 ~ ~-0.062499 if entity @s[dx=0,dy=0,dz=0] \ run return 1 # else, kill marker, return fail kill @s return fail ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/prepare_data.mcfunction ================================================ # Sets up loop for plant stage changes # @s = temp marker inside decorated pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {id, count} # run from decorated/set_count # early return if displays are already on desired stage, does not check plant type $execute if score @e[type=minecraft:block_display,distance=..0.1,tag=gm4_blossoming_pots.display.decorated_pot,limit=1] gm4_blossoming_pots.display_stage matches $(count) run return run kill @s # only use rotation from player if there's no plant there, else overwrite with the plant's rotation value data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set from entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot,distance=..0.1,limit=1] Rotation[0] # kill existing displays to recreate them kill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot,distance=..0.1] # initialize other loop data execute store result storage gm4_blossoming_pots:decorated_pots temp.display_number int 1 run scoreboard players set $display_number gm4_blossoming_pots.misc 0 function gm4_blossoming_pots:decorated/set_temp_data with storage gm4_blossoming_pots:decorated_pots temp # temp storage should now contain {rotation, display_number, id, count, data} # store the number of displays needed $execute store result score $array_len gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:decorated_pots $(id).$(count) function gm4_blossoming_pots:decorated/set_displays with storage gm4_blossoming_pots:decorated_pots temp # play sound $function gm4_blossoming_pots:play_sound with storage gm4_blossoming_pots:decorated_pots $(id) ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/raycast.mcfunction ================================================ # Main loop for raycasting for the decorated pot the player interacted with # @s = player who interacted with a decorated pot # at @s anchored eyes, then marched forward 0.005 over and over # run from decorated/as_player and self # if current location is within the decorated pots hit box, summon a temp marker, set its data with the player rotation, and exit raycast execute if block ~ ~ ~ minecraft:decorated_pot \ summon minecraft:marker if function gm4_blossoming_pots:decorated/in_decorated_pot \ at @s align xyz positioned ~.5 ~.5 ~.5 \ run return run function gm4_blossoming_pots:decorated/check_if_pot_empty scoreboard players remove @s gm4_blossoming_pots.range 1 # repeat until find decorated pot or out of range execute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:decorated/raycast ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_count.mcfunction ================================================ # Decides if decorated/prepare_data should use maximum or count # @s = temp entity inside decorated pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {id, count} # run from decorated/check_if_pot_empty and upgrade_paths/3.1/legacy_decorated_pot # early return for unsupported item $execute unless data storage gm4_blossoming_pots:decorated_pots $(id) run return run kill @s $execute store result score $max_count gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:decorated_pots $(id).maximum # if pot over maximum use maximum as count $execute unless score $max_count gm4_blossoming_pots.misc matches $(count).. \ run data modify storage gm4_blossoming_pots:decorated_pots temp.count set from storage gm4_blossoming_pots:decorated_pots $(id).maximum # if not, just use count as is $execute if score $max_count gm4_blossoming_pots.misc matches $(count).. run data modify storage gm4_blossoming_pots:decorated_pots temp.count set value $(count) # set id as well $data merge storage gm4_blossoming_pots:decorated_pots {temp:{id:"$(id)"}} function gm4_blossoming_pots:decorated/prepare_data with storage gm4_blossoming_pots:decorated_pots temp kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_displays.mcfunction ================================================ # Main Loop for setting displays to desired stage # @s = temp entity inside decorated pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {display_number, count, data} # run from decorated/prepare_data and self # create display $summon minecraft:block_display ~ ~ ~ $(data) # set display_stage score to prevent running the loop when the displays are already on the right stage number $scoreboard players set @e[type=minecraft:block_display,distance=..0.1,tag=gm4_blossoming_pots.display.decorated_pot.$(display_number),limit=1] gm4_blossoming_pots.display_stage $(count) # increment display_number execute store result storage gm4_blossoming_pots:decorated_pots temp.display_number int 1 run scoreboard players add $display_number gm4_blossoming_pots.misc 1 # sets temp.data to next display_number's data function gm4_blossoming_pots:decorated/set_temp_data with storage gm4_blossoming_pots:decorated_pots temp # run again if needed execute unless score $display_number gm4_blossoming_pots.misc >= $array_len gm4_blossoming_pots.misc run function gm4_blossoming_pots:decorated/set_displays with storage gm4_blossoming_pots:decorated_pots temp ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_storage.mcfunction ================================================ # Sets command storage for decorated pot plants # @s = unspecified # at unspecified # run from init # Data storage layout # gm4_blossoming_pots:decorated_pots : # place_sound: sound file to play when succesfully adding plant or changing stage, include namespace # maximum: the number of stages / arrays. The maximum number of items the pot can take # 1:[] array of starting data for the all the block displays used in this stage, all data # 2:[] array of starting data for the all the block displays used in this stage, all data # ...... data modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_hanging_moss set value {\ place_sound:"minecraft:block.moss_carpet.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"true"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"true"\ }\ },\ transformation:{\ translation:[-0.35f,2.1425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"false"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"true"\ }\ },\ transformation:{\ translation:[-0.35f,2.842f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"false"\ }\ },\ transformation:{\ translation:[-0.35f,2.1425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"false"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pointed_dripstone set value {\ place_sound:"minecraft:block.pointed_dripstone.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"frustum"\ }\ },\ transformation:{\ translation:[-0.35f,1.4435f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"tip"\ }\ },\ transformation:{\ translation:[-0.35f,2.143f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"middle"\ }\ },\ transformation:{\ translation:[-0.35f,1.4435f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"frustum"\ }\ },\ transformation:{\ translation:[-0.35f,2.143f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"tip"\ }\ },\ transformation:{\ translation:[-0.35f,2.8425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"middle"\ }\ },\ transformation:{\ translation:[-0.35f,1.4435f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"middle"\ }\ },\ transformation:{\ translation:[-0.35f,2.143f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"frustum"\ }\ },\ transformation:{\ translation:[-0.35f,2.8425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"tip"\ }\ },\ transformation:{\ translation:[-0.35f,3.542f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:small_amethyst_bud set value {\ place_sound:"minecraft:block.small_amethyst_bud.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:small_amethyst_bud"\ },\ transformation:{\ translation:[-0.4f,0.7435f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:medium_amethyst_bud set value {\ place_sound:"minecraft:block.medium_amethyst_bud.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:medium_amethyst_bud"\ },\ transformation:{\ translation:[-0.4f,0.7435f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:large_amethyst_bud set value {\ place_sound:"minecraft:block.large_amethyst_bud.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:large_amethyst_bud"\ },\ transformation:{\ translation:[-0.4f,0.7435f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:amethyst_cluster set value {\ place_sound:"minecraft:block.amethyst_cluster.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:amethyst_cluster"\ },\ transformation:{\ translation:[-0.4f,0.7435f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } # For all leaves, empty no rotated middle, no inverted data modify storage gm4_blossoming_pots:decorated_pots minecraft:oak_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:spruce_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:birch_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:jungle_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:acacia_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dark_oak_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:mangrove_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:cherry_leaves set value {\ place_sound:"minecraft:block.cherry_leaves.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_oak_leaves set value {\ place_sound:"minecraft:block.grass.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:azalea_leaves set value {\ place_sound:"minecraft:block.azalea_leaves.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:flowering_azalea_leaves set value {\ place_sound:"minecraft:block.azalea_leaves.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } # Sapling second stages with vanilla tweaks has a lighting bug at certain angles, so the second stage rotates it back to 0 data modify storage gm4_blossoming_pots:decorated_pots minecraft:oak_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:oak_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:oak_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:spruce_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:spruce_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:spruce_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:birch_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:birch_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:birch_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:jungle_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:jungle_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:jungle_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:acacia_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:acacia_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:acacia_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dark_oak_sapling set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:dark_oak_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:dark_oak_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } # lighting bug also affects the default mangrove propagule, so it gets rotated immediately to 0 data modify storage gm4_blossoming_pots:decorated_pots minecraft:mangrove_propagule set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:mangrove_propagule"\ },\ transformation:{\ translation:[-0.5f,0.4935f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:mangrove_propagule",\ Properties:{\ stage:"1",\ age:"4",\ hanging:"false"\ }\ },\ transformation:{\ translation:[-0.5f,0.4935f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:cherry_sapling set value {\ place_sound:"minecraft:block.cherry_sapling.place",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:cherry_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:cherry_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pale_oak_sapling set value {\ place_sound:"minecraft:block.cherry_sapling.place",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:pale_oak_sapling"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:pale_oak_sapling",\ Properties:{\ stage:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ },\ Rotation:[0f,0f]\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:azalea set value {\ place_sound:"minecraft:block.azalea.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:azalea"\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:azalea"\ },\ transformation:{\ translation:[-0.35f,0.7435f,-0.35f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:azalea"\ },\ transformation:{\ translation:[-0.45f,0.7435f,-0.45f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.9f,0.9f,0.9f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:flowering_azalea set value {\ place_sound:"minecraft:block.flowering_azalea.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea"\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea"\ },\ transformation:{\ translation:[-0.35f,0.7435f,-0.35f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea"\ },\ transformation:{\ translation:[-0.45f,0.7435f,-0.45f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.9f,0.9f,0.9f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:brown_mushroom set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:brown_mushroom"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:red_mushroom set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:red_mushroom"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:crimson_fungus set value {\ place_sound:"minecraft:block.fungus.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:crimson_fungus"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:warped_fungus set value {\ place_sound:"minecraft:block.fungus.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:warped_fungus"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:short_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:short_grass"\ },\ transformation:{\ translation:[-0.361f,0.65325f,-0.361f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.722f,0.722f,0.722f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:fern set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:fern"\ },\ transformation:{\ translation:[-0.5f,0.4935f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:short_dry_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:short_dry_grass"\ },\ transformation:{\ translation:[-0.4315f,0.6895625f,-0.4315f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.863f,0.863f,0.863f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:bush"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_bush"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dandelion set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dandelion"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:poppy set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:poppy"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:blue_orchid set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:blue_orchid"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:allium set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:allium"\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:azure_bluet set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:azure_bluet"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:red_tulip set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:red_tulip"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:orange_tulip set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:orange_tulip"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:white_tulip set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:white_tulip"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pink_tulip set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:pink_tulip"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:oxeye_daisy set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:oxeye_daisy"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:cornflower set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:cornflower"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:lily_of_the_valley set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:lily_of_the_valley"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:torchflower set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:torchflower"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:cactus_flower set value {\ place_sound:"minecraft:block.cactus_flower.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:cactus_flower"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:closed_eyeblossom set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:closed_eyeblossom"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:open_eyeblossom set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:open_eyeblossom"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:wither_rose set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:wither_rose"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:spore_blossom set value {\ place_sound:"minecraft:block.spore_blossom.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:spore_blossom"\ },\ transformation:{\ translation:[-0.4f,1.54f,0.4f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:firefly_bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:firefly_bush"\ },\ transformation:{\ translation:[-0.4325f,0.6895625f,-0.4325f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.863f,0.863f,0.863f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:bamboo set value {\ place_sound:"minecraft:block.bamboo_sapling.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:bamboo_sapling"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"none"\ }\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"small"\ }\ },\ transformation:{\ translation:[-0.5f,1.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"none",\ age:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"small",\ age:"1"\ }\ },\ transformation:{\ translation:[-0.5f,1.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"small",\ age:"1"\ }\ },\ transformation:{\ translation:[-0.5f,2.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:bamboo",\ Properties:{\ leaves:"large",\ age:"1"\ }\ },\ transformation:{\ translation:[-0.5f,3.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:sugar_cane set value {\ place_sound:"minecraft:block.grass.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.25f,1.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } # Cactus data modify storage gm4_blossoming_pots:decorated_pots minecraft:cactus set value {\ place_sound:"minecraft:block.wool.place",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:potted_cactus"\ },\ transformation:{\ translation:[-0.5f,0.3684f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:potted_cactus"\ },\ transformation:{\ translation:[-0.5f,0.3684f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:potted_cactus"\ },\ transformation:{\ translation:[-0.2f,1.05f,-0.2f],\ left_rotation:[0.328f,0f,0f,0.945f],\ scale:[0.4f,0.4f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:potted_cactus"\ },\ transformation:{\ translation:[-0.2f,0.7f,-0.05f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.4f,0.4f],\ right_rotation:[-0.445f,0f,0f,0.895f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:crimson_roots set value {\ place_sound:"minecraft:block.roots.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:potted_crimson_roots"\ },\ transformation:{\ translation:[-0.5f,0.353f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:warped_roots set value {\ place_sound:"minecraft:block.roots.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:potted_warped_roots"\ },\ transformation:{\ translation:[-0.5f,0.353f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:weeping_vines set value {\ place_sound:"minecraft:block.weeping_vines.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:weeping_vines"\ },\ transformation:{\ translation:[-0.35f,2.1429f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,1.4434f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:weeping_vines"\ },\ transformation:{\ translation:[-0.35f,2.8424f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,2.1429f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,1.4434f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:weeping_vines"\ },\ transformation:{\ translation:[-0.35f,3.5419f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,2.8424f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,2.1429f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.35f,1.4434f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:twisting_vines set value {\ place_sound:"minecraft:block.weeping_vines.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:twisting_vines"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:twisting_vines"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:twisting_vines_plant"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:twisting_vines"\ },\ transformation:{\ translation:[-0.375f,2.2435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:twisting_vines_plant"\ },\ transformation:{\ translation:[-0.375f,1.4935f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:twisting_vines_plant"\ },\ transformation:{\ translation:[-0.375f,0.7435f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:tall_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:tall_grass",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.361f,0.65325f,-0.361f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.722f,0.722f,0.722f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:tall_grass",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.361f,1.37525f,-0.361f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.722f,0.722f,0.722f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:large_fern set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:large_fern",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:large_fern",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:tall_dry_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:tall_dry_grass"\ },\ transformation:{\ translation:[-0.4315f,0.6895626f,-0.4315f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.863f,0.863f,0.863f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } # default sunflower rotation is sunflower facing east, player should be facing west data modify storage gm4_blossoming_pots:decorated_pots minecraft:sunflower set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:sunflower",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:sunflower",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:sunflower",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:lilac set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:lilac",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:lilac",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:lilac",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:rose_bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:rose_bush",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,0.745f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:rose_bush",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:rose_bush",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:peony set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:peony",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,0.745f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:peony",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.556f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:peony",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.556f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pitcher_plant set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:pitcher_plant",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pitcher_plant",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.6185f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:big_dripleaf set value {\ place_sound:"minecraft:block.big_dripleaf.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:big_dripleaf",\ Properties:{\ facing:"east"\ }\ },\ transformation:{\ translation:[-0.25f,-0.019f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:big_dripleaf",\ Properties:{\ facing:"east"\ }\ },\ transformation:{\ translation:[-0.25f,0.271f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:big_dripleaf",\ Properties:{\ facing:"east"\ }\ },\ transformation:{\ translation:[-0.25f,0.56855f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:small_dripleaf set value {\ place_sound:"minecraft:block.small_dripleaf.place",\ maximum:2,\ 1:[\ {\ block_state:{\ Name:"minecraft:small_dripleaf",\ Properties:{\ facing:"east",\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:small_dripleaf",\ Properties:{\ facing:"east",\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.5f,0.306f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:small_dripleaf",\ Properties:{\ facing:"east",\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.5f,1.306f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:chorus_flower set value {\ place_sound:"minecraft:block.chorus_flower.grow",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,1.7435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ north:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ north:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,2.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,2.7435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ north:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ north:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.2435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.7435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.7435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[0.25f,3.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.75f,2.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,0.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ north:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ north:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.2435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.7435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,1.7435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ north:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.7435f,0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ north:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.7435f,0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ south:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,3.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ west:"true",\ east:"true"\ }\ },\ transformation:{\ translation:[-0.25f,2.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ up:"true",\ west:"true"\ }\ },\ transformation:{\ translation:[0.25f,2.2435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[0.25f,2.7435f,-0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,3.2435f,0.75f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,3.7435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:hanging_roots set value {\ place_sound:"minecraft:block.hanging_roots.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:hanging_roots"\ },\ transformation:{\ translation:[-0.361f,1.37525f,0.361f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.722f,0.722f,0.722f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:wheat_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:wheat",\ Properties:{\ age:"2"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:wheat",\ Properties:{\ age:"5"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:wheat",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:pumpkin_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:pumpkin_stem",\ Properties:{\ age:"4"\ }\ },\ transformation:{\ translation:[-0.5f,0.806f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:pumpkin_stem",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"attached_pumpkin_stem",\ Properties:{\ facing:"north"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:melon_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:melon_stem",\ Properties:{\ age:"4"\ }\ },\ transformation:{\ translation:[-0.5f,0.806f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:melon_stem",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"attached_melon_stem",\ Properties:{\ facing:"north"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:beetroot_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:beetroots",\ Properties:{\ age:"1"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:beetroots",\ Properties:{\ age:"2"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:beetroots",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.25f,0.77475f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:glow_berries set value {\ place_sound:"minecraft:block.cave_vines.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:cave_vines",\ Properties:{\ berries:"false"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:cave_vines",\ Properties:{\ berries:"true"\ }\ },\ transformation:{\ translation:[-0.35f,2.1425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cave_vines_plant",\ Properties:{\ berries:"false"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:cave_vines",\ Properties:{\ berries:"true"\ }\ },\ transformation:{\ translation:[-0.35f,2.842f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cave_vines_plant",\ Properties:{\ berries:"false"\ }\ },\ transformation:{\ translation:[-0.35f,2.1425f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cave_vines_plant",\ Properties:{\ berries:"true"\ }\ },\ transformation:{\ translation:[-0.35f,1.443f,0.35f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.7f,0.7f,0.7f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:sweet_berries set value {\ place_sound:"minecraft:block.sweet_berry_bush.place",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:sweet_berry_bush",\ Properties:{\ age:"0"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:sweet_berry_bush",\ Properties:{\ age:"1"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:sweet_berry_bush",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:nether_wart set value {\ place_sound:"minecraft:item.nether_wart.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:nether_wart",\ Properties:{\ age:"0"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:nether_wart",\ Properties:{\ age:"1"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:nether_wart",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:sea_pickle set value {\ place_sound:"minecraft:block.slime_block.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:sea_pickle",\ Properties:{\ waterlogged:"false"\ }\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:tube_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:tube_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:brain_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:brain_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:bubble_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:bubble_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:fire_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:fire_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:horn_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:horn_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_tube_coral set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_tube_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_brain_coral set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_brain_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bubble_coral set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_bubble_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_fire_coral set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_fire_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_horn_coral set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_horn_coral"\ },\ transformation:{\ translation:[-0.5f,0.7435f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:tube_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:tube_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:brain_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:brain_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:bubble_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:bubble_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:fire_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:fire_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:horn_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:horn_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_tube_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_tube_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_brain_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_brain_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_bubble_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_bubble_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_fire_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_fire_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:dead_horn_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:dead_horn_coral_fan"\ },\ transformation:{\ translation:[-0.5f,0.744f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:carrot set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:carrots",\ Properties:{\ age:"2"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:carrots",\ Properties:{\ age:"4"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:carrots",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:potato set value {\ place_sound:"minecraft:item.crop.plant",\ maximum:3,\ 1:[\ {\ block_state:{\ Name:"minecraft:potatoes",\ Properties:{\ age:"2"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 2:[\ {\ block_state:{\ Name:"minecraft:potatoes",\ Properties:{\ age:"4"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ],\ 3:[\ {\ block_state:{\ Name:"minecraft:potatoes",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.25f,0.775f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:decorated_pots minecraft:golden_dandelion set value {\ place_sound:"minecraft:item.bone_meal.use",\ maximum:1,\ 1:[\ {\ block_state:{\ Name:"minecraft:golden_dandelion"\ },\ transformation:{\ translation:[-0.5f,0.681f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/decorated/set_temp_data.mcfunction ================================================ # Sets temp.data for decorated/set_displays # @s = temp entity inside decorated pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {id, count, display_number, rotation} # run from decorated/set_displays $data modify storage gm4_blossoming_pots:decorated_pots temp.data set value {\ view_range:0.7935f,\ Tags:["gm4_blossoming_pots.display.decorated_pot","gm4_blossoming_pots.display.decorated_pot.$(display_number)","smithed.entity","smithed.strict"],\ Rotation:[$(rotation)f,0f]\ } $data modify storage gm4_blossoming_pots:decorated_pots temp.data merge from storage gm4_blossoming_pots:decorated_pots $(id).$(count)[$(display_number)] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/as_player.mcfunction ================================================ # Raycasts for pot the player interacted with, then proceeds if necessary # @s = player who interacted with an empty flower pot # at @s # run from advancement gm4_blossoming_pots:interact_with_flower_pot # Reset advancement advancement revoke @s only gm4_blossoming_pots:interact_with_flower_pot # run upgrade paths if needed execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot execute if score blossoming_pots gm4_earliest_version matches ..304000 \ as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker # Reset temp & scoreboard signals data remove storage gm4_blossoming_pots:flower_pots temp scoreboard players set $signal_item_decr gm4_blossoming_pots.misc 0 function gm4_blossoming_pots:flower/get_player_data # raycast execute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200 execute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:flower/raycast # if signaled, decrement player mainhand (set in flower/prepare_data) execute if score $signal_item_decr gm4_blossoming_pots.misc matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {"function": "minecraft:set_count","count": -1,"add": true} # if signaled, give item back to player (set in flower/remove_plant) execute if score $signal_give_back gm4_blossoming_pots.misc matches 1 run function gm4_blossoming_pots:flower/give_item_to_player with storage gm4_blossoming_pots:flower_pots temp.item_data ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/cleanup.mcfunction ================================================ # Flower pot cleanup if display isn't in a flower pot # @s = flower pot display 0 # at @s # with {id} # run from main # kill displays kill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1] # Motion is predetermined. I can't be asked to make it random, shoot me. $summon minecraft:item ~ ~-.25 ~ {Item:{id:"$(id)",count:1},Motion:[0.03d,0.2d,0.02d]} ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/get_player_data.mcfunction ================================================ # Gets needed player data # @s = player who interacted with a flower pot # at @s # run from flower/as_player # set item id to null, should player not be holding an item data modify storage gm4_blossoming_pots:flower_pots temp.id set value null data modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s SelectedItem.id # player facing west execute if entity @s[y_rotation=45..135] unless entity @s[y_rotation=45] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 0 # player facing north execute if entity @s[y_rotation=135..225] unless entity @s[y_rotation=135] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 90 # player facing east execute if entity @s[y_rotation=225..315] unless entity @s[y_rotation=225] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value 180 # player facing south execute if entity @s[y_rotation=315..405] unless entity @s[y_rotation=315] run return run data modify storage gm4_blossoming_pots:flower_pots temp.rotation set value -90 ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/give_item_to_player.mcfunction ================================================ # Summons an item stack at the players feet for them to pick up & resets signal # @s = player who right clicked on custom flower pot with an empty hand # at temp marker align xyz positioned ~.5 ~.5 ~.5 # with {id, count} # run from flower/as_player scoreboard players set $signal_give_back gm4_blossoming_pots.misc 0 $execute at @s run summon minecraft:item ~ ~ ~ {Item:{id:"$(id)",count:1}} ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/in_flower_pot.mcfunction ================================================ # Checks the temp markers physical location in the block, to see if it is in the collision box of the flower pot # @s = temp marker summoned in parent function # at @s # run from flower/raycast # merge marker data for if it doesn't get killed data merge entity @s {Tags:["gm4_blossoming_pots.temp.flower_pot","smithed.strict","smithed.entity"],CustomName:{"text":"gm4_blossoming_pots.temp_marker"}} # if temp marker in physical hit box, return 1 # dxdydz all 0 bc of MC-123441. execute at @s align xyz positioned ~0.312499 ~ ~0.312499 if entity @s[dx=0,dy=0,dz=0] \ at @s align xyz positioned ~-0.312499 ~-0.625 ~-0.312499 if entity @s[dx=0,dy=0,dz=0] \ run return 1 # else, kill marker, return fail kill @s return fail ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/prepare_data.mcfunction ================================================ # Sets up loop for plant stage changes # @s = temp entity inside flower pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {id, rotation} # run from flower/raycast and upgrade_paths/3.1/legacy_flower_pot # early returns # if empty hand, empty the pot, give player the item execute if data storage gm4_blossoming_pots:flower_pots {temp:{id:"null"}} run return run function gm4_blossoming_pots:flower/remove_plant # if storage doesn't have, doesnt matter $execute unless data storage gm4_blossoming_pots:flower_pots $(id) run return run kill @s # if existing display, fail execute if entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1,limit=1] run return run kill @s # fail if smithed.block execute align xyz if entity @e[tag=smithed.block,dx=0,dz=0,dy=0,limit=1] run return run kill @s # signal player mainhand to be decremented by as_player scoreboard players set $signal_item_decr gm4_blossoming_pots.misc 1 # setting temp execute store result storage gm4_blossoming_pots:flower_pots temp.display_number int 1 run scoreboard players set $display_number gm4_blossoming_pots.misc 0 function gm4_blossoming_pots:flower/set_temp_data with storage gm4_blossoming_pots:flower_pots temp # temp storage should now contain {rotation, display_number, id, count, data} # store the number of displays needed $execute store result score $array_len gm4_blossoming_pots.misc run data get storage gm4_blossoming_pots:flower_pots $(id).display function gm4_blossoming_pots:flower/set_displays with storage gm4_blossoming_pots:flower_pots temp # sound $execute positioned ~ ~-0.3125 ~ run function gm4_blossoming_pots:play_sound with storage gm4_blossoming_pots:flower_pots $(id) kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/raycast.mcfunction ================================================ # Main loop for raycasting for the flower pot the player interacted with # @s = player who interacted with a flower pot # at @s anchored eyes, then marched forward 0.005 over and over # run from flower/as_player and self # if current location is within the flower pots hit box, summon a temp marker, set its data with the player rotation, and exit raycast execute if block ~ ~ ~ minecraft:flower_pot \ summon minecraft:marker if function gm4_blossoming_pots:flower/in_flower_pot \ at @s align xyz positioned ~.5 ~.5 ~.5 \ run return run function gm4_blossoming_pots:flower/prepare_data with storage gm4_blossoming_pots:flower_pots temp # remove range scoreboard players remove @s gm4_blossoming_pots.range 1 # repeat until find flower pot or out of range execute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:flower/raycast ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/remove_plant.mcfunction ================================================ # Removes a plant from a flower pot following a player empty hand right clicks on it # @s = temp marker inside flower pot # at @s align xyz positioned ~.5 ~.5 ~.5 # run from flower/prepare_data # signal give back scoreboard players set $signal_give_back gm4_blossoming_pots.misc 1 # store item data for as_player to give the item back to the player data modify storage gm4_blossoming_pots:flower_pots temp.item_data set from entity @e[tag=gm4_blossoming_pots.display.flower_pot.0,distance=..0.1,limit=1] data.gm4_blossoming_pots.Item # kill flower pot displays, and temp marker kill @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1] kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_displays.mcfunction ================================================ # Main Loop for setting displays to desired stage # @s = temp entity inside flower pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {data} # run from flower/prepare_data and self # create display $summon minecraft:block_display ~ ~ ~ $(data) # increment display_number execute store result storage gm4_blossoming_pots:flower_pots temp.display_number int 1 run scoreboard players add $display_number gm4_blossoming_pots.misc 1 # sets temp.data to next display_number's data function gm4_blossoming_pots:flower/set_temp_data with storage gm4_blossoming_pots:flower_pots temp # run again if needed execute unless score $display_number gm4_blossoming_pots.misc >= $array_len gm4_blossoming_pots.misc run function gm4_blossoming_pots:flower/set_displays with storage gm4_blossoming_pots:flower_pots temp ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_storage.mcfunction ================================================ # Sets command storage for flower pot plants # @s = unspecified # at unspecified # run from init # Data storage layout # gm4_blossoming_pots:flower_pots : # place_sound: sound file to play when succesfully adding plant or changing stage, include namespace # display:[] array of starting data for the all the block displays used, all data data modify storage gm4_blossoming_pots:flower_pots minecraft:pale_hanging_moss set value {\ place_sound:"minecraft:block.moss_carpet.place",\ display:[\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"false"\ }\ },\ transformation:{\ translation:[-0.25f,0.243f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pale_hanging_moss",\ Properties:{\ tip:"true"\ }\ },\ transformation:{\ translation:[-0.25f,0.7425f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:pointed_dripstone set value {\ place_sound:"minecraft:block.pointed_dripstone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"frustum"\ }\ },\ transformation:{\ translation:[-0.25f,0.1435f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pointed_dripstone",\ Properties:{\ vertical_direction:"down",\ thickness:"tip"\ }\ },\ transformation:{\ translation:[-0.25f,0.6435f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:small_amethyst_bud set value {\ place_sound:"minecraft:block.small_amethyst_bud.place",\ display:[\ {\ block_state:{\ Name:"minecraft:small_amethyst_bud"\ },\ transformation:{\ translation:[-0.25f,-0.2565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:medium_amethyst_bud set value {\ place_sound:"minecraft:block.medium_amethyst_bud.place",\ display:[\ {\ block_state:{\ Name:"minecraft:medium_amethyst_bud"\ },\ transformation:{\ translation:[-0.25f,-0.2565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:large_amethyst_bud set value {\ place_sound:"minecraft:block.large_amethyst_bud.place",\ display:[\ {\ block_state:{\ Name:"minecraft:large_amethyst_bud"\ },\ transformation:{\ translation:[-0.25f,-0.2565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:amethyst_cluster set value {\ place_sound:"minecraft:block.amethyst_cluster.place",\ display:[\ {\ block_state:{\ Name:"minecraft:amethyst_cluster"\ },\ transformation:{\ translation:[-0.25f,-0.2565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:oak_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:oak_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:spruce_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:spruce_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:birch_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:birch_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:jungle_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:jungle_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:acacia_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:acacia_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dark_oak_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:dark_oak_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:mangrove_leaves set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:mangrove_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:cherry_leaves set value {\ place_sound:"minecraft:block.cherry_leaves.place",\ display:[\ {\ block_state:{\ Name:"minecraft:cherry_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:pale_oak_leaves set value {\ place_sound:"minecraft:block.grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:pale_oak_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:azalea_leaves set value {\ place_sound:"minecraft:block.azalea_leaves.place",\ display:[\ {\ block_state:{\ Name:"minecraft:azalea_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:flowering_azalea_leaves set value {\ place_sound:"minecraft:block.azalea_leaves.place",\ display:[\ {\ block_state:{\ Name:"minecraft:flowering_azalea_leaves"\ },\ transformation:{\ translation:[-0.25f,-0.125f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:short_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:short_grass"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:short_dry_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:short_dry_grass"\ },\ transformation:{\ translation:[-0.325f,-0.2565f,-0.325f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.65f,0.65f,0.65f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:bush"\ },\ transformation:{\ translation:[-0.39f,-0.2565f,-0.39f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.78f,0.78f,0.78f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:cactus_flower set value {\ place_sound:"minecraft:block.cactus_flower.place",\ display:[\ {\ block_state:{\ Name:"minecraft:cactus_flower"\ },\ transformation:{\ translation:[-0.4f,-0.2565f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.9f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:spore_blossom set value {\ place_sound:"minecraft:block.spore_blossom.place",\ display:[\ {\ block_state:{\ Name:"minecraft:spore_blossom"\ },\ transformation:{\ translation:[-0.2f,0.42f,0.2f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.4f,0.4f,0.6f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:firefly_bush set value {\ place_sound:"minecraft:block.sweet_berry_bush.place",\ display:[\ {\ block_state:{\ Name:"minecraft:firefly_bush"\ },\ transformation:{\ translation:[-0.3f,-0.2565f,-0.3f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.6f,0.6f,0.6f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:sugar_cane set value {\ place_sound:"minecraft:block.grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.15f,-0.2565f,-0.15f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.3f,0.3f,0.3f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:sugar_cane"\ },\ transformation:{\ translation:[-0.15f,0.0435f,-0.15f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.3f,0.3f,0.3f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:weeping_vines set value {\ place_sound:"minecraft:block.weeping_vines.place",\ display:[\ {\ block_state:{\ Name:"minecraft:weeping_vines_plant"\ },\ transformation:{\ translation:[-0.25f,0.2434f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:weeping_vines"\ },\ transformation:{\ translation:[-0.25f,0.7434f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:twisting_vines set value {\ place_sound:"minecraft:block.weeping_vines.place",\ display:[\ {\ block_state:{\ Name:"minecraft:twisting_vines_plant"\ },\ transformation:{\ translation:[-0.25f,-0.2565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:twisting_vines"\ },\ transformation:{\ translation:[-0.25f,0.2435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:tall_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:tall_grass",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.15f,-0.35025f,-0.15f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.3f,0.4f,0.3f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:tall_grass",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.15f,0.04975f,-0.15f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.3f,0.4f,0.3f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:large_fern set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:large_fern",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.4f,-0.2515f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:large_fern",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.4f,0.5485f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:tall_dry_grass set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:tall_dry_grass"\ },\ transformation:{\ translation:[-0.325f,-0.2565f,-0.325f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.65f,0.65f,0.65f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } # default sunflower rotation is sunflower facing east, player should be facing west data modify storage gm4_blossoming_pots:flower_pots minecraft:sunflower set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:sunflower",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.4f,-0.3f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:lilac set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:lilac",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.3f,-0.3f,-0.3f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.6f,0.6f,0.6f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:rose_bush set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:rose_bush",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.3f,-0.3f,-0.3f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.6f,0.6f,0.6f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:peony set value {\ place_sound:"minecraft:item.bone_meal.use",\ display:[\ {\ block_state:{\ Name:"minecraft:peony",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.3f,-0.3f,-0.3f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.6f,0.6f,0.6f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:pitcher_plant set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:pitcher_plant",\ Properties:{\ half:"lower"\ }\ },\ transformation:{\ translation:[-0.4f,-0.3815f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:pitcher_plant",\ Properties:{\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.4f,0.4185f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:big_dripleaf set value {\ place_sound:"minecraft:block.big_dripleaf.place",\ display:[\ {\ block_state:{\ Name:"minecraft:big_dripleaf",\ Properties:{\ facing:"east"\ }\ },\ transformation:{\ translation:[-0.175f,-0.219f,-0.375f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.75f,0.75f,0.75f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:small_dripleaf set value {\ place_sound:"minecraft:block.small_dripleaf.place",\ display:[\ {\ block_state:{\ Name:"minecraft:small_dripleaf",\ Properties:{\ facing:"east",\ half:"upper"\ }\ },\ transformation:{\ translation:[-0.4f,-0.25f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:chorus_flower set value {\ place_sound:"minecraft:block.chorus_flower.grow",\ display:[\ {\ block_state:{\ Name:"minecraft:chorus_flower"\ },\ transformation:{\ translation:[-0.25f,0.3435f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ },\ {\ block_state:{\ Name:"minecraft:chorus_plant",\ Properties:{\ down:"true",\ up:"true"\ }\ },\ transformation:{\ translation:[-0.25f,-0.1565f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:hanging_roots set value {\ place_sound:"minecraft:block.hanging_roots.place",\ display:[\ {\ block_state:{\ Name:"minecraft:hanging_roots"\ },\ transformation:{\ translation:[-0.2f,0.2432f,0.2f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.4f,0.4f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:wheat_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:wheat",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.1875f,-0.22525f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.375f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:pumpkin_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"attached_pumpkin_stem",\ Properties:{\ facing:"north"\ }\ },\ transformation:{\ translation:[-0.5f,-0.319f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:melon_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"attached_melon_stem",\ Properties:{\ facing:"north"\ }\ },\ transformation:{\ translation:[-0.5f,-0.319f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:beetroot_seeds set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:beetroots",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.1875f,-0.22525f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.375f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:glow_berries set value {\ place_sound:"minecraft:block.cave_vines.place",\ display:[\ {\ block_state:{\ Name:"minecraft:cave_vines_plant",\ Properties:{\ berries:"false"\ }\ },\ transformation:{\ translation:[-0.25f,0.243f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ },\ {\ block_state:{\ Name:"minecraft:cave_vines",\ Properties:{\ berries:"true"\ }\ },\ transformation:{\ translation:[-0.25f,0.7425f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ scale:[0.5f,0.5f,0.5f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:sweet_berries set value {\ place_sound:"minecraft:block.sweet_berry_bush.place",\ display:[\ {\ block_state:{\ Name:"minecraft:sweet_berry_bush",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.4f,-0.319f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.8f,0.8f,0.8f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:nether_wart set value {\ place_sound:"minecraft:item.nether_wart.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:nether_wart",\ Properties:{\ age:"3"\ }\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.375f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:sea_pickle set value {\ place_sound:"minecraft:block.slime_block.place",\ display:[\ {\ block_state:{\ Name:"minecraft:sea_pickle",\ Properties:{\ waterlogged:"false"\ }\ },\ transformation:{\ translation:[-0.5f,-0.2565f,-0.5f],\ left_rotation:[0f,0f,0f,1f],\ scale:[1f,1f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:tube_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:tube_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:brain_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:brain_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:bubble_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:bubble_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:fire_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:fire_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:horn_coral set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:horn_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_tube_coral set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_tube_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_brain_coral set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_brain_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_bubble_coral set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_bubble_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_fire_coral set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_fire_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_horn_coral set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_horn_coral"\ },\ transformation:{\ translation:[-0.2f,-0.25f,-0.2f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.4f,0.5f,0.4f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:tube_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:tube_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:brain_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:brain_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:bubble_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:bubble_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:fire_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:fire_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:horn_coral_fan set value {\ place_sound:"minecraft:block.wet_grass.place",\ display:[\ {\ block_state:{\ Name:"minecraft:horn_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_tube_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_tube_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_brain_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_brain_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_bubble_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_bubble_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_fire_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_fire_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:dead_horn_coral_fan set value {\ place_sound:"minecraft:block.stone.place",\ display:[\ {\ block_state:{\ Name:"minecraft:dead_horn_coral_fan"\ },\ transformation:{\ translation:[-0.1875f,-0.225f,-0.1875f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.375f,0.8f,0.375f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:carrot set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:carrots",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.225f,-0.22525f,-0.225f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.45f,0.45f,0.45f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } data modify storage gm4_blossoming_pots:flower_pots minecraft:potato set value {\ place_sound:"minecraft:item.crop.plant",\ display:[\ {\ block_state:{\ Name:"minecraft:potatoes",\ Properties:{\ age:"7"\ }\ },\ transformation:{\ translation:[-0.225f,-0.22525f,-0.225f],\ left_rotation:[0f,0f,0f,1f],\ scale:[0.45f,0.45f,0.45f],\ right_rotation:[0f,0f,0f,1f]\ }\ }\ ]\ } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/flower/set_temp_data.mcfunction ================================================ # Sets temp.data for flower/set_displays # @s = temp entity inside flower pot # at @s align xyz positioned ~.5 ~.5 ~.5 # with {id, display_number, rotation} # run from flower/set_displays and flower/prepare_data $data modify storage gm4_blossoming_pots:flower_pots temp.data set value {\ view_range:0.7935f,\ Tags:["gm4_blossoming_pots.display.flower_pot","gm4_blossoming_pots.display.flower_pot.$(display_number)","smithed.entity","smithed.strict"],\ Rotation:[$(rotation)f,0f],\ data:{gm4_blossoming_pots:{Item:{id:"$(id)"}}}\ } # count set as one so that legacy displays can have higher counts respected in the flower/cleanup function $data modify storage gm4_blossoming_pots:flower_pots temp.data merge from storage gm4_blossoming_pots:flower_pots $(id).display[$(display_number)] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/init.mcfunction ================================================ execute unless score blossoming_pots gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Blossoming Pots"} execute unless score blossoming_pots gm4_earliest_version < blossoming_pots gm4_modules run scoreboard players operation blossoming_pots gm4_earliest_version = blossoming_pots gm4_modules scoreboard players set blossoming_pots gm4_modules 1 # detect pre-gm4 blossoming pots execute if data storage rc_blossoming_pots:storage version_history run scoreboard players set blossoming_pots gm4_earliest_version 0 scoreboard objectives add gm4_blossoming_pots.range dummy "gm4_bPots.range" scoreboard objectives add gm4_blossoming_pots.display_stage dummy "gm4_bPots.display_stage" scoreboard objectives add gm4_blossoming_pots.misc dummy "gm4_bPots.misc" function gm4_blossoming_pots:decorated/set_storage function gm4_blossoming_pots:flower/set_storage schedule function gm4_blossoming_pots:main 1t ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/main.mcfunction ================================================ execute as @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.decorated_pot] at @s unless block ~ ~ ~ minecraft:decorated_pot run kill @s execute as @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot.0] at @s unless block ~ ~ ~ minecraft:flower_pot run function gm4_blossoming_pots:flower/cleanup with entity @s data.gm4_blossoming_pots.Item schedule function gm4_blossoming_pots:main 16t ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/play_sound.mcfunction ================================================ # plays sound # @s = temp entity inside pot # at center of pot # with {place_sound} # run from decorated/prepare_data and flower/prepare_data $playsound $(place_sound) block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/check_legacy_flower_pot_in_storage.mcfunction ================================================ # Check if flower pot id is in storage # @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot # at @s # with {id} # run from upgrade_paths/3.1/legacy_flower_pot $execute store success score $legacy_in_storage gm4_blossoming_pots.misc if data storage gm4_blossoming_pots:flower_pots $(id) ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/drop_legacy_items.mcfunction ================================================ # drop extra items from legacy flower pot # @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot # at @s # with {id, count} # run from upgrade_paths/3.1/legacy_flower_pot # Motion is predetermined. I can't be asked to make it random, shoot me. $summon minecraft:item ~ ~.25 ~ {Item:{id:"$(id)",count:$(count)},Motion:[0.03d,0.2d,0.02d]} ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/legacy_decorated_pot.mcfunction ================================================ # Upgrade legacy decorated pot plant to current gm4 version # @s = type=minecraft:block_display, tag=rc_blossoming_pots.decorPotPlant0 # at @s # run from upgrade_paths/3.1 and decorated/as_player and flower/as_player and vanilla_pot_handling/as_player # Note: legacy pot displays are located at align xyz positioned ~.5 ~ ~.5, different from current version. # clear temp just in case data remove storage gm4_blossoming_pots:decorated_pots temp # kill all other displays distance =..0.1 kill @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant,tag=!rc_blossoming_pots.decorPotPlant0,distance=..0.1] # if pot is now empty, kill @s and return. Cleanup complete execute unless data block ~ ~ ~ item run return run kill @s # grab Rotation from @s data modify storage gm4_blossoming_pots:decorated_pots temp.rotation set from entity @s Rotation[0] # pivot to decorated/set_count using rc_blossoming_pots.decorPotPlant0 as the temp entity, which is killed in set_count after displays are set execute positioned ~ ~.5 ~ run function gm4_blossoming_pots:decorated/set_count with block ~ ~ ~ item ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1/legacy_flower_pot.mcfunction ================================================ # Upgrade legacy flower pot plant to current gm4 version # @s = type=minecraft:marker, tag=rc_blossoming_pots.flowerPot # at @s # run from upgrade_paths/3.1 and decorated/as_player and flower/as_player and vanilla_pot_handling/as_player # Note: legacy pot displays are located at align xyz positioned ~.5 ~ ~.5, different from current version. # clear temp just in case data remove storage gm4_blossoming_pots:flower_pots temp # grab item id data modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s data.id data modify storage gm4_blossoming_pots:flower_pots temp.legacy.id set from storage gm4_blossoming_pots:flower_pots temp.id # grab Rotation from block display tag=rc_blossoming_pots.flowerPotPlant0 data modify storage gm4_blossoming_pots:flower_pots temp.rotation set from entity @e[type=minecraft:block_display,tag=rc_blossoming_pots.flowerPotPlant0,distance=..0.1,limit=1] Rotation[0] # kill all block displays for this plant kill @e[type=minecraft:block_display,tag=rc_blossoming_pots.flowerPotPlant,distance=..0.1] # drop items of id and count-1 execute store result score $count gm4_blossoming_pots.misc run data get entity @s data.count execute store result storage gm4_blossoming_pots:flower_pots temp.legacy.count int 1 run scoreboard players remove $count gm4_blossoming_pots.misc 1 execute unless score $count gm4_blossoming_pots.misc matches ..0 run function gm4_blossoming_pots:upgrade_paths/3.1/drop_legacy_items with storage gm4_blossoming_pots:flower_pots temp.legacy # We need to check using a macro function if the id stored in @s data is in storage, and if not then drop item function gm4_blossoming_pots:upgrade_paths/3.1/check_legacy_flower_pot_in_storage with storage gm4_blossoming_pots:flower_pots temp.legacy # set legacy count back to 1 for potential clean up data modify storage gm4_blossoming_pots:flower_pots temp.legacy.count set value 1 # if legacy plant IS NOT in modern storage, clean up @s and drop items using legacy storage execute unless score $legacy_in_storage gm4_blossoming_pots.misc matches 1 run function gm4_blossoming_pots:upgrade_paths/3.1/drop_legacy_items with storage gm4_blossoming_pots:flower_pots temp.legacy execute unless score $legacy_in_storage gm4_blossoming_pots.misc matches 1 run return run kill @s # if legacy plant IS in modern storage, summon new displays using @s as a temp entity execute if score $legacy_in_storage gm4_blossoming_pots.misc matches 1 positioned ~ ~.5 ~ run \ return run function gm4_blossoming_pots:flower/prepare_data with storage gm4_blossoming_pots:flower_pots temp # @s is killed in both cases ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.1.mcfunction ================================================ # Upgrade pre-gm4 blossoming pots entities # @s = player # at @s # run via upgrade paths util # upgrade legacy flower pots execute as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot] at @s \ run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot # upgrade legacy decorated pots execute as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0] at @s \ run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot # not cleaning up legacy storage, sorry. Its like 20KB, 190 storage keys. # not worth it to clean all the storage keys, when we cant delete the files # Just leaving the files there for world owners to clean up if they really want to ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.4/remove_perma_marker.mcfunction ================================================ # transfers item data to display entity, kills marker # @s = type=minecraft:marker, tag=gm4_blossoming_pots.data.flower_pot # at @s # run from upgrade_paths/3.4 data modify entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot.0,distance=..0.1,limit=1] data.gm4_blossoming_pots.Item set from entity @s data.gm4_blossoming_pots kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/upgrade_paths/3.4.mcfunction ================================================ # Upgrade flower pots to no longer need the marker # @s = player # at @s # run via upgrade paths util # target <3.4 perma marker to delete execute as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot] at @s \ run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker # smithed tags tag @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,tag=!smithed.strict] add smithed.strict tag @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,tag=!smithed.strict] add smithed.strict ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/as_marker.mcfunction ================================================ # If player is placing a vanilla plant in custom flower pot, prevent them and give them the item back # @s = temp marker inside filled vanilla flower pot # at @s align xyz positioned ~.5 ~.5 ~.5 # run from vanilla_pot_handling/raycast # if no custom flower pot, return let the player place their vanilla pots in peace execute unless entity @e[type=minecraft:block_display,tag=gm4_blossoming_pots.display.flower_pot,distance=..0.1,limit=1] run return run kill @s fill ~ ~ ~ ~ ~ ~ minecraft:flower_pot destroy # kill flower pot item execute as @n[type=minecraft:item,distance=..0.5,nbt={Item:{id:"minecraft:flower_pot"},Age:0s}] run kill @s # store dropped items data in temp and kill it execute as @n[type=minecraft:item,distance=..0.5,nbt={Age:0s},predicate=gm4_blossoming_pots:item_potable] run function gm4_blossoming_pots:vanilla_pot_handling/get_dropped_item # giving item back is run from as_player following this. scoreboard players set $signal_give_back gm4_blossoming_pots.misc 1 # clean kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/as_player.mcfunction ================================================ # Prevent a player putting an item from potable_pots tag list into a pot that already has a blossoming pots block display # @s = player who interacted with a filled vanilla flower pot # at @s # run from advancement gm4_blossoming_pots:interact_with_vanilla_flower_pot # Reset advancement advancement revoke @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot # run upgrade paths if needed execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:block_display,tag=rc_blossoming_pots.decorPotPlant0,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_decorated_pot execute if score blossoming_pots gm4_earliest_version matches 0 \ as @e[type=minecraft:marker,tag=rc_blossoming_pots.flowerPot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.1/legacy_flower_pot execute if score blossoming_pots gm4_earliest_version matches ..304000 \ as @e[type=minecraft:marker,tag=gm4_blossoming_pots.data.flower_pot,distance=..10] at @s run function gm4_blossoming_pots:upgrade_paths/3.4/remove_perma_marker # Reset temp data remove storage gm4_blossoming_pots:flower_pots temp # Raycast for the pot (set up range and search) and proceed if needed execute store result score @s gm4_blossoming_pots.range run attribute @s minecraft:block_interaction_range get 200 execute anchored eyes positioned ^ ^ ^ run function gm4_blossoming_pots:vanilla_pot_handling/raycast # if signaled (set in vanilla_pot_handling/as_marker), summon item at player to give it back to them execute if score $signal_give_back gm4_blossoming_pots.misc matches 1 if entity @s[gamemode=!creative] run function gm4_blossoming_pots:vanilla_pot_handling/give_item_back with storage gm4_blossoming_pots:flower_pots temp ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/get_dropped_item.mcfunction ================================================ # Gets the id off of the fresh item and then kills it # @s = age:0s item of vanilla flower pot # at temp marker align xyz positioned ~.5 ~.5 ~.5 # run from vanilla_pot_handling/as_marker data modify storage gm4_blossoming_pots:flower_pots temp.id set from entity @s Item.id kill @s ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/give_item_back.mcfunction ================================================ # Gives player the vanilla flower pot item back that they tried to plant in a custom flower pot, reset signal score # @s = player who triggered advancement # at @s # with {id} # run from vanilla_pot_handling/as_player scoreboard players set $signal_give_back gm4_blossoming_pots.misc 0 $summon minecraft:item ~ ~ ~ {Item:{id:"$(id)"}} ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/in_vanilla_flower_pot.mcfunction ================================================ # Checks the temp markers physical location in the block, to see if it is in the collision box of the flower pot # @s = temp marker summoned in parent function # at @s # run from vanilla_pot_handling/raycast # merge marker data for if it doesn't get killed data merge entity @s {Tags:["gm4_blossoming_pots.temp.vanilla_flower_pot","smithed.strict","smithed.entity"],CustomName:{"text":"gm4_blossoming_pots.temp_marker"}} # if temp marker in physical hit box, return 1 # dxdydz all 0 bc of MC-123441. execute at @s align xyz positioned ~0.312499 ~ ~0.312499 if entity @s[dx=0,dy=0,dz=0] \ at @s align xyz positioned ~-0.312499 ~-0.625 ~-0.312499 if entity @s[dx=0,dy=0,dz=0] \ run return 1 # else, kill marker, return fail kill @s return fail ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/function/vanilla_pot_handling/raycast.mcfunction ================================================ # Main loop for raycasting for the vanilla flower pot the player interacted with # @s = player who interacted with a flower pot # at @s anchored eyes, then marched forward 0.005 over and over # run from vanilla_pot_handling/as_player and self # if block is a vanilla flower pot and execution context is in the flower pot, proceed to as_marker execute if block ~ ~ ~ #gm4_blossoming_pots:potted_plants \ summon minecraft:marker if function gm4_blossoming_pots:vanilla_pot_handling/in_vanilla_flower_pot \ at @s align xyz positioned ~.5 ~.5 ~.5 \ run return run function gm4_blossoming_pots:vanilla_pot_handling/as_marker # remove range scoreboard players remove @s gm4_blossoming_pots.range 1 # repeat until find flower pot or out of range execute if score @s gm4_blossoming_pots.range matches 1.. positioned ^ ^ ^0.005 run function gm4_blossoming_pots:vanilla_pot_handling/raycast ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/guidebook/blossoming_pots.json ================================================ { "id": "blossoming_pots", "name": "Blossoming Pots", "module_type": "module", "icon": { "id": "minecraft:decorated_pot" }, "criteria": { "obtain_pot": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:decorated_pot", "minecraft:flower_pot" ] } ] } } }, "sections": [ { "name": "display", "enable": [], "requirements": [ [ "obtain_pot" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.blossoming_pots.description", "fallback": "To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item.\nTo remove a plant, break the decorated pot or interact with the flower pot with an empty hand." } ], [ { "translate":"text.gm4.guidebook.blossoming_pots.item_list.header", "fallback":"Supported Items:", "underlined":true }, { "text":"\n\n" }, { "translate": "text.gm4.guidebook.blossoming_pots.item_list.1", "fallback": "Vanilla Flower Pot\n plants\nPale hanging moss\nPointed dripstone\nAmethyst crystals\nLeaves\nGrass plants\nLush cave plants", "underlined":false } ], [ { "translate":"text.gm4.guidebook.blossoming_pots.item_list.header", "fallback":"Supported Items:", "underlined":true }, { "text":"\n\n" }, { "translate": "text.gm4.guidebook.blossoming_pots.item_list.2", "fallback": "Sugar cane\nNether vines\n2 tall plants\nChorus flower\nNon-sniffer seeds\nNether wart\nBush plants\nCoral reef plants\nCactus Flower", "underlined":false } ] ] } ] } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/predicate/item_potable.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:item", "slots": { "contents": { "items": "#gm4_blossoming_pots:potable_plants" } } } } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/tags/block/potted_plants.json ================================================ { "values": [ "minecraft:potted_dandelion", "minecraft:potted_poppy", "minecraft:potted_blue_orchid", "minecraft:potted_allium", "minecraft:potted_azure_bluet", "minecraft:potted_red_tulip", "minecraft:potted_orange_tulip", "minecraft:potted_white_tulip", "minecraft:potted_pink_tulip", "minecraft:potted_oxeye_daisy", "minecraft:potted_cornflower", "minecraft:potted_lily_of_the_valley", "minecraft:potted_wither_rose", "minecraft:potted_torchflower", "minecraft:potted_oak_sapling", "minecraft:potted_spruce_sapling", "minecraft:potted_birch_sapling", "minecraft:potted_jungle_sapling", "minecraft:potted_acacia_sapling", "minecraft:potted_dark_oak_sapling", "minecraft:potted_cherry_sapling", "minecraft:potted_red_mushroom", "minecraft:potted_brown_mushroom", "minecraft:potted_fern", "minecraft:potted_dead_bush", "minecraft:potted_cactus", "minecraft:potted_bamboo", "minecraft:potted_azalea_bush", "minecraft:potted_flowering_azalea_bush", "minecraft:potted_crimson_fungus", "minecraft:potted_warped_fungus", "minecraft:potted_crimson_roots", "minecraft:potted_warped_roots", "minecraft:potted_mangrove_propagule", "minecraft:potted_closed_eyeblossom", "minecraft:potted_open_eyeblossom", "minecraft:potted_pale_oak_sapling" ] } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/tags/item/potable_plants.json ================================================ { "values": [ "minecraft:dandelion", "minecraft:poppy", "minecraft:blue_orchid", "minecraft:allium", "minecraft:azure_bluet", "minecraft:red_tulip", "minecraft:orange_tulip", "minecraft:white_tulip", "minecraft:pink_tulip", "minecraft:oxeye_daisy", "minecraft:cornflower", "minecraft:lily_of_the_valley", "minecraft:wither_rose", "minecraft:torchflower", "minecraft:oak_sapling", "minecraft:spruce_sapling", "minecraft:birch_sapling", "minecraft:jungle_sapling", "minecraft:acacia_sapling", "minecraft:dark_oak_sapling", "minecraft:cherry_sapling", "minecraft:red_mushroom", "minecraft:brown_mushroom", "minecraft:fern", "minecraft:dead_bush", "minecraft:cactus", "minecraft:bamboo", "minecraft:azalea", "minecraft:flowering_azalea", "minecraft:crimson_fungus", "minecraft:warped_fungus", "minecraft:crimson_roots", "minecraft:warped_roots", "minecraft:mangrove_propagule", "minecraft:closed_eyeblossom", "minecraft:open_eyeblossom", "minecraft:pale_oak_sapling" ] } ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/decorated_pot_bounding_box.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 400 # tests for correct pot found when raycast overlaps with a different decorated pot setblock ~1 ~1 ~2 decorated_pot{item:{id:"minecraft:cherry_sapling",count:1}} setblock ~1 ~1 ~1 decorated_pot{item:{id:"minecraft:cherry_leaves",count:1}} rotate @s facing ~1.06 ~ ~2 advancement grant @s only gm4_blossoming_pots:interact_with_decorated_pot await entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,nbt={block_state:{Name:"minecraft:cherry_sapling"}},dx=2,dy=2,dz=2] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/place_in_decorated_pot.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 400 # place setblock ~ ~1 ~2 decorated_pot give @s oak_leaves rotate @s facing ~.5 ~ ~2 dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_decorated_pot await entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2] await delay 2s # break dummy @s mine ~.5 ~1 ~2 await not entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/place_in_flower_pot.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 400 # place setblock ~ ~1 ~2 flower_pot item replace entity @s weapon.mainhand with oak_leaves rotate @s facing ~.5 ~ ~2 dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_flower_pot await entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] assert not items entity @s weapon.mainhand * await delay 2s # remove custom plant # | need to clear guidebook from mainhand... clear @s written_book dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_flower_pot await not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] await items entity @s weapon.mainhand oak_leaves await delay 2s # place back, to break dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_flower_pot await delay 1s dummy @s mine ~.5 ~1 ~2 await not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] assert entity @e[type=item,nbt={Item:{id:"minecraft:oak_leaves",count:1}},dx=2,dy=2,dz=2] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/upgrade_path_3.1.mcfunction ================================================ # @template gm4:test_platform # @timeout 400 # setup legacy displays.... pain # decorated setblock ~ ~1 ~2 decorated_pot{item:{id:"minecraft:flowering_azalea",count:1}} execute align xyz run summon block_display ~0.5 ~1.0 ~2.5 {Tags:["rc_blossoming_pots.decorPotPlant0","rc_blossoming_pots.decorPotPlant"],block_state:{Name:"minecraft:flowering_azalea"},transformation:{translation:[-0.25f,1.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}} # flower pot setblock ~2 ~1 ~2 flower_pot execute align xyz run summon block_display ~2.5 ~1.0 ~2.5 {Tags:["rc_blossoming_pots.flowerPotPlant","rc_blossoming_pots.flowerPotPlant0"],block_state:{Name:"minecraft:amethyst_cluster"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}} execute align xyz run summon marker ~2.5 ~1.0 ~2.5 {Tags:["rc_blossoming_pots.flowerPot"],data:{id:"minecraft:amethyst_cluster",count:1,full:1}} # deleted plant setblock ~2 ~1 ~ flower_pot execute align xyz run summon block_display ~2.5 ~1.0 ~0.5 {Tags:["rc_blossoming_pots.flowerPotPlant","rc_blossoming_pots.flowerPotPlant0"],block_state:{Name:"minecraft:cocoa"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}} execute align xyz run summon marker ~2.5 ~1.0 ~0.5 {Tags:["rc_blossoming_pots.flowerPot"],data:{id:"minecraft:cocoa_beans",count:3,full:1}} function gm4_blossoming_pots:upgrade_paths/3.1 assert entity @e[type=block_display,tag=gm4_blossoming_pots.display.decorated_pot,dx=2,dy=2,dz=2] assert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2,nbt={data:{gm4_blossoming_pots:{Item:{id:"minecraft:amethyst_cluster"}}}}] assert not entity @e[type=marker,tag=rc_blossoming_pots.flowerPot,dx=2,dy=2,dz=2] assert entity @e[type=item,dx=2,dy=2,dz=2,nbt={Item:{id:"minecraft:cocoa_beans"}}] ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/upgrade_path_3.4.mcfunction ================================================ # @template gm4:test_platform # @timeout 400 setblock ~2 ~1 ~2 flower_pot execute align xyz run summon block_display ~2.5 ~1.5 ~2.5 {view_range:0.7935f,Tags:["gm4_blossoming_pots.display.flower_pot","gm4_blossoming_pots.display.flower_pot.0","smithed.entity"],block_state:{Name:"minecraft:amethyst_cluster"},transformation:{translation:[-0.25f,0.2435f,-0.25f],left_rotation:[0f,0f,0f,1f],scale:[0.5f,0.5f,0.5f],right_rotation:[0f,0f,0f,1f]}} execute align xyz run summon marker ~2.5 ~1.5 ~2.5 {Tags:["gm4_blossoming_pots.data.flower_pot","smithed.strict","smithed.entity"],data:{gm4_blossoming_pots:{id:"minecraft:amethyst_cluster",count:1,full:1}},CustomName:{"text":"gm4_blossoming_pots.flower_pot"}} function gm4_blossoming_pots:upgrade_paths/3.4 assert not entity @e[type=marker,tag=gm4_blossoming_pots.data.flower_pot,dx=2,dz=2,dy=2] assert data entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot.0,limit=1,dx=2,dz=2,dy=2] data.gm4_blossoming_pots.Item.id ================================================ FILE: gm4_blossoming_pots/data/gm4_blossoming_pots/test/vanilla_pot_handling.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 400 # place vanilla potted plant, there is no reason this should fail setblock ~ ~1 ~2 flower_pot item replace entity @s weapon.mainhand with red_tulip rotate @s facing ~.5 ~ ~2 dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot assert not entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] assert not items entity @s weapon.mainhand * await delay 2s # replace vanilla potted plant with custom item replace entity @s weapon.mainhand with oak_leaves dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_flower_pot assert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] assert not items entity @s weapon.mainhand oak_leaves await delay 2s # place vanilla plant in custom pot, should fail item replace entity @s weapon.mainhand with orange_tulip dummy @s use block ~.5 ~1 ~2 # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_blossoming_pots:interact_with_vanilla_flower_pot assert entity @e[type=block_display,tag=gm4_blossoming_pots.display.flower_pot,dx=2,dy=2,dz=2] await items entity @s weapon.mainhand orange_tulip ================================================ FILE: gm4_blossoming_pots/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.blossoming_pots,"Greatly expands the selection of potable plants. Use Decorated Pots as abnormally large flower pots. Decorate in Style!" text.gm4.guidebook.blossoming_pots.description,"To pot a plant, interact with a Decorated Pot or empty Flower Pot while holding a supported item.\nTo remove a plant, break the decorated pot or interact with the flower pot with an empty hand." text.gm4.guidebook.blossoming_pots.item_list.header,"Supported Items:" text.gm4.guidebook.blossoming_pots.item_list.1,"Vanilla Flower Pot\n plants\nPale hanging moss\nPointed dripstone\nAmethyst crystals\nLeaves\nGrass plants\nLush cave plants" text.gm4.guidebook.blossoming_pots.item_list.2,"Sugar cane\nNether vines\n2 tall plants\nChorus flower\nNon-sniffer seeds\nNether wart\nBush plants\nCoral reef plants\nCactus Flower" ================================================ FILE: gm4_book_binders/README.md ================================================ # Book Binders Storing enchantments is a hassle, but with this data pack it is now an breeze! ### Features - Adds new functionality to the lectern - All enchanted books get ripped into pages - with each enchantment on the book creating one page - Placing a hopper on the lectern can automate the splitting of books - Different torn pages can be reassembled into new multi-enchantment books ================================================ FILE: gm4_book_binders/assets/translations.csv ================================================ key,en_us item.gm4.enchanted_page,Enchanted Page advancement.gm4.book_binders.title,Ain't Got Rhythm advancement.gm4.book_binders.description,Set up a Book Binder advancement.gm4.book_binders_bind.title,Curse of Binding advancement.gm4.book_binders_bind.description,Publish your first Enchanted Book advancement.gm4.book_binders_debind.title,Tearing Up! advancement.gm4.book_binders_debind.description,Get your first enchanted page text.gm4.guidebook.module_desc.book_binders,Start printing your own Enchanted Books with Book Binders. Use lecterns to exract singular pages from Enchanted Books and recombine pages with Leather to create your own Enchanted Books -- free of charge! text.gm4.guidebook.book_binders.tearing,Lecterns have a small area at the center where enchanted books can be placed.\n\nThis will cause the enchanted book to be ripped up into separate pages—one for each enchantment. text.gm4.guidebook.book_binders.rebinding,"Placing enchanted pages onto a lectern will add it to its internal inventory.\n\nPlacing a leather onto the lectern will then bind the pages in its inventory, creating an enchanted book." text.gm4.guidebook.book_binders.hoppers,A hopper pointing into the back of the lectern will push items into it.\n\nA hopper below the lectern will catch any items dropped by the lectern. ================================================ FILE: gm4_book_binders/beet.yaml ================================================ id: gm4_book_binders name: Book Binders version: 1.6.X data_pack: load: . require: - bolt resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: paper reference: item/enchanted_page template: generated - item: lectern reference: gui/advancement/book_binders template: advancement - item: paper reference: gui/advancement/book_binders_debind template: name: advancement forward: item/enchanted_page - item: enchanted_book reference: gui/advancement/book_binders_bind template: advancement website: description: Start printing your own Enchanted Books with Book Binders. Use lecterns to exract singular pages from Enchanted Books and recombine pages with Leather to create your own Enchanted Books -- free of charge! recommended: - gm4_resource_pack notes: [] modrinth: project_id: oIqNf2N4 wiki: https://wiki.gm4.co/wiki/Book_Binders credits: Creators: - Bloo - Sparks Icon Design: - Sparks ================================================ FILE: gm4_book_binders/data/gm4/advancement/book_binders.json ================================================ { "display": { "icon": { "id": "lectern", "components": { "minecraft:custom_model_data": {"strings":["gm4_book_binders:gui/advancement/book_binders"]} } }, "title": { "translate": "advancement.gm4.book_binders.title", "fallback": "Ain't Got Rhythm" }, "description": { "translate": "advancement.gm4.book_binders.description", "fallback": "Set up a Book Binder", "color": "gray" } }, "parent": "gm4:root", "criteria": { "gm4_place_book_binder": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:block_state_property", "block": "minecraft:lectern" } ] } } } } ================================================ FILE: gm4_book_binders/data/gm4/advancement/book_binders_bind.json ================================================ { "display": { "icon": { "id": "enchanted_book", "components": { "minecraft:enchantments": { "minecraft:mending": 1 }, "minecraft:custom_model_data": {"strings":["gm4_book_binders:gui/advancement/book_binders_bind"]} } }, "title": { "translate": "advancement.gm4.book_binders_bind.title", "fallback": "Curse of Binding" }, "description": { "translate": "advancement.gm4.book_binders_bind.description", "fallback": "Publish your first Enchanted Book", "color": "gray" } }, "parent": "gm4:book_binders", "criteria": { "gm4_book_binders_bind": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_book_binders/data/gm4/advancement/book_binders_debind.json ================================================ { "display": { "icon": { "id": "paper", "components": { "minecraft:enchantments": { "minecraft:mending": 1 }, "minecraft:custom_model_data": {"strings":["gm4_book_binders:gui/advancement/book_binders_debind"]} } }, "title": { "translate": "advancement.gm4.book_binders_debind.title", "fallback": "Tearing Up!" }, "description": { "translate": "advancement.gm4.book_binders_debind.description", "fallback": "Get your first enchanted page", "color": "gray" } }, "parent": "gm4:book_binders", "criteria": { "gm4_book_binders_debind": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_book_binders/data/gm4_book_binders/advancement/place_new_lectern.json ================================================ { "criteria": { "place_lectern": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:block_state_property", "block": "minecraft:lectern" } ] } } }, "rewards": { "function": "gm4_book_binders:binder/placement/revoke_advancement" } } ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/hopper_grab.mcfunction ================================================ # @s an active book binder with active hopper in the back # at location of hopper # run from gm4_book_binders:binder/tick # give item into armor stand's hand (done before count is reduced) data modify entity @s equipment.mainhand set from block ~ ~ ~ Items[0] data modify entity @s equipment.mainhand.count set value 1 # remove one item from hopper's first (filled) slot execute store result score $hopper_slot_count gm4_binder_data run data get block ~ ~ ~ Items[0].count execute if score $hopper_slot_count gm4_binder_data matches ..1 run data remove block ~ ~ ~ Items[0] execute if score $hopper_slot_count gm4_binder_data matches 2.. store result block ~ ~ ~ Items[0].count int 1 run scoreboard players remove $hopper_slot_count gm4_binder_data 1 ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/detect_facing.mcfunction ================================================ # initializes the book binders armor stand. # @s = player who has placed a lectern # at most negative corner of lectern # run from binder/placement/find_lectern execute if block ~ ~ ~ lectern[facing=north] run summon minecraft:armor_stand ~.5 ~.01 ~.38 {NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:"gm4_book_binder",Tags:["gm4_book_binder","gm4_book_binder_north","gm4_no_edit","smithed.entity","smithed.strict"],equipment:{feet:{id:"minecraft:enchanted_book",count:1}}} execute if block ~ ~ ~ lectern[facing=south] run summon minecraft:armor_stand ~.5 ~.01 ~.6 {Rotation:[180f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:"gm4_book_binder",Tags:["gm4_book_binder","gm4_book_binder_south","gm4_no_edit","smithed.entity","smithed.strict"],equipment:{feet:{id:"minecraft:enchanted_book",count:1}}} execute if block ~ ~ ~ lectern[facing=east] run summon minecraft:armor_stand ~.6 ~.01 ~.5 {Rotation:[90f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:"gm4_book_binder",Tags:["gm4_book_binder","gm4_book_binder_east","gm4_no_edit","smithed.entity","smithed.strict"],equipment:{feet:{id:"minecraft:enchanted_book",count:1}}} execute if block ~ ~ ~ lectern[facing=west] run summon minecraft:armor_stand ~.38 ~.01 ~.5 {Rotation:[-90f,0f],NoGravity:1b,Small:1b,ShowArms:1b,Invisible:1b,Pose:{RightArm:[25.0f,0.0f,180.0f]},CustomName:"gm4_book_binder",Tags:["gm4_book_binder","gm4_book_binder_west","gm4_no_edit","smithed.entity","smithed.strict"],equipment:{feet:{id:"minecraft:enchanted_book",count:1}}} scoreboard players set @e[type=armor_stand,dx=0,tag=gm4_book_binder] gm4_entity_version 1 ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/disable.mcfunction ================================================ # @s any active book binder armor stand in lectern with book on actual lectern # at @s # run from gm4_book_binders:process_binder data merge entity @s {DisabledSlots:2039583,Marker:1b} tag @s remove gm4_book_binder_active ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/drop_hand_item.mcfunction ================================================ # @s a book binder NOT inside a lectern, with items in the hand slot # at @s # run from gm4_book_binders:binder/placement/kill # summon hand item as item entity summon item ~ ~ ~ {Tags:["gm4_empty_hand_item"],PickupDelay:0s,Item:{id:"minecraft:wooden_hoe",count:1}} data modify entity @e[type=item,limit=1,sort=nearest,tag=gm4_empty_hand_item,dx=0] Item set from entity @s equipment.mainhand ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/drop_stored_item.mcfunction ================================================ # @s a book binder NOT inside a lectern, with items in the foot slot # at @s # run from gm4_book_binders:binder/placement/kill #move the foot item with the lectern's inventory to the hand slot and then run the debinder to drop it all as pages item replace entity @s weapon.mainhand from entity @s armor.feet function gm4_book_binders:binder/recipes/debind ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/enable.mcfunction ================================================ # @s any disabled book binder armor stand in lectern without book on actual lectern # at @s # run from gm4_book_binders:process_binder data merge entity @s {DisabledSlots:1973790,Marker:0b} tag @s add gm4_book_binder_active ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/find_lectern.mcfunction ================================================ # marches forward until a lectern is encountered # @s = player who has placed down a lectern # at start location # run from binder/placement/revoke_advancement scoreboard players add gm4_ray_counter gm4_count 1 execute unless block ~ ~ ~ lectern if score gm4_ray_counter gm4_count matches 0..500 positioned ^ ^ ^0.01 run function gm4_book_binders:binder/placement/find_lectern execute if block ~ ~ ~ lectern align xyz unless entity @e[type=armor_stand,dx=0,tag=gm4_book_binder,limit=1] run function gm4_book_binders:binder/placement/detect_facing ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/kill.mcfunction ================================================ # @s a book binder NOT inside a lectern # at @s # run from gm4_book_binders:binder/placement/disable # check for the existence of an hand item scoreboard players reset $has_hand_item gm4_binder_data execute store success score $has_hand_item gm4_binder_data if items entity @s weapon.* * # drop hand items if necessary execute if score $has_hand_item gm4_binder_data matches 1.. run function gm4_book_binders:binder/placement/drop_hand_item # check for the existence of an hand item scoreboard players reset $has_stored_item gm4_binder_data execute store success score $has_stored_item gm4_binder_data unless items entity @s armor.* *[stored_enchantments={}] # drop internally stored pages if necessary execute if score $has_stored_item gm4_binder_data matches 1.. run function gm4_book_binders:binder/placement/drop_stored_item # kill armor stand kill @s ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/placement/revoke_advancement.mcfunction ================================================ # @s = player that just placed a lectern # at @s # run from advancement place_new_lectern # revoke advancement and summon ray advancement revoke @s only gm4_book_binders:place_new_lectern # raycast scoreboard players set gm4_ray_counter gm4_count 0 execute anchored eyes positioned ^ ^ ^ run function gm4_book_binders:binder/placement/find_lectern ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/recipes/bind.mcfunction ================================================ # as book binder marker armor stands with leather in hand # at @s #run from binder/recipes/check_recipes # summon empty enchanted book summon item ~ ~-0.26 ~ {Tags:["gm4_empty_enchanted_book"],PickupDelay:0s,Item:{id:"minecraft:enchanted_book",count:1}} # remove the leather item replace entity @s weapon.mainhand with minecraft:air # compose enchants item replace entity @e[type=item,tag=gm4_empty_enchanted_book,distance=..0.3] contents from entity @s armor.feet # advancement advancement grant @a[distance=..3,gamemode=!spectator] only gm4:book_binders_bind # clear stored pages data remove entity @s equipment.feet.components."minecraft:stored_enchantments" # reset tags tag @s remove gm4_book_binder_with_page tag @e[type=item,distance=..0.3] remove gm4_empty_enchanted_book # sounds and visuals playsound minecraft:item.armor.equip_leather block @a ~ ~ ~ 0.4 1.5 particle crit ^-.15 ^1.05 ^.05 .1 0 .1 .1 8 ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/recipes/check_recipes.mcfunction ================================================ # as book binder marker armor stands # at @s #run from gm4_book_binders:binder/tick # check for binding/debinding execute if items entity @s weapon.* minecraft:paper[custom_data~{gm4_book_binders:{item:"enchanted_page"}}] run function gm4_book_binders:binder/recipes/page execute if items entity @s weapon.* minecraft:enchanted_book run function gm4_book_binders:binder/recipes/debind execute if items entity @s[tag=gm4_book_binder_with_page] weapon.* minecraft:leather run function gm4_book_binders:binder/recipes/bind ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/recipes/debind.mcfunction ================================================ # as book binder marker armor stands with enchanted book in hand # at @s #run from binder/recipes/check_recipes # transfer enchants onto pages data modify storage gm4_book_binders:temp stored_enchantments set from entity @s equipment.mainhand.components."minecraft:stored_enchantments" loot spawn ~ ~-0.26 ~ loot gm4_book_binders:debind_book # advancement advancement grant @a[distance=..3,gamemode=!spectator] only gm4:book_binders_debind # delete used up book data remove entity @s equipment.mainhand # sounds and visuals playsound minecraft:block.beehive.shear master @a ~ ~ ~ 0.4 0.1 particle minecraft:item{item:"minecraft:enchanted_book"} ^-.15 ^1.05 ^.05 .1 .1 .1 .07 6 ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/recipes/page.mcfunction ================================================ # as book binder marker armor stands with enchanted page in hand # at @s #run from gm4_book_binders:binder/recipes/check_recipes # transfer data from paper to foot storage execute store success score $new_page gm4_binder_data run data modify entity @s equipment.feet.components."minecraft:stored_enchantments" merge from entity @s equipment.mainhand.components."minecraft:enchantments" # exit if page already exists -- duplicate enchantments would not be added but deleted anyway execute if score $new_page gm4_binder_data matches 0 run return 0 # delete the held page item item replace entity @s weapon.mainhand with minecraft:air # mark armor stand as holding at least one page tag @s add gm4_book_binder_with_page # sounds and visuals playsound minecraft:item.book.page_turn block @a ~ ~ ~ 0.6 0.7 playsound minecraft:entity.item.pickup block @a ~ ~ ~ 0.4 0.1 particle enchant ^-.15 ^1.05 ^.05 .1 .1 .1 .1 10 ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/binder/tick.mcfunction ================================================ # @s an active book binder # at @s # run from gm4_book_binders:process_binders # check for the existence of an hand item scoreboard players reset $has_hand_item gm4_binder_data execute store success score $has_hand_item gm4_binder_data if items entity @s weapon.* *[count=1] # handle binders with item in hand slot execute if score $has_hand_item gm4_binder_data matches 1.. if predicate gm4_book_binders:successful_process run function gm4_book_binders:binder/recipes/check_recipes # look for hopper in the back and move item into hand slot execute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_north] positioned ~ ~ ~1 if block ~ ~ ~ hopper[facing=north,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab execute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_south] positioned ~ ~ ~-1 if block ~ ~ ~ hopper[facing=south,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab execute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_east] positioned ~-1 ~ ~ if block ~ ~ ~ hopper[facing=east,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab execute if score $has_hand_item gm4_binder_data matches 0 if entity @s[tag=gm4_book_binder_west] positioned ~1 ~ ~ if block ~ ~ ~ hopper[facing=west,enabled=true] if items block ~ ~ ~ container.* * run function gm4_book_binders:binder/hopper_grab ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/init.mcfunction ================================================ # scoreboard init scoreboard objectives add gm4_count dummy scoreboard objectives add gm4_binder_data dummy scoreboard objectives add gm4_entity_version dummy # base init execute unless score book_binders gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Book Binders"} execute unless score book_binders gm4_earliest_version < book_binders gm4_modules run scoreboard players operation book_binders gm4_earliest_version = book_binders gm4_modules scoreboard players set book_binders gm4_modules 1 schedule function gm4_book_binders:main 10t #$moduleUpdateList ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/main.mcfunction ================================================ schedule function gm4_book_binders:main 16t # handle book binders execute as @e[type=armor_stand,tag=gm4_book_binder] at @s run function gm4_book_binders:process_binders ================================================ FILE: gm4_book_binders/data/gm4_book_binders/function/process_binders.mcfunction ================================================ # @s any book binder armor stand # at @s # run from gm4_book_binders:main # disable bookbinders with books on actual lectern execute unless entity @s[tag=gm4_book_binder_active] if block ~ ~ ~ lectern[has_book=false] run function gm4_book_binders:binder/placement/enable execute if entity @s[tag=gm4_book_binder_active] unless block ~ ~ ~ lectern[has_book=false] run function gm4_book_binders:binder/placement/disable # kill armor stands that are no longer in a lectern execute unless block ~ ~ ~ lectern run function gm4_book_binders:binder/placement/kill # slow clock per book binder for recipe processing scoreboard players add @s[tag=gm4_book_binder_active] gm4_binder_data 1 execute if score @s gm4_binder_data matches 4.. run scoreboard players set @s gm4_binder_data 0 #process binders that aren't locked on a slow clock execute if score @s[tag=gm4_book_binder_active] gm4_binder_data matches 0 at @s run function gm4_book_binders:binder/tick ================================================ FILE: gm4_book_binders/data/gm4_book_binders/guidebook/book_binders.json ================================================ { "id": "book_binders", "name": "Book Binders", "module_type": "module", "icon": { "id": "minecraft:enchanted_book" }, "criteria": { "obtain_enchanted_page": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:paper" ], "predicates": { "minecraft:custom_data": "{gm4_book_binders:{item:\"enchanted_page\"}}" } } ] } } }, "sections": [ { "name": "tearing", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.book_binders.tearing", "fallback": "Lecterns have a small area at the center where enchanted books can be placed.\n\nThis will cause the enchanted book to be ripped up into separate pages—one for each enchantment." } ] ] }, { "name": "rebinding", "enable": [], "requirements": [ [ "obtain_enchanted_page" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.book_binders.rebinding", "fallback": "Placing enchanted pages onto a lectern will add it to its internal inventory.\n\nPlacing a leather onto the lectern will then bind the pages in its inventory, creating an enchanted book." } ], [ { "translate": "text.gm4.guidebook.book_binders.hoppers", "fallback": "A hopper pointing into the back of the lectern will push items into it.\n\nA hopper below the lectern will catch any items dropped by the lectern." } ] ] } ] } ================================================ FILE: gm4_book_binders/data/gm4_book_binders/loot_table/debind_book.json ================================================ pools = [] enchantments = ["minecraft:binding_curse", "minecraft:vanishing_curse", "minecraft:riptide", "minecraft:channeling", "minecraft:wind_burst", "minecraft:frost_walker", "minecraft:sharpness", "minecraft:smite", "minecraft:bane_of_arthropods", "minecraft:impaling", "minecraft:power", "minecraft:density", "minecraft:breach", "minecraft:piercing", "minecraft:sweeping_edge", "minecraft:multishot", "minecraft:fire_aspect", "minecraft:flame", "minecraft:knockback", "minecraft:punch", "minecraft:protection", "minecraft:blast_protection", "minecraft:fire_protection", "minecraft:projectile_protection", "minecraft:feather_falling", "minecraft:fortune", "minecraft:looting", "minecraft:silk_touch", "minecraft:luck_of_the_sea", "minecraft:efficiency", "minecraft:quick_charge", "minecraft:lure", "minecraft:respiration", "minecraft:aqua_affinity", "minecraft:soul_speed", "minecraft:swift_sneak", "minecraft:depth_strider", "minecraft:thorns", "minecraft:loyalty", "minecraft:unbreaking", "minecraft:infinity", "minecraft:mending", "minecraft:lunge"] # expecting enchantment in format, "minecraft:name" # see bookshelf inspectors, evaluate/process_display/spawn/components_to_list for enchantment in enchantments: pools.append( { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:paper", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_book_binders:item/enchanted_page"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_book_binders:{item:\"enchanted_page\"}}" }, { "function": "minecraft:set_name", "entity": "this", "target": "item_name", "name": { "translate": "item.gm4.enchanted_page", "fallback": "Enchanted Page" } }, { "function": "minecraft:set_enchantments", "enchantments": { f"{enchantment}": { "type": "minecraft:storage", "storage": "gm4_book_binders:temp", "path": f"stored_enchantments.\"{enchantment}\"" } } } ] } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:storage", "storage": "gm4_book_binders:temp", "path": f"stored_enchantments.\"{enchantment}\"" }, "range": { "min": 1, "max": 255 } } ] } ) { "pools": pools } ================================================ FILE: gm4_book_binders/data/gm4_book_binders/predicate/successful_process.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.82 } ================================================ FILE: gm4_book_binders/data/gm4_book_binders/test/binding.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 400 give @s lectern execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5 dummy @s use block ~ ~ ~1 assert entity @s[advancements={gm4:book_binders=true}] item replace entity @s weapon.mainhand with minecraft:paper[enchantments={efficiency:3},custom_data={gm4_book_binders:{item:"enchanted_page"}}] dummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1] await not items entity @e[tag=gm4_book_binder,distance=..3] weapon.* minecraft:paper item replace entity @s weapon.mainhand with minecraft:leather dummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1] await not items entity @e[tag=gm4_book_binder,distance=..3] weapon.* minecraft:leather await items entity @s container.* minecraft:enchanted_book[count=1,stored_enchantments={efficiency:3}] ================================================ FILE: gm4_book_binders/data/gm4_book_binders/test/debinding.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @timeout 300 give @s lectern execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5 dummy @s use block ~ ~ ~1 assert entity @s[advancements={gm4:book_binders=true}] item replace entity @s weapon.mainhand with minecraft:enchanted_book[stored_enchantments={efficiency:3,silk_touch:1}] dummy @s use entity @e[tag=gm4_book_binder,distance=..3,limit=1] await entity @s[advancements={gm4:book_binders_debind=true}] tp @e[type=item,dx=2,dy=2,dz=2] @s await items entity @s container.* minecraft:paper[enchantments={silk_touch:1},custom_data~{gm4_book_binders:{item:"enchanted_page"}}] assert items entity @s container.* minecraft:paper[enchantments={efficiency:3},custom_data~{gm4_book_binders:{item:"enchanted_page"}}] ================================================ FILE: gm4_book_binders/mod.mcdoc ================================================ use ::java::world::component::item::EnchantmentLevels dispatch minecraft:storage[gm4_book_binders:temp] to struct { stored_enchantments?: EnchantmentLevels } ================================================ FILE: gm4_bookshelf_inspector/README.md ================================================ # Bookshelf Inspector See what's in your Chiseled Bookshelves without having to take all the books out! Enchanted Books show Enchantments! ### Features - Stand still and look at a book in a Chiseled Bookshelf to see its name. - Shows the enchantments on Enchanted Books. - Shows the author for Written Books. - Works in any language and supports custom formatting for the name! ================================================ FILE: gm4_bookshelf_inspector/beet.yaml ================================================ id: gm4_bookshelf_inspector name: Bookshelf Inspector version: 1.5.X data_pack: load: . require: - bolt pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: See what's in your Chiseled Bookshelves without having to take all the books out! recommended: [] notes: [] modrinth: project_id: hI6pAf86 smithed: pack_id: gm4_bookshelf_inspector wiki: https://wiki.gm4.co/wiki/Bookshelf_Inspector credits: Creator: - Djones Icon Design: - Hozz ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/evaluate/raycast.mcfunction ================================================ # raycast for a chiseled bookshelf # @s = player not in spectator mode # at @s anchored eyes, positioned ^ ^ ^1 + 0.25x (x = 0..11) # run from evaluate/run # run from here scoreboard players remove $simple_raycast gm4_bookshelf_inspector_data 1 # check for chiseled bookshelves execute if block ~ ~ ~ chiseled_bookshelf run function gm4_bookshelf_inspector:find_book/prep # stop raycast when block is hit (including chiseled bookshelf) execute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $simple_raycast gm4_bookshelf_inspector_data 0 execute if score $simple_raycast gm4_bookshelf_inspector_data matches 1.. positioned ^ ^ ^0.25 run function gm4_bookshelf_inspector:evaluate/raycast ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/evaluate/run.mcfunction ================================================ # check if the player is looking at a chiseled bookshelf # @s = player not in spectator mode and not moving # at unspecified # run from main # look for chiseled bookshelf scoreboard players set $simple_raycast gm4_bookshelf_inspector_data 11 execute at @s anchored eyes positioned ^ ^ ^1 run function gm4_bookshelf_inspector:evaluate/raycast ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/find_book.mcfunction ================================================ # collect data on the looked at book # @s = player not in spectator mode # positioned ^ ^ ^-0.05 before chiseled bookshelf # run from find_book/raycast # stop the raycast scoreboard players set $raycast gm4_bookshelf_inspector_data 0 # get the slot being looked at scoreboard players set $evaluate gm4_bookshelf_inspector_data 1 tag @s add gm4_bookshelf_inspector_target execute summon marker run function gm4_bookshelf_inspector:find_book/get_book_slot tag @s remove gm4_bookshelf_inspector_target # if evaluation failed stop the function execute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0 # store book data in storage execute if score $rotation gm4_bookshelf_inspector_data matches 1 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~ ~ ~-1 Items execute if score $rotation gm4_bookshelf_inspector_data matches 2 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~ ~ ~1 Items execute if score $rotation gm4_bookshelf_inspector_data matches 3 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~-1 ~ ~ Items execute if score $rotation gm4_bookshelf_inspector_data matches 4 run data modify storage gm4_bookshelf_inspector:temp book_data set from block ~1 ~ ~ Items execute if score $book_slot gm4_bookshelf_inspector_data matches 0 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:0b}] execute if score $book_slot gm4_bookshelf_inspector_data matches 1 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:1b}] execute if score $book_slot gm4_bookshelf_inspector_data matches 2 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:2b}] execute if score $book_slot gm4_bookshelf_inspector_data matches 3 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:3b}] execute if score $book_slot gm4_bookshelf_inspector_data matches 4 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:4b}] execute if score $book_slot gm4_bookshelf_inspector_data matches 5 run data modify storage gm4_bookshelf_inspector:temp book_data set from storage gm4_bookshelf_inspector:temp book_data[{Slot:5b}] # check if slot actually has a book, otherwise stop the function # this does not fail evaluation, so there is no delay in case the player is scanning over a half-filled bookshelf execute unless data storage gm4_bookshelf_inspector:temp book_data.id run return 0 # find top-left location of this chiseled bookshelf # 1=north / 2=south / 3=west / 4=east (this is facing direction, so you look against the opposite side of the block) execute if score $rotation gm4_bookshelf_inspector_data matches 1 positioned ~ ~ ~-1 align xyz positioned ~0.1875 ~0.5625 ~1.001 rotated 0 0 run function gm4_bookshelf_inspector:process_display/locate_slot execute if score $rotation gm4_bookshelf_inspector_data matches 2 positioned ~ ~ ~1 align xyz positioned ~0.8125 ~0.5625 ~-0.001 rotated 180 0 run function gm4_bookshelf_inspector:process_display/locate_slot execute if score $rotation gm4_bookshelf_inspector_data matches 3 positioned ~-1 ~ ~ align xyz positioned ~1.001 ~0.5625 ~0.8125 rotated -90 0 run function gm4_bookshelf_inspector:process_display/locate_slot execute if score $rotation gm4_bookshelf_inspector_data matches 4 positioned ~1 ~ ~ align xyz positioned ~-0.001 ~0.5625 ~0.1875 rotated 90 0 run function gm4_bookshelf_inspector:process_display/locate_slot # cleanup storage data remove storage gm4_bookshelf_inspector:temp book_data ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/get_book_slot.mcfunction ================================================ # check which book slot is being looked at # @s = marker # at chiseled bookshelf # run from find_book/find_book # get y position relative to the block execute store result score $y gm4_bookshelf_inspector_data run data get entity @s Pos[1] 100 scoreboard players operation $y gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data # get rotation from player yaw and transform it into a score # 1=north / 2=south / 3=west / 4=east execute summon marker run function gm4_bookshelf_inspector:find_book/get_rotation # check if bookshelf is rotated correctly execute if score $rotation gm4_bookshelf_inspector_data matches 1 unless block ~ ~ ~-1 chiseled_bookshelf[facing=south] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0 execute if score $rotation gm4_bookshelf_inspector_data matches 2 unless block ~ ~ ~1 chiseled_bookshelf[facing=north] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0 execute if score $rotation gm4_bookshelf_inspector_data matches 3 unless block ~-1 ~ ~ chiseled_bookshelf[facing=east] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0 execute if score $rotation gm4_bookshelf_inspector_data matches 4 unless block ~1 ~ ~ chiseled_bookshelf[facing=west] run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0 # stop if evaluation failed execute if score $evaluate gm4_bookshelf_inspector_data matches 0 run kill @s execute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0 # check if the marker is located on the front face of the bookshelf execute if score $rotation gm4_bookshelf_inspector_data matches 1..2 store result score $face_check gm4_bookshelf_inspector_data run data get entity @s Pos[2] 100 execute if score $rotation gm4_bookshelf_inspector_data matches 3..4 store result score $face_check gm4_bookshelf_inspector_data run data get entity @s Pos[0] 100 scoreboard players operation $face_check gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data execute unless score $face_check gm4_bookshelf_inspector_data matches 0..5 unless score $face_check gm4_bookshelf_inspector_data matches 94..99 run scoreboard players set $evaluate gm4_bookshelf_inspector_data 0 # stop if evaluation failed execute if score $evaluate gm4_bookshelf_inspector_data matches 0 run kill @s execute if score $evaluate gm4_bookshelf_inspector_data matches 0 run return 0 # store either the x or z coord depending on player facing execute if score $rotation gm4_bookshelf_inspector_data matches 1..2 store result score $xz gm4_bookshelf_inspector_data run data get entity @s Pos[0] 100 execute if score $rotation gm4_bookshelf_inspector_data matches 3..4 store result score $xz gm4_bookshelf_inspector_data run data get entity @s Pos[2] 100 scoreboard players operation $xz gm4_bookshelf_inspector_data %= #100 gm4_bookshelf_inspector_data # book slots: # 0 1 2 # 3 4 5 scoreboard players set $book_slot gm4_bookshelf_inspector_data 0 execute if score $xz gm4_bookshelf_inspector_data matches 33.. unless score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1 execute if score $xz gm4_bookshelf_inspector_data matches 66.. unless score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1 execute if score $xz gm4_bookshelf_inspector_data matches ..33 if score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1 execute if score $xz gm4_bookshelf_inspector_data matches ..66 if score $rotation gm4_bookshelf_inspector_data matches 2..3 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 1 execute if score $y gm4_bookshelf_inspector_data matches ..50 run scoreboard players add $book_slot gm4_bookshelf_inspector_data 3 # remove marker kill @s ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/get_rotation.mcfunction ================================================ # spawn marker to get player yaw # @s = marker # at @s # run from find_book/get_book_slot tp @s @p[tag=gm4_bookshelf_inspector_target] execute store result score $rotation gm4_bookshelf_inspector_data run data get entity @s Rotation[0] execute if score $rotation gm4_bookshelf_inspector_data matches -45..44 run scoreboard players set $rotation gm4_bookshelf_inspector_data 2 execute if score $rotation gm4_bookshelf_inspector_data matches -135..-45 run scoreboard players set $rotation gm4_bookshelf_inspector_data 4 execute if score $rotation gm4_bookshelf_inspector_data matches 45..135 run scoreboard players set $rotation gm4_bookshelf_inspector_data 3 execute unless score $rotation gm4_bookshelf_inspector_data matches 2..4 run scoreboard players set $rotation gm4_bookshelf_inspector_data 1 kill @s ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/prep.mcfunction ================================================ # prep looking for a looked at book # @s = player not in spectator mode # at unspecified # run from evaluate/raycast # start a more precise raycast scoreboard players set $raycast gm4_bookshelf_inspector_data 50 execute at @s anchored eyes positioned ^ ^ ^1 run function gm4_bookshelf_inspector:find_book/raycast ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/find_book/raycast.mcfunction ================================================ # raycast for a chiseled bookshelf # @s = player not in spectator mode # at @s anchored eyes, positioned ^ ^ ^1 + 0.05x (x = 0..50) # run from find_book/prep # run from here scoreboard players remove $raycast gm4_bookshelf_inspector_data 1 # check for bookshelf slightly up ahead execute if block ^ ^ ^0.0501 chiseled_bookshelf run function gm4_bookshelf_inspector:find_book/find_book # if a block is hit stop the raycast execute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $raycast gm4_bookshelf_inspector_data 0 execute if score $raycast gm4_bookshelf_inspector_data matches 1.. positioned ^ ^ ^0.05 run function gm4_bookshelf_inspector:find_book/raycast ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/init.mcfunction ================================================ execute unless score bookshelf_inspector gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Bookshelf Inspector"} execute unless score bookshelf_inspector gm4_earliest_version < bookshelf_inspector gm4_modules run scoreboard players operation bookshelf_inspector gm4_earliest_version = bookshelf_inspector gm4_modules scoreboard players set bookshelf_inspector gm4_modules 1 scoreboard objectives add gm4_bookshelf_inspector_data dummy scoreboard objectives add gm4_bookshelf_inspector_keep dummy scoreboard objectives add gm4_bookshelf_inspector_display_state dummy scoreboard objectives add gm4_bookshelf_inspector_walk custom:walk_one_cm scoreboard objectives add gm4_bookshelf_inspector_sprint custom:sprint_one_cm scoreboard objectives add gm4_bookshelf_inspector_fall custom:fall_one_cm scoreboard players set #100 gm4_bookshelf_inspector_data 100 schedule function gm4_bookshelf_inspector:main 1t #$moduleUpdateList ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/main.mcfunction ================================================ schedule function gm4_bookshelf_inspector:main 8t # reset keep scores for present text_displays scoreboard players set @e[type=text_display,tag=gm4_bookshelf_inspector_display.active] gm4_bookshelf_inspector_keep 0 # process players # do not check for chiseled bookshelves if the player moved anyway, allow some leniency for walking to avoid nudging removing the display execute as @a[gamemode=!spectator] unless score @s gm4_bookshelf_inspector_walk matches 100.. unless score @s gm4_bookshelf_inspector_sprint matches 1.. unless score @s gm4_bookshelf_inspector_fall matches 1.. run function gm4_bookshelf_inspector:evaluate/run # reset player scores scoreboard players reset @a gm4_bookshelf_inspector_walk scoreboard players reset @a gm4_bookshelf_inspector_sprint scoreboard players reset @a gm4_bookshelf_inspector_fall # remove text_displays that are not looked at execute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.active,scores={gm4_bookshelf_inspector_keep=0}] run function gm4_bookshelf_inspector:process_display/remove/start ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/check_location.mcfunction ================================================ # check if text_display exists in this location, if so update it, otherwise spawn a new one # @s = player not in spectator mode # at chiseled bookshelf positioned at book slot # run from process_display/locate_slot # check for existing display execute store success score $display_found gm4_bookshelf_inspector_data run scoreboard players set @e[type=text_display,tag=gm4_bookshelf_inspector_display,distance=..0.01] gm4_bookshelf_inspector_keep 1 # spawn new display execute if score $display_found gm4_bookshelf_inspector_data matches 0 summon text_display run function gm4_bookshelf_inspector:process_display/spawn/init ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/locate_slot.mcfunction ================================================ # locate decided book slot in this chiseled bookshelf, then spawn text_display there # @s = player not in spectator mode # at chiseled bookshelf # run from find_book/find_book execute if score $book_slot gm4_bookshelf_inspector_data matches 0 run function gm4_bookshelf_inspector:process_display/check_location execute if score $book_slot gm4_bookshelf_inspector_data matches 1 positioned ^0.3125 ^ ^ run function gm4_bookshelf_inspector:process_display/check_location execute if score $book_slot gm4_bookshelf_inspector_data matches 2 positioned ^0.625 ^ ^ run function gm4_bookshelf_inspector:process_display/check_location execute if score $book_slot gm4_bookshelf_inspector_data matches 3 positioned ^ ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location execute if score $book_slot gm4_bookshelf_inspector_data matches 4 positioned ^0.3125 ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location execute if score $book_slot gm4_bookshelf_inspector_data matches 5 positioned ^0.625 ^-0.5 ^ run function gm4_bookshelf_inspector:process_display/check_location ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/process.mcfunction ================================================ # text_display removing tick clock # @s = removing text_display # at unspecified # run from process_display/remove/tick scoreboard players add @s gm4_bookshelf_inspector_display_state 1 execute if score @s gm4_bookshelf_inspector_display_state matches 6 run data merge entity @s {start_interpolation:-1,interpolation_duration:5,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0f,0f,0f]}} execute unless score @s gm4_bookshelf_inspector_display_state matches 9 run scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 1 execute if score @s gm4_bookshelf_inspector_display_state matches 9 run kill @s ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/start.mcfunction ================================================ # remove a text_display no longer being looked at # @s = text_display # at unspecified # run from main # schedule tick function unless it's already active execute unless entity @e[type=text_display,tag=gm4_bookshelf_inspector_display.removing] run schedule function gm4_bookshelf_inspector:process_display/remove/tick 1t tag @s remove gm4_bookshelf_inspector_display.active tag @s add gm4_bookshelf_inspector_display.removing ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/remove/tick.mcfunction ================================================ # text_display removing tick clock # @s = unspecified # at unspecified # schedule from process_display/remove/init # schedule from here scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 0 execute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.removing] run function gm4_bookshelf_inspector:process_display/remove/process execute if score $keep_loop_active gm4_bookshelf_inspector_data matches 1 run schedule function gm4_bookshelf_inspector:process_display/remove/tick 1t ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/components_to_list.mcfunction ================================================ # converts new 1.20.5 stored enchantment component structure to a previous format of a list of {id:,lvl:} ## NOTE: a more substantial rewrite may be possible in the future if we get a way to iterate over the nbt keys dynamically # keeping this format enables most of the module to remain intact for the 1.20.5 update quickly, though may be less efficient overall # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/spawn/list_enchantments data modify storage gm4_bookshelf_inspector:temp enchantments set value [] ALL_ENCHANTMENTS = [ "binding_curse", "vanishing_curse", "riptide", "channeling", "wind_burst", "frost_walker", "sharpness", "smite", "bane_of_arthropods", "impaling", "power", "density", "breach", "piercing", "sweeping_edge", "multishot", "fire_aspect", "flame", "knockback", "punch", "protection", "blast_protection", "fire_protection", "projectile_protection", "feather_falling", "fortune", "looting", "silk_touch", "luck_of_the_sea", "efficiency", "quick_charge", "lunge", "lure", "respiration", "aqua_affinity", "soul_speed", "swift_sneak", "depth_strider", "thorns", "loyalty", "unbreaking", "infinity", "mending" ] ## beet 0.105.0 is missing enchantment tag support. Uncomment in a future version to auto-pull ids from the vanilla jar. # from beet.contrib.vanilla import Vanilla # vanilla = ctx.inject(Vanilla).mount("data/minecraft/tags/enchantment/tooltip_order.json") # ALL_ENCHANTMENTS = vanilla.data.enchantment_tags["minecraft:tooltip_order"].data["values"] for ench_id in ALL_ENCHANTMENTS: execute if data storage gm4_bookshelf_inspector:temp f"levels.\"minecraft:{ench_id}\"" run data modify storage gm4_bookshelf_inspector:temp enchantments append value {id:f"minecraft:{ench_id}"} execute if data storage gm4_bookshelf_inspector:temp f"levels.\"minecraft:{ench_id}\"" run data modify storage gm4_bookshelf_inspector:temp enchantments[{id:f"minecraft:{ench_id}"}].lvl set from storage gm4_bookshelf_inspector:temp f"levels.\"minecraft:{ench_id}\"" ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/decide_name.mcfunction ================================================ # decide the name of the text_display # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/spawn/init scoreboard players set $name_given gm4_bookshelf_inspector_data 0 # if book is named use that (decide color based on item) execute if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:enchanted_book"}.components."minecraft:custom_name" store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append value [{"text":"","color":"yellow"},{"nbt":"book_data.components.'minecraft:custom_name'","storage":"gm4_bookshelf_inspector:temp","interpret":true}] execute unless score $name_given gm4_bookshelf_inspector_data matches 1 if data storage gm4_bookshelf_inspector:temp book_data.components."minecraft:enchantments" if data storage gm4_bookshelf_inspector:temp book_data.components."minecraft:custom_name" unless data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:enchanted_book"} store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append value [{"text":"","color":"aqua"},{"nbt":"book_data.components.'minecraft:custom_name'","storage":"gm4_bookshelf_inspector:temp","interpret":true}] execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data run data modify storage gm4_bookshelf_inspector:temp text append from storage gm4_bookshelf_inspector:temp book_data.components."minecraft:custom_name" # if not and book & quill use the title execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data.components."minecraft:written_book_content".title if data storage gm4_bookshelf_inspector:temp book_data.components."minecraft:enchantments" run data modify storage gm4_bookshelf_inspector:temp text append value [{"text":"","color":"aqua"},{"nbt":"book_data.components.'minecraft:written_book_content'.title.raw","storage":"gm4_bookshelf_inspector:temp"}] execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data.components."minecraft:written_book_content".title run data modify storage gm4_bookshelf_inspector:temp text append value {"nbt":"book_data.components.'minecraft:written_book_content'.title.raw","storage":"gm4_bookshelf_inspector:temp"} # if not and (enchanted) book use translation key execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:enchanted_book"} run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.enchanted_book","color":"yellow"} execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:book"} run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.book"} execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:book"}.components."minecraft:enchantments" run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.book","color":"aqua"} execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:writable_book"} run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.writable_book"} execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:writable_book"}.components."minecraft:enchantments" run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.writable_book","color":"aqua"} execute unless score $name_given gm4_bookshelf_inspector_data matches 1 store success score $name_given gm4_bookshelf_inspector_data if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:knowledge_book"} run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"item.minecraft.knowledge_book","color":"light_purple"} # if written book also display the author execute if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:written_book"} run data modify storage gm4_bookshelf_inspector:temp text append value {"translate":"book.byAuthor","with":[{"nbt":"book_data.components.'minecraft:written_book_content'.author","storage":"gm4_bookshelf_inspector:temp"}],"color":"gray"} # if enchanted book with enchantments also display the enchantments execute if data storage gm4_bookshelf_inspector:temp book_data{id:"minecraft:enchanted_book"}.components."minecraft:stored_enchantments" run function gm4_bookshelf_inspector:process_display/spawn/list_enchantments ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/eval_enchantment.mcfunction ================================================ # transform enchantment id and lvl into displayable text # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/spawn/process_enchantments # with $id = id of the enchantment with "minecract." stripped off # with $lvl = level of the enchantment as integer # if enchantment level is 10 or lower display latin number, otherwise just print level $execute if score $enchant_lvl gm4_bookshelf_inspector_data matches 1..10 run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value [{"translate":"enchantment.minecraft.$(id)"},{"text":" "},{"translate":"enchantment.level.$(lvl)"}] $execute unless score $enchant_lvl gm4_bookshelf_inspector_data matches 1..10 run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value [{"translate":"enchantment.minecraft.$(id)"},{"text":" $(lvl)"}] ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/init.mcfunction ================================================ # init text display # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/locate_slot # schedule tick function unless it's already active execute unless entity @e[type=text_display,tag=gm4_bookshelf_inspector_display.extending] run schedule function gm4_bookshelf_inspector:process_display/spawn/tick 1t # set data data merge entity @s {Tags:["gm4_bookshelf_inspector_display","gm4_bookshelf_inspector_display.extending"],default_background:1b,view_range:0.05f,see_through:1b,line_width:130,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0f,0f,0f]},text:{"text":"???"}} # build text storage data modify storage gm4_bookshelf_inspector:temp text set value [] function gm4_bookshelf_inspector:process_display/spawn/decide_name data modify entity @s text set value {"nbt":"text[]","storage":"gm4_bookshelf_inspector:temp","separator":"\n","interpret":true} data remove storage gm4_bookshelf_inspector:temp text # set rotation execute if score $rotation gm4_bookshelf_inspector_data matches 1 run data modify entity @s Rotation set value [0.0F,0.0F] execute if score $rotation gm4_bookshelf_inspector_data matches 2 run data modify entity @s Rotation set value [180.0F,0.0F] execute if score $rotation gm4_bookshelf_inspector_data matches 3 run data modify entity @s Rotation set value [-90.0F,0.0F] execute if score $rotation gm4_bookshelf_inspector_data matches 4 run data modify entity @s Rotation set value [90.0F,0.0F] scoreboard players set @s gm4_bookshelf_inspector_keep 1 ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/list_enchantments.mcfunction ================================================ # create a list of all the enchantments # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/spawn/decide_name # create array of all enchantments with levels scoreboard players set $enchantments_max gm4_bookshelf_inspector_data 4 data modify storage gm4_bookshelf_inspector:temp levels set from storage gm4_bookshelf_inspector:temp book_data.components."minecraft:stored_enchantments" function gm4_bookshelf_inspector:process_display/spawn/components_to_list data modify storage gm4_bookshelf_inspector:temp enchantment_list set value [] function gm4_bookshelf_inspector:process_display/spawn/process_enchantments # add to the text data modify storage gm4_bookshelf_inspector:temp text append value {"nbt":"enchantment_list[]","storage":"gm4_bookshelf_inspector:temp","separator":"\n","interpret":true,"color":"gray"} # cleanup data remove storage gm4_bookshelf_inspector:temp enchantments data remove storage gm4_bookshelf_inspector:temp levels ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/process.mcfunction ================================================ # text_display extending tick clock # @s = extending text_display # at unspecified # run from process_display/spawn/tick scoreboard players add @s gm4_bookshelf_inspector_display_state 1 execute if score @s gm4_bookshelf_inspector_display_state matches 2 run data merge entity @s {start_interpolation:-1,interpolation_duration:2,transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.3f,0f],scale:[0.6f,0.6f,0.6f]}} execute if score @s gm4_bookshelf_inspector_display_state matches 4 run tag @s add gm4_bookshelf_inspector_display.active execute if score @s gm4_bookshelf_inspector_display_state matches 4 run tag @s remove gm4_bookshelf_inspector_display.extending execute unless score @s gm4_bookshelf_inspector_display_state matches 4 run scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 1 ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/process_enchantments.mcfunction ================================================ # add enchantments to the list 1 by 1 # @s = text display # at chiseled bookshelf, selected book slot # run from process_display/spawn/list_enchantments # run from here # get id and lvl of enchantment data modify storage gm4_bookshelf_inspector:temp new_enchant.id set string storage gm4_bookshelf_inspector:temp enchantments[0].id 10 execute store result storage gm4_bookshelf_inspector:temp new_enchant.lvl int 1 run data get storage gm4_bookshelf_inspector:temp enchantments[0].lvl execute store result score $enchant_lvl gm4_bookshelf_inspector_data run data get storage gm4_bookshelf_inspector:temp new_enchant.lvl # get corresponding text using macro's function gm4_bookshelf_inspector:process_display/spawn/eval_enchantment with storage gm4_bookshelf_inspector:temp new_enchant # cleanup data remove storage gm4_bookshelf_inspector:temp new_enchant # repeat for each enchant on the book, max 3 scoreboard players remove $enchantments_max gm4_bookshelf_inspector_data 1 data remove storage gm4_bookshelf_inspector:temp enchantments[0] execute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 store result score $enchantment_count gm4_bookshelf_inspector_data run data get storage gm4_bookshelf_inspector:temp enchantments execute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 if score $enchantment_count gm4_bookshelf_inspector_data matches 1 run function gm4_bookshelf_inspector:process_display/spawn/process_enchantments execute if score $enchantments_max gm4_bookshelf_inspector_data matches 0 if score $enchantment_count gm4_bookshelf_inspector_data matches 2.. run data modify storage gm4_bookshelf_inspector:temp enchantment_list append value {"translate":"container.shulkerBox.more","with":[{"score":{"name":"$enchantment_count","objective":"gm4_bookshelf_inspector_data"}}]} execute if score $enchantments_max gm4_bookshelf_inspector_data matches 1.. if data storage gm4_bookshelf_inspector:temp enchantments[0] run function gm4_bookshelf_inspector:process_display/spawn/process_enchantments ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/spawn/tick.mcfunction ================================================ # text_display extending tick clock # @s = unspecified # at unspecified # schedule from process_display/spawn/init # schedule from here scoreboard players set $keep_loop_active gm4_bookshelf_inspector_data 0 execute as @e[type=text_display,tag=gm4_bookshelf_inspector_display.extending] run function gm4_bookshelf_inspector:process_display/spawn/process execute if score $keep_loop_active gm4_bookshelf_inspector_data matches 1 run schedule function gm4_bookshelf_inspector:process_display/spawn/tick 1t ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/function/process_display/update.mcfunction ================================================ # update this text_display from newly obtained data # @s = book reading text_display # at chiseled bookshelf positioned at book slot # run from process_display/check_location scoreboard players set $display_found gm4_bookshelf_inspector_data 1 scoreboard players set @s gm4_bookshelf_inspector_keep 1 ================================================ FILE: gm4_bookshelf_inspector/data/gm4_bookshelf_inspector/guidebook/bookshelf_inspector.json ================================================ { "id": "bookshelf_inspector", "name": "Bookshelf Inspector", "module_type": "module", "icon": { "id": "minecraft:chiseled_bookshelf" }, "criteria": { "use_chiseled_bookshelf": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:chiseled_bookshelf" ] } } } ] } } }, "sections": [ { "name": "display", "enable": [], "requirements": [ [ "use_chiseled_bookshelf" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.chiseled_bookshelf.description", "fallback": "Looking at a book inside a chiseled bookshelf will display the book name along with some extra contents." } ] ] } ] } ================================================ FILE: gm4_bookshelf_inspector/mod.mcdoc ================================================ use ::java::world::item::ItemStack use ::java::world::component::item::EnchantmentLevels use ::java::util::text::Text use ::java::util::text::TextObject dispatch minecraft:storage[gm4_bookshelf_inspector:temp] to struct { book_data?: ( [ItemStack] | ItemStack | ), levels?: EnchantmentLevels, enchantments?: [struct { id: #[id="enchantment"] string, lvl?: int, }], enchantment_list?: [Text], new_enchant?: struct { id: #[id="enchantment"] string, lvl?: int, }, text?: (Text | [TextObject] @ 0), } ================================================ FILE: gm4_bookshelf_inspector/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.bookshelf_inspector,See what's in your Chiseled Bookshelves without having to take all the books out! text.gm4.guidebook.chiseled_bookshelf.description,Looking at a book inside a chiseled bookshelf will display the book name along with some extra contents. ================================================ FILE: gm4_boots_of_ostara/README.md ================================================ # Boots of Ostara Make grass appear beneath your feet! ### Features - Converts dirt-like blocks to grass when walked over and grass is in your off-hand - Coverts moss-convertible blocks to moss when walked over with moss in your off-hand - The grass conversion functionality works when on an armour stand with grass in its arm - Blocks the other Gamemode 4 data pack, [Desire Lines]($dynamicLink:gm4_desire_lines), which causes paths to form where players commonly walk ================================================ FILE: gm4_boots_of_ostara/assets/gm4_boots_of_ostara/optifine/cit/boots_of_ostara.properties ================================================ type=armor matchItems=leather_boots texture.leather_layer_1=boots_of_ostara_layer_1 texture.leather_layer_1_overlay=boots_of_ostara_layer_1_overlay nbt.CustomModelData=$item/boots_of_ostara ================================================ FILE: gm4_boots_of_ostara/assets/translations.csv ================================================ key,en_us advancement.gm4.boots_of_ostara.description,Wear the Boots of Ostara advancement.gm4.boots_of_ostara.title,Green Feet item.gm4.boots_of_ostara,Boots of Ostara item.gm4.boots_of_ostara.lore,Brings abundance beneath you! text.gm4.guidebook.module_desc.boots_of_ostara,"A pair of boots every gardener would love to have! Boots of Ostara allow you to easily spread Grass and Moss, and they even stop the Desire Lines module from creating that pesky dirt." text.gm4.guidebook.boot_of_ostara.description,Boots of Ostara can be crafted to aid in the spreading of grass and moss.\n\nThe boots can be crafted in a crafting table. text.gm4.guidebook.boots_of_ostara.crafting,The recipe for the Boots of Ostara is as follows: text.gm4.guidebook.boots_of_ostara.crafting_and_desire_lines,Boots of Ostara also prevent desire lines from forming. text.gm4.guidebook.boots_of_ostara.grass,Wearing the boots and holding a grass block in the offhand will spread grass onto dirt beneath the wearer.\n text.gm4.guidebook.boots_of_ostara.moss_and_armor_stands,"Similarly, moss will spread onto stone when held in the offhand.\n\nArmor stands can also spread vegetation!" ================================================ FILE: gm4_boots_of_ostara/beet.yaml ================================================ id: gm4_boots_of_ostara name: Boots of Ostara version: 1.9.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: leather_boots template: generated_overlay broadcast: - reference: item/boots_of_ostara - item: leather_boots reference: gui/advancement/boots_of_ostara template: name: advancement forward: item/boots_of_ostara website: description: A pair of boots every gardener would love to have! Boots of Ostara allow you to easily spread Grass and Moss, and they even stop the Desire Lines module from creating that pesky dirt. recommended: - gm4_resource_pack - gm4_desire_lines - gm4_better_armour_stands - gm4_standard_crafting notes: [] modrinth: project_id: YCcs2E01 video: https://www.youtube.com/watch?v=H4UGM6_wGCE wiki: https://wiki.gm4.co/wiki/Boots_of_Ostara credits: Creator: - The8BitMonkey Updated by: - Misode - catter1 Icon Design: - Hozz ================================================ FILE: gm4_boots_of_ostara/data/gm4/advancement/boots_of_ostara.json ================================================ { "display": { "icon": { "id": "leather_boots", "components": { "minecraft:dyed_color": 3705899, "minecraft:custom_model_data": {"strings":["gm4_boots_of_ostara:gui/advancement/boots_of_ostara"]} } }, "title": { "translate": "advancement.gm4.boots_of_ostara.title", "fallback": "Green Feet" }, "description": { "translate": "advancement.gm4.boots_of_ostara.description", "fallback": "Wear the Boots of Ostara", "color": "gray" } }, "parent": "gm4:root", "criteria": { "boots_of_ostara": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_boots_of_ostara:1b}" } } ] } } } } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/advancement/recipes/boots_of_ostara.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_boots_of_ostara:boots_of_ostara" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_boots", "minecraft:moss_block", "minecraft:grass_block" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_boots_of_ostara:boots_of_ostara" ] } } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/block_desire_lines.mcfunction ================================================ # @s = any survival player # at unspecified # run from #gm4_desire_lines:expansion # semi-ensure desire lines is disabled ($probability should only be modified NOT SET, as the modification order is load dependent) execute if predicate gm4_boots_of_ostara:boots_equipped run scoreboard players remove $probability gm4_desire_lines 1000 ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/convert.mcfunction ================================================ # checks what the player/armor stand is holding # @s = player or armor stand, wearing Boots of Ostara # at @s # run from main # make sure moss/mycelium checks are run before grass, so grass isn't instantly converted to either # this rule replaces the old "check if grass was converted" check # first run, check mainhand execute if items entity @s weapon.mainhand moss_block if block ~ ~-0.5 ~ #gm4_boots_of_ostara:moss_replaceable run setblock ~ ~-0.5 ~ moss_block execute if items entity @s weapon.mainhand mycelium if block ~ ~-0.5 ~ #gm4_boots_of_ostara:mycelium_replaceable run setblock ~ ~-0.5 ~ mycelium execute if items entity @s weapon.mainhand grass_block if block ~ ~-0.5 ~ #minecraft:substrate_overworld run setblock ~ ~-0.5 ~ grass_block execute if items entity @s weapon.mainhand crimson_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ crimson_nylium execute if items entity @s weapon.mainhand warped_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ warped_nylium # now go through offhand execute if items entity @s weapon.offhand moss_block if block ~ ~-0.5 ~ #gm4_boots_of_ostara:moss_replaceable run setblock ~ ~-0.5 ~ moss_block execute if items entity @s weapon.offhand mycelium if block ~ ~-0.5 ~ #gm4_boots_of_ostara:mycelium_replaceable run setblock ~ ~-0.5 ~ mycelium execute if items entity @s weapon.offhand grass_block if block ~ ~-0.5 ~ #minecraft:substrate_overworld run setblock ~ ~-0.5 ~ grass_block execute if items entity @s weapon.offhand crimson_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ crimson_nylium execute if items entity @s weapon.offhand warped_nylium if block ~ ~-0.5 ~ minecraft:netherrack run setblock ~ ~-0.5 ~ warped_nylium ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/init.mcfunction ================================================ execute unless score boots_of_ostara gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Boots Of Ostara"} execute unless score boots_of_ostara gm4_earliest_version < boots_of_ostara gm4_modules run scoreboard players operation boots_of_ostara gm4_earliest_version = boots_of_ostara gm4_modules scoreboard players set boots_of_ostara gm4_modules 1 schedule function gm4_boots_of_ostara:main 1t #$moduleUpdateList ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/function/main.mcfunction ================================================ execute as @a[gamemode=!spectator,gamemode=!adventure,predicate=gm4_boots_of_ostara:boots_equipped] at @s run function gm4_boots_of_ostara:convert execute as @e[type=armor_stand,predicate=gm4_boots_of_ostara:boots_equipped] at @s run function gm4_boots_of_ostara:convert schedule function gm4_boots_of_ostara:main 16t ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/guidebook/boots_of_ostara.json ================================================ { "id": "boots_of_ostara", "name": "Boots of Ostara", "module_type": "module", "icon": { "id": "minecraft:leather_boots", "components": { "minecraft:dyed_color": 3705899 } }, "criteria": { "obtain_leather_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_boots" ] } ] } }, "obtain_grass_block": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:grass_block" ] } ] } }, "obtain_boots_of_ostara": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_boots_of_ostara:1b}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.boot_of_ostara.description", "fallback": "Boots of Ostara can be crafted to aid in the spreading of grass and moss.\n\nThe boots can be crafted in a crafting table." } ] ] }, { "name": "crafting", "enable": [ { "id": "gm4_desire_lines", "load": -1 } ], "requirements": [ [ "obtain_leather_boots" ], [ "obtain_grass_block" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.boots_of_ostara.crafting", "fallback": "The recipe for the Boots of Ostara is as follows:" }, "\n", { "insert": "recipe", "recipe": "gm4_boots_of_ostara:boots_of_ostara" } ] ] }, { "name": "crafting-desire_lines", "enable": [ { "id": "gm4_desire_lines", "load": 1 } ], "requirements": [ [ "obtain_leather_boots" ], [ "obtain_grass_block" ] ], "pages": [ [ { "insert": "recipe", "recipe": "gm4_boots_of_ostara:boots_of_ostara" }, "\n\n", { "translate": "text.gm4.guidebook.boots_of_ostara.crafting_and_desire_lines", "fallback": "Boots of Ostara also prevent desire lines from forming." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_boots_of_ostara" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.boots_of_ostara.grass", "fallback": "Wearing the boots and holding a grass block in the offhand will spread grass onto dirt beneath the wearer.\n" } ], [ { "translate": "text.gm4.guidebook.boots_of_ostara.moss_and_armor_stands", "fallback": "Similarly, moss will spread onto stone when held in the offhand.\n\nArmor stands can also spread vegetation!" } ] ], "grants": [ "crafting", "crafting-desire_lines" ] } ] } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/loot_table/items/boots_of_ostara.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_boots", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:dyed_color": 3705899, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] }, "minecraft:custom_model_data": { "strings": [ "gm4_boots_of_ostara:item/boots_of_ostara" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_boots_of_ostara:1b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.boots_of_ostara", "fallback": "Boots of Ostara", "italic": false } }, { "function": "minecraft:set_lore", "mode": "insert", "lore": [ { "translate": "item.gm4.boots_of_ostara.lore", "fallback": "Brings abundance beneath you!", "color": "dark_gray", "italic": true } ] } ] } ] } ] } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/predicate/boots_equipped.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_boots_of_ostara:1b}" } } } } } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/recipe/boots_of_ostara.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ " S ", "MLG", " W " ], "key": { "S": "minecraft:wheat_seeds", "M": "minecraft:moss_block", "L": "minecraft:leather_boots", "G": "minecraft:grass_block", "W": "minecraft:water_bucket" }, "result": { "id": "minecraft:leather_boots", "components": { "minecraft:dyed_color": 3705899, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] }, "minecraft:custom_model_data": {"strings":["gm4_boots_of_ostara:item/boots_of_ostara"]}, "minecraft:custom_data": "{gm4_boots_of_ostara:1b}", "minecraft:item_name": {"translate": "item.gm4.boots_of_ostara","fallback": "Boots of Ostara"}, "minecraft:lore": [ {"translate":"item.gm4.boots_of_ostara.lore","fallback":"Brings abundance beneath you!","color":"dark_gray","italic":false} ] } } } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/tags/block/moss_replaceable.json ================================================ { "values": [ "#minecraft:base_stone_overworld", "#minecraft:substrate_overworld" ] } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/tags/block/mycelium_replaceable.json ================================================ { "values": [ "minecraft:dirt", "minecraft:coarse_dirt" ] } ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_both.mcfunction ================================================ # @template gm4:test_platform setblock ~1 ~ ~1 stone summon armor_stand ~1.5 ~1 ~1.5 item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:grass_block item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.offhand with minecraft:moss_block loot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara await block ~1 ~ ~1 moss_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_both_backwards.mcfunction ================================================ # @template gm4:test_platform setblock ~1 ~ ~1 stone summon armor_stand ~1.5 ~1 ~1.5 item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:moss_block item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.offhand with minecraft:grass_block loot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara await block ~1 ~ ~1 grass_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_grass.mcfunction ================================================ # @template gm4:test_platform setblock ~1 ~ ~1 dirt summon armor_stand ~1.5 ~1 ~1.5 item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:grass_block loot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara await block ~1 ~ ~1 grass_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/armor_stand_moss.mcfunction ================================================ # @template gm4:test_platform setblock ~1 ~ ~1 stone summon armor_stand ~1.5 ~1 ~1.5 item replace entity @e[type=armor_stand,distance=..4,limit=1] weapon.mainhand with minecraft:moss_block loot replace entity @e[type=armor_stand,distance=..4,limit=1] armor.feet loot gm4_boots_of_ostara:items/boots_of_ostara await block ~1 ~ ~1 moss_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/player_grass.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~1 setblock ~1 ~ ~1 dirt give @s grass_block dummy @s swap loot give @s loot gm4_boots_of_ostara:items/boots_of_ostara dummy @s use item await block ~1 ~ ~1 grass_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_boots_of_ostara/test/player_moss.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~1 setblock ~1 ~ ~1 granite give @s moss_block dummy @s swap loot give @s loot gm4_boots_of_ostara:items/boots_of_ostara dummy @s use item await block ~1 ~ ~1 moss_block ================================================ FILE: gm4_boots_of_ostara/data/gm4_desire_lines/tags/function/expansion.json ================================================ { "values": [ "gm4_boots_of_ostara:block_desire_lines" ] } ================================================ FILE: gm4_calling_bell/README.md ================================================ # Calling Bell Those pesky Wandering Traders never deign to stop by your house? Let them know you've got emeralds to sell by ringing a bell, and one will appear before your eyes with their.. er.. useful trades. Trader being called to market ### Features - Once a day, ring a bell while holding an emerald to instantly summon a wandering trader - Each player can summon their own trader each day - Great in sky-block playthroughs for getting important resources ================================================ FILE: gm4_calling_bell/beet.yaml ================================================ id: gm4_calling_bell name: Calling Bell version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [] model_data: - item: emerald reference: gui/advancement/calling_bell template: advancement website: description: Summon a Wandering Trader by using an Emerald on a Bell. recommended: - gm4_apple_trees - gm4_zauber_cauldrons notes: [] modrinth: project_id: qNzelyE3 smithed: pack_id: gm4_calling_bell wiki: https://wiki.gm4.co/wiki/Calling_Bell credits: Creator: - TheEpyonProject Updated By: - runcows Icon Design: - Hozz ================================================ FILE: gm4_calling_bell/data/gm4/advancement/calling_bell.json ================================================ { "display": { "icon": { "id": "emerald", "components": { "minecraft:custom_model_data": {"strings":["gm4_calling_bell:gui/advancement/calling_bell"]} } }, "title": { "translate": "advancement.gm4.calling_bell.title", "fallback": "House Call" }, "description": { "translate": "advancement.gm4.calling_bell.description", "fallback": "Summon a wandering trader by ringing a bell with an emerald", "color": "gray" } }, "parent": "gm4:root", "criteria": { "calling_bell": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/advancement/ring_bell.json ================================================ { "criteria": { "ringbell": { "trigger": "minecraft:any_block_use", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": "minecraft:emerald" } }, { "condition": "minecraft:block_state_property", "block": "minecraft:bell" } ] } } }, "rewards": { "function": "gm4_calling_bell:on_bell_interact" } } ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/function/init.mcfunction ================================================ scoreboard objectives add gm4_calling_bell dummy execute unless score calling_bell gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Calling Bell"} execute unless score calling_bell gm4_earliest_version < calling_bell gm4_modules run scoreboard players operation calling_bell gm4_earliest_version = calling_bell gm4_modules scoreboard players set calling_bell gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/function/on_bell_interact.mcfunction ================================================ # @s = player who used an emerald on a bell # at @s # run from advancement: ring_bell advancement revoke @s only gm4_calling_bell:ring_bell # fail if player already used today execute store result score $day gm4_calling_bell run time query day repetition execute if score @s gm4_calling_bell = $day gm4_calling_bell run return run playsound entity.wandering_trader.no neutral @a[distance=..16] ~ ~ ~ 1 1 0.6 execute store result score $ray gm4_calling_bell run attribute @s minecraft:block_interaction_range get 10 execute anchored eyes positioned ^ ^ ^ run function gm4_calling_bell:raycast ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/function/raycast.mcfunction ================================================ # @s = player right clicking bell with emerald # at @s anchored eyes marched forward over and over # run from gm4_calling_bell:on_bell_interact and self scoreboard players remove $ray gm4_calling_bell 1 execute if block ~ ~ ~ bell align xyz positioned ~0.5 ~1 ~0.5 run return run function gm4_calling_bell:summon_trader execute if score $ray gm4_calling_bell matches 1.. positioned ^ ^ ^0.1 run function gm4_calling_bell:raycast ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/function/summon_trader.mcfunction ================================================ # summon a wandering trader if valid placement # @s = player right clicking bell with emerald # at block above bell # run from raycast # check for valid spawn placement, otherwise return execute unless predicate gm4_calling_bell:trader_hitbox_no_collision run return run playsound entity.wandering_trader.no neutral @a[distance=..16] ~ ~ ~ 1 1 0.6 # summon trader summon wandering_trader ~ ~ ~ {Tags:["gm4_calling_bell_trader"],DespawnDelay:24000} playsound entity.wandering_trader.reappeared neutral @a[distance=..16] ~ ~ ~ 1 1 0.6 particle happy_villager ~ ~0.5 ~ 0.3 0.3 0.3 1 5 particle large_smoke ~ ~1 ~ 0.25 0.5 0.25 0 10 # consume emerald item modify entity @s[gamemode=!creative] weapon.mainhand gm4_calling_bell:minus_one # update player scoreboard players operation @s gm4_calling_bell = $day gm4_calling_bell advancement grant @s only gm4:calling_bell ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/guidebook/calling_bell.json ================================================ { "id": "calling_bell", "name": "Calling Bell", "module_type": "module", "icon": { "id": "minecraft:emerald" }, "criteria": { "obtain_emerald": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:emerald" ] } ] } }, "obtain_bell": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bell" ] } ] } } }, "sections": [ { "name": "calling", "enable": [], "requirements": [ [ "obtain_emerald" ], [ "obtain_bell" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.calling_bell.description", "fallback": "Ringing a bell while holding an emerald will cause a wandering trader to appear.\n\nThis can be done once per day." } ] ] } ] } ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/item_modifier/minus_one.json ================================================ { "function": "minecraft:set_count", "count": -1, "add": true } ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/predicate/trader_hitbox_no_collision.json ================================================ [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:no_collision" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#gm4:no_collision" } } } ] ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/test/call.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ # @skyaccess setblock ~1 ~1 ~1 bell execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 give @s emerald dummy @s use block ~1.4 ~1.25 ~1.5 north # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_calling_bell:ring_bell await entity @e[type=wandering_trader,distance=..4] assert not items entity @s weapon.mainhand minecraft:emerald ================================================ FILE: gm4_calling_bell/data/gm4_calling_bell/test/call_blocked.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ setblock ~1 ~1 ~1 bell setblock ~1 ~3 ~1 stone execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 give @s emerald dummy @s use block ~1.4 ~1.25 ~1.5 north # any_block_use isnt triggering for dummy @s use block advancement grant @s only gm4_calling_bell:ring_bell await delay 1s assert not entity @e[type=wandering_trader,distance=..4] assert items entity @s weapon.mainhand minecraft:emerald ================================================ FILE: gm4_calling_bell/translations.csv ================================================ key,en_us advancement.gm4.calling_bell.title,House Call advancement.gm4.calling_bell.description,Summon a wandering trader by ringing a bell with an emerald text.gm4.guidebook.module_desc.calling_bell,Summon a Wandering Trader by using an Emerald on a Bell. text.gm4.guidebook.calling_bell.description,Ringing a bell while holding an emerald will cause a wandering trader to appear.\n\nThis can be done once per day. ================================================ FILE: gm4_cement_mixers/README.md ================================================ # Cement Mixers Automating concrete conversion with a porous solution! ### Features - Builds on the Gamemode 4 data pack [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) - Allows a liquid tank to convert concrete powder to concrete at the cost of 1/3 a bucket of water - Makes the whole concrete conversion process automatable without the player ================================================ FILE: gm4_cement_mixers/beet.yaml ================================================ id: gm4_cement_mixers name: Cement Mixers version: 1.6.X data_pack: load: . require: - bolt pipeline: - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_liquid_tanks: 3.1.0 website: description: Allows Liquid Tanks to convert Concrete Powder items into Concrete, at the cost of ⅓ of a Bucket of Water per Concrete Powder. recommended: [] notes: [] modrinth: project_id: blBLRC4i video: https://www.youtube.com/watch?v=qa9lcbii1BE wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Cement_Mixers credits: Creator: - Sparks Icon Design: - DuckJr ================================================ FILE: gm4_cement_mixers/data/gm4_cement_mixers/function/init.mcfunction ================================================ execute unless score cement_mixers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Cement Mixers"} execute unless score cement_mixers gm4_earliest_version < cement_mixers gm4_modules run scoreboard players operation cement_mixers gm4_earliest_version = cement_mixers gm4_modules scoreboard players set cement_mixers gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_cement_mixers/data/gm4_cement_mixers/function/item_fill.mcfunction ================================================ #@s = liquid tank with item in first slot #run from liquid_tanks:item_process execute if entity @s[tag=gm4_lt_water] run function gm4_cement_mixers:water_concrete ================================================ FILE: gm4_cement_mixers/data/gm4_cement_mixers/function/water_concrete.mcfunction ================================================ # run from item_fill # @s = liquid tank at @s concretes_colors = ( "black", "blue", "brown", "cyan", "gray", "green", "light_blue", "light_gray", "lime", "magenta", "orange", "pink", "purple", "red", "white", "yellow" ) for color in concretes_colors: execute if items block ~ ~ ~ container.0 f"minecraft:{color}_concrete_powder" run function f"gm4_cement_mixers:item_fill/{color}_concrete": scoreboard players set $item_value gm4_lt_value -1 item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand with f"minecraft:{color}_concrete" function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill item_tag gm4_cement_mixers:dirt { "values": [ "minecraft:dirt", "minecraft:coarse_dirt", "minecraft:rooted_dirt" ] } execute if items block ~ ~ ~ container.0 #gm4_cement_mixers:dirt run function gm4_cement_mixers:item_fill/mud: scoreboard players set $item_value gm4_lt_value -1 item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand with minecraft:mud function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_cement_mixers/data/gm4_cement_mixers/guidebook/cement_mixers.json ================================================ { "id": "cement_mixers", "name": "Cement Mixers", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:light_blue_concrete_powder" }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } }, "obtain_concrete_powder": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:black_concrete_powder", "minecraft:blue_concrete_powder", "minecraft:brown_concrete_powder", "minecraft:cyan_concrete_powder", "minecraft:gray_concrete_powder", "minecraft:green_concrete_powder", "minecraft:light_blue_concrete_powder", "minecraft:light_gray_concrete_powder", "minecraft:lime_concrete_powder", "minecraft:magenta_concrete_powder", "minecraft:orange_concrete_powder", "minecraft:pink_concrete_powder", "minecraft:purple_concrete_powder", "minecraft:red_concrete_powder", "minecraft:white_concrete_powder", "minecraft:yellow_concrete_powder" ] } ] } } }, "sections": [ { "name": "usage", "enable": [], "requirements": [ [ "obtain_concrete_powder" ], [ "obtain_liquid_tank" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.cement_mixers.usage", "fallback": "A Water Tank can convert concrete powder into concrete and dirt into mud when placed inside the tank.\n\nThis uses 1/3 of a bucket of water." } ] ] } ] } ================================================ FILE: gm4_cement_mixers/data/gm4_liquid_tanks/tags/function/item_fill.json ================================================ { "values":[ "gm4_cement_mixers:item_fill" ] } ================================================ FILE: gm4_cement_mixers/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.cement_mixers,"Allows Liquid Tanks to convert Concrete Powder items into Concrete, at the cost of ⅓ of a Bucket of Water per Concrete Powder." text.gm4.guidebook.cement_mixers.usage,A Water Tank can convert concrete powder into concrete and dirt into mud when placed inside the tank.\n\nThis uses 1/3 of a bucket of water. ================================================ FILE: gm4_chairs/README.md ================================================ # Chairs Since the dawn of Minecraft, stairs have been used as chairs in every house you've ever built. With this simple data pack, players can actually sit on stairs by throwing a saddle on them. Chairs Creation Example ### Features - Throw a saddle on any stair block to turn it into a chair, which you can sit on - Adds two chair-related advancements - No texture pack required! ![Chairs Any Stair Example](images/chairs_any_stair_example.png) ### Expansion Packs Want some preset poses? Download the [Poses Pack Expansion]($dynamicLink:gm4_poses_pack) Add particles to your builds with the [Particles Pack Expansion]($dynamicLink:gm4_particles_pack) ================================================ FILE: gm4_chairs/beet.yaml ================================================ id: gm4_chairs name: Chairs version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Place a saddle on a stair to have a chair to sit on! recommended: - gm4_display_frames - gm4_better_armour_stands - gm4_holographic_tags notes: [] modrinth: project_id: KLywOs5L smithed: pack_id: gm4_chairs planetminecraft: uid: 4299435 video: https://www.youtube.com/watch?v=7KbBw1hEKdY wiki: https://wiki.gm4.co/wiki/Chairs credits: Creator: - Denniss Icon Design: - DuckJr model_data: - item: birch_stairs reference: gui/advancement/chairs_creation template: advancement - item: poisonous_potato reference: gui/advancement/chairs_sit template: advancement ================================================ FILE: gm4_chairs/data/gm4/advancement/chairs_creation.json ================================================ { "display": { "icon": { "id": "birch_stairs", "components": { "minecraft:custom_model_data": {"strings":["gm4_chairs:gui/advancement/chairs_creation"]} } }, "title": { "translate": "advancement.gm4.chairs.creation.title", "fallback": "A Throne, Fit for a King!" }, "description": { "translate": "advancement.gm4.chairs.creation.description", "fallback": "Throw a saddle on stairs to make a chair", "color": "gray" } }, "parent": "gm4:root", "criteria": { "create chair": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_chairs/data/gm4/advancement/chairs_sit.json ================================================ { "display": { "icon": { "id": "poisonous_potato", "components": { "minecraft:custom_model_data": {"strings":["gm4_chairs:gui/advancement/chairs_sit"]} } }, "title": { "translate": "advancement.gm4.chairs.sit.title", "fallback": "Couch Potato" }, "description": { "translate": "advancement.gm4.chairs.sit.description", "fallback": "Sit for over an hour!", "color": "gray" }, "frame": "goal", "hidden": true }, "parent": "gm4:chairs_creation", "criteria": { "hour_in_chair": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_chairs/data/gm4_chairs/advancement/hit.json ================================================ { "criteria": { "punch": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:pig", "nbt": "{Tags:[\"gm4_chairs\"]}" } } ] } } }, "rewards": { "function": "gm4_chairs:hit" } } ================================================ FILE: gm4_chairs/data/gm4_chairs/advancement/lightning.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:lightning_strike" } }, "rewards": { "function": "gm4_chairs:lightning/tag" } } ================================================ FILE: gm4_chairs/data/gm4_chairs/function/create_chair.mcfunction ================================================ # Create chair from saddle item # @s = saddle item on top of stairs # at @s align xyz positioned ~.5 ~ ~.5 # run from main # spawn chair summon minecraft:pig ~ ~-10000.39 ~ {CustomName:"gm4_chair",Tags:["gm4_chairs","smithed.entity","smithed.strict","smithed.block"],Team:"gm4_chairs",NoAI:1b,equipment:{saddle:{id:"minecraft:saddle"}},NoGravity:1b,Silent:1b,DeathTime:19s,InLove:2147483647,attributes:[{id:"minecraft:max_health",base:1.0},{id:"minecraft:movement_speed",base:0.0}],active_effects:[{id:'minecraft:invisibility',amplifier:0,duration:2147483647,show_particles:0b},{id:'minecraft:resistance',amplifier:10b,duration:2147483647,show_particles:0b}],DeathLootTable:"gm4:empty"} # set chair to orientation of stairs execute if block ~ ~ ~ #minecraft:stairs[facing=north] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~ ~10000 ~.05 0 0 execute if block ~ ~ ~ #minecraft:stairs[facing=south] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~ ~10000 ~-.05 180 0 execute if block ~ ~ ~ #minecraft:stairs[facing=east] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~-.05 ~10000 ~ 90 0 execute if block ~ ~ ~ #minecraft:stairs[facing=west] positioned ~ ~-10000 ~ as @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] at @s run tp @s ~.05 ~10000 ~ -90 0 # store saddle data in chair item replace entity @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] weapon.mainhand from entity @s contents scoreboard players set @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] gm4_entity_version 1 # place sound playsound minecraft:block.wool.place block @a[distance=..5] ~ ~ ~ .5 2 # advancement for creating a chair advancement grant @a[distance=..3,gamemode=!spectator] only gm4:chairs_creation # kill the saddle item kill @s ================================================ FILE: gm4_chairs/data/gm4_chairs/function/hit.mcfunction ================================================ # Find pig/chair that has just been hit # @s = player hitting the chair # at @s # run from advancement hit advancement revoke @s only gm4_chairs:hit execute as @e[type=minecraft:pig,tag=gm4_chairs,nbt={HurtTime:10s}] at @s positioned ^ ^.9 ^.2 run function gm4_chairs:kill ================================================ FILE: gm4_chairs/data/gm4_chairs/function/init.mcfunction ================================================ team add gm4_chairs team modify gm4_chairs collisionRule never scoreboard objectives add gm4_chairs_sit dummy scoreboard objectives add gm4_entity_version dummy execute unless score chairs gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Chairs"} execute unless score chairs gm4_earliest_version < chairs gm4_modules run scoreboard players operation chairs gm4_earliest_version = chairs gm4_modules scoreboard players set chairs gm4_modules 1 schedule function gm4_chairs:main 1t schedule function gm4_chairs:sit/check 1t #$moduleUpdateList ================================================ FILE: gm4_chairs/data/gm4_chairs/function/kill.mcfunction ================================================ # Remove chair and return saddle item # @s = pig (chair) to be removed # at @s positioned ~ ~.5 ~ / ^ ^.9 ^.2 # run from main / hit # spawn saddle item loot spawn ~ ~ ~ loot gm4_chairs:drop_saddle execute if items entity @s weapon.mainhand minecraft:saddle run item replace entity @e[type=minecraft:item,distance=..1,limit=1,sort=nearest] contents from entity @s weapon.mainhand tag @e[type=minecraft:item,distance=..1,limit=1,sort=nearest] add gm4_chairs_ignore # dismount if sitting on chair execute on passengers at @s align y run tp @s ~ ~1 ~ # increase health to avoid visible death cloud attribute @s minecraft:max_health base set 5 data modify entity @s Health set value 5 # remove chair tp @s ~ -10000 ~ ================================================ FILE: gm4_chairs/data/gm4_chairs/function/lightning/revive_chair.mcfunction ================================================ # Replace zombified piglin with chair # @s = zombified piglin that replaced the pig/chair # at @s # runs from lightning/delay # spawn chair summon minecraft:pig ~ ~-10000 ~ {Tags:["gm4_chairs","smithed.entity","smithed.strict","smithed.block"],Team:"gm4_chairs",NoAI:1b,equipment:{saddle:{id:"minecraft:saddle"}},NoGravity:1b,Silent:1b,DeathTime:19s,InLove:2147483647,attributes:[{id:"minecraft:movement_speed",base:0.0}],active_effects:[{id:'minecraft:invisibility',amplifier:0,duration:2147483647,show_particles:0b},{id:'minecraft:resistance',amplifier:10b,duration:2147483647,show_particles:0b}],DeathLootTable:"gm4:empty"} execute positioned ~ ~-10000 ~ run scoreboard players set @e[type=pig,tag=gm4_chairs,limit=1,distance=..0.1] gm4_entity_version 1 # copy zombified piglin rotation execute rotated as @s positioned ~ ~-10000 ~ run tp @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4,limit=1] ~ ~10000 ~ ~ ~ # kill zombified piglin tp @s ~ -10000 ~ ================================================ FILE: gm4_chairs/data/gm4_chairs/function/lightning/tag.mcfunction ================================================ # Target NoAI zombified_piglin after lightning strike near player # @s = player # at @s # runs from advancement, gm4_chairs:lightning advancement revoke @s only gm4_chairs:lightning execute as @e[type=zombified_piglin,tag=gm4_chairs] at @s if block ~ ~1 ~ #minecraft:stairs run function gm4_chairs:lightning/revive_chair ================================================ FILE: gm4_chairs/data/gm4_chairs/function/main.mcfunction ================================================ # detect saddle item on a stairs and spawn chair execute as @e[type=minecraft:item,tag=!gm4_chairs_ignore] if items entity @s contents minecraft:saddle at @s if block ~ ~ ~ #minecraft:stairs[half=bottom] align xyz positioned ~.5 ~ ~.5 unless entity @e[type=minecraft:pig,tag=gm4_chairs,distance=..0.4] run function gm4_chairs:create_chair # kill pig (saddle) if stairs broken execute as @e[type=minecraft:pig,tag=gm4_chairs] at @s unless block ~ ~1 ~ #minecraft:stairs positioned ~ ~.5 ~ run function gm4_chairs:kill schedule function gm4_chairs:main 16t ================================================ FILE: gm4_chairs/data/gm4_chairs/function/sit/check.mcfunction ================================================ execute as @a[predicate=gm4_chairs:sitting_in_chair] run function gm4_chairs:sit/counter schedule function gm4_chairs:sit/check 10s ================================================ FILE: gm4_chairs/data/gm4_chairs/function/sit/counter.mcfunction ================================================ # Timer for Couch Potato # @s = player sitting in a chair # at @s # run from function sit/check # increase time sitting in chair scoreboard players add @s gm4_chairs_sit 10 # sit in a chair for 1 hour advancement grant @s[scores={gm4_chairs_sit=3600..3609}] only gm4:chairs_sit ================================================ FILE: gm4_chairs/data/gm4_chairs/guidebook/chairs.json ================================================ { "id": "chairs", "name": "Chairs", "module_type": "module", "icon": { "id": "minecraft:saddle" }, "criteria": { "obtain_saddle": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:saddle" ] } ] } } }, "sections": [ { "name": "creation", "enable": [], "requirements": [ [ "obtain_saddle" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.chairs.creation", "fallback": "Chairs can be created by throwing a saddle onto a stair block.\n\nBreaking the stair or hitting the saddle relieves the stair of the saddle." } ] ] } ] } ================================================ FILE: gm4_chairs/data/gm4_chairs/loot_table/drop_saddle.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:saddle" } ] } ] } ================================================ FILE: gm4_chairs/data/gm4_chairs/predicate/sitting_in_chair.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:pig", "nbt": "{Tags:[\"gm4_chairs\"]}" } } } ================================================ FILE: gm4_chairs/data/gm4_chairs/test/create.mcfunction ================================================ # @skyaccess setblock ~ ~ ~ mangrove_stairs[facing=south] summon item ~0.5 ~1 ~0.25 {Item:{id:"minecraft:saddle",count:1}} await items entity @e[type=pig,dx=0] saddle minecraft:saddle ================================================ FILE: gm4_chairs/translations.csv ================================================ key,en_us advancement.gm4.chairs.creation.title,"A Throne, Fit for a King!" advancement.gm4.chairs.creation.description,Throw a saddle on stairs to make a chair advancement.gm4.chairs.sit.title,Couch Potato advancement.gm4.chairs.sit.description,Sit for over an hour! text.gm4.guidebook.module_desc.chairs,Place a saddle on a stair to have a chair to sit on! text.gm4.guidebook.chairs.creation,Chairs can be created by throwing a saddle onto a stair block.\n\nBreaking the stair or hitting the saddle relieves the stair of the saddle. ================================================ FILE: gm4_cooler_caves/README.md ================================================ # Cooler Caves Modifies cave generation even further by upping the cool factor... ### Features - In Deserts, sandstone generates in place of stone and sand replaces gravel - Badlands generates terracotta in place of stone and red sand replaces gravel - Ice based biomes generate snow/ice related blocks in place of andesite/stone A full list of blocks replaced and in which biomes can be seen on the [Wiki](https://wiki.gm4.co/Orbis/Cooler_Caves). ================================================ FILE: gm4_cooler_caves/beet.yaml ================================================ id: gm4_cooler_caves name: Cooler Caves version: 2.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.pfb_biome_extensions meta: gm4: website: description: A custom terrain expansion pack that makes biome specific caves recommended: - gm4_dangerous_dungeons - gm4_tower_structures notes: [] modrinth: project_id: juqV05HI video: https://www.youtube.com/watch?v=cAsXiwLWHFo wiki: https://wiki.gm4.co/wiki/Orbis/Cooler_Caves credits: Creator: - Sparks Updated by: - Misode Icon Design: - DuckJr ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/function/init.mcfunction ================================================ execute unless score cooler_caves gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Cooler Caves"} execute unless score cooler_caves gm4_earliest_version < cooler_caves gm4_modules run scoreboard players operation cooler_caves gm4_earliest_version = cooler_caves gm4_modules scoreboard players set cooler_caves gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/guidebook/cooler_caves.json ================================================ { "id": "cooler_caves", "name": "Cooler Caves", "module_type": "module", "icon": { "id": "minecraft:sandstone" }, "criteria": { "in_cave_air": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:cave_air" ] } } } } ] } } }, "sections": [ { "name": "cave_changes", "enable": [], "requirements": [ [ "in_cave_air" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.cooler_caves.description", "fallback": "The world has modified block compositions.\n\nSome biomes have different blocks compared to normal worlds." } ], [ { "translate": "text.gm4.guidebook.cooler_caves.desert_and_snow", "fallback": "In the desert, sandstone and gravel generate instead of stone and gravel.\n\nIn snowy biomes, snow, ice, and white concrete powder can be found in caves." } ], [ { "translate": "text.gm4.guidebook.cooler_caves.badlands", "fallback": "Terracotta layers extend throughout the entire underground in badland biomes. Gravel cannot be found, but red sand patches takes their place." } ] ] } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/tags/block/badlands_ore_replaceables.json ================================================ { "values": [ "#minecraft:terracotta" ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/tags/block/base_desert_overworld.json ================================================ { "values": [ "#minecraft:base_stone_overworld", "minecraft:sandstone" ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/tags/block/base_snowy_overworld.json ================================================ { "values": [ "#minecraft:base_stone_overworld", "minecraft:snow_block" ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/glow_lichen.json ================================================ { "type": "minecraft:multiface_growth", "config": { "block": "minecraft:glow_lichen", "can_be_placed_on": [ "minecraft:stone", "minecraft:andesite", "minecraft:diorite", "minecraft:granite", "minecraft:dripstone_block", "minecraft:calcite", "minecraft:tuff", "minecraft:deepslate", "minecraft:terracotta", "minecraft:white_terracotta", "minecraft:orange_terracotta", "minecraft:magenta_terracotta", "minecraft:light_blue_terracotta", "minecraft:yellow_terracotta", "minecraft:lime_terracotta", "minecraft:pink_terracotta", "minecraft:gray_terracotta", "minecraft:light_gray_terracotta", "minecraft:cyan_terracotta", "minecraft:purple_terracotta", "minecraft:blue_terracotta", "minecraft:brown_terracotta", "minecraft:green_terracotta", "minecraft:red_terracotta", "minecraft:black_terracotta" ], "can_place_on_ceiling": true, "can_place_on_floor": false, "can_place_on_wall": true, "chance_of_spreading": 0.5, "search_range": 20 } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_coal.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 17, "targets": [ { "state": { "Name": "minecraft:coal_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_coal_buried.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.5, "size": 17, "targets": [ { "state": { "Name": "minecraft:coal_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_copper_small.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 10, "targets": [ { "state": { "Name": "minecraft:copper_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_buried.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 1.0, "size": 8, "targets": [ { "state": { "Name": "minecraft:diamond_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_large.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.7, "size": 12, "targets": [ { "state": { "Name": "minecraft:diamond_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_diamond_small.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.5, "size": 4, "targets": [ { "state": { "Name": "minecraft:diamond_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_gold.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 9, "targets": [ { "state": { "Name": "minecraft:gold_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_gold_buried.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.5, "size": 9, "targets": [ { "state": { "Name": "minecraft:gold_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_iron.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 9, "targets": [ { "state": { "Name": "minecraft:iron_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_iron_small.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 4, "targets": [ { "state": { "Name": "minecraft:iron_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_lapis.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 7, "targets": [ { "state": { "Name": "minecraft:lapis_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_lapis_buried.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 1.0, "size": 7, "targets": [ { "state": { "Name": "minecraft:lapis_ore" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/badlands/ore_redstone.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 8, "targets": [ { "state": { "Name": "minecraft:redstone_ore", "Properties": { "lit": "false" } }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:badlands_ore_replaceables" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/desert/glow_lichen.json ================================================ { "type": "minecraft:multiface_growth", "config": { "block": "minecraft:glow_lichen", "can_be_placed_on": [ "minecraft:stone", "minecraft:andesite", "minecraft:diorite", "minecraft:granite", "minecraft:dripstone_block", "minecraft:calcite", "minecraft:tuff", "minecraft:deepslate", "minecraft:sandstone" ], "can_place_on_ceiling": true, "can_place_on_floor": false, "can_place_on_wall": true, "chance_of_spreading": 0.5, "search_range": 20 } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/desert/ore_sand.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 33, "targets": [ { "state": { "Name": "minecraft:sand" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_desert_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/glow_lichen.json ================================================ { "type": "minecraft:multiface_growth", "config": { "block": "minecraft:glow_lichen", "can_be_placed_on": [ "minecraft:stone", "minecraft:andesite", "minecraft:diorite", "minecraft:granite", "minecraft:dripstone_block", "minecraft:calcite", "minecraft:tuff", "minecraft:deepslate", "minecraft:snow_block", "minecraft:packed_ice", "minecraft:blue_ice" ], "can_place_on_ceiling": true, "can_place_on_floor": false, "can_place_on_wall": true, "chance_of_spreading": 0.5, "search_range": 20 } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_blue_ice.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 64, "targets": [ { "state": { "Name": "minecraft:blue_ice" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_snowy_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_ice.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 64, "targets": [ { "state": { "Name": "minecraft:ice" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_snowy_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_packed_ice.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 64, "targets": [ { "state": { "Name": "minecraft:packed_ice" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_snowy_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_packed_ice_small.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 33, "targets": [ { "state": { "Name": "minecraft:packed_ice" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_snowy_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/ore_powder_snow.json ================================================ { "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, "size": 33, "targets": [ { "state": { "Name": "minecraft:powder_snow" }, "target": { "predicate_type": "minecraft:tag_match", "tag": "gm4_cooler_caves:base_snowy_overworld" } } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/configured_feature/snowy/trees.json ================================================ { "type": "minecraft:random_selector", "config": { "default": "minecraft:spruce_on_snow", "features": [ { "chance": 0.33333334, "feature": "minecraft:pine_on_snow" } ] } } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/glow_lichen.json ================================================ { "feature": "gm4_cooler_caves:badlands/glow_lichen", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:uniform", "max_inclusive": 157, "min_inclusive": 104 } }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 256 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:in_square" }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "max_inclusive": -13 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_coal_lower.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_coal_buried", "placement": [ { "type": "minecraft:count", "count": 20 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 192 }, "min_inclusive": { "absolute": 0 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_coal_upper.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_coal", "placement": [ { "type": "minecraft:count", "count": 30 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "below_top": 0 }, "min_inclusive": { "absolute": 136 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_copper.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_copper_small", "placement": [ { "type": "minecraft:count", "count": 16 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 112 }, "min_inclusive": { "absolute": -16 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_diamond_small", "placement": [ { "type": "minecraft:count", "count": 7 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "above_bottom": 80 }, "min_inclusive": { "above_bottom": -80 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond_buried.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_diamond_buried", "placement": [ { "type": "minecraft:count", "count": 4 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "above_bottom": 80 }, "min_inclusive": { "above_bottom": -80 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_diamond_large.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_diamond_large", "placement": [ { "type": "minecraft:rarity_filter", "chance": 9 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "above_bottom": 80 }, "min_inclusive": { "above_bottom": -80 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_gold.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_gold_buried", "placement": [ { "type": "minecraft:count", "count": 4 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 32 }, "min_inclusive": { "absolute": -64 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_gold_lower.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_gold_buried", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:uniform", "max_inclusive": 1, "min_inclusive": 0 } }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": -48 }, "min_inclusive": { "absolute": -64 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_middle.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_iron", "placement": [ { "type": "minecraft:count", "count": 10 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 56 }, "min_inclusive": { "absolute": -24 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_small.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_iron_small", "placement": [ { "type": "minecraft:count", "count": 10 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 72 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_iron_upper.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_iron", "placement": [ { "type": "minecraft:count", "count": 90 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 384 }, "min_inclusive": { "absolute": 80 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_lapis.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_lapis", "placement": [ { "type": "minecraft:count", "count": 2 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "absolute": 32 }, "min_inclusive": { "absolute": -32 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_lapis_buried.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_lapis_buried", "placement": [ { "type": "minecraft:count", "count": 4 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 64 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_redstone.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_redstone", "placement": [ { "type": "minecraft:count", "count": 4 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 15 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/badlands/ore_redstone_lower.json ================================================ { "feature": "gm4_cooler_caves:badlands/ore_redstone", "placement": [ { "type": "minecraft:count", "count": 8 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:trapezoid", "max_inclusive": { "above_bottom": 32 }, "min_inclusive": { "above_bottom": -32 } } }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "min_inclusive": -384, "max_inclusive": -5 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/desert/glow_lichen.json ================================================ { "feature": "gm4_cooler_caves:desert/glow_lichen", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:uniform", "max_inclusive": 157, "min_inclusive": 104 } }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 256 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:in_square" }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "max_inclusive": -13 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/desert/ore_sand.json ================================================ { "feature": "gm4_cooler_caves:desert/ore_sand", "placement": [ { "type": "minecraft:count", "count": 14 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "below_top": 0 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/glow_lichen.json ================================================ { "feature": "gm4_cooler_caves:snowy/glow_lichen", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:uniform", "max_inclusive": 157, "min_inclusive": 104 } }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 256 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:in_square" }, { "type": "minecraft:surface_relative_threshold_filter", "heightmap": "OCEAN_FLOOR_WG", "max_inclusive": -13 }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_blue_ice_lower.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_blue_ice", "placement": [ { "type": "minecraft:count", "count": 2 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 60 }, "min_inclusive": { "absolute": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_blue_ice_upper.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_blue_ice", "placement": [ { "type": "minecraft:rarity_filter", "chance": 6 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 128 }, "min_inclusive": { "absolute": 64 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_ice_lower.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_ice", "placement": [ { "type": "minecraft:count", "count": 2 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 60 }, "min_inclusive": { "absolute": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_ice_upper.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_ice", "placement": [ { "type": "minecraft:rarity_filter", "chance": 6 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 128 }, "min_inclusive": { "absolute": 64 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_lower.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_packed_ice", "placement": [ { "type": "minecraft:count", "count": 2 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 60 }, "min_inclusive": { "absolute": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_small.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_packed_ice_small", "placement": [ { "type": "minecraft:count", "count": 7 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 160 }, "min_inclusive": { "absolute": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_packed_ice_upper.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_packed_ice", "placement": [ { "type": "minecraft:rarity_filter", "chance": 6 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "absolute": 128 }, "min_inclusive": { "absolute": 64 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/ore_powder_snow.json ================================================ { "feature": "gm4_cooler_caves:snowy/ore_powder_snow", "placement": [ { "type": "minecraft:count", "count": 14 }, { "type": "minecraft:in_square" }, { "type": "minecraft:height_range", "height": { "type": "minecraft:uniform", "max_inclusive": { "below_top": 0 }, "min_inclusive": { "above_bottom": 0 } } }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/patch_berry_rare.json ================================================ { "feature": { "type": "minecraft:simple_block", "config": { "to_place": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:sweet_berry_bush", "Properties": { "age": "3" } } } } }, "placement": [ { "type": "minecraft:rarity_filter", "chance": 38 }, { "type": "minecraft:in_square" }, { "type": "minecraft:heightmap", "heightmap": "WORLD_SURFACE_WG" }, { "type": "minecraft:biome" }, { "type": "minecraft:count", "count": 96 }, { "type": "minecraft:random_offset", "xz_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 7 }, "y_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 3 } }, { "type": "minecraft:block_predicate_filter", "predicate": { "type": "minecraft:all_of", "predicates": [ { "type": "minecraft:matching_blocks", "blocks": "minecraft:air" }, { "type": "minecraft:matching_blocks", "blocks": [ "minecraft:snow_block", "minecraft:powder_snow" ], "offset": [ 0, -1, 0 ] } ] } } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/patch_snow_layer.json ================================================ { "feature": { "type": "minecraft:simple_block", "config": { "to_place": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:snow", "Properties": { "layers": "2" } } } } }, "placement": [ { "type": "minecraft:in_square" }, { "type": "minecraft:heightmap", "heightmap": "WORLD_SURFACE_WG" }, { "type": "minecraft:biome" }, { "type": "minecraft:count", "count": 32 }, { "type": "minecraft:random_offset", "xz_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 7 }, "y_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 3 } }, { "type": "minecraft:block_predicate_filter", "predicate": { "type": "minecraft:matching_blocks", "blocks": "minecraft:air" } } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/trees.json ================================================ { "feature": "gm4_cooler_caves:snowy/trees", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:weighted_list", "distribution": [ { "data": 0, "weight": 9 }, { "data": 1, "weight": 1 } ] } }, { "type": "minecraft:in_square" }, { "type": "minecraft:surface_water_depth_filter", "max_water_depth": 0 }, { "type": "minecraft:heightmap", "heightmap": "OCEAN_FLOOR" }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/gm4_cooler_caves/worldgen/placed_feature/snowy/trees_taiga.json ================================================ { "feature": "gm4_cooler_caves:snowy/trees", "placement": [ { "type": "minecraft:count", "count": { "type": "minecraft:weighted_list", "distribution": [ { "data": 10, "weight": 9 }, { "data": 11, "weight": 1 } ] } }, { "type": "minecraft:in_square" }, { "type": "minecraft:surface_water_depth_filter", "max_water_depth": 0 }, { "type": "minecraft:heightmap", "heightmap": "OCEAN_FLOOR" }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/block/stone_ore_replaceables.json ================================================ { "values": [ "minecraft:blue_ice", "minecraft:packed_ice", "minecraft:sandstone", "minecraft:snow_block" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/ore_coal_upper", "gm4_cooler_caves:badlands/ore_coal_lower", "gm4_cooler_caves:badlands/ore_iron_upper", "gm4_cooler_caves:badlands/ore_iron_middle", "gm4_cooler_caves:badlands/ore_iron_small", "gm4_cooler_caves:badlands/ore_gold", "gm4_cooler_caves:badlands/ore_gold_lower", "gm4_cooler_caves:badlands/ore_redstone", "gm4_cooler_caves:badlands/ore_redstone_lower", "gm4_cooler_caves:badlands/ore_diamond", "gm4_cooler_caves:badlands/ore_diamond_large", "gm4_cooler_caves:badlands/ore_diamond_buried", "gm4_cooler_caves:badlands/ore_lapis", "gm4_cooler_caves:badlands/ore_lapis_buried", "gm4_cooler_caves:badlands/ore_copper" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/desert.json ================================================ { "values": [ "gm4_cooler_caves:desert/ore_sand" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/eroded_badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/ore_coal_upper", "gm4_cooler_caves:badlands/ore_coal_lower", "gm4_cooler_caves:badlands/ore_iron_upper", "gm4_cooler_caves:badlands/ore_iron_middle", "gm4_cooler_caves:badlands/ore_iron_small", "gm4_cooler_caves:badlands/ore_gold", "gm4_cooler_caves:badlands/ore_gold_lower", "gm4_cooler_caves:badlands/ore_redstone", "gm4_cooler_caves:badlands/ore_redstone_lower", "gm4_cooler_caves:badlands/ore_diamond", "gm4_cooler_caves:badlands/ore_diamond_large", "gm4_cooler_caves:badlands/ore_diamond_buried", "gm4_cooler_caves:badlands/ore_lapis", "gm4_cooler_caves:badlands/ore_lapis_buried", "gm4_cooler_caves:badlands/ore_copper" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_peaks.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_river.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/grove.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ice_spikes.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_beach.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_plains.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_slopes.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_taiga.json ================================================ { "values": [ "gm4_cooler_caves:snowy/ore_ice_upper", "gm4_cooler_caves:snowy/ore_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_upper", "gm4_cooler_caves:snowy/ore_packed_ice_lower", "gm4_cooler_caves:snowy/ore_packed_ice_small", "gm4_cooler_caves:snowy/ore_blue_ice_upper", "gm4_cooler_caves:snowy/ore_blue_ice_lower", "gm4_cooler_caves:snowy/ore_powder_snow" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/wooded_badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/ore_coal_upper", "gm4_cooler_caves:badlands/ore_coal_lower", "gm4_cooler_caves:badlands/ore_iron_upper", "gm4_cooler_caves:badlands/ore_iron_middle", "gm4_cooler_caves:badlands/ore_iron_small", "gm4_cooler_caves:badlands/ore_gold", "gm4_cooler_caves:badlands/ore_gold_lower", "gm4_cooler_caves:badlands/ore_redstone", "gm4_cooler_caves:badlands/ore_redstone_lower", "gm4_cooler_caves:badlands/ore_diamond", "gm4_cooler_caves:badlands/ore_diamond_large", "gm4_cooler_caves:badlands/ore_diamond_buried", "gm4_cooler_caves:badlands/ore_lapis", "gm4_cooler_caves:badlands/ore_lapis_buried", "gm4_cooler_caves:badlands/ore_copper" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/glow_lichen" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/desert.json ================================================ { "values": [ "gm4_cooler_caves:desert/glow_lichen" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/eroded_badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/glow_lichen" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_peaks.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_river.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/grove.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ice_spikes.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/trees", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_beach.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_plains.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/trees", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_slopes.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/patch_snow_layer" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_taiga.json ================================================ { "values": [ "gm4_cooler_caves:snowy/glow_lichen", "gm4_cooler_caves:snowy/trees_taiga", "gm4_cooler_caves:snowy/patch_snow_layer", "gm4_cooler_caves:snowy/patch_berry_rare" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/wooded_badlands.json ================================================ { "values": [ "gm4_cooler_caves:badlands/glow_lichen" ] } ================================================ FILE: gm4_cooler_caves/data/minecraft/worldgen/noise_settings/overworld.json ================================================ { "sea_level": 63, "disable_mob_generation": false, "aquifers_enabled": true, "ore_veins_enabled": true, "legacy_random_source": false, "default_block": { "Name": "minecraft:stone" }, "default_fluid": { "Name": "minecraft:water", "Properties": { "level": "0" } }, "noise": { "min_y": -64, "height": 384, "size_horizontal": 1, "size_vertical": 2 }, "noise_router": { "barrier": { "type": "minecraft:noise", "noise": "minecraft:aquifer_barrier", "xz_scale": 1, "y_scale": 0.5 }, "fluid_level_floodedness": { "type": "minecraft:noise", "noise": "minecraft:aquifer_fluid_level_floodedness", "xz_scale": 1, "y_scale": 0.67 }, "fluid_level_spread": { "type": "minecraft:noise", "noise": "minecraft:aquifer_fluid_level_spread", "xz_scale": 1, "y_scale": 0.7142857142857143 }, "lava": { "type": "minecraft:noise", "noise": "minecraft:aquifer_lava", "xz_scale": 1, "y_scale": 1 }, "temperature": { "type": "minecraft:shifted_noise", "noise": "minecraft:temperature", "xz_scale": 0.25, "y_scale": 0, "shift_x": "minecraft:shift_x", "shift_y": 0, "shift_z": "minecraft:shift_z" }, "vegetation": { "type": "minecraft:shifted_noise", "noise": "minecraft:vegetation", "xz_scale": 0.25, "y_scale": 0, "shift_x": "minecraft:shift_x", "shift_y": 0, "shift_z": "minecraft:shift_z" }, "continents": "minecraft:overworld/continents", "erosion": "minecraft:overworld/erosion", "depth": "minecraft:overworld/depth", "ridges": "minecraft:overworld/ridges", "preliminary_surface_level": { "type": "minecraft:find_top_surface", "cell_height": 8, "lower_bound": -64, "upper_bound": 320, "density": { "type": "minecraft:add", "argument1": 0.1171875, "argument2": { "type": "minecraft:mul", "argument1": { "type": "minecraft:y_clamped_gradient", "from_y": -64, "to_y": -40, "from_value": 0, "to_value": 1 }, "argument2": { "type": "minecraft:add", "argument1": -0.1171875, "argument2": { "type": "minecraft:add", "argument1": -0.078125, "argument2": { "type": "minecraft:mul", "argument1": { "type": "minecraft:y_clamped_gradient", "from_y": 240, "to_y": 256, "from_value": 1, "to_value": 0 }, "argument2": { "type": "minecraft:add", "argument1": 0.078125, "argument2": { "type": "minecraft:clamp", "input": { "type": "minecraft:add", "argument1": -0.703125, "argument2": { "type": "minecraft:mul", "argument1": 4, "argument2": { "type": "minecraft:quarter_negative", "argument": { "type": "minecraft:mul", "argument1": "minecraft:overworld/depth", "argument2": { "type": "minecraft:cache_2d", "argument": "minecraft:overworld/factor" } } } } }, "min": -64, "max": 64 } } } } } } } }, "final_density": { "type": "minecraft:min", "argument1": { "type": "minecraft:squeeze", "argument": { "type": "minecraft:mul", "argument1": 0.64, "argument2": { "type": "minecraft:interpolated", "argument": { "type": "minecraft:blend_density", "argument": { "type": "minecraft:add", "argument1": 0.1171875, "argument2": { "type": "minecraft:mul", "argument1": { "type": "minecraft:y_clamped_gradient", "from_y": -64, "to_y": -40, "from_value": 0, "to_value": 1 }, "argument2": { "type": "minecraft:add", "argument1": -0.1171875, "argument2": { "type": "minecraft:add", "argument1": -0.078125, "argument2": { "type": "minecraft:mul", "argument1": { "type": "minecraft:y_clamped_gradient", "from_y": 240, "to_y": 256, "from_value": 1, "to_value": 0 }, "argument2": { "type": "minecraft:add", "argument1": 0.078125, "argument2": { "type": "minecraft:range_choice", "input": "minecraft:overworld/sloped_cheese", "min_inclusive": -1000000, "max_exclusive": 1.5625, "when_in_range": { "type": "minecraft:min", "argument1": "minecraft:overworld/sloped_cheese", "argument2": { "type": "minecraft:mul", "argument1": 5, "argument2": "minecraft:overworld/caves/entrances" } }, "when_out_of_range": { "type": "minecraft:max", "argument1": { "type": "minecraft:min", "argument1": { "type": "minecraft:min", "argument1": { "type": "minecraft:add", "argument1": { "type": "minecraft:mul", "argument1": 4, "argument2": { "type": "minecraft:square", "argument": { "type": "minecraft:noise", "noise": "minecraft:cave_layer", "xz_scale": 1, "y_scale": 8 } } }, "argument2": { "type": "minecraft:add", "argument1": { "type": "minecraft:clamp", "input": { "type": "minecraft:add", "argument1": 0.27, "argument2": { "type": "minecraft:noise", "noise": "minecraft:cave_cheese", "xz_scale": 1, "y_scale": 0.6666666666666666 } }, "min": -1, "max": 1 }, "argument2": { "type": "minecraft:clamp", "input": { "type": "minecraft:add", "argument1": 1.5, "argument2": { "type": "minecraft:mul", "argument1": -0.64, "argument2": "minecraft:overworld/sloped_cheese" } }, "min": 0, "max": 0.5 } } }, "argument2": "minecraft:overworld/caves/entrances" }, "argument2": { "type": "minecraft:add", "argument1": "minecraft:overworld/caves/spaghetti_2d", "argument2": "minecraft:overworld/caves/spaghetti_roughness_function" } }, "argument2": { "type": "minecraft:range_choice", "input": "minecraft:overworld/caves/pillars", "min_inclusive": -1000000, "max_exclusive": 0.03, "when_in_range": -1000000, "when_out_of_range": "minecraft:overworld/caves/pillars" } } } } } } } } } } } } }, "argument2": "minecraft:overworld/caves/noodle" }, "vein_toggle": { "type": "minecraft:interpolated", "argument": { "type": "minecraft:range_choice", "input": "minecraft:y", "min_inclusive": -60, "max_exclusive": 51, "when_in_range": { "type": "minecraft:noise", "noise": "minecraft:ore_veininess", "xz_scale": 1.5, "y_scale": 1.5 }, "when_out_of_range": 0 } }, "vein_ridged": { "type": "minecraft:add", "argument1": -0.07999999821186066, "argument2": { "type": "minecraft:max", "argument1": { "type": "minecraft:abs", "argument": { "type": "minecraft:interpolated", "argument": { "type": "minecraft:range_choice", "input": "minecraft:y", "min_inclusive": -60, "max_exclusive": 51, "when_in_range": { "type": "minecraft:noise", "noise": "minecraft:ore_vein_a", "xz_scale": 4, "y_scale": 4 }, "when_out_of_range": 0 } } }, "argument2": { "type": "minecraft:abs", "argument": { "type": "minecraft:interpolated", "argument": { "type": "minecraft:range_choice", "input": "minecraft:y", "min_inclusive": -60, "max_exclusive": 51, "when_in_range": { "type": "minecraft:noise", "noise": "minecraft:ore_vein_b", "xz_scale": 4, "y_scale": 4 }, "when_out_of_range": 0 } } } } }, "vein_gap": { "type": "minecraft:noise", "noise": "minecraft:ore_gap", "xz_scale": 1, "y_scale": 1 } }, "spawn_target": [ { "temperature": [ -1, 1 ], "humidity": [ -1, 1 ], "continentalness": [ -0.11, 1 ], "erosion": [ -1, 1 ], "weirdness": [ -1, -0.16 ], "depth": 0, "offset": 0 }, { "temperature": [ -1, 1 ], "humidity": [ -1, 1 ], "continentalness": [ -0.11, 1 ], "erosion": [ -1, 1 ], "weirdness": [ 0.16, 1 ], "depth": 0, "offset": 0 } ], "surface_rule": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:vertical_gradient", "random_name": "minecraft:bedrock_floor", "true_at_and_below": { "above_bottom": 0 }, "false_at_and_above": { "above_bottom": 5 } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:bedrock" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:above_preliminary_surface" }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:wooded_badlands" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 97 }, "surface_depth_multiplier": 2, "add_stone_depth": false }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.909, "max_threshold": -0.5454 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:coarse_dirt" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.1818, "max_threshold": 0.1818 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:coarse_dirt" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.5454, "max_threshold": 0.909 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:coarse_dirt" } } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:grass_block", "Properties": { "snowy": "false" } } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:dirt" } } ] } ] } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:swamp" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 62 }, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:not", "invert": { "type": "minecraft:y_above", "anchor": { "absolute": 63 }, "surface_depth_multiplier": 0, "add_stone_depth": false } }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface_swamp", "min_threshold": 0, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:water", "Properties": { "level": "0" } } } } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:mangrove_swamp" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 60 }, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:not", "invert": { "type": "minecraft:y_above", "anchor": { "absolute": 63 }, "surface_depth_multiplier": 0, "add_stone_depth": false } }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface_swamp", "min_threshold": 0, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:water", "Properties": { "level": "0" } } } } } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:badlands", "minecraft:eroded_badlands", "minecraft:wooded_badlands" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 256 }, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:orange_terracotta" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 74 }, "surface_depth_multiplier": 1, "add_stone_depth": true }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.909, "max_threshold": -0.5454 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:terracotta" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.1818, "max_threshold": 0.1818 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:terracotta" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.5454, "max_threshold": 0.909 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:terracotta" } } }, { "type": "minecraft:bandlands" } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": -1, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:red_sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:red_sand" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:not", "invert": { "type": "minecraft:hole" } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:orange_terracotta" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": -6, "surface_depth_multiplier": -1, "add_stone_depth": true }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:white_terracotta" } } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 63 }, "surface_depth_multiplier": -1, "add_stone_depth": true }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:y_above", "anchor": { "absolute": 63 }, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:not", "invert": { "type": "minecraft:y_above", "anchor": { "absolute": 74 }, "surface_depth_multiplier": 1, "add_stone_depth": true } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:orange_terracotta" } } } }, { "type": "minecraft:bandlands" } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": true, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": -6, "surface_depth_multiplier": -1, "add_stone_depth": true }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:white_terracotta" } } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": -1, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_ocean", "minecraft:deep_frozen_ocean" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:hole" }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:air" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:temperature" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:ice" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:water", "Properties": { "level": "0" } } } ] } } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_peaks" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:steep" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:packed_ice", "min_threshold": 0, "max_threshold": 0.2 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:ice", "min_threshold": 0, "max_threshold": 0.025 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:snowy_slopes" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:steep" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:powder_snow", "min_threshold": 0.35, "max_threshold": 0.6 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:powder_snow" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:jagged_peaks" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:steep" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:grove" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:powder_snow", "min_threshold": 0.35, "max_threshold": 0.6 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:powder_snow" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:stony_peaks" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:calcite", "min_threshold": -0.0125, "max_threshold": 0.0125 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:calcite" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:stony_shore" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:gravel", "min_threshold": -0.05, "max_threshold": 0.05 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_hills" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:warm_ocean", "minecraft:beach", "minecraft:snowy_beach" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:sand" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:desert" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:sand" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:dripstone_caves" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } } ] }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_savanna" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.21212121212121213, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.06060606060606061, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:coarse_dirt" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_gravelly_hills" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.24242424242424243, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:grass_block", "Properties": { "snowy": "false" } } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:dirt" } } ] } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:old_growth_pine_taiga", "minecraft:old_growth_spruce_taiga" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.21212121212121213, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:coarse_dirt" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.11515151515151514, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:podzol", "Properties": { "snowy": "false" } } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_river", "minecraft:grove", "minecraft:ice_spikes", "minecraft:snowy_beach", "minecraft:snowy_plains", "minecraft:snowy_slopes", "minecraft:snowy_taiga" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:mangrove_swamp" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:mud" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:mushroom_fields" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:mycelium", "Properties": { "snowy": "false" } } } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:grass_block", "Properties": { "snowy": "false" } } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:dirt" } } ] } ] } ] } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": -6, "surface_depth_multiplier": -1, "add_stone_depth": true }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_ocean", "minecraft:deep_frozen_ocean" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:hole" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:water", "Properties": { "level": "0" } } } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": true, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_peaks" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:steep" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:packed_ice", "min_threshold": -0.5, "max_threshold": 0.2 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:ice", "min_threshold": -0.0625, "max_threshold": 0.025 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:ice" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:snowy_slopes" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:steep" }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:powder_snow", "min_threshold": 0.45, "max_threshold": 0.58 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:powder_snow" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:jagged_peaks" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:grove" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:powder_snow", "min_threshold": 0.45, "max_threshold": 0.58 }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:water", "offset": 0, "surface_depth_multiplier": 0, "add_stone_depth": false }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:powder_snow" } } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } ] } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:stony_peaks" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:calcite", "min_threshold": -0.0125, "max_threshold": 0.0125 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:calcite" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:stony_shore" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:gravel", "min_threshold": -0.05, "max_threshold": 0.05 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_hills" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:warm_ocean", "minecraft:beach", "minecraft:snowy_beach" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:sand" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:desert" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:sand" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:dripstone_caves" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } } ] }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_savanna" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.21212121212121213, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:windswept_gravelly_hills" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.24242424242424243, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": 0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:noise_threshold", "noise": "minecraft:surface", "min_threshold": -0.12121212121212122, "max_threshold": 1.7976931348623157e+308 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:dirt" } } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:mangrove_swamp" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:mud" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_river", "minecraft:ice_spikes", "minecraft:snowy_beach", "minecraft:snowy_plains", "minecraft:snowy_taiga" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:packed_ice" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:dirt" } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:warm_ocean", "minecraft:beach", "minecraft:snowy_beach" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": true, "secondary_depth_range": 6 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:desert" ] }, "then_run": { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": true, "secondary_depth_range": 30 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "floor", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_peaks", "minecraft:jagged_peaks" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:warm_ocean", "minecraft:lukewarm_ocean", "minecraft:deep_lukewarm_ocean" ] }, "then_run": { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:sand" } } ] } }, { "type": "minecraft:sequence", "sequence": [ { "type": "minecraft:condition", "if_true": { "type": "minecraft:stone_depth", "offset": 0, "surface_type": "ceiling", "add_surface_depth": false, "secondary_depth_range": 0 }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:stone" } } }, { "type": "minecraft:block", "result_state": { "Name": "minecraft:gravel" } } ] } ] } } ] } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:vertical_gradient", "random_name": "minecraft:deepslate", "true_at_and_below": { "absolute": 0 }, "false_at_and_above": { "absolute": 8 } }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:deepslate", "Properties": { "axis": "y" } } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:desert" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:sandstone" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:frozen_peaks", "minecraft:frozen_river", "minecraft:grove", "minecraft:ice_spikes", "minecraft:snowy_beach", "minecraft:snowy_plains", "minecraft:snowy_slopes", "minecraft:snowy_taiga" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:snow_block" } } }, { "type": "minecraft:condition", "if_true": { "type": "minecraft:biome", "biome_is": [ "minecraft:badlands", "minecraft:eroded_badlands", "minecraft:wooded_badlands" ] }, "then_run": { "type": "minecraft:block", "result_state": { "Name": "minecraft:terracotta" } } } ] } } ================================================ FILE: gm4_cooler_caves/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.cooler_caves,A custom terrain expansion pack that makes biome specific caves text.gm4.guidebook.cooler_caves.description,The world has modified block compositions.\n\nSome biomes have different blocks compared to normal worlds. text.gm4.guidebook.cooler_caves.desert_and_snow,"In the desert, sandstone and gravel generate instead of stone and gravel.\n\nIn snowy biomes, snow, ice, and white concrete powder can be found in caves." text.gm4.guidebook.cooler_caves.badlands,"Terracotta layers extend throughout the entire underground in badland biomes. Gravel cannot be found, but red sand patches takes their place." ================================================ FILE: gm4_cozy_campfires/README.md ================================================ # Cozy Campfires Campfires now can heal... as well as harm. ### Features - Lit campfires boost health of nearby players by 4 hearts - If a player leaves the range of a campfire, they keep they effect for 12 minutes ================================================ FILE: gm4_cozy_campfires/beet.yaml ================================================ id: gm4_cozy_campfires name: Cozy Campfires version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Allows Campfires to grant you up to 4 extra hearts that last for more than half of a Minecraft day. Perfect for those scary first nights in a Minecraft world. recommended: [] notes: [] modrinth: project_id: BKQjQlSY video: https://www.youtube.com/watch?v=nvAbzAtDFhw wiki: https://wiki.gm4.co/wiki/Cozy_Campfires credits: Creator: - Bloo Icon Design: - BPR ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/advancement/place_campfire.json ================================================ { "criteria": { "place_campfire": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:campfires" } } } ] } } }, "rewards": { "function": "gm4_cozy_campfires:placement/place" } } ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/cozy_campfire.mcfunction ================================================ # @s = gm4_cozy_campfire marker # run from gm4_cozy_campfires:main # kill markers without campfire, and branch to players near lit cozy campfires execute unless block ~ ~ ~ #minecraft:campfires run kill @s execute if block ~ ~ ~ #minecraft:campfires[lit=true] as @a[distance=..3,gamemode=!spectator] at @s run function gm4_cozy_campfires:cozy_player ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/cozy_player.mcfunction ================================================ # @s = player near a campfire # run from gm4_cozy_campfires:cozy_campfire # apply effect effect give @s absorption 720 1 true # particle using RGB particle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~-.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[1.0,0.773,0.208,0.15]} ~-.3 ~.8 ~.3 0 0 0 1 1 ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/init.mcfunction ================================================ scoreboard objectives add gm4_count dummy execute unless score cozy_campfires gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Cozy Campfires"} execute unless score cozy_campfires gm4_earliest_version < cozy_campfires gm4_modules run scoreboard players operation cozy_campfires gm4_earliest_version = cozy_campfires gm4_modules scoreboard players set cozy_campfires gm4_modules 1 schedule function gm4_cozy_campfires:main 10t #$moduleUpdateList ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/main.mcfunction ================================================ # run checks on campfires and apply effect to players execute as @e[type=marker,tag=gm4_campfire] at @s run function gm4_cozy_campfires:cozy_campfire schedule function gm4_cozy_campfires:main 80t ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/placement/place.mcfunction ================================================ # @s = players that have placed any type of campfire # called by advancement gm4_cozy_campfires:place_campfire # revoke advancement advancement revoke @s only gm4_cozy_campfires:place_campfire # start raycast to locate campfire scoreboard players set ray_step gm4_count 0 scoreboard players set success gm4_count 0 execute anchored eyes positioned ^ ^ ^ run function gm4_cozy_campfires:placement/ray ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/function/placement/ray.mcfunction ================================================ # run from placement/place and placement/ray scoreboard players add ray_step gm4_count 1 execute store success score success gm4_count if block ~ ~ ~ #minecraft:campfires unless entity @e[type=marker,tag=gm4_campfire,dx=0] align xyz run summon marker ~0.5 ~0.5 ~0.5 {CustomName:"gm4_campfire",Tags:["gm4_campfire"]} execute if score ray_step gm4_count matches 0..500 if score success gm4_count matches 0 positioned ^ ^ ^0.01 run function gm4_cozy_campfires:placement/ray ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/guidebook/cozy_campfires.json ================================================ { "id": "cozy_campfires", "name": "Cozy Campfires", "module_type": "module", "icon": { "id": "minecraft:campfire" }, "criteria": { "place_campfire": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:campfires" } } } ] } } }, "sections": [ { "name": "absorption", "enable": [], "requirements": [ [ "place_campfire" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.cozy_campfires.description", "fallback": "Standing near a campfire temporarily gives four hearts of absorption.\n\nThese extra hearts last 12 minutes once one leaves the campfire area." } ] ] } ] } ================================================ FILE: gm4_cozy_campfires/data/gm4_cozy_campfires/test/regeneration.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ give @s campfire execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1.5 dummy @s use block ~1 ~ ~1 await entity @s[nbt={active_effects:[{id:"minecraft:absorption",amplifier:1b}]}] ================================================ FILE: gm4_cozy_campfires/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.cozy_campfires,Allows Campfires to grant you up to 4 extra hearts that last for more than half of a Minecraft day. Perfect for those scary first nights in a Minecraft world. text.gm4.guidebook.cozy_campfires.description,Standing near a campfire temporarily gives four hearts of absorption.\n\nThese extra hearts last 12 minutes once one leaves the campfire area. ================================================ FILE: gm4_crossbow_cartridges/README.md ================================================ # Crossbow Cartridges Shoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more Crossbow Cartridges Example ### Features - Hold new projectiles in your offhand to shoot them from your crossbow - Shoot fish buckets, splash potions, tnt, fire charges, torches and string! - Adds two new crossbow advancements ================================================ FILE: gm4_crossbow_cartridges/beet.yaml ================================================ id: gm4_crossbow_cartridges name: Crossbow Cartridges version: 1.9.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: website: description: Shoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more. Synergizes nicely with the Ziprails Module for easy Ziprail construction. recommended: [] notes: [] modrinth: project_id: E7M57BNU smithed: pack_id: gm4_crossbow_cartridges video: https://www.youtube.com/watch?v=XJiGvX7l-pI wiki: https://wiki.gm4.co/wiki/Crossbow_Cartridges credits: Creators: - Denniss - Nik3141 Icon Design: - Sparks model_data: - item: tropical_fish_bucket reference: gui/advancement/crossbow_cartridges_bucket template: advancement - item: tripwire_hook reference: gui/advancement/crossbow_cartridges_string template: advancement ================================================ FILE: gm4_crossbow_cartridges/data/gm4/advancement/crossbow_cartridges_bucket.json ================================================ { "display": { "icon": { "id": "tropical_fish_bucket", "components": { "minecraft:custom_model_data": {"strings":["gm4_crossbow_cartridges:gui/advancement/crossbow_cartridges_bucket"]} } }, "title": { "translate": "advancement.gm4.crossbow_cartridges_fish.title", "fallback": "Sealife Slingshot" }, "description": { "translate": "advancement.gm4.crossbow_cartridges_fish.description", "fallback": "Launch an aquatic animal using a crossbow", "color": "gray" } }, "parent": "gm4:root", "criteria": { "exterior_trigger": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4/advancement/crossbow_cartridges_string.json ================================================ { "display": { "icon": { "id": "minecraft:tripwire_hook", "components": { "minecraft:custom_model_data": {"strings":["gm4_crossbow_cartridges:gui/advancement/crossbow_cartridges_string"]} } }, "title": { "translate": "advancement.gm4.crossbow_cartridges_string.title", "fallback": "Almost a Grappling Hook" }, "description": { "translate": "advancement.gm4.crossbow_cartridges_string.description", "fallback": "Create a 40-block long tripwire circuit using a crossbow", "color": "gray" } }, "parent": "gm4:crossbow_cartridges_bucket", "criteria": { "shoot_fish": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/advancement/shoot_crossbow.json ================================================ { "criteria": { "crossbow_arrow": { "trigger": "minecraft:shot_crossbow", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_crossbow_cartridges:valid_items" } } } } ] } } }, "rewards": { "function": "gm4_crossbow_cartridges:shoot/any_arrow" } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/determine_direction.mcfunction ================================================ # Determine direction of tripwire # @s = player using the crossbow # at tripwire_hook, align xyz positioned ~0.5 ~ ~0.5 # run from cables/shoot_arrow # check if player is facing roughly in one of the cardinal directions, unspool string if this is true execute if entity @s[y_rotation=170..190] rotated 180 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string execute if entity @s[y_rotation=-100..-80] rotated -90 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string execute if entity @s[y_rotation=-10..10] rotated 0 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string execute if entity @s[y_rotation=80..100] rotated 90 0 positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/hook_success.mcfunction ================================================ # Place tripwire hook at end of tripwire # @s = player using the crossbow # at end of tripwire circuit in tripwire_hook, align xyz positioned ~0.5 ~ ~0.5 # run from cables/unspool_string # take tripwire hook playsound minecraft:block.stone.place block @a[distance=..15] clear @s[gamemode=!creative] minecraft:tripwire_hook 1 # reset string count scoreboard players set @s gm4_cb_string 0 # advancement for creating a 40 block long tripwire circuit execute if score @s gm4_cb_tw_length matches 40 run advancement grant @s only gm4:crossbow_cartridges_string ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/place_hook.mcfunction ================================================ # Place tripwire hook at end of tripwire # @s = player using the crossbow # at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5 # run from cables/unspool_string # check direction and place tripwire hook execute if block ~1 ~ ~ minecraft:tripwire[east=true,attached=false] positioned ~-1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~1 ~ ~ minecraft:tripwire_hook[facing=east] destroy execute if block ~-1 ~ ~ minecraft:tripwire[west=true,attached=false] positioned ~1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-1 ~ ~ minecraft:tripwire_hook[facing=west] destroy execute if block ~ ~ ~1 minecraft:tripwire[south=true,attached=false] positioned ~ ~ ~-1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~1 minecraft:tripwire_hook[facing=south] destroy execute if block ~ ~ ~-1 minecraft:tripwire[north=true,attached=false] positioned ~ ~ ~1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-1 minecraft:tripwire_hook[facing=north] destroy execute if block ~ ~ ~ tripwire_hook run function gm4_crossbow_cartridges:cables/hook_success ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/place_tripwire.mcfunction ================================================ # Place tripwire # @s = player using the crossbow # at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5, up to 40 blocks in one of the cardinal directions # run from cables/unspool_string # place tripwire setblock ~ ~ ~ minecraft:tripwire destroy # remove string from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item scoreboard players remove @s[gamemode=!creative] gm4_cb_string 1 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/shoot_arrow.mcfunction ================================================ # Checks to shoot tripwire # @s = player using the crossbow # at arrow, align xyz positioned ~0.5 ~ ~0.5 # run from check_projectile tag @s add gm4_cb_use # store amount of string on the player, with max value of 40 execute store result score @s gm4_cb_string run data get entity @s equipment.offhand.count # check for tripwire hook on the player execute store success score @s gm4_cb_tw_hook run clear @s minecraft:tripwire_hook 0 # reset score for string placed scoreboard players set @s gm4_cb_tw_length 0 # check for tripwire hook in player hitbox execute if block ~ ~ ~ minecraft:tripwire_hook run function gm4_crossbow_cartridges:cables/determine_direction execute unless block ~ ~ ~ minecraft:tripwire_hook positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:tripwire_hook run function gm4_crossbow_cartridges:cables/determine_direction ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/cables/unspool_string.mcfunction ================================================ # Place tripwire, move 1 block forward, repeat # @s = player using the crossbow # at end of tripwire line, align xyz positioned ~0.5 ~ ~0.5, up to 40 blocks in one of the cardinal directions # run from cables/determine_direction and cables/unspool_string # place tripwire execute unless block ~ ~ ~ minecraft:tripwire run function gm4_crossbow_cartridges:cables/place_tripwire particle minecraft:dust{color:[1,1,1],scale:1} ~ ~ ~ .1 .1 .1 1 5 normal scoreboard players add @s gm4_cb_tw_length 1 # kill arrow execute if score @s gm4_cb_tw_length matches 1 run kill @e[tag=gm4_cb_arrow,distance=..2,limit=1,sort=nearest] # place hook if possible execute if score @s gm4_cb_tw_hook matches 1 unless block ^ ^ ^2 #gm4_crossbow_cartridges:string_replaceable positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/place_hook # recursion execute unless score @s gm4_cb_string matches 0 unless score @s gm4_cb_tw_length matches 40.. positioned ^ ^ ^1 if block ~ ~ ~ #gm4_crossbow_cartridges:string_replaceable run function gm4_crossbow_cartridges:cables/unspool_string ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/check_projectile.mcfunction ================================================ # Check item in offhand to shoot # @s = player using the crossbow # at arrow # run from shoot/any_arrow # tripwire execute if entity @s[gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/string,x_rotation=-15..15] align xyz positioned ~0.5 ~ ~0.5 run function gm4_crossbow_cartridges:cables/shoot_arrow # bucket with fish/axolotl execute if entity @s[tag=!gm4_cb_use,predicate=gm4_crossbow_cartridges:items/bucket] run function gm4_crossbow_cartridges:projectile/bucket # torch execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/torch] run function gm4_crossbow_cartridges:projectile/torch execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/redstone_torch] run function gm4_crossbow_cartridges:projectile/redstone_torch execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/soul_torch] run function gm4_crossbow_cartridges:projectile/soul_torch execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/copper_torch] run function gm4_crossbow_cartridges:projectile/copper_torch # potions execute if entity @s[tag=!gm4_cb_use,predicate=gm4_crossbow_cartridges:items/potions] run function gm4_crossbow_cartridges:projectile/potions # fireball execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/fire_charge] run function gm4_crossbow_cartridges:projectile/fireball # wind charge execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/wind_charge] run function gm4_crossbow_cartridges:projectile/wind_charge # tnt execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/tnt] run function gm4_crossbow_cartridges:projectile/tnt # beehive execute if entity @s[tag=!gm4_cb_use,gamemode=!adventure,predicate=gm4_crossbow_cartridges:items/beehive] run function gm4_crossbow_cartridges:projectile/beehive tag @s remove gm4_cb_use data remove storage gm4_crossbow_cartridges:temp projectile ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/init.mcfunction ================================================ scoreboard objectives add gm4_cb_string dummy scoreboard objectives add gm4_cb_tw_hook dummy scoreboard objectives add gm4_cb_tw_length dummy scoreboard objectives add gm4_cb_misc dummy execute unless score crossbow_cartridges gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Crossbow Cartridges"} execute unless score crossbow_cartridges gm4_earliest_version < crossbow_cartridges gm4_modules run scoreboard players operation crossbow_cartridges gm4_earliest_version = crossbow_cartridges gm4_modules scoreboard players set crossbow_cartridges gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/arrow_motion.mcfunction ================================================ # Copy motion, effects, and owner from arrow to projectile # @s = projectile shot from crossbow # at @s # run from functions in projectile/ # copy data from arrow to projectile data modify entity @s Motion set from entity @e[tag=gm4_cb_arrow,distance=..0.1,sort=nearest,limit=1] Motion data modify entity @s {} merge from storage gm4_crossbow_cartridges:temp projectile # remove arrow kill @e[tag=gm4_cb_arrow,distance=..0.1,sort=nearest,limit=1] # remove tag tag @s remove gm4_cb_projectile ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/beehive.mcfunction ================================================ # Shoot beehive # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use data modify storage gm4_crossbow_cartridges:temp bees set from entity @s equipment.offhand.components."minecraft:bees" execute unless data storage gm4_crossbow_cartridges:temp bees run return fail data modify storage gm4_crossbow_cartridges:temp projectile set from storage gm4_crossbow_cartridges:temp bees[0].entity_data data remove storage gm4_crossbow_cartridges:temp bees[0] # replace arrow with bee and copy data summon minecraft:bee ~ ~ ~ {Tags:["gm4_cb_projectile"]} execute as @e[type=minecraft:bee,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # remove bee from beehive execute if entity @s[gamemode=!creative] run function gm4_crossbow_cartridges:projectile/set_bees with storage gm4_crossbow_cartridges:temp data remove storage gm4_crossbow_cartridges:temp bees # bee sting sound playsound minecraft:entity.bee.hurt player @a[distance=..15] ^ ^ ^1 .5 # repeat for multishot execute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/beehive run function gm4_crossbow_cartridges:projectile/beehive ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/axolotl.mcfunction ================================================ # Summon axolotl # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with axolotl and copy data summon minecraft:axolotl ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} # TODO 1.20.5: changed to copy all bucket entity data, check if this causes problems data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" execute as @e[type=minecraft:axolotl,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # axolotl sound playsound minecraft:entity.axolotl.idle_air player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/axolotl ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/cod.mcfunction ================================================ # Summon cod # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with cod and copy data summon minecraft:cod ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" execute as @e[type=minecraft:cod,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.cod.flop player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/cod ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/axolotl.mcfunction ================================================ # Summon axolotl # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with axolotl and copy data summon minecraft:axolotl ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:axolotl,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # axolotl sound playsound minecraft:entity.axolotl.idle_air player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/cod.mcfunction ================================================ # Summon cod # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with cod and copy data summon minecraft:cod ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:cod,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.cod.flop player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/pufferfish.mcfunction ================================================ # Summon pufferfish # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with pufferfish and copy data summon minecraft:pufferfish ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:pufferfish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.puffer_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/salmon.mcfunction ================================================ # Summon salmon # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with salmon and copy data summon minecraft:salmon ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:salmon,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.salmon.flop player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/tadpole.mcfunction ================================================ # Summon tadpole # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with tadpole and copy data summon minecraft:tadpole ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:tadpole,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.tadpole.flop player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/multishot/tropical.mcfunction ================================================ # Summon tropical fish # @s = player using the crossbow # at @s # run from projectile/bucket # replace arrow with tropical fish and copy data summon minecraft:tropical_fish ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:instant_damage',amplifier:10,duration:1}],Silent:1b,DeathLootTable:"gm4:empty"} execute as @e[type=minecraft:tropical_fish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.tropical_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/pufferfish.mcfunction ================================================ # Summon pufferfish # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with pufferfish and copy data summon minecraft:pufferfish ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" execute as @e[type=minecraft:pufferfish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.puffer_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/pufferfish ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/salmon.mcfunction ================================================ # Summon salmon # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with salmon and copy data summon minecraft:salmon ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" data modify storage gm4_crossbow_cartridges:temp projectile.type set from entity @s equipment.offhand.components."minecraft:salmon/size" execute as @e[type=minecraft:salmon,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.salmon.flop player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/salmon ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/tadpole.mcfunction ================================================ # Summon tadpole # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with tadpole and copy data summon minecraft:tadpole ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" execute as @e[type=minecraft:tadpole,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.tadpole.flop player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/tadpole ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket/tropical.mcfunction ================================================ # Summon tropical fish # @s = player using the crossbow # at arrow # run from projectile/bucket # replace arrow with tropical fish and copy data summon minecraft:tropical_fish ~ ~ ~ {FromBucket:1b,Tags:["gm4_cb_projectile"],active_effects:[{id:'minecraft:regeneration',amplifier:10,duration:200,show_particles:0b}]} data modify storage gm4_crossbow_cartridges:temp projectile merge from entity @s equipment.offhand.components."minecraft:bucket_entity_data" execute as @e[type=minecraft:tropical_fish,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # fish flop sound playsound minecraft:entity.tropical_fish.flop player @a[distance=..15] ^ ^ ^1 2 .5 # shoot 2 more if using multishot execute at @e[tag=gm4_cb_arrow,distance=..1,limit=2] run function gm4_crossbow_cartridges:projectile/bucket/multishot/tropical ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/bucket.mcfunction ================================================ # Check fish/axolotl and shoot # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use execute if predicate gm4_crossbow_cartridges:items/cod run function gm4_crossbow_cartridges:projectile/bucket/cod execute if predicate gm4_crossbow_cartridges:items/salmon run function gm4_crossbow_cartridges:projectile/bucket/salmon execute if predicate gm4_crossbow_cartridges:items/pufferfish run function gm4_crossbow_cartridges:projectile/bucket/pufferfish execute if predicate gm4_crossbow_cartridges:items/tropical run function gm4_crossbow_cartridges:projectile/bucket/tropical execute if predicate gm4_crossbow_cartridges:items/axolotl run function gm4_crossbow_cartridges:projectile/bucket/axolotl execute if predicate gm4_crossbow_cartridges:items/tadpole run function gm4_crossbow_cartridges:projectile/bucket/tadpole # replace filled bucket in player's offhand with water bucket item replace entity @s[gamemode=!creative] weapon.offhand with minecraft:water_bucket # give advancement for launching mob in a bucket advancement grant @s only gm4:crossbow_cartridges_bucket ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/check.mcfunction ================================================ # Check blocks, to place or drop copper torch # @s = arrow with tag gm4_cb_ctorch, in a block # at @s # run from projectile/copper_torch/loop # place torch if possible execute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/copper_torch/place # summon torch item if placing torch failed execute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/copper_torch execute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15] # clean up scoreboard players reset $torch_placed gm4_cb_misc kill @s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/loop.mcfunction ================================================ # Check arrow with tag gm4_cb_ctorch # run from projectile/copper_torch # scheduled by projectile/copper_torch/loop execute as @e[tag=gm4_cb_ctorch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/copper_torch/check execute if entity @e[tag=gm4_cb_ctorch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/copper_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch/place.mcfunction ================================================ # Place copper torch on a valid adjacent block # @s = arrow with tag gm4_cb_ctorch, in a block # at @s # run from projectile/copper_torch/check execute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:copper_wall_torch[facing=west] execute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:copper_wall_torch[facing=north] execute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:copper_wall_torch[facing=east] execute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:copper_wall_torch[facing=south] execute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:copper_torch # place block sound execute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1 execute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/copper_torch.mcfunction ================================================ # Shoot copper torch # @s = player using the crossbow # at arrow # run from check_projectile and projectile/copper_torch tag @s add gm4_cb_use # add tag to arrow tag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_ctorch # add fire to arrow data merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_ctorch,distance=..1,sort=nearest,limit=1] {Fire:2000s} tag @e[tag=gm4_cb_arrow,tag=gm4_cb_ctorch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow # clear copper torch from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # repeat execute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/copper_torch] run function gm4_crossbow_cartridges:projectile/copper_torch # start loop to check if arrow is in ground schedule function gm4_crossbow_cartridges:projectile/copper_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/fireball.mcfunction ================================================ # Shoot fire charge # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use data modify storage gm4_crossbow_cartridges:temp projectile.UUID set from entity @s UUID # replace arrow with small_fireball and copy data summon minecraft:small_fireball ~ ~ ~ {Tags:["gm4_cb_projectile","gm4_cb_fireball"]} execute as @e[type=minecraft:small_fireball,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # remove fire charge from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # fire charge sound playsound minecraft:item.firecharge.use player @a[distance=..15] ^ ^ ^1 # repeat for multishot execute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/fire_charge run function gm4_crossbow_cartridges:projectile/fireball # remove floating fireballs schedule function gm4_crossbow_cartridges:projectile/fireball_kill 5s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/fireball_kill.mcfunction ================================================ # Remove floating fireballs # scheduled from projectile/fireball kill @e[type=minecraft:small_fireball,tag=gm4_cb_fireball] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/potions.mcfunction ================================================ # Shoot splash/lingering potion # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use data modify storage gm4_crossbow_cartridges:temp projectile.Item.components set from entity @s equipment.offhand.components data modify storage gm4_crossbow_cartridges:temp projectile.Owner set from entity @s UUID # replace arrow with splash/lingering potion and copy data execute if predicate gm4_crossbow_cartridges:items/splash_potion run summon minecraft:splash_potion ~ ~ ~ {Tags:["gm4_cb_projectile"],Item:{id:"minecraft:splash_potion",count:1,components:{"minecraft:potion_contents":"minecraft:water"}}} execute if predicate gm4_crossbow_cartridges:items/lingering_potion run summon minecraft:lingering_potion ~ ~ ~ {Tags:["gm4_cb_projectile"],Item:{id:"minecraft:lingering_potion",count:1,components:{"minecraft:potion_contents":"minecraft:water"}}} execute as @e[tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # remove potion from player's offhand item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # potion throw sound playsound minecraft:entity.splash_potion.throw player @a[distance=..15] ^ ^ ^1 .5 0 ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/check.mcfunction ================================================ # Check blocks, to place or drop redstone torch # @s = arrow with tag gm4_cb_rtorch, in a block # at @s # run from projectile/redstone_torch/loop # place torch if possible execute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/redstone_torch/place # summon torch item if placing torch failed execute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/redstone_torch execute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15] # clean up scoreboard players reset $torch_placed gm4_cb_misc kill @s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/loop.mcfunction ================================================ # Check arrow with tag gm4_cb_rtorch # run from projectile/redstone_torch # scheduled by projectile/redstone_torch/loop execute as @e[tag=gm4_cb_rtorch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/redstone_torch/check execute if entity @e[tag=gm4_cb_rtorch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/redstone_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch/place.mcfunction ================================================ # Place redstone torch on a valid adjacent block # @s = arrow with tag gm4_cb_rtorch, in a block # at @s # run from projectile/redstone_torch/check execute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:redstone_wall_torch[facing=west] execute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:redstone_wall_torch[facing=north] execute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:redstone_wall_torch[facing=east] execute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:redstone_wall_torch[facing=south] execute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:redstone_torch # place block sound execute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1 execute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/redstone_torch.mcfunction ================================================ # Shoot redstone torch # @s = player using the crossbow # at arrow # run from check_projectile and projectile/redstone_torch tag @s add gm4_cb_use # add tag to arrow tag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_rtorch # add fire to arrow data merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_rtorch,distance=..1,sort=nearest,limit=1] {Fire:2000s} tag @e[tag=gm4_cb_arrow,tag=gm4_cb_rtorch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow # clear redstone torch from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # repeat execute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/redstone_torch] run function gm4_crossbow_cartridges:projectile/redstone_torch # start loop to check if arrow is in ground schedule function gm4_crossbow_cartridges:projectile/redstone_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/set_bees.mcfunction ================================================ $item modify entity @s weapon.offhand {function:"minecraft:set_components",components:{"minecraft:bees":$(bees)}} ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/check.mcfunction ================================================ # Check blocks, to place or drop soul torch # @s = arrow with tag gm4_cb_storch, in a block # at @s # run from projectile/soul_torch/loop # place torch if possible execute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/soul_torch/place # summon torch item if placing torch failed execute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/soul_torch execute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15] # clean up scoreboard players reset $torch_placed gm4_cb_misc kill @s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/loop.mcfunction ================================================ # Check arrow with tag gm4_cb_storch # run from projectile/soul_torch # scheduled by projectile/soul_torch/loop execute as @e[tag=gm4_cb_storch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/soul_torch/check execute if entity @e[tag=gm4_cb_storch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/soul_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch/place.mcfunction ================================================ # Place soul torch on a valid adjacent block # @s = arrow with tag gm4_cb_storch, in a block # at @s # run from projectile/soul_torch/check execute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:soul_wall_torch[facing=west] execute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:soul_wall_torch[facing=north] execute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:soul_wall_torch[facing=east] execute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:soul_wall_torch[facing=south] execute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:soul_torch # place block sound execute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1 execute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/soul_torch.mcfunction ================================================ # Shoot soul torch # @s = player using the crossbow # at arrow # run from check_projectile and projectile/soul_torch tag @s add gm4_cb_use # add tag to arrow tag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_storch # add fire to arrow data merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_storch,distance=..1,sort=nearest,limit=1] {Fire:2000s} tag @e[tag=gm4_cb_arrow,tag=gm4_cb_storch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow # clear soul torch from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # repeat execute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/soul_torch] run function gm4_crossbow_cartridges:projectile/soul_torch # start loop to check if arrow is in ground schedule function gm4_crossbow_cartridges:projectile/soul_torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/tnt.mcfunction ================================================ # Shoot tnt # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use # replace arrow with tnt and copy data summon minecraft:tnt ~ ~ ~ {Tags:["gm4_cb_projectile"],fuse:80s} execute as @e[type=minecraft:tnt,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # remove tnt from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # primed tnt sound playsound minecraft:entity.tnt.primed block @a[distance=..15] ^ ^ ^1 # repeat for multishot execute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/tnt run function gm4_crossbow_cartridges:projectile/tnt ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/check.mcfunction ================================================ # Check blocks, to place or drop torch # @s = arrow with tag gm4_cb_torch, in a block # at @s # run from projectile/torch/loop # place torch if possible execute if block ~ ~ ~ #gm4:replaceable run function gm4_crossbow_cartridges:projectile/torch/place # summon torch item if placing torch failed execute unless score $torch_placed gm4_cb_misc matches 1 run loot spawn ~ ~ ~ loot minecraft:blocks/torch execute unless score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:entity.item.pickup block @a[distance=..15] # clean up scoreboard players reset $torch_placed gm4_cb_misc kill @s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/loop.mcfunction ================================================ # Check arrow with tag gm4_cb_torch # run from projectile/torch # scheduled by projectile/torch/loop execute as @e[tag=gm4_cb_torch,nbt={inGround:1b}] at @s run function gm4_crossbow_cartridges:projectile/torch/check execute if entity @e[tag=gm4_cb_torch,limit=1] run schedule function gm4_crossbow_cartridges:projectile/torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch/place.mcfunction ================================================ # Place torch on a valid adjacent block # @s = arrow with tag gm4_cb_torch, in a block # at @s # run from projectile/torch/check execute positioned ~.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/east run setblock ~-.15 ~ ~ minecraft:wall_torch[facing=west] execute positioned ~ ~ ~.1 if predicate gm4_crossbow_cartridges:check_block/south run setblock ~ ~ ~-.15 minecraft:wall_torch[facing=north] execute positioned ~-.1 ~ ~ if predicate gm4_crossbow_cartridges:check_block/west run setblock ~.15 ~ ~ minecraft:wall_torch[facing=east] execute positioned ~ ~ ~-.1 if predicate gm4_crossbow_cartridges:check_block/north run setblock ~ ~ ~.15 minecraft:wall_torch[facing=south] execute positioned ~ ~-.1 ~ if predicate gm4_crossbow_cartridges:check_block/below run setblock ~ ~.15 ~ minecraft:torch # place block sound execute if block ~ ~ ~ #gm4_crossbow_cartridges:torch run scoreboard players set $torch_placed gm4_cb_misc 1 execute if score $torch_placed gm4_cb_misc matches 1 run playsound minecraft:block.wood.place block @a[distance=..15] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/torch.mcfunction ================================================ # Shoot torch # @s = player using the crossbow # at arrow # run from check_projectile and projectile/torch tag @s add gm4_cb_use # add tag to arrow tag @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] add gm4_cb_torch # add fire to arrow data merge entity @e[tag=gm4_cb_arrow,tag=gm4_cb_torch,distance=..1,sort=nearest,limit=1] {Fire:2000s} tag @e[tag=gm4_cb_arrow,tag=gm4_cb_torch,distance=..1,sort=nearest,limit=1] remove gm4_cb_arrow # clear torch from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # repeat execute if entity @e[tag=gm4_cb_arrow,distance=..1,sort=nearest,limit=1] if entity @s[predicate=gm4_crossbow_cartridges:items/torch] run function gm4_crossbow_cartridges:projectile/torch # start loop to check if arrow is in ground schedule function gm4_crossbow_cartridges:projectile/torch/loop 4t ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/wind_charge.mcfunction ================================================ # Shoot wind charge # @s = player using the crossbow # at arrow # run from check_projectile tag @s add gm4_cb_use data modify storage gm4_crossbow_cartridges:temp projectile.UUID set from entity @s UUID # replace arrow with wind_charge and copy data summon minecraft:wind_charge ~ ~ ~ {Tags:["gm4_cb_projectile","gm4_cb_wind_charge"]} execute as @e[type=minecraft:wind_charge,tag=gm4_cb_projectile,limit=1,distance=..1] run function gm4_crossbow_cartridges:projectile/arrow_motion # remove wind charge from player item modify entity @s[gamemode=!creative] weapon.offhand gm4_crossbow_cartridges:remove_item # wind charge sound playsound minecraft:entity.wind_charge.throw player @a[distance=..15] ^ ^ ^1 # repeat for multishot execute if entity @e[tag=gm4_cb_arrow,limit=1,distance=..1] if predicate gm4_crossbow_cartridges:items/wind_charge run function gm4_crossbow_cartridges:projectile/wind_charge # remove floating wind charges schedule function gm4_crossbow_cartridges:projectile/wind_charge_kill 5s ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/projectile/wind_charge_kill.mcfunction ================================================ # Remove floating wind charges # scheduled from projectile/wind_charge kill @e[type=minecraft:wind_charge,tag=gm4_cb_wind_charge] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/any_arrow.mcfunction ================================================ # @s = player using the crossbow with a normal arrow # at @s # run from advancement shoot_crossbow advancement revoke @s only gm4_crossbow_cartridges:shoot_crossbow execute anchored eyes positioned ^ ^ ^ if entity @e[type=minecraft:spectral_arrow,distance=..0.2,nbt={inGround:0b}] run function gm4_crossbow_cartridges:shoot/spectral # tag arrow, 3 if multishot execute anchored eyes positioned ^ ^ ^ run tag @e[type=minecraft:arrow,nbt={inGround:0b},distance=..0.2,sort=nearest,limit=3] add gm4_cb_arrow # check if arrow was tipped execute anchored eyes positioned ^ ^ ^ run data modify storage gm4_crossbow_cartridges:temp potion_contents set from entity @e[type=minecraft:arrow,tag=gm4_cb_arrow,distance=..0.2,limit=1] item.components."minecraft:potion_contents" execute if data storage gm4_crossbow_cartridges:temp potion_contents run function gm4_crossbow_cartridges:shoot/tipped data remove storage gm4_crossbow_cartridges:temp potion_contents # check offhand item and replace arrow by projectile execute positioned as @e[tag=gm4_cb_arrow,limit=1,distance=..2,sort=nearest] run function gm4_crossbow_cartridges:check_projectile ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/potion_effect.mcfunction ================================================ # @s = player using the crossbow with a tipped arrow # at @s # run from shoot/tipped execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:swiftness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_swiftness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_swiftness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:speed',amplifier:1b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:slowness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:0b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_slowness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:0b,duration:600}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_slowness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:40}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strength"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_strength"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_strength"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:strength',amplifier:1b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:healing"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_health',amplifier:0b,duration:1}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_healing"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_health',amplifier:1b,duration:1}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:harming"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_damage',amplifier:0b,duration:1}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_harming"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:instant_damage',amplifier:1b,duration:1}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:leaping"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_leaping"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_leaping"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:jump_boost',amplifier:1b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:regeneration"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:0b,duration:100}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_regeneration"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:0b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_regeneration"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:regeneration',amplifier:1b,duration:40}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:fire_resistance"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:fire_resistance',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_fire_resistance"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:fire_resistance',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:water_breathing"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:water_breathing',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_water_breathing"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:water_breathing',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:invisibility"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:invisibility',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_invisibility"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:invisibility',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:night_vision"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:night_vision',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_night_vision"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:night_vision',amplifier:0b,duration:1200}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:weakness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weakness',amplifier:0b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_weakness"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weakness',amplifier:0b,duration:600}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:poison"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:0b,duration:100}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_poison"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:0b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_poison"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:poison',amplifier:1b,duration:40}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:slow_falling"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slow_falling',amplifier:0b,duration:220}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_slow_falling"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slow_falling',amplifier:0b,duration:600}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:turtle_master"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:40},{id:'minecraft:resistance',amplifier:2b,duration:40}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:long_turtle_master"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:3b,duration:100},{id:'minecraft:resistance',amplifier:2b,duration:100}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:strong_turtle_master"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:slowness',amplifier:5b,duration:40},{id:'minecraft:resistance',amplifier:3b,duration:40}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:luck"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:luck',amplifier:0b,duration:740}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:wind_charged"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:wind_charged',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:weaving"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:weaving',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:ozzing"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:ozzing',amplifier:0b,duration:440}] execute if data storage gm4_crossbow_cartridges:temp potion_contents{potion:"minecraft:infestation"} run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:infestation',amplifier:0b,duration:440}] ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/spectral.mcfunction ================================================ # @s = player using the crossbow with a spectral arrow # at @s # run from function shoot/any_arrow # store type of glowing execute if predicate gm4_crossbow_cartridges:items/bucket run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set value [{id:'minecraft:glowing',amplifier:0b,duration:200}] execute unless predicate gm4_crossbow_cartridges:items/bucket run data modify storage gm4_crossbow_cartridges:temp projectile.Glowing set value 1 # tag arrow, 3 if multishot tag @e[type=minecraft:spectral_arrow,nbt={inGround:0b},distance=..0.2,sort=nearest,limit=3] add gm4_cb_arrow ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/function/shoot/tipped.mcfunction ================================================ # @s = tipped arrow # at @s # run from function shoot/any_arrow execute if data storage gm4_crossbow_cartridges:temp potion_contents.potion run function gm4_crossbow_cartridges:shoot/potion_effect execute if data storage gm4_crossbow_cartridges:temp potion_contents.custom_effects run data modify storage gm4_crossbow_cartridges:temp projectile.active_effects set from entity @s item.components."minecraft:potion_contents".custom_effects ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/guidebook/crossbow_cartridges.json ================================================ { "id": "crossbow_cartridges", "name": "Crossbow Cartridges", "module_type": "module", "icon": { "id": "minecraft:crossbow" }, "criteria": { "shot_crossbow": { "trigger": "minecraft:shot_crossbow", "conditions": {} } }, "sections": [ { "name": "available_ammo", "enable": [], "requirements": [ [ "shot_crossbow" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.crossbow_cartridges.description", "fallback": "Shooting a crossbow with certain items in the offhand will launch that item instead of the arrow." } ], [ { "translate": "text.gm4.guidebook.crossbow_cartridges.ammo", "fallback": "When held in the offhand, these items can be shot from crossbows:" }, { "text": "\n- " }, { "translate": "block.minecraft.tnt", "hover_event": { "action": "show_item", "id": "minecraft:tnt" } }, { "text": "\n- " }, { "translate": "item.minecraft.fire_charge", "hover_event": { "action": "show_item", "id": "minecraft:fire_charge" } }, { "text": "\n- " }, { "translate": "item.minecraft.wind_charge", "hover_event": { "action": "show_item", "id": "minecraft:wind_charge" } }, { "text": "\n- " }, { "translate": "item.minecraft.potion", "hover_event": { "action": "show_text", "value": [ { "translate": "item.minecraft.splash_potion" }, { "text": "\n" }, { "translate": "item.minecraft.lingering_potion" } ] } }, { "text": "\n- " }, { "translate": "block.minecraft.torch", "hover_event": { "action": "show_text", "value": [ { "translate": "block.minecraft.torch" }, { "text": "\n" }, { "translate": "block.minecraft.soul_torch" }, { "text": "\n" }, { "translate": "block.minecraft.redstone_torch" } ] } }, { "text": "* ", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.crossbow_cartridges.torch", "fallback": "Torch is placed on the block the arrow hits.\nIf the torch cannot be placed here, it is dropped.", "color": "gray" } ] } }, { "text": "\n- " }, { "translate": "item.minecraft.string", "hover_event": { "action": "show_item", "id": "minecraft:string" } }, { "text": "* ", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.crossbow_cartridges.string", "fallback": "Stand in a tripwire hook and look in one of the\ncardinal directions to create a tripwire line.\n\nA tripwire hook can be placed automatically at the end.", "color": "gray" } ] } }, { "text": "(" }, { "translate": "text.gm4.guidebook.crossbow_cartridges.tripwire", "fallback": "Tripwire" }, { "text": ")" }, { "text": "\n- " }, { "translate": "text.gm4.guidebook.crossbow_cartridges.bucket.1", "fallback": "Mob in a Bucket" }, { "text": "* ", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.crossbow_cartridges.bucket.2", "fallback": "The water bucket will be kept", "color": "gray" } ] } } ] ] } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/item_modifier/remove_item.json ================================================ { "function": "minecraft:set_count", "count": -1, "add": true } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/below.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4_crossbow_cartridges:torch_placeable_top" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "top" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "half": "top" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "half": "top", "open": "false" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:grindstone" ], "state": { "face": "floor" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:end_portal_frame" ], "state": { "eye": "true" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:walls" } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:fences" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "up" } } } } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/east.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:full_collision" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "west" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "south", "shape": "inner_right" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "north", "shape": "inner_left" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "facing": "east", "open": "true" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "false" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "true", "facing": "east" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "west" } } } } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/north.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:full_collision" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "south" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "east", "shape": "inner_right" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "west", "shape": "inner_left" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "facing": "north", "open": "true" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "false" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "true", "facing": "north" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "south" } } } } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/south.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:full_collision" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "north" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "west", "shape": "inner_right" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "east", "shape": "inner_left" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "facing": "south", "open": "true" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "false" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "true", "facing": "south" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "north" } } } } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/check_block/west.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:full_collision" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "east" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "north", "shape": "inner_right" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "facing": "south", "shape": "inner_left" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "facing": "west", "open": "true" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "false" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston", "minecraft:sticky_piston" ], "state": { "extended": "true", "facing": "west" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "east" } } } } ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/axolotl.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:axolotl_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/beehive.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:beehive", "minecraft:bee_nest" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/bucket.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:cod_bucket", "minecraft:salmon_bucket", "minecraft:pufferfish_bucket", "minecraft:tropical_fish_bucket", "minecraft:axolotl_bucket", "minecraft:tadpole_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/cod.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:cod_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/copper_torch.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:copper_torch" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/fire_charge.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:fire_charge" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/lingering_potion.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:lingering_potion" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/potions.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:splash_potion", "minecraft:lingering_potion" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/pufferfish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:pufferfish_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/redstone_torch.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:redstone_torch" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/salmon.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:salmon_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/soul_torch.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:soul_torch" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/splash_potion.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:splash_potion" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/string.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:string" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tadpole.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:tadpole_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tnt.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:tnt" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/torch.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:torch" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/tropical.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:tropical_fish_bucket" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/predicate/items/wind_charge.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:wind_charge" ] } } } } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/string_replaceable.json ================================================ { "values": [ "#gm4:replaceable", "minecraft:tripwire" ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/torch.json ================================================ { "values": [ "minecraft:torch", "minecraft:soul_torch", "minecraft:redstone_torch", "minecraft:copper_torch", "minecraft:wall_torch", "minecraft:soul_wall_torch", "minecraft:redstone_wall_torch", "minecraft:copper_wall_torch" ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/block/torch_placeable_top.json ================================================ { "values": [ "#gm4:full_collision", "#minecraft:anvil", "#minecraft:fences", "#minecraft:walls", "minecraft:azalea", "minecraft:flowering_azalea", "minecraft:end_rod", "minecraft:glass_pane", "minecraft:iron_bars", "minecraft:scaffolding", "minecraft:piston", "minecraft:sticky_piston", "minecraft:white_stained_glass_pane", "minecraft:orange_stained_glass_pane", "minecraft:magenta_stained_glass_pane", "minecraft:light_blue_stained_glass_pane", "minecraft:yellow_stained_glass_pane", "minecraft:lime_stained_glass_pane", "minecraft:pink_stained_glass_pane", "minecraft:gray_stained_glass_pane", "minecraft:light_gray_stained_glass_pane", "minecraft:cyan_stained_glass_pane", "minecraft:purple_stained_glass_pane", "minecraft:blue_stained_glass_pane", "minecraft:brown_stained_glass_pane", "minecraft:red_stained_glass_pane", "minecraft:black_stained_glass_pane" ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/item/bucket.json ================================================ { "values": [ "minecraft:cod_bucket", "minecraft:salmon_bucket", "minecraft:pufferfish_bucket", "minecraft:tropical_fish_bucket", "minecraft:axolotl_bucket", "minecraft:tadpole_bucket" ] } ================================================ FILE: gm4_crossbow_cartridges/data/gm4_crossbow_cartridges/tags/item/valid_items.json ================================================ { "values": [ "#gm4_crossbow_cartridges:bucket", "minecraft:string", "minecraft:torch", "minecraft:soul_torch", "minecraft:redstone_torch", "minecraft:copper_torch", "minecraft:splash_potion", "minecraft:lingering_potion", "minecraft:fire_charge", "minecraft:tnt", "minecraft:beehive", "minecraft:bee_nest", "minecraft:wind_charge" ] } ================================================ FILE: gm4_crossbow_cartridges/mod.mcdoc ================================================ use ::java::world::entity::AnyEntity use ::java::world::component::block::Occupant use ::java::world::component::item::PotionContents dispatch minecraft:storage[gm4_crossbow_cartridges:temp] to struct { projectile?: AnyEntity, bees?: [Occupant], potion_contents?: PotionContents } ================================================ FILE: gm4_crossbow_cartridges/translations.csv ================================================ key,en_us advancement.gm4.crossbow_cartridges_fish.title,Sealife Slingshot advancement.gm4.crossbow_cartridges_fish.description,Launch an aquatic animal using a crossbow advancement.gm4.crossbow_cartridges_string.title,Almost a Grappling Hook advancement.gm4.crossbow_cartridges_string.description,Create a 40-block long tripwire circuit using a crossbow text.gm4.guidebook.module_desc.crossbow_cartridges,"Shoot more than just arrows! Crossbow Cartridges allows your crossbow to fire a variety of projectiles; Shoot Pufferfish, Tripwires, Torches, and many more. Synergizes nicely with the Ziprails Module for easy Ziprail construction." text.gm4.guidebook.crossbow_cartridges.description,Shooting a crossbow with certain items in the offhand will launch that item instead of the arrow. text.gm4.guidebook.crossbow_cartridges.ammo,"When held in the offhand, these items can be shot from crossbows:" text.gm4.guidebook.crossbow_cartridges.torch,"Torch is placed on the block the arrow hits.\nIf the torch cannot be placed here, it is dropped." text.gm4.guidebook.crossbow_cartridges.string,Stand in a tripwire hook and look in one of the\ncardinal directions to create a tripwire line.\n\nA tripwire hook can be placed automatically at the end. text.gm4.guidebook.crossbow_cartridges.tripwire,Tripwire text.gm4.guidebook.crossbow_cartridges.bucket.1,Mob in a Bucket text.gm4.guidebook.crossbow_cartridges.bucket.2,The water bucket will be kept ================================================ FILE: gm4_dangerous_dungeons/README.md ================================================ # Dangerous Dungeons A custom terrain expansion pack that adds 10 new dungeon variants to the world. ### Features - Dungeons can spawn in all Overworld biomes - Each dungeon can have a variety of spawners and loot - The quality of loot in dungeons depends on the depth of the dungeon ================================================ FILE: gm4_dangerous_dungeons/beet.yaml ================================================ id: gm4_dangerous_dungeons name: Dangerous Dungeons version: 2.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.pfb_orbis - gm4.plugins.prefabs.module_asset_rename meta: gm4: prefabs: - gm4_orbis website: description: A custom terrain expansion pack that adds new types of dungeons underground. recommended: - gm4_tower_structures - gm4_cooler_caves notes: [] modrinth: project_id: Go9VJGOZ wiki: https://wiki.gm4.co/wiki/Orbis/Dangerous_Dungeons credits: Creator: - Sparks Updated by: - Misode Icon Design: - DuckJr ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/function/init.mcfunction ================================================ execute unless score dangerous_dungeons gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Dangerous Dungeons"} execute unless score dangerous_dungeons gm4_earliest_version < dangerous_dungeons gm4_modules run scoreboard players operation dangerous_dungeons gm4_earliest_version = dangerous_dungeons gm4_modules scoreboard players set dangerous_dungeons gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/guidebook/dangerous_dungeons.json ================================================ { "id": "dangerous_dungeons", "name": "Dangerous Dungeons", "module_type": "module", "icon": { "id": "minecraft:spawner" }, "criteria": { "enter_badlands_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:badlands/upper" } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:badlands/lower" } } } ] } ] } }, "enter_deep_slate_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:deep_slate" } } } ] } }, "enter_desert_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:desert" } } } ] } }, "enter_lush_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:lush" } } } ] } }, "enter_ocean_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:ocean/default" } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:ocean/surface" } } } ] } ] } }, "enter_snowy_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:snowy" } } } ] } }, "enter_stone_dungeon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:stone/default" } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_dangerous_dungeons:stone/ocean" } } } ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "enter_badlands_dungeon", "enter_deep_slate_dungeon", "enter_desert_dungeon", "enter_lush_dungeon", "enter_ocean_dungeon", "enter_snowy_dungeon", "enter_stone_dungeon" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.dangerous_dungeons.description", "fallback": "Extra dungeons can be found in cave systems.\n\nThese dungeons contain rare loot and special spawners." } ], [ { "translate": "text.gm4.guidebook.dangerous_dungeons.locations", "fallback": "Stone and deepslate dungeons can be found in most biomes.\n\nThe Badlands, Desert, Lush, Ocean, and Snowy biomes have special dungeons that match the terrain." } ] ] } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_desert.json ================================================ { "values": [ "minecraft:desert" ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_lush.json ================================================ { "values": [ "minecraft:lush_caves" ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_snowy.json ================================================ { "values": [ "minecraft:snowy_plains", "minecraft:snowy_beach", "minecraft:snowy_slopes", "minecraft:snowy_taiga", "minecraft:frozen_peaks", "minecraft:frozen_river", "minecraft:grove", "minecraft:ice_spikes" ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/tags/worldgen/biome/is_stone_base.json ================================================ { "values": [ "minecraft:mushroom_fields", "minecraft:bamboo_jungle", "minecraft:beach", "minecraft:stony_shore", "minecraft:swamp", "minecraft:mangrove_swamp", "minecraft:windswept_gravelly_hills", "minecraft:windswept_hills", "minecraft:windswept_forest", "minecraft:taiga", "minecraft:plains", "minecraft:meadow", "minecraft:forest", "minecraft:old_growth_spruce_taiga", "minecraft:flower_forest", "minecraft:birch_forest", "minecraft:dark_forest", "minecraft:savanna_plateau", "minecraft:savanna", "minecraft:jungle", "minecraft:jagged_peaks", "minecraft:stony_peaks", "minecraft:river", "minecraft:old_growth_pine_taiga", "minecraft:sunflower_plains", "minecraft:old_growth_birch_forest", "minecraft:sparse_jungle", "minecraft:windswept_savanna", "minecraft:frozen_peaks", "minecraft:pale_garden", "#gm4_dangerous_dungeons:is_snowy", "minecraft:dripstone_caves" ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/badlands/lower.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_badlands", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/badlands", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": 0 }, "max_inclusive": { "absolute": 50 } }, "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/badlands/upper.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_badlands", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/badlands", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -60 }, "max_inclusive": { "absolute": -15 } }, "project_start_to_heightmap": "OCEAN_FLOOR_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/deep_slate.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_overworld", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/deep_slate", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -60 }, "max_inclusive": { "absolute": -7 } }, "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/desert.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_dangerous_dungeons:is_desert", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/desert", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": 0 }, "max_inclusive": { "absolute": 50 } }, "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/lush.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_dangerous_dungeons:is_lush", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/lush", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -60 }, "max_inclusive": { "absolute": 50 } }, "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/ocean/default.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/ocean/default", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -20 }, "max_inclusive": { "absolute": -5 } }, "project_start_to_heightmap": "OCEAN_FLOOR_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/ocean/surface.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/ocean/surface", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "OCEAN_FLOOR_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/snowy.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_dangerous_dungeons:is_snowy", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/snowy", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": 0 }, "max_inclusive": { "absolute": 50 } }, "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/stone/default.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_dangerous_dungeons:is_stone_base", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/stone", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -10 }, "max_inclusive": { "absolute": 50 } }, "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure/stone/ocean.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "underground_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_dangerous_dungeons:dungeon/stone", "size": 7, "start_height": { "type": "minecraft:uniform", "min_inclusive": { "absolute": -50 }, "max_inclusive": { "absolute": -15 } }, "project_start_to_heightmap": "OCEAN_FLOOR_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/dungeons_lower.json ================================================ { "structures": [ { "structure": "gm4_dangerous_dungeons:deep_slate", "weight": 1 }, { "structure": "gm4_dangerous_dungeons:lush", "weight": 4 } ], "placement": { "type": "minecraft:random_spread", "salt": 1115141679, "spacing": 7, "separation": 3 } } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/dungeons_upper.json ================================================ { "structures": [ { "structure": "gm4_dangerous_dungeons:badlands/lower", "weight": 8 }, { "structure": "gm4_dangerous_dungeons:badlands/upper", "weight": 10 }, { "structure": "gm4_dangerous_dungeons:stone/default", "weight": 10 }, { "structure": "gm4_dangerous_dungeons:stone/ocean", "weight": 10 }, { "structure": "gm4_dangerous_dungeons:desert", "weight": 10 }, { "structure": "gm4_dangerous_dungeons:ocean/default", "weight": 8 }, { "structure": "gm4_dangerous_dungeons:snowy", "weight": 12 } ], "placement": { "type": "minecraft:random_spread", "salt": 350397626, "spacing": 6, "separation": 3 } } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/structure_set/ocean_surface.json ================================================ { "structures": [ { "structure": "gm4_dangerous_dungeons:ocean/surface", "weight": 1 } ], "placement": { "type": "minecraft:random_spread", "salt": 1301289086, "spacing": 12, "separation": 3 } } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/badlands.json ================================================ { "name": "gm4_dangerous_dungeons:badlands", "fallback": "minecraft:empty", "elements": [ { "weight": 8, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/badlands/default", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.97 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:terracotta", "probability": 0.25 }, "output_state": { "Name": "minecraft:red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:terracotta", "probability": 0.30 }, "output_state": { "Name": "minecraft:cut_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:terracotta", "probability": 0.35 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:red_sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:red_concrete_powder" }, "output_state": { "Name": "minecraft:red_sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_1/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:red_sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:red_concrete_powder" }, "output_state": { "Name": "minecraft:red_sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_2/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.75 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:red_sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:red_concrete_powder" }, "output_state": { "Name": "minecraft:red_sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:red_sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:red_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:red_concrete_powder" }, "output_state": { "Name": "minecraft:red_sand" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/deep_slate.json ================================================ { "name": "gm4_dangerous_dungeons:dungeon/deep_slate", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:cobweb", "probability": 0.9 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_deepslate_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.125 }, "output_state": { "Name": "minecraft:cobbled_deepslate" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_tiles", "probability": 0.3 }, "output_state": { "Name": "minecraft:cracked_deepslate_tiles" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:cobweb", "probability": 0.9 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_deepslate_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.125 }, "output_state": { "Name": "minecraft:cobbled_deepslate" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_tiles", "probability": 0.3 }, "output_state": { "Name": "minecraft:cracked_deepslate_tiles" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_1/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:cobweb", "probability": 0.9 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_deepslate_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.125 }, "output_state": { "Name": "minecraft:cobbled_deepslate" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_tiles", "probability": 0.3 }, "output_state": { "Name": "minecraft:cracked_deepslate_tiles" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:cobweb", "probability": 0.9 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_deepslate_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_bricks", "probability": 0.125 }, "output_state": { "Name": "minecraft:cobbled_deepslate" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "deepslate_tiles", "probability": 0.3 }, "output_state": { "Name": "minecraft:cracked_deepslate_tiles" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/desert.json ================================================ { "name": "gm4_dangerous_dungeons:desert", "fallback": "minecraft:empty", "elements": [ { "weight": 8, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/desert/default", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.97 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:smooth_sandstone", "probability": 0.30 }, "output_state": { "Name": "minecraft:cut_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:smooth_sandstone", "probability": 0.60 }, "output_state": { "Name": "minecraft:sandstone" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:yellow_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:yellow_concrete_powder" }, "output_state": { "Name": "minecraft:sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_1/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:yellow_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:yellow_concrete_powder" }, "output_state": { "Name": "minecraft:sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_2/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.75 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:yellow_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:yellow_concrete_powder" }, "output_state": { "Name": "minecraft:sand" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/desert/large/base", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:sand" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:sandstone", "probability": 0.333 }, "output_state": { "Name": "minecraft:smooth_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:yellow_concrete_powder", "probability": 0.25 }, "output_state": { "Name": "minecraft:sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:block_match", "block": "minecraft:yellow_concrete_powder" }, "output_state": { "Name": "minecraft:sand" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/lush.json ================================================ { "name": "gm4_dangerous_dungeons:dungeon/lush", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_small/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "stone", "probability": 0.5 }, "output_state": { "Name": "cobblestone" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_1/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "stone", "probability": 0.5 }, "output_state": { "Name": "cobblestone" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_2/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "stone", "probability": 0.5 }, "output_state": { "Name": "cobblestone" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_large/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "stone", "probability": 0.5 }, "output_state": { "Name": "cobblestone" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/ocean/default.json ================================================ { "name": "gm4_dangerous_dungeons:ocean/default", "fallback": "minecraft:empty", "elements": [ { "weight": 9, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/ocean/default", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/ocean/surface.json ================================================ { "name": "gm4_dangerous_dungeons:ocean/surface", "fallback": "minecraft:empty", "elements": [ { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/base", "processors": "minecraft:empty" } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/ocean/small/base", "processors": "minecraft:empty" } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/base", "processors": "minecraft:empty" } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/ocean/large/base", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/snowy.json ================================================ { "name": "gm4_dangerous_dungeons:snowy", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/snowy/default", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.97 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.20 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.20 }, "output_state": { "Name": "minecraft:polished_andesite" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/dungeon/stone.json ================================================ { "name": "gm4_dangerous_dungeons:default", "fallback": "minecraft:empty", "elements": [ { "weight": 8, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/default", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.93 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.30 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.40 }, "output_state": { "Name": "minecraft:mossy_stone_bricks" } } ] } ] } } }, { "weight": 8, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/default2", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobweb", "probability": 0.94 }, "output_state": { "Name": "minecraft:air" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.30 }, "output_state": { "Name": "minecraft:polished_andesite" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.40 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.1875 }, "output_state": { "Name": "minecraft:mossy_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.0833 }, "output_state": { "Name": "minecraft:cobblestone" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/large/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.1875 }, "output_state": { "Name": "minecraft:mossy_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.0833 }, "output_state": { "Name": "minecraft:cobblestone" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/temple/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.1875 }, "output_state": { "Name": "minecraft:mossy_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.0833 }, "output_state": { "Name": "minecraft:cobblestone" } } ] } ] } } }, { "weight": 10, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/base", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.1875 }, "output_state": { "Name": "minecraft:mossy_stone_bricks" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:stone_bricks", "probability": 0.0833 }, "output_state": { "Name": "minecraft:cobblestone" } } ] } ] } } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/large/lower_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/badlands/large/lower_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/lower/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/large/upper_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/badlands/large/upper_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/large/decor/upper/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/medium_1_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/badlands/medium_1_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_1/decor/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/medium_2_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/badlands/medium_2_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/medium_2/decor/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/badlands/tiny_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/badlands/tiny_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/d" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/badlands/tiny/decor/e" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_1/chests.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/large_1/chests", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/chests/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/chests/b", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_1/spawners.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/large_1/spawners", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/spawners/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_1/decor/spawners/b", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_2/liquid.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/large_2/liquid", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/lava_3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/liquid/water", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/large_2/upper.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/large_2/chest_sets", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/b", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/c", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/large_2/decor/upper/d", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/medium_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/medium_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/b", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/c", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/d", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/e", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/f", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/g", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/medium/decor/h", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/small/chest_sets.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/small/chest_sets", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/b", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/c", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/chests/d", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/deep_slate/small/spawner_sets.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/deep_slate/small/spawner_sets", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/a", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/b", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/c", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_dangerous_dungeons:dungeon/deep_slate/small/decor/spawners/d", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/large/lower_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/desert/large/lower_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/lower/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/large/upper_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/desert/large/upper_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/large/decor/upper/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/medium_1_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/desert/medium_1_features", "fallback": "gm4_dangerous_dungeons:subpart/desert/medium_1_features", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_1/decor/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/medium_2_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/desert/medium_2_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/medium_2/decor/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/desert/tiny_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/desert/tiny_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/decor/d" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/desert/tiny/decor/e" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/lush/grid_large_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/lush/grid_large_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/lush/grid_large/decor/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/large_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/ocean/large_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/large/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/large/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/large/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/large/decor/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/medium_1_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/ocean/medium_1_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/d" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_1/decor/e" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/medium_2_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/ocean/medium_2_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/d" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/medium_2/decor/e" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/ocean/small_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/ocean/small_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/small/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/small/decor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/small/decor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/ocean/small/decor/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/large/center_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/large/center_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/center/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/center/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/center/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/center/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/large/corner_features.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/large/corner_features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/large/decor/corner/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_1/long_side.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/medium_1/long_side", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/long/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/long/b" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_1/short_side.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/medium_1/short_side", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_1/decor/short/d" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_2/lower_floor.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/medium_2/lower_floor", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/c" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/d" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/lower_floor/e" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/medium_2/upper_floor.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/medium_2/upper_floor", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/b" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/medium_2/decor/upper_floor/c" } } ] } ================================================ FILE: gm4_dangerous_dungeons/data/gm4_dangerous_dungeons/worldgen/template_pool/subpart/stone/temple_side.json ================================================ { "name": "gm4_dangerous_dungeons:subpart/stone/temple_side", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/temple/decor/a" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_dangerous_dungeons:dungeon/stone/temple/decor/b" } } ] } ================================================ FILE: gm4_dangerous_dungeons/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.dangerous_dungeons,A custom terrain expansion pack that adds new types of dungeons underground. text.gm4.guidebook.dangerous_dungeons.description,Extra dungeons can be found in cave systems.\n\nThese dungeons contain rare loot and special spawners. text.gm4.guidebook.dangerous_dungeons.locations,"Stone and deepslate dungeons can be found in most biomes.\n\nThe Badlands, Desert, Lush, Ocean, and Snowy biomes have special dungeons that match the terrain." ================================================ FILE: gm4_desire_lines/README.md ================================================ # Desire Lines Ever felt like minecraft could do with a bit more immersion? This modular data pack adds a new cool interaction to your survival world in the form of self generating paths! When you walk between two places enough, a desire line will form transforming your grass into coarse dirt all on its own! A natural desire line ### Features - When grass or dirt is stepped on it has a chance of turning into dirt or coarse dirt respectively. - Flowers, grass and other plants will be trampled and break if walked on enough. - Adds two new custom advancements to be obtained by trampling enough blocks. ### Compatability When playing with other Gamemode 4 data packs, adds some bonus features: - Adds the Celaro shamir when used with the [Metallurgy]($dynamicLink:gm4_metallurgy) data pack. - Use the [Boots of Ostara]($dynamicLink:gm4_boots_of_ostara) data pack to spread nature instead of trampling it. ================================================ FILE: gm4_desire_lines/beet.yaml ================================================ id: gm4_desire_lines name: Desire Lines version: 1.7.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [tick] model_data: - item: boots reference: shamir/celaro template: name: shamir metal: aluminium textures_path: gm4_metallurgy:item/shamir/aluminium - item: coarse_dirt reference: gui/advancement/desire_lines_10000 template: advancement - item: oak_planks reference: gui/advancement/desire_lines_8000 template: advancement website: description: Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn! recommended: - gm4_boots_of_ostara notes: [] modrinth: project_id: cx5dX4ug smithed: pack_id: gm4_desire_lines video: https://www.youtube.com/watch?v=wmGaatfekfs wiki: https://wiki.gm4.co/wiki/Desire_Lines credits: Creator: - Sparks Updated by: - Bloo - SpecialBuilder32 - Misode - dvitski Icon Design: - JonPot ================================================ FILE: gm4_desire_lines/data/gm4/advancement/desire_lines_10000.json ================================================ { "display": { "icon": { "id": "coarse_dirt", "components": { "minecraft:custom_model_data": {"strings":["gm4_desire_lines:gui/advancement/desire_lines_10000"]} } }, "title": { "translate": "advancement.gm4.desire_lines.walk_10000.title", "fallback": "That's a Lot of Damage" }, "description": { "translate": "advancement.gm4.desire_lines.walk_10000.description", "fallback": "Ruin 10000 blocks to coarse dirt; how about a little more?", "color": "gray" } }, "parent": "gm4:desire_lines_8000", "criteria": { "ruin_blocks": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_desire_lines/data/gm4/advancement/desire_lines_8000.json ================================================ { "display": { "icon": { "id": "oak_planks", "components": { "minecraft:custom_model_data": {"strings":["gm4_desire_lines:gui/advancement/desire_lines_8000"]} } }, "title": { "translate": "advancement.gm4.desire_lines.walk_8000.title", "fallback": "And I Would Walk 500 Chunks..." }, "description": { "translate": "advancement.gm4.desire_lines.walk_8000.description", "fallback": "Ruin 8000 blocks to coarse dirt; you'll find those oak planks", "color": "gray" } }, "parent": "gm4:root", "criteria": { "ruin_blocks": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/function/active.mcfunction ================================================ # Effects of the Celaro Shamir # @s = player with Celaro on their armor # at unspecified # run from tick # semi-ensure desire lines is disabled ($probability should only be modified NOT SET, as the modification order is load dependent) scoreboard players remove $probability gm4_desire_lines 1000 # secondary celaro effect: invisibility inside foliage execute at @s if predicate gm4_celaro_shamir:stealth_active run effect give @s invisibility 1 0 true ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'celaro'}}] if items entity @s contents #gm4_celaro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium loot spawn ~ ~ ~ loot gm4_celaro_shamir:band ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/function/tick.mcfunction ================================================ execute if predicate gm4_celaro_shamir:shamir_active run function gm4_celaro_shamir:active ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/guidebook/celaro_shamir.json ================================================ { "id": "celaro_shamir", "name": "Celaro Shamir", "module_type": "expansion", "load_check": "desire_lines", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Celaro_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_celaro_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'celaro'}}" } } ] } }, "obtain_celaro_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'celaro'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.celaro_shamir.description", "fallback": "Celaro negates desire lines and causes invisibility when sneaking in shrubbery." } ] ] }, { "name": "shamir_use", "enable": [], "requirements": [ [ "obtain_celaro_shamir", "obtain_celaro_boots" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.celaro_shamir.usage", "fallback": "The Celaro Shamir is found on Aluminium Bands. It can be placed onto boots.\n\nDesire Lines will not activate while wearing these boots." } ], [ { "translate": "text.gm4.guidebook.celaro_shamir.invisibility", "fallback": "Sneaking in double-tall shrubbery (e.g. Tall Grass, Large Fern, Peony) with celaro will grant invisibility." } ] ] } ] } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:aluminium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_desire_lines:shamir/celaro"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'celaro'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.celaro", "fallback": "Celaro Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/predicate/shamir_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "items": "#minecraft:foot_armor", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"celaro\"}}" } } } } } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/predicate/stealth_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true }, "location": { "block": { "blocks": "#gm4_celaro_shamir:tall_plants" } } } } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/tags/block/tall_plants.json ================================================ { "values": [ "minecraft:sunflower", "minecraft:lilac", "minecraft:peony", "minecraft:rose_bush", "minecraft:pitcher_plant", "minecraft:tall_grass", "minecraft:large_fern" ] } ================================================ FILE: gm4_desire_lines/data/gm4_celaro_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:foot_armor" ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/function/init.mcfunction ================================================ scoreboard objectives add gm4_desire_lines dummy scoreboard objectives add gm4_dl_affcoarse dummy # constants scoreboard players set #base_probability gm4_desire_lines 1 scoreboard players set #sneak_penality gm4_desire_lines -5 scoreboard players set #sprint_penalty gm4_desire_lines 1 scoreboard players set #impact_penalty gm4_desire_lines 31 # considerations # walking speed = 4.317 blocks/s ~ 4.63 ticks / block # sprinting speed = 5.612 blocks/s ~ 3.56 ticks / block # walking ~ 1 - (0.99)^4.63 = 0.045 ~ 5% chance to convert each block # sprinting ~ 1 - (0.98)^3.56 = 0.069 ~ 7% chance to convert each block execute unless score desire_lines gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Desire Lines"} execute unless score desire_lines gm4_earliest_version < desire_lines gm4_modules run scoreboard players operation desire_lines gm4_earliest_version = desire_lines gm4_modules scoreboard players set desire_lines gm4_modules 1 schedule function gm4_desire_lines:tick 1t #$moduleUpdateList ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/function/path.mcfunction ================================================ # converts the block the player is stepping on # @s = survival player who initiated a desire lines block conversion # at @s # run from player # check blocks execute positioned ~ ~-0.06 ~ if predicate gm4_desire_lines:can_coarse_dirt run fill ~ ~ ~ ~ ~ ~ coarse_dirt replace dirt fill ~ ~-0.06 ~ ~ ~-0.06 ~ dirt replace grass_block fill ~ ~ ~ ~ ~ ~ air replace snow[layers=1] fill ~ ~ ~ ~ ~ ~ snow[layers=1] replace snow[layers=2] fill ~ ~-0.06 ~ ~ ~-0.06 ~ water replace frosted_ice[age=3] fill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=3] replace frosted_ice[age=2] fill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=2] replace frosted_ice[age=1] fill ~ ~-0.06 ~ ~ ~-0.06 ~ frosted_ice[age=1] replace frosted_ice[age=0] # remove foliage if coarse dirt execute if block ~ ~-0.07 ~ coarse_dirt if block ~ ~ ~ #gm4:foliage unless block ~ ~ ~ moss_carpet run setblock ~ ~ ~ air destroy # advancement check execute if block ~ ~-0.07 ~ coarse_dirt run scoreboard players add @s gm4_dl_affcoarse 1 advancement grant @s[scores={gm4_dl_affcoarse=8000}] only gm4:desire_lines_8000 advancement grant @s[scores={gm4_dl_affcoarse=10000}] only gm4:desire_lines_10000 ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/function/player.mcfunction ================================================ # checks the player's current state to decide whether or not to trigger a block conversion # @s = any survival player # at unspecified # run from tick # terminate if player is not able to create a desire line execute unless predicate gm4_desire_lines:is_affected run return fail # determine trigger probability scoreboard players operation $probability gm4_desire_lines = #base_probability gm4_desire_lines execute if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"flags":{"is_sneaking":true}}} run scoreboard players operation $probability gm4_desire_lines += #sneak_penality gm4_desire_lines execute if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"flags":{"is_sprinting":true}}} run scoreboard players operation $probability gm4_desire_lines += #sprint_penalty gm4_desire_lines execute if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"movement":{"vertical_speed":{"min":2}}}} if predicate gm4_desire_lines:feather_falling_fail run scoreboard players operation $probability gm4_desire_lines += #impact_penalty gm4_desire_lines function #gm4_desire_lines:expansion # | NOTE: if you are writing an expansion, do NOT 'set' $probability, as the order in which expansions are called is arbitrary. # | Instead, modify $probability by addition or subtraction. Do NOT subtract max_int, as that may cause over or underflows. # trigger block conversion execute if predicate {"condition":"minecraft:random_chance","chance":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$probability"},"score":"gm4_desire_lines","scale":0.01}} at @s run function gm4_desire_lines:path ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/function/tick.mcfunction ================================================ execute as @a[gamemode=survival] run function gm4_desire_lines:player schedule function gm4_desire_lines:tick 1t ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/guidebook/desire_lines.json ================================================ { "id": "desire_lines", "name": "Desire Lines", "module_type": "module", "icon": { "id": "minecraft:coarse_dirt" }, "criteria": { "eroded_land": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": "this", "score": "gm4_dl_affcoarse" }, "range": { "min": 1 } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.desire_lines.description", "fallback": "Walking or sprinting over grass and dirt will trample blocks.\n\nGrass blocks will trample into dirt and dirt into coarse dirt." } ] ] }, { "name": "trampling_foliage", "enable": [ { "id": "gm4_boots_of_ostara", "load": -1 }, { "id": "gm4_metallurgy", "load": -1 } ], "requirements": [ [ "eroded_land" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.desire_lines.effects", "fallback": "Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines." } ] ] }, { "name": "trampling_foliage-boots_of_ostara", "enable": [ { "id": "gm4_boots_of_ostara", "load": 1 }, { "id": "gm4_metallurgy", "load": -1 } ], "requirements": [ [ "eroded_land" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara", "fallback": "Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nThe Boots of Ostara can prevent desire lines." } ] ] }, { "name": "trampling_foliage-metallurgy", "enable": [ { "id": "gm4_boots_of_ostara", "load": -1 }, { "id": "gm4_metallurgy", "load": 1 } ], "requirements": [ [ "eroded_land" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.desire_lines.effects_and_celaro", "fallback": "Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nBoots with the Celaro Shamir can prevent desire lines" } ] ] }, { "name": "trampling_foliage-boots_of_ostara-metallurgy", "enable": [ { "id": "gm4_boots_of_ostara", "load": 1 }, { "id": "gm4_metallurgy", "load": 1 } ], "requirements": [ [ "eroded_land" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara_and_celaro", "fallback": "Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nBoots with the Celaro Shamir, or normal Boots of Ostara can prevent desire lines." } ] ] } ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/predicate/can_coarse_dirt.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetX": 1, "predicate": { "block": { "blocks": "#dirt" } } }, { "condition": "minecraft:location_check", "offsetX": -1, "predicate": { "block": { "blocks": "#dirt" } } }, { "condition": "minecraft:location_check", "offsetZ": 1, "predicate": { "block": { "blocks": "#dirt" } } }, { "condition": "minecraft:location_check", "offsetZ": -1, "predicate": { "block": { "blocks": "#dirt" } } } ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/predicate/feather_falling_fail.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:feather_falling" } ] } } } } } }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:feather_falling", "levels": 1 } ] } } } } }, { "condition": "minecraft:random_chance", "chance": 0.7 } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:feather_falling", "levels": 2 } ] } } } } }, { "condition": "minecraft:random_chance", "chance": 0.5 } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:feather_falling", "levels": 3 } ] } } } } }, { "condition": "minecraft:random_chance", "chance": 0.3 } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:feather_falling", "levels": { "min": 4, "max": 255 } } ] } } } } }, { "condition": "minecraft:random_chance", "chance": 0.1 } ] } ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/predicate/is_affected.json ================================================ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival" ] }, "flags": { "is_on_ground": true }, "movement": { "speed": { "min": 0.01 } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "effects": { "minecraft:slow_falling": {} } } } } ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/tags/function/expansion.json ================================================ { "values": [ "gm4_celaro_shamir:tick" ] } ================================================ FILE: gm4_desire_lines/data/gm4_desire_lines/tags/function/load.json ================================================ { "values": [ "gm4_desire_lines:load" ] } ================================================ FILE: gm4_desire_lines/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_celaro_shamir:check_item_validity" ] } ================================================ FILE: gm4_desire_lines/data/gm4_metallurgy/tags/function/summon_band/aluminium.json ================================================ { "values":[ "gm4_celaro_shamir:summon_band" ] } ================================================ FILE: gm4_desire_lines/translations.csv ================================================ key,en_us item.gm4.shamir.celaro,Celaro Shamir advancement.gm4.desire_lines.walk_8000.title,And I Would Walk 500 Chunks... advancement.gm4.desire_lines.walk_8000.description,Ruin 8000 blocks to coarse dirt; you'll find those oak planks advancement.gm4.desire_lines.walk_10000.title,That's a Lot of Damage advancement.gm4.desire_lines.walk_10000.description,Ruin 10000 blocks to coarse dirt; how about a little more? text.gm4.guidebook.module_desc.celaro_shamir,"Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn!" text.gm4.guidebook.celaro_shamir.description,Celaro negates desire lines and causes invisibility when sneaking in shrubbery. text.gm4.guidebook.celaro_shamir.usage,The Celaro Shamir is found on Aluminium Bands. It can be placed onto boots.\n\nDesire Lines will not activate while wearing these boots. text.gm4.guidebook.celaro_shamir.invisibility,"Sneaking in double-tall shrubbery (e.g. Tall Grass, Large Fern, Peony) with celaro will grant invisibility." text.gm4.guidebook.module_desc.desire_lines,"Creates natural looking trodden paths in high traffic areas, but be careful not to ruin your neighbour's lawn!" text.gm4.guidebook.desire_lines.description,Walking or sprinting over grass and dirt will trample blocks.\n\nGrass blocks will trample into dirt and dirt into coarse dirt. text.gm4.guidebook.desire_lines.effects,"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines." text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara,"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nThe Boots of Ostara can prevent desire lines." text.gm4.guidebook.desire_lines.effects_and_celaro,"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nBoots with the Celaro Shamir can prevent desire lines" text.gm4.guidebook.desire_lines.effects_and_boots_of_ostara_and_celaro,"Foliage such as flowers, mushrooms, grass, and snow layers can also be destroyed via desire lines.\n\nBoots with the Celaro Shamir, or normal Boots of Ostara can prevent desire lines." ================================================ FILE: gm4_disassemblers/README.md ================================================ # Disassemblers Break apart tools and armour for their materials. Damaged Iron Leggings are disassembled into 5 Iron Ingots ### Features - Place items inside the disassembler block to get back their materials - Works on leather, iron, gold tiers, shears and flint & steal. - The more damaged an item, the less of the base material is returned - Can be added to mob farms like Zombified Piglin farms to process their dropped tools ### Configuration If you also want to allow diamond armour and tools to be disassembled, run the following command: ``` /scoreboard players set disassemble_diamonds gm4_disassembler 1 ``` ================================================ FILE: gm4_disassemblers/assets/translations.csv ================================================ key,en_us block.gm4.disassembler,Disassembler container.gm4.disassembler,Disassembler advancement.gm4.disassemblers.title,Clever Decrafting advancement.gm4.disassemblers.description,Craft a Disassembler text.gm4.guidebook.module_desc.disassemblers,Break apart gold and iron tools and weapons for materials. Attach this to a mob farm to finally make use of those extra armour sets! text.gm4.guidebook.disassmeblers.description,"Disassmeblers can be crafted in a crafting table.\n\nDisassemblers can take apart metal armour, tools, and weapons and return ingots based on the item's durability." text.gm4.guidebook.disassemblers.crafting,A Disassembler can be crafted in a crafting table: text.gm4.guidebook.disassemblers.usage,Items placed inside a disassembler will be broken into its base ingots.\n\nThe return is based on the percent durability left on the item. ================================================ FILE: gm4_disassemblers/beet.yaml ================================================ id: gm4_disassemblers name: Disassemblers version: 2.6.X data_pack: load: . resource_pack: load: . pipeline: - gm4_disassemblers.generate_disassembly - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 lib_forceload: 1.6.0 schedule_loops: [main] model_data: - item: player_head reference: item/disassembler model: block/disassembler - item: tnt template: legacy_machine_block broadcast: - reference: block/disassembler textures: bottom: block/disassembler_bottom top: block/disassembler_top_out front: block/disassembler_side side: block/disassembler_side - reference: block/disassembler_side textures: bottom: block/disassembler_bottom top: block/disassembler_top front: block/disassembler_side_front side: block/disassembler_side - reference: block/disassembler_down textures: bottom: block/disassembler_bottom_out top: block/disassembler_top front: block/disassembler_side side: block/disassembler_side - item: tnt reference: gui/advancement/disassemblers template: name: advancement forward: block/disassembler gui_fonts: - translation: gui.gm4.disassembler container: dropper texture: gui/container/disassembler website: description: Break apart gold and iron tools and weapons for materials. Attach this to a mob farm to finally make use of those extra armour sets! recommended: - gm4_resource_pack - gm4_standard_crafting - gm4_ender_hoppers - gm4_enchantment_extractors - gm4_forming_press - gm4_block_compressors - gm4_tunnel_bores - gm4_boots_of_ostara - gm4_heart_canisters - gm4_smelteries - gm4_liquid_tanks notes: [] modrinth: project_id: Cg5FQaTk wiki: https://wiki.gm4.co/wiki/Disassemblers credits: Creator: - Sparks Updated by: - Federick90 - BPR - runcows Textures by: - Kyrius Icon Design: - Hozz ================================================ FILE: gm4_disassemblers/data/gm4/advancement/disassemblers.json ================================================ { "display": { "icon": { "id": "tnt", "components": { "minecraft:custom_model_data": {"strings":["gm4_disassemblers:gui/advancement/disassemblers"]} } }, "title": { "translate": "advancement.gm4.disassemblers.title", "fallback": "Clever Decrafting" }, "description": { "translate": "advancement.gm4.disassemblers.description", "fallback": "Craft a Disassembler", "color": "gray" } }, "parent": "gm4:root", "criteria": { "obtain_disassembler": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"disassembler\"}}" } } ] } } } } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/advancement/recipes/disassembler.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_disassemblers:disassembler" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:tnt", "minecraft:stonecutter", "minecraft:obsidian" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_disassemblers:disassembler" ] } } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/check_disassemble_recipe.mcfunction ================================================ # processes each item # @s = force load chunk armor stand (we need the hand) # located at the disassembler block # run from gm4_disassemblers:check_item (#gm4_disassemblers:during_base) # generated loot table execute if score $dropped gm4_disassembler matches 0 store result score $dropped gm4_disassembler run loot replace block ~ ~ ~ container.0 fish gm4_disassemblers:caller ~ ~ ~ mainhand ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/check_item.mcfunction ================================================ # processes each item # @s = force load chunk armor stand (we need the hand) # located at the disassembler block # run from process data modify entity @s equipment.mainhand set from storage gm4_disassemblers:temp Items[0] execute store result score $damage gm4_disassembler run data get storage gm4_disassemblers:temp Items[0].components."minecraft:damage" scoreboard players set $dropped gm4_disassembler 0 function #gm4_disassemblers:before_base execute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:during_base execute if score $dropped gm4_disassembler matches 0 run function #gm4_disassemblers:after_base item replace entity @s weapon.mainhand with minecraft:air ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/init.mcfunction ================================================ scoreboard objectives add gm4_disassembler dummy scoreboard players add disassemble_diamonds gm4_disassembler 0 execute unless score disassemblers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Disassemblers"} execute unless score disassemblers gm4_earliest_version < disassemblers gm4_modules run scoreboard players operation disassemblers gm4_earliest_version = disassemblers gm4_modules scoreboard players set disassemblers gm4_modules 1 schedule function gm4_disassemblers:main 1t #$moduleUpdateList ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/machine/create.mcfunction ================================================ # places the disassembler down # @s = player who placed the disassembler # located at the center of the placed block # run from gm4_disassemblers:machine/verify_place_down # place block depending on rotation execute if score $rotation gm4_machine_data matches 1 run data modify storage gm4_disassemblers:temp placement set value {facing:"down",rotation:[180.0f,0.0f],model:"gm4_disassemblers:block/disassembler_down"} execute if score $rotation gm4_machine_data matches 2 run data modify storage gm4_disassemblers:temp placement set value {facing:"up",rotation:[0.0f,0.0f],model:"gm4_disassemblers:block/disassembler"} execute if score $rotation gm4_machine_data matches 3 run data modify storage gm4_disassemblers:temp placement set value {facing:"south",rotation:[0.0f,0.0f],model:"gm4_disassemblers:block/disassembler_side"} execute if score $rotation gm4_machine_data matches 4 run data modify storage gm4_disassemblers:temp placement set value {facing:"west",rotation:[90.0f,0.0f],model:"gm4_disassemblers:block/disassembler_side"} execute if score $rotation gm4_machine_data matches 5 run data modify storage gm4_disassemblers:temp placement set value {facing:"north",rotation:[180.0f,0.0f],model:"gm4_disassemblers:block/disassembler_side"} execute if score $rotation gm4_machine_data matches 6 run data modify storage gm4_disassemblers:temp placement set value {facing:"east",rotation:[-90.0f,0.0f],model:"gm4_disassemblers:block/disassembler_side"} function gm4_disassemblers:machine/place_rotated with storage gm4_disassemblers:temp placement data remove storage gm4_disassemblers:temp placement # mark block as placed playsound minecraft:block.anvil.place master @a ~ ~ ~ 0.9 0.1 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/machine/destroy.mcfunction ================================================ # destroys the disassembler # @s = disassembler marker # located at @s # run from gm4_disassemblers:machine/verify_destroy # kill legacy armor stand - TODO: remove this when we no longer support the upgrade path execute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_disassembler_stand,limit=1,distance=..0.01] # kill entities related to machine block kill @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:dropper",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle minecraft:block{block_state:"minecraft:tnt"} ~ ~ ~ .1 .25 .1 .05 30 normal @a execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_disassemblers:items/disassembler ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/machine/place_rotated.mcfunction ================================================ # places the disassembler down based on rotation # @s = player who placed the disassembler # located at the center of the placed block # with {facing, rotation, model} # run from gm4_disassemblers:machine/create # place dropper $setblock ~ ~ ~ dropper[facing=$(facing)] data merge block ~ ~ ~ {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.disassembler","fallback":"Disassembler"},[{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.disassembler","fallback":"Disassembler","font":"gm4:half_invert"},{"translate":"container.gm4.disassembler","fallback":"Disassembler","font":"gm4:offscreen"},{"translate":"gui.gm4.disassembler","fallback":"","font":"gm4:container_gui","color":"white"},{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.disassembler","fallback":"Disassembler","font":"gm4:half_invert"},{"translate":"container.gm4.disassembler","fallback":"Disassembler","font":"gm4:default","color":"#404040"}]]}} # summon display and marker entity $summon item_display ~ ~ ~ {\ CustomName:"gm4_disassembler_display",\ Tags:["gm4_no_edit","gm4_disassembler_display","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item:{id:"minecraft:tnt",count:1,components:{"minecraft:custom_model_data":{"strings":["$(model)"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:$(rotation),\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } $summon marker ~ ~ ~ {Tags:["gm4_disassembler","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_disassembler",Rotation:$(rotation)} ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_disassembler] run function gm4_disassemblers:machine/destroy ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"disassembler"} run function gm4_disassemblers:machine/create ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/main.mcfunction ================================================ # process machine execute as @e[type=marker,tag=gm4_disassembler] at @s if block ~ ~ ~ dropper[triggered=false] run function gm4_disassemblers:process schedule function gm4_disassemblers:main 16t ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/process.mcfunction ================================================ # checks for a single item in the dropper # @s = disassembler marker [tag=gm4_disassembler] # located at the dissasembler block # run from main data modify storage gm4_disassemblers:temp Items set from block ~ ~ ~ Items execute if data storage gm4_disassemblers:temp Items[0] unless data storage gm4_disassemblers:temp Items[1] as 344d47-4-4-4-f04ce104d run function gm4_disassemblers:check_item ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/upgrade_paths/2.6/item_display.mcfunction ================================================ # @s = gm4_disassembler_stand armor stand # at center of disassembler # run from upgrade_paths/2.6 summon item_display ~ ~ ~ {\ CustomName:"gm4_disassembler_display",\ Tags:["gm4_no_edit","gm4_disassembler_display","gm4_machine_display","smithed.entity","smithed.strict"],\ item:{id:"minecraft:tnt",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_disassemblers:block/disassembler_down"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } # transfer data, increment entity version number data modify entity @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] item.components."minecraft:custom_model_data" set from entity @s equipment.head.components."minecraft:custom_model_data" data modify entity @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] Rotation set from entity @s Rotation scoreboard players set @e[type=item_display,tag=gm4_disassembler_display,limit=1,distance=..0.01] gm4_entity_version 2 scoreboard players set @e[type=marker,tag=gm4_disassembler,limit=1,distance=..0.01] gm4_entity_version 2 kill @s ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/function/upgrade_paths/2.6.mcfunction ================================================ # @s = player # at @s # run via upgrade paths util execute as @e[type=armor_stand,tag=gm4_disassembler_stand] at @s positioned ~ ~0.4 ~ \ run function gm4_disassemblers:upgrade_paths/2.6/item_display ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/guidebook/disassemblers.json ================================================ { "id": "disassemblers", "name": "Disassemblers", "module_type": "module", "icon": { "id": "minecraft:tnt" }, "criteria": { "obtain_tnt": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:tnt" ] } ] } }, "open_disassembler": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:dropper" ], "nbt": "{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\"},{\"text\":\" \",\"extra\":[{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.disassembler\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.disassembler\",\"fallback\":\"Disassembler\",\"font\":\"gm4:default\",\"color\":\"#404040\"}],\"font\":\"gm4:half_invert\"}]}}" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.disassmeblers.description", "fallback": "Disassmeblers can be crafted in a crafting table.\n\nDisassemblers can take apart metal armour, tools, and weapons and return ingots based on the item's durability." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_tnt" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.disassemblers.crafting", "fallback": "A Disassembler can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_disassemblers:disassembler" } ] ], "prerequisites": [ "description" ] }, { "name": "usage", "enable": [], "requirements": [ [ "open_disassembler" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.disassemblers.usage", "fallback": "Items placed inside a disassembler will be broken into its base ingots.\n\nThe return is based on the percent durability left on the item." } ] ], "grants": [ "description" ] } ] } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/loot_table/items/disassembler.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_disassemblers:item/disassembler"]}, "minecraft:profile": "$disassembler" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'disassembler'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.disassembler", "fallback": "Disassembler", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/recipe/disassembler.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "ITI", "OSO", "CCC" ], "key": { "I": "minecraft:iron_ingot", "T": "minecraft:tnt", "O": "minecraft:obsidian", "S": "minecraft:stonecutter", "C": "minecraft:cobblestone" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_disassemblers:item/disassembler"]}, "minecraft:profile": "$disassembler", "minecraft:custom_data": "{gm4_machines:{id:'disassembler'}}", "minecraft:custom_name": {"translate":"block.gm4.disassembler","fallback":"Disassembler","color":"white","italic":false} } } } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/tags/function/after_base.json ================================================ { "values": [] } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/tags/function/before_base.json ================================================ { "values": [] } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/tags/function/during_base.json ================================================ { "values": [ "gm4_disassemblers:check_disassemble_recipe" ] } ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/test/disassemble.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ loot give @s loot gm4_disassemblers:items/disassembler execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~ ~1 assert block ~1 ~1 ~1 dropper assert entity @e[tag=gm4_disassembler,distance=..3] item replace block ~1 ~1 ~1 container.0 with minecraft:iron_chestplate await items block ~1 ~1 ~1 container.0 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.2 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.3 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.4 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.5 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.6 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.7 minecraft:iron_ingot[count=1] assert items block ~1 ~1 ~1 container.8 minecraft:iron_ingot[count=1] ================================================ FILE: gm4_disassemblers/data/gm4_disassemblers/test/place.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ loot give @s loot gm4_disassemblers:items/disassembler execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~ ~1 assert block ~1 ~1 ~1 dropper assert entity @e[tag=gm4_disassembler,distance=..3] ================================================ FILE: gm4_disassemblers/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_disassemblers:machine/verify_destroy" ] } ================================================ FILE: gm4_disassemblers/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_disassemblers:machine/verify_place_down" ] } ================================================ FILE: gm4_disassemblers/data/minecraft/tags/item/gold_tool_materials.json ================================================ { "values": [ "minecraft:gold_ingot" ] } ================================================ FILE: gm4_disassemblers/data/minecraft/tags/item/iron_tool_materials.json ================================================ { "values": [ "minecraft:iron_ingot" ] } ================================================ FILE: gm4_disassemblers/generate_disassembly.py ================================================ from beet import Context, LootTable from beet.contrib.vanilla import Vanilla import itertools from typing import Any ITEMS = { "copper_spear": 191, "copper_sword": 191, "copper_pickaxe": 191, "copper_axe": 191, "copper_shovel": 191, "copper_hoe": 191, "copper_helmet": 122, "copper_chestplate": 177, "copper_leggings": 166, "copper_boots": 144, "diamond_spear": 1562, "diamond_sword": 1562, "diamond_pickaxe": 1562, "diamond_axe": 1562, "diamond_shovel": 1562, "diamond_hoe": 1562, "diamond_helmet": 364, "diamond_chestplate": 529, "diamond_leggings": 496, "diamond_boots": 430, "iron_spear": 251, "iron_sword": 251, "iron_pickaxe": 251, "iron_axe": 251, "iron_shovel": 251, "iron_hoe": 251, "iron_helmet": 166, "iron_chestplate": 241, "iron_leggings": 226, "iron_boots": 196, "golden_spear": 33, "golden_sword": 33, "golden_pickaxe": 33, "golden_axe": 33, "golden_shovel": 33, "golden_hoe": 33, "golden_helmet": 78, "golden_chestplate": 113, "golden_leggings": 106, "golden_boots": 92, "leather_helmet": 56, "leather_chestplate": 81, "leather_leggings": 76, "leather_boots": 66, "turtle_helmet": 276, "bow": 385, "crossbow": 466, "shears": 239, "fishing_rod": 65, "flint_and_steel": 65, "shield": 336, } def beet_default(ctx: Context): """Creates a loot table for dropping the 9 result items when disassembling an item.""" vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' recipes = vanilla.data.recipes for item, durability in ITEMS.items(): recipe = recipes[f"minecraft:{item}"].data ingredients: list[tuple[str, int]] = [] if recipe["type"] == "minecraft:crafting_shaped": pattern = "".join([ (" " + r if len(r) == 1 else r).ljust(3, " ") for r in recipe["pattern"] ]).rjust(9, " ") ingredient_groups = ["".join(g) for _, g in itertools.groupby(pattern)] ingredients = [ ("minecraft:air" if p[0] == " " else recipe["key"][p[0]], len(p)) for p in ingredient_groups ] else: for ingredient in recipe["ingredients"]: ingredients.append((ingredient, 1)) if len(ingredients) < 9: ingredients.append(("minecraft:air", 9-len(ingredients))) pools: Any = [] for ingredient, count in ingredients: if ingredient == "minecraft:air": pools.append({ "rolls": count, "entries": [{"type": "minecraft:loot_table", "value": "gm4:air"}] }) continue if "wooden_tool_materials" in ingredient: entry: Any = {"type": "minecraft:item", "name": "minecraft:stick"} elif ingredient.startswith("#"): entry: Any = {"type": "minecraft:tag", "name": ingredient[1:], "expand": True} else: entry: Any = {"type": "minecraft:item", "name": ingredient} entry["conditions"] = [{ "condition": "value_check", "value": { "type": "score", "target": { "type": "fixed", "name": "$damage" }, "score": "gm4_disassembler" }, "range": { "min": 0, "max": { "type": "uniform", "min": 0, "max": durability } } }] pools.append({ "rolls": count, "entries": [{ "type": "minecraft:alternatives", "children": [ entry, { "type": "minecraft:loot_table", "value": "gm4:air" } ] }] }) ctx.data[f"{ctx.project_id}:disassembleables/{item}"] = LootTable({ "__comment": "Generated by generate_disassembly.py", "type": "minecraft:generic", "pools": pools }) # base pack caller: dict[str, Any] = { "__comment": "Generated by generate_disassembly.py", "type": "minecraft:fishing", "pools": [{ "rolls": 1, "entries": [{"type":"minecraft:alternatives","children":[]}] }] } for item in ITEMS: caller["pools"][0]["entries"][0]["children"].append({ "type": "minecraft:loot_table", "value": f'gm4_disassemblers:disassembleables/{item}', "conditions": [{ "condition": "match_tool", "predicate": { "items": [f"minecraft:{item}"] } }] }) if item.startswith("diamond_"): caller["pools"][0]["entries"][0]["children"][-1]["conditions"].append({ "condition": "value_check", "range": 1, "value": {"type":"score","target":{"type":"fixed","name":"disassemble_diamonds"},"score":"gm4_disassembler"} }) ctx.data[f"{ctx.project_id}:caller"] = LootTable(caller) ================================================ FILE: gm4_disassemblers/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_disassemblers:temp] to struct { Items?: [ItemStack] } ================================================ FILE: gm4_display_frames/README.md ================================================ # Display Frames Have you ever wanted to add invisible item frames to your survival world without feeling like you're cheating? This data pack will let you splash your item frames with invisibility potions to make them permanently invisible when displaying an item! Display frames in use ### Features - When an invisibility potion is thrown in the vicinity of an item frame, it makes the item frame go invisible when displaying an item. - When an invisible item frame is holding no item it will turn visible but show invisible potion effect particles to indicate that it is still able to turn invisible again. - Adds a new custom advancement for turning an item frame invisible. ================================================ FILE: gm4_display_frames/beet.yaml ================================================ id: gm4_display_frames name: Display Frames version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_potion_tracking meta: gm4: versioning: required: lib_potion_tracking: 1.4.0 schedule_loops: [main] website: description: Splash item frames with invisibilty to make invisible item frames! Great for interior decor! recommended: - gm4_chairs - gm4_better_armour_stands - gm4_holographic_tags notes: [] modrinth: project_id: u59ticCz wiki: https://wiki.gm4.co/wiki/Display_Frames credits: Creators: - BPR - TheEpyonProject Icon Design: - BPR model_data: - item: splash_potion reference: gui/advancement/display_frames template: advancement ================================================ FILE: gm4_display_frames/data/gm4/advancement/display_frames.json ================================================ { "display": { "icon": { "id": "minecraft:splash_potion", "components": { "minecraft:custom_model_data": {"strings":["gm4_display_frames:gui/advancement/display_frames"]}, "minecraft:potion_contents": "minecraft:invisibility" } }, "title": { "translate": "advancement.gm4.display_frames.title", "fallback": "Where Did It Go?" }, "description": { "translate": "advancement.gm4.display_frames.description", "fallback": "Make an item frame invisible with a splash potion of invisibility", "color": "gray" } }, "parent": "gm4:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/frame/invisible/apply_invisibility.mcfunction ================================================ # @s = display frame with a new item # run from frame/invisible/process tag @s add gm4_df_invisible data modify entity @s Invisible set value 1b ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/frame/invisible/clear_invisibility.mcfunction ================================================ # @s = display frame that lost its item # run from frame/invisible/process tag @s remove gm4_df_invisible data modify entity @s Invisible set value 0b ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/frame/invisible/create.mcfunction ================================================ # checks for item frames once the splash potion of invisibility has despawned # @s = potion tracker AEC # run from thrown_potion_tracking/check_splash tag @e[type=item_frame,tag=!smithed.entity,distance=..2] add gm4_df_invis_frame tag @e[type=glow_item_frame,tag=!smithed.entity,distance=..2] add gm4_df_invis_frame scoreboard players set @e[tag=gm4_df_invis_frame,distance=..2] gm4_entity_version 1 advancement grant @a[distance=..4,gamemode=!spectator] only gm4:display_frames ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/frame/invisible/process.mcfunction ================================================ # @s = display frame within 8 blocks of a player # run from main execute if items entity @s contents * run tag @s add gm4_df_has_item execute if entity @s[tag=gm4_df_invisible,tag=!gm4_df_has_item] run function gm4_display_frames:frame/invisible/clear_invisibility execute if entity @s[tag=!gm4_df_invisible,tag=gm4_df_has_item] run function gm4_display_frames:frame/invisible/apply_invisibility execute if entity @s[tag=!gm4_df_invisible,tag=!gm4_df_has_item] at @s run particle minecraft:entity_effect{color:[0.8,0.8,0.8,0.6]} ^ ^ ^.2 0 0 0 0.6 0 tag @s remove gm4_df_has_item ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/init.mcfunction ================================================ scoreboard objectives add gm4_df_time dummy scoreboard objectives add gm4_entity_version dummy execute unless score gm4_display_frames gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Display Frames"} execute unless score gm4_display_frames gm4_earliest_version < gm4_display_frames gm4_modules run scoreboard players operation gm4_display_frames gm4_earliest_version = gm4_display_frames gm4_modules scoreboard players set gm4_display_frames gm4_modules 1 schedule function gm4_display_frames:main 1t #$moduleUpdateList ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/main.mcfunction ================================================ execute as @e[type=item_frame,tag=gm4_df_invis_frame] unless score @s gm4_entity_version = @s gm4_entity_version run scoreboard players set @s gm4_entity_version 1 execute as @e[type=glow_item_frame,tag=gm4_df_invis_frame] unless score @s gm4_entity_version = @s gm4_entity_version run scoreboard players set @s gm4_entity_version 1 execute as @e[type=item_frame,tag=gm4_df_invis_frame] at @s if entity @a[gamemode=!spectator,distance=..8,limit=1] run function gm4_display_frames:frame/invisible/process execute as @e[type=glow_item_frame,tag=gm4_df_invis_frame] at @s if entity @a[gamemode=!spectator,distance=..8,limit=1] run function gm4_display_frames:frame/invisible/process schedule function gm4_display_frames:main 16t ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/potion_tracking/splash_item_frames.mcfunction ================================================ # @s = invisibility potion that landed # run from potion_tracking/verify_landed_potion execute if entity @e[type=item_frame,tag=!smithed.entity,tag=!gm4_df_invis_frame,distance=..2.5,limit=1] run function gm4_display_frames:frame/invisible/create execute if entity @e[type=glow_item_frame,tag=!smithed.entity,tag=!gm4_df_invis_frame,distance=..2.5,limit=1] run function gm4_display_frames:frame/invisible/create ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/potion_tracking/tag_potion.mcfunction ================================================ # @s = any potion entity # run from #gm4_potion_tracking:tag_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{potion:"minecraft:invisibility"}}}}] add gm4_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{potion:"minecraft:long_invisibility"}}}}] add gm4_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{custom_effects:[{id:'minecraft:invisibility'}]}}}}] add gm4_potion ================================================ FILE: gm4_display_frames/data/gm4_display_frames/function/potion_tracking/verify_landed_potion.mcfunction ================================================ # @s = any potion tracker marker that landed # run from #gm4_potion_tracking:potion_landed execute if data storage gm4_potion_tracking:temp entity_data.Item.components{"minecraft:potion_contents":{potion:"minecraft:invisibility"}} run function gm4_display_frames:potion_tracking/splash_item_frames execute if data storage gm4_potion_tracking:temp entity_data.Item.components{"minecraft:potion_contents":{potion:"minecraft:long_invisibility"}} run function gm4_display_frames:potion_tracking/splash_item_frames execute if data storage gm4_potion_tracking:temp entity_data.Item.components{"minecraft:potion_contents":{custom_effects:[{id:'minecraft:invisibility'}]}} run function gm4_display_frames:potion_tracking/splash_item_frames ================================================ FILE: gm4_display_frames/data/gm4_display_frames/guidebook/display_frames.json ================================================ { "id": "display_frames", "name": "Display Frames", "module_type": "module", "icon": { "id": "minecraft:splash_potion", "components": { "minecraft:potion_contents": "minecraft:invisibility" } }, "criteria": { "obtain_invisibility_potion": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:lingering_potion", "minecraft:potion", "minecraft:splash_potion" ], "components": { "minecraft:potion_contents": "minecraft:invisibility" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_invisibility_potion" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.display_frames.description", "fallback": "Splashing item frames and glow item frames with invisibility causes them to become display frames.\n\nDisplay frames become invisible when holding with an item." } ] ] } ] } ================================================ FILE: gm4_display_frames/data/gm4_display_frames/tags/entity_type/potion_tracker.json ================================================ { "values": [ "minecraft:marker", "minecraft:lingering_potion", "minecraft:splash_potion" ] } ================================================ FILE: gm4_display_frames/data/gm4_display_frames/test/splash.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ fill ~2 ~1 ~ ~2 ~1 ~2 gray_concrete give @s item_frame execute at @s run tp @s ~ ~ ~ facing ~2 ~-1.5 ~1 dummy @s use block ~2 ~1 ~1 west give @s minecraft:splash_potion[potion_contents="minecraft:invisibility"] dummy @s use item await delay 5t give @s diamond_pickaxe dummy @s use entity @e[type=item_frame,distance=..3,limit=1] await entity @s[advancements={gm4:display_frames=true}] await entity @e[type=item_frame,distance=..3,nbt={Invisible:1b}] ================================================ FILE: gm4_display_frames/data/gm4_potion_tracking/tags/function/potion_landed.json ================================================ { "values": [ "gm4_display_frames:potion_tracking/verify_landed_potion" ] } ================================================ FILE: gm4_display_frames/data/gm4_potion_tracking/tags/function/tag_potion.json ================================================ { "values": [ "gm4_display_frames:potion_tracking/tag_potion" ] } ================================================ FILE: gm4_display_frames/translations.csv ================================================ key,en_us advancement.gm4.display_frames.title,Where Did It Go? advancement.gm4.display_frames.description,Make an item frame invisible with a splash potion of invisibility text.gm4.guidebook.module_desc.display_frames,Splash item frames with invisibilty to make invisible item frames! Great for interior decor! text.gm4.guidebook.display_frames.description,Splashing item frames and glow item frames with invisibility causes them to become display frames.\n\nDisplay frames become invisible when holding with an item. ================================================ FILE: gm4_double_doors/README.md ================================================ # Double Doors Tired of clicking twice to open a double door? Annoyed by the fact that doors are only two blocks tall? Pressure Plates just don't cut it for closing doors behind you? This data pack **automatically opens adjacent doors**, making double doors fully functional! Additionally, bottom **trapdoors** of matching wood type placed above a door **are opened alongside** the door when it is opened by a player. And maybe best of all, **doors close automatically** behind you! Double Doors Example ### Features - When a player interacts with a door that is part of a double door, both doors are opened/closed automatically! - Open bottom-half trapdoors placed above a door will open/close alongside the door! - Only doors and trapdoors which are of the same type and adjacent show this behavior. - Doors are automatically closed behind the player! - Hold shift or power a door with Redstone to enforce normal 'vanilla' door behavior! ================================================ FILE: gm4_double_doors/beet.yaml ================================================ id: gm4_double_doors name: Double Doors version: 1.4.X data_pack: load: . require: - bolt pipeline: - gm4_double_doors.generate - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [] website: description: Tired of clicking twice to open a double door? Annoyed by the fact that doors are only two blocks tall? This data pack automatically opens adjacent doors, making double doors fully functional! Additionally, bottom trapdoors of matching wood type placed above a door are opened alongside the door when it is opened by a player. recommended: [] notes: [] modrinth: project_id: Vx4zJ1Np smithed: pack_id: gm4_double_doors wiki: https://wiki.gm4.co/wiki/Double_Doors credits: Creator: - Bloo Icon Design: - venomousbirds ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/find.mcfunction ================================================ # Ensures this 1t clock runs unless there are no auto toggle markers remaining # @s = none # at world spawn # scheduled from gm4_double_doors:/door///initialize_auto_toggle_marker functions when an auto toggle marker is spawned # maintain auto toggle markers execute as @e[type=marker,tag=gm4_double_doors_auto_toggle_marker] at @s align xyz run function gm4_double_doors:auto_toggle_marker/maintain # reschedule if an auto toggle marker was found execute if score $found_auto_toggle_marker gm4_double_doors_data matches 1.. run schedule function gm4_double_doors:auto_toggle_marker/find 1t scoreboard players reset $found_auto_toggle_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/maintain.mcfunction ================================================ # manages the lifetime and functionality of auto toggle markers # @s = marker entity with the gm4_double_doors_auto_toggle_marker tag # at @s align xyz # run from gm4_double_doors:auto_toggle_marker/find # decay marker scoreboard players remove @s gm4_double_doors_auto_toggle_liftime 1 # an auto toggle marker has three states stored in the gm4_double_doors_auto_toggle_state scoreboard: 0='waiting_for_player', 1='player_present', 2='player_departed' # depending on the state the marker is handled differently: # - 'waiting_for_player' markers look for the presence of a player every tick, if one is found the state is set to 'player_present' # - 'player_present' markers look for the disappearance if the present player every tick, if so the state is set to 'player_departed' and the lifetime is reduced to 60 ticks # - 'player_departed' markers do not check for players # all states decay at 1 score per tick execute if score @s gm4_double_doors_auto_toggle_state matches ..0 if function gm4_double_doors:auto_toggle_marker/player_present run scoreboard players set @s gm4_double_doors_auto_toggle_state 1 execute if score @s gm4_double_doors_auto_toggle_state matches 1 unless function gm4_double_doors:auto_toggle_marker/player_present run function gm4_double_doors:auto_toggle_marker/player_departed execute if score @s gm4_double_doors_auto_toggle_state matches 2.. if score @s gm4_double_doors_auto_toggle_liftime matches 0 run function gm4_double_doors:auto_toggle_marker/select_material # kill old auto toggle markers execute if score @s gm4_double_doors_auto_toggle_liftime matches ..0 run kill @s # kill auto toggle markers which are not in a door anymore execute unless block ~ ~ ~ #minecraft:doors run kill @s # set flag that an auto toggle marker was found scoreboard players set $found_auto_toggle_marker gm4_double_doors_data 1 ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/player_departed.mcfunction ================================================ # changes the state of an auto toggle marker from player_present to player_departed # @s = marker entity with the gm4_double_doors_auto_toggle_marker tag # at @s align xyz # run from gm4_double_doors:auto_toggle_marker/maintain # update state scoreboard players set @s gm4_double_doors_auto_toggle_state 2 # skip lifetime forwards scoreboard players set @s gm4_double_doors_auto_toggle_liftime 10 ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/player_present.mcfunction ================================================ # test if a player has entered the space previously occupied by the door's collision box # @s = marker entity with the gm4_double_doors_auto_toggle_marker tag # at @s align xyz # run as conditional check from gm4_double_doors:auto_toggle_marker/maintain execute if entity @s[tag=gm4_double_doors_collision_box_east] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~0.8125 ~ ~ if entity @s[dx=0,dy=1,dz=0] run return 1 execute if entity @s[tag=gm4_double_doors_collision_box_north] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~ ~ ~-0.8125 if entity @s[dx=0,dy=1,dz=0] run return 1 execute if entity @s[tag=gm4_double_doors_collision_box_south] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~ ~ ~0.8125 if entity @s[dx=0,dy=1,dz=0] run return 1 execute if entity @s[tag=gm4_double_doors_collision_box_west] as @a[dx=0,dy=1,dz=0,limit=1,gamemode=!spectator] positioned ~-0.8125 ~ ~ if entity @s[dx=0,dy=1,dz=0] run return 1 # no match -> no player has entered the space return fail ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/auto_toggle_marker/select_material.mcfunction ================================================ # selects the material of the toggle marker in question # @s = marker entity with the gm4_double_doors_auto_toggle_marker tag # at @s align xyz # run from gm4_double_doors:auto_toggle_marker/maintain # load target state from marker (this was stored when the door was opened by a player and therefore stores the state the door should be returned to) execute store result score $target_door_state gm4_double_doors_data run scoreboard players get @s gm4_double_doors_auto_toggle_target_state # check if desired target door state was already achieved (this can happen if the door was triggered by redstone or sneak-clicked by the player) # if so, i.e. if a $target_door_state 0 [1] (to be closed [opened]) marker is already in a a closed [open] door or a non-door block, return execute if score $target_door_state gm4_double_doors_data matches 0 unless block ~ ~ ~ #minecraft:doors[open=true] run return 0 execute if score $target_door_state gm4_double_doors_data matches 1 unless block ~ ~ ~ #minecraft:doors[open=false] run return 0 # set flag which marks this toggle action as being executed via an auto toggle marker scoreboard players set $triggered_by_auto_toggle gm4_double_doors_data 1 # select material type to run block actions & sound event for material_name in ctx.meta['door_materials']: execute unless score $toggled_door gm4_double_doors_data matches 1.. if entity @s[tag=f"gm4_double_doors_{material_name}",tag=gm4_double_doors_left] run function f"gm4_double_doors:{material_name}/door/left_hinge/get_facing" execute unless score $toggled_door gm4_double_doors_data matches 1.. if entity @s[tag=f"gm4_double_doors_{material_name}",tag=gm4_double_doors_right] run function f"gm4_double_doors:{material_name}/door/right_hinge/get_facing" execute if score $play_sound gm4_double_doors_data matches 1 if score $target_door_state gm4_double_doors_data matches 0 run playsound ctx.meta['sound_ids'][material_name].close block @a[distance=..16] ~ ~ ~ execute if score $play_sound gm4_double_doors_data matches 1 if score $target_door_state gm4_double_doors_data matches 1 run playsound ctx.meta['sound_ids'][material_name].open block @a[distance=..16] ~ ~ ~ execute if score $play_sound gm4_double_doors_data matches 1 run scoreboard players reset $play_sound gm4_double_doors_data scoreboard players reset $toggled_door gm4_double_doors_data scoreboard players reset $triggered_by_auto_toggle gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/function/init.mcfunction ================================================ execute unless score double_doors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Double Doors"} execute unless score double_doors gm4_earliest_version < double_doors gm4_modules run scoreboard players operation double_doors gm4_earliest_version = double_doors gm4_modules scoreboard players set double_doors gm4_modules 1 scoreboard objectives add gm4_double_doors_data dummy scoreboard objectives add gm4_double_doors_auto_toggle_target_state dummy scoreboard objectives add gm4_double_doors_auto_toggle_liftime dummy scoreboard objectives add gm4_double_doors_auto_toggle_state dummy execute unless score $trap_door_limit gm4_double_doors_data matches 0.. run scoreboard players set $trap_door_limit gm4_double_doors_data 2 #$moduleUpdateList ================================================ FILE: gm4_double_doors/data/gm4_double_doors/guidebook/double_doors.json ================================================ { "id": "double_doors", "name": "Double Doors", "module_type": "module", "icon": { "id": "minecraft:acacia_door" }, "criteria": { "obtain_door": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:doors" } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_door" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.double_doors.description", "fallback": "Placing two doors adjacent to each other will link them together, so they open together.\n\nTrapdoors placed above doors will also act as part of the door, opening when the doors open." } ] ] } ] } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/advancement/use_left_hinge_door.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:default_block_use", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": false } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:{{ material_name }}_door" ], "state": { "powered": "false", "hinge": "left" } } } } ] } } }, "rewards": { "function": "gm4_double_doors:{{ material_name }}/door/left_hinge/use" } } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/advancement/use_right_hinge_door.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:default_block_use", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": false } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:{{ material_name }}_door" ], "state": { "powered": "false", "hinge": "right" } } } } ] } } }, "rewards": { "function": "gm4_double_doors:{{ material_name }}/door/right_hinge/use" } } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle # check for potential neighbouring doors which should also be opened execute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle execute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_west execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_north # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_left tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/east/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/east/left/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/east/left/open ~ ~ ~ # get target trapdoor state (0->1, 1->0 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/get_facing.mcfunction ================================================ # Checks the facing block state of the door which was clicked. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_lower_half execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/find_neighbors ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/get_lower_half.mcfunction ================================================ # Forces the block selected by the raycast to be the lower half of a door # @s = player that interacted with a door # at location of the door the player has interacted with # run from gm4_double_doors:{{material_name}}/door/left_hinge/ray scoreboard players set $found gm4_double_doors_data 1 # store whether the player opened a door (=1) or closed a door (=0) scoreboard players set $target_door_state gm4_double_doors_data 0 execute if block ~ ~ ~ minecraft:{{ material_name }}_door[open=true] run scoreboard players set $target_door_state gm4_double_doors_data 1 # if the targeted block is an upper half, get the lower half and reposition execution location # also ensure that the door is not broken (aka actually has both blocks present) execute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=upper] positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing execute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] if block ~ ~1 ~ minecraft:{{ material_name }}_door[half=upper] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle # check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge execute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle execute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_south execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_west # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_left tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/north/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/north/left/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/north/left/open ~ ~ ~ # get target trapdoor state (0->0, 1->1 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/ray.mcfunction ================================================ # ray cast to find door # @s = player that interacted with a door # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_double_doors:{{ material_name }}/door/left_hinge/use or self # check block scoreboard players set $found gm4_double_doors_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left] run function gm4_double_doors:{{ material_name }}/door/left_hinge/get_lower_half # runs the loop again scoreboard players remove $ray gm4_double_doors_data 1 execute unless score $found gm4_double_doors_data matches 1 if score $ray gm4_double_doors_data matches 1.. positioned ^ ^ ^0.1 run function gm4_double_doors:{{ material_name }}/door/left_hinge/ray ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle # check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge execute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle execute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_north execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_east # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_left tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/south/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/south/left/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/south/left/open ~ ~ ~ # get target trapdoor state (0->0, 1->1 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/use.mcfunction ================================================ # Raycasts to the door that was clicked by the player. # @s = a player who has clicked a door and is not sneaking # at @s of the player # run from advancement gm4_double_doors:{{ material_name }}/use_left_hinge_door # revoke advancement advancement revoke @s only gm4_double_doors:{{ material_name }}/use_left_hinge_door # raycast scoreboard players set $ray gm4_double_doors_data 50 scoreboard players set $found gm4_double_doors_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_double_doors:{{ material_name }}/door/left_hinge/ray ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/left_hinge/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle # check for potential neighbouring doors which should also be opened, this neighbor has to be of the opposite hinge execute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle execute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right,facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_east execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_south # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_left tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/left_hinge/west/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from check_neighbours functions in gm4_double_doors:{{ material_name }}/door/left_hinge/.../find_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/west/left/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/west/left/open ~ ~ ~ # get target trapdoor state (0->1, 1->0 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/right_hinge/east/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/right_hinge/east/toggle # check for potential neighbouring doors which should also be opened execute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle execute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_west execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_south # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_right tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/east/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/east/right/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/east/right/open ~ ~ ~ # get target trapdoor state (0->1, 1->0 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/get_facing.mcfunction ================================================ # Checks the facing block state of the door which was clicked. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/right_hinge/get_lower_half execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=east] run function gm4_double_doors:{{ material_name }}/door/right_hinge/east/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=north] run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=south] run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/find_neighbors execute if block ~ ~ ~ minecraft:{{ material_name }}_door[facing=west] run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/find_neighbors ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/get_lower_half.mcfunction ================================================ # Forces the block selected by the raycast to be the lower half of a door # @s = player that interacted with a door # at location of the door the player has interacted with # run from gm4_double_doors:{{material_name}}/door/right_hinge/ray scoreboard players set $found gm4_double_doors_data 1 # store whether the player opened a door (=1) or closed a door (=0) scoreboard players set $target_door_state gm4_double_doors_data 0 execute if block ~ ~ ~ minecraft:{{ material_name }}_door[open=true] run scoreboard players set $target_door_state gm4_double_doors_data 1 # if the targeted block is an upper half, get the lower half and reposition execution location # also ensure that the door is not broken (aka actually has both blocks present) execute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=upper] positioned ~ ~-1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_facing execute if block ~ ~ ~ minecraft:{{ material_name }}_door[half=lower] if block ~ ~1 ~ minecraft:{{ material_name }}_door[half=upper] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_facing ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/right_hinge/north/get_facing # open this door function gm4_double_doors:{{ material_name }}/door/right_hinge/north/toggle # check for potential neighbouring doors which should also be opened execute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle execute positioned ~ ~ ~-1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_south execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_east # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_right tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/north/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/north/right/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/north/right/open ~ ~ ~ # get target trapdoor state (0->0, 1->1 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/north/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/ray.mcfunction ================================================ # ray cast to find door # @s = player that interacted with a door # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_double_doors:{{ material_name }}/door/right_hinge/use or self # check block scoreboard players set $found gm4_double_doors_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=right] run function gm4_double_doors:{{ material_name }}/door/right_hinge/get_lower_half # runs the loop again scoreboard players remove $ray gm4_double_doors_data 1 execute unless score $found gm4_double_doors_data matches 1 if score $ray gm4_double_doors_data matches 1.. positioned ^ ^ ^0.1 run function gm4_double_doors:{{ material_name }}/door/right_hinge/ray ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/find_neighbors.mcfunction ================================================ # Checks for neighboring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/right_hinge/south/get_hinge # open this door function gm4_double_doors:{{ material_name }}/door/right_hinge/south/toggle # check for potential neighbouring doors which should also be opened execute positioned ~1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=south] run function gm4_double_doors:{{ material_name }}/door/left_hinge/south/toggle execute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=north] run function gm4_double_doors:{{ material_name }}/door/left_hinge/north/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_north execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_west # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_right tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/south/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/south/right/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/south/right/open ~ ~ ~ # get target trapdoor state (0->0, 1->1 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 1 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/south/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/use.mcfunction ================================================ # Raycasts to the door that was clicked by the player. # @s = a player who has clicked a door and is not sneaking # at @s of the player # run from advancement gm4_double_doors:{{ material_name }}/use_right_hinge_door # revoke advancement advancement revoke @s only gm4_double_doors:{{ material_name }}/use_right_hinge_door # raycast scoreboard players set $ray gm4_double_doors_data 50 scoreboard players set $found gm4_double_doors_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_double_doors:{{ material_name }}/door/right_hinge/ray ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/find_neighbors.mcfunction ================================================ # Checks for neighbouring doors which may also have to be opened alongside this door. # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/right_hinge/west/get_hinge # open this door function gm4_double_doors:{{ material_name }}/door/right_hinge/west/toggle # check for potential neighbouring doors which should also be opened execute positioned ~ ~ ~1 if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=west] run function gm4_double_doors:{{ material_name }}/door/left_hinge/west/toggle execute positioned ~-1 ~ ~ if block ~ ~ ~ minecraft:{{ material_name }}_door[hinge=left,facing=east] run function gm4_double_doors:{{ material_name }}/door/left_hinge/east/toggle ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/initialize_auto_toggle_marker.mcfunction ================================================ # Initializes a freshly spawned auto toggle marker # @s = newly spawned auto toggle marker # at @s # run from toggle functions in gm4_double_doors:{{ material_name }}/door/... # set name data modify entity @s CustomName set value "gm4_double_doors_auto_toggle_marker" # store inverted target door state onto marker execute if score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 0 execute unless score $target_door_state gm4_double_doors_data matches 1 run scoreboard players set @s gm4_double_doors_auto_toggle_target_state 1 # store hitbox orientation execute if score @s gm4_double_doors_auto_toggle_target_state matches 0 run tag @s add gm4_double_doors_collision_box_east execute if score @s gm4_double_doors_auto_toggle_target_state matches 1 run tag @s add gm4_double_doors_collision_box_north # set tags tag @s add gm4_double_doors_auto_toggle_marker tag @s add gm4_double_doors_right tag @s add gm4_double_doors_{{ material_name }} # set default lifetime in ticks scoreboard players set @s gm4_double_doors_auto_toggle_liftime 60 # set starting state to 'waiting_for_player' scoreboard players set @s gm4_double_doors_auto_toggle_state 0 # schedule auto toggle marker handling schedule function gm4_double_doors:auto_toggle_marker/find 1t ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/door/right_hinge/west/toggle.mcfunction ================================================ # Toggles the double door the player has interacted with. # @s = player that interacted with a door # at location of the lower half of the left door of the double door the player has interacted with # run from functions in gm4_double_doors:{{ material_name }}/door/right_hinge/.../check_neighbors # player just closed a door execute if score $target_door_state gm4_double_doors_data matches 0 run place template gm4_double_doors:{{ material_name }}/door/west/right/closed ~ ~ ~ # player just opened a door execute if score $target_door_state gm4_double_doors_data matches 1 run place template gm4_double_doors:{{ material_name }}/door/west/right/open ~ ~ ~ # get target trapdoor state (0->1, 1->0 for this direction) execute store result score $target_trapdoor_state gm4_double_doors_data if score $target_door_state gm4_double_doors_data matches 0 # check for potential trapdoors which should also be opened scoreboard players operation $trap_door_recursion_level gm4_double_doors_data = $trap_door_limit gm4_double_doors_data execute positioned ~ ~2 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours # prepare automatic un-toggling after player walked through, delete preexisting auto toggle markers execute align xyz store success score $found_prexisting_marker gm4_double_doors_data run kill @e[type=marker,tag=gm4_double_doors_auto_toggle_marker,dx=0] execute unless score $triggered_by_auto_toggle gm4_double_doors_data matches 1 if score $found_prexisting_marker gm4_double_doors_data matches 0 summon marker run function gm4_double_doors:{{ material_name }}/door/right_hinge/west/initialize_auto_toggle_marker execute if score $triggered_by_auto_toggle gm4_double_doors_data matches 1 run scoreboard players set $play_sound gm4_double_doors_data 1 # reset fake player scoreboard players reset $found_prexisting_marker gm4_double_doors_data ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_east/check_neighbours.mcfunction ================================================ # Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/east/right/toggle and gm4_double_doors:{{ material_name }}/door/north/left/toggle # open this trapdoor function gm4_double_doors:{{ material_name }}/trapdoor/north_east/toggle # check for potential trapdoors which should also be opened scoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1 execute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_east/check_neighbours ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_east/toggle.mcfunction ================================================ # Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door) # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/trapdoor/north_est/check_neighbours # player just closed a door execute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=north] # player just opened a door execute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=east] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_west/check_neighbours.mcfunction ================================================ # Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/north/right/toggle and gm4_double_doors:{{ material_name }}/door/west/left/toggle # open this trapdoor function gm4_double_doors:{{ material_name }}/trapdoor/north_west/toggle # check for potential trapdoors which should also be opened scoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1 execute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=south] run function gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/north_west/toggle.mcfunction ================================================ # Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door) # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/trapdoor/north_west/check_neighbours # player just closed a door execute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=north] # player just opened a door execute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=west] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_east/check_neighbours.mcfunction ================================================ # Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/east/left/toggle and gm4_double_doors:{{ material_name }}/door/south/right/toggle # open this trapdoor function gm4_double_doors:{{ material_name }}/trapdoor/south_east/toggle # check for potential trapdoors which should also be opened scoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1 execute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=west] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_east/toggle.mcfunction ================================================ # Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door) # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/trapdoor/south_east/check_neighbours # player just closed a door execute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=south] # player just opened a door execute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=east] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_west/check_neighbours.mcfunction ================================================ # Initiates opening (in the door opening sense) of this trapdoor and looks for additional trapdoors above this trapdoor, unless the maximum trapdoor level was exceeded # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/door/west/right/toggle and gm4_double_doors:{{ material_name }}/door/south/left/toggle # open this trapdoor function gm4_double_doors:{{ material_name }}/trapdoor/south_west/toggle # check for potential trapdoors which should also be opened scoreboard players remove $trap_door_recursion_level gm4_double_doors_data 1 execute if score $trap_door_recursion_level gm4_double_doors_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[open=true,half=bottom] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=east] unless block ~ ~ ~ minecraft:{{ material_name }}_trapdoor[facing=north] run function gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/function/trapdoor/south_west/toggle.mcfunction ================================================ # Toggles this trapdoor, in the sense that the trapdoor is rotated around the z-axis (like a door) # @s = player that interacted with a door # at location of the lower half of the door the player has interacted with # run from gm4_double_doors:{{ material_name }}/trapdoor/south_west/check_neighbours # player just closed a door execute if score $target_trapdoor_state gm4_double_doors_data matches 0 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=south] # player just opened a door execute if score $target_trapdoor_state gm4_double_doors_data matches 1 run setblock ~ ~ ~ {{ material_name }}_trapdoor[open=true,half=bottom,facing=west] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/left/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "east", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "east", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/left/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "east", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "east", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/right/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "east", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "east", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/east/right/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "east", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "east", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/left/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "north", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "north", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/left/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "north", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "north", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/right/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "north", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "north", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/north/right/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "north", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "north", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/left/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "south", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "south", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/left/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "south", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "south", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/right/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "south", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "south", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/south/right/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "south", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "south", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/left/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "west", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "west", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/left/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "left", half: "lower", powered: "false", facing: "west", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "left", half: "upper", powered: "false", facing: "west", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/right/closed.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "west", open: "false" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "west", open: "false" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/templates/structure/door/west/right/open.snbt ================================================ { size: [ 1, 2, 1 ], entities: [], blocks: [ { pos: [ 0, 0, 0 ], state: 0 }, { pos: [ 0, 1, 0 ], state: 1 } ], palette: [ { Properties: { hinge: "right", half: "lower", powered: "false", facing: "west", open: "true" }, Name: "minecraft:{{ material_name }}_door" }, { Properties: { hinge: "right", half: "upper", powered: "false", facing: "west", open: "true" }, Name: "minecraft:{{ material_name }}_door" } ], DataVersion: 3465 } ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_east_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_east_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_north_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_north_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~3.5 180 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_north_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_north_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~3.5 180 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~1 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_south_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_south_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 0 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_south_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_south_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 0 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_west_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/auto_toggle_west_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy into door and chech that it is still open execute at @s run tp @s ^ ^ ^0.75 await delay 10t # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # move dummy behind door and check that it is closed again execute at @s run tp @s ^ ^ ^1 await delay 20t # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_east_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # close door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_east_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_east_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 -90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] # close door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~1 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=east,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=east,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_north_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_north_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~3.5 180 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # close door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_north_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_north_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~3.5 180 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=true,facing=north,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=north,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # close door dummy @s use block ~1 ~2 ~2 # left column assert block ~1 ~1 ~2 oak_door[open=false,facing=north,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=north,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] # right column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=north,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_south_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_south_inverted # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 0 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=false,facing=east,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=east,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # close door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=true,facing=east,hinge=left,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=east,hinge=left,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_south_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_south_normal # @dummy # position dummy and make it face the right way tp @s ~1.5 ~1 ~1.5 0 0 # open door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=true,facing=south,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=true,facing=south,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=east,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # close door dummy @s use block ~1 ~2 ~2 # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] # right column assert block ~1 ~1 ~2 oak_door[open=false,facing=south,hinge=right,half=lower] assert block ~1 ~2 ~2 oak_door[open=false,facing=south,hinge=right,half=upper] assert block ~1 ~3 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~4 ~2 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~1 ~5 ~2 oak_trapdoor[open=true,facing=south,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_west_inverted.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_west_inverted # @dummy # position dummy and make it face the right way tp @s ~3.5 ~1 ~1.5 90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom] # right column assert block ~2 ~1 ~1 oak_door[open=false,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom] # close door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=north,hinge=right,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=north,hinge=right,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom] # right column assert block ~2 ~1 ~1 oak_door[open=true,facing=south,hinge=left,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=south,hinge=left,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom] ================================================ FILE: gm4_double_doors/data/gm4_double_doors/test/toggle_west_normal.mcfunction ================================================ # @template gm4_double_doors:test/valid_door_west_normal # @dummy # position dummy and make it face the right way tp @s ~3.5 ~1 ~1.5 90 0 # open door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~2 oak_door[open=true,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=true,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=north,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom] # right column assert block ~2 ~1 ~1 oak_door[open=true,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=true,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=south,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom] # close door dummy @s use block ~2 ~2 ~1 # left column assert block ~2 ~1 ~2 oak_door[open=false,facing=west,hinge=left,half=lower] assert block ~2 ~2 ~2 oak_door[open=false,facing=west,hinge=left,half=upper] assert block ~2 ~3 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~2 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~2 oak_trapdoor[open=true,facing=west,half=bottom] # right column assert block ~2 ~1 ~1 oak_door[open=false,facing=west,hinge=right,half=lower] assert block ~2 ~2 ~1 oak_door[open=false,facing=west,hinge=right,half=upper] assert block ~2 ~3 ~1 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~4 ~1 oak_trapdoor[open=true,facing=west,half=bottom] assert block ~2 ~5 ~1 oak_trapdoor[open=true,facing=west,half=bottom] ================================================ FILE: gm4_double_doors/generate.py ================================================ from typing import ClassVar, List from pathlib import Path import csv from dataclasses import dataclass import logging from beet import Context, Structure, TextFile, subproject from beet.contrib.vanilla import Vanilla from nbtlib import parse_nbt from gm4.plugins.manifest import repro_structure_to_bytes logger = logging.getLogger(__name__) class StringStructure(TextFile): """Create class that loads .snbt files into the beet project""" scope: ClassVar[tuple[str, ...]] = ("structure",) extension: ClassVar[str] = ".snbt" def serialize_to_structure(self) -> Structure: return Structure(parse_nbt(self.text), serializer=repro_structure_to_bytes) def register_snbt_files(ctx: Context): # register the custom file-type with beet so those files are mounted ctx.data.extend_namespace.append(StringStructure) def read_sound_id_from_csv(): with open(Path('gm4_double_doors', 'raw', 'sound_names.csv'), mode='r') as file: csv_file = csv.reader(file) next(csv_file) # skip header line return {row[0]: DoorSound(open=row[1],close=row[2]) for row in csv_file} def resolve_blocktag(ctx: Context, minecraft_version: str, tag_name: str) -> List[str]: """ Traverses the given block tag depth-first, replacing all mentions of vanilla block tags with their contents. Returns a flat list of all block ids contained in the block tag and any sub-tags. Raises a `ValueError` if a block tag can not be resolved. """ vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = minecraft_version tag_name = tag_name.removeprefix("#") # hash-symbol is not needed for lookup if tag_name not in vanilla.data.block_tags: # ensure block tag exists raise ValueError(f"Unknown block tag '{tag_name}' for Minecraft version '{minecraft_version}'!") entries: List[str] = vanilla.data.block_tags[tag_name].data["values"] out: List[str] = [] for entry in entries: if entry.startswith("#minecraft:"): # found another block tag, resolve it first out += resolve_blocktag(ctx, minecraft_version, entry) else: out.append(entry) # block id, append to out return out @dataclass class DoorSound(): open: str close: str def beet_default(ctx: Context): # prepare list of door materials door_materials = [ door.removeprefix("minecraft:").removesuffix("_door") for door in resolve_blocktag(ctx, "26.1", "minecraft:mob_interactable_doors") ] # make list of wood types accessible for bolt ctx.meta['door_materials'] = door_materials # store door opening/closing sounds to dict sound_ids = read_sound_id_from_csv() for wood in door_materials: if not wood in sound_ids: # if sound is not specified in csv, default to normal wooden door sound logger.info(f"{wood} door has no sound effect configured in sound_names.json! Using the default instead.") sound_ids[wood] = DoorSound(open='minecraft:block.wooden_door.open', close='minecraft:block.wooden_door.close') ctx.meta['sound_ids'] = sound_ids # make sound dict accessible to bolt # for each wood type in the vanilla doors tag, render a copy of the "templates" directory with the appropiate wood-type for wood in door_materials: subproject_config = { "require": [ "gm4_double_doors.generate.register_snbt_files" ], "data_pack": { "load": [ { f"data/gm4_double_doors/advancement/{wood}": "data/gm4_double_doors/templates/advancement", f"data/gm4_double_doors/function/{wood}": "data/gm4_double_doors/templates/function", f"data/gm4_double_doors/structure/{wood}": "data/gm4_double_doors/templates/structure", } ], "render": { "advancement": "*", "function": "*", "string_structure": "*" # renders all mounted files of the StringStructure container } }, "meta": { "material_name": wood } } ctx.require(subproject(subproject_config)) # transform the "string-structure" files into actual binary files for name, struct in ctx.data[StringStructure].items(): ctx.data[Structure][name] = struct.serialize_to_structure() ctx.data[StringStructure].clear() ================================================ FILE: gm4_double_doors/raw/sound_names.csv ================================================ wood_type, open_sound_id, close_sound_id acacia,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close bamboo,minecraft:block.bamboo_wood_door.open,minecraft:block.bamboo_wood_door.close birch,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close cherry,minecraft:block.cherry_wood_door.open,minecraft:block.cherry_wood_door.close copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close crimson,minecraft:block.nether_wood_door.open,minecraft:block.nether_wood_door.close dark_oak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close exposed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close jungle,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close mangrove,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close oak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close oxidized_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close pale_oak,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close spruce,minecraft:block.wooden_door.open,minecraft:block.wooden_door.close warped,minecraft:block.nether_wood_door.open,minecraft:block.nether_wood_door.close waxed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close waxed_exposed_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close waxed_oxidized_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close waxed_weathered_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close weathered_copper,minecraft:block.copper_door.open,minecraft:block.copper_door.close ================================================ FILE: gm4_double_doors/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.double_doors,"Tired of clicking twice to open a double door? Annoyed by the fact that doors are only two blocks tall? This data pack automatically opens adjacent doors, making double doors fully functional! Additionally, bottom trapdoors of matching wood type placed above a door are opened alongside the door when it is opened by a player." text.gm4.guidebook.double_doors.description,"Placing two doors adjacent to each other will link them together, so they open together.\n\nTrapdoors placed above doors will also act as part of the door, opening when the doors open." ================================================ FILE: gm4_dripleaf_filters/README.md ================================================ # Dripleaf Filters Sort streams of items out with Big Dripleafs spitting items out that match the pattern. Items being filtered with a Dripleaf ### Features - Create a filter by placing a hopper in front of the dripleaf, with any matching items being moved into it - Any other item will pass through the big dripleaf, so can be captured with a hopper underneath it ================================================ FILE: gm4_dripleaf_filters/beet.yaml ================================================ id: gm4_dripleaf_filters name: Dripleaf Filters version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Dripleaves will flick items that match a hopper's contents into the hopper for you! recommended: - gm4_book_binders notes: [] modrinth: project_id: WNvo6RJr wiki: https://wiki.gm4.co/wiki/Dripleaf_Filters credits: Creator: - Sparks Icon Design: - Hozz ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/check_hopper_filter.mcfunction ================================================ # Checks if the item matches any of the items in the hopper # @s item on a dripleaf # at @s aligned xz # run from gm4_dripleaf_filters:on_leaf # store the item's ID in storage data modify storage gm4_dripleaf_filters:cache compare_id set from entity @s Item.id # store the hopper's items in storage data modify storage gm4_dripleaf_filters:cache whitelisted_items set from block ^ ^-1 ^1 Items # loop through the slots to see if any IDs match function gm4_dripleaf_filters:match_item execute if score $items_are_different gm4_dripleaf_filters matches 0 run function gm4_dripleaf_filters:deposit_item ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/deposit_item.mcfunction ================================================ # Causes the item to slide off the dripleaf # @s an item that can go into the hopper # at @s aligned xz # run from gm4_dripleaf_filters:check_hopper_filter execute if block ~ ~ ~ big_dripleaf[facing=west] run data modify entity @s Motion set value [-0.15d,0.07d,0.0d] execute if block ~ ~ ~ big_dripleaf[facing=east] run data modify entity @s Motion set value [0.15d,0.07d,0.0d] execute if block ~ ~ ~ big_dripleaf[facing=south] run data modify entity @s Motion set value [0.0d,0.07d,0.15d] execute if block ~ ~ ~ big_dripleaf[facing=north] run data modify entity @s Motion set value [0.0d,0.07d,-0.15d] ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/init.mcfunction ================================================ execute unless score dripleaf_filters gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Dripleaf Filters"} execute unless score dripleaf_filters gm4_earliest_version < dripleaf_filters gm4_modules run scoreboard players operation dripleaf_filters gm4_earliest_version = dripleaf_filters gm4_modules scoreboard players set dripleaf_filters gm4_modules 1 scoreboard objectives add gm4_dripleaf_filters dummy schedule function gm4_dripleaf_filters:main 1t #$moduleUpdateList ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/main.mcfunction ================================================ execute as @e[type=item] at @s if block ~ ~ ~ big_dripleaf align xz positioned ~0.5 ~ ~0.5 run function gm4_dripleaf_filters:on_leaf schedule function gm4_dripleaf_filters:main 16t ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/match_item.mcfunction ================================================ # Loops through all slots in the hopper that contain items and checks if they match the item on the leaf # @s = item on a dripleaf # at @s aligned xz # run from gm4_dripleaf_filters:check_hopper_filter and itself execute store success score $items_are_different gm4_dripleaf_filters run data modify storage gm4_dripleaf_filters:cache whitelisted_items[0].id set from storage gm4_dripleaf_filters:cache compare_id execute if score $items_are_different gm4_dripleaf_filters matches 1 run data remove storage gm4_dripleaf_filters:cache whitelisted_items[0] execute if score $items_are_different gm4_dripleaf_filters matches 1 if data storage gm4_dripleaf_filters:cache whitelisted_items[0] run function gm4_dripleaf_filters:match_item ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/function/on_leaf.mcfunction ================================================ # Determine leaf orientation and look for a hopper with items in front of the leaf # @s an item on a big dripleaf # at @s aligned xz # run from gm4_dripleaf_filters:main # determine leaf orientation execute if block ~ ~ ~ big_dripleaf[facing=south] run teleport @s ~ ~ ~ 0 0 execute if block ~ ~ ~ big_dripleaf[facing=west] run teleport @s ~ ~ ~ 90 0 execute if block ~ ~ ~ big_dripleaf[facing=north] run teleport @s ~ ~ ~ 180 0 execute if block ~ ~ ~ big_dripleaf[facing=east] run teleport @s ~ ~ ~ -90 0 #if the hopper has items in it, check if any of the items match this one execute at @s if block ^ ^-1 ^1 hopper{Items:[{}]} run function gm4_dripleaf_filters:check_hopper_filter ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/guidebook/dripleaf_filters.json ================================================ { "id": "dripleaf_filters", "name": "Dripleaf Filters", "module_type": "module", "icon": { "id": "minecraft:big_dripleaf" }, "criteria": { "obtain_dripleaf_and_hopper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:big_dripleaf" ] }, { "items": [ "minecraft:hopper" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.dripleaf_filters.description", "fallback": "Big dripleaves can sort items by searching hoppers in front of them." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_dripleaf_and_hopper" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.dripleaf_filters.structure", "fallback": "When an item falls onto a big dripleaf, the leaf will inspect a hopper placed on the ground in front of it." } ], [ { "translate": "text.gm4.guidebook.dripleaf_filters.filtering", "fallback": "If any of the items in the hopper match the item on the leaf, it will slide the item into the hopper.\n\nOtherwise it will collapse and drop the item below itself like normal." } ] ] } ] } ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/test/fallthrough.mcfunction ================================================ # @template gm4_dripleaf_filters:test_setup # @skyaccess item replace block ~ ~1 ~1 container.0 with minecraft:iron_ingot summon item ~1.5 ~4 ~1.4 {Item:{id:"minecraft:gold_ingot",count:10}} await items block ~1 ~ ~1 container.* minecraft:gold_ingot[count=10] ================================================ FILE: gm4_dripleaf_filters/data/gm4_dripleaf_filters/test/slide.mcfunction ================================================ # @template gm4_dripleaf_filters:test_setup # @skyaccess item replace block ~ ~1 ~1 container.0 with minecraft:iron_ingot summon item ~1.5 ~4 ~1.4 {Item:{id:"minecraft:iron_ingot",count:10}} await items block ~ ~1 ~1 container.* minecraft:iron_ingot[count=11] assert not items block ~1 ~ ~1 container.* * ================================================ FILE: gm4_dripleaf_filters/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_dripleaf_filters:cache] to struct { compare_id?: #[id="item"] string, whitelisted_items?: [ItemStack] @ ..5, } ================================================ FILE: gm4_dripleaf_filters/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.dripleaf_filters,Dripleaves will flick items that match a hopper's contents into the hopper for you! text.gm4.guidebook.dripleaf_filters.description,Big dripleaves can sort items by searching hoppers in front of them. text.gm4.guidebook.dripleaf_filters.structure,"When an item falls onto a big dripleaf, the leaf will inspect a hopper placed on the ground in front of it." text.gm4.guidebook.dripleaf_filters.filtering,"If any of the items in the hopper match the item on the leaf, it will slide the item into the hopper.\n\nOtherwise it will collapse and drop the item below itself like normal." ================================================ FILE: gm4_dripleaf_launchers/README.md ================================================ # Dripleaf Launchers Who wants to find the nearest cliff to deploy their Elytra? Use the power of nature and launch yourself into the air with just a Dripleaf plant (and some redstone)! ### Features - Stand on a tilted Big Dripleaf and power it with redstone to launch into the air. - Use an Observer and 4 ticks of Repeater delay for the perfect launch! ================================================ FILE: gm4_dripleaf_launchers/beet.yaml ================================================ id: gm4_dripleaf_launchers name: Dripleaf Launchers version: 1.5.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick website: description: Start your own Dripleaf Space Program! recommended: [] notes: [] modrinth: project_id: kUn3Z6gZ smithed: pack_id: gm4_dripleaf_launchers wiki: https://wiki.gm4.co/wiki/Dripleaf_Launchers credits: Creator: - Djones Icon Design: - Hozz ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/check.mcfunction ================================================ # check players on dripleafs # @s = player # at @s # run from tick # dripleaf needs partial tilt before launch is possible tag @s[predicate=gm4_dripleaf_launchers:dripleaf_tilted] add gm4_dl_dripleaf_ready # if launch is possible and dripleaf is reset to no tilt through redstone launch player execute if entity @s[tag=gm4_dl_dripleaf_ready,predicate=gm4_dripleaf_launchers:dripleaf_no_tilt] run function gm4_dripleaf_launchers:launch # if dripleaf goes either full tilt or back to no tilt before launch is ready remove tag tag @s[predicate=!gm4_dripleaf_launchers:dripleaf_triggered] remove gm4_dl_on_dripleaf tag @s[tag=!gm4_dl_on_dripleaf] remove gm4_dl_dripleaf_ready ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/init.mcfunction ================================================ execute unless score dripleaf_launchers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Dripleaf Launchers"} scoreboard players set dripleaf_launchers gm4_modules 1 schedule function gm4_dripleaf_launchers:main 1t schedule function gm4_dripleaf_launchers:tick 1t #$moduleUpdateList ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/launch.mcfunction ================================================ # launch into the air! # @s = player # at @s # run from check tag @s remove gm4_dl_on_dripleaf # vfx playsound minecraft:block.big_dripleaf.tilt_up player @s ~ ~1 ~ 3 0 1 playsound minecraft:block.beehive.enter player @s ~ ~1 ~ 1 1.6 1 execute align xyz run particle minecraft:block{block_state:"minecraft:big_dripleaf"} ~.5 ~.93751 ~.5 0.25 0.01 0.25 0 12 # grant levitation for 4 ticks summon minecraft:area_effect_cloud ~ ~ ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},ReapplicationDelay:0,Age:-1,Radius:0.5f,RadiusPerTick:0f,RadiusOnUse:-0.5f,Duration:4,WaitTime:0,potion_contents:{custom_effects:[{id:'minecraft:levitation',amplifier:40b,duration:4,show_particles:0b,show_icon:0b,ambient:1b}]}} ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/main.mcfunction ================================================ schedule function gm4_dripleaf_launchers:main 4t # tag players on dripleaf (with no or partial tilt) execute as @a[gamemode=!spectator] at @s[predicate=gm4_dripleaf_launchers:dripleaf_triggered] run tag @s add gm4_dl_on_dripleaf ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/function/tick.mcfunction ================================================ schedule function gm4_dripleaf_launchers:tick 1t # process players on dripleaf execute as @a[gamemode=!spectator,tag=gm4_dl_on_dripleaf] at @s run function gm4_dripleaf_launchers:check ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/guidebook/dripleaf_launchers.json ================================================ { "id": "dripleaf_launchers", "name": "Dripleaf Launchers", "module_type": "module", "icon": { "id": "minecraft:big_dripleaf" }, "criteria": { "obtain_dripleaf": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:big_dripleaf" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_dripleaf" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.dripleaf_launchers.description", "fallback": "Sending a redstone signal to a big dripleaf with partial tilt will launch anyone on it into the air." } ] ] } ] } ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_no_tilt.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:big_dripleaf" ], "state": { "tilt": "none" } } } } } ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_tilted.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:big_dripleaf" ], "state": { "tilt": "partial" } } } } } ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/predicate/dripleaf_triggered.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:big_dripleaf" ], "state": { "tilt": "partial" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:big_dripleaf" ], "state": { "tilt": "unstable" } } } } } ] } ================================================ FILE: gm4_dripleaf_launchers/data/gm4_dripleaf_launchers/test/launch.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~2 ~1 # @skyaccess setblock ~1 ~ ~1 minecraft:dirt setblock ~1 ~1 ~1 minecraft:big_dripleaf await block ~1 ~1 ~1 minecraft:big_dripleaf[tilt=partial] await delay 4t setblock ~ ~1 ~1 minecraft:redstone_block await entity @s[distance=7..] ================================================ FILE: gm4_dripleaf_launchers/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.dripleaf_launchers,Start your own Dripleaf Space Program! text.gm4.guidebook.dripleaf_launchers.description,Sending a redstone signal to a big dripleaf with partial tilt will launch anyone on it into the air. ================================================ FILE: gm4_end_fishing/README.md ================================================ # End Fishing You can now fish in the Void? ### Features - Allows the use of a fishing rod in the End Void - Fishing has loot like when casting a reel on water and is different in each end biome - Adds the rare "Enderpuff" which levitates the player and mitigates fall damage More specifics on the loot available and the chances per biome can be found on the [Wiki](https://wiki.gm4.co/End_Fishing) ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/broken_captains_wings.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_end_fishing:item/elytra/broken_captains_wings" } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/broken_ravaged_wings.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_end_fishing:item/elytra/broken_ravaged_wings" } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/captains_wings.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_end_fishing:item/elytra/captains_wings" } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/elytra/ravaged_wings.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_end_fishing:item/elytra/ravaged_wings" } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_1.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_1" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_10.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_10" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_11.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_11" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_12.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_12" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_13.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_13" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_14.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_14" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_15.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_15" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_16.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_16" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_17.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_17" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_18.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_18" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_19.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_19" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_2.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_2" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_20.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_20" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_3.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_3" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_4.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_4" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_5.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_5" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_6.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_6" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_7.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_7" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_8.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_8" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/diamond_sword_9.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/diamond_sword_9" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_1.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_1" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_10.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_10" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_11.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_11" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_12.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_12" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_13.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_13" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_14.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_14" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_15.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_15" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_16.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_16" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_17.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_17" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_18.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_18" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_19.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_19" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_2.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_2" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_20.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_20" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_3.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_3" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_4.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_4" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_5.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_5" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_6.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_6" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_7.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_7" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_8.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_8" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/iron_sword_9.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/iron_sword_9" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_1.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_1" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.977, 0.977, 0.977 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.748, 0.748, 0.748 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_10.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_10" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.4, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_11.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_11" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.5, 0.65 ], "scale": [ 0.765, 0.765, 0.765 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.612, 0.612, 0.612 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_12.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_12" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.25, 0.65 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_13.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_13" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_14.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_14" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.5, 0.5 ], "scale": [ 1.02, 1.02, 1.02 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.816, 0.816, 0.816 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_15.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_15" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_16.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_16" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.3, 0.5 ], "scale": [ 0.799, 0.799, 0.799 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.6392, 0.6392, 0.6392 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_17.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_17" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_18.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_18" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_19.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_19" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_2.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_2" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.6, 0.5 ], "scale": [ 0.8755, 0.8755, 0.8755 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7004, 0.7004, 0.7004 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_20.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_20" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.3, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_3.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_3" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.67, 0.5 ], "scale": [ 0.884, 0.884, 0.884 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7072, 0.7072, 0.7072 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_4.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_4" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.8, 0.5 ], "scale": [ 0.9265, 0.9265, 0.9265 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7412, 0.7412, 0.7412 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_5.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_5" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.65, 0.5 ], "scale": [ 0.952, 0.952, 0.952 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.7616, 0.7616, 0.7616 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_6.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_6" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.0, 0.2 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_7.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_7" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 3.1, 0.73 ], "scale": [ 0.7395, 0.7395, 0.7395 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.5916, 0.5916, 0.5916 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_8.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_8" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 4.7, 0.5 ], "scale": [ 0.85, 0.85, 0.85 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.68, 0.68, 0.68 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/models/item/swords/netherite_sword_9.json ================================================ { "parent": "minecraft:item/handheld", "textures": { "layer0": "gm4_end_fishing:item/swords/netherite_sword_9" }, "display": { "thirdperson_righthand": { "rotation": [ 0, -90, 55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "thirdperson_lefthand": { "rotation": [ 0, 90, -55 ], "translation": [ 0, 5.2, 0.5 ], "scale": [ 0.8925, 0.8925, 0.8925 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] }, "firstperson_lefthand": { "rotation": [ 0, 90, -25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.714, 0.714, 0.714 ] } } } ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/optifine/cit/captains_wings.properties ================================================ type=elytra matchItems=elytra texture.elytra=elytra_10 nbt.CustomModelData=$item/captains_wings ================================================ FILE: gm4_end_fishing/assets/gm4_end_fishing/optifine/cit/ravaged_wings.properties ================================================ type=elytra matchItems=elytra texture.elytra=ravaged_wings nbt.CustomModelData=$item/ravaged_wings ================================================ FILE: gm4_end_fishing/assets/translations.csv ================================================ key,en_us item.gm4.end_fishing.ravaged_wings,Ravaged Wings item.gm4.enderpuff,Enderpuff text.gm4.end_city_armor.1,Lost on End City moving day text.gm4.end_city_armor.2,Forged by Seppo Ilmarinen text.gm4.end_city_armor.3,Belongs to Achilles text.gm4.end_city_armor.4,Made by Wayland the Smith text.gm4.end_city_armor.5,Worn during the battle of Ender Ender text.gm4.end_city_armor.6.1,This thing's been rotting in text.gm4.end_city_armor.6.2,the void for at least a century. text.gm4.end_city_armor.7,Passed down over many generations text.gm4.end_city_armor.8,Wear this to become invisible to nobody! text.gm4.end_city_armor.9.1,I promise you can fly while wearing this. text.gm4.end_city_armor.9.2,"Trust me, just jump into the void." text.gm4.end_city_armor.10.1,With this you shall be immortal! text.gm4.end_city_armor.10.2,Or is it immoral? I can't remember. text.gm4.end_city_horse_armor.1,That's some good barding! text.gm4.end_city_horse_armor.2.1,There's a horse somewhere text.gm4.end_city_horse_armor.2.2,that lost this armour. text.gm4.end_city_horse_armor.3.1,Floating horses must be text.gm4.end_city_horse_armor.3.2,"a thing somewhere, right?" text.gm4.end_city_horse_armor.4,Too bad there's no horse weapons. text.gm4.end_city_horse_armor.5,Made with the finest materials known to man text.gm4.end_city_ore.1,The riches of the vast void text.gm4.end_city_ore.2,Dropped from a nearby End City text.gm4.end_city_ore.3,There's so much treasure down there! text.gm4.end_city_ore.4,Cursed by the ancient Goddess text.gm4.end_city_ore.5,This isn't real. It's fake treasure. text.gm4.end_city_ore.6,Cha-Ching! We're going to be rich! text.gm4.end_city_sword.1,Forged in a dragon's breath text.gm4.end_city_sword.2.1,"Life kills life all the time, so the Goddess" text.gm4.end_city_sword.2.2,sacrifices herself for her own animal. text.gm4.end_city_sword.3,Blessed with Hylia's power text.gm4.end_city_sword.4,Forged by Muramasa text.gm4.end_city_sword.5,Powered by the living crystal within text.gm4.end_city_sword.6,"Used to decapitate the Gorgon, Medusa" text.gm4.end_city_sword.7.1,This is believed to be one of the text.gm4.end_city_sword.7.2,finest Japanese swords ever made. text.gm4.end_city_sword.8,Used at the Battle of the Trench text.gm4.end_city_sword.9,Removed from the Garden of Eden text.gm4.end_city_sword.10,Used to kill the dragon Fafnir text.gm4.end_city_sword.11,Snicker-snack! text.gm4.end_city_sword.12.1,Created by husband and wife magicians text.gm4.end_city_sword.12.2,of the ancient Bön tradition text.gm4.end_city_sword.13,Belongs to Roland text.gm4.end_city_sword.14.1,"If found, please return" text.gm4.end_city_sword.14.2,to William Wallace. text.gm4.end_city_sword.15,Reforged from the shards of Narsil text.gm4.end_city_sword.16,Forged by the Iron Sisters text.gm4.end_city_sword.17.1,Used to lead the revolutionary text.gm4.end_city_sword.17.2,army against the Telmarines text.gm4.end_city_sword.18,Can only be wielded by a true Gryffindor text.gm4.end_city_sword.19,Sought by Thrax text.gm4.end_city_sword.20,Wielded by Lion-O text.gm4.end_city_tool.1.1,It's been said only those text.gm4.end_city_tool.1.2,who are worthy can wield this tool. text.gm4.end_city_tool.2.1,Once there was a man named text.gm4.end_city_tool.2.2,Tubal-cain who made this tool. text.gm4.end_city_tool.3,"If found, please return to Hephaestus." text.gm4.end_city_tool.4.1,This is actually a really hard text.gm4.end_city_tool.4.2,piece of bread. Don't tell anyone. text.gm4.end_city_tool.5,Found in the Valley of the Fallen Kings text.gm4.end_city_tool.6.1,Throw it. Maybe it'll come back! text.gm4.end_city_tool.6.2,"No, it's not a hammer, sadly." text.gm4.end_city_tool.7,"Thunk, Thunk, Thunk!" text.gm4.end_city_tool.8.1,Forged by the Leader of text.gm4.end_city_tool.8.2,the Endermen Rebellion text.gm4.end_city_tool.9,It's not a very good shield. text.gm4.end_city_tool.10.1,Where'd you find this? It's been text.gm4.end_city_tool.10.2,floating in the end for over a decade! text.gm4.end_ship_elytra.10.1,Nobody imagined the Captain's lost text.gm4.end_ship_elytra.10.2,"wings would be seen again, ever." advancement.gm4.end_fishing.title,I Wonder What's Down There? advancement.gm4.end_fishing.description,Catch some loot from the end void advancement.gm4.end_fishing_phantom.title,That's Not a Fish! advancement.gm4.end_fishing_phantom.description,Fish up a phantom from the end void advancement.gm4.end_fishing_swords.title,Master of the Swords advancement.gm4.end_fishing_swords.description,Retrieve all of the lost swords from the void text.gm4.guidebook.module_desc.end_fishing,"Catch rare loot by fishing in the end void! The void holds many riches, from End City loot and Elytra to weapons that once belonged to explorers time forgot, collect them all!" text.gm4.guidebook.end_fishing.description,Casting a fishing rod into the end void will allow one to fish up loot from the void.\n\nLoot is biome dependent. text.gm4.guidebook.end_fishing.end_phantom,"End Phantoms can be fished up from the end void.\n\nThey are larger and stronger than normal phantoms, but have a chance to drop a broken elytra upon death." ================================================ FILE: gm4_end_fishing/beet.yaml ================================================ id: gm4_end_fishing name: End Fishing version: 1.7.X data_pack: load: . resource_pack: load: . pipeline: - register_model_data - generate_optifine - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick model_data: # swords, armor, and tools are registered by plugin - template: generated item: player_head reference: item/enderpuff - item: elytra reference: item/captains_wings template: name: condition property: minecraft:broken on_true: item/elytra/broken_captains_wings on_false: item/elytra/captains_wings - item: elytra reference: item/ravaged_wings template: name: condition property: minecraft:broken on_true: item/elytra/broken_ravaged_wings on_false: item/elytra/ravaged_wings - item: fishing_rod reference: gui/advancement/end_fishing template: advancement - item: diamond_sword reference: gui/advancement/end_fishing_swords template: name: advancement forward: item/swords/diamond_sword_12 - item: elytra reference: gui/advancement/end_fishing_phantom template: name: advancement forward: item/elytra/broken_ravaged_wings website: description: Catch rare loot by fishing in the end void! The void holds many riches, from End City loot and Elytra to weapons that once belonged to explorers time forgot, collect them all! recommended: - gm4_resource_pack - gm4_reeling_rods - gm4_live_catch notes: [] modrinth: project_id: BbEwao9o wiki: https://wiki.gm4.co/wiki/End_Fishing credits: Creator: - BPR Icon Design: - Sparks ================================================ FILE: gm4_end_fishing/data/gm4/advancement/end_fishing.json ================================================ { "display": { "icon": { "id": "fishing_rod", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:gui/advancement/end_fishing"]} } }, "title": { "translate": "advancement.gm4.end_fishing.title", "fallback": "I Wonder What's Down There?" }, "description": { "translate": "advancement.gm4.end_fishing.description", "fallback": "Catch some loot from the end void", "color": "gray" } }, "parent": "gm4:root", "criteria": { "fish_in_end": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_end_fishing/data/gm4/advancement/end_fishing_phantom.json ================================================ { "display": { "icon": { "id": "elytra", "components": { "minecraft:damage": 432, "minecraft:custom_model_data": {"strings":["gm4_end_fishing:gui/advancement/end_fishing_phantom"]} } }, "title": { "translate": "advancement.gm4.end_fishing_phantom.title", "fallback": "That's Not a Fish!" }, "description": { "translate": "advancement.gm4.end_fishing_phantom.description", "fallback": "Fish up a phantom from the end void", "color": "gray" } }, "parent": "gm4:end_fishing", "criteria": { "fish_up_phantom": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_end_fishing/data/gm4/advancement/end_fishing_swords.json ================================================ { "display": { "icon": { "id": "diamond_sword", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:gui/advancement/end_fishing_swords"]} } }, "title": { "translate": "advancement.gm4.end_fishing_swords.title", "fallback": "Master of the Swords" }, "description": { "translate": "advancement.gm4.end_fishing_swords.description", "fallback": "Retrieve all of the lost swords from the void", "color": "gray" } }, "parent": "gm4:end_fishing", "criteria": { "end_city_sword_1": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:1b}}" } } ] } }, "end_city_sword_2": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:2b}}" } } ] } }, "end_city_sword_3": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:3b}}" } } ] } }, "end_city_sword_4": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:4b}}" } } ] } }, "end_city_sword_5": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:5b}}" } } ] } }, "end_city_sword_6": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:6b}}" } } ] } }, "end_city_sword_7": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:7b}}" } } ] } }, "end_city_sword_8": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:8b}}" } } ] } }, "end_city_sword_9": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:9b}}" } } ] } }, "end_city_sword_10": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:10b}}" } } ] } }, "end_city_sword_11": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:11b}}" } } ] } }, "end_city_sword_12": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:12b}}" } } ] } }, "end_city_sword_13": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:13b}}" } } ] } }, "end_city_sword_14": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:14b}}" } } ] } }, "end_city_sword_15": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:15b}}" } } ] } }, "end_city_sword_16": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:16b}}" } } ] } }, "end_city_sword_17": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:17b}}" } } ] } }, "end_city_sword_18": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:18b}}" } } ] } }, "end_city_sword_19": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:19b}}" } } ] } }, "end_city_sword_20": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{end_city_sword:20b}}" } } ] } } } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/advancement/check_inventory.json ================================================ { "criteria": { "change_inventory": { "trigger": "minecraft:inventory_changed" } }, "rewards": { "function": "gm4_end_fishing:enderpuff/check_inventory" } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/advancement/reel_loot.json ================================================ { "criteria": { "reel_loot": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_no_edit\",\"gm4_ef_has_fish\"]}", "location": { "dimension": "the_end" } } } } }, "rewards": { "function": "gm4_end_fishing:reel_in/reel_loot" } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/advancement/reel_rod.json ================================================ { "criteria": { "reel_in": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_no_edit\",\"gm4_end_fishing_bait\"]}", "location": { "dimension": "the_end" } } } } }, "rewards": { "function": "gm4_end_fishing:reel_in/reel_rod" } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/advancement/set_id.json ================================================ { "criteria": { "join_world": { "trigger": "location" } }, "rewards": { "function": "gm4_end_fishing:set_id" } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/marker.mcfunction ================================================ # @s = fishing bait armor stand to be turned into a marker # run from cast_rod/update_bait # make marker data merge entity @s {Marker:1b} tag @s add gm4_ef_marker summon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:["gm4_ef_bobber_update"]} schedule function gm4_end_fishing:go_fish/update_bobber 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/randomize_timer.mcfunction ================================================ # @s = fishing bait armor stand # run from cast_rod/summon_bait and go_fish/bobber_animation summon marker ~ ~ ~ {Tags:["gm4_ef_rand"]} # randomizes between 19-76 execute store result score $rand gm4_ef_data run data get entity @e[type=marker,tag=gm4_ef_rand,limit=1] UUID[0] scoreboard players operation $rand gm4_ef_data %= #57 gm4_ef_data scoreboard players add $rand gm4_ef_data 19 # decrease time depending on lure scoreboard players operation $decrease gm4_ef_data = @s gm4_ef_lure scoreboard players operation $decrease gm4_ef_data *= #6 gm4_ef_data scoreboard players operation $rand gm4_ef_data -= $decrease gm4_ef_data # set score of fishing bait scoreboard players operation @s gm4_ef_timer = $rand gm4_ef_data # clean up scoreboard players reset $rand gm4_ef_data scoreboard players reset $decrease gm4_ef_data kill @e[type=marker,tag=gm4_ef_rand] # if too low, then re-randomize execute if score @s gm4_ef_timer matches ..3 run function gm4_end_fishing:cast_rod/randomize_timer ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/store_data.mcfunction ================================================ # @s = fishing bobber in the end # run from tick # tag player that just cast the rod tag @p[scores={gm4_cast_rod=1..},distance=..2] add gm4_ef_cast_rod # store lure value execute unless entity @a[tag=gm4_ef_cast_rod,predicate=gm4_end_fishing:holding_fishing_rod,limit=1] store result score @s gm4_ef_lure run data get entity @a[tag=gm4_ef_cast_rod,limit=1] equipment.offhand.components."minecraft:enchantments"."minecraft:lure" execute if entity @a[tag=gm4_ef_cast_rod,predicate=gm4_end_fishing:holding_fishing_rod,limit=1] store result score @s gm4_ef_lure run data get entity @a[tag=gm4_ef_cast_rod,limit=1] SelectedItem.components."minecraft:enchantments"."minecraft:lure" # bobber id scoreboard players operation @s gm4_ef_id = @a[tag=gm4_ef_cast_rod,limit=1] gm4_ef_id # clean up tag @s add gm4_ef_set tag @a remove gm4_ef_cast_rod ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/summon_bait.mcfunction ================================================ # @s = fishing bobber positioned ~ ~-5 ~ # run from tick summon minecraft:armor_stand ~ ~ ~ {DisabledSlots:2039552,Small:1b,Invisible:1b,NoGravity:1b,Tags:["gm4_no_edit","gm4_end_fishing_bait_new","gm4_end_fishing_bait"],CustomName:"gm4_end_fishing_bait"} scoreboard players operation @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] gm4_ef_id = @s gm4_ef_id scoreboard players operation @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] gm4_ef_lure = @s gm4_ef_lure execute as @e[type=armor_stand,limit=1,tag=gm4_end_fishing_bait_new] run function gm4_end_fishing:cast_rod/randomize_timer tag @e[type=armor_stand,tag=gm4_end_fishing_bait] remove gm4_end_fishing_bait_new tag @s add gm4_ef_casted ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/cast_rod/update_bait.mcfunction ================================================ # @s = fishing bait armor stand (every 3 clock cycles) # run from process scoreboard players reset @s gm4_ef_up_bait # destruction execute if entity @s[tag=gm4_ef_marker] positioned ~ ~ ~ unless entity @e[type=minecraft:fishing_bobber,distance=..0.0001] run kill @s execute unless block ~ ~ ~ #gm4:no_collision run kill @s # make marker execute unless entity @s[tag=gm4_ef_marker] positioned ~ ~0.79 ~ if entity @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run function gm4_end_fishing:cast_rod/marker kill @s[tag=!gm4_ef_marker] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/calc_damage.mcfunction ================================================ # @s = player who reeled in armor stand # run from durability/set_mainhand and durability/set_offhand # calculate durability scoreboard players set $durability gm4_ef_data 64 scoreboard players operation $durability gm4_ef_data -= @s gm4_ef_data scoreboard players operation $durability gm4_ef_data *= #10000 gm4_ef_data scoreboard players operation $durability gm4_ef_data /= #64 gm4_ef_data # calculate unbreaking scoreboard players add $unbreaking_lvl gm4_ef_data 1 scoreboard players operation $unbreaking gm4_ef_data = #100 gm4_ef_data scoreboard players operation $unbreaking gm4_ef_data /= $unbreaking_lvl gm4_ef_data ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/check.mcfunction ================================================ # @s = none # run from durability/prep_mainhand and durability/prep_offhand execute as @a[gamemode=!creative,tag=gm4_ef_durability_main] run function gm4_end_fishing:durability/set_mainhand execute as @a[gamemode=!creative,tag=gm4_ef_durability_off] run function gm4_end_fishing:durability/set_offhand ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/prep_mainhand.mcfunction ================================================ # @s = player who reeled in the armor stand w/ fishing rod in mainhand # run from reel_in/reel_rod and reel_in/reel_loot execute store result score @s gm4_ef_data run data get entity @s SelectedItem.components."minecraft:damage" tag @s add gm4_ef_durability_main schedule function gm4_end_fishing:durability/check 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/prep_offhand.mcfunction ================================================ # @s = player who reeled in the armor stand w/ fishing rod in offhand # run from reel_in/reel_rod and reel_in/reel_loot execute store result score @s gm4_ef_data run data get entity @s equipment.offhand.components."minecraft:damage" tag @s add gm4_ef_durability_off schedule function gm4_end_fishing:durability/check 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/set_mainhand.mcfunction ================================================ # @s = player who reeled in the armor stand w/ fishing rod in mainhand # run from durability/check execute store result score $unbreaking_lvl gm4_ef_data run data get entity @s SelectedItem.components."minecraft:enchantments"."minecraft:unbreaking" function gm4_end_fishing:durability/calc_damage item modify entity @s[gamemode=!creative] weapon.mainhand gm4_end_fishing:prepare_rod item modify entity @s[gamemode=!creative] weapon.mainhand gm4_end_fishing:apply_damage execute if entity @s[tag=gm4_ef_looted,gamemode=!creative] run item modify entity @s weapon.mainhand gm4_end_fishing:apply_damage scoreboard players reset @s gm4_ef_data scoreboard players reset $durability gm4_ef_data scoreboard players reset $unbreaking_lvl gm4_ef_data scoreboard players reset $unbreaking gm4_ef_data tag @s remove gm4_ef_looted tag @s remove gm4_ef_durability_main ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/durability/set_offhand.mcfunction ================================================ # @s = player who reeled in the armor stand w/ fishing rod in offhand # run from durability/check execute store result score $unbreaking_lvl gm4_ef_data run data get entity @s equipment.offhand.components."minecraft:enchantments"."minecraft:unbreaking" function gm4_end_fishing:durability/calc_damage item modify entity @s[gamemode=!creative] weapon.offhand gm4_end_fishing:prepare_rod item modify entity @s[gamemode=!creative] weapon.offhand gm4_end_fishing:apply_damage execute if entity @s[tag=gm4_ef_looted,gamemode=!creative] run item modify entity @s weapon.offhand gm4_end_fishing:apply_damage scoreboard players reset @s gm4_ef_data scoreboard players reset $durability gm4_ef_data scoreboard players reset $unbreaking_lvl gm4_ef_data scoreboard players reset $unbreaking gm4_ef_data tag @s remove gm4_ef_looted tag @s remove gm4_ef_durability_off ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/apply_levitation.mcfunction ================================================ # @s = player with enderpuff in hand, not having levitation or slow falling yet # run from enderpuff/track_inventory # sound execute unless entity @s[tag=gm4_enderpuff_levitation] run playsound minecraft:entity.puffer_fish.blow_up player @a[distance=..8] ~ ~ ~ 0.7 0.3 0 # effect tag @s add gm4_enderpuff_levitation tag @s add gm4_enderpuff_used effect give @s levitation 180 1 ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/apply_slow_falling.mcfunction ================================================ # @s = player who has an enderpuff and is falling # run from tick execute store result score $fall_distance gm4_ef_data run data get entity @s fall_distance 10 execute if score $fall_distance gm4_ef_data matches 25.. run tag @s add gm4_ef_fall tag @s[scores={gm4_ef_sneak=1..},nbt={FallFlying:1b}] add gm4_ef_fall effect give @s[tag=gm4_ef_fall] slow_falling 1 0 ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/check_inventory.mcfunction ================================================ # @s = any player who has changed their inventory # run from advancement "check_inventory" advancement revoke @s only gm4_end_fishing:check_inventory tag @s remove gm4_has_enderpuff tag @s[predicate=gm4_end_fishing:carries_enderpuff] add gm4_has_enderpuff ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/clear_levitation.mcfunction ================================================ # @s = player with enderpuff in inventory, but isn't holding it or is holding it, but ran out of levitation # run from enderpuff/process effect clear @s levitation tag @s remove gm4_enderpuff_levitation # sound playsound minecraft:entity.puffer_fish.blow_out player @a[distance=..8] ~ ~ ~ 0.7 0.3 0 ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/enderpuff/process.mcfunction ================================================ # @s = player with enderpuff in inventory # run from main # check equipment tag @s remove gm4_enderpuff_equipped tag @s[predicate=gm4_end_fishing:holding_enderpuff] add gm4_enderpuff_equipped # apply levitation execute if predicate gm4_end_fishing:on_ground run tag @s remove gm4_enderpuff_used execute if entity @s[tag=gm4_enderpuff_equipped,tag=!gm4_enderpuff_used] run function gm4_end_fishing:enderpuff/apply_levitation execute if entity @s[tag=gm4_enderpuff_levitation,tag=!gm4_enderpuff_equipped] run function gm4_end_fishing:enderpuff/clear_levitation ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/bobber_animation.mcfunction ================================================ # @s = fishing bait armor stand with fish # run from tick scoreboard players add @s gm4_ef_data 1 execute if score @s gm4_ef_data matches 1 at @s run playsound minecraft:entity.ender_dragon.flap neutral @a[distance=..16] ~ ~ ~ 4 0.7 execute if score @s gm4_ef_data matches 1..5 at @s run tp @s ~ ~-0.1 ~ execute if score @s gm4_ef_data matches 5 at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run summon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:["gm4_ef_bobber_update"]} execute if score @s gm4_ef_data matches 5 run schedule function gm4_end_fishing:go_fish/update_bobber 1t execute if score @s gm4_ef_data matches 11..15 at @s run tp @s ~ ~0.1 ~ execute if score @s gm4_ef_data matches 15 at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run summon minecraft:armor_stand ~ ~ ~ {Small:1b,Invisible:1b,Tags:["gm4_ef_bobber_update"]} execute if score @s gm4_ef_data matches 15 run schedule function gm4_end_fishing:go_fish/update_bobber 1t execute if score @s gm4_ef_data matches 30.. run function gm4_end_fishing:cast_rod/randomize_timer execute if score @s gm4_ef_data matches 30.. run tag @s add gm4_end_fishing_bait execute if score @s gm4_ef_data matches 30.. run tag @s remove gm4_ef_has_fish execute if score @s gm4_ef_data matches 30.. run scoreboard players reset @s gm4_ef_data ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/bobber_animation_clock.mcfunction ================================================ # @s = none # run from process execute as @e[type=armor_stand,tag=gm4_ef_has_fish] unless score @s gm4_ef_data matches 31.. at @s run function gm4_end_fishing:go_fish/bobber_animation execute if entity @e[type=armor_stand,tag=gm4_ef_has_fish,limit=1] run schedule function gm4_end_fishing:go_fish/bobber_animation_clock 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/fish_particle_clock.mcfunction ================================================ # @s = none # run from go_fish/summon_fish_particle execute as @e[type=marker,tag=gm4_ef_particle] at @s run function gm4_end_fishing:go_fish/move_fish_particle execute if entity @e[type=marker,tag=gm4_ef_particle,limit=1] run schedule function gm4_end_fishing:go_fish/fish_particle_clock 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/move_fish_particle.mcfunction ================================================ # @s = fish particle marker # run from go_fish/fish_particle_clock particle minecraft:dragon_breath ~ ~ ~ 0 0 0 0.02 1 tp @s ^ ^ ^0.1 scoreboard players add @s gm4_ef_data 1 kill @s[scores={gm4_ef_data=32..}] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/summon_fish_particle.mcfunction ================================================ # @s = fishing bait armor stand that is nearly ready to be reeled in # run from process summon marker ~ ~ ~ {Tags:["gm4_ef_particle_new","gm4_ef_particle"]} execute store result score $rand gm4_ef_data run data get entity @e[type=marker,tag=gm4_ef_particle_new,limit=1] UUID[0] scoreboard players operation $rand gm4_ef_data %= #4 gm4_ef_data execute if score $rand gm4_ef_data matches 0 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~ ~ ~3 facing entity @s eyes execute if score $rand gm4_ef_data matches 1 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~ ~ ~-3 facing entity @s eyes execute if score $rand gm4_ef_data matches 2 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~3 ~ ~ facing entity @s eyes execute if score $rand gm4_ef_data matches 3 run tp @e[type=marker,tag=gm4_ef_particle_new,limit=1] ~-3 ~ ~ facing entity @s eyes tag @e[type=marker,tag=gm4_ef_particle] remove gm4_ef_particle_new scoreboard players reset $rand gm4_ef_data schedule function gm4_end_fishing:go_fish/fish_particle_clock 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/go_fish/update_bobber.mcfunction ================================================ # @s = none # run from cast_rod/marker and go_fish/bobber_animation scoreboard players add @e[type=armor_stand,tag=gm4_ef_bobber_update] gm4_ef_data 1 kill @e[type=armor_stand,tag=gm4_ef_bobber_update,scores={gm4_ef_data=2..}] execute if entity @e[type=armor_stand,tag=gm4_ef_bobber_update,limit=1] run schedule function gm4_end_fishing:go_fish/update_bobber 1t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/init.mcfunction ================================================ scoreboard objectives add gm4_cast_rod minecraft.used:minecraft.fishing_rod scoreboard objectives add gm4_ef_timer dummy scoreboard objectives add gm4_ef_id dummy scoreboard objectives add gm4_ef_lure dummy scoreboard objectives add gm4_ef_data dummy scoreboard objectives add gm4_ef_up_bait dummy scoreboard objectives add gm4_ef_fall dummy scoreboard objectives add gm4_ef_sneak minecraft.custom:minecraft.sneak_time # scoreboard objectives add gm4_ef_jump minecraft.custom:minecraft.jump scoreboard players set #100 gm4_ef_data 100 scoreboard players set #6 gm4_ef_data 6 scoreboard players set #57 gm4_ef_data 57 scoreboard players set #4 gm4_ef_data 4 scoreboard players set #64 gm4_ef_data 64 scoreboard players set #10000 gm4_ef_data 10000 execute unless score end_fishing gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"End Fishing"} execute unless score end_fishing gm4_earliest_version < end_fishing gm4_modules run scoreboard players operation end_fishing gm4_earliest_version = end_fishing gm4_modules scoreboard players set end_fishing gm4_modules 1 schedule function gm4_end_fishing:main 1t schedule function gm4_end_fishing:tick 1t #$moduleUpdateList ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/main.mcfunction ================================================ execute as @e[type=minecraft:armor_stand,tag=gm4_end_fishing_bait] at @s run function gm4_end_fishing:process # enderpuff mechanics execute as @a[tag=gm4_enderpuff_levitation,tag=!gm4_has_enderpuff] at @s run function gm4_end_fishing:enderpuff/clear_levitation execute as @a[tag=gm4_has_enderpuff] at @s run function gm4_end_fishing:enderpuff/process effect give @a[tag=gm4_ef_fall] slow_falling 1 0 tag @a[tag=gm4_ef_fall,predicate=!gm4_end_fishing:on_ground] remove gm4_ef_fall schedule function gm4_end_fishing:main 16t ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/process.mcfunction ================================================ # @s = fishing bait armor stand # run from main # timer and loot scoreboard players remove @s[scores={gm4_ef_timer=0..}] gm4_ef_timer 1 execute if score @s gm4_ef_timer matches 2 run function gm4_end_fishing:go_fish/summon_fish_particle tag @s[scores={gm4_ef_timer=0}] remove gm4_end_fishing_bait tag @s[scores={gm4_ef_timer=0}] add gm4_ef_has_fish execute if score @s gm4_ef_timer matches 0 run schedule function gm4_end_fishing:go_fish/bobber_animation_clock 1t # particle execute at @e[type=minecraft:fishing_bobber,limit=1,distance=..0.0001] run particle minecraft:end_rod ~ ~ ~ 0 0 0 .02 1 force scoreboard players add @s gm4_ef_up_bait 1 execute if score @s gm4_ef_up_bait matches 2.. run function gm4_end_fishing:cast_rod/update_bait ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/move_marker.mcfunction ================================================ # @s = marker to spawn item loot # run from reel_in/reel_loot scoreboard players add @s gm4_ef_data 1 tp @s ^ ^ ^0.5 execute at @s if block ^ ^ ^0.5 #gm4:no_collision unless score @s gm4_ef_data matches 100.. unless entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] run function gm4_end_fishing:reel_in/move_marker ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/reel_loot.mcfunction ================================================ # @s = player who reeled in the armor stand # run from advancement "reel_loot" advancement revoke @s only gm4_end_fishing:reel_loot advancement grant @s only gm4:end_fishing tag @s add gm4_ef_reel_loot tag @s add gm4_ef_looted execute if items entity @s weapon.mainhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_mainhand execute unless items entity @s weapon.mainhand minecraft:fishing_rod if items entity @s weapon.offhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_offhand scoreboard players operation $current gm4_ef_id = @s gm4_ef_id execute as @e[type=armor_stand,tag=gm4_ef_has_fish] if score @s gm4_ef_id = $current gm4_ef_id run tag @s add gm4_ef_reeled_in execute at @e[type=armor_stand,tag=gm4_ef_reeled_in] run summon marker ~ ~ ~ {Tags:["gm4_ef_loot"]} execute as @e[type=marker,tag=gm4_ef_loot] at @s run function gm4_end_fishing:reel_in/set_marker_pos execute if entity @s[tag=gm4_ef_durability_main] at @e[type=marker,tag=gm4_ef_loot] run loot spawn ^ ^ ^1 fish gm4_end_fishing:gameplay/fishing ~ ~ ~ mainhand execute if entity @s[tag=gm4_ef_durability_off] at @e[type=marker,tag=gm4_ef_loot] run loot spawn ^ ^ ^1 fish gm4_end_fishing:gameplay/fishing ~ ~ ~ offhand execute as @e[type=item] if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{type:"entity"}}}] run function gm4_end_fishing:reel_in/summon_entity summon minecraft:experience_orb ~ ~ ~ {Tags:["gm4_ef_set_orb"]} execute store result score $value gm4_ef_data run data get entity @e[type=experience_orb,tag=gm4_ef_set_orb,limit=1] UUID[0] scoreboard players operation $value gm4_ef_data %= #6 gm4_ef_data scoreboard players add $value gm4_ef_data 2 execute store result entity @e[type=experience_orb,tag=gm4_ef_set_orb,limit=1] Value int 1 run scoreboard players get $value gm4_ef_data # clean up tag @e[type=experience_orb] remove gm4_ef_set_orb scoreboard players reset $value gm4_ef_data tag @s remove gm4_ef_reel_loot kill @e[type=marker,tag=gm4_ef_loot] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/reel_rod.mcfunction ================================================ # @s = player who reeled in the armor stand # run from advancement "reel_rod" advancement revoke @s only gm4_end_fishing:reel_rod execute if entity @s[gamemode=!creative] if items entity @s weapon.mainhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_mainhand execute if entity @s[gamemode=!creative] unless items entity @s weapon.mainhand minecraft:fishing_rod if items entity @s weapon.offhand minecraft:fishing_rod run function gm4_end_fishing:durability/prep_offhand ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/set_marker_pos.mcfunction ================================================ # @s = marker to spawn item loot # run from reel_in/reel_loot tp @s ~ ~ ~ facing entity @a[tag=gm4_ef_reel_loot,limit=1] eyes function gm4_end_fishing:reel_in/move_marker execute at @s if entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] if block ^ ^ ^0.5 #gm4:no_collision run tp @s ^ ^ ^0.5 execute at @s if entity @a[distance=..2,tag=gm4_ef_reel_loot,limit=1] if block ^ ^ ^0.5 #gm4:no_collision run tp @s ^ ^ ^0.5 ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/spawn_phantom.mcfunction ================================================ # @s = item that is to summon a phantom # run from reel_in/summon_entity execute as @e[type=marker,tag=gm4_ef_loot,limit=1] at @s run summon phantom ^ ^ ^-1 {Health:26f,size:3,attributes:[{id:"minecraft:max_health",base:26}],Tags:["gm4_end_phantom"],DeathLootTable:"gm4_end_fishing:entities/end_phantom"} advancement grant @a[tag=gm4_ef_reel_loot,limit=1] only gm4:end_fishing_phantom ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/reel_in/summon_entity.mcfunction ================================================ # @s = item that is to summon a special entity # run from reel_in/set_data execute if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{id:"end_phantom"}}}] run function gm4_end_fishing:reel_in/spawn_phantom execute if items entity @s contents *[custom_data~{gm4_end_fishing:{set_data:{id:"endermite"}}}] as @e[type=marker,tag=gm4_ef_loot,limit=1] at @s run summon endermite ^ ^ ^1 {DeathLootTable:"gm4_end_fishing:entities/endermite"} kill @s ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/set_id.mcfunction ================================================ # @s = player who joined for the first time # run from advancement "set_id" execute store result score @s gm4_ef_id run data get entity @s UUID[0] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/function/tick.mcfunction ================================================ schedule function gm4_end_fishing:tick 1t # catch fishing bobber in the end execute in minecraft:the_end as @e[type=minecraft:fishing_bobber,tag=!smithed.entity,tag=!gm4_ef_casted,x_rotation=-90..-85,x=0] at @s positioned ~ ~-5 ~ run function gm4_end_fishing:cast_rod/summon_bait # store bobber data execute in minecraft:the_end as @e[type=minecraft:fishing_bobber,tag=!smithed.entity,tag=!gm4_ef_set,x=0] at @s run function gm4_end_fishing:cast_rod/store_data # reset cast rod score scoreboard players reset @a gm4_cast_rod # enderpuff slow falling tag @a[tag=!gm4_has_enderpuff] remove gm4_ef_fall tag @a[predicate=!gm4_end_fishing:slow_falling] remove gm4_ef_fall execute as @a[tag=gm4_has_enderpuff,tag=!gm4_ef_fall,predicate=gm4_end_fishing:slow_falling] run function gm4_end_fishing:enderpuff/apply_slow_falling scoreboard players reset @a gm4_ef_sneak ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/guidebook/end_fishing.json ================================================ { "id": "end_fishing", "name": "End Fishing", "module_type": "module", "icon": { "id": "minecraft:fishing_rod" }, "criteria": { "enter_end_gateway": { "trigger": "minecraft:enter_block", "conditions": { "player": [ { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:the_end" } } ], "block": "minecraft:end_gateway" } }, "fish_phantom": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:end_fishing_phantom": true } } } } ] } } }, "sections": [ { "name": "void_fishing", "enable": [], "requirements": [ [ "enter_end_gateway" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.end_fishing.description", "fallback": "Casting a fishing rod into the end void will allow one to fish up loot from the void.\n\nLoot is biome dependent." } ] ] }, { "name": "end_phantoms", "enable": [], "requirements": [ [ "fish_phantom" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.end_fishing.end_phantom", "fallback": "End Phantoms can be fished up from the end void.\n\nThey are larger and stronger than normal phantoms, but have a chance to drop a broken elytra upon death." } ] ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/item_modifier/apply_damage.json ================================================ [ { "function": "minecraft:set_damage", "damage": -0.015625, "add": true, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:binomial", "n": 1, "p": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$unbreaking" }, "score": "gm4_ef_data", "scale": 0.01 } }, "range": 1 } ] } ] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/item_modifier/prepare_rod.json ================================================ [ { "function": "minecraft:set_damage", "damage": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$durability" }, "score": "gm4_ef_data", "scale": 0.0001 }, "add": false } ] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/entities/end_phantom.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "functions": [ { "function": "set_count", "count": { "min": 0, "max": 1 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ], "name": "minecraft:phantom_membrane" } ], "conditions": [ { "condition": "minecraft:killed_by_player" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:items/ravaged_wings" } ], "conditions": [ { "condition": "minecraft:killed_by_player" }, { "condition": "minecraft:random_chance_with_enchanted_bonus", "enchantment": "minecraft:looting", "unenchanted_chance": 0.2, "enchanted_chance": { "type": "minecraft:linear", "base": 0.215, "per_level_above_first": 0.015 } } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/entities/endermite.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "functions": [ { "function": "set_count", "count": { "min": 0, "max": 1 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ], "name": "minecraft:ender_pearl" } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/debris.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:ender_pearl", "weight": 50 }, { "type": "minecraft:item", "name": "minecraft:end_stone", "weight": 25 }, { "type": "minecraft:item", "name": "minecraft:end_rod", "weight": 1 }, { "type": "minecraft:item", "name": "minecraft:chorus_fruit", "weight": 4 }, { "type": "minecraft:item", "name": "minecraft:chorus_flower", "weight": 2 }, { "type": "minecraft:item", "name": "minecraft:chorus_fruit", "weight": 40, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:high" } } ] }, { "type": "minecraft:item", "name": "minecraft:iron_bars", "weight": 10, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:center" } } ] }, { "type": "minecraft:item", "name": "minecraft:end_rod", "weight": 14, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] }, { "type": "minecraft:item", "name": "minecraft:chorus_flower", "weight": 35, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:high" } } ] }, { "type": "minecraft:item", "name": "minecraft:ender_pearl", "weight": 10, "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{set_data:{type:'entity',id:'endermite'}}}" } ] }, { "type": "minecraft:item", "name": "minecraft:ender_pearl", "weight": 10, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:barrens" } } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{set_data:{type:'entity',id:'endermite'}}}" } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/armor/generate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.1", "fallback": "Lost on End City moving day", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_1"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.2", "fallback": "Forged by Seppo Ilmarinen", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_2"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.3", "fallback": "Belongs to Achilles", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_3"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.4", "fallback": "Made by Wayland the Smith", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_4"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.5", "fallback": "Worn during the battle of Ender Ender", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_5"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.6.1", "fallback": "This thing's been rotting in", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_armor.6.2", "fallback": "the void for at least a century.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_6"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.7", "fallback": "Passed down over many generations", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_7"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.8", "fallback": "Wear this to become invisible to nobody!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_8"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.9.1", "fallback": "I promise you can fly while wearing this.", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_armor.9.2", "fallback": "Trust me, just jump into the void.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_9"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_armor.10.1", "fallback": "With this you shall be immortal!", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_armor.10.2", "fallback": "Or is it immoral? I can't remember.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_armor_10"]} } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/armor/type.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:diamond_boots" }, { "type": "minecraft:item", "name": "minecraft:diamond_chestplate" }, { "type": "minecraft:item", "name": "minecraft:diamond_leggings" }, { "type": "minecraft:item", "name": "minecraft:diamond_helmet" }, { "type": "minecraft:item", "name": "minecraft:iron_boots" }, { "type": "minecraft:item", "name": "minecraft:iron_chestplate" }, { "type": "minecraft:item", "name": "minecraft:iron_leggings" }, { "type": "minecraft:item", "name": "minecraft:iron_helmet" } ], "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 20, "max": 39, "type": "minecraft:uniform" }, "options": "#minecraft:on_random_loot" }, { "function": "minecraft:set_damage", "damage": { "min": 0.4, "max": 0.7 } } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/base.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:beetroot_seeds", "weight": 15 }, { "type": "minecraft:item", "name": "minecraft:saddle", "weight": 6 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/generate", "weight": 40 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/armor/generate", "weight": 160 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/generate", "weight": 80 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/generate", "weight": 65 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/generate", "weight": 3 } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/horse_armor/generate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_horse_armor.1", "fallback": "That's some good barding!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_horse_armor_1"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_horse_armor.2.1", "fallback": "There's a horse somewhere", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_horse_armor.2.2", "fallback": "that lost this armour.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_horse_armor_2"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_horse_armor.3.1", "fallback": "Floating horses must be", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_horse_armor.3.2", "fallback": "a thing somewhere, right?", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_horse_armor_3"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_horse_armor.4", "fallback": "Too bad there's no horse weapons.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_horse_armor_4"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/horse_armor/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_horse_armor.5", "fallback": "Made with the finest materials known to man", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_horse_armor_5"]} } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/horse_armor/type.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:iron_horse_armor" }, { "type": "minecraft:item", "name": "minecraft:golden_horse_armor" }, { "type": "minecraft:item", "name": "minecraft:diamond_horse_armor" } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/ore/generate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.1", "fallback": "The riches of the vast void", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_1"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.2", "fallback": "Dropped from a nearby End City", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_2"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.3", "fallback": "There's so much treasure down there!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_3"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.4", "fallback": "Cursed by the ancient Goddess", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_4"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.5", "fallback": "This isn't real. It's fake treasure.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_5"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/ore/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_ore.6", "fallback": "Cha-Ching! We're going to be rich!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_ore_6"]} } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/ore/type.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:diamond", "weight": 8 }, { "type": "minecraft:item", "name": "minecraft:iron_ingot", "weight": 20 }, { "type": "minecraft:item", "name": "minecraft:gold_ingot", "weight": 25 }, { "type": "minecraft:item", "name": "minecraft:emerald", "weight": 12 } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/sword/generate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.1", "fallback": "Forged in a dragon's breath", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_1"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:1b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.2.1", "fallback": "Life kills life all the time, so the Goddess", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_sword.2.2", "fallback": "sacrifices herself for her own animal.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_2"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:2b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.3", "fallback": "Blessed with Hylia's power", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_3"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:3b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.4", "fallback": "Forged by Muramasa", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_4"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:4b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.5", "fallback": "Powered by the living crystal within", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_5"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:5b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.6", "fallback": "Used to decapitate the Gorgon, Medusa", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_6"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:6b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.7.1", "fallback": "This is believed to be one of the", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_sword.7.2", "fallback": "finest Japanese swords ever made.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_7"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:7b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.8", "fallback": "Used at the Battle of the Trench", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_8"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:8b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.9", "fallback": "Removed from the Garden of Eden", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_9"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:9b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.10", "fallback": "Used to kill the dragon Fafnir", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_10"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:10b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.11", "fallback": "Snicker-snack!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_11"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:11b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.12.1", "fallback": "Created by husband and wife magicians", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_sword.12.2", "fallback": "of the ancient Bön tradition", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_12"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:12b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.13", "fallback": "Belongs to Roland", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_13"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:13b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.14.1", "fallback": "If found, please return", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_sword.14.2", "fallback": "to William Wallace.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_14"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:14b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.15", "fallback": "Reforged from the shards of Narsil", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_15"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:15b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.16", "fallback": "Forged by the Iron Sisters", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_16"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:16b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.17.1", "fallback": "Used to lead the revolutionary", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_sword.17.2", "fallback": "army against the Telmarines", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_17"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:17b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.18", "fallback": "Can only be wielded by a true Gryffindor", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_18"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:18b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.19", "fallback": "Sought by Thrax", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_19"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:19b}}" } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/sword/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_sword.20", "fallback": "Wielded by Lion-O", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_swords_20"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{end_city_sword:20b}}" } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/sword/type.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:diamond_sword" }, { "type": "minecraft:item", "name": "minecraft:iron_sword" } ], "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 20, "max": 39, "type": "minecraft:uniform" }, "options": "#minecraft:on_random_loot" }, { "function": "minecraft:set_damage", "damage": { "min": 0.4, "max": 0.7 } } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/tool/generate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.1.1", "fallback": "It's been said only those", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.1.2", "fallback": "who are worthy can wield this tool.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_1"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.2.1", "fallback": "Once there was a man named", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.2.2", "fallback": "Tubal-cain who made this tool.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_2"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.3", "fallback": "If found, please return to Hephaestus.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_3"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.4.1", "fallback": "This is actually a really hard", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.4.2", "fallback": "piece of bread. Don't tell anyone.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_4"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.5", "fallback": "Found in the Valley of the Fallen Kings", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_5"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.6.1", "fallback": "Throw it. Maybe it'll come back!", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.6.2", "fallback": "No, it's not a hammer, sadly.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_6"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.7", "fallback": "Thunk, Thunk, Thunk!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_7"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.8.1", "fallback": "Forged by the Leader of", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.8.2", "fallback": "the Endermen Rebellion", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_8"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.9", "fallback": "It's not a very good shield.", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_9"]} } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/tool/type", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_city_tool.10.1", "fallback": "Where'd you find this? It's been", "color": "dark_gray", "italic": true }, { "translate": "text.gm4.end_city_tool.10.2", "fallback": "floating in the end for over a decade!", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/end_city_tools_10"]} } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/end_city_treasure/tool/type.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:diamond_pickaxe" }, { "type": "minecraft:item", "name": "minecraft:diamond_shovel" }, { "type": "minecraft:item", "name": "minecraft:iron_pickaxe" }, { "type": "minecraft:item", "name": "minecraft:iron_shovel" } ], "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 20, "max": 39, "type": "minecraft:uniform" }, "options": "#minecraft:on_random_loot" }, { "function": "minecraft:set_damage", "damage": { "min": 0.4, "max": 0.7 } } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/scattered_treasure.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:shulker_shell", "weight": 10 }, { "type": "minecraft:item", "name": "minecraft:dragon_head", "weight": 5 }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:items/enderpuff", "weight": 1 }, { "type": "minecraft:item", "name": "minecraft:end_crystal", "weight": 40, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:center" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:items/enderpuff", "weight": 11, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:outer" } } ] }, { "type": "minecraft:item", "name": "minecraft:dragon_head", "weight": 75, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:items/captains_wings", "weight": 1, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:items/captains_wings", "weight": 2, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:nullscape/crystal_peaks" } } ] }, { "type": "minecraft:item", "name": "minecraft:shulker_shell", "weight": 110, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fish/valuables.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/base", "weight": 10 }, { "type": "minecraft:item", "name": "minecraft:shulker_shell", "weight": 40, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] }, { "type": "minecraft:item", "name": "minecraft:phantom_membrane", "weight": 20 }, { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "minecraft:crying_obsidian", "weight": 8, "conditions": [ { "condition": "location_check", "predicate": { "biomes": "#gm4_end_fishing:nullscape/crystal_peaks" } } ] }, { "type": "minecraft:item", "name": "minecraft:obsidian", "weight": 1 } ] }, { "type": "minecraft:item", "name": "minecraft:amethyst_block", "weight": 16, "conditions": [ { "condition": "location_check", "predicate": { "biomes": "#gm4_end_fishing:nullscape/crystal_peaks" } } ] }, { "type": "minecraft:item", "name": "minecraft:ender_pearl", "weight": 10, "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{set_data:{type:'entity',id:'end_phantom'}}}" } ] }, { "type": "minecraft:item", "name": "minecraft:dragon_breath", "weight": 20, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:center" } } ] }, { "type": "minecraft:item", "name": "minecraft:obsidian", "weight": 44, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:center" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_end_fishing:gameplay/fish/end_city_treasure/base", "weight": 20, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:mid_high" } } ] }, { "type": "minecraft:item", "name": "minecraft:ender_pearl", "weight": 15, "conditions": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_end_fishing:barrens" } } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{set_data:{type:'entity',id:'end_phantom'}}}" } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/gameplay/fishing.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "loot_table", "value": "gm4_end_fishing:gameplay/fish/debris", "weight": 60, "quality": -1 }, { "type": "loot_table", "value": "gm4_end_fishing:gameplay/fish/valuables", "weight": 33, "quality": 1 }, { "type": "loot_table", "value": "gm4_end_fishing:gameplay/fish/scattered_treasure", "weight": 7, "quality": 5 } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/items/captains_wings.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:elytra", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/captains_wings"]} } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.end_ship_elytra.10.1", "fallback": "Nobody imagined the Captain's lost", "italic": false, "color": "dark_gray" }, { "translate": "text.gm4.end_ship_elytra.10.2", "fallback": "wings would be seen again, ever.", "italic": false, "color": "dark_gray" } ] }, { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.005 } } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/items/enderpuff.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:poisonous_potato", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.enderpuff", "fallback": "Enderpuff" } }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/enderpuff"]}, "minecraft:profile": "$enderpuff", "minecraft:item_model": "minecraft:player_head", "!minecraft:consumable": {} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_end_fishing:{enderpuff:1b}}" } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/loot_table/items/ravaged_wings.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:elytra", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_end_fishing:item/ravaged_wings"]} } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.end_fishing.ravaged_wings", "fallback": "Ravaged Wings" } }, { "function": "minecraft:set_damage", "damage": 0 } ] } ] } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/predicate/carries_enderpuff.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "player.cursor": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "player.crafting.*": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/predicate/holding_enderpuff.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "items": "#gm4_end_fishing:enderpuff", "predicates": { "minecraft:custom_data": "{gm4_end_fishing:{enderpuff:1b}}" } } } } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/predicate/holding_fishing_rod.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "minecraft:fishing_rod" } } } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/predicate/on_ground.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_on_ground": true } } } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/predicate/slow_falling.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{FallFlying:0b}", "stepping_on": { "block": { "blocks": "#gm4:no_collision" } }, "flags": { "is_sneaking": false } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_ef_sneak": { "min": 1 } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{FallFlying:1b}", "stepping_on": { "block": { "blocks": "#gm4:no_collision" } } } } } ] } } ] } ] ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/item/enderpuff.json ================================================ { "values": [ "minecraft:player_head", "minecraft:poisonous_potato" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/barrens.json ================================================ { "values": [ "minecraft:end_barrens", "minecraft:small_end_islands", "#gm4_end_fishing:nullscape/void_barrens" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/center.json ================================================ { "values": [ "minecraft:the_end" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/high.json ================================================ { "values": [ "minecraft:end_highlands" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/mid.json ================================================ { "values": [ "minecraft:end_midlands", "#gm4_end_fishing:nullscape/shadowlands" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/mid_high.json ================================================ { "values": [ "#gm4_end_fishing:mid", "#gm4_end_fishing:high" ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/crystal_peaks.json ================================================ { "values": [ { "id": "nullscape:crystal_peaks", "required": false } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/shadowlands.json ================================================ { "values": [ { "id": "nullscape:shadowlands", "required": false } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/nullscape/void_barrens.json ================================================ { "values": [ { "id": "nullscape:void_barrens", "required": false } ] } ================================================ FILE: gm4_end_fishing/data/gm4_end_fishing/tags/worldgen/biome/outer.json ================================================ { "values": [ "#gm4_end_fishing:barrens", "#gm4_end_fishing:mid", "#gm4_end_fishing:high" ] } ================================================ FILE: gm4_end_fishing/generate_optifine.py ================================================ from beet import Context from beet.contrib.optifine import OptifineProperties from itertools import product def beet_default(ctx: Context): """generates the .properties files needed for optifine retextured armor""" for material, i, part in product(["diamond", "iron", "netherite"], range(1,10+1), ["boots", "leggings", "chestplate", "helmet"]): ctx.assets[OptifineProperties][f"gm4_end_fishing:cit/{material}_{part}_{i}"] = OptifineProperties("\n".join([ "type=armor", f"matchItems={material}_{part}", f"texture.{material}_layer_{1+(part=='leggings')}={material}_{i}_layer_{1+(part=='leggings')}", f"nbt.CustomModelData=$item/end_city_armor_{i}" ])) ================================================ FILE: gm4_end_fishing/register_model_data.py ================================================ from beet import Context, Model from itertools import product MATERIALS = ["diamond", "iron", "netherite"] ARMORS = ["helmet", "chestplate", "leggings", "boots"] TOOLS = ["pickaxe", "shovel"] ORES = ["diamond", "emerald", "gold_ingot", "iron_ingot"] def beet_default(ctx: Context): """Registered repetitive model_data config options for fishable items""" model_data_reg = ctx.meta["gm4"].setdefault("model_data", []) for i in range(1,10+1): item_models: dict[str,str] = {} for material, armor in product(MATERIALS, ARMORS): ctx.assets.models[f"gm4_end_fishing:item/armor/{material}_{armor}_{i}"] = Model({ "parent": "item/generated", "textures": { "layer0": f"gm4_end_fishing:item/armor/{material}_{armor}_{i}" } }) item_models.update({f"{material}_{armor}": f"item/armor/{material}_{armor}_{i}"}) model_data_reg.append({ "item": list(item_models.keys()), "model": item_models, "reference": f"item/end_city_armor_{i}" }) for i in range(1,10+1): item_models = {} for material, tool in product(MATERIALS, TOOLS): ctx.assets.models[f"gm4_end_fishing:item/tools/{material}_{tool}_{i}"] = Model({ "parent": "item/handheld", "textures": { "layer0": f"gm4_end_fishing:item/tools/{material}_{tool}_{i}" } }) item_models.update({f"{material}_{tool}": f"item/tools/{material}_{tool}_{i}"}) model_data_reg.append({ "item": list(item_models.keys()), "model": item_models, "reference": f"item/end_city_tools_{i}" }) for i in range(1,20+1): item_models = {} for material in MATERIALS: # item models have custom tuning, and are specified in source item_models.update({f"{material}_sword": f"item/swords/{material}_sword_{i}"}) model_data_reg.append({ "item": list(item_models.keys()), "model": item_models, "reference": f"item/end_city_swords_{i}", "template": "custom" }) for i in range(1,5+1): item_models = {} for material in ["diamond", "golden", "iron"]: ctx.assets.models[f"gm4_end_fishing:item/horse_armor/{material}_horse_armor_{i}"] = Model({ "parent": f"minecraft:item/{material}_horse_armor" }) item_models.update({f"{material}_horse_armor": f"item/horse_armor/{material}_horse_armor_{i}"}) model_data_reg.append({ "item": list(item_models.keys()), "model": item_models, "reference": f"item/end_city_horse_armor_{i}", }) for i in range(1,6+1): item_models = {} for ore in ORES: ctx.assets.models[f"gm4_end_fishing:item/ores/{ore}_{i}"] = Model({ "parent": "item/generated", "textures":{ "layer0": f"gm4_end_fishing:item/ores/end_{ore}" } }) item_models.update({ore: f"item/ores/{ore}_{i}"}) model_data_reg.append({ "item": ORES, "model": item_models, "reference": f"item/end_city_ore_{i}", }) ================================================ FILE: gm4_ender_hoppers/README.md ================================================ # Ender Hoppers Hoppers now have a larger range and teleport items to them! Creation of an Ender Hopper and it sucking in items ### Features - Creates a 9x9 area centered on the hopper where items can be teleported in - Adds an Ender Hopper on rails, for mobile item collection device - The hopper is disabled when a redstone signal is applied ================================================ FILE: gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper.json ================================================ { "textures": { "side": "gm4_ender_hoppers:block/ender_hopper_eye_side", "top": "gm4_ender_hoppers:block/ender_hopper_eye_top", "bottom": "gm4_ender_hoppers:block/ender_hopper_eye_bottom", "particle": "gm4_ender_hoppers:block/ender_hopper_eye_side" }, "elements": [ { "from": [4, 11, 4], "to": [12, 19, 12], "faces": { "north": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "north"}, "east": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "east"}, "south": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "west"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"} } } ] } ================================================ FILE: gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper_minecart.json ================================================ { "textures": { "side": "gm4_ender_hoppers:block/ender_hopper_eye_side", "top": "gm4_ender_hoppers:block/ender_hopper_eye_top", "bottom": "gm4_ender_hoppers:block/ender_hopper_eye_bottom", "particle": "gm4_ender_hoppers:block/ender_hopper_eye_side" }, "elements": [ { "from": [4, 11, 4], "to": [12, 19, 12], "faces": { "north": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "north"}, "east": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "east"}, "south": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "west"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"} } } ] } ================================================ FILE: gm4_ender_hoppers/assets/gm4_ender_hoppers/models/block/ender_hopper_side.json ================================================ { "textures": { "side": "gm4_ender_hoppers:block/ender_hopper_eye_side", "top": "gm4_ender_hoppers:block/ender_hopper_eye_top", "bottom": "gm4_ender_hoppers:block/ender_hopper_eye_bottom", "particle": "gm4_ender_hoppers:block/ender_hopper_eye_side" }, "elements": [ { "from": [4, 11, 4], "to": [12, 19, 12], "faces": { "north": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "north"}, "east": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "east"}, "south": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "west"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"} } } ] } ================================================ FILE: gm4_ender_hoppers/assets/gm4_ender_hoppers/models/item/ender_hopper_full.json ================================================ { "parent": "minecraft:block/block", "ambientocclusion": false, "textures": { "particle": "minecraft:block/hopper_outside", "top": "minecraft:block/hopper_top", "side": "minecraft:block/hopper_outside", "inside": "minecraft:block/hopper_inside", "5": "gm4_ender_hoppers:block/ender_hopper_eye_side", "6": "gm4_ender_hoppers:block/ender_hopper_eye_top" }, "elements": [ { "from": [ 0, 10, 0 ], "to": [ 16, 11, 16 ], "faces": { "down": { "texture": "#side" }, "up": { "texture": "#inside", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "west" }, "east": { "texture": "#side", "cullface": "east" } } }, { "from": [ 0, 11, 0 ], "to": [ 2, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "west" }, "east": { "texture": "#side", "cullface": "up" } } }, { "from": [ 14, 11, 0 ], "to": [ 16, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "up" }, "east": { "texture": "#side", "cullface": "east" } } }, { "from": [ 2, 11, 0 ], "to": [ 14, 16, 2 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "up" } } }, { "from": [ 2, 11, 14 ], "to": [ 14, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "up" }, "south": { "texture": "#side", "cullface": "south" } } }, { "from": [ 4, 4, 4 ], "to": [ 12, 10, 12 ], "faces": { "down": { "texture": "#side" }, "north": { "texture": "#side" }, "south": { "texture": "#side" }, "west": { "texture": "#side" }, "east": { "texture": "#side" } } }, { "from": [ 6, 0, 6 ], "to": [ 10, 4, 10 ], "faces": { "down": { "texture": "#side", "cullface": "down" }, "north": { "texture": "#side" }, "south": { "texture": "#side" }, "west": { "texture": "#side" }, "east": { "texture": "#side" } } }, { "from": [ 4, 11, 4 ], "to": [ 12, 19, 12 ], "rotation": { "angle": 0, "axis": "y", "origin": [ 4.5, 10.5, 4.5 ] }, "faces": { "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#5" }, "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#5" }, "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#5" }, "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#5" }, "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#6" } } } ] } ================================================ FILE: gm4_ender_hoppers/assets/translations.csv ================================================ key,en_us item.gm4.ender_hopper_minecart,Minecart with Ender Hopper block.gm4.ender_hopper,Ender Hopper container.gm4.ender_hopper,Ender Hopper container.gm4.ender_hopper_minecart,Minecart with Ender Hopper text.gm4.guidebook.module_desc.ender_hoppers,Create special hoppers that teleport nearby items to them. text.gm4.guidebook.ender_hoppers.description,"Ender Hoppers teleport items to itself, even through walls.\n\nThey can also be combined with a minecart to create an Ender Hopper Minecart." text.gm4.guidebook.ender_hoppers.crafting,Ender Hoppers can be crafted in a crafting table: text.gm4.guidebook.ender_hoppers.usage,"Ender Hoppers can pick up items in a range of 9x9 blocks, centered at itself and extending 3 blocks above itself.\n\nCombining a minecart with an ender hopper yields an ender hopper minecart." ================================================ FILE: gm4_ender_hoppers/beet.yaml ================================================ id: gm4_ender_hoppers name: Ender Hoppers version: 1.9.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: [main] model_data: - item: hopper_minecart reference: item/ender_hopper_minecart template: generated - item: player_head broadcast: - reference: block/ender_hopper - reference: block/ender_hopper_side - reference: block/ender_hopper_minecart template: custom transforms: - name: item_display origin: [0.5,0.5,0.5] scale: [0.83,0.83,0.83] translation: [0,0.641,0] display: head - item: player_head reference: item/ender_hopper model: item/ender_hopper_full gui_fonts: - translation: gui.gm4.ender_hopper container: hopper texture: gui/container/ender_hopper - translation: gui.gm4.ender_hopper_minecart container: hopper texture: gui/container/ender_hopper website: description: Create special hoppers that teleport nearby items to them. recommended: - gm4_resource_pack - gm4_standard_crafting - gm4_enchantment_extractors - gm4_forming_press - gm4_block_compressors - gm4_disassemblers - gm4_tunnel_bores - gm4_boots_of_ostara - gm4_heart_canisters - gm4_smelteries - gm4_liquid_tanks notes: [] modrinth: project_id: dB4zrtK8 video: https://www.youtube.com/watch?v=wrwg4BDgEGU wiki: https://wiki.gm4.co/wiki/Ender_Hoppers credits: Creator: - Elemend Updated by: - Misode - BPR Textures by: - Kyrius Icon Design: - Sparks ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/advancement/recipes/ender_hopper.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_ender_hoppers:ender_hopper" } }, "has_the_minecart_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_ender_hoppers:ender_hopper_minecart" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:ender_eye", "minecraft:respawn_anchor", "minecraft:hopper" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_the_minecart_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_ender_hoppers:ender_hopper", "gm4_ender_hoppers:ender_hopper_minecart" ] } } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/init.mcfunction ================================================ execute unless score ender_hoppers gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Ender Hoppers"} execute unless score ender_hoppers gm4_earliest_version < ender_hoppers gm4_modules run scoreboard players operation ender_hoppers gm4_earliest_version = ender_hoppers gm4_modules scoreboard players set ender_hoppers gm4_modules 1 schedule function gm4_ender_hoppers:main 1t #$moduleUpdateList ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/create.mcfunction ================================================ # places the ender_hopper down # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/verify_place_down # place block depending on face_placement execute if score $face_placement gm4_machine_data matches 1..2 run function gm4_ender_hoppers:machine/rotate/down execute if score $face_placement gm4_machine_data matches 3 run function gm4_ender_hoppers:machine/rotate/south execute if score $face_placement gm4_machine_data matches 4 run function gm4_ender_hoppers:machine/rotate/west execute if score $face_placement gm4_machine_data matches 5 run function gm4_ender_hoppers:machine/rotate/north execute if score $face_placement gm4_machine_data matches 6 run function gm4_ender_hoppers:machine/rotate/east # mark block as placed particle large_smoke ~ ~ ~ 0.2 0.2 0.2 0 10 playsound minecraft:block.respawn_anchor.charge block @a[distance=..5] ~ ~ ~ 0.3 0.7 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/create_cart.mcfunction ================================================ # places the ender_hopper_minecart down # @s = hopper_minecart with the ender_hopper_minecart name # located at @s # run from gm4_ender_hoppers:machine/verify_place_cart scoreboard players set $placed_block gm4_machine_data 1 # summon new hopper minecart summon hopper_minecart ~ ~ ~ {Tags:["gm4_ender_hopper_minecart_new","gm4_new_machine"],Passengers:[{id:"minecraft:item_display",CustomName:"gm4_ender_hopper_display",Tags:["gm4_no_edit","gm4_ender_hopper_display","gm4_machine_cart","smithed.entity","smithed.strict","gm4_new_machine"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper_minecart"]},"minecraft:profile":"$ender_hopper_display"}},item_display:"head",transformation:{scale:[0.83,0.83,0.83],right_rotation:[0,0,0,1],left_rotation:[0,0,0,1],translation:[0.0,0.7275,0.0]}}]} particle large_smoke ~ ~0.5 ~ 0.2 0.2 0.2 0 10 playsound minecraft:block.respawn_anchor.charge block @a[distance=..5] ~ ~ ~ 0.3 0.7 scoreboard players set @e[tag=gm4_new_machine,distance=..2] gm4_entity_version 1 # clean up data modify entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {} merge from entity @s {} data merge entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},[{"translate":"gui.gm4.ender_hopper_minecart","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper","font":"gm4:default","color":"#404040"}]]},Tags:["gm4_ender_hopper_minecart","gm4_machine_cart"]} data merge entity @s {Items:[]} kill @s tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy.mcfunction ================================================ # destroys the ender_hopper # @s = ender_hopper marker # located at @s # run from gm4_ender_hoppers:machine/verify_destroy # kill entities related to machine block execute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_ender_hopper_display,limit=1,distance=..0.01] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:hopper",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle explosion ~ ~ ~ execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_ender_hoppers:items/ender_hopper ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/drop_item.mcfunction ================================================ # drops the correct item # @s = invalid item entity # located at @s # run from gm4_ender_hoppers:machine/destroy_cart # drop item, and set flag execute store success score $dropped_item gm4_machine_data run loot spawn ~ ~ ~ loot gm4_ender_hoppers:entities/ender_hopper_minecart particle explosion ~ ~ ~ # kill original (invalid) item kill @s ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/scan_hoppers.mcfunction ================================================ # searches for hoppers with invalid items # @s = ender_hopper marker # located at @s # run from gm4_ender_hoppers:machine/destroy_cart # find hopper with the invalid item scoreboard players set $found_item gm4_machine_data 0 execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]} run function gm4_ender_hoppers:machine/destroy_cart/update_hopper # if no hoppers found, find hopper minecarts with the invalid item execute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3,nbt={Items:[{id:"minecraft:hopper_minecart",components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}]}] run function gm4_ender_hoppers:machine/destroy_cart/update_hopper_minecart ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/update_hopper.mcfunction ================================================ # updates hoppers with invalid items # @s = ender_hopper marker # located at the hopper with an invalid item # run from gm4_ender_hoppers:machine/destroy_cart/scan_hoppers # replace correct slot with proper item data modify storage gm4_machines:temp Items set from block ~ ~ ~ Items execute if data storage gm4_machines:temp Items[{Slot:0b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace block ~ ~ ~ container.0 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:1b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace block ~ ~ ~ container.1 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:2b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace block ~ ~ ~ container.2 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:3b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace block ~ ~ ~ container.3 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:4b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace block ~ ~ ~ container.4 loot gm4_ender_hoppers:entities/ender_hopper_minecart # clean up data remove storage gm4_machines:temp Items scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart/update_hopper_minecart.mcfunction ================================================ # updates hopper minecarts with invalid items # @s = hopper minecart with invalid item # located at @s # run from gm4_ender_hoppers:machine/destroy_cart/scan_hoppers # replace correct slot with proper item data modify storage gm4_machines:temp Items set from entity @s Items execute if data storage gm4_machines:temp Items[{Slot:0b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace entity @s container.0 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:1b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace entity @s container.1 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:2b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace entity @s container.2 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:3b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace entity @s container.3 loot gm4_ender_hoppers:entities/ender_hopper_minecart execute if data storage gm4_machines:temp Items[{Slot:4b,components:{"minecraft:custom_name":{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},{"color":"white","font":"gm4:container_gui","extra":[{"color":"#404040","font":"gm4:default","translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"}],"translate":"gui.gm4.ender_hopper_minecart","fallback":""}]}}}] run loot replace entity @s container.4 loot gm4_ender_hoppers:entities/ender_hopper_minecart # clean up data remove storage gm4_machines:temp Items scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/destroy_cart.mcfunction ================================================ # destroys the ender_hopper # @s = ender_hopper marker # located at @s # run from gm4_ender_hoppers:machine/verify_destroy # drop item scoreboard players set $dropped_item gm4_machine_data 0 execute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:"minecraft:hopper_minecart",count:1,components:{}}},limit=1,sort=nearest] at @s run function gm4_ender_hoppers:machine/destroy_cart/drop_item # scan hoppers if no item was broken execute if score $dropped_item gm4_machine_data matches 0 run function gm4_ender_hoppers:machine/destroy_cart/scan_hoppers # kill marker kill @s ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/down.mcfunction ================================================ # places the ender_hopper down based on rotation # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/create # place hopper setblock ~ ~ ~ hopper[facing=down]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper"},[{"translate":"gui.gm4.ender_hopper","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:head,CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]}} summon marker ~ ~ ~ {Tags:["gm4_ender_hopper","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_ender_hopper",Rotation:[0.0f,0.0f]} ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/east.mcfunction ================================================ # places the ender_hopper down based on rotation # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/create # place hopper setblock ~ ~ ~ hopper[facing=east]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper"},[{"translate":"gui.gm4.ender_hopper","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:head,CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[-90.0f,0.0f]} summon marker ~ ~ ~ {Tags:["gm4_ender_hopper","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_ender_hopper",Rotation:[-90.0f,0.0f]} ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/north.mcfunction ================================================ # places the ender_hopper down based on rotation # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/create # place hopper setblock ~ ~ ~ hopper[facing=north]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper"},[{"translate":"gui.gm4.ender_hopper","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:head,CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[180.0f,0.0f]} summon marker ~ ~ ~ {Tags:["gm4_ender_hopper","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_ender_hopper",Rotation:[180.0f,0.0f]} ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/south.mcfunction ================================================ # places the ender_hopper down based on rotation # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/create # place hopper setblock ~ ~ ~ hopper[facing=south]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper"},[{"translate":"gui.gm4.ender_hopper","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:head,CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[0.0f,0.0f]} summon marker ~ ~ ~ {Tags:["gm4_ender_hopper","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_ender_hopper",Rotation:[0.0f,0.0f]} ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/rotate/west.mcfunction ================================================ # places the ender_hopper down based on rotation # @s = player who placed the ender_hopper # located at the center of the placed block # run from gm4_ender_hoppers:machine/create # place hopper setblock ~ ~ ~ hopper[facing=west]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper"},[{"translate":"gui.gm4.ender_hopper","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper","fallback":"Ender Hopper","font":"gm4:default","color":"#404040"}]]}} # summon display armor stand and marker entity summon item_display ~ ~ ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:head,CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[90.0f,0.0f]} summon marker ~ ~ ~ {Tags:["gm4_ender_hopper","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_ender_hopper",Rotation:[90.0f,0.0f]} ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_ender_hopper] run function gm4_ender_hoppers:machine/destroy ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_destroy_cart.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_ender_hopper_display] run function gm4_ender_hoppers:machine/destroy_cart ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_place_cart.mcfunction ================================================ # verifies that the placed down machine minecart was from this module # @s = machine minecart # located at the machine minecart # run from #gm4_machines:place_cart execute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{"translate":"item.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper","italic":false}} run function gm4_ender_hoppers:machine/create_cart ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"ender_hopper"} run function gm4_ender_hoppers:machine/create ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/main.mcfunction ================================================ # process machine execute as @e[type=marker,tag=gm4_ender_hopper] at @s run function gm4_ender_hoppers:process execute as @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart] at @s run function gm4_ender_hoppers:process_cart schedule function gm4_ender_hoppers:main 16t ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/process.mcfunction ================================================ # @s = ender hopper marker # run from main particle portal ~ ~ ~ 0 0 0 0.5 2 execute if block ~ ~ ~ hopper[enabled=true] positioned ~-4.5 ~0.5 ~-4.5 as @e[type=item,dx=8,dy=2,dz=8,tag=!gm4_ender_hoppers_tp] positioned ~4.5 ~ ~4.5 run function gm4_ender_hoppers:teleport ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/process_cart.mcfunction ================================================ # @s = ender hopper minecart # run from main particle portal ~ ~ ~ 0 0 0 0.5 2 execute unless block ~ ~ ~ activator_rail[powered=true] positioned ~-4.5 ~ ~-4.5 as @e[type=item,dx=8,dy=3,dz=8,tag=!gm4_ender_hoppers_tp] positioned ~4.5 ~ ~4.5 run function gm4_ender_hoppers:teleport ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/teleport.mcfunction ================================================ tp @s ~ ~ ~ particle witch ~ ~0.5 ~ 0 0 0 0.6 5 tag @s add gm4_ender_hoppers_tp ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5/block_upgrade.mcfunction ================================================ # run from upgrade_paths/1.5 # @s = ender hopper display armor stand to be replaced summon item_display ~ ~0.5 ~ {item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper"]},"minecraft:profile":"$ender_hopper_display"}},item_display:"head",CustomName:"gm4_ender_hopper_display",Tags:["gm4_ender_hopper_display","smithed.entity","smithed.strict","gm4_new_machine"],transformation:{scale:[0.83,0.83,0.83],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0.0,0.641,0.0]},Rotation:[0.0f,0.0f]} # side-facing hopper, set the right CMD execute if items entity @s weapon.mainhand *[minecraft:custom_model_data={floats:[3420008]}] run data modify entity @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] item.components."minecraft:custom_model_data" set value {strings:["gm4_ender_hoppers:block/ender_hopper_side"]} data modify entity @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] Rotation set from entity @s Rotation scoreboard players set @e[type=item_display,limit=1,distance=..0.6,tag=gm4_new_machine] gm4_entity_version 2 scoreboard players set @e[type=marker,limit=1,distance=..0.6,tag=gm4_ender_hopper] gm4_entity_version 2 tag @e[type=item_display,distance=..0.6,tag=gm4_new_machine] remove gm4_new_machine kill @s ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5/minecart_upgrade.mcfunction ================================================ # run from upgrade_paths/1.5 # @s = existing ender hopper minecart (cart entity) summon hopper_minecart ~ ~ ~ {Tags:["gm4_ender_hopper_minecart_new","gm4_new_machine"],Passengers:[{id:"minecraft:item_display",CustomName:"gm4_ender_hopper_display",Tags:["gm4_no_edit","gm4_ender_hopper_display","gm4_machine_cart","smithed.entity","smithed.strict","gm4_new_machine"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_ender_hoppers:block/ender_hopper_minecart"]},"minecraft:profile":"$ender_hopper_display"}},item_display:"head",transformation:{scale:[0.83,0.83,0.83],right_rotation:[0,0,0,1],left_rotation:[0,0,0,1],translation:[0.0,0.7275,0.0]}}]} data modify entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {} merge from entity @s {} data merge entity @e[type=hopper_minecart,tag=gm4_ender_hopper_minecart_new,distance=..0.1,limit=1] {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper"},[{"translate":"gui.gm4.ender_hopper_minecart","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper","font":"gm4:default","color":"#404040"}]]},Tags:["gm4_ender_hopper_minecart","gm4_machine_cart"]} data merge entity @s {Items:[]} execute on passengers run kill @s kill @s tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/function/upgrade_paths/1.5.mcfunction ================================================ execute as @e[type=armor_stand,tag=gm4_ender_hopper_stand,tag=!gm4_machine_cart,scores={gm4_entity_version=1}] at @s run function gm4_ender_hoppers:upgrade_paths/1.5/block_upgrade execute as @e[type=armor_stand,tag=gm4_ender_hopper_stand,tag=gm4_machine_cart,scores={gm4_entity_version=1}] on vehicle at @s run function gm4_ender_hoppers:upgrade_paths/1.5/minecart_upgrade ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/guidebook/ender_hoppers.json ================================================ { "id": "ender_hoppers", "name": "Ender Hoppers", "module_type": "module", "icon": { "id": "minecraft:ender_eye" }, "criteria": { "obtain_ender_eye": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:ender_eye" ] } ] } }, "obtain_hopper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper" ] } ] } }, "obtain_ender_hopper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"ender_hopper\"}}" } } ] } }, "open_ender_hopper": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:hopper" ], "nbt": "{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\"},{\"translate\":\"gui.gm4.ender_hopper\",\"fallback\":\"\",\"extra\":[{\"translate\":\"container.gm4.ender_hopper\",\"fallback\":\"Ender Hopper\",\"font\":\"gm4:default\",\"color\":\"#404040\"}],\"font\":\"gm4:container_gui\",\"color\":\"white\"}]}}" } } } ] } } }, "sections": [ { "name": "initial", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.ender_hoppers.description", "fallback": "Ender Hoppers teleport items to itself, even through walls.\n\nThey can also be combined with a minecart to create an Ender Hopper Minecart." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_ender_eye" ], [ "obtain_hopper" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.ender_hoppers.crafting", "fallback": "Ender Hoppers can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_ender_hoppers:ender_hopper" } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "open_ender_hopper", "obtain_ender_hopper" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.ender_hoppers.usage", "fallback": "Ender Hoppers can pick up items in a range of 9x9 blocks, centered at itself and extending 3 blocks above itself.\n\nCombining a minecart with an ender hopper yields an ender hopper minecart." } ] ] } ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/entities/ender_hopper_minecart.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_ender_hoppers:items/ender_hopper_minecart" } ] } ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/items/ender_hopper.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_ender_hoppers:item/ender_hopper"]}, "minecraft:profile": "$ender_hopper" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'ender_hopper'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.ender_hopper", "fallback": "Ender Hopper", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/loot_table/items/ender_hopper_minecart.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:hopper_minecart", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_ender_hoppers:item/ender_hopper_minecart"]} } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'ender_hopper_minecart'}}" }, { "function": "set_name", "name": [ { "translate": "item.gm4.ender_hopper_minecart", "fallback": "Minecart with Ender Hopper", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/recipe/ender_hopper.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "E", "R", "H" ], "key": { "E": "minecraft:ender_eye", "R": "minecraft:respawn_anchor", "H": "minecraft:hopper" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_ender_hoppers:item/ender_hopper"]}, "minecraft:profile": "$ender_hopper", "minecraft:custom_data": "{gm4_machines:{id:'ender_hopper'}}", "minecraft:custom_name": {"translate":"block.gm4.ender_hopper","fallback":"Ender Hopper","color":"white","italic":false} } } } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/recipe/ender_hopper_minecart.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "E", "R", "H" ], "key": { "E": "minecraft:ender_eye", "R": "minecraft:respawn_anchor", "H": "minecraft:hopper_minecart" }, "result": { "id": "minecraft:hopper_minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_ender_hoppers:item/ender_hopper_minecart"]}, "minecraft:custom_data": "{gm4_machines:{id:'ender_hopper_minecart'}}", "minecraft:custom_name": {"translate":"item.gm4.ender_hopper_minecart","fallback":"Minecart with Ender Hopper","color":"white","italic":false} } } } ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/test/pickup.mcfunction ================================================ # @template gm4_ender_hoppers:test_pickup summon item ~2.5 ~1.5 ~1.5 {Item:{id:"minecraft:iron_ingot"}} summon item ~5.5 ~1.5 ~1.5 {Item:{id:"minecraft:gold_ingot"}} summon item ~6.5 ~1.5 ~1.5 {Item:{id:"minecraft:diamond"}} await items block ~1 ~ ~1 container.* minecraft:iron_ingot await items block ~1 ~ ~1 container.* minecraft:gold_ingot await delay 1s assert not items block ~1 ~ ~1 container.* minecraft:diamond execute positioned ~7 ~ ~ run assert items entity @e[type=item,distance=..2] contents minecraft:diamond ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/test/place.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ loot give @s loot gm4_ender_hoppers:items/ender_hopper execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~ ~1 assert block ~1 ~1 ~1 hopper assert entity @e[tag=gm4_ender_hopper,distance=..3] ================================================ FILE: gm4_ender_hoppers/data/gm4_ender_hoppers/test/place_minecart.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @optional setblock ~1 ~1 ~1 rail loot give @s loot gm4_ender_hoppers:items/ender_hopper_minecart execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~1 ~1 await entity @e[tag=gm4_ender_hopper_minecart,distance=..3] ================================================ FILE: gm4_ender_hoppers/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_ender_hoppers:machine/verify_destroy" ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_machines/tags/function/destroy_cart.json ================================================ { "values": [ "gm4_ender_hoppers:machine/verify_destroy_cart" ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_machines/tags/function/place_cart.json ================================================ { "values": [ "gm4_ender_hoppers:machine/verify_place_cart" ] } ================================================ FILE: gm4_ender_hoppers/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_ender_hoppers:machine/verify_place_down" ] } ================================================ FILE: gm4_everstone/README.md ================================================ # Everstone The power of ant-aging, but now for mobs! (And yes, it is stolen from Pokemon) ### Features - Adds mob conversions/aging processes when certain conditions are met, for example: - Guardians become Elder Guardians when there are at least 5 others nearby for atleast 20 minutes - Piglins become Piglin Brutes when there less than 2 Brutes within 32 blocks for 1 hour - Slimes become Magma Cubes when in The Nether for over 30 minutes - An Everstone can be obtained from mining stone during a full moon - Throwing the Everstone at a mob, blocks the conversion and prevents babies from growing up The full list of mob conversions can be found on the [Wiki](https://wiki.gm4.co/Everstone). ================================================ FILE: gm4_everstone/assets/translations.csv ================================================ key,en_us item.gm4.everstone,Everstone advancement.gm4.everstone.title,Evolution Halt advancement.gm4.everstone.description,Use an everstone to prevent a mob from aging text.gm4.guidebook.module_desc.everstone,"Collect Everstones during full moons and use them on baby mobs to stop them from aging! But watch out, some other mobs might start aging, too!" text.gm4.guidebook.everstone.description,Everstones can prevent mobs from aging.\n\nSome mobs that don't normally age now have the ability to evolve into other mobs. text.gm4.guidebook.everstone.obtaining,Everstones can be obtained by mining stone during a full moon.\n\nStone mined with Silk Touch will never drop an everstone. text.gm4.guidebook.everstone.usage,"Dropping an everstone on a mob will prevent it from aging.\n\nZombies, Skeletons, Slimes, Strays, Piglins, Guardians, and Vindicators can evolve under specific conditions." text.gm4.guidebook.everstone.zombie_conversion,Zombies will convert to husks after being in direct sunlight in a desert or badlands biome for a long time. text.gm4.guidebook.everstone.skeleton_conversion,"Skeletons will convert into strays after being in a cold, snowy biome for a long time." text.gm4.guidebook.everstone.slime_conversion,Slimes will convert into magma cubes after being in the nether for a long time. text.gm4.guidebook.everstone.stray_conversion,"Strays will convert into skeletons if taken out of a cold, snowy biome for a long time." text.gm4.guidebook.everstone.piglin_conversion,Piglins inside bastion remnants will convert into piglin brutes if there are less than two brutes nearby. text.gm4.guidebook.everstone.guardian_conversion,"Guardians will convert into elder guardians after being near several other guardians for a long time.\n\nSpecifically, guardians with five other friends will start to age." text.gm4.guidebook.everstone.vindicator_conversion,"Vindicators will convert into evokers when near at least seven magical blocks for a long time.\n\nThese blocks include enchanting tables, bookshelves, lecterns, brewing stands, and cauldrons." ================================================ FILE: gm4_everstone/beet.yaml ================================================ id: gm4_everstone name: Everstone version: 1.6.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick - aging_clock model_data: - item: firework_star reference: item/everstone template: generated - item: firework_star reference: gui/advancement/everstones template: name: advancement foward: item/everstone website: description: Collect Everstones during full moons and use them on baby mobs to stop them from aging! But watch out, some other mobs might start aging, too! recommended: - gm4_resource_pack notes: [] modrinth: project_id: 4XVj9LBh wiki: https://wiki.gm4.co/wiki/Everstone credits: Creators: - Denniss - BPR Icon Design: - BPR ================================================ FILE: gm4_everstone/data/c/tags/worldgen/biome/is_cold/overworld.json ================================================ { "values": [ "minecraft:taiga", "minecraft:old_growth_pine_taiga", "minecraft:snowy_plains", "minecraft:ice_spikes", "minecraft:grove", "minecraft:snowy_slopes", "minecraft:jagged_peaks", "minecraft:frozen_peaks", "minecraft:snowy_beach", "minecraft:snowy_taiga", "minecraft:frozen_river", "minecraft:cold_ocean", "minecraft:frozen_ocean", "minecraft:deep_cold_ocean", "minecraft:deep_frozen_ocean", { "id": "#c:climate_cold", "required": false } ] } ================================================ FILE: gm4_everstone/data/c/tags/worldgen/biome/is_dry/overworld.json ================================================ { "values": [ "minecraft:desert", "minecraft:badlands", "minecraft:wooded_badlands", "minecraft:eroded_badlands", "minecraft:savanna", "minecraft:savanna_plateau", "minecraft:windswept_savanna", { "id": "#c:climate_dry", "required": false } ] } ================================================ FILE: gm4_everstone/data/c/tags/worldgen/biome/is_swamp.json ================================================ { "values": [ "minecraft:mangrove_swamp", "minecraft:swamp" ] } ================================================ FILE: gm4_everstone/data/gm4/advancement/everstone.json ================================================ { "display": { "icon": { "id": "firework_star", "components": { "minecraft:custom_model_data": {"strings":["gm4_everstone:gui/advancement/everstones"]} } }, "title": { "translate": "advancement.gm4.everstone.title", "fallback": "Evolution Halt" }, "description": { "translate": "advancement.gm4.everstone.description", "fallback": "Use an everstone to prevent a mob from aging", "color": "gray" } }, "parent": "gm4:root", "criteria": { "use_everstone": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_everstone/data/gm4_everstone/advancement/kill_age_locked.json ================================================ { "criteria": { "ignore_kill": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "nbt": "{Tags:[\"gm4_everstone_locked\"]}" } } } }, "rewards": { "function": "gm4_everstone:age_locking/killed_age_locked" } } ================================================ FILE: gm4_everstone/data/gm4_everstone/function/age_locking/check.mcfunction ================================================ # checks for ageable mobs # @s = everstone item on ground # located at @s # run from main tag @s add gm4_everstone_used tag @e[distance=..1,type=#gm4_everstone:affected,limit=1,tag=!gm4_everstone_locked,tag=!smithed.entity,sort=nearest] add gm4_everstone_check function #gm4_everstone:age_locking_check execute as @e[type=#gm4_everstone:affected,distance=..1,tag=gm4_everstone_check,limit=1] store result score @s gm4_es_data run data get entity @s Age scoreboard players set @e[type=#gm4_everstone:force_age_lock,distance=..1,tag=gm4_everstone_check,limit=1] gm4_es_data -1 execute as @e[type=#gm4_everstone:affected,distance=..1,tag=gm4_everstone_check,limit=1,scores={gm4_es_data=..-1}] at @s run function gm4_everstone:age_locking/lock_age scoreboard players reset @e[distance=..1] gm4_es_data tag @e[distance=..1] remove gm4_everstone_check tag @s remove gm4_everstone_used ================================================ FILE: gm4_everstone/data/gm4_everstone/function/age_locking/killed_age_locked.mcfunction ================================================ #run from advancement kill_age_locked #@s = player who killed a mob holding the everstone loot spawn ~ ~.3 ~ loot gm4_everstone:everstone data merge entity @e[type=item,distance=..1,nbt={Age:0s,Item:{components:{"minecraft:custom_data":{gm4_everstone:1b}}}},limit=1] {PickupDelay:0} advancement revoke @s only gm4_everstone:kill_age_locked ================================================ FILE: gm4_everstone/data/gm4_everstone/function/age_locking/lock_age.mcfunction ================================================ # run from check # @s = mob that will be affected by everstone, at @s data merge entity @s[type=!#gm4_everstone:aging_mob] {Age:-2147483647} tag @s add gm4_everstone_locked kill @e[type=item,tag=gm4_everstone_used,distance=..1,limit=1] particle minecraft:flash{color:-1} ~ ~2 ~ 0 0 0 0 20 particle minecraft:explosion ~ ~ ~ 0 0 0 0 0 playsound minecraft:entity.illusioner.cast_spell master @a[distance=..8] ~ ~ ~ 0.3 0.6 advancement grant @a[distance=..4] only gm4:everstone ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/age_mobs.mcfunction ================================================ # update age for some mobs # @s = none # located at world spawn # run from aging_clock # if age_count is less than 100, age one mob with that chance execute if score $age_count gm4_es_data matches 1..99 run function gm4_everstone:aging/single # if age_count is greater than or equal to 100, age one mob then reiterate execute if score $age_count gm4_es_data matches 100.. run function gm4_everstone:aging/multiple ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/bogged.mcfunction ================================================ # converts skeleton into bogged # @s = skeleton that reached the max age # located at @s # run from aging/update_age/skeleton # summon new mob summon minecraft:bogged ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=bogged,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=bogged,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=skeleton,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=bogged,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.bogged.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/elder_guardian.mcfunction ================================================ # converts guardian into elder guardian # @s = guardian that reached the max age # located at @s # run from aging/update_age/guardian # summon new mob summon minecraft:elder_guardian ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=guardian,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=elder_guardian,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.elder_guardian.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/evoker.mcfunction ================================================ # converts vindicator into evoker # @s = vindicator that reached the max age # located at @s # run from aging/update_age/vindicator # summon new mob summon minecraft:evoker ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=evoker,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=evoker,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=vindicator,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=evoker,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.evoker.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/husk.mcfunction ================================================ # converts zombie into husk # @s = zombie that reached the max age # located at @s # run from aging/update_age/zombie # summon new mob summon minecraft:husk ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=husk,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=husk,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=zombie,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=husk,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.husk.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/magma_cube.mcfunction ================================================ # converts slime into magma cube # @s = slime that reached the max age # located at @s # run from aging/update_age/slime # summon new mob summon minecraft:magma_cube ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=magma_cube,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=magma_cube,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=slime,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=magma_cube,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.magma_cube.squish hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/piglin_brute.mcfunction ================================================ # converts piglin into piglin brute # @s = piglin that reached the max age # located at @s # run from aging/update_age/piglin # summon new mob summon minecraft:piglin_brute ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=piglin,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=piglin_brute,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.piglin_brute.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/skeleton.mcfunction ================================================ # converts stray or bogged into skeleton # @s = stray that reached the max age # located at @s # run from aging/update_age/stray # summon new mob summon minecraft:skeleton ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=skeleton,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=skeleton,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=skeleton,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.skeleton.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/convert/stray.mcfunction ================================================ # converts skeleton into stray # @s = skeleton that reached the max age # located at @s # run from aging/update_age/skeleton # summon new mob summon minecraft:stray ~ ~ ~ {Tags:[gm4_es_new_mob]} # move mob to exact location of old mob tp @e[type=stray,tag=gm4_es_new_mob,limit=1,distance=..0.01] @s tag @s add gm4_es_old_mob execute on vehicle run ride @e[type=stray,tag=gm4_es_new_mob,limit=1,distance=..0.01] mount @s execute on vehicle run ride @e[type=skeleton,tag=gm4_es_old_mob,limit=1,distance=..0.01] dismount execute on passengers run ride @s dismount # transfer old nbt to new mob effect give @s nausea 1 2 data merge entity @s {Tags:[]} data modify entity @e[type=stray,tag=gm4_es_new_mob,limit=1] {} merge from entity @s # sound effects playsound minecraft:entity.stray.ambient hostile @a[distance=..16] ~ ~ ~ 0.5 playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 0.5 .1 # clean up data merge entity @s {DeathTime:19s,Health:0,DeathLootTable:"gm4:empty",drop_chances:{mainhand:0F,offhand:0F,feet:0F,legs:0F,chest:0F,head:0F}} tp @s ~ ~-5000 ~ ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/multiple.mcfunction ================================================ # age a single mob, then reiterate # @s = none # located at world spawn # run from aging/age_mobs # age one mob execute as @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1,sort=random] at @s run function gm4_everstone:aging/update_age/check_mob # reiterate scoreboard players remove $age_count gm4_es_data 100 schedule function gm4_everstone:aging/age_mobs 5t ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/single.mcfunction ================================================ # age a single mob with the calculated chance # @s = none # located at world spawn # run from aging/age_mobs # get random value summon marker ~ ~ ~ {CustomName:"gm4_everstone_random",Tags:["gm4_everstone_random"]} execute store result score $random gm4_es_data run data get entity @e[type=marker,tag=gm4_everstone_random,distance=0,limit=1] UUID[3] kill @e[type=marker,tag=gm4_everstone_random] # age one mob, if random value is within the chance execute if score $random gm4_es_data < $age_count gm4_es_data as @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1,sort=random] at @s run function gm4_everstone:aging/update_age/check_mob ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/bogged.mcfunction ================================================ # checks aging conditions of the mob # @s = aging bogged # located at @s # run from aging/update_age/check_mob # add age if sheared and not in swamp biome scoreboard players add @s[predicate=gm4_everstone:sheared_and_out_of_swamp] gm4_es_age 1 # deplete age if in swamp biome scoreboard players remove @s[predicate=gm4_everstone:in_swamp,scores={gm4_es_age=1..}] gm4_es_age 1 # will take on average 1 hour to convert execute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/skeleton ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/check_mob.mcfunction ================================================ # checks the specific mob type # @s = aging mob # located at @s # run from aging/multiple # and from aging/single tag @e remove gm4_es_new_mob function #gm4_everstone:update_age execute if entity @s[type=bogged] run function gm4_everstone:aging/update_age/bogged execute if entity @s[type=guardian] run function gm4_everstone:aging/update_age/guardian execute if entity @s[type=piglin] run function gm4_everstone:aging/update_age/piglin execute if entity @s[type=skeleton] run function gm4_everstone:aging/update_age/skeleton execute if entity @s[type=slime] run function gm4_everstone:aging/update_age/slime execute if entity @s[type=stray] run function gm4_everstone:aging/update_age/stray execute if entity @s[type=vindicator] run function gm4_everstone:aging/update_age/vindicator execute if entity @s[type=zombie] run function gm4_everstone:aging/update_age/zombie tag @e remove gm4_es_new_mob ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/guardian.mcfunction ================================================ # checks aging conditions of the mob # @s = aging guardian # located at @s # run from aging/update_age/check_mob # check how many nearby guardians there are execute store result score @s gm4_es_data if entity @e[type=guardian,distance=..8,tag=!gm4_everstone_locked] # if there are 5 other guardians and no elder guardians in a 32 block radius, increase the age execute unless entity @e[type=elder_guardian,distance=..32,limit=1] run scoreboard players add @s[scores={gm4_es_data=6..}] gm4_es_age 1 # will take on average 2 hours to covert execute if score @s gm4_es_age matches 24.. run function gm4_everstone:aging/convert/elder_guardian ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/piglin.mcfunction ================================================ # checks aging conditions of the mob # @s = aging piglin # located at @s # run from aging/update_age/check_mob # count nearby piglin brutes execute store result score @s gm4_es_data if entity @e[type=piglin_brute,distance=..32] # add age if in a bastion remnant unless there are 3 other brutes nearby scoreboard players add @s[predicate=gm4_everstone:in_bastion_remnant,scores={gm4_es_data=..2}] gm4_es_age 1 # deplete age if not in bastion remnant scoreboard players remove @s[predicate=!gm4_everstone:in_bastion_remnant,scores={gm4_es_age=1..}] gm4_es_age 1 # will take on average 1 hour to convert execute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/piglin_brute ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/skeleton.mcfunction ================================================ # checks aging conditions of the mob # @s = aging skeleton # located at @s # run from aging/update_age/check_mob # stray conversion ## add age if in frozen biome with direct sky access scoreboard players add @s[predicate=gm4_everstone:in_frozen_sunlight] gm4_es_age 1 ## deplete age if not in frozen biome with direct sky access scoreboard players remove @s[predicate=!gm4_everstone:in_frozen_sunlight,scores={gm4_es_age=1..}] gm4_es_age 1 ## will take on average 30 minutes to convert execute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/stray # bogged conversion ## add age if in a swamp biome in water scoreboard players add @s[predicate=gm4_everstone:in_swampy_water] gm4_es_age_alt 1 ## deplete age if not in swamp biome scoreboard players remove @s[predicate=!gm4_everstone:in_swamp,scores={gm4_es_age_alt=1..}] gm4_es_age_alt 1 ## will take on average 1 hour to convert execute if score @s gm4_es_age_alt matches 12.. run function gm4_everstone:aging/convert/bogged ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/slime.mcfunction ================================================ # checks aging conditions of the mob # @s = aging slime # located at @s # run from aging/update_age/check_mob # add age if in the nether scoreboard players add @s[predicate=gm4_everstone:in_nether] gm4_es_age 1 # deplete age if not in the nether scoreboard players remove @s[predicate=!gm4_everstone:in_nether,scores={gm4_es_age=1..}] gm4_es_age 1 # will take on average 30 minutes to convert execute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/magma_cube ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/stray.mcfunction ================================================ # checks aging conditions of the mob # @s = aging stray # located at @s # run from aging/update_age/check_mob # add age if not in frozen biome scoreboard players add @s[predicate=!gm4_everstone:in_frozen] gm4_es_age 1 # deplete age if in frozen biome scoreboard players remove @s[predicate=gm4_everstone:in_frozen,scores={gm4_es_age=1..}] gm4_es_age 1 # will take on average 1 hour to convert execute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/skeleton ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/vindicator.mcfunction ================================================ # checks aging conditions of the mob # @s = aging vindicator # located at @s # run from aging/update_age/check_mob # check how many nearby magical blocks there are execute store result score @s gm4_es_data run clone ~-2 ~-1 ~-2 ~2 ~2 ~2 ~-2 ~-1 ~-2 filtered #gm4_everstone:contains_magic force # if there are 7 or more magical blocks, increase the age scoreboard players add @s[scores={gm4_es_data=7..}] gm4_es_age 1 # if there are no magical blocks, decrease the age scoreboard players remove @s[scores={gm4_es_data=0}] gm4_es_age 1 # will take on average 1 hour to covert execute if score @s gm4_es_age matches 12.. run function gm4_everstone:aging/convert/evoker ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging/update_age/zombie.mcfunction ================================================ # checks aging conditions of the mob # @s = aging zombie # located at @s # run from aging/update_age/check_mob # add age if in dry biome with direct sky access execute unless block ~ ~0.5 ~ water run scoreboard players add @s[predicate=gm4_everstone:in_dry_sunlight] gm4_es_age 1 # deplete age if not in dry biome with direct sky access scoreboard players remove @s[predicate=!gm4_everstone:in_dry_sunlight,scores={gm4_es_age=1..}] gm4_es_age 1 # will take on average 30 minutes to convert execute if score @s gm4_es_age matches 6.. run function gm4_everstone:aging/convert/husk ================================================ FILE: gm4_everstone/data/gm4_everstone/function/aging_clock.mcfunction ================================================ # slow clock to handle mob aging # @s = none # located at world spawn # run from init schedule function gm4_everstone:aging_clock 30s # calculate number of mobs that should get aged; caps at 1000 counted mobs (100 iterations, spread over 25 seconds) execute store result score $age_count gm4_es_data if entity @e[type=#gm4_everstone:aging_mob,tag=!gm4_everstone_locked,tag=!gm4_everstone_ignore,tag=!smithed.entity,limit=1000] scoreboard players operation $age_count gm4_es_data *= #chance gm4_es_data # age mobs execute if score $age_count gm4_es_data matches 1.. run function gm4_everstone:aging/age_mobs ================================================ FILE: gm4_everstone/data/gm4_everstone/function/init.mcfunction ================================================ scoreboard objectives add gm4_es_data dummy scoreboard objectives add gm4_es_age dummy scoreboard objectives add gm4_es_age_alt dummy scoreboard objectives add gm4_es_mine minecraft.mined:minecraft.stone # set chance (out of 100) for a single mob to age every 30s # 10 = on average, a mob ages every 5 minutes scoreboard players set #chance gm4_es_data 10 execute unless score everstone gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Everstone"} execute unless score everstone gm4_earliest_version < everstone gm4_modules run scoreboard players operation everstone gm4_earliest_version = everstone gm4_modules scoreboard players set everstone gm4_modules 1 schedule function gm4_everstone:main 1t schedule function gm4_everstone:tick 1t schedule function gm4_everstone:aging_clock 1t #$moduleUpdateList ================================================ FILE: gm4_everstone/data/gm4_everstone/function/main.mcfunction ================================================ execute as @e[type=item] if items entity @s contents minecraft:firework_star[count=1,custom_data~{gm4_everstone:1b}] if entity @s[nbt={OnGround:1b}] at @s run function gm4_everstone:age_locking/check schedule function gm4_everstone:main 16t ================================================ FILE: gm4_everstone/data/gm4_everstone/function/tick.mcfunction ================================================ execute if predicate gm4_everstone:is_full_moon as @a[scores={gm4_es_mine=1..}] at @s anchored eyes positioned ^ ^ ^3 at @e[type=item,distance=..3.5,limit=1,nbt={Age:0s,Item:{id:"minecraft:cobblestone",count:1}}] run loot spawn ~ ~ ~ fish gm4_everstone:drop_chance ~ ~ ~ mainhand scoreboard players reset @a gm4_es_mine schedule function gm4_everstone:tick 1t ================================================ FILE: gm4_everstone/data/gm4_everstone/guidebook/everstone.json ================================================ { "id": "everstone", "name": "Everstone", "module_type": "module", "icon": { "id": "minecraft:firework_star" }, "criteria": { "obtain_cobblestone_during_full_moon": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:cobblestone" ] } ], "player": [ { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13000, "max": 24000 }, "period": 192000 } ] } }, "obtain_everstone": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:firework_star" ], "predicates": { "minecraft:custom_data": "{gm4_everstone:1b}" } } ] } }, "kill_zombie": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:zombie" } } }, "kill_skeleton": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:skeleton" } } }, "kill_slime": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:slime" } } }, "kill_stray": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:stray" } } }, "kill_piglin": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:piglin" } } }, "kill_guardian": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:guardian" } } }, "kill_vindicator": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "minecraft:vindicator" } } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.everstone.description", "fallback": "Everstones can prevent mobs from aging.\n\nSome mobs that don't normally age now have the ability to evolve into other mobs." } ] ] }, { "name": "obtaining", "enable": [], "requirements": [ [ "obtain_cobblestone_during_full_moon" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.obtaining", "fallback": "Everstones can be obtained by mining stone during a full moon.\n\nStone mined with Silk Touch will never drop an everstone." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_everstone" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.usage", "fallback": "Dropping an everstone on a mob will prevent it from aging.\n\nZombies, Skeletons, Slimes, Strays, Piglins, Guardians, and Vindicators can evolve under specific conditions." } ] ] }, { "name": "zombie_conversion", "enable": [], "requirements": [ [ "kill_zombie" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.zombie_conversion", "fallback": "Zombies will convert to husks after being in direct sunlight in a desert or badlands biome for a long time." } ] ] }, { "name": "skeleton_conversion", "enable": [], "requirements": [ [ "kill_skeleton" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.skeleton_conversion", "fallback": "Skeletons will convert into strays after being in a cold, snowy biome for a long time." } ] ] }, { "name": "slime_conversion", "enable": [], "requirements": [ [ "kill_slime" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.slime_conversion", "fallback": "Slimes will convert into magma cubes after being in the nether for a long time." } ] ] }, { "name": "stray_conversion", "enable": [], "requirements": [ [ "kill_stray" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.stray_conversion", "fallback": "Strays will convert into skeletons if taken out of a cold, snowy biome for a long time." } ] ] }, { "name": "piglin_conversion", "enable": [], "requirements": [ [ "kill_piglin" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.piglin_conversion", "fallback": "Piglins inside bastion remnants will convert into piglin brutes if there are less than two brutes nearby." } ] ] }, { "name": "guardian_conversion", "enable": [], "requirements": [ [ "kill_guardian" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.guardian_conversion", "fallback": "Guardians will convert into elder guardians after being near several other guardians for a long time.\n\nSpecifically, guardians with five other friends will start to age." } ] ] }, { "name": "vindicator_conversion", "enable": [], "requirements": [ [ "kill_vindicator" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.everstone.vindicator_conversion", "fallback": "Vindicators will convert into evokers when near at least seven magical blocks for a long time.\n\nThese blocks include enchanting tables, bookshelves, lecterns, brewing stands, and cauldrons." } ] ] } ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/loot_table/drop_chance.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_everstone:everstone", "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0.0025, 0.005, 0.0075, 0.01 ] } ] } ] } ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/loot_table/everstone.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:firework_star", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_everstone:item/everstone"]} } }, { "function": "set_custom_data", "tag": "{gm4_everstone:1b}" }, { "function": "set_name", "target": "item_name", "name": { "translate": "item.gm4.everstone", "fallback": "Everstone" } } ] } ] } ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_bastion_remnant.json ================================================ { "condition": "minecraft:location_check", "predicate": { "structures": "bastion_remnant" } } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_dry_sunlight.json ================================================ [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_everstone:dries_zombies" } }, { "condition": "minecraft:location_check", "predicate": { "can_see_sky": true } } ] ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_frozen.json ================================================ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_everstone:freezes_skeletons" } } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_frozen_sunlight.json ================================================ [ { "condition": "minecraft:reference", "name": "gm4_everstone:in_frozen" }, { "condition": "minecraft:location_check", "predicate": { "can_see_sky": true } } ] ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_nether.json ================================================ { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:the_nether" } } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_swamp.json ================================================ { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_everstone:bogs_skeletons" } } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/in_swampy_water.json ================================================ { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "biomes": "#gm4_everstone:bogs_skeletons", "fluid": { "fluids": "#minecraft:water" } } } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/is_full_moon.json ================================================ { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13000, "max": 24000 }, "period": 192000 } ================================================ FILE: gm4_everstone/data/gm4_everstone/predicate/sheared_and_out_of_swamp.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{sheared:1b}" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "biomes": "#gm4_everstone:bogs_skeletons" } } } ] ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/block/contains_magic.json ================================================ { "values": [ "#minecraft:cauldrons", "minecraft:bookshelf", "minecraft:enchanting_table", "minecraft:lectern", "minecraft:brewing_stand" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/entity_type/affected.json ================================================ { "values": [ "minecraft:armadillo", "minecraft:axolotl", "minecraft:bee", "minecraft:cat", "minecraft:chicken", "minecraft:cow", "minecraft:donkey", "minecraft:fox", "minecraft:goat", "minecraft:happy_ghast", "minecraft:hoglin", "minecraft:horse", "minecraft:llama", "minecraft:mooshroom", "minecraft:mule", "minecraft:nautilus", "minecraft:ocelot", "minecraft:panda", "minecraft:pig", "minecraft:polar_bear", "minecraft:rabbit", "minecraft:sheep", "minecraft:skeleton_horse", "minecraft:sniffer", "minecraft:strider", "minecraft:trader_llama", "minecraft:turtle", "minecraft:villager", "minecraft:wolf", "minecraft:zombie_horse", "#gm4_everstone:force_age_lock" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/entity_type/aging_mob.json ================================================ { "values": [ "minecraft:bogged", "minecraft:guardian", "minecraft:piglin", "minecraft:skeleton", "minecraft:slime", "minecraft:stray", "minecraft:vindicator", "minecraft:zombie" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/entity_type/force_age_lock.json ================================================ { "values": [ "#gm4_everstone:aging_mob", "minecraft:tadpole" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/function/age_locking_check.json ================================================ { "values": [] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/function/update_age.json ================================================ { "values": [] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/worldgen/biome/bogs_skeletons.json ================================================ { "values": [ "#c:is_swamp" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/worldgen/biome/dries_zombies.json ================================================ { "values": [ "#c:is_dry/overworld" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/tags/worldgen/biome/freezes_skeletons.json ================================================ { "values": [ "#c:is_cold/overworld" ] } ================================================ FILE: gm4_everstone/data/gm4_everstone/test/age_locking.mcfunction ================================================ # @template gm4:test_tube summon pig ~1.5 ~1 ~1.5 {Age:-40} loot spawn ~1.5 ~2 ~1.5 loot gm4_everstone:everstone await not entity @e[type=item,distance=..4] scoreboard objectives add gm4_test dummy execute store result score $age gm4_test run data get entity @e[type=pig,distance=..3,limit=1] Age assert score $age gm4_test matches ..-1 await delay 3s execute store result score $age gm4_test run data get entity @e[type=pig,distance=..3,limit=1] Age assert score $age gm4_test matches ..-1 ================================================ FILE: gm4_fulcio_shamir/README.md ================================================ # Fulcio Shamir Place blocks whilst floating in mid-air! ### Features - Allows players to float whilst sneaking and holding a compass with the Fulcio Shamir on it - Makes particle box appear where the player can then place blocks - Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy). ================================================ FILE: gm4_fulcio_shamir/assets/translations.csv ================================================ key,en_us item.gm4.shamir.fulcio,Fulcio Shamir text.gm4.guidebook.module_desc.fulcio_shamir,Adds the shamir 'Fulcio' to Metallurgy. It allows you to place blocks in mid-air! This also enables you to choose the orientation of blocks like logs without needing a supporting block. text.gm4.guidebook.fulcio_shamir.description,"Fulcio changes block placement. While sneaking, blocks can be placed in mid-air." text.gm4.guidebook.fulcio_shamir.usage,The Fulcio Shamir is found on Barimium Bands. It can be placed onto compasses.\n\nHolding the tool and sneaking will create a temporary space where blocks can be placed. ================================================ FILE: gm4_fulcio_shamir/beet.yaml ================================================ id: gm4_fulcio_shamir name: Fulcio Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 schedule_loops: - main - 4_tick model_data: - item: compass reference: shamir/fulcio template: name: shamir metal: barimium textures_path: gm4_metallurgy:item/shamir/barimium website: description: Adds the shamir 'Fulcio' to Metallurgy. It allows you to place blocks in mid-air! This also enables you to choose the orientation of blocks like logs without needing a supporting block. recommended: [] notes: [] modrinth: project_id: N09PsTgz wiki: https://wiki.gm4.co/wiki/Metallurgy/Fulcio_Shamir credits: Creators: - BPR - Bloo Icon Design: - BPR ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/4_tick.mcfunction ================================================ execute at @e[type=marker,tag=gm4_fulcio_block] align xyz run function gm4_fulcio_shamir:particles schedule function gm4_fulcio_shamir:4_tick 4t ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/active.mcfunction ================================================ #run from main #@s = sneaking players holding a fulcio compass summon marker ~ ~ ~ {Tags:["gm4_fulcio_ray"]} execute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_fulcio_ray] ^ ^ ^ ~ ~ scoreboard players set gm4_ray_counter gm4_count 0 execute as @e[type=marker,tag=gm4_fulcio_ray] at @s run function gm4_fulcio_shamir:ray execute as @e[type=marker,tag=gm4_fulcio_ray] at @s positioned ^ ^ ^-0.1 align xyz if block ~ ~ ~ #minecraft:air run function gm4_fulcio_shamir:create_block kill @e[type=marker,tag=gm4_fulcio_ray] ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'fulcio'}}] if items entity @s contents #gm4_fulcio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/create_block.mcfunction ================================================ #run from active #@s = players holding a fulcio compass and looking at air positioned ^ ^ ^3 align xyz setblock ~ ~ ~ structure_void keep summon marker ~0.5 ~0.5 ~0.5 {CustomName:"gm4_fulcio_block",Tags:["gm4_fulcio_block"]} ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/init.mcfunction ================================================ scoreboard objectives add gm4_count dummy scoreboard objectives add gm4_fulcio_sneak minecraft.custom:minecraft.sneak_time execute unless score fulcio_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Fulcio Shamir"} execute unless score fulcio_shamir gm4_earliest_version < fulcio_shamir gm4_modules run scoreboard players operation fulcio_shamir gm4_earliest_version = fulcio_shamir gm4_modules scoreboard players set fulcio_shamir gm4_modules 1 schedule function gm4_fulcio_shamir:main 1t schedule function gm4_fulcio_shamir:4_tick 1t #$moduleUpdateList ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/main.mcfunction ================================================ execute as @e[type=marker,tag=gm4_fulcio_block] at @s run function gm4_fulcio_shamir:process_block execute as @a[gamemode=!spectator,scores={gm4_fulcio_sneak=1..},predicate=gm4_fulcio_shamir:holding_fulcio] at @s run function gm4_fulcio_shamir:active scoreboard players reset @a gm4_fulcio_sneak schedule function gm4_fulcio_shamir:main 16t ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/particles.mcfunction ================================================ #@s = fulcio block AEC #run from 10hz particle minecraft:mycelium ~.5 ~.33 ~.33 .125 0 0 0 1 particle minecraft:mycelium ~.5 ~.33 ~.66 .125 0 0 0 1 particle minecraft:mycelium ~.33 ~.33 ~.5 0 0 .125 0 1 particle minecraft:mycelium ~.66 ~.33 ~.5 0 0 .125 0 1 particle minecraft:mycelium ~.5 ~.66 ~.33 .125 0 0 0 1 particle minecraft:mycelium ~.5 ~.66 ~.66 .125 0 0 0 1 particle minecraft:mycelium ~.33 ~.66 ~.5 0 0 .125 0 1 particle minecraft:mycelium ~.66 ~.66 ~.5 0 0 .125 0 1 particle minecraft:mycelium ~.33 ~.5 ~.33 0 .125 0 0 1 particle minecraft:mycelium ~.33 ~.5 ~.66 0 .125 0 0 1 particle minecraft:mycelium ~.66 ~.5 ~.33 0 .125 0 0 1 particle minecraft:mycelium ~.66 ~.5 ~.66 0 .125 0 0 1 ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/process_block.mcfunction ================================================ #run from main #@s = fulcio block marker AEC execute if block ~ ~ ~ structure_void run setblock ~ ~ ~ air kill @s ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/ray.mcfunction ================================================ # @s = area effect cloud ray used to find air # run from active scoreboard players add gm4_ray_counter gm4_count 1 tp @s ^ ^ ^0.1 execute if score gm4_ray_counter gm4_count matches 0..30 at @s positioned ^ ^ ^0.1 if block ~ ~ ~ #minecraft:air positioned as @s run function gm4_fulcio_shamir:ray ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium loot spawn ~ ~ ~ loot gm4_fulcio_shamir:band ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/guidebook/fulcio_shamir.json ================================================ { "id": "fulcio_shamir", "name": "Fulcio Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_fulcio_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'fulcio'}}" } } ] } }, "obtain_fulcio_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'fulcio'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.fulcio_shamir.description", "fallback": "Fulcio changes block placement. While sneaking, blocks can be placed in mid-air." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_fulcio_shamir", "obtain_fulcio_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.fulcio_shamir.usage", "fallback": "The Fulcio Shamir is found on Barimium Bands. It can be placed onto compasses.\n\nHolding the tool and sneaking will create a temporary space where blocks can be placed." } ] ] } ] } ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barimium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_fulcio_shamir:shamir/fulcio"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'fulcio'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.fulcio", "fallback": "Fulcio Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/predicate/holding_fulcio.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "items": [ "minecraft:compass" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'fulcio'}}" } } } } } ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/tags/item/valid_items.json ================================================ { "values": [ "minecraft:compass" ] } ================================================ FILE: gm4_fulcio_shamir/data/gm4_fulcio_shamir/test/smoosh.mcfunction ================================================ # @template gm4_metallurgy:test_smooshing loot spawn ~1.5 ~2.5 ~1.8 loot gm4_fulcio_shamir:band summon item ~1.5 ~2.5 ~1.8 {Item:{id:"minecraft:compass"}} await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..4] contents minecraft:compass[count=1,custom_data~{gm4_metallurgy:{active_shamir:"fulcio"}}] assert items entity @e[type=item,distance=..4] contents minecraft:obsidian[count=1] ================================================ FILE: gm4_fulcio_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_fulcio_shamir:check_item_validity" ] } ================================================ FILE: gm4_fulcio_shamir/data/gm4_metallurgy/tags/function/summon_band/barimium.json ================================================ { "values":[ "gm4_fulcio_shamir:summon_band" ] } ================================================ FILE: gm4_guidebook/CONTRIBUTING.md ================================================ # Contributing to the Guidebook Guidebook sections can be easily added with a custom file. These JSON files are read by beet and the specific datapack contents are automatically generated. Guidebook pages can be locked initially, and players can unlock said pages by completing certain advancement criteria. This behavior is also automatically generated from the custom guidebook file. ## Custom Guidebook File To add a guidebook entry, create a file in the `guidebook` folder, similar to how functions are added to the `functions` folder. For example, the Standard Liquids guidebook pages are found under `gm4_liquid_tanks/data/gm4_standard_liquids/guidebook/standard_liquids.json`. These files will be referred to as "guidebook files" or "guidebook JSONs." ### Guidebook File Contents Guidebook files are JSON files. Below is a description of each field. - `id`: The id of the module. Should be in `snake_case` and NOT contain a namespace (`gm4_`). This is used to alphabetically sort the table of contents - `name`: The name of the module. Should be in `Title Case`. This is what displays in the table of contents and unlock advancement chat message. - `module_type`: The type of module. `module`, `base`, or `expansion`. This is used to display expansions under their base in the table of contents. - `load_check`: Optional. The `id` of the module that this expansion is packaged under. This is used for `load.status` checks. For example Standard Liquids is packaged with Liquid Tanks, so the `standard_liquids` guidebook file will have `liquid_tanks` in this field. - `base_module`: Optional. The `id` of the base module. This is used to display expansions under their base in the table of contents. - `description`: Optional. The description shown in the unlock advancement chat message. Defaults to the website description in `beet.yaml`. - `wiki_link`: Optional. The link to the wiki page for this module. Defaults to the wiki link in `beet.yaml`. - `icon`: The advancement icon shown in the unlock advancment toast. Follows the same format as the `icon` field in advancement files. - `criteria`: The advancement criteria used to unlock pages. Follows the same format as the `criteria` field in advancement files. Each criterion should be named with a short description of what it is detecting. Unlike advancement files, these criteria aren't checked by default; instead each `section` must explicitly specify which criteria applies to each section unlock using `requirements` which is similar to advancement files. - `sections`: A list of the page sections that get unlocked. See below for section contents. ### Guidebook Sections Each section is a JSON dictionary. Below is a description of each field. - `name`: The name of the section. Should give a short description of what the page(s) explain. This is used to name the advancements. - `enable`: A **list** of `load.status` scores to check. This is used to display different page contents based on if other module are installed. For example, boots of ostara mentions that they can prevent desire lines only if desire lines is also installed and enabled. This should come in pairs in which the contents of a single page changes based on if another module is or isn't installed. *Adding* extra pages that only exist if a module is installed is not supported. - `id`: The scoreboard holder (fake player) to check the score. This should be the full name of the fake player, including the `gm4_` namespace (if it's a GM4 module check) - `load`: A non-positive number indicates an unset score. Otherwise it only checks if a score is set to 1 or more. Convention is to use `-1` for a module that isn't enabled and `1` for a module that is enable. - `requirements`: A list of list of `criteria` (from above). Follows the same format as the `requirements` field in advancment files. This is used to unlock the pages in this section once the advancement criteria are completed. If left as an empty list, the page will be unlocked by default. - `prerequisites`: A list of guidebook section `name`s that must be unlocked before this section can be unlocked. Used to gate specific info behind other required info. For example, Zauber Cauldrons potion recipe can only be granted after creating a zauber cauldron. Can be empty. - `grants`: A list of guidebook section `name`s that will be unlocked when this section is unlocked. Used to grant specific info if the expected sequence is skipped. For example if a player obtains a zauber crystal before obtaining the criteria to display the recipe, they will unlock the page with the recipe for a zauber crystal. Can be empty. - `pages`: A list of text components. Follows the same format as tellraw JSON. Some shortcuts have been added to make writing pages easier. - `{"insert": "title"}`: This will insert the `name` of the module (from above) into the page. It will be underlined and add a newline. - `{"insert": "recipe"}`: This will insert a recipe display consisting of a 3x3 input and a single output. The recipe is pulled from a `gm4_recipe` file (see below). ### GM4 Recipes Recipes can be defined with a custom JSON file in the `gm4_recipes` folder (similar to the `functions` folder). This custom recipe file is similar to vanilla recipes, but supports nbt inputs and outputs, along with being able to call functions as the result instead of just a loot table. Below is a description of each field in the JSON dictionary. - `input`: JSON dictionary of the input - `type`: `shaped` or `shapeless` - `recipe`: Only for `shaped`. List of up to 3 strings consisting of up to 3 keys each, similar to normal recipe files. - `ingredients`: Only for `shapeless`. List of `ingredients`. Similar to normal recipe files, but supports the `guidebook` info as seen in the `values` below. Can also be a list of JSON dictionaries for recipes that support alternative items. (The guidebook will display the first item in the list). - `key`: JSON dictionary mapping keys to items (`"key": "value"`). key must be a char and value must be either a JSON dictionaries (described below, starting with `item`) or a list of JSON dictionaries. - `CHAR`: the key character matching the `recipe` and JSON value defining the key. Can also be a list of JSON dictionaries for recipes that support alternative items. (The guidebook will display the first item in the list). - `item`: The minecraft item id. - `tag`: The minecraft item tag. `item` and `tag` should be used exclusively. - `nbt`: Optional. Specific NBT to check along with the item id. - `guidebook`: Specific nbt for the guidebook display to show (e.g. player heads with custom names and textures) - `type`: `loot_table` - `name`: The `loot_table` path. Format is the same as if you'd call `loot give @s loot ...`, so `namespace:subfolder/file.json` - `output`: JSON dictionary of the output - `type`: Optional. `normal`, `special`, or `replace`. Defaults to `normal` - `result`: Optional. Only applies if `type` is `normal` or `replace`. If `type` is `normal`, a JSON dictionary for the resulting output item. - `type`: `loot_table` or `item` - `name`: The id of the `item` or the `loot_table` path. - `count`: Optional. The number of items resulting from a single craft. Defaults to `1`. - `result`: Optional. Only applies if `type` is `normal` or `replace`. If `type` is `replace`, a list of up to 3 strings consisting of up to 3 keys each, similar to normal recipe files. - `key`: Optional. Only applies if `type` is `replace`. Same format as the `key` in `input`, except `count` can be added to specify the number of the item resulting from a single craft (defaults to 1). - `function`: Optional. Only applies if `type` is `special`. Function to run when input recipe is found. - `guidebook`: Optional. If this field exists, the item shown in the guidebook will be shown based on this field. Otherwise the `result` is used to display the item. The guidebook does not support displaying of `special` or `replace` outputs, so this field should be used to overwrite the display. - `type`: `loot_table` or `item` - `name`: The id of `item` or the `loot_table` path. - `count`: Optional. The number of items resulting from a single craft. Defaults to `1` ================================================ FILE: gm4_guidebook/README.md ================================================ # Guidebook Adds a dynamic guidebook to discover the mechanics of Gamemode 4! ### Features - Grows with pages as you discover features from Gamemode 4's data packs - Shows only data packs installed in a world, so you don't think you have features you haven't actually installed ================================================ FILE: gm4_guidebook/advances.json ================================================ { "\u0000": { "unicode": 9 }, "\u0001": { "unicode": 9 }, "\u0002": { "unicode": 9 }, "\u0003": { "unicode": 9 }, "\u0004": { "unicode": 9 }, "\u0005": { "unicode": 9 }, "\u0006": { "unicode": 9 }, "\u0007": { "unicode": 9 }, "\b": { "unicode": 9 }, "\t": { "unicode": 9 }, "\n": { "unicode": 9 }, "\u000b": { "unicode": 9 }, "\f": { "unicode": 9 }, "\r": { "unicode": 9 }, "\u000e": { "unicode": 9 }, "\u000f": { "unicode": 9 }, "\u0010": { "unicode": 9 }, "\u0011": { "unicode": 9 }, "\u0012": { "unicode": 9 }, "\u0013": { "unicode": 9 }, "\u0014": { "unicode": 9 }, "\u0015": { "unicode": 9 }, "\u0016": { "unicode": 9 }, "\u0017": { "unicode": 9 }, "\u0018": { "unicode": 9 }, "\u0019": { "unicode": 9 }, "\u001a": { "unicode": 9 }, "\u001b": { "unicode": 9 }, "\u001c": { "unicode": 9 }, "\u001d": { "unicode": 9 }, "\u001e": { "unicode": 9 }, "\u001f": { "unicode": 9 }, " ": { "unicode": 4 }, "!": 2, "\"": 4, "#": 6, "$": 6, "%": 6, "&": 6, "'": 2, "(": 4, ")": 4, "*": 4, "+": 6, ",": 2, "-": 6, ".": 2, "/": 6, "0": 6, "1": 6, "2": 6, "3": 6, "4": 6, "5": 6, "6": 6, "7": 6, "8": 6, "9": 6, ":": 2, ";": 2, "<": 5, "=": 6, ">": 5, "?": 6, "@": 7, "A": 6, "B": 6, "C": 6, "D": 6, "E": 6, "F": 6, "G": 6, "H": 6, "I": 4, "J": 6, "K": 6, "L": 6, "M": 6, "N": 6, "O": 6, "P": 6, "Q": 6, "R": 6, "S": 6, "T": 6, "U": 6, "V": 6, "W": 6, "X": 6, "Y": 6, "Z": 6, "[": 4, "\\": 6, "]": 4, "^": 6, "_": 6, "`": 3, "a": 6, "b": 6, "c": 6, "d": 6, "e": 6, "f": 5, "g": 6, "h": 6, "i": 2, "j": 6, "k": 5, "l": 3, "m": 6, "n": 6, "o": 6, "p": 6, "q": 6, "r": 6, "s": 6, "t": 4, "u": 6, "v": 6, "w": 6, "x": 6, "y": 6, "z": 6, "{": 4, "|": 2, "}": 4, "~": 7, "\u007f": { "unicode": 9 }, "\u0080": { "unicode": 9 }, "\u0081": { "unicode": 9 }, "\u0082": { "unicode": 9 }, "\u0083": { "unicode": 9 }, "\u0084": { "unicode": 9 }, "\u0085": { "unicode": 9 }, "\u0086": { "unicode": 9 }, "\u0087": { "unicode": 9 }, "\u0088": { "unicode": 9 }, "\u0089": { "unicode": 9 }, "\u008a": { "unicode": 9 }, "\u008b": { "unicode": 9 }, "\u008c": { "unicode": 9 }, "\u008d": { "unicode": 9 }, "\u008e": { "unicode": 9 }, "\u008f": { "unicode": 9 }, "\u0090": { "unicode": 9 }, "\u0091": { "unicode": 9 }, "\u0092": { "unicode": 9 }, "\u0093": { "unicode": 9 }, "\u0094": { "unicode": 9 }, "\u0095": { "unicode": 9 }, "\u0096": { "unicode": 9 }, "\u0097": { "unicode": 9 }, "\u0098": { "unicode": 9 }, "\u0099": { "unicode": 9 }, "\u009a": { "unicode": 9 }, "\u009b": { "unicode": 9 }, "\u009c": { "unicode": 9 }, "\u009d": { "unicode": 9 }, "\u009e": { "unicode": 9 }, "\u009f": { "unicode": 9 }, "\u00a0": { "unicode": 9 }, "\u00a1": 2, "\u00a2": 6, "\u00a3": 6, "\u00a4": 8, "\u00a5": 6, "\u00a6": 2, "\u00a7": 6, "\u00a8": 4, "\u00a9": 8, "\u00aa": 5, "\u00ab": 7, "\u00ac": 6, "\u00ad": 4, "\u00ae": 8, "\u00af": 6, "\u00b0": 5, "\u00b1": 6, "\u00b2": 5, "\u00b3": 5, "\u00b4": 3, "\u00b5": 6, "\u00b6": 7, "\u00b7": 2, "\u00b8": { "unicode": 2 }, "\u00b9": 4, "\u00ba": 5, "\u00bb": 7, "\u00bc": 8, "\u00bd": 8, "\u00be": 8, "\u00bf": 6, "\u00c0": 6, "\u00c1": 6, "\u00c2": 6, "\u00c3": 6, "\u00c4": 6, "\u00c5": 6, "\u00c6": 10, "\u00c7": 6, "\u00c8": 6, "\u00c9": 6, "\u00ca": 6, "\u00cb": 6, "\u00cc": 4, "\u00cd": 4, "\u00ce": 4, "\u00cf": 4, "\u00d0": 7, "\u00d1": 6, "\u00d2": 6, "\u00d3": 6, "\u00d4": 6, "\u00d5": 6, "\u00d6": 6, "\u00d7": 6, "\u00d8": 6, "\u00d9": 6, "\u00da": 6, "\u00db": 6, "\u00dc": 6, "\u00dd": 6, "\u00de": 6, "\u00df": 6, "\u00e0": 6, "\u00e1": 6, "\u00e2": 6, "\u00e3": 6, "\u00e4": 6, "\u00e5": 6, "\u00e6": 10, "\u00e7": 6, "\u00e8": 6, "\u00e9": 6, "\u00ea": 6, "\u00eb": 6, "\u00ec": 3, "\u00ed": 3, "\u00ee": 4, "\u00ef": 4, "\u00f0": 6, "\u00f1": 6, "\u00f2": 6, "\u00f3": 6, "\u00f4": 6, "\u00f5": 6, "\u00f6": 6, "\u00f7": 6, "\u00f8": 6, "\u00f9": 6, "\u00fa": 6, "\u00fb": 6, "\u00fc": 6, "\u00fd": 6, "\u00fe": 6, "\u00ff": 6, "\u0192": 6, "\u2591": 8, "\u2592": 9, "\u2593": 9, "\u2502": 6, "\u2524": 6, "\u2561": 6, "\u2562": 8, "\u2556": 8, "\u2555": 6, "\u2563": 8, "\u2551": 8, "\u2557": 8, "\u255d": 8, "\u255c": 8, "\u255b": 6, "\u2510": 6, "\u2514": 9, "\u2534": 9, "\u252c": 9, "\u251c": 9, "\u2500": 9, "\u253c": 9, "\u255e": 9, "\u255f": 9, "\u255a": 9, "\u2554": 9, "\u2569": 9, "\u2566": 9, "\u2560": 9, "\u2550": 9, "\u256c": 9, "\u2567": 9, "\u2568": 9, "\u2564": 9, "\u2565": 9, "\u2559": 9, "\u2558": 9, "\u2552": 9, "\u2553": 9, "\u256b": 9, "\u256a": 9, "\u2518": 6, "\u250c": 9, "\u2588": 9, "\u2584": 9, "\u258c": 5, "\u2590": 9, "\u2580": 9, "\u2205": 8, "\u2208": 6, "\u2261": 7, "\u2265": 6, "\u2264": 6, "\u2320": 8, "\u2321": 5, "\u2248": 7, "\u2219": 6, "\u221a": 7, "\u207f": 5, "\u25a0": 6, "\u0100": 6, "\u0101": 6, "\u0102": 6, "\u0103": 6, "\u0104": 6, "\u0105": 6, "\u0106": 6, "\u0107": 6, "\u0108": 6, "\u0109": 6, "\u010a": 6, "\u010b": 6, "\u010c": 6, "\u010d": 6, "\u010e": 6, "\u010f": 8, "\u0110": 7, "\u0111": 7, "\u0112": 6, "\u0113": 6, "\u0114": 6, "\u0115": 6, "\u0116": 6, "\u0117": 6, "\u0118": 6, "\u0119": 6, "\u011a": 6, "\u011b": 6, "\u011c": 6, "\u011d": 6, "\u1e20": 6, "\u1e21": 6, "\u011e": 6, "\u011f": 6, "\u0120": 6, "\u0121": 6, "\u0122": 6, "\u0123": 6, "\u0124": 6, "\u0125": 6, "\u0126": 8, "\u0127": 7, "\u0128": 5, "\u0129": 5, "\u012a": 4, "\u012b": 4, "\u012c": 5, "\u012d": 5, "\u012e": 4, "\u012f": 3, "\u0130": 4, "\u0131": 2, "\u0134": 6, "\u0135": 6, "\u0136": 6, "\u0137": 5, "\u0139": 6, "\u013a": 3, "\u013b": 6, "\u013c": 3, "\u013d": 6, "\u013e": 4, "\u013f": 6, "\u0140": 4, "\u0141": 7, "\u0142": 5, "\u0143": 6, "\u0144": 6, "\u0145": 6, "\u0146": 6, "\u0147": 6, "\u0148": 6, "\u014a": 6, "\u014b": 6, "\u014c": 6, "\u014d": 6, "\u014e": 6, "\u014f": 6, "\u0150": 6, "\u0151": 6, "\u0152": 10, "\u0153": 10, "\u0154": 6, "\u0155": 6, "\u0156": 6, "\u0157": 6, "\u0158": 6, "\u0159": 6, "\u015a": 6, "\u015b": 6, "\u015c": 6, "\u015d": 6, "\u015e": 6, "\u015f": 6, "\u0160": 6, "\u0161": 6, "\u0162": 6, "\u0163": 4, "\u0164": 6, "\u0165": 5, "\u0166": 6, "\u0167": 4, "\u0168": 6, "\u0169": 6, "\u016a": 6, "\u016b": 6, "\u016c": 6, "\u016d": 6, "\u016e": 6, "\u016f": 6, "\u0170": 6, "\u0171": 6, "\u0172": 6, "\u0173": 6, "\u0174": 6, "\u0175": 6, "\u0176": 6, "\u0177": 6, "\u0178": 6, "\u0179": 6, "\u017a": 6, "\u017b": 6, "\u017c": 6, "\u017d": 6, "\u017e": 6, "\u01fc": 10, "\u01fd": 10, "\u01fe": 6, "\u01ff": 6, "\u0218": 6, "\u0219": 6, "\u021a": 6, "\u021b": 4, "\u0386": 8, "\u0388": 8, "\u0389": 8, "\u038a": 6, "\u038c": 8, "\u038e": 8, "\u038f": 8, "\u0390": 6, "\u03aa": 4, "\u03ab": 6, "\u03ac": 6, "\u03ad": 6, "\u03ae": 6, "\u03af": 3, "\u03b0": 6, "\u03ca": 4, "\u03cb": 6, "\u03cc": 6, "\u03cd": 6, "\u03ce": 8, "\u0400": 6, "\u0401": 6, "\u0403": 6, "\u0407": 4, "\u040c": 6, "\u040d": 6, "\u040e": 6, "\u0419": 6, "\u0439": 6, "\u0450": 6, "\u0451": 6, "\u0452": 7, "\u0453": 5, "\u0457": 4, "\u045b": 7, "\u045c": 5, "\u045d": 6, "\u045e": 6, "\u045f": 6, "\u0490": 6, "\u0491": 6, "\u1e02": 6, "\u1e03": 6, "\u1e0a": 6, "\u1e0b": 6, "\u1e1e": 6, "\u1e1f": 5, "\u1e22": 6, "\u1e23": 6, "\u1e30": 6, "\u1e31": 5, "\u1e40": 6, "\u1e41": 6, "\u1e56": 6, "\u1e57": 6, "\u1e60": 6, "\u1e61": 6, "\u1e6a": 6, "\u1e6b": 4, "\u1e80": 6, "\u1e81": 6, "\u1e82": 6, "\u1e83": 6, "\u1e84": 6, "\u1e85": 6, "\u1ef2": 6, "\u1ef3": 6, "\u0149": 8, "\u01e7": 6, "\u01eb": 6, "\u040f": 6, "\u1e0d": 6, "\u1e25": 6, "\u1e5b": 6, "\u1e6d": 4, "\u1e92": 6, "\u1eca": 4, "\u1ecb": 2, "\u1ecc": 6, "\u1ecd": 6, "\u1ee4": 6, "\u1ee5": 6, "\u2116": 10, "\u0207": 6, "\u0194": 6, "\u0263": 6, "\u0283": 6, "\u2047": 10, "\u01f1": 10, "\u01f2": 10, "\u01f3": 10, "\u01c4": 10, "\u01c5": 10, "\u01c6": 10, "\u01c7": 10, "\u01c8": 10, "\u01ca": 10, "\u01cb": 10, "\u01cc": 10, "\u2139": 10, "\u1d6b": 10, "\ua732": 10, "\ua733": 10, "\ua734": 10, "\ua735": 10, "\ua736": 10, "\ua737": 10, "\ua738": 10, "\ua73a": 10, "\ua73c": 10, "\ua73d": 9, "\ua74e": 10, "\ua74f": 10, "\ua760": 6, "\ua761": 6, "\ufb04": 10, "\ufb06": 10, "\u16a1": 5, "\u16b5": 5, "\u01a0": 8, "\u01a1": 8, "\u01af": 8, "\u01b0": 8, "\u1eae": 6, "\u1eaf": 6, "\u1ea4": 6, "\u1ea5": 6, "\u1ebe": 6, "\u1ebf": 6, "\u1ed1": 6, "\u1eda": 8, "\u1edb": 8, "\u1ee8": 8, "\u1ee9": 8, "\u1eb0": 6, "\u1eb1": 6, "\u1ea6": 6, "\u1ea7": 6, "\u1ec0": 6, "\u1ec1": 6, "\u1ed3": 6, "\u1edc": 8, "\u1edd": 8, "\u1eea": 8, "\u1eeb": 8, "\u1ea2": 6, "\u1ea3": 6, "\u1eb2": 6, "\u1eb3": 6, "\u1ea8": 6, "\u1ea9": 6, "\u1eba": 6, "\u1ebb": 6, "\u1ed5": 6, "\u1ede": 8, "\u1ec2": 6, "\u1ec3": 6, "\u1ec8": 4, "\u1ec9": 4, "\u1ece": 6, "\u1ecf": 6, "\u1ed4": 6, "\u1edf": 8, "\u1ee6": 6, "\u1ee7": 6, "\u1eec": 8, "\u1eed": 8, "\u1ef6": 6, "\u1ef7": 6, "\u1ea0": 6, "\u1ea1": 6, "\u1eb6": 6, "\u1eb7": 6, "\u1eac": 6, "\u1ead": 6, "\u1eb8": 6, "\u1eb9": 6, "\u1ec6": 6, "\u1ec7": 6, "\u1ed8": 6, "\u1ed9": 6, "\u1ee2": 8, "\u1ee3": 8, "\u1ef0": 8, "\u1ef1": 8, "\u1ef4": 6, "\u1ef5": 6, "\u1ed0": 6, "\u0195": 9, "\u1eaa": 6, "\u1eab": 6, "\u1ed6": 6, "\u1ed7": 6, "\u1eef": 8, "\u261e": 10, "\u261c": 10, "\u262e": 10, "\u1eb4": 6, "\u1eb5": 6, "\u1ebc": 6, "\u1ebd": 6, "\u1ec4": 6, "\u1ec5": 6, "\u1ed2": 6, "\u1ee0": 8, "\u1ee1": 8, "\u1eee": 8, "\u1ef8": 6, "\u1ef9": 6, "\u0498": 6, "\u0499": 6, "\u04a0": 7, "\u04a1": 6, "\u04aa": 6, "\u04ab": 6, "\u01f6": 9, "\u26a0": 10, "\u24ea": 10, "\u2460": 10, "\u2461": 10, "\u2462": 10, "\u2463": 10, "\u2464": 10, "\u2465": 10, "\u2466": 10, "\u2467": 10, "\u2468": 10, "\u2469": 10, "\u246a": 10, "\u246b": 10, "\u246c": 10, "\u246d": 10, "\u246e": 10, "\u246f": 10, "\u2470": 10, "\u2471": 10, "\u2472": 10, "\u2473": 10, "\u24b6": 10, "\u24b7": 10, "\u24b8": 10, "\u24b9": 10, "\u24ba": 10, "\u24bb": 10, "\u24bc": 10, "\u24bd": 10, "\u24be": 10, "\u24bf": 10, "\u24c0": 10, "\u24c1": 10, "\u24c2": 10, "\u24c3": 10, "\u24c4": 10, "\u24c5": 10, "\u24c6": 10, "\u24c7": 10, "\u24c8": 10, "\u24c9": 10, "\u24ca": 10, "\u24cb": 10, "\u24cc": 10, "\u24cd": 10, "\u24ce": 10, "\u24cf": 10, "\u24d0": 10, "\u24d1": 10, "\u24d2": 10, "\u24d3": 10, "\u24d4": 10, "\u24d5": 10, "\u24d6": 10, "\u24d7": 10, "\u24d8": 10, "\u24d9": 10, "\u24da": 10, "\u24db": 10, "\u24dc": 10, "\u24dd": 10, "\u24de": 10, "\u24df": 10, "\u24e0": 10, "\u24e1": 10, "\u24e2": 10, "\u24e3": 10, "\u24e4": 10, "\u24e5": 10, "\u24e6": 10, "\u24e7": 10, "\u24e8": 10, "\u24e9": 10, "\u0327": 3, "\u0282": 6, "\u0290": 7, "\u0276": 10, "\u01cd": 6, "\u01ce": 6, "\u01de": 6, "\u01df": 6, "\u01fa": 6, "\u01fb": 6, "\u0202": 6, "\u0203": 6, "\u0226": 6, "\u0227": 6, "\u01e0": 6, "\u01e1": 6, "\u1e00": 6, "\u1e01": 6, "\u0200": 6, "\u0201": 6, "\u1e06": 6, "\u1e07": 6, "\u1e04": 6, "\u1e05": 6, "\u1d6c": 8, "\u1e08": 6, "\u1e09": 6, "\u1e10": 6, "\u1e11": 6, "\u1e12": 6, "\u1e13": 6, "\u1e0e": 6, "\u1e0f": 6, "\u1e0c": 6, "\u1d6d": 8, "\u1e14": 6, "\u1e15": 6, "\u1e16": 6, "\u1e17": 6, "\u1e18": 6, "\u1e19": 6, "\u1e1c": 6, "\u1e1d": 6, "\u0228": 6, "\u0229": 6, "\u1e1a": 6, "\u1e1b": 6, "\u0204": 6, "\u0205": 6, "\u0206": 6, "\u1d6e": 6, "\u01f4": 6, "\u01f5": 6, "\u01e6": 6, "\u1e26": 6, "\u1e27": 6, "\u1e28": 6, "\u1e29": 6, "\u1e2a": 6, "\u1e2b": 6, "\u021e": 6, "\u021f": 6, "\u1e24": 6, "\u1e96": 6, "\u1e2e": 4, "\u1e2f": 4, "\u020a": 5, "\u020b": 5, "\u01cf": 4, "\u01d0": 4, "\u0208": 6, "\u0209": 6, "\u1e2c": 5, "\u1e2d": 5, "\u01f0": 6, "\u0237": 6, "\u01e8": 6, "\u01e9": 5, "\u1e32": 6, "\u1e33": 5, "\u1e34": 6, "\u1e35": 5, "\u1e3a": 6, "\u1e3b": 4, "\u1e3c": 6, "\u1e3d": 4, "\u1e36": 6, "\u1e37": 3, "\u1e38": 6, "\u1e39": 4, "\u2c62": 8, "\u1e3e": 6, "\u1e3f": 6, "\u1e42": 6, "\u1e43": 6, "\u1d6f": 8, "\u1e44": 6, "\u1e45": 6, "\u1e46": 6, "\u1e47": 6, "\u1e4a": 6, "\u1e4b": 6, "\u01f8": 6, "\u01f9": 6, "\u1e48": 6, "\u1e49": 6, "\u1d70": 8, "\u01ec": 6, "\u01ed": 6, "\u022c": 6, "\u022d": 6, "\u1e4c": 6, "\u1e4d": 6, "\u1e4e": 6, "\u1e4f": 6, "\u1e50": 6, "\u1e51": 6, "\u1e52": 6, "\u1e53": 6, "\u020e": 6, "\u020f": 6, "\u022a": 6, "\u022b": 6, "\u01d1": 6, "\u01d2": 6, "\u022e": 6, "\u022f": 6, "\u0230": 6, "\u0231": 6, "\u020c": 6, "\u020d": 6, "\u01ea": 6, "\u1e54": 6, "\u1e55": 6, "\u1d71": 8, "\u0212": 6, "\u0213": 6, "\u1e58": 6, "\u1e59": 6, "\u1e5c": 6, "\u1e5d": 6, "\u1e5e": 6, "\u1e5f": 6, "\u0210": 6, "\u0211": 6, "\u1e5a": 6, "\u1d73": 8, "\u1d72": 8, "\u1e64": 6, "\u1e65": 6, "\u1e66": 6, "\u1e67": 6, "\u1e62": 6, "\u1e63": 6, "\u1e68": 6, "\u1e69": 6, "\u1d74": 8, "\u1e70": 6, "\u1e71": 4, "\u1e6e": 6, "\u1e6f": 4, "\u1e6c": 6, "\u1e97": 4, "\u1d75": 6, "\u1e72": 6, "\u1e73": 6, "\u1e76": 6, "\u1e77": 6, "\u1e78": 6, "\u1e79": 6, "\u1e7a": 6, "\u1e7b": 6, "\u01d3": 6, "\u01d4": 6, "\u01d5": 6, "\u01d6": 6, "\u01d7": 6, "\u01d8": 6, "\u01d9": 6, "\u01da": 6, "\u01db": 6, "\u01dc": 6, "\u1e74": 6, "\u1e75": 6, "\u0214": 6, "\u0215": 6, "\u0216": 6, "\u1e7e": 6, "\u1e7f": 6, "\u1e7c": 6, "\u1e7d": 6, "\u1e86": 6, "\u1e87": 6, "\u1e88": 6, "\u1e89": 6, "\u1e98": 6, "\u1e8c": 6, "\u1e8d": 6, "\u1e8a": 6, "\u1e8b": 6, "\u0232": 6, "\u0233": 6, "\u1e8e": 6, "\u1e8f": 6, "\u1e99": 6, "\u1e94": 6, "\u1e95": 6, "\u1e90": 6, "\u1e91": 6, "\u1e93": 6, "\u1d76": 6, "\u01ee": 6, "\u01ef": 6, "\u1e9b": 4, "\ua73e": 6, "\ua73f": 6, "\u01e2": 10, "\u01e3": 10, "\u1d7a": 9, "\u1efb": 7, "\u1d02": 10, "\u1d14": 10, "\uab63": 10, "\u0238": 10, "\u02a3": 10, "\u02a5": 10, "\u02a4": 10, "\u02a9": 10, "\u02aa": 8, "\u02ab": 8, "\u0239": 10, "\u02a8": 9, "\u02a6": 9, "\u02a7": 8, "\uab50": 6, "\uab51": 6, "\u20a7": 10, "\u1efa": 8, "\ufb2e": 6, "\ufb2f": 6, "\u0180": 7, "\u0182": 6, "\u0183": 6, "\u0187": 7, "\u0188": 7, "\u018a": 8, "\u018b": 6, "\u018c": 6, "\u0193": 7, "\u01e4": 7, "\u01e5": 7, "\u0197": 4, "\u0196": 4, "\u0269": 3, "\u0198": 6, "\u0199": 5, "\u019d": 7, "\u01a4": 8, "\u01a5": 6, "\u027d": 6, "\u01a6": 6, "\u01ac": 7, "\u01ad": 4, "\u01ab": 4, "\u01ae": 6, "\u0217": 6, "\u01b1": 6, "\u019c": 6, "\u01b3": 7, "\u01b4": 8, "\u01b5": 6, "\u01b6": 6, "\u01a2": 8, "\u01a3": 8, "\u0222": 6, "\u0223": 6, "\u02ad": 6, "\u02ae": 7, "\u02af": 8, "\ufb14": 10, "\ufb15": 10, "\ufb17": 10, "\ufb16": 10, "\ufb13": 10, "\u04d0": 6, "\u04d1": 6, "\u04d2": 6, "\u04d3": 6, "\u04f6": 6, "\u04f7": 5, "\u0494": 6, "\u0495": 5, "\u04d6": 6, "\u04d7": 6, "\u04bc": 8, "\u04bd": 8, "\u04be": 8, "\u04bf": 8, "\u04da": 6, "\u04db": 6, "\u04dc": 8, "\u04dd": 6, "\u04c1": 8, "\u04c2": 6, "\u04de": 6, "\u04df": 6, "\u04e2": 6, "\u04e3": 6, "\u04e4": 6, "\u04e5": 6, "\u04e6": 6, "\u04e7": 6, "\u04ea": 6, "\u04eb": 6, "\u04f0": 6, "\u04f1": 6, "\u04ee": 6, "\u04ef": 6, "\u04f2": 6, "\u04f3": 6, "\u04f4": 6, "\u04f5": 6, "\u04f8": 8, "\u04f9": 7, "\u04ec": 6, "\u04ed": 6, "\u0476": 7, "\u0477": 7, "\u04d4": 10, "\u04fa": 7, "\u0502": 9, "\ua682": 6, "\ua680": 7, "\ua688": 7, "\u052a": 10, "\u052c": 7, "\ua684": 10, "\u0504": 8, "\u0510": 6, "\u04e0": 6, "\u0506": 7, "\u048a": 7, "\u04c3": 6, "\u049e": 7, "\u049c": 6, "\u051e": 6, "\u051a": 6, "\u04c5": 7, "\u052e": 7, "\u0512": 6, "\u0520": 9, "\u0508": 9, "\u0514": 9, "\u04cd": 7, "\u04c9": 7, "\u0528": 7, "\u04c7": 6, "\u04a4": 7, "\u0522": 9, "\u050a": 9, "\u04a8": 7, "\u0524": 7, "\u04a6": 9, "\u048e": 6, "\u0516": 9, "\u050c": 6, "\ua690": 6, "\u04ac": 6, "\ua68a": 7, "\ua68c": 6, "\u050e": 7, "\u04b2": 7, "\u04fc": 6, "\u04fe": 6, "\u0526": 7, "\ua694": 6, "\u04b4": 8, "\ua68e": 7, "\u04b6": 7, "\u04cb": 6, "\u04b8": 6, "\ua692": 7, "\ua696": 9, "\ua686": 6, "\u048c": 7, "\u0518": 10, "\u051c": 6, "\u04d5": 10, "\u04fb": 6, "\u0503": 9, "\ua683": 6, "\ua681": 7, "\ua689": 7, "\u052b": 10, "\u052d": 7, "\ua685": 9, "\u0505": 8, "\u0511": 6, "\u04e1": 6, "\u0507": 7, "\u048b": 7, "\u04c4": 5, "\u049f": 6, "\u049d": 6, "\u051f": 6, "\u051b": 6, "\u04c6": 7, "\u052f": 7, "\u0513": 6, "\u0521": 9, "\u0509": 9, "\u0515": 9, "\u04ce": 7, "\u04ca": 7, "\u0529": 7, "\u04c8": 6, "\u04a5": 7, "\u0523": 9, "\u050b": 9, "\u04a9": 7, "\u0525": 7, "\u04a7": 9, "\u048f": 6, "\u0517": 9, "\u050d": 6, "\ua691": 6, "\u04ad": 6, "\ua68b": 7, "\ua68d": 6, "\u050f": 7, "\u04b3": 7, "\u04fd": 6, "\u04ff": 6, "\u0527": 7, "\ua695": 6, "\u04b5": 7, "\ua68f": 6, "\u04b7": 7, "\u04cc": 6, "\u04b9": 6, "\ua693": 7, "\ua697": 7, "\ua687": 6, "\u048d": 7, "\u0519": 10, "\u051d": 6, "\u1f08": 9, "\u1f00": 6, "\u1f09": 9, "\u1f01": 6, "\u1f0a": 10, "\u1f02": 6, "\u1f0b": 10, "\u1f03": 6, "\u1f0c": 10, "\u1f04": 6, "\u1f0d": 10, "\u1f05": 7, "\u1f0e": 9, "\u1f06": 6, "\u1f0f": 9, "\u1f07": 6, "\u1fba": 9, "\u1f70": 6, "\u1fb8": 6, "\u1fb0": 6, "\u1fb9": 6, "\u1fb1": 6, "\u1fbb": 9, "\u1f71": 6, "\u1f88": 9, "\u1f80": 6, "\u1f89": 9, "\u1f81": 6, "\u1f8a": 10, "\u1f82": 6, "\u1f8b": 10, "\u1f83": 6, "\u1f8c": 10, "\u1f84": 6, "\u1f8d": 10, "\u1f85": 6, "\u1f8e": 9, "\u1f86": 6, "\u1f8f": 9, "\u1f87": 6, "\u1fbc": 6, "\u1fb4": 6, "\u1fb6": 6, "\u1fb7": 6, "\u1fb2": 6, "\u1fb3": 6, "\u1f18": 9, "\u1f10": 6, "\u1f19": 9, "\u1f11": 6, "\u1f1a": 10, "\u1f12": 6, "\u1f1b": 10, "\u1f13": 6, "\u1f1c": 10, "\u1f14": 6, "\u1f1d": 10, "\u1f15": 6, "\u1fc8": 9, "\u1fc9": 9, "\u1f72": 6, "\u1f73": 6, "\u1f28": 9, "\u1f20": 6, "\u1fca": 9, "\u1f74": 6, "\u1f29": 9, "\u1f21": 6, "\u1f2a": 10, "\u1f22": 6, "\u1f2b": 10, "\u1f23": 6, "\u1f2c": 10, "\u1f24": 6, "\u1f2d": 10, "\u1f25": 6, "\u1f2e": 9, "\u1f26": 6, "\u1f2f": 9, "\u1f27": 6, "\u1f98": 9, "\u1f90": 6, "\u1f99": 9, "\u1f91": 6, "\u1f9a": 10, "\u1f92": 6, "\u1f9b": 10, "\u1f93": 6, "\u1f9c": 10, "\u1f94": 6, "\u1f9d": 10, "\u1f95": 6, "\u1f9e": 9, "\u1f96": 6, "\u1f9f": 9, "\u1f97": 6, "\u1fcb": 9, "\u1f75": 6, "\u1fcc": 6, "\u1fc3": 6, "\u1fc2": 6, "\u1fc4": 6, "\u1fc6": 6, "\u1fc7": 6, "\u1fda": 7, "\u1f76": 4, "\u1fdb": 7, "\u1f77": 3, "\u1f38": 7, "\u1f30": 4, "\u1f39": 10, "\u1f31": 3, "\u1f3a": 9, "\u1f32": 6, "\u1f3b": 8, "\u1f33": 6, "\u1f3c": 9, "\u1f34": 6, "\u1f3d": 8, "\u1f35": 6, "\u1f3e": 7, "\u1f36": 5, "\u1f3f": 7, "\u1f37": 5, "\u1fd8": 5, "\u1fd0": 5, "\u1fd9": 4, "\u1fd1": 4, "\u1fd2": 4, "\u1fd3": 4, "\u1fd6": 5, "\u1fd7": 5, "\u1ff8": 9, "\u1f78": 6, "\u1ff9": 9, "\u1f79": 6, "\u1f48": 9, "\u1f40": 6, "\u1f49": 9, "\u1f41": 6, "\u1f4a": 10, "\u1f42": 6, "\u1f4b": 10, "\u1f43": 6, "\u1f4c": 10, "\u1f44": 6, "\u1f4d": 10, "\u1f45": 6, "\u1fec": 9, "\u1fe4": 6, "\u1fe5": 6, "\u1fea": 9, "\u1f7a": 6, "\u1feb": 9, "\u1f7b": 6, "\u1f59": 9, "\u1f51": 6, "\u1f5b": 10, "\u1f53": 6, "\u1f5d": 10, "\u1f55": 6, "\u1f5f": 9, "\u1f57": 6, "\u1fe8": 6, "\u1fe0": 6, "\u1fe9": 6, "\u1fe1": 6, "\u03d3": 10, "\u03d4": 7, "\u1fe2": 6, "\u1fe3": 6, "\u1fe7": 6, "\u1f50": 6, "\u1f52": 6, "\u1f54": 6, "\u1fe6": 6, "\u1f56": 6, "\u1ffa": 9, "\u1f7c": 8, "\u1ffb": 9, "\u1f7d": 8, "\u1f68": 9, "\u1f60": 8, "\u1f69": 9, "\u1f61": 8, "\u1f6a": 10, "\u1f62": 8, "\u1f6b": 10, "\u1f63": 8, "\u1f6c": 10, "\u1f64": 8, "\u1f6d": 10, "\u1f65": 8, "\u1f6e": 9, "\u1f66": 8, "\u1f6f": 10, "\u1f67": 8, "\u1fa8": 9, "\u1fa0": 8, "\u1fa9": 9, "\u1fa1": 8, "\u1faa": 10, "\u1fa2": 8, "\u1fab": 10, "\u1fa3": 8, "\u1fac": 10, "\u1fa4": 8, "\u1fad": 10, "\u1fa5": 8, "\u1fae": 9, "\u1fa6": 8, "\u1faf": 10, "\u1fa7": 8, "\u1ffc": 6, "\u1ff3": 8, "\u1ff2": 8, "\u1ff4": 8, "\u1ff6": 8, "\u1ff7": 8, "\u262f": 10, "\u2610": 10, "\u2611": 10, "\u2612": 10, "\u018d": 6, "\u01ba": 6, "\u2c7e": 6, "\u023f": 6, "\u2c7f": 6, "\u0240": 6, "\u1d80": 6, "\ua7c4": 6, "\ua794": 6, "\u1d81": 7, "\u1d82": 5, "\u1d83": 7, "\ua795": 7, "\u1d84": 6, "\u1d85": 3, "\u1d86": 7, "\u1d87": 7, "\u1d88": 6, "\u1d89": 6, "\u1d8a": 6, "\u1d8b": 6, "\u1d8c": 6, "\u1d8d": 7, "\ua7c6": 7, "\u1d8e": 7, "\u1d8f": 7, "\u1d90": 7, "\u1d92": 7, "\u1d93": 7, "\u1d94": 6, "\u1d95": 7, "\u1d96": 3, "\u1d97": 7, "\u1d98": 6, "\u1d99": 7, "\u1d9a": 6, "\u1e9a": 6, "\u2152": 10, "\u2158": 10, "\u20a8": 10, "\u20af": 10, "\u2030": 8, "\u20b4": 8, "\u2260": 6, "\u04bb": 6, "\u0391": 6, "\u0392": 6, "\u0393": 6, "\u0394": 6, "\u0395": 6, "\u0396": 6, "\u0397": 6, "\u0398": 6, "\u0399": 4, "\u039a": 6, "\u039b": 6, "\u039c": 6, "\u039d": 6, "\u039e": 6, "\u039f": 6, "\u03a0": 6, "\u03a1": 6, "\u03a3": 6, "\u03a4": 6, "\u03a5": 6, "\u03a6": 6, "\u03a7": 6, "\u03a8": 6, "\u03a9": 6, "\u03b1": 6, "\u03b2": 6, "\u03b3": 6, "\u03b4": 6, "\u03b5": 6, "\u03b6": 6, "\u03b7": 6, "\u03b8": 6, "\u03b9": 3, "\u03ba": 5, "\u03bb": 6, "\u03bc": 6, "\u03bd": 6, "\u03be": 6, "\u03bf": 6, "\u03c0": 6, "\u03c1": 6, "\u03c2": 6, "\u03c3": 7, "\u03c4": 6, "\u03c5": 6, "\u03c6": 6, "\u03c7": 6, "\u03c8": 6, "\u03c9": 8, "\u0402": 8, "\u0405": 6, "\u0406": 4, "\u0408": 6, "\u0409": 8, "\u040a": 7, "\u040b": 7, "\u0410": 6, "\u0411": 6, "\u0412": 6, "\u0413": 6, "\u0414": 7, "\u0415": 6, "\u0416": 8, "\u0417": 6, "\u0418": 6, "\u041a": 6, "\u041b": 6, "\u041c": 6, "\u041d": 6, "\u041e": 6, "\u041f": 6, "\u0420": 6, "\u0421": 6, "\u0422": 6, "\u0423": 6, "\u0424": 8, "\u0425": 6, "\u0426": 7, "\u0427": 6, "\u0428": 8, "\u0429": 9, "\u042a": 7, "\u042b": 8, "\u042c": 6, "\u042d": 6, "\u042e": 8, "\u042f": 6, "\u0430": 6, "\u0431": 6, "\u0432": 6, "\u0433": 5, "\u0434": 7, "\u0435": 6, "\u0436": 6, "\u0437": 6, "\u0438": 6, "\u043a": 5, "\u043b": 6, "\u043c": 6, "\u043d": 6, "\u043e": 6, "\u043f": 6, "\u0440": 6, "\u0441": 6, "\u0442": 6, "\u0443": 6, "\u0444": 6, "\u0445": 6, "\u0446": 6, "\u0447": 6, "\u0448": 6, "\u0449": 7, "\u044a": 7, "\u044b": 7, "\u044c": 6, "\u044d": 6, "\u044e": 8, "\u044f": 6, "\u0454": 6, "\u0455": 6, "\u0456": 2, "\u0458": 6, "\u0459": 8, "\u045a": 7, "\u2013": 7, "\u2014": 9, "\u2018": 3, "\u2019": 3, "\u201c": 5, "\u201d": 5, "\u201e": 5, "\u2026": 8, "\u204a": 5, "\u2190": 8, "\u2191": 6, "\u2192": 8, "\u2193": 6, "\u21c4": 8, "\uff0b": 6, "\u018f": 6, "\u0259": 6, "\u025b": 6, "\u026a": 4, "\u04ae": 6, "\u04af": 6, "\u04e8": 6, "\u04e9": 6, "\u02bb": 2, "\u02cc": 2, "\u037e": 2, "\u0138": 5, "\u1e9e": 6, "\u20bd": 7, "\u20ac": 7, "\u0462": 7, "\u0463": 7, "\u0474": 7, "\u0475": 7, "\u04c0": 4, "\u0472": 6, "\u0473": 6, "\u2070": 5, "\u2074": 5, "\u2075": 5, "\u2076": 5, "\u2077": 5, "\u2078": 5, "\u2079": 5, "\u207a": 4, "\u207b": 4, "\u207c": 4, "\u207d": 3, "\u207e": 3, "\u2071": 2, "\u2122": 9, "\u0294": 6, "\u0295": 6, "\u29c8": 8, "\u2694": 8, "\u2620": 8, "\u049a": 7, "\u049b": 6, "\u0492": 7, "\u0493": 6, "\u04b0": 6, "\u04b1": 6, "\u04d8": 6, "\u04d9": 6, "\u0496": 9, "\u0497": 7, "\u04a2": 7, "\u04a3": 7, "\u04ba": 6, "\u05d0": 6, "\u05d1": 6, "\u05d2": 5, "\u05d3": 6, "\u05d4": 6, "\u05d5": 2, "\u05d6": 4, "\u05d7": 6, "\u05d8": 6, "\u05d9": 2, "\u05db": 6, "\u05dc": 6, "\u05de": 6, "\u05dd": 6, "\u05e0": 4, "\u05df": 2, "\u05e1": 6, "\u05e2": 6, "\u05e4": 6, "\u05e3": 6, "\u05e6": 6, "\u05e5": 6, "\u05e7": 6, "\u05e8": 6, "\u0387": 2, "\u2010": 4, "\u201a": 3, "\u2020": 6, "\u2021": 6, "\u2022": 3, "\u2031": 9, "\u2032": 3, "\u2033": 5, "\u2034": 7, "\u2035": 3, "\u2036": 5, "\u2037": 7, "\u2039": 4, "\u203a": 4, "\u203b": 8, "\u203c": 4, "\u203d": 6, "\u2042": 8, "\u2048": 8, "\u2049": 8, "\u204b": 7, "\u204e": 4, "\u204f": 2, "\u2051": 4, "\u2052": 4, "\u2057": 9, "\u2117": 8, "\u2212": 6, "\u2213": 6, "\u221e": 8, "\u2600": 9, "\u2601": 9, "\u2608": 8, "\u0404": 6, "\u2632": 6, "\u2635": 6, "\u263d": 9, "\u2640": 4, "\u2642": 6, "\u26a5": 6, "\u2660": 6, "\u2663": 6, "\u2665": 6, "\u2666": 6, "\u2669": 4, "\u266a": 6, "\u266b": 8, "\u266c": 8, "\u266d": 4, "\u266e": 4, "\u266f": 6, "\u2680": 8, "\u2681": 8, "\u2682": 8, "\u2683": 8, "\u2684": 8, "\u2685": 8, "\u02ac": 6, "\u26a1": 6, "\u26cf": 9, "\u2714": 7, "\u2744": 8, "\u274c": 7, "\u2764": 8, "\u2b50": 8, "\u2e18": 6, "\u2e2e": 6, "\u2e35": 2, "\u2e38": 6, "\u2e41": 2, "\u2e4b": 6, "\u295d": 6, "\u1614": 6, "\u0190": 6, "\u07c8": 6, "\u03db": 6, "\u3125": 6, "\u2c6f": 6, "\u15fa": 6, "\u0186": 6, "\u15e1": 6, "\u018e": 6, "\u2132": 6, "\u2141": 6, "\ua7b0": 6, "\ua780": 6, "\u0500": 6, "\ua779": 6, "\u1d1a": 6, "\u27d8": 6, "\u2229": 6, "\u0245": 6, "\u2144": 6, "\u0250": 6, "\u0254": 6, "\u01dd": 6, "\u025f": 5, "\u1d77": 6, "\u0265": 6, "\u1d09": 2, "\u027e": 6, "\u029e": 5, "\ua781": 3, "\u026f": 6, "\u0279": 6, "\u0287": 4, "\u028c": 6, "\u028d": 6, "\u028e": 6, "\u0531": 6, "\u0532": 6, "\u0533": 7, "\u0534": 7, "\u0536": 6, "\u0537": 6, "\u0539": 7, "\u053a": 7, "\u053b": 6, "\u053c": 5, "\u053d": 7, "\u053e": 6, "\u053f": 6, "\u0540": 6, "\u0541": 6, "\u0542": 7, "\u0543": 6, "\u0544": 7, "\u0545": 6, "\u0546": 6, "\u0547": 6, "\u0548": 6, "\u0549": 6, "\u054b": 6, "\u054c": 7, "\u054d": 6, "\u054e": 6, "\u054f": 6, "\u0550": 6, "\u0551": 6, "\u0552": 5, "\u0553": 6, "\u0554": 6, "\u0555": 6, "\u0556": 6, "\u0559": 3, "\u0561": 6, "\u0562": 6, "\u0563": 7, "\u0564": 7, "\u0565": 6, "\u0566": 7, "\u0567": 5, "\u0568": 6, "\u0569": 6, "\u056a": 7, "\u056b": 6, "\u056c": 3, "\u056d": 7, "\u056e": 6, "\u056f": 6, "\u0570": 6, "\u0571": 6, "\u0572": 7, "\u0573": 6, "\u0574": 7, "\u0575": 6, "\u0576": 7, "\u0577": 6, "\u0578": 6, "\u0579": 6, "\u057a": 6, "\u057b": 6, "\u057c": 6, "\u057d": 6, "\u057e": 7, "\u057f": 8, "\u0580": 6, "\u0581": 6, "\u0582": 5, "\u0583": 8, "\u0584": 7, "\u0585": 6, "\u0586": 6, "\u0587": 7, "\u05e9": 6, "\u05ea": 6, "\u0538": 6, "\u055a": 3, "\u055b": 3, "\u055c": 4, "\u055d": 3, "\u055e": 4, "\u055f": 6, "\u0560": 6, "\u0588": 7, "\u058f": 6, "\u017f": 4, "\u01b7": 6, "\u0292": 6, "\u01f7": 6, "\u01bf": 6, "\u021c": 6, "\u021d": 6, "\u0224": 6, "\u0225": 6, "\u02d9": 2, "\ua75a": 6, "\ua75b": 5, "\u2011": 4, "\u214b": 6, "\u23cf": 6, "\u23e9": 7, "\u23ea": 7, "\u23ed": 8, "\u23ee": 8, "\u23ef": 7, "\u23f4": 4, "\u23f5": 4, "\u23f6": 6, "\u23f7": 6, "\u23f8": 4, "\u23f9": 6, "\u23fa": 6, "\u23fb": 8, "\u23fc": 8, "\u23fd": 2, "\u2b58": 8, "\u25b2": 6, "\u25b6": 7, "\u25bc": 6, "\u25c0": 7, "\u25cf": 5, "\u25e6": 4, "\u25d8": 4, "\u2693": 8, "\u26e8": 8, "\u0132": 6, "\u0133": 5, "\u01c9": 8, "\ua728": 8, "\ua729": 7, "\ua739": 9, "\ua73b": 9, "\ufb00": 8, "\ufb01": 6, "\ufb02": 7, "\ufb03": 9, "\ufb05": 6, "\ufffd": 8, "\u0535": 6, "\u054a": 6, "\u16a0": 5, "\u16a2": 6, "\u16a3": 6, "\u16a4": 6, "\u16a5": 6, "\u16a6": 5, "\u16a7": 5, "\u16a8": 4, "\u16a9": 5, "\u16aa": 5, "\u16ab": 5, "\u16ac": 6, "\u16ad": 4, "\u16ae": 4, "\u16af": 6, "\u16b0": 6, "\u16b1": 5, "\u16b2": 4, "\u16b3": 5, "\u16b4": 5, "\u16b6": 6, "\u16b7": 6, "\u16b8": 6, "\u16b9": 5, "\u16ba": 6, "\u16bb": 6, "\u16bc": 6, "\u16bd": 4, "\u16be": 6, "\u16bf": 4, "\u16c0": 6, "\u16c1": 2, "\u16c2": 4, "\u16c3": 7, "\u16c4": 6, "\u16c5": 6, "\u16c6": 4, "\u16c7": 6, "\u16c8": 5, "\u16c9": 6, "\u16ca": 4, "\u16cb": 6, "\u16cc": 2, "\u16cd": 4, "\u16ce": 6, "\u16cf": 6, "\u16d0": 4, "\u16d1": 5, "\u16d2": 5, "\u16d3": 4, "\u16d4": 5, "\u16d5": 5, "\u16d6": 6, "\u16d7": 6, "\u16d8": 6, "\u16d9": 4, "\u16da": 4, "\u16db": 5, "\u16dc": 6, "\u16dd": 6, "\u16de": 6, "\u16df": 7, "\u16e0": 8, "\u16e1": 6, "\u16e2": 8, "\u16e3": 6, "\u16e4": 6, "\u16e5": 6, "\u16e6": 6, "\u16e7": 2, "\u16e8": 6, "\u16e9": 5, "\u16ea": 8, "\u16eb": 3, "\u16ec": 2, "\u16ed": 6, "\u16ee": 6, "\u16ef": 6, "\u16f0": 6, "\u16f1": 6, "\u16f2": 6, "\u16f3": 8, "\u16f4": 5, "\u16f5": 3, "\u16f6": 6, "\u16f7": 6, "\u16f8": 6, "\u263a": 6, "\u263b": 8, "\u2639": 6, "\u05da": 6, "\u05f3": 3, "\u05f4": 5, "\u05f0": 4, "\u05f1": 4, "\u05f2": 4, "\u05be": 6, "\u05c3": 2, "\u05c6": 4, "\u1d00": 6, "\u0299": 6, "\u1d04": 6, "\u1d05": 6, "\u1d07": 6, "\ua730": 6, "\u0262": 6, "\u029c": 6, "\u1d0a": 6, "\u1d0b": 6, "\u029f": 6, "\u1d0d": 6, "\u0274": 6, "\u1d0f": 6, "\u1d18": 6, "\ua7af": 6, "\u0280": 6, "\ua731": 6, "\u1d1b": 6, "\u1d1c": 6, "\u1d20": 6, "\u1d21": 6, "\u028f": 6, "\u1d22": 6, "\u0271": 6, "\u0273": 7, "\u0272": 7, "\u0288": 4, "\u0256": 7, "\u0261": 6, "\u02a1": 6, "\u0255": 6, "\u0291": 6, "\u0278": 6, "\u029d": 6, "\u02a2": 6, "\u027b": 7, "\u0281": 6, "\u0266": 6, "\u028b": 6, "\u0270": 6, "\u026c": 5, "\u026e": 6, "\u0298": 6, "\u01c0": 2, "\u01c3": 2, "\u01c2": 6, "\u01c1": 4, "\u0253": 6, "\u0257": 7, "\u1d91": 7, "\u0284": 7, "\u0260": 7, "\u029b": 7, "\u0267": 6, "\u026b": 6, "\u0268": 4, "\u0289": 8, "\u028a": 6, "\u0258": 6, "\u0275": 6, "\u0264": 6, "\u025c": 6, "\u025e": 6, "\u0251": 6, "\u0252": 6, "\u025a": 8, "\u025d": 8, "\u0181": 8, "\u0189": 7, "\u0191": 7, "\u01a9": 6, "\u01b2": 6, "\u10a0": 6, "\u10a1": 8, "\u10a2": 8, "\u10a3": 6, "\u10a4": 6, "\u10a5": 8, "\u10a6": 8, "\u10a7": 8, "\u10a8": 6, "\u10a9": 6, "\u10aa": 8, "\u10ab": 7, "\u10ac": 6, "\u10ad": 8, "\u10ae": 8, "\u10af": 7, "\u10b0": 8, "\u10b1": 6, "\u10b2": 6, "\u10b3": 8, "\u10b4": 6, "\u10b5": 6, "\u10b6": 6, "\u10b7": 6, "\u10b8": 6, "\u10b9": 6, "\u10ba": 6, "\u10bb": 8, "\u10bc": 6, "\u10bd": 6, "\u10be": 6, "\u10bf": 6, "\u10c0": 8, "\u10c1": 6, "\u10c2": 6, "\u10c3": 6, "\u10c4": 6, "\u10c5": 8, "\u10c7": 6, "\u10cd": 6, "\u10d0": 6, "\u10d1": 6, "\u10d2": 6, "\u10d3": 6, "\u10d4": 6, "\u10d5": 6, "\u10d6": 6, "\u10d7": 6, "\u10d8": 6, "\u10d9": 6, "\u10da": 8, "\u10db": 6, "\u10dc": 6, "\u10dd": 6, "\u10de": 6, "\u10df": 6, "\u10e0": 6, "\u10e1": 6, "\u10e2": 6, "\u10e3": 6, "\u10e4": 6, "\u10e5": 6, "\u10e6": 6, "\u10e7": 6, "\u10e8": 6, "\u10e9": 6, "\u10ea": 6, "\u10eb": 6, "\u10ec": 6, "\u10ed": 6, "\u10ee": 6, "\u10ef": 5, "\u10f0": 6, "\u10f1": 7, "\u10f2": 6, "\u10f3": 6, "\u10f4": 6, "\u10f5": 6, "\u10f6": 6, "\u10f7": 6, "\u10f8": 6, "\u10f9": 6, "\u10fa": 6, "\u10fb": 4, "\u10fc": 4, "\u10fd": 6, "\u10fe": 6, "\u10ff": 6, "\ufb4a": 6, "\ufb2b": 6, "\ufb4e": 6, "\ufb44": 6, "\ufb3b": 5, "\ufb1f": 4, "\ufb1d": 2, "\ufb4b": 3, "\ufb35": 4, "\ufb4c": 6, "\ufb31": 6, "\ua727": 6, "\ua726": 6, "\u027a": 6, "\u2c71": 8, "\u02a0": 7, "\u0297": 6, "\u0296": 6, "\u026d": 3, "\u0277": 8, "\u027f": 6, "\u0285": 6, "\u0286": 7, "\u0293": 6, "\u029a": 6, "\u20aa": 8, "\u20be": 7, "\u058a": 6, "\u2d00": 6, "\u2d01": 7, "\u2d02": 7, "\u2d03": 6, "\u2d04": 6, "\u2d05": 6, "\u2d06": 7, "\u2d21": 6, "\u2d07": 6, "\u2d08": 6, "\u2d09": 6, "\u2d0a": 6, "\u2d0b": 6, "\u2d0c": 6, "\u2d22": 6, "\u2d0d": 6, "\u2d0e": 7, "\u2d0f": 7, "\u2d10": 6, "\u2d11": 6, "\u2d12": 6, "\u2d23": 6, "\u2d13": 6, "\u2d14": 6, "\u2d15": 6, "\u2d16": 6, "\u2d17": 6, "\u2d18": 6, "\u2d19": 6, "\u2d1a": 6, "\u2d1b": 6, "\u2d1c": 6, "\u2d1d": 7, "\u2d1e": 6, "\u2d24": 6, "\u2d1f": 6, "\u2d20": 6, "\u2d25": 6, "\u215b": 9, "\u215c": 9, "\u215d": 9, "\u215e": 9, "\u2153": 9, "\u2154": 9, "\u2709": 8, "\u2602": 8, "\u2614": 8, "\u2604": 8, "\u26c4": 7, "\u2603": 8, "\u231b": 8, "\u231a": 8, "\u2690": 8, "\u270e": 8, "\u2763": 6, "\u2664": 6, "\u2667": 6, "\u2661": 6, "\u2662": 6, "\u26c8": 9, "\u2630": 6, "\u2631": 6, "\u2633": 6, "\u2634": 6, "\u2636": 6, "\u2637": 6, "\u2194": 9, "\u21d2": 9, "\u21cf": 9, "\u21d4": 9, "\u21f5": 7, "\u2200": 8, "\u2203": 6, "\u2204": 6, "\u2209": 6, "\u220b": 6, "\u220c": 6, "\u2282": 6, "\u2283": 6, "\u2284": 6, "\u2285": 6, "\u2227": 6, "\u2228": 6, "\u22bb": 6, "\u22bc": 6, "\u22bd": 6, "\u2225": 4, "\u2262": 7, "\u22c6": 4, "\u2211": 6, "\u22a4": 6, "\u22a5": 6, "\u22a2": 6, "\u22a8": 6, "\u2254": 8, "\u2201": 5, "\u2234": 6, "\u2235": 6, "\u221b": 8, "\u221c": 8, "\u2202": 6, "\u22c3": 6, "\u2286": 6, "\u2287": 6, "\u25a1": 6, "\u25b3": 6, "\u25b7": 7, "\u25bd": 6, "\u25c1": 7, "\u25c6": 6, "\u25c7": 6, "\u25cb": 6, "\u25ce": 8, "\u2606": 8, "\u2605": 8, "\u2718": 7, "\u2080": 5, "\u2081": 4, "\u2082": 5, "\u2083": 5, "\u2084": 5, "\u2085": 5, "\u2086": 5, "\u2087": 5, "\u2088": 5, "\u2089": 5, "\u208a": 4, "\u208b": 4, "\u208c": 4, "\u208d": 3, "\u208e": 3, "\u222b": 6, "\u222e": 6, "\u221d": 7, "\u2300": 8, "\u2302": 8, "\u2318": 8, "\u3012": 6, "\u027c": 6, "\u0184": 7, "\u0185": 7, "\u1e9f": 6, "\u023d": 7, "\u019a": 4, "\u019b": 6, "\u0220": 6, "\u019e": 6, "\u019f": 6, "\u01a7": 6, "\u01a8": 6, "\u01aa": 6, "\u01b8": 6, "\u01b9": 6, "\u01bb": 6, "\u01bc": 6, "\u01bd": 6, "\u01be": 6, "\u0221": 8, "\u0234": 4, "\u0235": 8, "\u0236": 5, "\u023a": 6, "\u2c65": 7, "\u023b": 6, "\u023c": 6, "\u0246": 6, "\u0247": 7, "\u023e": 6, "\u2c66": 6, "\u0241": 6, "\u0242": 6, "\u0243": 7, "\u0244": 8, "\u0248": 7, "\u0249": 7, "\u024a": 7, "\u024b": 7, "\u024c": 7, "\u024d": 7, "\u024e": 8, "\u024f": 8, "\u1e9c": 5, "\u1e9d": 5, "\u1efc": 6, "\u1efd": 5, "\u1efe": 6, "\u1eff": 7, "\ua7a8": 7, "\ua7a9": 6, "\ud800\udf30": 6, "\ud800\udf31": 6, "\ud800\udf32": 6, "\ud800\udf33": 6, "\ud800\udf34": 6, "\ud800\udf35": 6, "\ud800\udf36": 6, "\ud800\udf37": 6, "\ud800\udf38": 6, "\ud800\udf39": 2, "\ud800\udf3a": 6, "\ud800\udf3b": 6, "\ud800\udf3c": 6, "\ud800\udf3d": 6, "\ud800\udf3e": 6, "\ud800\udf3f": 6, "\ud800\udf40": 6, "\ud800\udf41": 6, "\ud800\udf42": 6, "\ud800\udf43": 6, "\ud800\udf44": 6, "\ud800\udf45": 6, "\ud800\udf46": 6, "\ud800\udf47": 6, "\ud800\udf48": 6, "\ud800\udf49": 6, "\ud800\udf4a": 6, "\ud83c\udf27": 9, "\ud83d\udd25": 7, "\ud83c\udf0a": 9, "\u2150": 9, "\u2151": 9, "\u2155": 9, "\u2156": 9, "\u2157": 9, "\u2159": 8, "\u215a": 8, "\u215f": 7, "\u2189": 9, "\ud83d\udde1": 9, "\ud83c\udff9": 9, "\ud83e\ude93": 7, "\ud83d\udd31": 9, "\ud83c\udfa3": 9, "\ud83e\uddea": 8, "\u2697": 8, "\u2bea": 8, "\u2beb": 8, "\u2c6d": 6, "\ud83d\udee1": 8, "\u2702": 8, "\ud83c\udf56": 9, "\ud83e\udea3": 8, "\ud83d\udd14": 8, "\u23f3": 8, "\u2691": 8, "\u20a0": 6, "\u20a1": 6, "\u20a2": 6, "\u20a3": 7, "\u20a4": 6, "\u20a5": 6, "\u20a6": 8, "\u20a9": 8, "\u20ab": 7, "\u20ad": 7, "\u20ae": 6, "\u20b0": 6, "\u20b1": 8, "\u20b2": 6, "\u20b3": 8, "\u20b5": 6, "\u20b6": 6, "\u20b7": 8, "\u20b8": 6, "\u20b9": 6, "\u20ba": 7, "\u20bb": 8, "\u20bc": 6, "\u20bf": 6 } ================================================ FILE: gm4_guidebook/assets/gm4/font/gm4_items.json ================================================ { "providers": [ { "type": "bitmap", "file": "gm4:item/boots_of_ostara/boots_of_ostara_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u4101" ] }, { "type": "bitmap", "file": "gm4:item/boots_of_ostara/boots_of_ostara.png", "ascent": 8, "height": 16, "chars": [ "\u4102" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/flippers_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u4103" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/flippers.png", "ascent": 8, "height": 16, "chars": [ "\u4104" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/scuba_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u4105" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/scuba_tank.png", "ascent": 8, "height": 16, "chars": [ "\u4106" ] }, { "type": "bitmap", "file": "gm4:item/heart_canisters/heart_canister_tier_1.png", "ascent": 8, "height": 16, "chars": [ "\u4109" ] }, { "type": "bitmap", "file": "gm4:item/tunnel_bores/piston_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u4110" ] }, { "type": "bitmap", "file": "gm4:item/orb_of_ankou/orb_of_ankou_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u4111" ] }, { "type": "bitmap", "file": "gm4:item/orb_of_ankou/orb_of_ankou.png", "ascent": 8, "height": 16, "chars": [ "\u4112" ] }, { "type": "bitmap", "file": "gm4:item/boots_of_ostara/boots_of_ostara_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u4201" ] }, { "type": "bitmap", "file": "gm4:item/boots_of_ostara/boots_of_ostara.png", "ascent": -32768, "height": -16, "chars": [ "\u4202" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/flippers_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u4203" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/flippers.png", "ascent": -32768, "height": -16, "chars": [ "\u4204" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/scuba_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u4205" ] }, { "type": "bitmap", "file": "gm4:item/scuba_gear/scuba_tank.png", "ascent": -32768, "height": -16, "chars": [ "\u4206" ] }, { "type": "bitmap", "file": "gm4:item/heart_canisters/heart_canister_tier_1.png", "ascent": -32768, "height": -16, "chars": [ "\u4209" ] }, { "type": "bitmap", "file": "gm4:item/tunnel_bores/piston_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u4210" ] }, { "type": "bitmap", "file": "gm4:item/orb_of_ankou/orb_of_ankou_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u4211" ] }, { "type": "bitmap", "file": "gm4:item/orb_of_ankou/orb_of_ankou.png", "ascent": -32768, "height": -16, "chars": [ "\u4212" ] } ] } ================================================ FILE: gm4_guidebook/assets/gm4/font/guidebook.json ================================================ { "providers": [ { "type": "space", "advances": { " ": 4, "\u200c": 0, "\ue001": -1, "\ue002": -2, "\ue005": -5, "\ue007": -7, "\ue008": -8, "\ue010": -10, "\ue012": -12, "\ue014": -14, "\ue016": -16, "\ue018": -18, "\ue030": -30, "\ue148": -161, "\uf001": 1, "\uf003": 3, "\uf004": 4, "\uf008": 8, "\uf015": 15, "\uf016": 16, "\uf018": 18, "\uf019": 19, "\uf032": 32, "\uf037": 37, "\uf048": 48, "\uf110": 110, "☒": 10 } }, { "type": "bitmap", "file": "gm4_guidebook:font_magic/spacing_square.png", "ascent": -32768, "height": -2, "chars": [ "\uffff" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/shapeless.png", "ascent": 8, "height": 10, "chars": [ "🔀" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/locked_page.png", "ascent": 24, "height": 40, "chars": [ "?" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/toast.png", "ascent": 25, "height": 32, "chars": [ "\u9000" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/toast_icon.png", "ascent": 25, "height": 32, "chars": [ "\u9001" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/crafting_grid.png", "ascent": 7, "height": 68, "chars": [ "\u9002" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/crafting_grid.png", "ascent": -32768, "height": -68, "chars": [ "\u9003" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page.png", "ascent": 55, "height": 256, "chars": [ "\u9004" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page.png", "ascent": -32768, "height": -256, "chars": [ "\u9005" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_edge.png", "ascent": -32768, "height": -256, "chars": [ "\u9006" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_edge.png", "ascent": 55, "height": 256, "chars": [ "\u9007" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_intro.png", "ascent": 37, "height": 256, "chars": [ "\u9008" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_intro.png", "ascent": -32768, "height": -256, "chars": [ "\u9009" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_edge_intro.png", "ascent": -32768, "height": -256, "chars": [ "\u900a" ] }, { "type": "bitmap", "file": "gm4_guidebook:gui/page_edge_intro.png", "ascent": 37, "height": 256, "chars": [ "\u900b" ] }, { "type": "bitmap", "file": "gm4_guidebook:font_magic/numbers.png", "ascent": 0, "height": 8, "chars": [ "\u0abf\u0ac0\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac6\u0ac7\u0ac8" ] } ] } ================================================ FILE: gm4_guidebook/assets/gm4/font/vanilla_items.json ================================================ { "providers": [ { "type": "bitmap", "file": "minecraft:item/acacia_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u0903" ] }, { "type": "bitmap", "file": "minecraft:item/acacia_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0904" ] }, { "type": "bitmap", "file": "minecraft:block/acacia_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u0905" ] }, { "type": "bitmap", "file": "minecraft:item/acacia_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u0906" ] }, { "type": "bitmap", "file": "minecraft:block/activator_rail.png", "ascent": -32768, "height": -16, "chars": [ "\u0907" ] }, { "type": "bitmap", "file": "minecraft:block/allium.png", "ascent": -32768, "height": -16, "chars": [ "\u0908" ] }, { "type": "bitmap", "file": "minecraft:block/amethyst_cluster.png", "ascent": -32768, "height": -16, "chars": [ "\u0909" ] }, { "type": "bitmap", "file": "minecraft:item/amethyst_shard.png", "ascent": -32768, "height": -16, "chars": [ "\u090a" ] }, { "type": "bitmap", "file": "minecraft:item/apple.png", "ascent": -32768, "height": -16, "chars": [ "\u090b" ] }, { "type": "bitmap", "file": "minecraft:item/armor_stand.png", "ascent": -32768, "height": -16, "chars": [ "\u090c" ] }, { "type": "bitmap", "file": "minecraft:item/arrow.png", "ascent": -32768, "height": -16, "chars": [ "\u090d" ] }, { "type": "bitmap", "file": "minecraft:item/axolotl_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u090e" ] }, { "type": "bitmap", "file": "minecraft:block/azure_bluet.png", "ascent": -32768, "height": -16, "chars": [ "\u090f" ] }, { "type": "bitmap", "file": "minecraft:item/baked_potato.png", "ascent": -32768, "height": -16, "chars": [ "\u0910" ] }, { "type": "bitmap", "file": "minecraft:item/bamboo.png", "ascent": -32768, "height": -16, "chars": [ "\u0911" ] }, { "type": "bitmap", "file": "minecraft:item/barrier.png", "ascent": -32768, "height": -16, "chars": [ "\u0912" ] }, { "type": "bitmap", "file": "minecraft:item/beef.png", "ascent": -32768, "height": -16, "chars": [ "\u0913" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot.png", "ascent": -32768, "height": -16, "chars": [ "\u0914" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot_seeds.png", "ascent": -32768, "height": -16, "chars": [ "\u0915" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot_soup.png", "ascent": -32768, "height": -16, "chars": [ "\u0916" ] }, { "type": "bitmap", "file": "minecraft:item/bell.png", "ascent": -32768, "height": -16, "chars": [ "\u0917" ] }, { "type": "bitmap", "file": "minecraft:item/birch_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u0916" ] }, { "type": "bitmap", "file": "minecraft:item/birch_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0919" ] }, { "type": "bitmap", "file": "minecraft:block/birch_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u091a" ] }, { "type": "bitmap", "file": "minecraft:item/birch_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u091b" ] }, { "type": "bitmap", "file": "minecraft:item/black_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u091c" ] }, { "type": "bitmap", "file": "minecraft:item/black_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u091d" ] }, { "type": "bitmap", "file": "minecraft:block/black_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u091e" ] }, { "type": "bitmap", "file": "minecraft:item/blaze_powder.png", "ascent": -32768, "height": -16, "chars": [ "\u091f" ] }, { "type": "bitmap", "file": "minecraft:item/blaze_rod.png", "ascent": -32768, "height": -16, "chars": [ "\u0920" ] }, { "type": "bitmap", "file": "minecraft:item/blue_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0921" ] }, { "type": "bitmap", "file": "minecraft:item/blue_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0922" ] }, { "type": "bitmap", "file": "minecraft:block/blue_orchid.png", "ascent": -32768, "height": -16, "chars": [ "\u0923" ] }, { "type": "bitmap", "file": "minecraft:block/blue_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0924" ] }, { "type": "bitmap", "file": "minecraft:item/bone.png", "ascent": -32768, "height": -16, "chars": [ "\u0925" ] }, { "type": "bitmap", "file": "minecraft:item/bone_meal.png", "ascent": -32768, "height": -16, "chars": [ "\u0926" ] }, { "type": "bitmap", "file": "minecraft:item/book.png", "ascent": -32768, "height": -16, "chars": [ "\u0927" ] }, { "type": "bitmap", "file": "minecraft:item/bow.png", "ascent": -32768, "height": -16, "chars": [ "\u0928" ] }, { "type": "bitmap", "file": "minecraft:item/bowl.png", "ascent": -32768, "height": -16, "chars": [ "\u0929" ] }, { "type": "bitmap", "file": "minecraft:block/brain_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u092a" ] }, { "type": "bitmap", "file": "minecraft:block/brain_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u092b" ] }, { "type": "bitmap", "file": "minecraft:item/bread.png", "ascent": -32768, "height": -16, "chars": [ "\u092c" ] }, { "type": "bitmap", "file": "minecraft:item/brewing_stand.png", "ascent": -32768, "height": -16, "chars": [ "\u092d" ] }, { "type": "bitmap", "file": "minecraft:item/brick.png", "ascent": -32768, "height": -16, "chars": [ "\u092e" ] }, { "type": "bitmap", "file": "minecraft:item/elytra_broken.png", "ascent": -32768, "height": -16, "chars": [ "\u092f" ] }, { "type": "bitmap", "file": "minecraft:item/brown_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0930" ] }, { "type": "bitmap", "file": "minecraft:item/brown_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0931" ] }, { "type": "bitmap", "file": "minecraft:block/brown_mushroom.png", "ascent": -32768, "height": -16, "chars": [ "\u0932" ] }, { "type": "bitmap", "file": "minecraft:block/brown_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0933" ] }, { "type": "bitmap", "file": "minecraft:block/bubble_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0934" ] }, { "type": "bitmap", "file": "minecraft:block/bubble_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0935" ] }, { "type": "bitmap", "file": "minecraft:item/bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0936" ] }, { "type": "bitmap", "file": "minecraft:item/bundle.png", "ascent": -32768, "height": -16, "chars": [ "\u0937" ] }, { "type": "bitmap", "file": "minecraft:item/cake.png", "ascent": -32768, "height": -16, "chars": [ "\u0939" ] }, { "type": "bitmap", "file": "minecraft:item/campfire.png", "ascent": -32768, "height": -16, "chars": [ "\u093a" ] }, { "type": "bitmap", "file": "minecraft:item/candle.png", "ascent": -32768, "height": -16, "chars": [ "\u093b" ] }, { "type": "bitmap", "file": "minecraft:item/carrot.png", "ascent": -32768, "height": -16, "chars": [ "\u093c" ] }, { "type": "bitmap", "file": "minecraft:item/carrot_on_a_stick.png", "ascent": -32768, "height": -16, "chars": [ "\u093d" ] }, { "type": "bitmap", "file": "minecraft:item/cauldron.png", "ascent": -32768, "height": -16, "chars": [ "\u093e" ] }, { "type": "bitmap", "file": "minecraft:item/iron_chain.png", "ascent": -32768, "height": -16, "chars": [ "\u093f" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u0940" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u0941" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u0942" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u0943" ] }, { "type": "bitmap", "file": "minecraft:item/charcoal.png", "ascent": -32768, "height": -16, "chars": [ "\u0944" ] }, { "type": "bitmap", "file": "minecraft:item/chest_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u0945" ] }, { "type": "bitmap", "file": "minecraft:item/chicken.png", "ascent": -32768, "height": -16, "chars": [ "\u0946" ] }, { "type": "bitmap", "file": "minecraft:item/chorus_fruit.png", "ascent": -32768, "height": -16, "chars": [ "\u0947" ] }, { "type": "bitmap", "file": "minecraft:item/clay_ball.png", "ascent": -32768, "height": -16, "chars": [ "\u0948" ] }, { "type": "bitmap", "file": "minecraft:item/clock_00.png", "ascent": -32768, "height": -16, "chars": [ "\u0949" ] }, { "type": "bitmap", "file": "minecraft:item/coal.png", "ascent": -32768, "height": -16, "chars": [ "\u094a" ] }, { "type": "bitmap", "file": "minecraft:block/cobweb.png", "ascent": -32768, "height": -16, "chars": [ "\u094b" ] }, { "type": "bitmap", "file": "minecraft:item/cocoa_beans.png", "ascent": -32768, "height": -16, "chars": [ "\u094c" ] }, { "type": "bitmap", "file": "minecraft:item/cod.png", "ascent": -32768, "height": -16, "chars": [ "\u094d" ] }, { "type": "bitmap", "file": "minecraft:item/cod_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u094e" ] }, { "type": "bitmap", "file": "minecraft:item/command_block_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u094f" ] }, { "type": "bitmap", "file": "minecraft:item/comparator.png", "ascent": -32768, "height": -16, "chars": [ "\u0950" ] }, { "type": "bitmap", "file": "minecraft:item/compass_16.png", "ascent": -32768, "height": -16, "chars": [ "\u0951" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_beef.png", "ascent": -32768, "height": -16, "chars": [ "\u0952" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_chicken.png", "ascent": -32768, "height": -16, "chars": [ "\u0953" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_cod.png", "ascent": -32768, "height": -16, "chars": [ "\u0954" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_mutton.png", "ascent": -32768, "height": -16, "chars": [ "\u0955" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_porkchop.png", "ascent": -32768, "height": -16, "chars": [ "\u0956" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_rabbit.png", "ascent": -32768, "height": -16, "chars": [ "\u0957" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_salmon.png", "ascent": -32768, "height": -16, "chars": [ "\u0958" ] }, { "type": "bitmap", "file": "minecraft:item/cookie.png", "ascent": -32768, "height": -16, "chars": [ "\u0959" ] }, { "type": "bitmap", "file": "minecraft:item/copper_ingot.png", "ascent": -32768, "height": -16, "chars": [ "\u095a" ] }, { "type": "bitmap", "file": "minecraft:block/cornflower.png", "ascent": -32768, "height": -16, "chars": [ "\u095b" ] }, { "type": "bitmap", "file": "minecraft:item/creeper_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u095c" ] }, { "type": "bitmap", "file": "minecraft:item/crimson_door.png", "ascent": -32768, "height": -16, "chars": [ "\u095d" ] }, { "type": "bitmap", "file": "minecraft:block/crimson_fungus.png", "ascent": -32768, "height": -16, "chars": [ "\u095e" ] }, { "type": "bitmap", "file": "minecraft:block/crimson_roots.png", "ascent": -32768, "height": -16, "chars": [ "\u095f" ] }, { "type": "bitmap", "file": "minecraft:item/crimson_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u0960" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_standby.png", "ascent": -32768, "height": -16, "chars": [ "\u0961" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_arrow.png", "ascent": -32768, "height": -16, "chars": [ "\u0962" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_firework.png", "ascent": -32768, "height": -16, "chars": [ "\u0963" ] }, { "type": "bitmap", "file": "minecraft:item/cyan_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0964" ] }, { "type": "bitmap", "file": "minecraft:item/cyan_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0965" ] }, { "type": "bitmap", "file": "minecraft:block/cyan_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0966" ] }, { "type": "bitmap", "file": "minecraft:block/dandelion.png", "ascent": -32768, "height": -16, "chars": [ "\u0967" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u0968" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0969" ] }, { "type": "bitmap", "file": "minecraft:block/dark_oak_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u096a" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u096b" ] }, { "type": "bitmap", "file": "minecraft:block/dead_brain_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u096c" ] }, { "type": "bitmap", "file": "minecraft:block/dead_brain_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u096d" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bubble_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u096e" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bubble_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u096f" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bush.png", "ascent": -32768, "height": -16, "chars": [ "\u0970" ] }, { "type": "bitmap", "file": "minecraft:block/dead_fire_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0971" ] }, { "type": "bitmap", "file": "minecraft:block/dead_fire_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0972" ] }, { "type": "bitmap", "file": "minecraft:block/dead_horn_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0973" ] }, { "type": "bitmap", "file": "minecraft:block/dead_horn_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0974" ] }, { "type": "bitmap", "file": "minecraft:block/dead_tube_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0975" ] }, { "type": "bitmap", "file": "minecraft:block/dead_tube_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0976" ] }, { "type": "bitmap", "file": "minecraft:block/detector_rail.png", "ascent": -32768, "height": -16, "chars": [ "\u0977" ] }, { "type": "bitmap", "file": "minecraft:item/diamond.png", "ascent": -32768, "height": -16, "chars": [ "\u0978" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u0979" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u097a" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u097b" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u097c" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u097d" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_horse_armor.png", "ascent": -32768, "height": -16, "chars": [ "\u097e" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u097f" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u0980" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u0981" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u0982" ] }, { "type": "bitmap", "file": "minecraft:item/dragon_breath.png", "ascent": -32768, "height": -16, "chars": [ "\u0983" ] }, { "type": "bitmap", "file": "minecraft:item/dried_kelp.png", "ascent": -32768, "height": -16, "chars": [ "\u0984" ] }, { "type": "bitmap", "file": "minecraft:item/egg.png", "ascent": -32768, "height": -16, "chars": [ "\u0985" ] }, { "type": "bitmap", "file": "minecraft:item/elytra.png", "ascent": -32768, "height": -16, "chars": [ "\u0986" ] }, { "type": "bitmap", "file": "minecraft:item/emerald.png", "ascent": -32768, "height": -16, "chars": [ "\u0987" ] }, { "type": "bitmap", "file": "minecraft:item/enchanted_book.png", "ascent": -32768, "height": -16, "chars": [ "\u0988" ] }, { "type": "bitmap", "file": "minecraft:item/end_crystal.png", "ascent": -32768, "height": -16, "chars": [ "\u0989" ] }, { "type": "bitmap", "file": "minecraft:item/ender_eye.png", "ascent": -32768, "height": -16, "chars": [ "\u098a" ] }, { "type": "bitmap", "file": "minecraft:item/ender_pearl.png", "ascent": -32768, "height": -16, "chars": [ "\u098b" ] }, { "type": "bitmap", "file": "minecraft:item/experience_bottle.png", "ascent": -32768, "height": -16, "chars": [ "\u098c" ] }, { "type": "bitmap", "file": "minecraft:item/feather.png", "ascent": -32768, "height": -16, "chars": [ "\u098d" ] }, { "type": "bitmap", "file": "minecraft:item/fermented_spider_eye.png", "ascent": -32768, "height": -16, "chars": [ "\u098e" ] }, { "type": "bitmap", "file": "minecraft:block/fern.png", "ascent": -32768, "height": -16, "chars": [ "\u098f" ] }, { "type": "bitmap", "file": "minecraft:item/filled_map.png", "ascent": -32768, "height": -16, "chars": [ "\u0990" ] }, { "type": "bitmap", "file": "minecraft:item/filled_map_markings.png", "ascent": -32768, "height": -16, "chars": [ "\u0991" ] }, { "type": "bitmap", "file": "minecraft:item/fire_charge.png", "ascent": -32768, "height": -16, "chars": [ "\u0992" ] }, { "type": "bitmap", "file": "minecraft:block/fire_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0993" ] }, { "type": "bitmap", "file": "minecraft:block/fire_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0994" ] }, { "type": "bitmap", "file": "minecraft:item/firework_rocket.png", "ascent": -32768, "height": -16, "chars": [ "\u0995" ] }, { "type": "bitmap", "file": "minecraft:item/firework_star.png", "ascent": -32768, "height": -16, "chars": [ "\u0996" ] }, { "type": "bitmap", "file": "minecraft:item/firework_star_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u0997" ] }, { "type": "bitmap", "file": "minecraft:item/fishing_rod.png", "ascent": -32768, "height": -16, "chars": [ "\u0998" ] }, { "type": "bitmap", "file": "minecraft:item/flint.png", "ascent": -32768, "height": -16, "chars": [ "\u0999" ] }, { "type": "bitmap", "file": "minecraft:item/flint_and_steel.png", "ascent": -32768, "height": -16, "chars": [ "\u099a" ] }, { "type": "bitmap", "file": "minecraft:item/flower_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u099b" ] }, { "type": "bitmap", "file": "minecraft:item/flower_pot.png", "ascent": -32768, "height": -16, "chars": [ "\u099c" ] }, { "type": "bitmap", "file": "minecraft:item/furnace_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u099d" ] }, { "type": "bitmap", "file": "minecraft:item/ghast_tear.png", "ascent": -32768, "height": -16, "chars": [ "\u099e" ] }, { "type": "bitmap", "file": "minecraft:item/glass_bottle.png", "ascent": -32768, "height": -16, "chars": [ "\u099f" ] }, { "type": "bitmap", "file": "minecraft:block/glass.png", "ascent": -32768, "height": -16, "chars": [ "\u09a0" ] }, { "type": "bitmap", "file": "minecraft:item/glistering_melon_slice.png", "ascent": -32768, "height": -16, "chars": [ "\u09a1" ] }, { "type": "bitmap", "file": "minecraft:item/globe_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u09a2" ] }, { "type": "bitmap", "file": "minecraft:item/glow_berries.png", "ascent": -32768, "height": -16, "chars": [ "\u09a3" ] }, { "type": "bitmap", "file": "minecraft:item/glow_ink_sac.png", "ascent": -32768, "height": -16, "chars": [ "\u09a4" ] }, { "type": "bitmap", "file": "minecraft:item/glow_item_frame.png", "ascent": -32768, "height": -16, "chars": [ "\u09a5" ] }, { "type": "bitmap", "file": "minecraft:block/glow_lichen.png", "ascent": -32768, "height": -16, "chars": [ "\u09a6" ] }, { "type": "bitmap", "file": "minecraft:item/glowstone_dust.png", "ascent": -32768, "height": -16, "chars": [ "\u09a7" ] }, { "type": "bitmap", "file": "minecraft:item/gold_ingot.png", "ascent": -32768, "height": -16, "chars": [ "\u09a8" ] }, { "type": "bitmap", "file": "minecraft:item/gold_nugget.png", "ascent": -32768, "height": -16, "chars": [ "\u09a9" ] }, { "type": "bitmap", "file": "minecraft:item/golden_apple.png", "ascent": -32768, "height": -16, "chars": [ "\u09aa" ] }, { "type": "bitmap", "file": "minecraft:item/golden_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u09ab" ] }, { "type": "bitmap", "file": "minecraft:item/golden_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u09ac" ] }, { "type": "bitmap", "file": "minecraft:item/golden_carrot.png", "ascent": -32768, "height": -16, "chars": [ "\u09ad" ] }, { "type": "bitmap", "file": "minecraft:item/golden_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u09ae" ] }, { "type": "bitmap", "file": "minecraft:item/golden_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u09af" ] }, { "type": "bitmap", "file": "minecraft:item/golden_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u09b0" ] }, { "type": "bitmap", "file": "minecraft:item/golden_horse_armor.png", "ascent": -32768, "height": -16, "chars": [ "\u09b1" ] }, { "type": "bitmap", "file": "minecraft:item/golden_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u09b2" ] }, { "type": "bitmap", "file": "minecraft:item/golden_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u09b3" ] }, { "type": "bitmap", "file": "minecraft:item/golden_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u09b4" ] }, { "type": "bitmap", "file": "minecraft:item/golden_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u09b5" ] }, { "type": "bitmap", "file": "minecraft:item/gray_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u09b7" ] }, { "type": "bitmap", "file": "minecraft:item/gray_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u09b8" ] }, { "type": "bitmap", "file": "minecraft:block/gray_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u09b9" ] }, { "type": "bitmap", "file": "minecraft:item/green_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u09ba" ] }, { "type": "bitmap", "file": "minecraft:item/green_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u09bb" ] }, { "type": "bitmap", "file": "minecraft:block/green_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u09bc" ] }, { "type": "bitmap", "file": "minecraft:item/gunpowder.png", "ascent": -32768, "height": -16, "chars": [ "\u09bd" ] }, { "type": "bitmap", "file": "minecraft:block/hanging_roots.png", "ascent": -32768, "height": -16, "chars": [ "\u09be" ] }, { "type": "bitmap", "file": "minecraft:item/heart_of_the_sea.png", "ascent": -32768, "height": -16, "chars": [ "\u09bf" ] }, { "type": "bitmap", "file": "minecraft:item/honey_bottle.png", "ascent": -32768, "height": -16, "chars": [ "\u09c0" ] }, { "type": "bitmap", "file": "minecraft:item/honeycomb.png", "ascent": -32768, "height": -16, "chars": [ "\u09c1" ] }, { "type": "bitmap", "file": "minecraft:item/hopper.png", "ascent": -32768, "height": -16, "chars": [ "\u09c2" ] }, { "type": "bitmap", "file": "minecraft:item/hopper_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u09c3" ] }, { "type": "bitmap", "file": "minecraft:block/horn_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u09c4" ] }, { "type": "bitmap", "file": "minecraft:block/horn_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u09c5" ] }, { "type": "bitmap", "file": "minecraft:item/ink_sac.png", "ascent": -32768, "height": -16, "chars": [ "\u09c6" ] }, { "type": "bitmap", "file": "minecraft:item/iron_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u09c7" ] }, { "type": "bitmap", "file": "minecraft:block/iron_bars.png", "ascent": -32768, "height": -16, "chars": [ "\u09c8" ] }, { "type": "bitmap", "file": "minecraft:item/iron_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u09c9" ] }, { "type": "bitmap", "file": "minecraft:item/iron_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u09ca" ] }, { "type": "bitmap", "file": "minecraft:item/iron_door.png", "ascent": -32768, "height": -16, "chars": [ "\u09cb" ] }, { "type": "bitmap", "file": "minecraft:item/iron_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u09cc" ] }, { "type": "bitmap", "file": "minecraft:item/iron_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u09cd" ] }, { "type": "bitmap", "file": "minecraft:item/iron_horse_armor.png", "ascent": -32768, "height": -16, "chars": [ "\u09ce" ] }, { "type": "bitmap", "file": "minecraft:item/iron_ingot.png", "ascent": -32768, "height": -16, "chars": [ "\u09cf" ] }, { "type": "bitmap", "file": "minecraft:item/iron_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u09d0" ] }, { "type": "bitmap", "file": "minecraft:item/iron_nugget.png", "ascent": -32768, "height": -16, "chars": [ "\u09d1" ] }, { "type": "bitmap", "file": "minecraft:item/iron_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u09d2" ] }, { "type": "bitmap", "file": "minecraft:item/iron_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u09d3" ] }, { "type": "bitmap", "file": "minecraft:item/iron_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u09d4" ] }, { "type": "bitmap", "file": "minecraft:item/item_frame.png", "ascent": -32768, "height": -16, "chars": [ "\u09d5" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u09d6" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_door.png", "ascent": -32768, "height": -16, "chars": [ "\u09d7" ] }, { "type": "bitmap", "file": "minecraft:block/jungle_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u09d8" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u09d9" ] }, { "type": "bitmap", "file": "minecraft:item/kelp.png", "ascent": -32768, "height": -16, "chars": [ "\u09da" ] }, { "type": "bitmap", "file": "minecraft:item/knowledge_book.png", "ascent": -32768, "height": -16, "chars": [ "\u09db" ] }, { "type": "bitmap", "file": "minecraft:block/ladder.png", "ascent": -32768, "height": -16, "chars": [ "\u09dc" ] }, { "type": "bitmap", "file": "minecraft:item/lantern.png", "ascent": -32768, "height": -16, "chars": [ "\u09dd" ] }, { "type": "bitmap", "file": "minecraft:item/lapis_lazuli.png", "ascent": -32768, "height": -16, "chars": [ "\u09de" ] }, { "type": "bitmap", "file": "minecraft:block/large_amethyst_bud.png", "ascent": -32768, "height": -16, "chars": [ "\u09df" ] }, { "type": "bitmap", "file": "minecraft:block/large_fern_top.png", "ascent": -32768, "height": -16, "chars": [ "\u09e0" ] }, { "type": "bitmap", "file": "minecraft:item/lava_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u09e1" ] }, { "type": "bitmap", "file": "minecraft:item/lead.png", "ascent": -32768, "height": -16, "chars": [ "\u09e2" ] }, { "type": "bitmap", "file": "minecraft:item/leather.png", "ascent": -32768, "height": -16, "chars": [ "\u09e3" ] }, { "type": "bitmap", "file": "minecraft:item/leather_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u09e4" ] }, { "type": "bitmap", "file": "minecraft:item/leather_boots_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u09e5" ] }, { "type": "bitmap", "file": "minecraft:item/leather_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u09e6" ] }, { "type": "bitmap", "file": "minecraft:item/leather_chestplate_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u09e7" ] }, { "type": "bitmap", "file": "minecraft:item/leather_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u09e8" ] }, { "type": "bitmap", "file": "minecraft:item/leather_helmet_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u09e9" ] }, { "type": "bitmap", "file": "minecraft:item/leather_horse_armor.png", "ascent": -32768, "height": -16, "chars": [ "\u09ea" ] }, { "type": "bitmap", "file": "minecraft:item/leather_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u09eb" ] }, { "type": "bitmap", "file": "minecraft:item/leather_leggings_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u09ec" ] }, { "type": "bitmap", "file": "minecraft:block/lever.png", "ascent": -32768, "height": -16, "chars": [ "\u09ed" ] }, { "type": "bitmap", "file": "minecraft:item/light.png", "ascent": -32768, "height": -16, "chars": [ "\u09ee" ] }, { "type": "bitmap", "file": "minecraft:item/light_00.png", "ascent": -32768, "height": -16, "chars": [ "\u09ef" ] }, { "type": "bitmap", "file": "minecraft:item/light_01.png", "ascent": -32768, "height": -16, "chars": [ "\u09f0" ] }, { "type": "bitmap", "file": "minecraft:item/light_02.png", "ascent": -32768, "height": -16, "chars": [ "\u09f1" ] }, { "type": "bitmap", "file": "minecraft:item/light_03.png", "ascent": -32768, "height": -16, "chars": [ "\u09f2" ] }, { "type": "bitmap", "file": "minecraft:item/light_04.png", "ascent": -32768, "height": -16, "chars": [ "\u09f3" ] }, { "type": "bitmap", "file": "minecraft:item/light_05.png", "ascent": -32768, "height": -16, "chars": [ "\u09f4" ] }, { "type": "bitmap", "file": "minecraft:item/light_06.png", "ascent": -32768, "height": -16, "chars": [ "\u09f5" ] }, { "type": "bitmap", "file": "minecraft:item/light_07.png", "ascent": -32768, "height": -16, "chars": [ "\u09f6" ] }, { "type": "bitmap", "file": "minecraft:item/light_08.png", "ascent": -32768, "height": -16, "chars": [ "\u09f7" ] }, { "type": "bitmap", "file": "minecraft:item/light_09.png", "ascent": -32768, "height": -16, "chars": [ "\u09f8" ] }, { "type": "bitmap", "file": "minecraft:item/light_10.png", "ascent": -32768, "height": -16, "chars": [ "\u09f9" ] }, { "type": "bitmap", "file": "minecraft:item/light_11.png", "ascent": -32768, "height": -16, "chars": [ "\u09fa" ] }, { "type": "bitmap", "file": "minecraft:item/light_12.png", "ascent": -32768, "height": -16, "chars": [ "\u09fb" ] }, { "type": "bitmap", "file": "minecraft:item/light_13.png", "ascent": -32768, "height": -16, "chars": [ "\u09fc" ] }, { "type": "bitmap", "file": "minecraft:item/light_14.png", "ascent": -32768, "height": -16, "chars": [ "\u09fd" ] }, { "type": "bitmap", "file": "minecraft:item/light_15.png", "ascent": -32768, "height": -16, "chars": [ "\u09fe" ] }, { "type": "bitmap", "file": "minecraft:item/light_blue_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u09ff" ] }, { "type": "bitmap", "file": "minecraft:item/light_blue_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a00" ] }, { "type": "bitmap", "file": "minecraft:block/light_blue_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a01" ] }, { "type": "bitmap", "file": "minecraft:item/light_gray_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a02" ] }, { "type": "bitmap", "file": "minecraft:item/light_gray_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a03" ] }, { "type": "bitmap", "file": "minecraft:block/light_gray_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a04" ] }, { "type": "bitmap", "file": "minecraft:block/lilac_top.png", "ascent": -32768, "height": -16, "chars": [ "\u0a05" ] }, { "type": "bitmap", "file": "minecraft:block/lily_of_the_valley.png", "ascent": -32768, "height": -16, "chars": [ "\u0a06" ] }, { "type": "bitmap", "file": "minecraft:block/lily_pad.png", "ascent": -32768, "height": -16, "chars": [ "\u0a07" ] }, { "type": "bitmap", "file": "minecraft:item/lime_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a08" ] }, { "type": "bitmap", "file": "minecraft:item/lime_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a09" ] }, { "type": "bitmap", "file": "minecraft:block/lime_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0a" ] }, { "type": "bitmap", "file": "minecraft:item/lingering_potion.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0b" ] }, { "type": "bitmap", "file": "minecraft:item/magenta_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0c" ] }, { "type": "bitmap", "file": "minecraft:item/magenta_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0d" ] }, { "type": "bitmap", "file": "minecraft:block/magenta_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0e" ] }, { "type": "bitmap", "file": "minecraft:item/magma_cream.png", "ascent": -32768, "height": -16, "chars": [ "\u0a0f" ] }, { "type": "bitmap", "file": "minecraft:item/map.png", "ascent": -32768, "height": -16, "chars": [ "\u0a10" ] }, { "type": "bitmap", "file": "minecraft:block/medium_amethyst_bud.png", "ascent": -32768, "height": -16, "chars": [ "\u0a11" ] }, { "type": "bitmap", "file": "minecraft:item/melon_seeds.png", "ascent": -32768, "height": -16, "chars": [ "\u0a12" ] }, { "type": "bitmap", "file": "minecraft:item/melon_slice.png", "ascent": -32768, "height": -16, "chars": [ "\u0a13" ] }, { "type": "bitmap", "file": "minecraft:item/milk_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0a14" ] }, { "type": "bitmap", "file": "minecraft:item/minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u0a15" ] }, { "type": "bitmap", "file": "minecraft:item/mojang_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u0a16" ] }, { "type": "bitmap", "file": "minecraft:item/mushroom_stew.png", "ascent": -32768, "height": -16, "chars": [ "\u0a17" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_11.png", "ascent": -32768, "height": -16, "chars": [ "\u0a16" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_13.png", "ascent": -32768, "height": -16, "chars": [ "\u0a19" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_blocks.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1a" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_cat.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1b" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_chirp.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1c" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_far.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1d" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_mall.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1e" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_mellohi.png", "ascent": -32768, "height": -16, "chars": [ "\u0a1f" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_pigstep.png", "ascent": -32768, "height": -16, "chars": [ "\u0a20" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_stal.png", "ascent": -32768, "height": -16, "chars": [ "\u0a21" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_strad.png", "ascent": -32768, "height": -16, "chars": [ "\u0a22" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_wait.png", "ascent": -32768, "height": -16, "chars": [ "\u0a23" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_ward.png", "ascent": -32768, "height": -16, "chars": [ "\u0a24" ] }, { "type": "bitmap", "file": "minecraft:item/mutton.png", "ascent": -32768, "height": -16, "chars": [ "\u0a25" ] }, { "type": "bitmap", "file": "minecraft:item/name_tag.png", "ascent": -32768, "height": -16, "chars": [ "\u0a26" ] }, { "type": "bitmap", "file": "minecraft:item/nautilus_shell.png", "ascent": -32768, "height": -16, "chars": [ "\u0a27" ] }, { "type": "bitmap", "file": "minecraft:item/nether_brick.png", "ascent": -32768, "height": -16, "chars": [ "\u0a28" ] }, { "type": "bitmap", "file": "minecraft:block/nether_sprouts.png", "ascent": -32768, "height": -16, "chars": [ "\u0a29" ] }, { "type": "bitmap", "file": "minecraft:item/nether_star.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2a" ] }, { "type": "bitmap", "file": "minecraft:item/nether_wart.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2b" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2c" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_boots.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2d" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_chestplate.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2e" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u0a2f" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a30" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_ingot.png", "ascent": -32768, "height": -16, "chars": [ "\u0a31" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_leggings.png", "ascent": -32768, "height": -16, "chars": [ "\u0a32" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a33" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_scrap.png", "ascent": -32768, "height": -16, "chars": [ "\u0a34" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u0a35" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u0a36" ] }, { "type": "bitmap", "file": "minecraft:item/oak_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u0a37" ] }, { "type": "bitmap", "file": "minecraft:item/oak_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0a38" ] }, { "type": "bitmap", "file": "minecraft:block/oak_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u0a39" ] }, { "type": "bitmap", "file": "minecraft:item/oak_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3a" ] }, { "type": "bitmap", "file": "minecraft:item/orange_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3b" ] }, { "type": "bitmap", "file": "minecraft:item/orange_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3c" ] }, { "type": "bitmap", "file": "minecraft:block/orange_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3d" ] }, { "type": "bitmap", "file": "minecraft:block/orange_tulip.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3e" ] }, { "type": "bitmap", "file": "minecraft:block/oxeye_daisy.png", "ascent": -32768, "height": -16, "chars": [ "\u0a3f" ] }, { "type": "bitmap", "file": "minecraft:item/painting.png", "ascent": -32768, "height": -16, "chars": [ "\u0a40" ] }, { "type": "bitmap", "file": "minecraft:item/paper.png", "ascent": -32768, "height": -16, "chars": [ "\u0a41" ] }, { "type": "bitmap", "file": "minecraft:block/peony_top.png", "ascent": -32768, "height": -16, "chars": [ "\u0a42" ] }, { "type": "bitmap", "file": "minecraft:item/phantom_membrane.png", "ascent": -32768, "height": -16, "chars": [ "\u0a43" ] }, { "type": "bitmap", "file": "minecraft:item/piglin_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u0a44" ] }, { "type": "bitmap", "file": "minecraft:item/pink_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a45" ] }, { "type": "bitmap", "file": "minecraft:item/pink_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a46" ] }, { "type": "bitmap", "file": "minecraft:block/pink_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a47" ] }, { "type": "bitmap", "file": "minecraft:block/pink_tulip.png", "ascent": -32768, "height": -16, "chars": [ "\u0a48" ] }, { "type": "bitmap", "file": "minecraft:item/pointed_dripstone.png", "ascent": -32768, "height": -16, "chars": [ "\u0a49" ] }, { "type": "bitmap", "file": "minecraft:item/poisonous_potato.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4a" ] }, { "type": "bitmap", "file": "minecraft:item/popped_chorus_fruit.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4b" ] }, { "type": "bitmap", "file": "minecraft:block/poppy.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4c" ] }, { "type": "bitmap", "file": "minecraft:item/porkchop.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4d" ] }, { "type": "bitmap", "file": "minecraft:item/potato.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4e" ] }, { "type": "bitmap", "file": "minecraft:item/potion.png", "ascent": -32768, "height": -16, "chars": [ "\u0a4f" ] }, { "type": "bitmap", "file": "minecraft:item/potion_overlay.png", "ascent": -32768, "height": -16, "chars": [ "\u0a50" ] }, { "type": "bitmap", "file": "minecraft:item/powder_snow_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0a51" ] }, { "type": "bitmap", "file": "minecraft:block/powered_rail.png", "ascent": -32768, "height": -16, "chars": [ "\u0a52" ] }, { "type": "bitmap", "file": "minecraft:item/prismarine_crystals.png", "ascent": -32768, "height": -16, "chars": [ "\u0a53" ] }, { "type": "bitmap", "file": "minecraft:item/prismarine_shard.png", "ascent": -32768, "height": -16, "chars": [ "\u0a54" ] }, { "type": "bitmap", "file": "minecraft:item/pufferfish.png", "ascent": -32768, "height": -16, "chars": [ "\u0a55" ] }, { "type": "bitmap", "file": "minecraft:item/pufferfish_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0a56" ] }, { "type": "bitmap", "file": "minecraft:item/pumpkin_pie.png", "ascent": -32768, "height": -16, "chars": [ "\u0a57" ] }, { "type": "bitmap", "file": "minecraft:item/pumpkin_seeds.png", "ascent": -32768, "height": -16, "chars": [ "\u0a58" ] }, { "type": "bitmap", "file": "minecraft:item/purple_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a59" ] }, { "type": "bitmap", "file": "minecraft:item/purple_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5a" ] }, { "type": "bitmap", "file": "minecraft:block/purple_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5b" ] }, { "type": "bitmap", "file": "minecraft:item/quartz.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5c" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5d" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_foot.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5e" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_hide.png", "ascent": -32768, "height": -16, "chars": [ "\u0a5f" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_stew.png", "ascent": -32768, "height": -16, "chars": [ "\u0a60" ] }, { "type": "bitmap", "file": "minecraft:block/rail.png", "ascent": -32768, "height": -16, "chars": [ "\u0a61" ] }, { "type": "bitmap", "file": "minecraft:item/raw_copper.png", "ascent": -32768, "height": -16, "chars": [ "\u0a62" ] }, { "type": "bitmap", "file": "minecraft:item/raw_gold.png", "ascent": -32768, "height": -16, "chars": [ "\u0a63" ] }, { "type": "bitmap", "file": "minecraft:item/raw_iron.png", "ascent": -32768, "height": -16, "chars": [ "\u0a64" ] }, { "type": "bitmap", "file": "minecraft:item/red_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a65" ] }, { "type": "bitmap", "file": "minecraft:item/red_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a66" ] }, { "type": "bitmap", "file": "minecraft:block/red_mushroom.png", "ascent": -32768, "height": -16, "chars": [ "\u0a67" ] }, { "type": "bitmap", "file": "minecraft:block/red_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a68" ] }, { "type": "bitmap", "file": "minecraft:block/red_tulip.png", "ascent": -32768, "height": -16, "chars": [ "\u0a69" ] }, { "type": "bitmap", "file": "minecraft:item/redstone.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6a" ] }, { "type": "bitmap", "file": "minecraft:block/redstone_torch.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6b" ] }, { "type": "bitmap", "file": "minecraft:item/repeater.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6c" ] }, { "type": "bitmap", "file": "minecraft:block/rose_bush_top.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6d" ] }, { "type": "bitmap", "file": "minecraft:item/rotten_flesh.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6e" ] }, { "type": "bitmap", "file": "minecraft:item/saddle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a6f" ] }, { "type": "bitmap", "file": "minecraft:item/salmon.png", "ascent": -32768, "height": -16, "chars": [ "\u0a70" ] }, { "type": "bitmap", "file": "minecraft:item/salmon_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0a71" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_scute.png", "ascent": -32768, "height": -16, "chars": [ "\u0a72" ] }, { "type": "bitmap", "file": "minecraft:item/sea_pickle.png", "ascent": -32768, "height": -16, "chars": [ "\u0a73" ] }, { "type": "bitmap", "file": "minecraft:item/seagrass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a74" ] }, { "type": "bitmap", "file": "minecraft:item/shears.png", "ascent": -32768, "height": -16, "chars": [ "\u0a75" ] }, { "type": "bitmap", "file": "minecraft:item/shulker_shell.png", "ascent": -32768, "height": -16, "chars": [ "\u0a76" ] }, { "type": "bitmap", "file": "minecraft:item/skull_banner_pattern.png", "ascent": -32768, "height": -16, "chars": [ "\u0a77" ] }, { "type": "bitmap", "file": "minecraft:item/slime_ball.png", "ascent": -32768, "height": -16, "chars": [ "\u0a78" ] }, { "type": "bitmap", "file": "minecraft:block/small_amethyst_bud.png", "ascent": -32768, "height": -16, "chars": [ "\u0a79" ] }, { "type": "bitmap", "file": "minecraft:item/snowball.png", "ascent": -32768, "height": -16, "chars": [ "\u0a7a" ] }, { "type": "bitmap", "file": "minecraft:item/soul_campfire.png", "ascent": -32768, "height": -16, "chars": [ "\u0a7b" ] }, { "type": "bitmap", "file": "minecraft:item/soul_lantern.png", "ascent": -32768, "height": -16, "chars": [ "\u0a7c" ] }, { "type": "bitmap", "file": "minecraft:block/soul_torch.png", "ascent": -32768, "height": -16, "chars": [ "\u0a7d" ] }, { "type": "bitmap", "file": "minecraft:item/spectral_arrow.png", "ascent": -32768, "height": -16, "chars": [ "\u0a80" ] }, { "type": "bitmap", "file": "minecraft:item/spider_eye.png", "ascent": -32768, "height": -16, "chars": [ "\u0a81" ] }, { "type": "bitmap", "file": "minecraft:item/splash_potion.png", "ascent": -32768, "height": -16, "chars": [ "\u0a82" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_boat.png", "ascent": -32768, "height": -16, "chars": [ "\u0a83" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0a84" ] }, { "type": "bitmap", "file": "minecraft:block/spruce_sapling.png", "ascent": -32768, "height": -16, "chars": [ "\u0a85" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u0a86" ] }, { "type": "bitmap", "file": "minecraft:item/spyglass.png", "ascent": -32768, "height": -16, "chars": [ "\u0a87" ] }, { "type": "bitmap", "file": "minecraft:item/stick.png", "ascent": -32768, "height": -16, "chars": [ "\u0a88" ] }, { "type": "bitmap", "file": "minecraft:item/stone_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a89" ] }, { "type": "bitmap", "file": "minecraft:item/stone_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8a" ] }, { "type": "bitmap", "file": "minecraft:item/stone_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8b" ] }, { "type": "bitmap", "file": "minecraft:item/stone_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8c" ] }, { "type": "bitmap", "file": "minecraft:item/stone_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8d" ] }, { "type": "bitmap", "file": "minecraft:item/string.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8e" ] }, { "type": "bitmap", "file": "minecraft:item/structure_void.png", "ascent": -32768, "height": -16, "chars": [ "\u0a8f" ] }, { "type": "bitmap", "file": "minecraft:item/sugar.png", "ascent": -32768, "height": -16, "chars": [ "\u0a90" ] }, { "type": "bitmap", "file": "minecraft:item/sugar_cane.png", "ascent": -32768, "height": -16, "chars": [ "\u0a91" ] }, { "type": "bitmap", "file": "minecraft:block/sunflower_front.png", "ascent": -32768, "height": -16, "chars": [ "\u0a92" ] }, { "type": "bitmap", "file": "minecraft:item/suspicious_stew.png", "ascent": -32768, "height": -16, "chars": [ "\u0a93" ] }, { "type": "bitmap", "file": "minecraft:item/sweet_berries.png", "ascent": -32768, "height": -16, "chars": [ "\u0a94" ] }, { "type": "bitmap", "file": "minecraft:block/tall_grass_top.png", "ascent": -32768, "height": -16, "chars": [ "\u0a95" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_base.png", "ascent": -32768, "height": -16, "chars": [ "\u0a96" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_base.png", "ascent": -32768, "height": -16, "chars": [ "\u0a97" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_head.png", "ascent": -32768, "height": -16, "chars": [ "\u0a98" ] }, { "type": "bitmap", "file": "minecraft:item/tnt_minecart.png", "ascent": -32768, "height": -16, "chars": [ "\u0a99" ] }, { "type": "bitmap", "file": "minecraft:block/torch.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9a" ] }, { "type": "bitmap", "file": "minecraft:item/totem_of_undying.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9b" ] }, { "type": "bitmap", "file": "minecraft:item/trident.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9c" ] }, { "type": "bitmap", "file": "minecraft:block/tripwire_hook.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9d" ] }, { "type": "bitmap", "file": "minecraft:item/tropical_fish.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9e" ] }, { "type": "bitmap", "file": "minecraft:item/tropical_fish_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0a9f" ] }, { "type": "bitmap", "file": "minecraft:block/tube_coral.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa0" ] }, { "type": "bitmap", "file": "minecraft:block/tube_coral_fan.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa1" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_egg.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa2" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_helmet.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa3" ] }, { "type": "bitmap", "file": "minecraft:block/twisting_vines_plant.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa4" ] }, { "type": "bitmap", "file": "minecraft:block/vine.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa5" ] }, { "type": "bitmap", "file": "minecraft:item/warped_door.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa6" ] }, { "type": "bitmap", "file": "minecraft:block/warped_fungus.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa7" ] }, { "type": "bitmap", "file": "minecraft:item/warped_fungus_on_a_stick.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa8" ] }, { "type": "bitmap", "file": "minecraft:block/warped_roots.png", "ascent": -32768, "height": -16, "chars": [ "\u0aa9" ] }, { "type": "bitmap", "file": "minecraft:item/warped_sign.png", "ascent": -32768, "height": -16, "chars": [ "\u0aaa" ] }, { "type": "bitmap", "file": "minecraft:item/water_bucket.png", "ascent": -32768, "height": -16, "chars": [ "\u0aab" ] }, { "type": "bitmap", "file": "minecraft:block/weeping_vines_plant.png", "ascent": -32768, "height": -16, "chars": [ "\u0aac" ] }, { "type": "bitmap", "file": "minecraft:item/wheat.png", "ascent": -32768, "height": -16, "chars": [ "\u0aad" ] }, { "type": "bitmap", "file": "minecraft:item/wheat_seeds.png", "ascent": -32768, "height": -16, "chars": [ "\u0aae" ] }, { "type": "bitmap", "file": "minecraft:item/white_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0aaf" ] }, { "type": "bitmap", "file": "minecraft:item/white_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab0" ] }, { "type": "bitmap", "file": "minecraft:block/white_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab1" ] }, { "type": "bitmap", "file": "minecraft:block/white_tulip.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab2" ] }, { "type": "bitmap", "file": "minecraft:block/wither_rose.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab3" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_axe.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab4" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_hoe.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab5" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_pickaxe.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab6" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_shovel.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab7" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_sword.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab8" ] }, { "type": "bitmap", "file": "minecraft:item/writable_book.png", "ascent": -32768, "height": -16, "chars": [ "\u0ab9" ] }, { "type": "bitmap", "file": "minecraft:item/written_book.png", "ascent": -32768, "height": -16, "chars": [ "\u0aba" ] }, { "type": "bitmap", "file": "minecraft:item/yellow_candle.png", "ascent": -32768, "height": -16, "chars": [ "\u0abb" ] }, { "type": "bitmap", "file": "minecraft:item/yellow_dye.png", "ascent": -32768, "height": -16, "chars": [ "\u0abc" ] }, { "type": "bitmap", "file": "minecraft:block/yellow_stained_glass.png", "ascent": -32768, "height": -16, "chars": [ "\u0abd" ] }, { "type": "bitmap", "file": "gm4_guidebook:font_magic/block_sheet.png", "ascent": 8, "height": 16, "chars": [ "\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae0\u0ae1\u0ae2\u0ae3\u0ae4\u0ae5\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0af0\u0af1", "\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b01\u0b02\u0b03\u0b04\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c", "\u0b0d\u0b0e\u0b0f\u0b10\u0b11\u0b12\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27", "\u0b28\u0b29\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3a\u0b3b\u0b3c\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42", "\u0b43\u0b44\u0b45\u0b46\u0b47\u0b48\u0b49\u0b4a\u0b4b\u0b4c\u0b4d\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b56\u0b57\u0b58\u0b59\u0b5a\u0b5b\u0b5c\u0b5d", "\u0b5e\u0b5f\u0b60\u0b61\u0b62\u0b63\u0b64\u0b65\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0b70\u0b71\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78", "\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b82\u0b83\u0b84\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8b\u0b8c\u0b8d\u0b8e\u0b8f\u0b90\u0b91\u0b92\u0b93", "\u0b94\u0b95\u0b96\u0b97\u0b98\u0b99\u0b9a\u0b9b\u0b9c\u0b9d\u0b9e\u0b9f\u0ba0\u0ba1\u0ba2\u0ba3\u0ba4\u0ba5\u0ba6\u0ba7\u0ba8\u0ba9\u0baa\u0bab\u0bac\u0bad\u0bae", "\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bba\u0bbb\u0bbc\u0bbd\u0bbe\u0bbf\u0bc0\u0bc1\u0bc2\u0bc3\u0bc4\u0bc5\u0bc6\u0bc7\u0bc8\u0bc9", "\u0bca\u0bcb\u0bcc\u0bcd\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd7\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4", "\u0be5\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0bf0\u0bf1\u0bf2\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bf9\u0bfa\u0bfb\u0bfc\u0bfd\u0bfe\u0bff", "\u0c00\u0c01\u0c02\u0c03\u0c04\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0d\u0c0e\u0c0f\u0c10\u0c11\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a", "\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c29\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c34\u0c35", "\u0c36\u0c37\u0c38\u0c39\u0c3a\u0c3b\u0c3c\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c45\u0c46\u0c47\u0c48\u0c49\u0c4a\u0c4b\u0c4c\u0c4d\u0c4e\u0c4f\u0c50", "\u0c51\u0c52\u0c53\u0c54\u0c55\u0c56\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c60\u0c61\u0c62\u0c63\u0c64\u0c65\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b", "\u0c6c\u0c6d\u0c6e\u0c6f\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c82\u0c83\u0c84\u0c85\u0c86", "\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0c8e\u0c8f\u0c90\u0c91\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1", "\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0ca9\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb4\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cba\u0cbb\u0cbc", "\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc5\u0cc6\u0cc7\u0cc8\u0cc9\u0cca\u0ccb\u0ccc\u0ccd\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd5\u0cd6\u0cd7", "\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cde\u0cdf\u0ce0\u0ce1\u0ce2\u0ce3\u0ce4\u0ce5\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0cf0\u0cf1\u0cf2", "\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0d", "\u0d0e\u0d0f\u0d10\u0d11\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28", "\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43", "\u0d44\u0d45\u0d46\u0d47\u0d48\u0d49\u0d4a\u0d4b\u0d4c\u0d4d\u0d4e\u0d4f\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d57\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e", "\u0d5f\u0d60\u0d61\u0d62\u0d63\u0d64\u0d65\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79", "\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d82\u0d83\u0d84\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0000\u0000\u0000", "\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" ] }, { "type": "bitmap", "file": "minecraft:item/acacia_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0d92" ] }, { "type": "bitmap", "file": "minecraft:item/acacia_door.png", "ascent": 8, "height": 16, "chars": [ "\u0d93" ] }, { "type": "bitmap", "file": "minecraft:block/acacia_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0d94" ] }, { "type": "bitmap", "file": "minecraft:item/acacia_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0d95" ] }, { "type": "bitmap", "file": "minecraft:block/activator_rail.png", "ascent": 8, "height": 16, "chars": [ "\u0d96" ] }, { "type": "bitmap", "file": "minecraft:block/allium.png", "ascent": 8, "height": 16, "chars": [ "\u0d97" ] }, { "type": "bitmap", "file": "minecraft:block/amethyst_cluster.png", "ascent": 8, "height": 16, "chars": [ "\u0d98" ] }, { "type": "bitmap", "file": "minecraft:item/amethyst_shard.png", "ascent": 8, "height": 16, "chars": [ "\u0d99" ] }, { "type": "bitmap", "file": "minecraft:item/apple.png", "ascent": 8, "height": 16, "chars": [ "\u0d9a" ] }, { "type": "bitmap", "file": "minecraft:item/armor_stand.png", "ascent": 8, "height": 16, "chars": [ "\u0d9b" ] }, { "type": "bitmap", "file": "minecraft:item/arrow.png", "ascent": 8, "height": 16, "chars": [ "\u0d9c" ] }, { "type": "bitmap", "file": "minecraft:item/axolotl_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0d9d" ] }, { "type": "bitmap", "file": "minecraft:block/azure_bluet.png", "ascent": 8, "height": 16, "chars": [ "\u0d9e" ] }, { "type": "bitmap", "file": "minecraft:item/baked_potato.png", "ascent": 8, "height": 16, "chars": [ "\u0d9f" ] }, { "type": "bitmap", "file": "minecraft:item/bamboo.png", "ascent": 8, "height": 16, "chars": [ "\u0da0" ] }, { "type": "bitmap", "file": "minecraft:item/barrier.png", "ascent": 8, "height": 16, "chars": [ "\u0da1" ] }, { "type": "bitmap", "file": "minecraft:item/beef.png", "ascent": 8, "height": 16, "chars": [ "\u0da2" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot.png", "ascent": 8, "height": 16, "chars": [ "\u0da3" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot_seeds.png", "ascent": 8, "height": 16, "chars": [ "\u0da4" ] }, { "type": "bitmap", "file": "minecraft:item/beetroot_soup.png", "ascent": 8, "height": 16, "chars": [ "\u0da5" ] }, { "type": "bitmap", "file": "minecraft:item/bell.png", "ascent": 8, "height": 16, "chars": [ "\u0da6" ] }, { "type": "bitmap", "file": "minecraft:item/birch_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0da7" ] }, { "type": "bitmap", "file": "minecraft:item/birch_door.png", "ascent": 8, "height": 16, "chars": [ "\u0da8" ] }, { "type": "bitmap", "file": "minecraft:block/birch_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0da9" ] }, { "type": "bitmap", "file": "minecraft:item/birch_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0daa" ] }, { "type": "bitmap", "file": "minecraft:item/black_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0dab" ] }, { "type": "bitmap", "file": "minecraft:item/black_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0dac" ] }, { "type": "bitmap", "file": "minecraft:block/black_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0dad" ] }, { "type": "bitmap", "file": "minecraft:item/blaze_powder.png", "ascent": 8, "height": 16, "chars": [ "\u0dae" ] }, { "type": "bitmap", "file": "minecraft:item/blaze_rod.png", "ascent": 8, "height": 16, "chars": [ "\u0daf" ] }, { "type": "bitmap", "file": "minecraft:item/blue_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0db0" ] }, { "type": "bitmap", "file": "minecraft:item/blue_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0db1" ] }, { "type": "bitmap", "file": "minecraft:block/blue_orchid.png", "ascent": 8, "height": 16, "chars": [ "\u0db2" ] }, { "type": "bitmap", "file": "minecraft:block/blue_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0db3" ] }, { "type": "bitmap", "file": "minecraft:item/bone.png", "ascent": 8, "height": 16, "chars": [ "\u0db4" ] }, { "type": "bitmap", "file": "minecraft:item/bone_meal.png", "ascent": 8, "height": 16, "chars": [ "\u0db5" ] }, { "type": "bitmap", "file": "minecraft:item/book.png", "ascent": 8, "height": 16, "chars": [ "\u0db6" ] }, { "type": "bitmap", "file": "minecraft:item/bow.png", "ascent": 8, "height": 16, "chars": [ "\u0db7" ] }, { "type": "bitmap", "file": "minecraft:item/bowl.png", "ascent": 8, "height": 16, "chars": [ "\u0db8" ] }, { "type": "bitmap", "file": "minecraft:block/brain_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0db9" ] }, { "type": "bitmap", "file": "minecraft:block/brain_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0dba" ] }, { "type": "bitmap", "file": "minecraft:item/bread.png", "ascent": 8, "height": 16, "chars": [ "\u0dbb" ] }, { "type": "bitmap", "file": "minecraft:item/brewing_stand.png", "ascent": 8, "height": 16, "chars": [ "\u0dbc" ] }, { "type": "bitmap", "file": "minecraft:item/brick.png", "ascent": 8, "height": 16, "chars": [ "\u0dbd" ] }, { "type": "bitmap", "file": "minecraft:item/elytra_broken.png", "ascent": 8, "height": 16, "chars": [ "\u0dbe" ] }, { "type": "bitmap", "file": "minecraft:item/brown_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0dbf" ] }, { "type": "bitmap", "file": "minecraft:item/brown_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0dc0" ] }, { "type": "bitmap", "file": "minecraft:block/brown_mushroom.png", "ascent": 8, "height": 16, "chars": [ "\u0dc1" ] }, { "type": "bitmap", "file": "minecraft:block/brown_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0dc2" ] }, { "type": "bitmap", "file": "minecraft:block/bubble_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0dc3" ] }, { "type": "bitmap", "file": "minecraft:block/bubble_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0dc4" ] }, { "type": "bitmap", "file": "minecraft:item/bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0dc5" ] }, { "type": "bitmap", "file": "minecraft:item/bundle.png", "ascent": 8, "height": 16, "chars": [ "\u0dc6" ] }, { "type": "bitmap", "file": "minecraft:item/cake.png", "ascent": 8, "height": 16, "chars": [ "\u0dc8" ] }, { "type": "bitmap", "file": "minecraft:item/campfire.png", "ascent": 8, "height": 16, "chars": [ "\u0dc9" ] }, { "type": "bitmap", "file": "minecraft:item/candle.png", "ascent": 8, "height": 16, "chars": [ "\u0dca" ] }, { "type": "bitmap", "file": "minecraft:item/carrot.png", "ascent": 8, "height": 16, "chars": [ "\u0dcb" ] }, { "type": "bitmap", "file": "minecraft:item/carrot_on_a_stick.png", "ascent": 8, "height": 16, "chars": [ "\u0dcc" ] }, { "type": "bitmap", "file": "minecraft:item/cauldron.png", "ascent": 8, "height": 16, "chars": [ "\u0dcd" ] }, { "type": "bitmap", "file": "minecraft:item/iron_chain.png", "ascent": 8, "height": 16, "chars": [ "\u0dce" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0dcf" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0dd0" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0dd1" ] }, { "type": "bitmap", "file": "minecraft:item/chainmail_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0dd2" ] }, { "type": "bitmap", "file": "minecraft:item/charcoal.png", "ascent": 8, "height": 16, "chars": [ "\u0dd3" ] }, { "type": "bitmap", "file": "minecraft:item/chest_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0dd4" ] }, { "type": "bitmap", "file": "minecraft:item/chicken.png", "ascent": 8, "height": 16, "chars": [ "\u0dd5" ] }, { "type": "bitmap", "file": "minecraft:item/chorus_fruit.png", "ascent": 8, "height": 16, "chars": [ "\u0dd6" ] }, { "type": "bitmap", "file": "minecraft:item/clay_ball.png", "ascent": 8, "height": 16, "chars": [ "\u0dd7" ] }, { "type": "bitmap", "file": "minecraft:item/clock_00.png", "ascent": 8, "height": 16, "chars": [ "\u0dd8" ] }, { "type": "bitmap", "file": "minecraft:item/coal.png", "ascent": 8, "height": 16, "chars": [ "\u0dd9" ] }, { "type": "bitmap", "file": "minecraft:block/cobweb.png", "ascent": 8, "height": 16, "chars": [ "\u0dda" ] }, { "type": "bitmap", "file": "minecraft:item/cocoa_beans.png", "ascent": 8, "height": 16, "chars": [ "\u0ddb" ] }, { "type": "bitmap", "file": "minecraft:item/cod.png", "ascent": 8, "height": 16, "chars": [ "\u0ddc" ] }, { "type": "bitmap", "file": "minecraft:item/cod_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0ddd" ] }, { "type": "bitmap", "file": "minecraft:item/command_block_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0dde" ] }, { "type": "bitmap", "file": "minecraft:item/comparator.png", "ascent": 8, "height": 16, "chars": [ "\u0ddf" ] }, { "type": "bitmap", "file": "minecraft:item/compass_16.png", "ascent": 8, "height": 16, "chars": [ "\u0de0" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_beef.png", "ascent": 8, "height": 16, "chars": [ "\u0de1" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_chicken.png", "ascent": 8, "height": 16, "chars": [ "\u0de2" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_cod.png", "ascent": 8, "height": 16, "chars": [ "\u0de3" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_mutton.png", "ascent": 8, "height": 16, "chars": [ "\u0de4" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_porkchop.png", "ascent": 8, "height": 16, "chars": [ "\u0de5" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_rabbit.png", "ascent": 8, "height": 16, "chars": [ "\u0de6" ] }, { "type": "bitmap", "file": "minecraft:item/cooked_salmon.png", "ascent": 8, "height": 16, "chars": [ "\u0de7" ] }, { "type": "bitmap", "file": "minecraft:item/cookie.png", "ascent": 8, "height": 16, "chars": [ "\u0de8" ] }, { "type": "bitmap", "file": "minecraft:item/copper_ingot.png", "ascent": 8, "height": 16, "chars": [ "\u0de9" ] }, { "type": "bitmap", "file": "minecraft:block/cornflower.png", "ascent": 8, "height": 16, "chars": [ "\u0dea" ] }, { "type": "bitmap", "file": "minecraft:item/creeper_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0deb" ] }, { "type": "bitmap", "file": "minecraft:item/crimson_door.png", "ascent": 8, "height": 16, "chars": [ "\u0dec" ] }, { "type": "bitmap", "file": "minecraft:block/crimson_fungus.png", "ascent": 8, "height": 16, "chars": [ "\u0ded" ] }, { "type": "bitmap", "file": "minecraft:block/crimson_roots.png", "ascent": 8, "height": 16, "chars": [ "\u0dee" ] }, { "type": "bitmap", "file": "minecraft:item/crimson_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0def" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_standby.png", "ascent": 8, "height": 16, "chars": [ "\u0df0" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_arrow.png", "ascent": 8, "height": 16, "chars": [ "\u0df1" ] }, { "type": "bitmap", "file": "minecraft:item/crossbow_firework.png", "ascent": 8, "height": 16, "chars": [ "\u0df2" ] }, { "type": "bitmap", "file": "minecraft:item/cyan_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0df3" ] }, { "type": "bitmap", "file": "minecraft:item/cyan_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0df4" ] }, { "type": "bitmap", "file": "minecraft:block/cyan_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0df5" ] }, { "type": "bitmap", "file": "minecraft:block/dandelion.png", "ascent": 8, "height": 16, "chars": [ "\u0df6" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0df7" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_door.png", "ascent": 8, "height": 16, "chars": [ "\u0df8" ] }, { "type": "bitmap", "file": "minecraft:block/dark_oak_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0df9" ] }, { "type": "bitmap", "file": "minecraft:item/dark_oak_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0dfa" ] }, { "type": "bitmap", "file": "minecraft:block/dead_brain_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0dfb" ] }, { "type": "bitmap", "file": "minecraft:block/dead_brain_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0dfc" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bubble_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0dfd" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bubble_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0dfe" ] }, { "type": "bitmap", "file": "minecraft:block/dead_bush.png", "ascent": 8, "height": 16, "chars": [ "\u0dff" ] }, { "type": "bitmap", "file": "minecraft:block/dead_fire_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0e00" ] }, { "type": "bitmap", "file": "minecraft:block/dead_fire_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0e01" ] }, { "type": "bitmap", "file": "minecraft:block/dead_horn_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0e02" ] }, { "type": "bitmap", "file": "minecraft:block/dead_horn_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0e03" ] }, { "type": "bitmap", "file": "minecraft:block/dead_tube_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0e04" ] }, { "type": "bitmap", "file": "minecraft:block/dead_tube_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0e05" ] }, { "type": "bitmap", "file": "minecraft:block/detector_rail.png", "ascent": 8, "height": 16, "chars": [ "\u0e06" ] }, { "type": "bitmap", "file": "minecraft:item/diamond.png", "ascent": 8, "height": 16, "chars": [ "\u0e07" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0e08" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0e09" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0e0a" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0e0b" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0e0c" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_horse_armor.png", "ascent": 8, "height": 16, "chars": [ "\u0e0d" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0e0e" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0e0f" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0e10" ] }, { "type": "bitmap", "file": "minecraft:item/diamond_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0e11" ] }, { "type": "bitmap", "file": "minecraft:item/dragon_breath.png", "ascent": 8, "height": 16, "chars": [ "\u0e12" ] }, { "type": "bitmap", "file": "minecraft:item/dried_kelp.png", "ascent": 8, "height": 16, "chars": [ "\u0e13" ] }, { "type": "bitmap", "file": "minecraft:item/egg.png", "ascent": 8, "height": 16, "chars": [ "\u0e14" ] }, { "type": "bitmap", "file": "minecraft:item/elytra.png", "ascent": 8, "height": 16, "chars": [ "\u0e15" ] }, { "type": "bitmap", "file": "minecraft:item/emerald.png", "ascent": 8, "height": 16, "chars": [ "\u0e16" ] }, { "type": "bitmap", "file": "minecraft:item/enchanted_book.png", "ascent": 8, "height": 16, "chars": [ "\u0e17" ] }, { "type": "bitmap", "file": "minecraft:item/end_crystal.png", "ascent": 8, "height": 16, "chars": [ "\u0e16" ] }, { "type": "bitmap", "file": "minecraft:item/ender_eye.png", "ascent": 8, "height": 16, "chars": [ "\u0e19" ] }, { "type": "bitmap", "file": "minecraft:item/ender_pearl.png", "ascent": 8, "height": 16, "chars": [ "\u0e1a" ] }, { "type": "bitmap", "file": "minecraft:item/experience_bottle.png", "ascent": 8, "height": 16, "chars": [ "\u0e1b" ] }, { "type": "bitmap", "file": "minecraft:item/feather.png", "ascent": 8, "height": 16, "chars": [ "\u0e1c" ] }, { "type": "bitmap", "file": "minecraft:item/fermented_spider_eye.png", "ascent": 8, "height": 16, "chars": [ "\u0e1d" ] }, { "type": "bitmap", "file": "minecraft:block/fern.png", "ascent": 8, "height": 16, "chars": [ "\u0e1e" ] }, { "type": "bitmap", "file": "minecraft:item/filled_map.png", "ascent": 8, "height": 16, "chars": [ "\u0e1f" ] }, { "type": "bitmap", "file": "minecraft:item/filled_map_markings.png", "ascent": 8, "height": 16, "chars": [ "\u0e20" ] }, { "type": "bitmap", "file": "minecraft:item/fire_charge.png", "ascent": 8, "height": 16, "chars": [ "\u0e21" ] }, { "type": "bitmap", "file": "minecraft:block/fire_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0e22" ] }, { "type": "bitmap", "file": "minecraft:block/fire_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0e23" ] }, { "type": "bitmap", "file": "minecraft:item/firework_rocket.png", "ascent": 8, "height": 16, "chars": [ "\u0e24" ] }, { "type": "bitmap", "file": "minecraft:item/firework_star.png", "ascent": 8, "height": 16, "chars": [ "\u0e25" ] }, { "type": "bitmap", "file": "minecraft:item/firework_star_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0e26" ] }, { "type": "bitmap", "file": "minecraft:item/fishing_rod.png", "ascent": 8, "height": 16, "chars": [ "\u0e27" ] }, { "type": "bitmap", "file": "minecraft:item/flint.png", "ascent": 8, "height": 16, "chars": [ "\u0e28" ] }, { "type": "bitmap", "file": "minecraft:item/flint_and_steel.png", "ascent": 8, "height": 16, "chars": [ "\u0e29" ] }, { "type": "bitmap", "file": "minecraft:item/flower_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0e2a" ] }, { "type": "bitmap", "file": "minecraft:item/flower_pot.png", "ascent": 8, "height": 16, "chars": [ "\u0e2b" ] }, { "type": "bitmap", "file": "minecraft:item/furnace_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0e2c" ] }, { "type": "bitmap", "file": "minecraft:item/ghast_tear.png", "ascent": 8, "height": 16, "chars": [ "\u0e2d" ] }, { "type": "bitmap", "file": "minecraft:item/glass_bottle.png", "ascent": 8, "height": 16, "chars": [ "\u0e2e" ] }, { "type": "bitmap", "file": "minecraft:block/glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e2f" ] }, { "type": "bitmap", "file": "minecraft:item/glistering_melon_slice.png", "ascent": 8, "height": 16, "chars": [ "\u0e30" ] }, { "type": "bitmap", "file": "minecraft:item/globe_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0e31" ] }, { "type": "bitmap", "file": "minecraft:item/glow_berries.png", "ascent": 8, "height": 16, "chars": [ "\u0e32" ] }, { "type": "bitmap", "file": "minecraft:item/glow_ink_sac.png", "ascent": 8, "height": 16, "chars": [ "\u0e33" ] }, { "type": "bitmap", "file": "minecraft:item/glow_item_frame.png", "ascent": 8, "height": 16, "chars": [ "\u0e34" ] }, { "type": "bitmap", "file": "minecraft:block/glow_lichen.png", "ascent": 8, "height": 16, "chars": [ "\u0e35" ] }, { "type": "bitmap", "file": "minecraft:item/glowstone_dust.png", "ascent": 8, "height": 16, "chars": [ "\u0e36" ] }, { "type": "bitmap", "file": "minecraft:item/gold_ingot.png", "ascent": 8, "height": 16, "chars": [ "\u0e37" ] }, { "type": "bitmap", "file": "minecraft:item/gold_nugget.png", "ascent": 8, "height": 16, "chars": [ "\u0e38" ] }, { "type": "bitmap", "file": "minecraft:item/golden_apple.png", "ascent": 8, "height": 16, "chars": [ "\u0e39" ] }, { "type": "bitmap", "file": "minecraft:item/golden_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0e3a" ] }, { "type": "bitmap", "file": "minecraft:item/golden_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0e3b" ] }, { "type": "bitmap", "file": "minecraft:item/golden_carrot.png", "ascent": 8, "height": 16, "chars": [ "\u0e3c" ] }, { "type": "bitmap", "file": "minecraft:item/golden_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0e3d" ] }, { "type": "bitmap", "file": "minecraft:item/golden_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0e3e" ] }, { "type": "bitmap", "file": "minecraft:item/golden_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0e3f" ] }, { "type": "bitmap", "file": "minecraft:item/golden_horse_armor.png", "ascent": 8, "height": 16, "chars": [ "\u0e40" ] }, { "type": "bitmap", "file": "minecraft:item/golden_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0e41" ] }, { "type": "bitmap", "file": "minecraft:item/golden_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0e42" ] }, { "type": "bitmap", "file": "minecraft:item/golden_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0e43" ] }, { "type": "bitmap", "file": "minecraft:item/golden_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0e44" ] }, { "type": "bitmap", "file": "minecraft:item/gray_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e46" ] }, { "type": "bitmap", "file": "minecraft:item/gray_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e47" ] }, { "type": "bitmap", "file": "minecraft:block/gray_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e48" ] }, { "type": "bitmap", "file": "minecraft:item/green_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e49" ] }, { "type": "bitmap", "file": "minecraft:item/green_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e4a" ] }, { "type": "bitmap", "file": "minecraft:block/green_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e4b" ] }, { "type": "bitmap", "file": "minecraft:item/gunpowder.png", "ascent": 8, "height": 16, "chars": [ "\u0e4c" ] }, { "type": "bitmap", "file": "minecraft:block/hanging_roots.png", "ascent": 8, "height": 16, "chars": [ "\u0e4d" ] }, { "type": "bitmap", "file": "minecraft:item/heart_of_the_sea.png", "ascent": 8, "height": 16, "chars": [ "\u0e4e" ] }, { "type": "bitmap", "file": "minecraft:item/honey_bottle.png", "ascent": 8, "height": 16, "chars": [ "\u0e4f" ] }, { "type": "bitmap", "file": "minecraft:item/honeycomb.png", "ascent": 8, "height": 16, "chars": [ "\u0e50" ] }, { "type": "bitmap", "file": "minecraft:item/hopper.png", "ascent": 8, "height": 16, "chars": [ "\u0e51" ] }, { "type": "bitmap", "file": "minecraft:item/hopper_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0e52" ] }, { "type": "bitmap", "file": "minecraft:block/horn_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0e53" ] }, { "type": "bitmap", "file": "minecraft:block/horn_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0e54" ] }, { "type": "bitmap", "file": "minecraft:item/ink_sac.png", "ascent": 8, "height": 16, "chars": [ "\u0e55" ] }, { "type": "bitmap", "file": "minecraft:item/iron_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0e56" ] }, { "type": "bitmap", "file": "minecraft:block/iron_bars.png", "ascent": 8, "height": 16, "chars": [ "\u0e57" ] }, { "type": "bitmap", "file": "minecraft:item/iron_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0e58" ] }, { "type": "bitmap", "file": "minecraft:item/iron_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0e59" ] }, { "type": "bitmap", "file": "minecraft:item/iron_door.png", "ascent": 8, "height": 16, "chars": [ "\u0e5a" ] }, { "type": "bitmap", "file": "minecraft:item/iron_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0e5b" ] }, { "type": "bitmap", "file": "minecraft:item/iron_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0e5c" ] }, { "type": "bitmap", "file": "minecraft:item/iron_horse_armor.png", "ascent": 8, "height": 16, "chars": [ "\u0e5d" ] }, { "type": "bitmap", "file": "minecraft:item/iron_ingot.png", "ascent": 8, "height": 16, "chars": [ "\u0e5e" ] }, { "type": "bitmap", "file": "minecraft:item/iron_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0e5f" ] }, { "type": "bitmap", "file": "minecraft:item/iron_nugget.png", "ascent": 8, "height": 16, "chars": [ "\u0e60" ] }, { "type": "bitmap", "file": "minecraft:item/iron_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0e61" ] }, { "type": "bitmap", "file": "minecraft:item/iron_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0e62" ] }, { "type": "bitmap", "file": "minecraft:item/iron_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0e63" ] }, { "type": "bitmap", "file": "minecraft:item/item_frame.png", "ascent": 8, "height": 16, "chars": [ "\u0e64" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0e65" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_door.png", "ascent": 8, "height": 16, "chars": [ "\u0e66" ] }, { "type": "bitmap", "file": "minecraft:block/jungle_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0e67" ] }, { "type": "bitmap", "file": "minecraft:item/jungle_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0e68" ] }, { "type": "bitmap", "file": "minecraft:item/kelp.png", "ascent": 8, "height": 16, "chars": [ "\u0e69" ] }, { "type": "bitmap", "file": "minecraft:item/knowledge_book.png", "ascent": 8, "height": 16, "chars": [ "\u0e6a" ] }, { "type": "bitmap", "file": "minecraft:block/ladder.png", "ascent": 8, "height": 16, "chars": [ "\u0e6b" ] }, { "type": "bitmap", "file": "minecraft:item/lantern.png", "ascent": 8, "height": 16, "chars": [ "\u0e6c" ] }, { "type": "bitmap", "file": "minecraft:item/lapis_lazuli.png", "ascent": 8, "height": 16, "chars": [ "\u0e6d" ] }, { "type": "bitmap", "file": "minecraft:block/large_amethyst_bud.png", "ascent": 8, "height": 16, "chars": [ "\u0e6e" ] }, { "type": "bitmap", "file": "minecraft:block/large_fern_top.png", "ascent": 8, "height": 16, "chars": [ "\u0e6f" ] }, { "type": "bitmap", "file": "minecraft:item/lava_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0e70" ] }, { "type": "bitmap", "file": "minecraft:item/lead.png", "ascent": 8, "height": 16, "chars": [ "\u0e71" ] }, { "type": "bitmap", "file": "minecraft:item/leather.png", "ascent": 8, "height": 16, "chars": [ "\u0e72" ] }, { "type": "bitmap", "file": "minecraft:item/leather_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0e73" ] }, { "type": "bitmap", "file": "minecraft:item/leather_boots_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0e74" ] }, { "type": "bitmap", "file": "minecraft:item/leather_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0e75" ] }, { "type": "bitmap", "file": "minecraft:item/leather_chestplate_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0e76" ] }, { "type": "bitmap", "file": "minecraft:item/leather_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0e77" ] }, { "type": "bitmap", "file": "minecraft:item/leather_helmet_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0e78" ] }, { "type": "bitmap", "file": "minecraft:item/leather_horse_armor.png", "ascent": 8, "height": 16, "chars": [ "\u0e79" ] }, { "type": "bitmap", "file": "minecraft:item/leather_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0e7a" ] }, { "type": "bitmap", "file": "minecraft:item/leather_leggings_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0e7b" ] }, { "type": "bitmap", "file": "minecraft:block/lever.png", "ascent": 8, "height": 16, "chars": [ "\u0e7c" ] }, { "type": "bitmap", "file": "minecraft:item/light.png", "ascent": 8, "height": 16, "chars": [ "\u0e7d" ] }, { "type": "bitmap", "file": "minecraft:item/light_00.png", "ascent": 8, "height": 16, "chars": [ "\u0e7e" ] }, { "type": "bitmap", "file": "minecraft:item/light_01.png", "ascent": 8, "height": 16, "chars": [ "\u0e7f" ] }, { "type": "bitmap", "file": "minecraft:item/light_02.png", "ascent": 8, "height": 16, "chars": [ "\u0e80" ] }, { "type": "bitmap", "file": "minecraft:item/light_03.png", "ascent": 8, "height": 16, "chars": [ "\u0e81" ] }, { "type": "bitmap", "file": "minecraft:item/light_04.png", "ascent": 8, "height": 16, "chars": [ "\u0e82" ] }, { "type": "bitmap", "file": "minecraft:item/light_05.png", "ascent": 8, "height": 16, "chars": [ "\u0e83" ] }, { "type": "bitmap", "file": "minecraft:item/light_06.png", "ascent": 8, "height": 16, "chars": [ "\u0e84" ] }, { "type": "bitmap", "file": "minecraft:item/light_07.png", "ascent": 8, "height": 16, "chars": [ "\u0e85" ] }, { "type": "bitmap", "file": "minecraft:item/light_08.png", "ascent": 8, "height": 16, "chars": [ "\u0e86" ] }, { "type": "bitmap", "file": "minecraft:item/light_09.png", "ascent": 8, "height": 16, "chars": [ "\u0e87" ] }, { "type": "bitmap", "file": "minecraft:item/light_10.png", "ascent": 8, "height": 16, "chars": [ "\u0e88" ] }, { "type": "bitmap", "file": "minecraft:item/light_11.png", "ascent": 8, "height": 16, "chars": [ "\u0e89" ] }, { "type": "bitmap", "file": "minecraft:item/light_12.png", "ascent": 8, "height": 16, "chars": [ "\u0e8a" ] }, { "type": "bitmap", "file": "minecraft:item/light_13.png", "ascent": 8, "height": 16, "chars": [ "\u0e8b" ] }, { "type": "bitmap", "file": "minecraft:item/light_14.png", "ascent": 8, "height": 16, "chars": [ "\u0e8c" ] }, { "type": "bitmap", "file": "minecraft:item/light_15.png", "ascent": 8, "height": 16, "chars": [ "\u0e8d" ] }, { "type": "bitmap", "file": "minecraft:item/light_blue_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e8e" ] }, { "type": "bitmap", "file": "minecraft:item/light_blue_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e8f" ] }, { "type": "bitmap", "file": "minecraft:block/light_blue_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e90" ] }, { "type": "bitmap", "file": "minecraft:item/light_gray_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e91" ] }, { "type": "bitmap", "file": "minecraft:item/light_gray_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e92" ] }, { "type": "bitmap", "file": "minecraft:block/light_gray_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e93" ] }, { "type": "bitmap", "file": "minecraft:block/lilac_top.png", "ascent": 8, "height": 16, "chars": [ "\u0e94" ] }, { "type": "bitmap", "file": "minecraft:block/lily_of_the_valley.png", "ascent": 8, "height": 16, "chars": [ "\u0e95" ] }, { "type": "bitmap", "file": "minecraft:block/lily_pad.png", "ascent": 8, "height": 16, "chars": [ "\u0e96" ] }, { "type": "bitmap", "file": "minecraft:item/lime_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e97" ] }, { "type": "bitmap", "file": "minecraft:item/lime_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e98" ] }, { "type": "bitmap", "file": "minecraft:block/lime_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e99" ] }, { "type": "bitmap", "file": "minecraft:item/lingering_potion.png", "ascent": 8, "height": 16, "chars": [ "\u0e9a" ] }, { "type": "bitmap", "file": "minecraft:item/magenta_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0e9b" ] }, { "type": "bitmap", "file": "minecraft:item/magenta_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0e9c" ] }, { "type": "bitmap", "file": "minecraft:block/magenta_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0e9d" ] }, { "type": "bitmap", "file": "minecraft:item/magma_cream.png", "ascent": 8, "height": 16, "chars": [ "\u0e9e" ] }, { "type": "bitmap", "file": "minecraft:item/map.png", "ascent": 8, "height": 16, "chars": [ "\u0e9f" ] }, { "type": "bitmap", "file": "minecraft:block/medium_amethyst_bud.png", "ascent": 8, "height": 16, "chars": [ "\u0ea0" ] }, { "type": "bitmap", "file": "minecraft:item/melon_seeds.png", "ascent": 8, "height": 16, "chars": [ "\u0ea1" ] }, { "type": "bitmap", "file": "minecraft:item/melon_slice.png", "ascent": 8, "height": 16, "chars": [ "\u0ea2" ] }, { "type": "bitmap", "file": "minecraft:item/milk_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0ea3" ] }, { "type": "bitmap", "file": "minecraft:item/minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0ea4" ] }, { "type": "bitmap", "file": "minecraft:item/mojang_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0ea5" ] }, { "type": "bitmap", "file": "minecraft:item/mushroom_stew.png", "ascent": 8, "height": 16, "chars": [ "\u0ea6" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_11.png", "ascent": 8, "height": 16, "chars": [ "\u0ea7" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_13.png", "ascent": 8, "height": 16, "chars": [ "\u0ea8" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_blocks.png", "ascent": 8, "height": 16, "chars": [ "\u0ea9" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_cat.png", "ascent": 8, "height": 16, "chars": [ "\u0eaa" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_chirp.png", "ascent": 8, "height": 16, "chars": [ "\u0eab" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_far.png", "ascent": 8, "height": 16, "chars": [ "\u0eac" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_mall.png", "ascent": 8, "height": 16, "chars": [ "\u0ead" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_mellohi.png", "ascent": 8, "height": 16, "chars": [ "\u0eae" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_pigstep.png", "ascent": 8, "height": 16, "chars": [ "\u0eaf" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_stal.png", "ascent": 8, "height": 16, "chars": [ "\u0eb0" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_strad.png", "ascent": 8, "height": 16, "chars": [ "\u0eb1" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_wait.png", "ascent": 8, "height": 16, "chars": [ "\u0eb2" ] }, { "type": "bitmap", "file": "minecraft:item/music_disc_ward.png", "ascent": 8, "height": 16, "chars": [ "\u0eb3" ] }, { "type": "bitmap", "file": "minecraft:item/mutton.png", "ascent": 8, "height": 16, "chars": [ "\u0eb4" ] }, { "type": "bitmap", "file": "minecraft:item/name_tag.png", "ascent": 8, "height": 16, "chars": [ "\u0eb5" ] }, { "type": "bitmap", "file": "minecraft:item/nautilus_shell.png", "ascent": 8, "height": 16, "chars": [ "\u0eb6" ] }, { "type": "bitmap", "file": "minecraft:item/nether_brick.png", "ascent": 8, "height": 16, "chars": [ "\u0eb7" ] }, { "type": "bitmap", "file": "minecraft:block/nether_sprouts.png", "ascent": 8, "height": 16, "chars": [ "\u0eb8" ] }, { "type": "bitmap", "file": "minecraft:item/nether_star.png", "ascent": 8, "height": 16, "chars": [ "\u0eb9" ] }, { "type": "bitmap", "file": "minecraft:item/nether_wart.png", "ascent": 8, "height": 16, "chars": [ "\u0eba" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0ebb" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_boots.png", "ascent": 8, "height": 16, "chars": [ "\u0ebc" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_chestplate.png", "ascent": 8, "height": 16, "chars": [ "\u0ebd" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0ebe" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0ebf" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_ingot.png", "ascent": 8, "height": 16, "chars": [ "\u0ec0" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_leggings.png", "ascent": 8, "height": 16, "chars": [ "\u0ec1" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0ec2" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_scrap.png", "ascent": 8, "height": 16, "chars": [ "\u0ec3" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0ec4" ] }, { "type": "bitmap", "file": "minecraft:item/netherite_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0ec5" ] }, { "type": "bitmap", "file": "minecraft:item/oak_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0ec6" ] }, { "type": "bitmap", "file": "minecraft:item/oak_door.png", "ascent": 8, "height": 16, "chars": [ "\u0ec7" ] }, { "type": "bitmap", "file": "minecraft:block/oak_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0ec8" ] }, { "type": "bitmap", "file": "minecraft:item/oak_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0ec9" ] }, { "type": "bitmap", "file": "minecraft:item/orange_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0eca" ] }, { "type": "bitmap", "file": "minecraft:item/orange_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0ecb" ] }, { "type": "bitmap", "file": "minecraft:block/orange_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0ecc" ] }, { "type": "bitmap", "file": "minecraft:block/orange_tulip.png", "ascent": 8, "height": 16, "chars": [ "\u0ecd" ] }, { "type": "bitmap", "file": "minecraft:block/oxeye_daisy.png", "ascent": 8, "height": 16, "chars": [ "\u0ece" ] }, { "type": "bitmap", "file": "minecraft:item/painting.png", "ascent": 8, "height": 16, "chars": [ "\u0ecf" ] }, { "type": "bitmap", "file": "minecraft:item/paper.png", "ascent": 8, "height": 16, "chars": [ "\u0ed0" ] }, { "type": "bitmap", "file": "minecraft:block/peony_top.png", "ascent": 8, "height": 16, "chars": [ "\u0ed1" ] }, { "type": "bitmap", "file": "minecraft:item/phantom_membrane.png", "ascent": 8, "height": 16, "chars": [ "\u0ed2" ] }, { "type": "bitmap", "file": "minecraft:item/piglin_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0ed3" ] }, { "type": "bitmap", "file": "minecraft:item/pink_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0ed4" ] }, { "type": "bitmap", "file": "minecraft:item/pink_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0ed5" ] }, { "type": "bitmap", "file": "minecraft:block/pink_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0ed6" ] }, { "type": "bitmap", "file": "minecraft:block/pink_tulip.png", "ascent": 8, "height": 16, "chars": [ "\u0ed7" ] }, { "type": "bitmap", "file": "minecraft:item/pointed_dripstone.png", "ascent": 8, "height": 16, "chars": [ "\u0ed8" ] }, { "type": "bitmap", "file": "minecraft:item/poisonous_potato.png", "ascent": 8, "height": 16, "chars": [ "\u0ed9" ] }, { "type": "bitmap", "file": "minecraft:item/popped_chorus_fruit.png", "ascent": 8, "height": 16, "chars": [ "\u0eda" ] }, { "type": "bitmap", "file": "minecraft:block/poppy.png", "ascent": 8, "height": 16, "chars": [ "\u0edb" ] }, { "type": "bitmap", "file": "minecraft:item/porkchop.png", "ascent": 8, "height": 16, "chars": [ "\u0edc" ] }, { "type": "bitmap", "file": "minecraft:item/potato.png", "ascent": 8, "height": 16, "chars": [ "\u0edd" ] }, { "type": "bitmap", "file": "minecraft:item/potion.png", "ascent": 8, "height": 16, "chars": [ "\u0ede" ] }, { "type": "bitmap", "file": "minecraft:item/potion_overlay.png", "ascent": 8, "height": 16, "chars": [ "\u0edf" ] }, { "type": "bitmap", "file": "minecraft:item/powder_snow_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0ee0" ] }, { "type": "bitmap", "file": "minecraft:block/powered_rail.png", "ascent": 8, "height": 16, "chars": [ "\u0ee1" ] }, { "type": "bitmap", "file": "minecraft:item/prismarine_crystals.png", "ascent": 8, "height": 16, "chars": [ "\u0ee2" ] }, { "type": "bitmap", "file": "minecraft:item/prismarine_shard.png", "ascent": 8, "height": 16, "chars": [ "\u0ee3" ] }, { "type": "bitmap", "file": "minecraft:item/pufferfish.png", "ascent": 8, "height": 16, "chars": [ "\u0ee4" ] }, { "type": "bitmap", "file": "minecraft:item/pufferfish_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0ee5" ] }, { "type": "bitmap", "file": "minecraft:item/pumpkin_pie.png", "ascent": 8, "height": 16, "chars": [ "\u0ee6" ] }, { "type": "bitmap", "file": "minecraft:item/pumpkin_seeds.png", "ascent": 8, "height": 16, "chars": [ "\u0ee7" ] }, { "type": "bitmap", "file": "minecraft:item/purple_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0ee8" ] }, { "type": "bitmap", "file": "minecraft:item/purple_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0ee9" ] }, { "type": "bitmap", "file": "minecraft:block/purple_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0eea" ] }, { "type": "bitmap", "file": "minecraft:item/quartz.png", "ascent": 8, "height": 16, "chars": [ "\u0eeb" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit.png", "ascent": 8, "height": 16, "chars": [ "\u0eec" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_foot.png", "ascent": 8, "height": 16, "chars": [ "\u0eed" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_hide.png", "ascent": 8, "height": 16, "chars": [ "\u0eee" ] }, { "type": "bitmap", "file": "minecraft:item/rabbit_stew.png", "ascent": 8, "height": 16, "chars": [ "\u0eef" ] }, { "type": "bitmap", "file": "minecraft:block/rail.png", "ascent": 8, "height": 16, "chars": [ "\u0ef0" ] }, { "type": "bitmap", "file": "minecraft:item/raw_copper.png", "ascent": 8, "height": 16, "chars": [ "\u0ef1" ] }, { "type": "bitmap", "file": "minecraft:item/raw_gold.png", "ascent": 8, "height": 16, "chars": [ "\u0ef2" ] }, { "type": "bitmap", "file": "minecraft:item/raw_iron.png", "ascent": 8, "height": 16, "chars": [ "\u0ef3" ] }, { "type": "bitmap", "file": "minecraft:item/red_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0ef4" ] }, { "type": "bitmap", "file": "minecraft:item/red_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0ef5" ] }, { "type": "bitmap", "file": "minecraft:block/red_mushroom.png", "ascent": 8, "height": 16, "chars": [ "\u0ef6" ] }, { "type": "bitmap", "file": "minecraft:block/red_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0ef7" ] }, { "type": "bitmap", "file": "minecraft:block/red_tulip.png", "ascent": 8, "height": 16, "chars": [ "\u0ef8" ] }, { "type": "bitmap", "file": "minecraft:item/redstone.png", "ascent": 8, "height": 16, "chars": [ "\u0ef9" ] }, { "type": "bitmap", "file": "minecraft:block/redstone_torch.png", "ascent": 8, "height": 16, "chars": [ "\u0efa" ] }, { "type": "bitmap", "file": "minecraft:item/repeater.png", "ascent": 8, "height": 16, "chars": [ "\u0efb" ] }, { "type": "bitmap", "file": "minecraft:block/rose_bush_top.png", "ascent": 8, "height": 16, "chars": [ "\u0efc" ] }, { "type": "bitmap", "file": "minecraft:item/rotten_flesh.png", "ascent": 8, "height": 16, "chars": [ "\u0efd" ] }, { "type": "bitmap", "file": "minecraft:item/saddle.png", "ascent": 8, "height": 16, "chars": [ "\u0efe" ] }, { "type": "bitmap", "file": "minecraft:item/salmon.png", "ascent": 8, "height": 16, "chars": [ "\u0eff" ] }, { "type": "bitmap", "file": "minecraft:item/salmon_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0f00" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_scute.png", "ascent": 8, "height": 16, "chars": [ "\u0f01" ] }, { "type": "bitmap", "file": "minecraft:item/sea_pickle.png", "ascent": 8, "height": 16, "chars": [ "\u0f02" ] }, { "type": "bitmap", "file": "minecraft:item/seagrass.png", "ascent": 8, "height": 16, "chars": [ "\u0f03" ] }, { "type": "bitmap", "file": "minecraft:item/shears.png", "ascent": 8, "height": 16, "chars": [ "\u0f04" ] }, { "type": "bitmap", "file": "minecraft:item/shulker_shell.png", "ascent": 8, "height": 16, "chars": [ "\u0f05" ] }, { "type": "bitmap", "file": "minecraft:item/skull_banner_pattern.png", "ascent": 8, "height": 16, "chars": [ "\u0f06" ] }, { "type": "bitmap", "file": "minecraft:item/slime_ball.png", "ascent": 8, "height": 16, "chars": [ "\u0f07" ] }, { "type": "bitmap", "file": "minecraft:block/small_amethyst_bud.png", "ascent": 8, "height": 16, "chars": [ "\u0f08" ] }, { "type": "bitmap", "file": "minecraft:item/snowball.png", "ascent": 8, "height": 16, "chars": [ "\u0f09" ] }, { "type": "bitmap", "file": "minecraft:item/soul_campfire.png", "ascent": 8, "height": 16, "chars": [ "\u0f0a" ] }, { "type": "bitmap", "file": "minecraft:item/soul_lantern.png", "ascent": 8, "height": 16, "chars": [ "\u0f0b" ] }, { "type": "bitmap", "file": "minecraft:block/soul_torch.png", "ascent": 8, "height": 16, "chars": [ "\u0f0c" ] }, { "type": "bitmap", "file": "minecraft:item/spectral_arrow.png", "ascent": 8, "height": 16, "chars": [ "\u0f0f" ] }, { "type": "bitmap", "file": "minecraft:item/spider_eye.png", "ascent": 8, "height": 16, "chars": [ "\u0f10" ] }, { "type": "bitmap", "file": "minecraft:item/splash_potion.png", "ascent": 8, "height": 16, "chars": [ "\u0f11" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_boat.png", "ascent": 8, "height": 16, "chars": [ "\u0f12" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_door.png", "ascent": 8, "height": 16, "chars": [ "\u0f13" ] }, { "type": "bitmap", "file": "minecraft:block/spruce_sapling.png", "ascent": 8, "height": 16, "chars": [ "\u0f14" ] }, { "type": "bitmap", "file": "minecraft:item/spruce_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0f15" ] }, { "type": "bitmap", "file": "minecraft:item/spyglass.png", "ascent": 8, "height": 16, "chars": [ "\u0f16" ] }, { "type": "bitmap", "file": "minecraft:item/stick.png", "ascent": 8, "height": 16, "chars": [ "\u0f17" ] }, { "type": "bitmap", "file": "minecraft:item/stone_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0f16" ] }, { "type": "bitmap", "file": "minecraft:item/stone_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0f19" ] }, { "type": "bitmap", "file": "minecraft:item/stone_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0f1a" ] }, { "type": "bitmap", "file": "minecraft:item/stone_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0f1b" ] }, { "type": "bitmap", "file": "minecraft:item/stone_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0f1c" ] }, { "type": "bitmap", "file": "minecraft:item/string.png", "ascent": 8, "height": 16, "chars": [ "\u0f1d" ] }, { "type": "bitmap", "file": "minecraft:item/structure_void.png", "ascent": 8, "height": 16, "chars": [ "\u0f1e" ] }, { "type": "bitmap", "file": "minecraft:item/sugar.png", "ascent": 8, "height": 16, "chars": [ "\u0f1f" ] }, { "type": "bitmap", "file": "minecraft:item/sugar_cane.png", "ascent": 8, "height": 16, "chars": [ "\u0f20" ] }, { "type": "bitmap", "file": "minecraft:block/sunflower_front.png", "ascent": 8, "height": 16, "chars": [ "\u0f21" ] }, { "type": "bitmap", "file": "minecraft:item/suspicious_stew.png", "ascent": 8, "height": 16, "chars": [ "\u0f22" ] }, { "type": "bitmap", "file": "minecraft:item/sweet_berries.png", "ascent": 8, "height": 16, "chars": [ "\u0f23" ] }, { "type": "bitmap", "file": "minecraft:block/tall_grass_top.png", "ascent": 8, "height": 16, "chars": [ "\u0f24" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_base.png", "ascent": 8, "height": 16, "chars": [ "\u0f25" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_base.png", "ascent": 8, "height": 16, "chars": [ "\u0f26" ] }, { "type": "bitmap", "file": "minecraft:item/tipped_arrow_head.png", "ascent": 8, "height": 16, "chars": [ "\u0f27" ] }, { "type": "bitmap", "file": "minecraft:item/tnt_minecart.png", "ascent": 8, "height": 16, "chars": [ "\u0f28" ] }, { "type": "bitmap", "file": "minecraft:block/torch.png", "ascent": 8, "height": 16, "chars": [ "\u0f29" ] }, { "type": "bitmap", "file": "minecraft:item/totem_of_undying.png", "ascent": 8, "height": 16, "chars": [ "\u0f2a" ] }, { "type": "bitmap", "file": "minecraft:item/trident.png", "ascent": 8, "height": 16, "chars": [ "\u0f2b" ] }, { "type": "bitmap", "file": "minecraft:block/tripwire_hook.png", "ascent": 8, "height": 16, "chars": [ "\u0f2c" ] }, { "type": "bitmap", "file": "minecraft:item/tropical_fish.png", "ascent": 8, "height": 16, "chars": [ "\u0f2d" ] }, { "type": "bitmap", "file": "minecraft:item/tropical_fish_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0f2e" ] }, { "type": "bitmap", "file": "minecraft:block/tube_coral.png", "ascent": 8, "height": 16, "chars": [ "\u0f2f" ] }, { "type": "bitmap", "file": "minecraft:block/tube_coral_fan.png", "ascent": 8, "height": 16, "chars": [ "\u0f30" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_egg.png", "ascent": 8, "height": 16, "chars": [ "\u0f31" ] }, { "type": "bitmap", "file": "minecraft:item/turtle_helmet.png", "ascent": 8, "height": 16, "chars": [ "\u0f32" ] }, { "type": "bitmap", "file": "minecraft:block/twisting_vines_plant.png", "ascent": 8, "height": 16, "chars": [ "\u0f33" ] }, { "type": "bitmap", "file": "minecraft:block/vine.png", "ascent": 8, "height": 16, "chars": [ "\u0f34" ] }, { "type": "bitmap", "file": "minecraft:item/warped_door.png", "ascent": 8, "height": 16, "chars": [ "\u0f35" ] }, { "type": "bitmap", "file": "minecraft:block/warped_fungus.png", "ascent": 8, "height": 16, "chars": [ "\u0f36" ] }, { "type": "bitmap", "file": "minecraft:item/warped_fungus_on_a_stick.png", "ascent": 8, "height": 16, "chars": [ "\u0f37" ] }, { "type": "bitmap", "file": "minecraft:block/warped_roots.png", "ascent": 8, "height": 16, "chars": [ "\u0f38" ] }, { "type": "bitmap", "file": "minecraft:item/warped_sign.png", "ascent": 8, "height": 16, "chars": [ "\u0f39" ] }, { "type": "bitmap", "file": "minecraft:item/water_bucket.png", "ascent": 8, "height": 16, "chars": [ "\u0f3a" ] }, { "type": "bitmap", "file": "minecraft:block/weeping_vines_plant.png", "ascent": 8, "height": 16, "chars": [ "\u0f3b" ] }, { "type": "bitmap", "file": "minecraft:item/wheat.png", "ascent": 8, "height": 16, "chars": [ "\u0f3c" ] }, { "type": "bitmap", "file": "minecraft:item/wheat_seeds.png", "ascent": 8, "height": 16, "chars": [ "\u0f3d" ] }, { "type": "bitmap", "file": "minecraft:item/white_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0f3e" ] }, { "type": "bitmap", "file": "minecraft:item/white_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0f3f" ] }, { "type": "bitmap", "file": "minecraft:block/white_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0f40" ] }, { "type": "bitmap", "file": "minecraft:block/white_tulip.png", "ascent": 8, "height": 16, "chars": [ "\u0f41" ] }, { "type": "bitmap", "file": "minecraft:block/wither_rose.png", "ascent": 8, "height": 16, "chars": [ "\u0f42" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_axe.png", "ascent": 8, "height": 16, "chars": [ "\u0f43" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_hoe.png", "ascent": 8, "height": 16, "chars": [ "\u0f44" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_pickaxe.png", "ascent": 8, "height": 16, "chars": [ "\u0f45" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_shovel.png", "ascent": 8, "height": 16, "chars": [ "\u0f46" ] }, { "type": "bitmap", "file": "minecraft:item/wooden_sword.png", "ascent": 8, "height": 16, "chars": [ "\u0f47" ] }, { "type": "bitmap", "file": "minecraft:item/writable_book.png", "ascent": 8, "height": 16, "chars": [ "\u0f48" ] }, { "type": "bitmap", "file": "minecraft:item/written_book.png", "ascent": 8, "height": 16, "chars": [ "\u0f49" ] }, { "type": "bitmap", "file": "minecraft:item/yellow_candle.png", "ascent": 8, "height": 16, "chars": [ "\u0f4a" ] }, { "type": "bitmap", "file": "minecraft:item/yellow_dye.png", "ascent": 8, "height": 16, "chars": [ "\u0f4b" ] }, { "type": "bitmap", "file": "minecraft:block/yellow_stained_glass.png", "ascent": 8, "height": 16, "chars": [ "\u0f4c" ] } ] } ================================================ FILE: gm4_guidebook/assets/gm4/textures/item/NOTE.md ================================================ # NOTE These textures will be distributed to their proper datapack folders in the future, but that architechure is considered future work. They are left here as legacy textures and referenced in the gm4_items.json font. ================================================ FILE: gm4_guidebook/assets/gm4_guidebook/lang/en_us.json ================================================ { "gui.gm4.guidebook.page": "\u9004\u9005\ue005\u9006\u9007\ue001", "gui.gm4.guidebook.page.toc": "\u9008\u9009\ue005\u900a\u900b\ue001", "gui.gm4.guidebook.page.intro": "\u9008\u9009\ue005\u900a\u900b\ue001", "gui.gm4.guidebook.header.toc": "\uf016", "gui.gm4.guidebook.header.toc.under": "\uf016", "gui.gm4.guidebook.header.wiki": "\uf016", "gui.gm4.guidebook.header.wiki.under": "\uf016", "gui.gm4.guidebook.header.refresh": "\uf016", "gui.gm4.guidebook.header.refresh.under": "\uf016", "gui.gm4.guidebook.header.prev": "\uf016", "gui.gm4.guidebook.header.prev.under": "\uf016", "gui.gm4.guidebook.header.next": "\uf016", "gui.gm4.guidebook.header.next.under": "\uf016", "gui.gm4.guidebook.locked_page": "\n\n\n\n\uf110\n\uf110\uf037?\uf048\n\uf110\n\uf110", "gui.gm4.guidebook.toast": "\u9000\ue148\u9001\uf003", "gui.gm4.guidebook.crafting.display.grid": "\uf004\u9002\u9003\ue007", "gui.gm4.guidebook.crafting.display.empty_slot": "\uf018", "gui.gm4.guidebook.crafting.display.filled_slot.under": "\uf018", "gui.gm4.guidebook.crafting.display.empty_slot.under": "\uf018", "gui.gm4.guidebook.crafting.display.arrow": "\uf019", "gui.gm4.guidebook.crafting.display.arrow.under": "\uf019", "gui.gm4.guidebook.crafting.display.shapeless": "🔀", "gui.gm4.guidebook.crafting.display.count.0": "\ue007\u0abf", "gui.gm4.guidebook.crafting.display.count.1": "\ue007\u0ac0", "gui.gm4.guidebook.crafting.display.count.2": "\ue007\u0ac1", "gui.gm4.guidebook.crafting.display.count.3": "\ue007\u0ac2", "gui.gm4.guidebook.crafting.display.count.4": "\ue007\u0ac3", "gui.gm4.guidebook.crafting.display.count.5": "\ue007\u0ac4", "gui.gm4.guidebook.crafting.display.count.6": "\ue007\u0ac5", "gui.gm4.guidebook.crafting.display.count.7": "\ue007\u0ac6", "gui.gm4.guidebook.crafting.display.count.8": "\ue007\u0ac7", "gui.gm4.guidebook.crafting.display.count.9": "\ue007\u0ac8", "gui.gm4.guidebook.crafting.display.count.10": "\ue012\u0ac0\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.11": "\ue012\u0ac0\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.12": "\ue012\u0ac0\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.13": "\ue012\u0ac0\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.14": "\ue012\u0ac0\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.count.15": "\ue012\u0ac0\ue002\u0ac4", "gui.gm4.guidebook.crafting.display.count.16": "\ue012\u0ac0\ue002\u0ac5", "gui.gm4.guidebook.crafting.display.count.17": "\ue012\u0ac0\ue002\u0ac6", "gui.gm4.guidebook.crafting.display.count.18": "\ue012\u0ac0\ue002\u0ac7", "gui.gm4.guidebook.crafting.display.count.19": "\ue012\u0ac0\ue002\u0ac8", "gui.gm4.guidebook.crafting.display.count.20": "\ue012\u0ac1\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.21": "\ue012\u0ac1\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.22": "\ue012\u0ac1\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.23": "\ue012\u0ac1\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.24": "\ue012\u0ac1\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.count.25": "\ue012\u0ac1\ue002\u0ac4", "gui.gm4.guidebook.crafting.display.count.26": "\ue012\u0ac1\ue002\u0ac5", "gui.gm4.guidebook.crafting.display.count.27": "\ue012\u0ac1\ue002\u0ac6", "gui.gm4.guidebook.crafting.display.count.28": "\ue012\u0ac1\ue002\u0ac7", "gui.gm4.guidebook.crafting.display.count.29": "\ue012\u0ac1\ue002\u0ac8", "gui.gm4.guidebook.crafting.display.count.30": "\ue012\u0ac2\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.31": "\ue012\u0ac2\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.32": "\ue012\u0ac2\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.33": "\ue012\u0ac2\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.34": "\ue012\u0ac2\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.count.35": "\ue012\u0ac2\ue002\u0ac4", "gui.gm4.guidebook.crafting.display.count.36": "\ue012\u0ac2\ue002\u0ac5", "gui.gm4.guidebook.crafting.display.count.37": "\ue012\u0ac2\ue002\u0ac6", "gui.gm4.guidebook.crafting.display.count.38": "\ue012\u0ac2\ue002\u0ac7", "gui.gm4.guidebook.crafting.display.count.39": "\ue012\u0ac2\ue002\u0ac8", "gui.gm4.guidebook.crafting.display.count.40": "\ue012\u0ac3\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.41": "\ue012\u0ac3\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.42": "\ue012\u0ac3\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.43": "\ue012\u0ac3\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.44": "\ue012\u0ac3\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.count.45": "\ue012\u0ac3\ue002\u0ac4", "gui.gm4.guidebook.crafting.display.count.46": "\ue012\u0ac3\ue002\u0ac5", "gui.gm4.guidebook.crafting.display.count.47": "\ue012\u0ac3\ue002\u0ac6", "gui.gm4.guidebook.crafting.display.count.48": "\ue012\u0ac3\ue002\u0ac7", "gui.gm4.guidebook.crafting.display.count.49": "\ue012\u0ac3\ue002\u0ac8", "gui.gm4.guidebook.crafting.display.count.50": "\ue012\u0ac4\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.51": "\ue012\u0ac4\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.52": "\ue012\u0ac4\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.53": "\ue012\u0ac4\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.54": "\ue012\u0ac4\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.count.55": "\ue012\u0ac4\ue002\u0ac4", "gui.gm4.guidebook.crafting.display.count.56": "\ue012\u0ac4\ue002\u0ac5", "gui.gm4.guidebook.crafting.display.count.57": "\ue012\u0ac4\ue002\u0ac6", "gui.gm4.guidebook.crafting.display.count.58": "\ue012\u0ac4\ue002\u0ac7", "gui.gm4.guidebook.crafting.display.count.59": "\ue012\u0ac4\ue002\u0ac8", "gui.gm4.guidebook.crafting.display.count.60": "\ue012\u0ac5\ue002\u0abf", "gui.gm4.guidebook.crafting.display.count.61": "\ue012\u0ac5\ue002\u0ac0", "gui.gm4.guidebook.crafting.display.count.62": "\ue012\u0ac5\ue002\u0ac1", "gui.gm4.guidebook.crafting.display.count.63": "\ue012\u0ac5\ue002\u0ac2", "gui.gm4.guidebook.crafting.display.count.64": "\ue012\u0ac5\ue002\u0ac3", "gui.gm4.guidebook.crafting.display.minecraft.acacia_button": "\u0ad7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_fence": "\u0ad8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_fence_gate": "\u0ad9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_leaves": "\u0ada\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_log": "\u0adb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_planks": "\u0adc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_pressure_plate": "\u0add\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_slab": "\u0ade\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_stairs": "\u0adf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_trapdoor": "\u0ae0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.acacia_wood": "\u0ae1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.amethyst_block": "\u0ae2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.ancient_debris": "\u0ae3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.andesite": "\u0ae4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.andesite_slab": "\u0ae5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.andesite_stairs": "\u0ae6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.andesite_wall": "\u0ae7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.anvil": "\u0ae8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.azalea": "\u0ae9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.azalea_leaves": "\u0aea\uf001", "gui.gm4.guidebook.crafting.display.minecraft.barrel": "\u0aeb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.basalt": "\u0aec\uf001", "gui.gm4.guidebook.crafting.display.minecraft.beacon": "\u0aed\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bedrock": "\u0aee\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bee_nest": "\u0aef\uf001", "gui.gm4.guidebook.crafting.display.minecraft.beehive": "\u0af0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.big_dripleaf": "\u0af1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_button": "\u0af2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_fence": "\u0af3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_fence_gate": "\u0af4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_leaves": "\u0af5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_log": "\u0af6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_planks": "\u0af7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_pressure_plate": "\u0af8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_slab": "\u0af9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_stairs": "\u0afa\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_trapdoor": "\u0afb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.birch_wood": "\u0afc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_banner": "\u0afd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_bed": "\u0afe\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_carpet": "\u0aff\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_concrete": "\u0b00\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_concrete_powder": "\u0b01\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_glazed_terracotta": "\u0b02\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_shulker_box": "\u0b03\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_stained_glass": "\u0b04\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_terracotta": "\u0b05\uf001", "gui.gm4.guidebook.crafting.display.minecraft.black_wool": "\u0b06\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blackstone": "\u0b07\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blackstone_slab": "\u0b08\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blackstone_stairs": "\u0b09\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blackstone_wall": "\u0b0a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blast_furnace": "\u0b0b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_banner": "\u0b0c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_bed": "\u0b0d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_carpet": "\u0b0e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_concrete": "\u0b0f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_concrete_powder": "\u0b10\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_glazed_terracotta": "\u0b11\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_ice": "\u0b12\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_shulker_box": "\u0b13\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_stained_glass": "\u0b14\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_terracotta": "\u0b15\uf001", "gui.gm4.guidebook.crafting.display.minecraft.blue_wool": "\u0b16\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bone_block": "\u0b17\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bookshelf": "\u0b18\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brain_coral_block": "\u0b19\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brick_slab": "\u0b1a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brick_stairs": "\u0b1b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brick_wall": "\u0b1c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bricks": "\u0b1d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_banner": "\u0b1e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_bed": "\u0b1f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_carpet": "\u0b20\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_concrete": "\u0b21\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_concrete_powder": "\u0b22\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_glazed_terracotta": "\u0b23\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_mushroom_block": "\u0b24\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_shulker_box": "\u0b25\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_stained_glass": "\u0b26\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_terracotta": "\u0b27\uf001", "gui.gm4.guidebook.crafting.display.minecraft.brown_wool": "\u0b28\uf001", "gui.gm4.guidebook.crafting.display.minecraft.bubble_coral_block": "\u0b29\uf001", "gui.gm4.guidebook.crafting.display.minecraft.budding_amethyst": "\u0b2a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cactus": "\u0b2b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.calcite": "\u0b2c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cartography_table": "\u0b2d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.carved_pumpkin": "\u0b2e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chain_command_block": "\u0b2f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chest": "\u0b30\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chipped_anvil": "\u0b31\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_deepslate": "\u0b32\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_nether_bricks": "\u0b33\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_polished_blackstone": "\u0b34\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_quartz_block": "\u0b35\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_red_sandstone": "\u0b36\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_sandstone": "\u0b37\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chiseled_stone_bricks": "\u0b38\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chorus_flower": "\u0b39\uf001", "gui.gm4.guidebook.crafting.display.minecraft.chorus_plant": "\u0b3a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.clay": "\u0b3b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.coal_block": "\u0b3c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.coal_ore": "\u0b3d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.coarse_dirt": "\u0b3e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate": "\u0b3f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_slab": "\u0b40\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_stairs": "\u0b41\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobbled_deepslate_wall": "\u0b42\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobblestone": "\u0b43\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobblestone_slab": "\u0b44\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobblestone_stairs": "\u0b45\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cobblestone_wall": "\u0b46\uf001", "gui.gm4.guidebook.crafting.display.minecraft.command_block": "\u0b47\uf001", "gui.gm4.guidebook.crafting.display.minecraft.composter": "\u0b48\uf001", "gui.gm4.guidebook.crafting.display.minecraft.conduit": "\u0b49\uf001", "gui.gm4.guidebook.crafting.display.minecraft.copper_block": "\u0b4a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.copper_ore": "\u0b4b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cracked_deepslate_bricks": "\u0b4c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cracked_deepslate_tiles": "\u0b4d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cracked_nether_bricks": "\u0b4e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cracked_polished_blackstone_bricks": "\u0b4f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cracked_stone_bricks": "\u0b50\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crafting_table": "\u0b51\uf001", "gui.gm4.guidebook.crafting.display.minecraft.creeper_head": "\u0b52\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_button": "\u0b53\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_fence": "\u0b54\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_fence_gate": "\u0b55\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_hyphae": "\u0b56\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_nylium": "\u0b57\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_planks": "\u0b58\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_pressure_plate": "\u0b59\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_slab": "\u0b5a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_stairs": "\u0b5b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_stem": "\u0b5c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crimson_trapdoor": "\u0b5d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.crying_obsidian": "\u0b5e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_copper": "\u0b5f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_copper_slab": "\u0b60\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_copper_stairs": "\u0b61\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_red_sandstone": "\u0b62\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_red_sandstone_slab": "\u0b63\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_sandstone": "\u0b64\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cut_sandstone_slab": "\u0b65\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_banner": "\u0b66\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_bed": "\u0b67\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_carpet": "\u0b68\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_concrete": "\u0b69\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_concrete_powder": "\u0b6a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_glazed_terracotta": "\u0b6b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_shulker_box": "\u0b6c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_stained_glass": "\u0b6d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_terracotta": "\u0b6e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.cyan_wool": "\u0b6f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.damaged_anvil": "\u0b70\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_button": "\u0b71\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_fence": "\u0b72\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_fence_gate": "\u0b73\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_leaves": "\u0b74\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_log": "\u0b75\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_planks": "\u0b76\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_pressure_plate": "\u0b77\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_slab": "\u0b78\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_stairs": "\u0b79\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_trapdoor": "\u0b7a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_wood": "\u0b7b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine": "\u0b7c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine_slab": "\u0b7d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dark_prismarine_stairs": "\u0b7e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.daylight_detector": "\u0b7f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral_block": "\u0b80\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral_block": "\u0b81\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral_block": "\u0b82\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral_block": "\u0b83\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral_block": "\u0b84\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate": "\u0b85\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_slab": "\u0b86\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_stairs": "\u0b87\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_brick_wall": "\u0b88\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_bricks": "\u0b89\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_coal_ore": "\u0b8a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_copper_ore": "\u0b8b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_diamond_ore": "\u0b8c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_emerald_ore": "\u0b8d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_gold_ore": "\u0b8e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_iron_ore": "\u0b8f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_lapis_ore": "\u0b90\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_redstone_ore": "\u0b91\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_slab": "\u0b92\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_stairs": "\u0b93\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_tile_wall": "\u0b94\uf001", "gui.gm4.guidebook.crafting.display.minecraft.deepslate_tiles": "\u0b95\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diamond_block": "\u0b96\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diamond_ore": "\u0b97\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diorite": "\u0b98\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diorite_slab": "\u0b99\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diorite_stairs": "\u0b9a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.diorite_wall": "\u0b9b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dirt": "\u0b9c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dirt_path": "\u0b9d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dispenser": "\u0b9e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dragon_egg": "\u0b9f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dragon_head": "\u0ba0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dried_kelp_block": "\u0ba1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dripstone_block": "\u0ba2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.dropper": "\u0ba3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.emerald_block": "\u0ba4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.emerald_ore": "\u0ba5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.enchanting_table": "\u0ba6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_portal_frame": "\u0ba7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_rod": "\u0ba8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_stone": "\u0ba9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_slab": "\u0baa\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_stairs": "\u0bab\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_stone_brick_wall": "\u0bac\uf001", "gui.gm4.guidebook.crafting.display.minecraft.end_stone_bricks": "\u0bad\uf001", "gui.gm4.guidebook.crafting.display.minecraft.ender_chest": "\u0bae\uf001", "gui.gm4.guidebook.crafting.display.minecraft.exposed_copper": "\u0baf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper": "\u0bb0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper_slab": "\u0bb1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.exposed_cut_copper_stairs": "\u0bb2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.farmland": "\u0bb3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.fire_coral_block": "\u0bb4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.fletching_table": "\u0bb5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.flowering_azalea": "\u0bb6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.flowering_azalea_leaves": "\u0bb7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.furnace": "\u0bb8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gilded_blackstone": "\u0bb9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.glass": "\u0bba\uf001", "gui.gm4.guidebook.crafting.display.minecraft.glowstone": "\u0bbb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gold_block": "\u0bbc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gold_ore": "\u0bbd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.granite": "\u0bbe\uf001", "gui.gm4.guidebook.crafting.display.minecraft.granite_slab": "\u0bbf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.granite_stairs": "\u0bc0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.granite_wall": "\u0bc1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.grass_block": "\u0bc2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gravel": "\u0bc3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_banner": "\u0bc4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_bed": "\u0bc5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_carpet": "\u0bc6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_concrete": "\u0bc7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_concrete_powder": "\u0bc8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_glazed_terracotta": "\u0bc9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_shulker_box": "\u0bca\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_stained_glass": "\u0bcb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_terracotta": "\u0bcc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.gray_wool": "\u0bcd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_banner": "\u0bce\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_bed": "\u0bcf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_carpet": "\u0bd0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_concrete": "\u0bd1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_concrete_powder": "\u0bd2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_glazed_terracotta": "\u0bd3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_shulker_box": "\u0bd4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_stained_glass": "\u0bd5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_terracotta": "\u0bd6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.green_wool": "\u0bd7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.grindstone": "\u0bd8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.hay_block": "\u0bd9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.heavy_weighted_pressure_plate": "\u0bda\uf001", "gui.gm4.guidebook.crafting.display.minecraft.honey_block": "\u0bdb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.honeycomb_block": "\u0bdc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.horn_coral_block": "\u0bdd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.ice": "\u0bde\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_chiseled_stone_bricks": "\u0bdf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_cobblestone": "\u0be0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_cracked_stone_bricks": "\u0be1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_deepslate": "\u0be2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_mossy_stone_bricks": "\u0be3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_stone": "\u0be4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.infested_stone_bricks": "\u0be5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.iron_block": "\u0be6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.iron_ore": "\u0be7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.iron_trapdoor": "\u0be8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jack_o_lantern": "\u0be9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jigsaw": "\u0bea\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jukebox": "\u0beb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_button": "\u0bec\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_fence": "\u0bed\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_fence_gate": "\u0bee\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_leaves": "\u0bef\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_log": "\u0bf0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_planks": "\u0bf1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_pressure_plate": "\u0bf2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_slab": "\u0bf3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_stairs": "\u0bf4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_trapdoor": "\u0bf5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.jungle_wood": "\u0bf6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lapis_block": "\u0bf7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lapis_ore": "\u0bf8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lectern": "\u0bf9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_banner": "\u0bfa\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_bed": "\u0bfb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_carpet": "\u0bfc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_concrete": "\u0bfd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_concrete_powder": "\u0bfe\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_glazed_terracotta": "\u0bff\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_shulker_box": "\u0c00\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_stained_glass": "\u0c01\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_terracotta": "\u0c02\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_wool": "\u0c03\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_banner": "\u0c04\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_bed": "\u0c05\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_carpet": "\u0c06\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_concrete": "\u0c07\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_concrete_powder": "\u0c08\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_glazed_terracotta": "\u0c09\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_shulker_box": "\u0c0a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_stained_glass": "\u0c0b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_terracotta": "\u0c0c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_wool": "\u0c0d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.light_weighted_pressure_plate": "\u0c0e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lightning_rod": "\u0c0f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_banner": "\u0c10\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_bed": "\u0c11\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_carpet": "\u0c12\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_concrete": "\u0c13\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_concrete_powder": "\u0c14\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_glazed_terracotta": "\u0c15\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_shulker_box": "\u0c16\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_stained_glass": "\u0c17\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_terracotta": "\u0c18\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lime_wool": "\u0c19\uf001", "gui.gm4.guidebook.crafting.display.minecraft.lodestone": "\u0c1a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.loom": "\u0c1b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_banner": "\u0c1c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_bed": "\u0c1d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_carpet": "\u0c1e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_concrete": "\u0c1f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_concrete_powder": "\u0c20\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_glazed_terracotta": "\u0c21\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_shulker_box": "\u0c22\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_stained_glass": "\u0c23\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_terracotta": "\u0c24\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magenta_wool": "\u0c25\uf001", "gui.gm4.guidebook.crafting.display.minecraft.magma_block": "\u0c26\uf001", "gui.gm4.guidebook.crafting.display.minecraft.melon": "\u0c27\uf001", "gui.gm4.guidebook.crafting.display.minecraft.moss_block": "\u0c28\uf001", "gui.gm4.guidebook.crafting.display.minecraft.moss_carpet": "\u0c29\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone": "\u0c2a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_slab": "\u0c2b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_stairs": "\u0c2c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_cobblestone_wall": "\u0c2d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_slab": "\u0c2e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_stairs": "\u0c2f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_brick_wall": "\u0c30\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mossy_stone_bricks": "\u0c31\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mushroom_stem": "\u0c32\uf001", "gui.gm4.guidebook.crafting.display.minecraft.mycelium": "\u0c33\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_brick_fence": "\u0c34\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_brick_slab": "\u0c35\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_brick_stairs": "\u0c36\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_brick_wall": "\u0c37\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_bricks": "\u0c38\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_gold_ore": "\u0c39\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_quartz_ore": "\u0c3a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.nether_wart_block": "\u0c3b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.netherite_block": "\u0c3c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.netherrack": "\u0c3d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.note_block": "\u0c3e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_button": "\u0c3f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_fence": "\u0c40\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_fence_gate": "\u0c41\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_leaves": "\u0c42\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_log": "\u0c43\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_planks": "\u0c44\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_pressure_plate": "\u0c45\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_slab": "\u0c46\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_stairs": "\u0c47\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_trapdoor": "\u0c48\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oak_wood": "\u0c49\uf001", "gui.gm4.guidebook.crafting.display.minecraft.observer": "\u0c4a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.obsidian": "\u0c4b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_banner": "\u0c4c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_bed": "\u0c4d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_carpet": "\u0c4e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_concrete": "\u0c4f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_concrete_powder": "\u0c50\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_glazed_terracotta": "\u0c51\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_shulker_box": "\u0c52\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_stained_glass": "\u0c53\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_terracotta": "\u0c54\uf001", "gui.gm4.guidebook.crafting.display.minecraft.orange_wool": "\u0c55\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oxidized_copper": "\u0c56\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper": "\u0c57\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper_slab": "\u0c58\uf001", "gui.gm4.guidebook.crafting.display.minecraft.oxidized_cut_copper_stairs": "\u0c59\uf001", "gui.gm4.guidebook.crafting.display.minecraft.packed_ice": "\u0c5a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.petrified_oak_slab": "\u0c5b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_banner": "\u0c5c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_bed": "\u0c5d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_carpet": "\u0c5e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_concrete": "\u0c5f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_concrete_powder": "\u0c60\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_glazed_terracotta": "\u0c61\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_shulker_box": "\u0c62\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_stained_glass": "\u0c63\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_terracotta": "\u0c64\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pink_wool": "\u0c65\uf001", "gui.gm4.guidebook.crafting.display.minecraft.piston": "\u0c66\uf001", "gui.gm4.guidebook.crafting.display.minecraft.player_head": "\u0c67\uf001", "gui.gm4.guidebook.crafting.display.minecraft.podzol": "\u0c68\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_andesite": "\u0c69\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_andesite_slab": "\u0c6a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_andesite_stairs": "\u0c6b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_basalt": "\u0c6c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone": "\u0c6d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_slab": "\u0c6e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_stairs": "\u0c6f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_brick_wall": "\u0c70\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_bricks": "\u0c71\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_button": "\u0c72\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_pressure_plate": "\u0c73\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_slab": "\u0c74\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_stairs": "\u0c75\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_blackstone_wall": "\u0c76\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate": "\u0c77\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_slab": "\u0c78\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_stairs": "\u0c79\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_deepslate_wall": "\u0c7a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_diorite": "\u0c7b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_diorite_slab": "\u0c7c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_diorite_stairs": "\u0c7d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_granite": "\u0c7e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_granite_slab": "\u0c7f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.polished_granite_stairs": "\u0c80\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine": "\u0c81\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_brick_slab": "\u0c82\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_brick_stairs": "\u0c83\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_bricks": "\u0c84\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_slab": "\u0c85\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_stairs": "\u0c86\uf001", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_wall": "\u0c87\uf001", "gui.gm4.guidebook.crafting.display.minecraft.pumpkin": "\u0c88\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_banner": "\u0c89\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_bed": "\u0c8a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_carpet": "\u0c8b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_concrete": "\u0c8c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_concrete_powder": "\u0c8d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_glazed_terracotta": "\u0c8e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_shulker_box": "\u0c8f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_stained_glass": "\u0c90\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_terracotta": "\u0c91\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purple_wool": "\u0c92\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purpur_block": "\u0c93\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purpur_pillar": "\u0c94\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purpur_slab": "\u0c95\uf001", "gui.gm4.guidebook.crafting.display.minecraft.purpur_stairs": "\u0c96\uf001", "gui.gm4.guidebook.crafting.display.minecraft.quartz_block": "\u0c97\uf001", "gui.gm4.guidebook.crafting.display.minecraft.quartz_bricks": "\u0c98\uf001", "gui.gm4.guidebook.crafting.display.minecraft.quartz_pillar": "\u0c99\uf001", "gui.gm4.guidebook.crafting.display.minecraft.quartz_slab": "\u0c9a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.quartz_stairs": "\u0c9b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.raw_copper_block": "\u0c9c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.raw_gold_block": "\u0c9d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.raw_iron_block": "\u0c9e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_banner": "\u0c9f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_bed": "\u0ca0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_carpet": "\u0ca1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_concrete": "\u0ca2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_concrete_powder": "\u0ca3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_glazed_terracotta": "\u0ca4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_mushroom_block": "\u0ca5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_slab": "\u0ca6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_stairs": "\u0ca7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_nether_brick_wall": "\u0ca8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_nether_bricks": "\u0ca9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_sand": "\u0caa\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_sandstone": "\u0cab\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_slab": "\u0cac\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_stairs": "\u0cad\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_sandstone_wall": "\u0cae\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_shulker_box": "\u0caf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_stained_glass": "\u0cb0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_terracotta": "\u0cb1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.red_wool": "\u0cb2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.redstone_block": "\u0cb3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.redstone_lamp": "\u0cb4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.redstone_ore": "\u0cb5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.repeating_command_block": "\u0cb6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.respawn_anchor": "\u0cb7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.rooted_dirt": "\u0cb8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sand": "\u0cb9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sandstone": "\u0cba\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sandstone_slab": "\u0cbb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sandstone_stairs": "\u0cbc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sandstone_wall": "\u0cbd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.scaffolding": "\u0cbe\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sculk_sensor": "\u0cbf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sea_lantern": "\u0cc0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.shield": "\u0cc1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.shroomlight": "\u0cc2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.shulker_box": "\u0cc3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.skeleton_skull": "\u0cc4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.slime_block": "\u0cc5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.small_dripleaf": "\u0cc6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smithing_table": "\u0cc7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smoker": "\u0cc8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_basalt": "\u0cc9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz": "\u0cca\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz_slab": "\u0ccb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_quartz_stairs": "\u0ccc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone": "\u0ccd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone_slab": "\u0cce\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_red_sandstone_stairs": "\u0ccf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone": "\u0cd0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone_slab": "\u0cd1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_sandstone_stairs": "\u0cd2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_stone": "\u0cd3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.smooth_stone_slab": "\u0cd4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.snow": "\u0cd5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.snow_block": "\u0cd6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.soul_sand": "\u0cd7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.soul_soil": "\u0cd8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spawner": "\u0cd9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sponge": "\u0cda\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spore_blossom": "\u0cdb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_button": "\u0cdc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_fence": "\u0cdd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_fence_gate": "\u0cde\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_leaves": "\u0cdf\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_log": "\u0ce0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_planks": "\u0ce1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_pressure_plate": "\u0ce2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_slab": "\u0ce3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_stairs": "\u0ce4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_trapdoor": "\u0ce5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.spruce_wood": "\u0ce6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.sticky_piston": "\u0ce7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone": "\u0ce8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_brick_slab": "\u0ce9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_brick_stairs": "\u0cea\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_brick_wall": "\u0ceb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_bricks": "\u0cec\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_button": "\u0ced\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_pressure_plate": "\u0cee\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_slab": "\u0cef\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stone_stairs": "\u0cf0\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stonecutter": "\u0cf1\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_acacia_log": "\u0cf2\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_acacia_wood": "\u0cf3\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_birch_log": "\u0cf4\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_birch_wood": "\u0cf5\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_crimson_hyphae": "\u0cf6\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_crimson_stem": "\u0cf7\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_dark_oak_log": "\u0cf8\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_dark_oak_wood": "\u0cf9\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_jungle_log": "\u0cfa\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_jungle_wood": "\u0cfb\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_oak_log": "\u0cfc\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_oak_wood": "\u0cfd\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_spruce_log": "\u0cfe\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_spruce_wood": "\u0cff\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_warped_hyphae": "\u0d00\uf001", "gui.gm4.guidebook.crafting.display.minecraft.stripped_warped_stem": "\u0d01\uf001", "gui.gm4.guidebook.crafting.display.minecraft.structure_block": "\u0d02\uf001", "gui.gm4.guidebook.crafting.display.minecraft.target": "\u0d03\uf001", "gui.gm4.guidebook.crafting.display.minecraft.terracotta": "\u0d04\uf001", "gui.gm4.guidebook.crafting.display.minecraft.tinted_glass": "\u0d05\uf001", "gui.gm4.guidebook.crafting.display.minecraft.tnt": "\u0d06\uf001", "gui.gm4.guidebook.crafting.display.minecraft.trapped_chest": "\u0d07\uf001", "gui.gm4.guidebook.crafting.display.minecraft.tube_coral_block": "\u0d08\uf001", "gui.gm4.guidebook.crafting.display.minecraft.tuff": "\u0d09\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_button": "\u0d0a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_fence": "\u0d0b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_fence_gate": "\u0d0c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_hyphae": "\u0d0d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_nylium": "\u0d0e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_planks": "\u0d0f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_pressure_plate": "\u0d10\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_slab": "\u0d11\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_stairs": "\u0d12\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_stem": "\u0d13\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_trapdoor": "\u0d14\uf001", "gui.gm4.guidebook.crafting.display.minecraft.warped_wart_block": "\u0d15\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_copper_block": "\u0d16\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper": "\u0d17\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper_slab": "\u0d18\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_cut_copper_stairs": "\u0d19\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_copper": "\u0d1a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper": "\u0d1b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper_slab": "\u0d1c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_exposed_cut_copper_stairs": "\u0d1d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_copper": "\u0d1e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper": "\u0d1f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper_slab": "\u0d20\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_oxidized_cut_copper_stairs": "\u0d21\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_copper": "\u0d22\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper": "\u0d23\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper_slab": "\u0d24\uf001", "gui.gm4.guidebook.crafting.display.minecraft.waxed_weathered_cut_copper_stairs": "\u0d25\uf001", "gui.gm4.guidebook.crafting.display.minecraft.weathered_copper": "\u0d26\uf001", "gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper": "\u0d27\uf001", "gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper_slab": "\u0d28\uf001", "gui.gm4.guidebook.crafting.display.minecraft.weathered_cut_copper_stairs": "\u0d29\uf001", "gui.gm4.guidebook.crafting.display.minecraft.wet_sponge": "\u0d2a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_banner": "\u0d2b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_bed": "\u0d2c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_carpet": "\u0d2d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_concrete": "\u0d2e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_concrete_powder": "\u0d2f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_glazed_terracotta": "\u0d30\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_shulker_box": "\u0d31\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_stained_glass": "\u0d32\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_terracotta": "\u0d33\uf001", "gui.gm4.guidebook.crafting.display.minecraft.white_wool": "\u0d34\uf001", "gui.gm4.guidebook.crafting.display.minecraft.wither_skeleton_skull": "\u0d35\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_banner": "\u0d36\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_bed": "\u0d37\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_carpet": "\u0d38\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_concrete": "\u0d39\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_concrete_powder": "\u0d3a\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_glazed_terracotta": "\u0d3b\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_shulker_box": "\u0d3c\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_stained_glass": "\u0d3d\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_terracotta": "\u0d3e\uf001", "gui.gm4.guidebook.crafting.display.minecraft.yellow_wool": "\u0d3f\uf001", "gui.gm4.guidebook.crafting.display.minecraft.zombie_head": "\u0d40\uf001", "gui.gm4.guidebook.crafting.display.gm4.block_compressor": "\u4001\uf001", "gui.gm4.guidebook.crafting.display.gm4.charcoal_block": "\u0b3c\uf001", "gui.gm4.guidebook.crafting.display.gm4.custom_crafter": "\u4002\uf001", "gui.gm4.guidebook.crafting.display.gm4.disassembler": "\u4003\uf001", "gui.gm4.guidebook.crafting.display.gm4.enchantment_extractor": "\u4004\uf001", "gui.gm4.guidebook.crafting.display.gm4.ender_hopper": "\u4005\uf001", "gui.gm4.guidebook.crafting.display.gm4.liquid_tank": "\u4006\uf001", "gui.gm4.guidebook.crafting.display.gm4.forming_press": "\u4007\uf001", "gui.gm4.guidebook.crafting.display.gm4.smeltery": "\u4008\uf001", "gui.gm4.guidebook.crafting.display.gm4.tinkering_compressor": "\u4009\uf001", "gui.gm4.guidebook.crafting.display.gm4.teleportation_anchor": "\u4010\uf001", "gui.gm4.guidebook.crafting.display.gm4.teleportation_jammer": "\u4011\uf001", "gui.gm4.guidebook.crafting.display.banner_pattern.border": "\ue018\u0d41", "gui.gm4.guidebook.crafting.display.banner_pattern.bricks": "\ue018\u0d42", "gui.gm4.guidebook.crafting.display.banner_pattern.circle": "\ue018\u0d43", "gui.gm4.guidebook.crafting.display.banner_pattern.creeper": "\ue018\u0d44", "gui.gm4.guidebook.crafting.display.banner_pattern.cross": "\ue018\u0d45", "gui.gm4.guidebook.crafting.display.banner_pattern.curly_border": "\ue018\u0d46", "gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_left": "\ue018\u0d47", "gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_right": "\ue018\u0d48", "gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_up_left": "\ue018\u0d49", "gui.gm4.guidebook.crafting.display.banner_pattern.diagonal_up_right": "\ue018\u0d4a", "gui.gm4.guidebook.crafting.display.banner_pattern.flower": "\ue018\u0d4b", "gui.gm4.guidebook.crafting.display.banner_pattern.globe": "\ue018\u0d4c", "gui.gm4.guidebook.crafting.display.banner_pattern.gradient": "\ue018\u0d4d", "gui.gm4.guidebook.crafting.display.banner_pattern.gradient_up": "\ue018\u0d4e", "gui.gm4.guidebook.crafting.display.banner_pattern.half_horizontal": "\ue018\u0d4f", "gui.gm4.guidebook.crafting.display.banner_pattern.half_horizontal_bottom": "\ue018\u0d50", "gui.gm4.guidebook.crafting.display.banner_pattern.half_vertical": "\ue018\u0d51", "gui.gm4.guidebook.crafting.display.banner_pattern.half_vertical_right": "\ue018\u0d52", "gui.gm4.guidebook.crafting.display.banner_pattern.mojang": "\ue018\u0d53", "gui.gm4.guidebook.crafting.display.banner_pattern.piglin": "\ue018\u0d54", "gui.gm4.guidebook.crafting.display.banner_pattern.rhombus": "\ue018\u0d55", "gui.gm4.guidebook.crafting.display.banner_pattern.skull": "\ue018\u0d56", "gui.gm4.guidebook.crafting.display.banner_pattern.small_stripes": "\ue018\u0d57", "gui.gm4.guidebook.crafting.display.banner_pattern.square_bottom_left": "\ue018\u0d58", "gui.gm4.guidebook.crafting.display.banner_pattern.square_bottom_right": "\ue018\u0d59", "gui.gm4.guidebook.crafting.display.banner_pattern.square_top_left": "\ue018\u0d5a", "gui.gm4.guidebook.crafting.display.banner_pattern.square_top_right": "\ue018\u0d5b", "gui.gm4.guidebook.crafting.display.banner_pattern.straight_cross": "\ue018\u0d5c", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_bottom": "\ue018\u0d5d", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_center": "\ue018\u0d5e", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_downleft": "\ue018\u0d5f", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_downright": "\ue018\u0d60", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_left": "\ue018\u0d61", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_middle": "\ue018\u0d62", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_right": "\ue018\u0d63", "gui.gm4.guidebook.crafting.display.banner_pattern.stripe_top": "\ue018\u0d64", "gui.gm4.guidebook.crafting.display.banner_pattern.triangle_bottom": "\ue018\u0d65", "gui.gm4.guidebook.crafting.display.banner_pattern.triangle_top": "\ue018\u0d66", "gui.gm4.guidebook.crafting.display.banner_pattern.triangles_bottom": "\ue018\u0d67", "gui.gm4.guidebook.crafting.display.banner_pattern.triangles_top": "\ue018\u0d68", "gui.gm4.guidebook.crafting.display.shield_pattern.base": "\ue018\u0d69", "gui.gm4.guidebook.crafting.display.shield_pattern.border": "\ue018\u0d6a", "gui.gm4.guidebook.crafting.display.shield_pattern.bricks": "\ue018\u0d6b", "gui.gm4.guidebook.crafting.display.shield_pattern.circle": "\ue018\u0d6c", "gui.gm4.guidebook.crafting.display.shield_pattern.creeper": "\ue018\u0d6d", "gui.gm4.guidebook.crafting.display.shield_pattern.cross": "\ue018\u0d6e", "gui.gm4.guidebook.crafting.display.shield_pattern.curly_border": "\ue018\u0d6f", "gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_left": "\ue018\u0d70", "gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_right": "\ue018\u0d71", "gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_up_left": "\ue018\u0d72", "gui.gm4.guidebook.crafting.display.shield_pattern.diagonal_up_right": "\ue018\u0d73", "gui.gm4.guidebook.crafting.display.shield_pattern.flower": "\ue018\u0d74", "gui.gm4.guidebook.crafting.display.shield_pattern.globe": "\ue018\u0d75", "gui.gm4.guidebook.crafting.display.shield_pattern.gradient": "\ue018\u0d76", "gui.gm4.guidebook.crafting.display.shield_pattern.gradient_up": "\ue018\u0d77", "gui.gm4.guidebook.crafting.display.shield_pattern.half_horizontal": "\ue018\u0d78", "gui.gm4.guidebook.crafting.display.shield_pattern.half_horizontal_bottom": "\ue018\u0d79", "gui.gm4.guidebook.crafting.display.shield_pattern.half_vertical": "\ue018\u0d7a", "gui.gm4.guidebook.crafting.display.shield_pattern.half_vertical_right": "\ue018\u0d7b", "gui.gm4.guidebook.crafting.display.shield_pattern.mojang": "\ue018\u0d7c", "gui.gm4.guidebook.crafting.display.shield_pattern.piglin": "\ue018\u0d7d", "gui.gm4.guidebook.crafting.display.shield_pattern.rhombus": "\ue018\u0d7e", "gui.gm4.guidebook.crafting.display.shield_pattern.skull": "\ue018\u0d7f", "gui.gm4.guidebook.crafting.display.shield_pattern.small_stripes": "\ue018\u0d80", "gui.gm4.guidebook.crafting.display.shield_pattern.square_bottom_left": "\ue018\u0d81", "gui.gm4.guidebook.crafting.display.shield_pattern.square_bottom_right": "\ue018\u0d82", "gui.gm4.guidebook.crafting.display.shield_pattern.square_top_left": "\ue018\u0d83", "gui.gm4.guidebook.crafting.display.shield_pattern.square_top_right": "\ue018\u0d84", "gui.gm4.guidebook.crafting.display.shield_pattern.straight_cross": "\ue018\u0d85", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_bottom": "\ue018\u0d86", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_center": "\ue018\u0d87", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_downleft": "\ue018\u0d88", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_downright": "\ue018\u0d89", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_left": "\ue018\u0d8a", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_middle": "\ue018\u0d8b", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_right": "\ue018\u0d8c", "gui.gm4.guidebook.crafting.display.shield_pattern.stripe_top": "\ue018\u0d8d", "gui.gm4.guidebook.crafting.display.shield_pattern.triangle_bottom": "\ue018\u0d8e", "gui.gm4.guidebook.crafting.display.shield_pattern.triangle_top": "\ue018\u0d8f", "gui.gm4.guidebook.crafting.display.shield_pattern.triangles_bottom": "\ue018\u0d90", "gui.gm4.guidebook.crafting.display.shield_pattern.triangles_top": "\ue018\u0d91", "gui.gm4.guidebook.crafting.display.minecraft.acacia_boat": "\u0d92\u0903\uf015", "gui.gm4.guidebook.crafting.display.minecraft.acacia_door": "\u0d93\u0904\uf015", "gui.gm4.guidebook.crafting.display.minecraft.acacia_sapling": "\u0d94\u0905\uf015", "gui.gm4.guidebook.crafting.display.minecraft.acacia_sign": "\u0d95\u0906\uf015", "gui.gm4.guidebook.crafting.display.minecraft.activator_rail": "\u0d96\u0907\uf015", "gui.gm4.guidebook.crafting.display.minecraft.allium": "\u0d97\u0908\uf015", "gui.gm4.guidebook.crafting.display.minecraft.amethyst_cluster": "\u0d98\u0909\uf015", "gui.gm4.guidebook.crafting.display.minecraft.amethyst_shard": "\u0d99\u090a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.apple": "\u0d9a\u090b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.armor_stand": "\u0d9b\u090c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.arrow": "\u0d9c\u090d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.axolotl_bucket": "\u0d9d\u090e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.azure_bluet": "\u0d9e\u090f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.baked_potato": "\u0d9f\u0910\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bamboo": "\u0da0\u0911\uf015", "gui.gm4.guidebook.crafting.display.minecraft.barrier": "\u0da1\u0912\uf015", "gui.gm4.guidebook.crafting.display.minecraft.beef": "\u0da2\u0913\uf015", "gui.gm4.guidebook.crafting.display.minecraft.beetroot": "\u0da3\u0914\uf015", "gui.gm4.guidebook.crafting.display.minecraft.beetroot_seeds": "\u0da4\u0915\uf015", "gui.gm4.guidebook.crafting.display.minecraft.beetroot_soup": "\u0da5\u0916\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bell": "\u0da6\u0917\uf015", "gui.gm4.guidebook.crafting.display.minecraft.birch_boat": "\u0da7\u0918\uf015", "gui.gm4.guidebook.crafting.display.minecraft.birch_door": "\u0da8\u0919\uf015", "gui.gm4.guidebook.crafting.display.minecraft.birch_sapling": "\u0da9\u091a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.birch_sign": "\u0daa\u091b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.black_candle": "\u0dab\u091c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.black_dye": "\u0dac\u091d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.black_stained_glass_pane": "\u0dad\u091e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blaze_powder": "\u0dae\u091f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blaze_rod": "\u0daf\u0920\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blue_candle": "\u0db0\u0921\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blue_dye": "\u0db1\u0922\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blue_orchid": "\u0db2\u0923\uf015", "gui.gm4.guidebook.crafting.display.minecraft.blue_stained_glass_pane": "\u0db3\u0924\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bone": "\u0db4\u0925\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bone_meal": "\u0db5\u0926\uf015", "gui.gm4.guidebook.crafting.display.minecraft.book": "\u0db6\u0927\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bow": "\u0db7\u0928\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bowl": "\u0db8\u0929\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brain_coral": "\u0db9\u092a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brain_coral_fan": "\u0dba\u092b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bread": "\u0dbb\u092c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brewing_stand": "\u0dbc\u092d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brick": "\u0dbd\u092e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.broken_elytra": "\u0dbe\u092f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brown_candle": "\u0dbf\u0930\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brown_dye": "\u0dc0\u0931\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brown_mushroom": "\u0dc1\u0932\uf015", "gui.gm4.guidebook.crafting.display.minecraft.brown_stained_glass_pane": "\u0dc2\u0933\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bubble_coral": "\u0dc3\u0934\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bubble_coral_fan": "\u0dc4\u0935\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bucket": "\u0dc5\u0936\uf015", "gui.gm4.guidebook.crafting.display.minecraft.bundle": "\u0dc6\u0937\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cake": "\u0dc8\u0939\uf015", "gui.gm4.guidebook.crafting.display.minecraft.campfire": "\u0dc9\u093a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.candle": "\u0dca\u093b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.carrot": "\u0dcb\u093c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.carrot_on_a_stick": "\u0dcc\u093d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cauldron": "\u0dcd\u093e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_chain": "\u0dce\u093f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chainmail_boots": "\u0dcf\u0940\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chainmail_chestplate": "\u0dd0\u0941\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chainmail_helmet": "\u0dd1\u0942\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chainmail_leggings": "\u0dd2\u0943\uf015", "gui.gm4.guidebook.crafting.display.minecraft.charcoal": "\u0dd3\u0944\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chest_minecart": "\u0dd4\u0945\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chicken": "\u0dd5\u0946\uf015", "gui.gm4.guidebook.crafting.display.minecraft.chorus_fruit": "\u0dd6\u0947\uf015", "gui.gm4.guidebook.crafting.display.minecraft.clay_ball": "\u0dd7\u0948\uf015", "gui.gm4.guidebook.crafting.display.minecraft.clock": "\u0dd8\u0949\uf015", "gui.gm4.guidebook.crafting.display.minecraft.coal": "\u0dd9\u094a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cobweb": "\u0dda\u094b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cocoa_beans": "\u0ddb\u094c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cod": "\u0ddc\u094d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cod_bucket": "\u0ddd\u094e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.command_block_minecart": "\u0dde\u094f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.comparator": "\u0ddf\u0950\uf015", "gui.gm4.guidebook.crafting.display.minecraft.compass": "\u0de0\u0951\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_beef": "\u0de1\u0952\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_chicken": "\u0de2\u0953\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_cod": "\u0de3\u0954\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_mutton": "\u0de4\u0955\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_porkchop": "\u0de5\u0956\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_rabbit": "\u0de6\u0957\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cooked_salmon": "\u0de7\u0958\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cookie": "\u0de8\u0959\uf015", "gui.gm4.guidebook.crafting.display.minecraft.copper_ingot": "\u0de9\u095a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cornflower": "\u0dea\u095b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.creeper_banner_pattern": "\u0deb\u095c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crimson_door": "\u0dec\u095d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crimson_fungus": "\u0ded\u095e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crimson_roots": "\u0dee\u095f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crimson_sign": "\u0def\u0960\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crossbow": "\u0df0\u0961\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crossbow_arrow": "\u0df1\u0962\uf015", "gui.gm4.guidebook.crafting.display.minecraft.crossbow_firework": "\u0df2\u0963\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cyan_candle": "\u0df3\u0964\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cyan_dye": "\u0df4\u0965\uf015", "gui.gm4.guidebook.crafting.display.minecraft.cyan_stained_glass_pane": "\u0df5\u0966\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dandelion": "\u0df6\u0967\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_boat": "\u0df7\u0968\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_door": "\u0df8\u0969\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_sapling": "\u0df9\u096a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dark_oak_sign": "\u0dfa\u096b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral": "\u0dfb\u096c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_brain_coral_fan": "\u0dfc\u096d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral": "\u0dfd\u096e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_bubble_coral_fan": "\u0dfe\u096f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_bush": "\u0dff\u0970\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral": "\u0e00\u0971\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_fire_coral_fan": "\u0e01\u0972\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral": "\u0e02\u0973\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_horn_coral_fan": "\u0e03\u0974\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral": "\u0e04\u0975\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dead_tube_coral_fan": "\u0e05\u0976\uf015", "gui.gm4.guidebook.crafting.display.minecraft.detector_rail": "\u0e06\u0977\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond": "\u0e07\u0978\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_axe": "\u0e08\u0979\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_boots": "\u0e09\u097a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_chestplate": "\u0e0a\u097b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_helmet": "\u0e0b\u097c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_hoe": "\u0e0c\u097d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_horse_armor": "\u0e0d\u097e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_leggings": "\u0e0e\u097f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_pickaxe": "\u0e0f\u0980\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_shovel": "\u0e10\u0981\uf015", "gui.gm4.guidebook.crafting.display.minecraft.diamond_sword": "\u0e11\u0982\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dragon_breath": "\u0e12\u0983\uf015", "gui.gm4.guidebook.crafting.display.minecraft.dried_kelp": "\u0e13\u0984\uf015", "gui.gm4.guidebook.crafting.display.minecraft.egg": "\u0e14\u0985\uf015", "gui.gm4.guidebook.crafting.display.minecraft.elytra": "\u0e15\u0986\uf015", "gui.gm4.guidebook.crafting.display.minecraft.emerald": "\u0e16\u0987\uf015", "gui.gm4.guidebook.crafting.display.minecraft.enchanted_book": "\u0e17\u0988\uf015", "gui.gm4.guidebook.crafting.display.minecraft.end_crystal": "\u0e18\u0989\uf015", "gui.gm4.guidebook.crafting.display.minecraft.ender_eye": "\u0e19\u098a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.ender_pearl": "\u0e1a\u098b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.experience_bottle": "\u0e1b\u098c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.feather": "\u0e1c\u098d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fermented_spider_eye": "\u0e1d\u098e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fern": "\u0e1e\u098f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.filled_map": "\u0e1f\u0990\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.filled_map_markings": "\uffff\ue018\u0e20\u0991\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fire_charge": "\u0e21\u0992\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fire_coral": "\u0e22\u0993\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fire_coral_fan": "\u0e23\u0994\uf015", "gui.gm4.guidebook.crafting.display.minecraft.firework_rocket": "\u0e24\u0995\uf015", "gui.gm4.guidebook.crafting.display.minecraft.firework_star": "\u0e25\u0996\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.firework_star": "\uffff\ue018\u0e26\u0997\uf015", "gui.gm4.guidebook.crafting.display.minecraft.fishing_rod": "\u0e27\u0998\uf015", "gui.gm4.guidebook.crafting.display.minecraft.flint": "\u0e28\u0999\uf015", "gui.gm4.guidebook.crafting.display.minecraft.flint_and_steel": "\u0e29\u099a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.flower_banner_pattern": "\u0e2a\u099b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.flower_pot": "\u0e2b\u099c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.furnace_minecart": "\u0e2c\u099d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.ghast_tear": "\u0e2d\u099e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glass_bottle": "\u0e2e\u099f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glass_pane": "\u0e2f\u09a0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glistering_melon_slice": "\u0e30\u09a1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.globe_banner_pattern": "\u0e31\u09a2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glow_berries": "\u0e32\u09a3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glow_ink_sac": "\u0e33\u09a4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glow_item_frame": "\u0e34\u09a5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glow_lichen": "\u0e35\u09a6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.glowstone_dust": "\u0e36\u09a7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gold_ingot": "\u0e37\u09a8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gold_nugget": "\u0e38\u09a9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_apple": "\u0e39\u09aa\uf015", "gui.gm4.guidebook.crafting.display.minecraft.enchanted_golden_apple": "\u0e39\u09aa\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_axe": "\u0e3a\u09ab\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_boots": "\u0e3b\u09ac\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_carrot": "\u0e3c\u09ad\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_chestplate": "\u0e3d\u09ae\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_helmet": "\u0e3e\u09af\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_hoe": "\u0e3f\u09b0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_horse_armor": "\u0e40\u09b1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_leggings": "\u0e41\u09b2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_pickaxe": "\u0e42\u09b3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_shovel": "\u0e43\u09b4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.golden_sword": "\u0e44\u09b5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.grass": "\u0e45\u09b6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gray_candle": "\u0e46\u09b7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gray_dye": "\u0e47\u09b8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gray_stained_glass_pane": "\u0e48\u09b9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.green_candle": "\u0e49\u09ba\uf015", "gui.gm4.guidebook.crafting.display.minecraft.green_dye": "\u0e4a\u09bb\uf015", "gui.gm4.guidebook.crafting.display.minecraft.green_stained_glass_pane": "\u0e4b\u09bc\uf015", "gui.gm4.guidebook.crafting.display.minecraft.gunpowder": "\u0e4c\u09bd\uf015", "gui.gm4.guidebook.crafting.display.minecraft.hanging_roots": "\u0e4d\u09be\uf015", "gui.gm4.guidebook.crafting.display.minecraft.heart_of_the_sea": "\u0e4e\u09bf\uf015", "gui.gm4.guidebook.crafting.display.minecraft.honey_bottle": "\u0e4f\u09c0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.honeycomb": "\u0e50\u09c1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.hopper": "\u0e51\u09c2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.hopper_minecart": "\u0e52\u09c3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.horn_coral": "\u0e53\u09c4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.horn_coral_fan": "\u0e54\u09c5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.ink_sac": "\u0e55\u09c6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_axe": "\u0e56\u09c7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_bars": "\u0e57\u09c8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_boots": "\u0e58\u09c9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_chestplate": "\u0e59\u09ca\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_door": "\u0e5a\u09cb\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_helmet": "\u0e5b\u09cc\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_hoe": "\u0e5c\u09cd\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_horse_armor": "\u0e5d\u09ce\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_ingot": "\u0e5e\u09cf\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_leggings": "\u0e5f\u09d0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_nugget": "\u0e60\u09d1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_pickaxe": "\u0e61\u09d2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_shovel": "\u0e62\u09d3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.iron_sword": "\u0e63\u09d4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.item_frame": "\u0e64\u09d5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.jungle_boat": "\u0e65\u09d6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.jungle_door": "\u0e66\u09d7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.jungle_sapling": "\u0e67\u09d8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.jungle_sign": "\u0e68\u09d9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.kelp": "\u0e69\u09da\uf015", "gui.gm4.guidebook.crafting.display.minecraft.knowledge_book": "\u0e6a\u09db\uf015", "gui.gm4.guidebook.crafting.display.minecraft.ladder": "\u0e6b\u09dc\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lantern": "\u0e6c\u09dd\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lapis_lazuli": "\u0e6d\u09de\uf015", "gui.gm4.guidebook.crafting.display.minecraft.large_amethyst_bud": "\u0e6e\u09df\uf015", "gui.gm4.guidebook.crafting.display.minecraft.large_fern": "\u0e6f\u09e0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lava_bucket": "\u0e70\u09e1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lead": "\u0e71\u09e2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather": "\u0e72\u09e3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather_boots": "\u0e73\u09e4\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_boots": "\uffff\ue018\u0e74\u09e5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather_chestplate": "\u0e75\u09e6\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_chestplate": "\uffff\ue018\u0e76\u09e7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather_helmet": "\u0e77\u09e8\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_helmet": "\uffff\ue018\u0e78\u09e9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather_horse_armor": "\u0e79\u09ea\uf015", "gui.gm4.guidebook.crafting.display.minecraft.leather_leggings": "\u0e7a\u09eb\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.leather_leggings": "\uffff\ue018\u0e7b\u09ec\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lever": "\u0e7c\u09ed\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light": "\u0e7d\u09ee\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_00": "\u0e7e\u09ef\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_01": "\u0e7f\u09f0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_02": "\u0e80\u09f1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_03": "\u0e81\u09f2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_04": "\u0e82\u09f3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_05": "\u0e83\u09f4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_06": "\u0e84\u09f5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_07": "\u0e85\u09f6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_08": "\u0e86\u09f7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_09": "\u0e87\u09f8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_10": "\u0e88\u09f9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_11": "\u0e89\u09fa\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_12": "\u0e8a\u09fb\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_13": "\u0e8b\u09fc\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_14": "\u0e8c\u09fd\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_15": "\u0e8d\u09fe\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_candle": "\u0e8e\u09ff\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_dye": "\u0e8f\u0a00\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_blue_stained_glass_pane": "\u0e90\u0a01\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_candle": "\u0e91\u0a02\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_dye": "\u0e92\u0a03\uf015", "gui.gm4.guidebook.crafting.display.minecraft.light_gray_stained_glass_pane": "\u0e93\u0a04\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lilac": "\u0e94\u0a05\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lily_of_the_valley": "\u0e95\u0a06\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lily_pad": "\u0e96\u0a07\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lime_candle": "\u0e97\u0a08\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lime_dye": "\u0e98\u0a09\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lime_stained_glass_pane": "\u0e99\u0a0a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.lingering_potion": "\u0e9a\u0a0b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.magenta_candle": "\u0e9b\u0a0c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.magenta_dye": "\u0e9c\u0a0d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.magenta_stained_glass_pane": "\u0e9d\u0a0e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.magma_cream": "\u0e9e\u0a0f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.map": "\u0e9f\u0a10\uf015", "gui.gm4.guidebook.crafting.display.minecraft.medium_amethyst_bud": "\u0ea0\u0a11\uf015", "gui.gm4.guidebook.crafting.display.minecraft.melon_seeds": "\u0ea1\u0a12\uf015", "gui.gm4.guidebook.crafting.display.minecraft.melon_slice": "\u0ea2\u0a13\uf015", "gui.gm4.guidebook.crafting.display.minecraft.milk_bucket": "\u0ea3\u0a14\uf015", "gui.gm4.guidebook.crafting.display.minecraft.minecart": "\u0ea4\u0a15\uf015", "gui.gm4.guidebook.crafting.display.minecraft.mojang_banner_pattern": "\u0ea5\u0a16\uf015", "gui.gm4.guidebook.crafting.display.minecraft.mushroom_stew": "\u0ea6\u0a17\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_11": "\u0ea7\u0a18\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_13": "\u0ea8\u0a19\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_blocks": "\u0ea9\u0a1a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_cat": "\u0eaa\u0a1b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_chirp": "\u0eab\u0a1c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_far": "\u0eac\u0a1d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_mall": "\u0ead\u0a1e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_mellohi": "\u0eae\u0a1f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_pigstep": "\u0eaf\u0a20\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_stal": "\u0eb0\u0a21\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_strad": "\u0eb1\u0a22\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_wait": "\u0eb2\u0a23\uf015", "gui.gm4.guidebook.crafting.display.minecraft.music_disc_ward": "\u0eb3\u0a24\uf015", "gui.gm4.guidebook.crafting.display.minecraft.mutton": "\u0eb4\u0a25\uf015", "gui.gm4.guidebook.crafting.display.minecraft.name_tag": "\u0eb5\u0a26\uf015", "gui.gm4.guidebook.crafting.display.minecraft.nautilus_shell": "\u0eb6\u0a27\uf015", "gui.gm4.guidebook.crafting.display.minecraft.nether_brick": "\u0eb7\u0a28\uf015", "gui.gm4.guidebook.crafting.display.minecraft.nether_sprouts": "\u0eb8\u0a29\uf015", "gui.gm4.guidebook.crafting.display.minecraft.nether_star": "\u0eb9\u0a2a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.nether_wart": "\u0eba\u0a2b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_axe": "\u0ebb\u0a2c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_boots": "\u0ebc\u0a2d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_chestplate": "\u0ebd\u0a2e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_helmet": "\u0ebe\u0a2f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_hoe": "\u0ebf\u0a30\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_ingot": "\u0ec0\u0a31\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_leggings": "\u0ec1\u0a32\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_pickaxe": "\u0ec2\u0a33\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_scrap": "\u0ec3\u0a34\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_shovel": "\u0ec4\u0a35\uf015", "gui.gm4.guidebook.crafting.display.minecraft.netherite_sword": "\u0ec5\u0a36\uf015", "gui.gm4.guidebook.crafting.display.minecraft.oak_boat": "\u0ec6\u0a37\uf015", "gui.gm4.guidebook.crafting.display.minecraft.oak_door": "\u0ec7\u0a38\uf015", "gui.gm4.guidebook.crafting.display.minecraft.oak_sapling": "\u0ec8\u0a39\uf015", "gui.gm4.guidebook.crafting.display.minecraft.oak_sign": "\u0ec9\u0a3a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.orange_candle": "\u0eca\u0a3b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.orange_dye": "\u0ecb\u0a3c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.orange_stained_glass_pane": "\u0ecc\u0a3d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.orange_tulip": "\u0ecd\u0a3e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.oxeye_daisy": "\u0ece\u0a3f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.painting": "\u0ecf\u0a40\uf015", "gui.gm4.guidebook.crafting.display.minecraft.paper": "\u0ed0\u0a41\uf015", "gui.gm4.guidebook.crafting.display.minecraft.peony": "\u0ed1\u0a42\uf015", "gui.gm4.guidebook.crafting.display.minecraft.phantom_membrane": "\u0ed2\u0a43\uf015", "gui.gm4.guidebook.crafting.display.minecraft.piglin_banner_pattern": "\u0ed3\u0a44\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pink_candle": "\u0ed4\u0a45\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pink_dye": "\u0ed5\u0a46\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pink_stained_glass_pane": "\u0ed6\u0a47\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pink_tulip": "\u0ed7\u0a48\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pointed_dripstone": "\u0ed8\u0a49\uf015", "gui.gm4.guidebook.crafting.display.minecraft.poisonous_potato": "\u0ed9\u0a4a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.popped_chorus_fruit": "\u0eda\u0a4b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.poppy": "\u0edb\u0a4c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.porkchop": "\u0edc\u0a4d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.potato": "\u0edd\u0a4e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.potion": "\u0ede\u0a4f\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.potion": "\uffff\ue018\u0edf\u0a50\uf015", "gui.gm4.guidebook.crafting.display.minecraft.powder_snow_bucket": "\u0ee0\u0a51\uf015", "gui.gm4.guidebook.crafting.display.minecraft.powered_rail": "\u0ee1\u0a52\uf015", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_crystals": "\u0ee2\u0a53\uf015", "gui.gm4.guidebook.crafting.display.minecraft.prismarine_shard": "\u0ee3\u0a54\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pufferfish": "\u0ee4\u0a55\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pufferfish_bucket": "\u0ee5\u0a56\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pumpkin_pie": "\u0ee6\u0a57\uf015", "gui.gm4.guidebook.crafting.display.minecraft.pumpkin_seeds": "\u0ee7\u0a58\uf015", "gui.gm4.guidebook.crafting.display.minecraft.purple_candle": "\u0ee8\u0a59\uf015", "gui.gm4.guidebook.crafting.display.minecraft.purple_dye": "\u0ee9\u0a5a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.purple_stained_glass_pane": "\u0eea\u0a5b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.quartz": "\u0eeb\u0a5c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rabbit": "\u0eec\u0a5d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rabbit_foot": "\u0eed\u0a5e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rabbit_hide": "\u0eee\u0a5f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rabbit_stew": "\u0eef\u0a60\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rail": "\u0ef0\u0a61\uf015", "gui.gm4.guidebook.crafting.display.minecraft.raw_copper": "\u0ef1\u0a62\uf015", "gui.gm4.guidebook.crafting.display.minecraft.raw_gold": "\u0ef2\u0a63\uf015", "gui.gm4.guidebook.crafting.display.minecraft.raw_iron": "\u0ef3\u0a64\uf015", "gui.gm4.guidebook.crafting.display.minecraft.red_candle": "\u0ef4\u0a65\uf015", "gui.gm4.guidebook.crafting.display.minecraft.red_dye": "\u0ef5\u0a66\uf015", "gui.gm4.guidebook.crafting.display.minecraft.red_mushroom": "\u0ef6\u0a67\uf015", "gui.gm4.guidebook.crafting.display.minecraft.red_stained_glass_pane": "\u0ef7\u0a68\uf015", "gui.gm4.guidebook.crafting.display.minecraft.red_tulip": "\u0ef8\u0a69\uf015", "gui.gm4.guidebook.crafting.display.minecraft.redstone": "\u0ef9\u0a6a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.redstone_torch": "\u0efa\u0a6b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.repeater": "\u0efb\u0a6c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rose_bush": "\u0efc\u0a6d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.rotten_flesh": "\u0efd\u0a6e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.saddle": "\u0efe\u0a6f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.salmon": "\u0eff\u0a70\uf015", "gui.gm4.guidebook.crafting.display.minecraft.salmon_bucket": "\u0f00\u0a71\uf015", "gui.gm4.guidebook.crafting.display.minecraft.turtle_scute": "\u0f01\u0a72\uf015", "gui.gm4.guidebook.crafting.display.minecraft.sea_pickle": "\u0f02\u0a73\uf015", "gui.gm4.guidebook.crafting.display.minecraft.seagrass": "\u0f03\u0a74\uf015", "gui.gm4.guidebook.crafting.display.minecraft.shears": "\u0f04\u0a75\uf015", "gui.gm4.guidebook.crafting.display.minecraft.shulker_shell": "\u0f05\u0a76\uf015", "gui.gm4.guidebook.crafting.display.minecraft.skull_banner_pattern": "\u0f06\u0a77\uf015", "gui.gm4.guidebook.crafting.display.minecraft.slime_ball": "\u0f07\u0a78\uf015", "gui.gm4.guidebook.crafting.display.minecraft.small_amethyst_bud": "\u0f08\u0a79\uf015", "gui.gm4.guidebook.crafting.display.minecraft.snowball": "\u0f09\u0a7a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.soul_campfire": "\u0f0a\u0a7b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.soul_lantern": "\u0f0b\u0a7c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.soul_torch": "\u0f0c\u0a7d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spectral_arrow": "\u0f0f\u0a80\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spider_eye": "\u0f10\u0a81\uf015", "gui.gm4.guidebook.crafting.display.minecraft.splash_potion": "\u0f11\u0a82\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spruce_boat": "\u0f12\u0a83\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spruce_door": "\u0f13\u0a84\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spruce_sapling": "\u0f14\u0a85\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spruce_sign": "\u0f15\u0a86\uf015", "gui.gm4.guidebook.crafting.display.minecraft.spyglass": "\u0f16\u0a87\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stick": "\u0f17\u0a88\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stone_axe": "\u0f18\u0a89\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stone_hoe": "\u0f19\u0a8a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stone_pickaxe": "\u0f1a\u0a8b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stone_shovel": "\u0f1b\u0a8c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.stone_sword": "\u0f1c\u0a8d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.string": "\u0f1d\u0a8e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.structure_void": "\u0f1e\u0a8f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.sugar": "\u0f1f\u0a90\uf015", "gui.gm4.guidebook.crafting.display.minecraft.sugar_cane": "\u0f20\u0a91\uf015", "gui.gm4.guidebook.crafting.display.minecraft.sunflower": "\u0f21\u0a92\uf015", "gui.gm4.guidebook.crafting.display.minecraft.suspicious_stew": "\u0f22\u0a93\uf015", "gui.gm4.guidebook.crafting.display.minecraft.sweet_berries": "\u0f23\u0a94\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tall_grass": "\u0f24\u0a95\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tipped_arrow": "\u0f25\u0a96\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tipped_arrow_base": "\u0f26\u0a97\uf015", "gui.gm4.guidebook.crafting.display.overlay.minecraft.tipped_arrow_head": "\uffff\ue018\u0f27\u0a98\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tnt_minecart": "\u0f28\u0a99\uf015", "gui.gm4.guidebook.crafting.display.minecraft.torch": "\u0f29\u0a9a\uf015", "gui.gm4.guidebook.crafting.display.minecraft.totem_of_undying": "\u0f2a\u0a9b\uf015", "gui.gm4.guidebook.crafting.display.minecraft.trident": "\u0f2b\u0a9c\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tripwire_hook": "\u0f2c\u0a9d\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tropical_fish": "\u0f2d\u0a9e\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tropical_fish_bucket": "\u0f2e\u0a9f\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tube_coral": "\u0f2f\u0aa0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.tube_coral_fan": "\u0f30\u0aa1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.turtle_egg": "\u0f31\u0aa2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.turtle_helmet": "\u0f32\u0aa3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.twisting_vines": "\u0f33\u0aa4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.vine": "\u0f34\u0aa5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.warped_door": "\u0f35\u0aa6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.warped_fungus": "\u0f36\u0aa7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.warped_fungus_on_a_stick": "\u0f37\u0aa8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.warped_roots": "\u0f38\u0aa9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.warped_sign": "\u0f39\u0aaa\uf015", "gui.gm4.guidebook.crafting.display.minecraft.water_bucket": "\u0f3a\u0aab\uf015", "gui.gm4.guidebook.crafting.display.minecraft.weeping_vines": "\u0f3b\u0aac\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wheat": "\u0f3c\u0aad\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wheat_seeds": "\u0f3d\u0aae\uf015", "gui.gm4.guidebook.crafting.display.minecraft.white_candle": "\u0f3e\u0aaf\uf015", "gui.gm4.guidebook.crafting.display.minecraft.white_dye": "\u0f3f\u0ab0\uf015", "gui.gm4.guidebook.crafting.display.minecraft.white_stained_glass_pane": "\u0f40\u0ab1\uf015", "gui.gm4.guidebook.crafting.display.minecraft.white_tulip": "\u0f41\u0ab2\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wither_rose": "\u0f42\u0ab3\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wooden_axe": "\u0f43\u0ab4\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wooden_hoe": "\u0f44\u0ab5\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wooden_pickaxe": "\u0f45\u0ab6\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wooden_shovel": "\u0f46\u0ab7\uf015", "gui.gm4.guidebook.crafting.display.minecraft.wooden_sword": "\u0f47\u0ab8\uf015", "gui.gm4.guidebook.crafting.display.minecraft.writable_book": "\u0f48\u0ab9\uf015", "gui.gm4.guidebook.crafting.display.minecraft.written_book": "\u0f49\u0aba\uf015", "gui.gm4.guidebook.crafting.display.minecraft.yellow_candle": "\u0f4a\u0abb\uf015", "gui.gm4.guidebook.crafting.display.minecraft.yellow_dye": "\u0f4b\u0abc\uf015", "gui.gm4.guidebook.crafting.display.minecraft.yellow_stained_glass_pane": "\u0f4c\u0abd\uf015", "gui.gm4.guidebook.crafting.display.overlay.gm4.boots_of_ostara": "\uffff\ue018\u4101\u4201\uf015", "gui.gm4.guidebook.crafting.display.gm4.boots_of_ostara": "\u4102\u4202\uf015", "gui.gm4.guidebook.crafting.display.overlay.gm4.flippers": "\uffff\ue018\u4103\u4203\uf015", "gui.gm4.guidebook.crafting.display.gm4.flippers": "\u4104\u4204\uf015", "gui.gm4.guidebook.crafting.display.gm4.scuba_helmet": "\u4105\u4205\uf015", "gui.gm4.guidebook.crafting.display.gm4.scuba_tank": "\u4106\u4206\uf015", "gui.gm4.guidebook.crafting.display.gm4.secret_trapped_oak_sign": "\u4107\u4207\uf015", "gui.gm4.guidebook.crafting.display.gm4.trapped_oak_sign": "\u4108\u4208\uf015", "gui.gm4.guidebook.crafting.display.gm4.relocator": "\u4012", "gui.gm4.guidebook.crafting.display.gm4.tier_1_heart_canister": "\u4109\u4209\uf015", "gui.gm4.guidebook.crafting.display.gm4.tier_2_heart_canister": "\u4013", "gui.gm4.guidebook.crafting.display.gm4.piston_minecart": "\u4110\u4210\uf015", "gui.gm4.guidebook.crafting.display.gm4.landmine": "\u4014", "gui.gm4.guidebook.crafting.display.gm4.landmine.crafting_table": "\u4015", "gui.gm4.guidebook.crafting.display.gm4.landmine.invisible": "\u4016", "gui.gm4.guidebook.crafting.display.gm4.soft_defuser": "\u4017", "gui.gm4.guidebook.crafting.display.overlay.gm4.orb_of_ankou": "\uffff\ue018\u4111\u4211\uf015", "gui.gm4.guidebook.crafting.display.gm4.orb_of_ankou": "\u4112\u4212\uf015" } ================================================ FILE: gm4_guidebook/assets/translations.csv ================================================ key,en_us text.gm4.guidebook.discovered_page,Check your guidebook! text.gm4.guidebook.discovered,%1$s has discovered a guidebook page from %2$s text.gm4.guidebook.jump_to_section,Jump to Section text.gm4.guidebook.next,Go to the next module text.gm4.guidebook.open_wiki,Open the wiki page for this module text.gm4.guidebook.prev,Go to the previous module text.gm4.guidebook.refresh,Refresh section text.gm4.guidebook.return_to_toc,Return to the table of contents text.gm4.guidebook.title,Gamemode 4 Guidebook text.gm4.guidebook.undiscovered,Undiscovered text.gm4.guidebook.introduction,Introduction text.gm4.guidebook.letter,This is a world unlike others. It appears that certain things work...differently to say the least.\n\nThis book will document discoveries regarding these new mechanics. text.gm4.guidebook.refresh_toc,Refresh Table of Contents text.gm4.guidebook.refresh_findings,Refresh Findings ================================================ FILE: gm4_guidebook/beet.yaml ================================================ id: gm4_guidebook name: Guidebook version: 3.3.X data_pack: load: . resource_pack: load: . require: - bolt pipeline: - legacy_item_sheet - gm4.plugins.extend.module - gm4.plugins.include.lib_forceload meta: gm4: versioning: required: lib_forceload: 1.6.0 schedule_loops: - main - tick - lecterns/section/tracking model_data: - item: written_book reference: item/guidebook template: generated translation_linter_ignores: - text.gm4.guidebook.discovered_page - text.gm4.guidebook.discovered - text.gm4.guidebook.next - text.gm4.guidebook.open_wiki - text.gm4.guidebook.prev - text.gm4.guidebook.refresh - text.gm4.guidebook.return_to_toc - text.gm4.guidebook.undiscovered - text.gm4.guidebook.jump_to_section website: description: Adds a dynamic guidebook to discover the mechanics of Gamemode 4! This provides a wiki-like experience in-game! recommended: - gm4_resource_pack notes: - Experimental Module! Features may be added or removed without an easy upgrade path. You may encounter unintentional behaviour. wiki: https://wiki.gm4.co/wiki/Guidebook credits: Creators: - BPR - JP12 Icon Design: - Hozz ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/first_join.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$giveNewPlayers" }, "score": "gm4_guide_config" }, "range": 1 } ] } } }, "rewards": { "function": "gm4_guidebook:get_book/first_join" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/lectern_id.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:tick" } }, "rewards": { "function": "gm4_guidebook:lecterns/get_id" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/loot_village_chest.json ================================================ { "criteria": { "armorer": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_armorer" } }, "butcher": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_butcher" } }, "cartographer": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_cartographer" } }, "desert_house": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_desert_house" } }, "fisher": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_fisher" } }, "fletcher": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_fletcher" } }, "mason": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_mason" } }, "plains_house": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_plains_house" } }, "savanna_house": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_savanna_house" } }, "shepherd": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_shepherd" } }, "snowy_house": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_snowy_house" } }, "taiga_house": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_taiga_house" } }, "tannery": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_tannery" } }, "temple": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_temple" } }, "toolsmith": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_toolsmith" } }, "weaponsmith": { "trigger": "minecraft:player_generates_container_loot", "conditions": { "loot_table": "minecraft:chests/village/village_weaponsmith" } } }, "requirements": [ [ "armorer", "butcher", "cartographer", "desert_house", "fisher", "fletcher", "mason", "plains_house", "savanna_house", "shepherd", "snowy_house", "taiga_house", "tannery", "temple", "toolsmith", "weaponsmith" ] ], "rewards": { "function": "gm4_guidebook:get_book/chest/looted" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/open_guide_lectern.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lectern" ], "nbt": "{Book:{components:{'minecraft:custom_data':{gm4_guidebook:{lectern:1b}}}}}", "state": { "has_book": "true" } } } } ] } } }, "rewards": { "function": "gm4_guidebook:lecterns/section/find_lectern" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/open_updating_lectern.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lectern" ], "nbt": "{Book:{components:{'minecraft:custom_data':{gm4_guidebook:{lectern:0b}}}}}", "state": { "has_book": "true" } } } } ] } } }, "rewards": { "function": "gm4_guidebook:lecterns/replace/find_lectern" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/root.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/advancement/take_lectern_book.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:written_book" ], "count": 1, "predicates": { "minecraft:custom_data": "{gm4_guidebook:{lectern:1b}}" } } ] } } }, "rewards": { "function": "gm4_guidebook:lecterns/restore/search" } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/chest/insert_seed_random.mcfunction ================================================ # checks the LootTableSeed of the chest, and inserts for 45% of them # @s = player that just looted the chest # located at the chest # run from gm4_guidebook:get_book/chest/ray # modulo the loot table seed to 0-99 execute store result score $loot_table_seed gm4_guide run data get block ~ ~ ~ LootTableSeed 0.0000000001 scoreboard players operation $loot_table_seed gm4_guide %= #100 gm4_guide # for 0-44, insert the guidebook $execute if score $loot_table_seed gm4_guide matches ..44 run loot insert ~ ~ ~ loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/chest/looted.mcfunction ================================================ # inserts the guidebook into 45% of village chests # @s = player that just looted a village chest # located at @s # run from advancement gm4_guidebook:loot_village_chest # revoke advancement advancement revoke @s only gm4_guidebook:loot_village_chest # raycast to chest block scoreboard players set $ray gm4_guide 50 scoreboard players set $found gm4_guide 0 execute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:get_book/chest/ray with storage gm4_guidebook:register # clean up scoreboard players reset $ray gm4_guide scoreboard players reset $found gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/chest/ray.mcfunction ================================================ # raycasts to the chest # @s = marker ray used to detect the chest # located at @s # run from gm4_guidebook:get_book/looted # run from self execute if data block ~ ~ ~ LootTable run scoreboard players set $found gm4_guide 1 $execute if score $found gm4_guide matches 1 unless data block ~ ~ ~ LootTableSeed if predicate gm4_guidebook:chance_chest run loot insert ~ ~ ~ loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} execute if score $found gm4_guide matches 1 if data block ~ ~ ~ LootTableSeed run function gm4_guidebook:get_book/chest/insert_seed_random with storage gm4_guidebook:register scoreboard players remove $ray gm4_guide 1 execute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:get_book/chest/ray with storage gm4_guidebook:register ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/first_join.mcfunction ================================================ # gives all players the guidebook upon joining for the first time # @s = new player # located at @s # run from advancement gm4_guidebook:first_join function gm4_guidebook:get_book/player with storage gm4_guidebook:register ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/player.mcfunction ================================================ # gives all players the guidebook upon joining for the first time # @s = new player # located at @s # run from advancement gm4_guidebook:first_join $loot give @s loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/get_book/zombie_villager.mcfunction ================================================ # places the book in the zombie villager's hand # @s = random zombie villager that spawned naturally (not converted) # located at world spawn # run from gm4_guidebook:main # put book in mainhand $loot replace entity @s weapon.mainhand loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} # make zombie drop the book upon player kill data modify entity @s drop_chances.mainhand set value 1.0f ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/get_pages.mcfunction ================================================ # gets the module pages # @s = player that triggers gm4_guide # at @s # run from gm4_guidebook:hand/update # short circuit if the module isn't loaded $execute unless score $(load) load.status matches 1.. run return 0 # create player db if it doesn't exist $execute unless data storage gm4_guidebook:register player_pages."$(uuid)".$(name) run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp book # get pages for specific book $data modify storage gm4_guidebook:temp book.pages set from storage gm4_guidebook:register player_pages."$(uuid)".$(name).hand ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/next_section/loop.mcfunction ================================================ # clears all sections before the current section (inclusive) # @s = player who clicked in the guidebook # located at world spawn # run from gm4_guidebook:hand/next_section/search # run from self execute store result score $check gm4_guide_next run data get storage gm4_guidebook:temp triggers[0] data remove storage gm4_guidebook:temp triggers[0] execute unless score $check gm4_guide_next = @s gm4_guide_next if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:hand/next_section/loop ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/next_section/search.mcfunction ================================================ # finds next section to jump to # @s = player who clicked in the guidebook # located at world spawn # run from gm4_guidebook:tick # find section data modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order function gm4_guidebook:hand/next_section/loop # set guide score execute store result score @s gm4_guide run data get storage gm4_guidebook:temp triggers[0] execute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players operation @s gm4_guide = @s gm4_guide_next data remove storage gm4_guidebook:temp triggers ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/populate.mcfunction ================================================ # updates the player's book # @s = player that triggers gm4_guide # at @s # run from gm4_guidebook:hand/update $loot replace entity @s[predicate=gm4_guidebook:book_in_mainhand] weapon.mainhand loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3,"pages":$(pages)}}},{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:$(trigger)}}"},{"function":"minecraft:set_count","count":$(count)}]}]}]} $loot replace entity @s[predicate=gm4_guidebook:book_in_offhand] weapon.offhand loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:items/guidebook","functions":[{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3,"pages":$(pages)}}},{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:$(trigger)}}"},{"function":"minecraft:set_count","count":$(count)}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/prev_section/loop.mcfunction ================================================ # clears all sections after the current section (inclusive) # @s = player who clicked in the guidebook # located at world spawn # run from gm4_guidebook:hand/prev_section/search # run from self execute store result score $check gm4_guide_prev run data get storage gm4_guidebook:temp triggers[-1] data remove storage gm4_guidebook:temp triggers[-1] execute unless score $check gm4_guide_prev = @s gm4_guide_prev if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:hand/prev_section/loop ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/prev_section/search.mcfunction ================================================ # finds prev section to jump to # @s = player who clicked in the guidebook # located at world spawn # run from gm4_guidebook:tick # find section data modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order function gm4_guidebook:hand/prev_section/loop # set guide score execute store result score @s gm4_guide run data get storage gm4_guidebook:temp triggers[-1] execute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players set @s gm4_guide 1 data remove storage gm4_guidebook:temp triggers ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/hand/update.mcfunction ================================================ # replaces the player's hand with a new book # @s = player that triggers gm4_guide # at @s # run from gm4_guidebook:tick # save item count scoreboard players set $count gm4_guide 0 execute store result score $count gm4_guide run data get entity @s[predicate=gm4_guidebook:book_in_mainhand] SelectedItem.count execute if score $count gm4_guide matches 0 store result score $count gm4_guide run data get entity @s[predicate=gm4_guidebook:book_in_offhand] equipment.offhand.count # replace book ## short-circuit if it's the table of contents $execute if score @s gm4_guide matches 1 run loot replace entity @s[predicate=gm4_guidebook:book_in_mainhand] weapon.mainhand loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score @s gm4_guide matches 1 run loot replace entity @s[predicate=gm4_guidebook:book_in_offhand] weapon.offhand loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} execute if score @s gm4_guide matches 1 run return 1 ## get unlocked pages execute store result storage gm4_guidebook:temp book.trigger int 1 run scoreboard players get @s gm4_guide function gm4_guidebook:player_db/get_trigger_name with storage gm4_guidebook:temp book data modify storage gm4_guidebook:temp book.uuid set from entity @s UUID function gm4_guidebook:hand/get_pages with storage gm4_guidebook:temp book ## update item execute store result storage gm4_guidebook:temp book.count int 1 run scoreboard players get $count gm4_guide function gm4_guidebook:hand/populate with storage gm4_guidebook:temp book data remove storage gm4_guidebook:temp book ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/init.mcfunction ================================================ # set up scoreboards scoreboard objectives add gm4_guide trigger scoreboard objectives add gm4_guide_next trigger scoreboard objectives add gm4_guide_prev trigger scoreboard objectives add gm4_guide_id dummy scoreboard objectives add gm4_guide_pages dummy scoreboard objectives add gm4_guide_section dummy scoreboard objectives add gm4_guide_config dummy execute unless score $sendCommandFeedback gm4_guide_config = $sendCommandFeedback gm4_guide_config store result score $sendCommandFeedback gm4_guide_config run gamerule send_command_feedback execute unless score $forceCommandFeedback gm4_guide_config = $forceCommandFeedback gm4_guide_config run scoreboard players set $forceCommandFeedback gm4_guide_config 0 execute unless score $giveNewPlayers gm4_guide_config = $giveNewPlayers gm4_guide_config run scoreboard players set $giveNewPlayers gm4_guide_config 1 scoreboard players set #100 gm4_guide 100 scoreboard players set #intro gm4_guide_pages 1 scoreboard players reset $module_count gm4_guide schedule function gm4_guidebook:update_storage/setup_markers 1t scoreboard players set $ready gm4_guide 0 schedule function #gm4_guidebook:setup_storage 5t schedule function gm4_guidebook:update_storage/mark_ready 6t data modify storage gm4_guidebook:register front_matter set value [{raw:["",{"translate":"gui.gm4.guidebook.page.intro","fallback": "","color": "white","font": "gm4:guidebook"},{"translate":"text.gm4.guidebook.introduction","fallback":"Introduction","underlined":true},{"text":"\n\n"},{"translate":"text.gm4.guidebook.letter","fallback":"This is a world unlike others. It appears that certain things work...differently to say the least.\n\nThis book will document discoveries regarding these new mechanics."},{"text":"\n\n> ","color":"#4AA0C7"},{"translate":"text.gm4.guidebook.refresh_findings","fallback":"Refresh Findings","color":"#4AA0C7","hover_event":{"action":"show_text","value":[{"translate":"text.gm4.guidebook.refresh_toc","fallback":"Refresh Table of Contents","color":"gold"}]},"click_event":{"action":"run_command","command":"/trigger gm4_guide set 1"}}]}] # start up module execute unless score guidebook gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Guidebook"} execute unless score guidebook gm4_earliest_version < guidebook gm4_modules run scoreboard players operation guidebook gm4_earliest_version = guidebook gm4_modules scoreboard players set guidebook gm4_modules 1 schedule function gm4_guidebook:main 2t schedule function gm4_guidebook:tick 1t #$moduleUpdateList ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/get_id.mcfunction ================================================ # gives all players an id for lectern matching # @s = new player # located at @s # run from advancement gm4_guidebook:lectern_id execute store result score @s gm4_guide_id run scoreboard players add #max gm4_guide_id 1 ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/get_pages.mcfunction ================================================ # gets the module pages # @s = player that last opened the lectern # at the lectern # run from gm4_guidebook:lecterns/update # short circuit if the module isn't loaded $execute unless score $(load) load.status matches 1.. run return 0 # create player db if it doesn't exist $execute unless data storage gm4_guidebook:register player_pages."$(uuid)".$(name) run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp book # get pages for specific book $data modify storage gm4_guidebook:temp book.pages set from storage gm4_guidebook:register player_pages."$(uuid)".$(name).lectern ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/populate.mcfunction ================================================ # sets the module pages # @s = player that last opened the lectern # at the lectern # run from gm4_guidebook:lecterns/update $data modify block ~ ~ ~ Book.components merge value {"minecraft:written_book_content":{"pages":$(pages),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3},"minecraft:custom_data":{gm4_guidebook:{lectern:1b,trigger:$(trigger)}}} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/process.mcfunction ================================================ # process lecterns # @s = guidebook lectern marker # located at @s # run from gm4_guidebook:main execute unless block ~ ~ ~ lectern run kill @s execute unless entity @a[gamemode=!spectator,distance=..6,limit=1] run tag @s[tag=gm4_guide_tracking] remove gm4_guide_tracking execute if block ~ ~ ~ lectern[has_book=false] run tag @s[tag=gm4_guide_tracking] remove gm4_guide_tracking ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/find_lectern.mcfunction ================================================ # finds the lectern # @s = player that opened a lectern without a book # located at @s # run from advancement gm4_guidebook:open_updating_lectern advancement revoke @s only gm4_guidebook:open_updating_lectern # raycast to lectern scoreboard players set $ray gm4_guide 50 scoreboard players set $found gm4_guide 0 execute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:lecterns/replace/ray # clean up scoreboard players reset $ray gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/ray.mcfunction ================================================ # raycasts to the lectern # @s = player who opened the lectern # located anchored eyes ^ ^ ^0.X # run from gm4_guidebook:lecterns/replace/find_lectern # run from self execute if block ~ ~ ~ lectern[has_book=true]{Book:{components:{"minecraft:custom_data":{gm4_guidebook:{lectern:0b}}}}} align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_guidebook:lecterns/replace/update scoreboard players remove $ray gm4_guide 1 execute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:lecterns/replace/ray ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/replace/update.mcfunction ================================================ # marks and updates the lectern # @s = player who opened the lectern # located at center of the lectern # run from gm4_guidebook:lecterns/replace/ray scoreboard players set $found gm4_guide 1 # summon marker execute unless entity @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] run summon marker ~ ~ ~ {CustomName:"gm4_guide_lectern",Tags:["gm4_guide_lectern"]} # replace book with lectern book execute store result score $trigger gm4_guide run data get block ~ ~ ~ Book.components."minecraft:custom_data".gm4_guidebook.trigger function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # store page count (minus 1) execute store result score @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages 1 # mark toc tag @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] remove gm4_guide_toc execute if score $trigger gm4_guide matches 1 run tag @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] add gm4_guide_toc # start tracking function gm4_guidebook:lecterns/section/track # update page number execute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1 execute unless score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 5 # clean up scoreboard players reset $trigger gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/hotbar.mcfunction ================================================ # restores the guidebook to normal form # @s = player who has moved a lectern book into their inventory # located at @s # run from gm4_guidebook:lecterns/restore/search $execute if score $slot gm4_guide matches 0 run loot replace entity @s hotbar.0 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 1 run loot replace entity @s hotbar.1 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 2 run loot replace entity @s hotbar.2 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 3 run loot replace entity @s hotbar.3 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 4 run loot replace entity @s hotbar.4 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 5 run loot replace entity @s hotbar.5 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 6 run loot replace entity @s hotbar.6 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 7 run loot replace entity @s hotbar.7 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 8 run loot replace entity @s hotbar.8 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_1.mcfunction ================================================ # restores the guidebook to normal form # @s = player who has moved a lectern book into their inventory # located at @s # run from gm4_guidebook:lecterns/restore/search $execute if score $slot gm4_guide matches 9 run loot replace entity @s inventory.0 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 10 run loot replace entity @s inventory.1 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 11 run loot replace entity @s inventory.2 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 12 run loot replace entity @s inventory.3 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 13 run loot replace entity @s inventory.4 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 14 run loot replace entity @s inventory.5 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 15 run loot replace entity @s inventory.6 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 16 run loot replace entity @s inventory.7 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 17 run loot replace entity @s inventory.8 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_2.mcfunction ================================================ # restores the guidebook to normal form # @s = player who has moved a lectern book into their inventory # located at @s # run from gm4_guidebook:lecterns/restore/search $execute if score $slot gm4_guide matches 18 run loot replace entity @s inventory.9 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 19 run loot replace entity @s inventory.10 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 20 run loot replace entity @s inventory.11 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 21 run loot replace entity @s inventory.12 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 22 run loot replace entity @s inventory.13 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 23 run loot replace entity @s inventory.14 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 24 run loot replace entity @s inventory.15 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 25 run loot replace entity @s inventory.16 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 26 run loot replace entity @s inventory.17 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/inv_3.mcfunction ================================================ # restores the guidebook to normal form # @s = player who has moved a lectern book into their inventory # located at @s # run from gm4_guidebook:lecterns/restore/search $execute if score $slot gm4_guide matches 27 run loot replace entity @s inventory.18 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 28 run loot replace entity @s inventory.19 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 29 run loot replace entity @s inventory.20 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 30 run loot replace entity @s inventory.21 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 31 run loot replace entity @s inventory.22 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 32 run loot replace entity @s inventory.23 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 33 run loot replace entity @s inventory.24 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 34 run loot replace entity @s inventory.25 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} $execute if score $slot gm4_guide matches 35 run loot replace entity @s inventory.26 1 loot {"pools":[{"rolls":1,"entries":[{"type":"minecraft:loot_table","value":"gm4_guidebook:technical/guidebook_with_count","functions":[{"function":"minecraft:set_custom_data","tag":"{gm4_guidebook:{lectern:0b,trigger:1}}"},{"function":"minecraft:set_components","components":{"minecraft:written_book_content":{"pages":$(front_matter),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3}}}]}]}]} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/restore/search.mcfunction ================================================ # restores the guidebook to normal form # @s = player who has moved a lectern book into their inventory # located at @s # run from advancement "gm4_guidebook:take_lectern_book" # run from self advancement revoke @s only gm4_guidebook:take_lectern_book # TODO 1.21.5: this might not work for the offhand # get item data scoreboard players set $slot gm4_guide -1 data modify storage gm4_guidebook:temp Inventory set from entity @s Inventory execute store success score $item gm4_guide run data modify storage gm4_guidebook:temp Item set from storage gm4_guidebook:temp Inventory[{components:{"minecraft:custom_data":{gm4_guidebook:{lectern:1b}}}}] execute if score $item gm4_guide matches 1.. store result score $slot gm4_guide run data get storage gm4_guidebook:temp Item.Slot execute unless score $slot gm4_guide matches -1 store result score $count gm4_guide run data get storage gm4_guidebook:temp Item.count # replace item execute if score $slot gm4_guide matches 0..8 run function gm4_guidebook:lecterns/restore/hotbar with storage gm4_guidebook:register execute if score $slot gm4_guide matches 9..17 run function gm4_guidebook:lecterns/restore/inv_1 with storage gm4_guidebook:register execute if score $slot gm4_guide matches 18..26 run function gm4_guidebook:lecterns/restore/inv_2 with storage gm4_guidebook:register execute if score $slot gm4_guide matches 27..35 run function gm4_guidebook:lecterns/restore/inv_3 with storage gm4_guidebook:register # clean up data remove storage gm4_guidebook:temp Item data remove storage gm4_guidebook:temp Inventory # loop for all lectern guidebooks execute unless score $slot gm4_guide matches ..-1 run function gm4_guidebook:lecterns/restore/search ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page/normal.mcfunction ================================================ # check if page is one of the section changes # @s = guide lectern marker # located at @s (center of the lectern) # run from gm4_guidebook:lecterns/section/check_page # if 0 or last page, jump to next section execute if score $page gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/update/next_section/find_player execute if score $page gm4_guide_pages = @s gm4_guide_pages run function gm4_guidebook:lecterns/section/update/next_section/find_player # if 3 or 4, jump to prev section execute if score $page gm4_guide_pages matches 3..4 run function gm4_guidebook:lecterns/section/update/prev_section/find_player # if 2, refresh execute if score $page gm4_guide_pages matches 2 run function gm4_guidebook:lecterns/section/update/refresh/find_player # if 1, jump to TOC execute if score $page gm4_guide_pages matches 1 run function gm4_guidebook:lecterns/section/update/toc/jump with storage gm4_guidebook:register ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page/toc.mcfunction ================================================ # check if page is one of the section changes # @s = guide lectern marker # located at @s (center of the lectern) # run from gm4_guidebook:lecterns/section/check_page scoreboard players set $toc gm4_guide_pages 1 # if 0, jump to TOC (refresh) execute if score $page gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/update/toc/jump # else, figure out what section to jump to # execute if score $page gm4_guide_pages matches 0..1 run return execute if score $page gm4_guide_pages > $front_matter gm4_guide_pages run function gm4_guidebook:lecterns/section/toc/find_player ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/check_page.mcfunction ================================================ # check if page is one of the section changes # @s = guide lectern marker # located at @s (center of the lectern) # run from gm4_guidebook:lecterns/section/tracking scoreboard players operation $original_page gm4_guide_pages = $page gm4_guide_pages execute store result score $page gm4_guide_pages run data get block ~ ~ ~ Page # different behavior based on TOC or normal scoreboard players set $toc gm4_guide_pages 0 execute if entity @s[tag=gm4_guide_toc] run function gm4_guidebook:lecterns/section/check_page/toc execute if score $toc gm4_guide_pages matches 0 run function gm4_guidebook:lecterns/section/check_page/normal ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/find_lectern.mcfunction ================================================ # finds the lectern # @s = player that opened a lectern with a lectern guidebook # located at @s # run from advancement gm4_guidebook:open_guide_lectern advancement revoke @s only gm4_guidebook:open_guide_lectern # raycast to lectern scoreboard players set $ray gm4_guide 50 scoreboard players set $found gm4_guide 0 execute anchored eyes positioned ^ ^ ^ run function gm4_guidebook:lecterns/section/ray # clean up scoreboard players reset $ray gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/ray.mcfunction ================================================ # raycasts to the lectern # @s = player who opened the lectern # located anchored eyes ^ ^ ^0.X # run from gm4_guidebook:lecterns/section/find_lectern execute if block ~ ~ ~ lectern[has_book=true]{Book:{components:{"minecraft:custom_data":{gm4_guidebook:{lectern:1b}}}}} align xyz positioned ~0.5 ~0.5 ~0.5 run function gm4_guidebook:lecterns/section/track scoreboard players remove $ray gm4_guide 1 execute if score $found gm4_guide matches 0 if score $ray gm4_guide matches 1.. positioned ^ ^ ^0.1 run function gm4_guidebook:lecterns/section/ray ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/find_player.mcfunction ================================================ # finds last player to open the lectern # @s = guide lectern marker # located at the center of the lectern # run from gm4_guidebook:lecterns/section/check_page/toc # execute as player, at block scoreboard players operation $current gm4_guide_id = @s gm4_guide_id execute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/toc/jump # mark toc tag @s remove gm4_guide_toc execute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc # clean up scoreboard players reset $index gm4_guide scoreboard players reset $check gm4_guide scoreboard players reset $trigger gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/find_section.mcfunction ================================================ # clears all sections before the desired section (exclusive) # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/next_section/jump # run from self data remove storage gm4_guidebook:temp triggers[0] scoreboard players add $check gm4_guide 1 execute unless score $check gm4_guide >= $index gm4_guide if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/toc/find_section ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/toc/jump.mcfunction ================================================ # finds section to jump to # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/next_section/find_player # and from gm4_guidebook:lecterns/section/check_page/normal # get the index execute store result score $index gm4_guide run data get block ~ ~ ~ Page scoreboard players operation $index gm4_guide -= $front_matter gm4_guide_pages scoreboard players remove $index gm4_guide 1 # find section scoreboard players set $check gm4_guide 0 data modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order execute if score $index gm4_guide matches 1.. run function gm4_guidebook:lecterns/section/toc/find_section # set guide score execute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[0] ## special case: if the storage is somehow empty (shouldn't happen) jump to TOC execute unless data storage gm4_guidebook:temp triggers[0] run scoreboard players set $trigger gm4_guide 1 data remove storage gm4_guidebook:temp triggers # jump to section function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # store page count (minus 1) execute store result score @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @e[type=marker,tag=gm4_guide_lectern,distance=..0.5,limit=1] gm4_guide_pages 1 # update page number execute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1 execute unless score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 5 ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/track.mcfunction ================================================ # starts tracking changes # @s = player who opened the lectern # located at center of lectern # run from gm4_guidebook:lecterns/section/ray # run from gm4_guidebook:lecterns/replace/update # update id score scoreboard players operation @e[type=marker,tag=gm4_guide_tracking,limit=1,distance=..0.5] gm4_guide_id = @s gm4_guide_id # start tracking page changes tag @e[type=marker,tag=gm4_guide_lectern,limit=1,distance=..0.5] add gm4_guide_tracking schedule function gm4_guidebook:lecterns/section/tracking 1t ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/tracking.mcfunction ================================================ # check for section changes # @s = none # located at world spawn # run from gm4_guidebook:lecterns/section/track execute as @e[type=marker,tag=gm4_guide_tracking] at @s if block ~ ~ ~ lectern[has_book=true] run function gm4_guidebook:lecterns/section/check_page execute if entity @e[type=marker,tag=gm4_guide_tracking,limit=1] run schedule function gm4_guidebook:lecterns/section/tracking 1t ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/find_player.mcfunction ================================================ # finds last player to open the lectern # @s = guide lectern marker # located at the center of the lectern # run from gm4_guidebook:lecterns/section/check_page/normal # execute as player, at block scoreboard players operation $current gm4_guide_id = @s gm4_guide_id execute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/next_section/jump # mark toc tag @s remove gm4_guide_toc execute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc # store page count (minus 1) execute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @s gm4_guide_pages 1 # clean up scoreboard players reset $trigger gm4_guide scoreboard players reset $trigger gm4_guide_next ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/find_section.mcfunction ================================================ # clears all sections before the current section (inclusive) # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/next_section/jump # run from self execute store result score $check gm4_guide_next run data get storage gm4_guidebook:temp triggers[0] data remove storage gm4_guidebook:temp triggers[0] execute unless score $check gm4_guide_next = $trigger gm4_guide_next if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/update/next_section/find_section ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/next_section/jump.mcfunction ================================================ # finds next section to jump to # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/next_section/find_player # get this trigger execute store result score $trigger gm4_guide_next run data get block ~ ~ ~ Book.components."minecraft:custom_data".gm4_guidebook.trigger # find section data modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order execute unless score $trigger gm4_guide_next matches 1 run function gm4_guidebook:lecterns/section/update/next_section/find_section ## ^ special case: if it's TOC, get the first trigger # set guide score execute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[0] ## special case: if this is the last section, just refresh the section execute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players operation $trigger gm4_guide = $trigger gm4_guide_next data remove storage gm4_guidebook:temp triggers # jump to section function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # update page number execute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1 execute unless score $trigger gm4_guide matches 1 unless score $trigger gm4_guide = $trigger gm4_guide_next run data modify block ~ ~ ~ Page set value 5 execute unless score $trigger gm4_guide matches 1 if score $trigger gm4_guide = $trigger gm4_guide_next store result score $pages gm4_guide run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages execute unless score $trigger gm4_guide matches 1 if score $trigger gm4_guide = $trigger gm4_guide_next store result block ~ ~ ~ Page int 1 run scoreboard players remove $pages gm4_guide 2 ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/find_player.mcfunction ================================================ # finds last player to open the lectern # @s = guide lectern marker # located at the center of the lectern # run from gm4_guidebook:lecterns/section/check_page/normal # execute as player, at block scoreboard players operation $current gm4_guide_id = @s gm4_guide_id execute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/prev_section/jump # mark toc tag @s remove gm4_guide_toc execute if score $trigger gm4_guide matches 1 run tag @s add gm4_guide_toc # store page count (minus 1) and update page number execute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @s gm4_guide_pages 1 # clean up scoreboard players reset $trigger gm4_guide scoreboard players reset $trigger gm4_guide_prev ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/find_section.mcfunction ================================================ # clears all sections before the current section (inclusive) # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/prev_section/jump # run from self execute store result score $check gm4_guide_prev run data get storage gm4_guidebook:temp triggers[-1] data remove storage gm4_guidebook:temp triggers[-1] execute unless score $check gm4_guide_prev = $trigger gm4_guide_prev if data storage gm4_guidebook:temp triggers[-1] run function gm4_guidebook:lecterns/section/update/prev_section/find_section ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/prev_section/jump.mcfunction ================================================ # finds previous section to jump to # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/prev_section/find_player # get this trigger execute store result score $trigger gm4_guide_prev run data get block ~ ~ ~ Book.components."minecraft:custom_data".gm4_guidebook.trigger # find section data modify storage gm4_guidebook:temp triggers set from storage gm4_guidebook:register trigger_order function gm4_guidebook:lecterns/section/update/prev_section/find_section # set guide score execute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp triggers[-1] ## special case: if there's nothing before this, jump to TOC execute unless data storage gm4_guidebook:temp triggers[-1] run scoreboard players set $trigger gm4_guide 1 data remove storage gm4_guidebook:temp triggers # jump to section function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # update page number execute if score $trigger gm4_guide matches 1 run data modify block ~ ~ ~ Page set value 1 execute unless score $trigger gm4_guide matches 1 unless score $page gm4_guide_pages matches 4 run data modify block ~ ~ ~ Page set value 5 execute unless score $trigger gm4_guide matches 1 if score $page gm4_guide_pages matches 4 store result score $pages gm4_guide run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages execute unless score $trigger gm4_guide matches 1 if score $page gm4_guide_pages matches 4 store result block ~ ~ ~ Page int 1 run scoreboard players remove $pages gm4_guide 2 ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/refresh/find_player.mcfunction ================================================ # finds last player to open the lectern # @s = guide lectern marker # located at the center of the lectern # run from gm4_guidebook:lecterns/section/check_page/normal # execute as player, at block scoreboard players operation $current gm4_guide_id = @s gm4_guide_id execute as @a[distance=..6] if score @s gm4_guide_id = $current gm4_guide_id run function gm4_guidebook:lecterns/section/update/refresh/jump # store page count (minus 1) execute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @s gm4_guide_pages 1 # clean up scoreboard players reset $trigger gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/refresh/jump.mcfunction ================================================ # updates the book # @s = player who last opened the lectern # located at the center of the lectern # run from gm4_guidebook:lecterns/section/update/refresh/find_player # get guide score execute store result score $trigger gm4_guide run data get block ~ ~ ~ Book.components."minecraft:custom_data".gm4_guidebook.trigger # jump to section function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # update page number execute store result block ~ ~ ~ Page int 1 run scoreboard players get $original_page gm4_guide_pages ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/section/update/toc/jump.mcfunction ================================================ # jumps to toc # @s = guide lectern marker # located at the center of the lectern # run from gm4_guidebook:lecterns/section/check_page/normal # jump to section scoreboard players set $trigger gm4_guide 1 function gm4_guidebook:lecterns/update with storage gm4_guidebook:register # store page count (minus 1) execute store result score @s gm4_guide_pages run data get block ~ ~ ~ Book.components."minecraft:written_book_content".pages scoreboard players remove @s gm4_guide_pages 1 # update page number data modify block ~ ~ ~ Page set value 1 # mark toc tag @s add gm4_guide_toc ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/lecterns/update.mcfunction ================================================ # replaces the lectern with a new book # @s = player that last opened the lectern # at the lectern # run from gm4_guidebook:lecterns/replace/update # run from gm4_guidebook:lecterns/section/update/*/jump # run from gm4_guidebook:lecterns/section/toc/jump # replace book ## short-circuit if it's the table of contents $execute if score $trigger gm4_guide matches 1 run return run data modify block ~ ~ ~ Book.components merge value {"minecraft:written_book_content":{"pages":$(lectern_toc),"title":"Gamemode 4 Guidebook","author":"Unknown","generation":3},"minecraft:custom_data":{gm4_guidebook:{lectern:1b,trigger:1}}} ## get unlocked pages execute store result storage gm4_guidebook:temp book.trigger int 1 run scoreboard players get $trigger gm4_guide function gm4_guidebook:player_db/get_trigger_name with storage gm4_guidebook:temp book data modify storage gm4_guidebook:temp book.uuid set from entity @s UUID function gm4_guidebook:lecterns/get_pages with storage gm4_guidebook:temp book # update book function gm4_guidebook:lecterns/populate with storage gm4_guidebook:temp book data remove storage gm4_guidebook:temp book ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/main.mcfunction ================================================ schedule function gm4_guidebook:main 16t # give random zombie villagers the guidebook execute as @e[type=zombie_villager,tag=!gm4_guidebook_checked,predicate=gm4_guidebook:chance_zombie_villager,nbt={PersistenceRequired:0b}] unless items entity @s weapon.* * unless data entity @s Gossips run function gm4_guidebook:get_book/zombie_villager with storage gm4_guidebook:register tag @e[type=zombie_villager,tag=!gm4_guidebook_checked] add gm4_guidebook_checked # process lectern markers execute as @e[type=marker,tag=gm4_guide_lectern] at @s run function gm4_guidebook:lecterns/process ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/player_db/get_trigger_name.mcfunction ================================================ # gets the module name based on the trigger number # @s = player that triggers gm4_guide # at @s # run from gm4_guidebook:hand/update # and from gm4_guidebook:lectern/update $data modify storage gm4_guidebook:temp book.name set from storage gm4_guidebook:register trigger_map.$(trigger).name $data modify storage gm4_guidebook:temp book.load set from storage gm4_guidebook:register trigger_map.$(trigger).load ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/player_db/setup.mcfunction ================================================ # create a player db entry for this player and module # @s = player that is being initialized # at @s # run from gm4_guidebook:hand/get_pages # and from gm4_guidebook:player_db/update # create an entry for this player and module $data modify storage gm4_guidebook:register player_pages."$(uuid)".$(name).hand set from storage gm4_guidebook:register pages.$(name).hand.initial $data modify storage gm4_guidebook:register player_pages."$(uuid)".$(name).lectern set from storage gm4_guidebook:register pages.$(name).lectern.initial # find any previously unlocked pages $function gm4_guidebook:$(name)/init_player_db ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/player_db/update.mcfunction ================================================ # create a player db entry for this player and module # @s = player that is being updated # at @s # and from gm4_guidebook:/rewards/unlock/* # create if necessary (also populates unlocked pages) $execute unless data storage gm4_guidebook:register player_pages."$(uuid)".$(name) run return run function gm4_guidebook:player_db/setup with storage gm4_guidebook:temp unlocking # populate unlocked page $data modify storage gm4_guidebook:register player_pages."$(uuid)".$(name).hand[$(target_page)] set from storage gm4_guidebook:register pages.$(name).hand.unlockable.$(source_page) $data modify storage gm4_guidebook:register player_pages."$(uuid)".$(name).lectern[$(lectern_target_page)] set from storage gm4_guidebook:register pages.$(name).lectern.unlockable.$(source_page) ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/tick.mcfunction ================================================ schedule function gm4_guidebook:tick 1t # if a player is holding the guidebook, turn off minecraft:send_command_feedback execute if score $sendCommandFeedback gm4_guide_config matches 1 run gamerule send_command_feedback true execute if score $forceCommandFeedback gm4_guide_config matches 0 if entity @a[predicate=gm4_guidebook:holding_book,limit=1] run gamerule send_command_feedback false # jump to prev section execute as @a[scores={gm4_guide_prev=1..}] run function gm4_guidebook:hand/prev_section/search # jump to next section execute as @a[scores={gm4_guide_next=1..}] run function gm4_guidebook:hand/next_section/search # jump to section execute as @a[scores={gm4_guide=1..},predicate=gm4_guidebook:holding_book] run function gm4_guidebook:hand/update with storage gm4_guidebook:register # reset triggers scoreboard players reset @a gm4_guide_prev scoreboard players reset @a gm4_guide_next scoreboard players reset @a gm4_guide scoreboard players enable @a gm4_guide_prev scoreboard players enable @a gm4_guide_next scoreboard players enable @a gm4_guide ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/add_base.mcfunction ================================================ # adds the base module to the table of contents array, with its expansion packs following # @s = none # located at world spawn # run from gm4_guidebook:update_storage/build_line # add expansions to go directly under this data modify storage gm4_guidebook:temp check_expansions set from storage gm4_guidebook:temp expansions scoreboard players operation $expansions gm4_guide = $expansion_count gm4_guide function gm4_guidebook:update_storage/find_expansions # clean up data remove storage gm4_guidebook:temp check_expansions ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/add_to_toc.mcfunction ================================================ $data modify storage gm4_guidebook:register front_matter append value {raw:$(page_content)} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/build_line.mcfunction ================================================ # builds each line of each page of the table of contents # @s = none # located at world spawn # run from gm4_guidebook:update_storage/build_page # run from self # add expansions to module list data modify storage gm4_guidebook:temp module set from storage gm4_guidebook:temp modules[-1] execute if data storage gm4_guidebook:temp module{type:"base"} run function gm4_guidebook:update_storage/add_base # add line execute store result score $trigger gm4_guide run data get storage gm4_guidebook:temp module.trigger execute store result score $lines gm4_guide run data get storage gm4_guidebook:temp module.line_count function #gm4_guidebook:add_toc_line scoreboard players operation $line_count gm4_guide += $lines gm4_guide # store module in permanent storage data modify storage gm4_guidebook:register trigger_order append from storage gm4_guidebook:temp module.trigger # store for lectern toc data modify storage gm4_guidebook:temp lectern_page append from storage gm4_guidebook:temp module.toc_line # loop until this page is full or there's no more modules data remove storage gm4_guidebook:temp modules[-1] data remove storage gm4_guidebook:temp module scoreboard players remove $module_count gm4_guide 1 execute unless score $line_count gm4_guide matches 13.. if score $module_count gm4_guide matches 1.. run function gm4_guidebook:update_storage/build_line ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/build_page.mcfunction ================================================ # builds each page of the table of contents # @s = none # located at world spawn # run from gm4_guidebook:update_storage/build_toc # run from self # build lines scoreboard players set $line_count gm4_guide 2 data merge storage gm4_guidebook:temp {page:[["",{"translate":"gui.gm4.guidebook.page.toc","fallback":"","color":"white","font":"gm4:guidebook"}]],lectern_page:[]} function gm4_guidebook:update_storage/build_line execute if score $line_count gm4_guide matches 2 run return 1 # add table of contents page data modify block 29999998 1 7133 front_text.messages[0] set value {"nbt":"page[]","storage":"gm4_guidebook:temp","interpret":true,"separator":{"text":"\n","color":"white"}} data modify storage gm4_guidebook:temp page_content set from block 29999998 1 7133 front_text.messages[0] function gm4_guidebook:update_storage/add_to_toc with storage gm4_guidebook:temp # store (unfinished) lectern toc page data modify storage gm4_guidebook:temp lectern_pages append from storage gm4_guidebook:temp lectern_page scoreboard players add $front_matter gm4_guide_pages 1 # loop for all modules execute if score $module_count gm4_guide matches 1.. run function gm4_guidebook:update_storage/build_page ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/build_toc.mcfunction ================================================ # builds the stored table of contents # @s = none # located at world spawn # run from gm4_guidebook:update_storage/setup_markers # get all module data data merge storage gm4_guidebook:temp {modules:[],expansions:[]} execute positioned ~ 0 ~ as @e[type=marker,tag=gm4_guide,sort=furthest] run data modify storage gm4_guidebook:temp modules append from entity @s data execute store result score $module_count gm4_guide run data get storage gm4_guidebook:temp modules # separate expansions into their own list data modify storage gm4_guidebook:temp expansions append from storage gm4_guidebook:temp modules[{type:"expansion"}] data remove storage gm4_guidebook:temp modules[{type:"expansion"}] execute store result score $expansion_count gm4_guide run data get storage gm4_guidebook:temp expansions # build pages scoreboard players operation $front_matter gm4_guide_pages = #intro gm4_guide_pages data modify storage gm4_guidebook:temp prev_trigger_order set from storage gm4_guidebook:register trigger_order data merge storage gm4_guidebook:register {trigger_order:[],lectern_toc:[["",{"translate":"gui.gm4.guidebook.page.toc","fallback":"","color":"white","font":"gm4:guidebook"}],["",{"translate":"gui.gm4.guidebook.page.intro","fallback": "","color": "white","font": "gm4:guidebook"},{"translate":"text.gm4.guidebook.introduction","fallback":"Introduction","underlined":true},{"text":"\n\n"},{"translate":"text.gm4.guidebook.letter","fallback":"This is a world unlike others. It appears that certain things work...differently to say the least.\n\nThis book will document discoveries regarding these new mechanics."},{"text":"\n\n> ","color":"#4AA0C7"},{"translate":"text.gm4.guidebook.refresh_findings","fallback":"Refresh Findings","color":"#4AA0C7","hover_event":{"action":"show_text","value":[{"translate":"text.gm4.guidebook.refresh_toc","fallback":"Refresh Table of Contents","color":"gold"}]},"click_event":{"action":"change_page","page":1}}]]} data merge storage gm4_guidebook:temp {lectern_pages:[],toc_back:[]} function gm4_guidebook:update_storage/build_page # build lectern toc pages scoreboard players operation $click gm4_guide_pages = $front_matter gm4_guide_pages execute store result storage gm4_guidebook:temp click int 1 run scoreboard players add $click gm4_guide_pages 2 function gm4_guidebook:update_storage/lectern/build_page data modify storage gm4_guidebook:register lectern_toc append from storage gm4_guidebook:temp toc_back[] # check if modules changed scoreboard players set $updated gm4_guide 0 execute store success score $updated gm4_guide run data modify storage gm4_guidebook:temp prev_trigger_order set from storage gm4_guidebook:register trigger_order execute if score $updated gm4_guide matches 1 run data remove storage gm4_guidebook:register player_pages # clean up data remove storage gm4_guidebook:temp modules data remove storage gm4_guidebook:temp expansions data remove storage gm4_guidebook:temp toc_back data remove storage gm4_guidebook:temp lectern_pages data remove storage gm4_guidebook:temp prev_trigger_order data remove storage gm4_guidebook:temp click scoreboard players reset $trigger gm4_guide kill @e[type=marker,tag=gm4_guide] ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/find_expansions.mcfunction ================================================ # finds expansions matching the base module # @s = none # located at world spawn # run from gm4_guidebook:update_storage/add_base # run from self # check if the expansion matches the base data modify storage gm4_guidebook:temp expansion set from storage gm4_guidebook:temp check_expansions[0] scoreboard players set $unmatching gm4_guide 1 execute store success score $unmatching gm4_guide run data modify storage gm4_guidebook:temp expansion.base set from storage gm4_guidebook:temp module.id # insert expansion into the modules list execute unless score $unmatching gm4_guide matches 1 run data modify storage gm4_guidebook:temp modules insert -2 from storage gm4_guidebook:temp expansion # loop for all expansions data remove storage gm4_guidebook:temp check_expansions[0] data remove storage gm4_guidebook:temp expansion scoreboard players remove $expansions gm4_guide 1 execute if score $expansions gm4_guide matches 1.. run function gm4_guidebook:update_storage/find_expansions ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/build_line.mcfunction ================================================ # builds each line of each page of the lectern table of contents # @s = none # located at world spawn # run from gm4_guidebook:update_storage/lectern/build_page # run from self # find proper click event function gm4_guidebook:update_storage/lectern/click_event with storage gm4_guidebook:temp data modify storage gm4_guidebook:temp page append from block 29999998 1 7133 front_text.messages[0] # add blank page for each module data modify storage gm4_guidebook:temp toc_back append value ["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}] # check the next module execute store result storage gm4_guidebook:temp click int 1 run scoreboard players add $click gm4_guide_pages 1 data remove storage gm4_guidebook:temp lectern_pages[0][0] execute if data storage gm4_guidebook:temp lectern_pages[0][-1] run function gm4_guidebook:update_storage/lectern/build_line ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/build_page.mcfunction ================================================ # builds each page of the lectern table of contents # @s = none # located at world spawn # run from gm4_guidebook:update_storage/build_toc # run from self # build module lines data merge storage gm4_guidebook:temp {page:[["",{"translate":"gui.gm4.guidebook.page.toc","fallback":"","color":"white","font":"gm4:guidebook"}]]} function gm4_guidebook:update_storage/lectern/build_line # add table of contents page data modify block 29999998 1 7133 front_text.messages[0] set value {"nbt": "page[]","storage": "gm4_guidebook:temp","interpret": True,"separator":"\n"} data modify storage gm4_guidebook:register lectern_toc append from block 29999998 1 7133 front_text.messages[0] # loop for all modules data remove storage gm4_guidebook:temp lectern_pages[0] execute if data storage gm4_guidebook:temp lectern_pages[-1] run function gm4_guidebook:update_storage/lectern/build_page ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/lectern/click_event.mcfunction ================================================ # build the line with the proper click event # @s = none # located at world spawn # run from gm4_guidebook:update_storage/lectern/build_line $data modify block 29999998 1 7133 front_text.messages[0] set value {"nbt":"lectern_pages[0][0]","storage":"gm4_guidebook:temp","color":"#4AA0C7","click_event":{"action":"change_page","page":$(click)},"hover_event":{"action":"show_text","value":[{"translate":"text.gm4.guidebook.jump_to_section","fallback":"Jump to Section","color":"gold"}]}} ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/mark_ready.mcfunction ================================================ # marks the module ready for advancements to be granted # @s = none # located at world spawn # run from gm4_guidebook:init scoreboard players set $ready gm4_guide 1 ================================================ FILE: gm4_guidebook/data/gm4_guidebook/function/update_storage/setup_markers.mcfunction ================================================ # prepares the guide markers # @s = none # located at world spawn # run from gm4_guidebook:init # summon markers kill @e[type=marker,tag=gm4_guide] function #gm4_guidebook:summon_marker # sort all tags schedule function gm4_guidebook:update_storage/build_toc 1t ================================================ FILE: gm4_guidebook/data/gm4_guidebook/loot_table/items/guidebook.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:written_book", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_guidebook:item/guidebook"]}, "minecraft:written_book_content": { "pages": [ ["",{"translate":"gui.gm4.guidebook.page.intro","fallback": "","color": "white","font": "gm4:guidebook"},{"translate":"text.gm4.guidebook.introduction","fallback":"Introduction","underlined":true},{"text":"\n\n"},{"translate":"text.gm4.guidebook.letter","fallback":"This is a world unlike others. It appears that certain things work...differently to say the least.\n\nThis book will document discoveries regarding these new mechanics."},{"text":"\n\n> ","color":"#4AA0C7"},{"translate":"text.gm4.guidebook.refresh_findings","fallback":"Refresh Findings","color":"#4AA0C7","hover_event":{"action":"show_text","value":[{"translate":"text.gm4.guidebook.refresh_toc","fallback":"Refresh Table of Contents","color":"gold"}]},"click_event":{"action":"run_command","command":"/trigger gm4_guide set 1"}}] ], "title": "Gamemode 4 Guidebook", "author": "Unknown", "generation": 3 } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_guidebook:{lectern:0b,trigger:1}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "text.gm4.guidebook.title", "fallback": "Gamemode 4 Guidebook" } } ] } ] } ] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/loot_table/technical/guidebook_with_count.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_guidebook:items/guidebook", "functions": [ { "function": "minecraft:set_count", "count": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$count" }, "score": "gm4_guide" } } ] } ] } ] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/book_in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:written_book" ], "predicates": { "minecraft:custom_data": "{gm4_guidebook:{}}" } } } } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/book_in_offhand.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:written_book" ], "predicates": { "minecraft:custom_data": "{gm4_guidebook:{}}" } } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:written_book" ], "predicates": { "minecraft:custom_data": "{gm4_guidebook:{}}" } } } } } ] ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/chance_chest.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.45 } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/chance_zombie_villager.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.2 } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/holding_book.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "items": [ "minecraft:written_book" ], "predicates": { "minecraft:custom_data": "{gm4_guidebook:{}}" } } } } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/predicate/lectern_contents.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_guidebook:{lectern:1b}}" } } } } } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/tags/function/add_toc_line.json ================================================ { "values": [] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/tags/function/setup_storage.json ================================================ { "values": [] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/tags/function/summon_marker.json ================================================ { "values": [] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/tags/function/update_hand.json ================================================ { "values": [] } ================================================ FILE: gm4_guidebook/data/gm4_guidebook/tags/function/update_lectern.json ================================================ { "values": [] } ================================================ FILE: gm4_guidebook/generate_guidebooks.py ================================================ import colorsys import json import logging import os import sys from typing import Any, ClassVar, Literal, Optional, cast from pathlib import Path import nbtlib # type: ignore ; missing stub file from beet import ( Advancement, Context, DataPack, FileDeserialize, Function, JsonFile, JsonFileBase, Model, NamespaceContainer, NamespaceFileScope, PngFile, Texture, ) from beet.contrib.vanilla import Vanilla from beet.core.utils import TextComponent from PIL import Image, ImageDraw from pydantic import BaseModel logger = logging.getLogger(__name__) # TODO: # merge some functions to reduce fuction call overhead DEFAULT_COLORS = { "minecraft:leather_boots": 10511680, "minecraft:leather_chestplate": 10511680, "minecraft:leather_helmet": 10511680, "minecraft:leather_leggings": 10511680 } DEFAULT_OVERLAY_COLORS = { "empty": 0 } IS_DYED = [ "minecraft:leather_boots", "minecraft:leather_chestplate", "minecraft:leather_helmet", "minecraft:leather_leggings", "minecraft:leather_horse_armor", "minecraft:wolf_armor" ] OVERLAY_DYED = [ "minecraft:firework_star", "minecraft:filled_map_markings", "minecraft:potion", "minecraft:spawn_egg", "minecraft:tipped_arrow" # note: the texture file is tipped_arrow_head ] class Section(BaseModel): name: str pages: list[TextComponent] enable: list[dict[str, int|str]] requirements: list[list[str]] prerequisites: list[str] = [] grants: list[str] = [] class Icon(BaseModel): id: str components: Optional[dict[str, Any]] = None class Book(BaseModel): id: str name: str module_type: Literal["expansion", "base", "module"] load_check: Optional[str] = None base_module: Optional[str] = None icon: Icon criteria: dict[str, dict[Any, Any]] sections: list[Section] trigger_id: int = -1 # value set by triggers.json description: Optional[str] = None wiki_link: Optional[str] = None class GuidebookPages(JsonFileBase[Book]): """defines a custom beet filetype for guidebook pages""" scope: ClassVar[NamespaceFileScope] = ("guidebook",) extension: ClassVar[str] = ".json" data: ClassVar[FileDeserialize[Book]] = FileDeserialize() model = Book # tell beet to parse this file using the Book data model def load_page_data(ctx: Context): """registers guidebook files with the beet file loader""" ctx.data.extend_namespace.append(GuidebookPages) yield ctx.data[GuidebookPages].clear() def beet_default(ctx: Context): if not ctx.data[GuidebookPages]: return # there are no pages configured generate_files(ctx, ctx.data) if ctx.data.overlays: for d in ctx.data.overlays.values(): if not d[GuidebookPages]: continue generate_files(ctx, d, True) """ parse guidebook file and generate all files """ def generate_files(ctx:Context, d: DataPack, overlay: bool = False): for book in [b.data for b in d[GuidebookPages].values()]: # get trigger id, generate one if not already existing triggers_file = JsonFile(source_path="gm4_guidebook/triggers.json") triggers = triggers_file.data if book.id not in triggers: if os.getenv("GITHUB_ACTIONS"): logger.error("Github Actions cannot add guidebook triggers. Run the build locally and commit changes to gm4_guidebook/triggers.json") sys.exit(1) # quit the build and mark the github action as failed triggers[book.id] = triggers['__next__'] triggers['__next__'] += 1 triggers_file.data = dict(sorted(triggers.items())) triggers_file.dump(origin="", path="gm4_guidebook/triggers.json") book.trigger_id = triggers[book.id] # get description if not book.description: book.description = ctx.meta["gm4"]["website"]["description"] if "website" in ctx.meta["gm4"] else "" # get load check if not book.load_check: book.load_check = book.id if "gm4_" not in book.load_check: book.load_check = f"gm4_{book.load_check}" # get wiki link if not book.wiki_link: book.wiki_link = ctx.meta['gm4']['wiki'] if "wiki" in ctx.meta["gm4"] else "https://wiki.gm4.co" # add functions to datapack d[f"gm4_guidebook:{book.id}/add_toc_line"] = generate_add_toc_line_function(book, overlay) d[f"gm4_guidebook:{book.id}/setup_storage"] = generate_setup_storage_function(book, ctx, overlay) d[f"gm4_guidebook:{book.id}/summon_marker"] = generate_summon_marker_function(book, overlay) d[f"gm4_guidebook:{book.id}/init_player_db"] = generate_init_player_db_function(book, overlay) # add advancements (and corresponding unlock functions) to datapack d["gm4_guidebook:root"] = root_advancement() page_index: int = 0 load_map: dict[str,int] = {} for index, section in enumerate(book.sections): if (advancement := generate_advancement(book, index)) is not None: d[f"gm4_guidebook:{book.id}/unlock/{section.name}"] = advancement d[f"gm4_guidebook:{book.id}/display/{section.name}"] = generate_display_advancement(book, ctx.project_id) d[f"gm4_guidebook:{book.id}/rewards/{section.name}"] = generate_reward_function( section, book.id, book.name, book.description) d[f"gm4_guidebook:{book.id}/rewards/unlock/{section.name}"], page_index, load_map = generate_unlock_function( section, book.id, page_index, load_map) else: page_index += 1 # register and create advancement icons to resource pack if d is ctx.data: # don't run for overlays - its not needed ctx.meta['gm4'].setdefault('model_data',[]).append({ "template": "custom", "reference": f"{ctx.project_id}:guidebook_icon/{book.id}", "item": book.icon.id.removeprefix("minecraft:"), }) ctx.assets[f"{ctx.project_id}:guidebook_icon/{book.id}"] = generate_toast_model(book, ctx) d[GuidebookPages].clear() """ Alphabetical hash to convert the name of the module into a float """ def get_pos_hash(module_id: str): # ignore the underscores id = module_id.replace("_", "") n:list[int] = [] # get number for each character (ascii -> int) for l in id: n.append(ord(l) - 96) # ascii A = 96, int A = 0 while len(n) < 11: n.append(0) # alphabetical hash id = sum(n[i] * (27 ** (10 - i)) for i in range(11)) / 1000000000000 return id """ Generates the book's header for the player's hand """ def generate_book_header(book: Book) -> list[dict[Any, Any]|str]: # header JSON header: list[dict[Any, Any]|str] = [ "", { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": "↖⌂ ", "color": "#3D83A3" }, { "translate": "gui.gm4.guidebook.header.toc", "fallback": "↖⌂ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": "/trigger gm4_guide set 1" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.return_to_toc", "fallback": "Return to the table of contents" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " Ⓦ ", "color": "#864bc7" }, { "translate": "gui.gm4.guidebook.header.wiki", "fallback": " Ⓦ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "open_url", "url": book.wiki_link }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.open_wiki", "fallback": "Open the wiki page for this module" } } }, " " * 8, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ⟳ ", "bold": True, "color": "dark_green" }, { "translate": "gui.gm4.guidebook.header.refresh", "fallback": " Ⓦ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.refresh", "fallback": "Refresh section" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ◀ " }, { "translate": "gui.gm4.guidebook.header.prev", "fallback": " ◀ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide_prev set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.prev", "fallback": "Go to the previous module" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ▶ " }, { "translate": "gui.gm4.guidebook.header.next", "fallback": " ▶ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide_next set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.next", "fallback": "Go to the next module" } } }, "\n", { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ↖⌂", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.toc.under", "fallback": " ↖⌂", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": "/trigger gm4_guide set 1" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.return_to_toc", "fallback": "Return to the table of contents" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " Ⓦ", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.wiki.under", "fallback": " Ⓦ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "open_url", "url": book.wiki_link }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.open_wiki", "fallback": "Open the wiki page for this module" } } }, " " * 8, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ⟳", "bold": True, "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.refresh.under", "fallback": " ⟳", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.refresh", "fallback": "Refresh section" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ◀", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.prev.under", "fallback": " ◀", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide_prev set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.prev", "fallback": "Go to the previous module" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ▶", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.next.under", "fallback": " ▶", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "run_command", "command": f"/trigger gm4_guide_next set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.next", "fallback": "Go to the next module" } } }, "\n", { "translate": "gui.gm4.guidebook.page", "fallback": "", "color": "white", "font": "gm4:guidebook" } ] return header """ Generates the book's header for the lectern difference is change_page vs run_command click events """ def generate_lectern_header(book: Book) -> list[dict[Any, Any]|str]: # header JSON header: list[dict[Any, Any]|str] = [ "", { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": "↖⌂ ", "color": "#3D83A3" }, { "translate": "gui.gm4.guidebook.header.toc", "fallback": "↖⌂ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 2 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.return_to_toc", "fallback": "Return to the table of contents" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " Ⓦ ", "color": "#864bc7" }, { "translate": "gui.gm4.guidebook.header.wiki", "fallback": " Ⓦ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "open_url", "url": book.wiki_link }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.open_wiki", "fallback": "Open the wiki page for this module" } } }, " " * 8, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ⟳ ", "bold": True, "color": "dark_green" }, { "translate": "gui.gm4.guidebook.header.refresh", "fallback": " ⟳ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 3 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.refresh", "fallback": "Refresh section" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ◀ " }, { "translate": "gui.gm4.guidebook.header.prev", "fallback": " ◀ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 4 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.prev", "fallback": "Go to the previous module" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ▶ " }, { "translate": "gui.gm4.guidebook.header.next", "fallback": " ▶ ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 1 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.next", "fallback": "Go to the next module" } } }, "\n", { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ↖⌂", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.toc.under", "fallback": " ↖⌂", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 2 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.return_to_toc", "fallback": "Return to the table of contents" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " Ⓦ", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.wiki.under", "fallback": " Ⓦ", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "open_url", "url": book.wiki_link }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.open_wiki", "fallback": "Open the wiki page for this module" } } }, " " * 8, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ⟳", "bold": True, "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.refresh.under", "fallback": " ⟳", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 3 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.refresh", "fallback": "Refresh section" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ◀", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.prev.under", "fallback": " ◀", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 4 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.prev", "fallback": "Go to the previous module" } } }, { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ▶", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.header.next.under", "fallback": " ▶", "color": "white", "font": "gm4:guidebook" } ], "click_event": { "action": "change_page", "page": 1 }, "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.next", "fallback": "Go to the next module" } } }, "\n", { "translate": "gui.gm4.guidebook.page", "fallback": "", "color": "white", "font": "gm4:guidebook" } ] return header """ Reads a vanilla item and creates a JSON text component to display the item in the guidebook """ def item_to_display(item: str, components: dict[str, Any] | None, ctx: Context) -> tuple[TextComponent, TextComponent]: vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' if item == "air": # show empty slot slot = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ☐ " }, { "translate": "gui.gm4.guidebook.crafting.display.empty_slot", "fallback": " ☐ ", "color": "white", "font": "gm4:guidebook" } ] } slot_under = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ☐", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.crafting.display.empty_slot.under", "fallback": " ☐", "color": "white", "font": "gm4:guidebook" } ] } return slot, slot_under color = get_texture_color(intuit_item_texture(item, vanilla)) # TODO 26.1 slot: dict[Any, Any] = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ☒ ", "color": color }, [ { "translate": f"gui.gm4.guidebook.crafting.display.{item.replace(':','.')}", "fallback": " ☒ ", "color": f"#{format(16777215, 'x')}", "font": "gm4:guidebook" }, { "translate": f"gui.gm4.guidebook.crafting.display.overlay.{item.replace(':','.')}", "fallback": "", "color": f"#{format(16777215, 'x')}", "font": "gm4:guidebook" } ] ], "hover_event": { "action": "show_item", "id": item, **({"components": components} if components else {}), } } slot_under: dict[Any, Any] = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " ☒", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.crafting.display.filled_slot.under", "fallback": " ☒", "color": "white", "font": "gm4:guidebook" } ], "hover_event": { "action": "show_item", "id": item, **({"components": components} if components else {}), } } return slot, slot_under """ Recursively reads item tags to find a single item to use """ def get_item_from_tag(ctx: Context, item_tag: str, vanilla: Vanilla, searched: Optional[list[str]] = None) -> str: # prepare item tag for searching if ":" in item_tag: prefix, tag_target = item_tag.split(":", maxsplit=1) prefix = prefix.removeprefix("#") else: prefix = "" tag_target = item_tag.removeprefix("#") # open item tag if prefix == "minecraft" or prefix == "": item_tags = vanilla.mount("data/minecraft/tags").data["minecraft"].item_tags else: item_tags = ctx.data[prefix].item_tags items: list[str|dict[str, Any]] = item_tags[tag_target].data["values"] # get first item if isinstance(items[0], str): res: str = items[0] else: res: str = items[0]["id"] # if first value is another tag, recursively search until an item is found if "#" not in res: return res if not searched: searched = [] if res in searched: raise ValueError(f"Cycle found in item tag '{item_tag}' (searched: {', '.join(searched)})") return get_item_from_tag(ctx, res, vanilla, [*searched, res]) """ Generates a crafting grid to be displayed in the guidebook """ def generate_recipe_display(recipe: str, ctx: Context) -> list[TextComponent]: r = ctx.data.recipes[recipe].data ingredients: list[str] = [] shapeless = " " if r["type"].removeprefix("minecraft:") == "crafting_shaped": pattern: list[str] = r["pattern"] # fix configured shape to be a full 3x3 grid while len(pattern) < 3: pattern.append(" ") for i in range(3): while len(pattern[i]) < 3: pattern[i] += " " # convert pattern into list of ingredients for i in range(3): for j in range(3): key = pattern[i][j] if key == " ": ingredients.append("air") else: ingr: str | list[str] = r["key"][key] if isinstance(ingr, list): ingr = ingr[0] elif ingr.startswith("#"): vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' ingr = get_item_from_tag(ctx, ingr, vanilla) ingredients.append(ingr) elif r["type"].removeprefix("minecraft:") == "crafting_shapeless": shapeless = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " 🔀 ", "color": "dark_gray" }, { "translate": "gui.gm4.guidebook.crafting.display.shapeless", "fallback": " 🔀 ", "color": "white", "font": "gm4:guidebook" } ], "hover_event": { "action": "show_text", "value": { "translate": "text.gm4.guidebook.shapeless", "fallback": "Recipe is shapeless" } } } for ingr in r["ingredients"]: if isinstance(ingr, list): ingr = ingr[0] elif ingr.startswith("#"): vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' ingr = get_item_from_tag(ctx, ingr, vanilla) ingredients.append(ingr) while len(ingredients) < 9: ingredients.append("air") # unknown else: raise ValueError(f'Unsupported recipe type: {r["type"]}') # get JSON for each ingredient d_ingredients: list[TextComponent] = [] d_under: list[TextComponent] = [] for item in ingredients: slot, slot_under = item_to_display(item, None, ctx) d_ingredients.append(slot) d_under.append(slot_under) # get recipe results result, result_under = item_to_display(r["result"]["id"], r["result"].get("components"), ctx) # show count result_count = r["result"].get("count", 1) res_count = "" if result_count > 1: res_count = { "translate": f"gui.gm4.guidebook.crafting.display.count.{result_count}", "fallback": "", "color": "white", "font": "gm4:guidebook" } NUMBERS = ["☐","☒","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","⑰","⑱","⑲","⑳"] result["with"][0]["text"] = NUMBERS[result_count] # type: ignore ARROW = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " → " }, { "translate": "gui.gm4.guidebook.crafting.display.arrow", "fallback": " → ", "color": "white", "font": "gm4:guidebook" } ] } ARROW_UNDER = { "translate": "gm4.second", "fallback": "%1$s", "with": [ { "text": " →", "color": "#fcfcf0" }, { "translate": "gui.gm4.guidebook.crafting.display.arrow.under", "fallback": " →", "color": "white", "font": "gm4:guidebook" } ] } CRAFTING = { "translate": "gui.gm4.guidebook.crafting.display.grid", "fallback": "", "color": "white", "font": "gm4:guidebook" } margin = " " * 3 display: list[TextComponent] = [ "", CRAFTING, "\n", margin, d_ingredients[0], d_ingredients[1], d_ingredients[2], shapeless, "\n", margin, d_under[0], d_under[1], d_under[2], "\n", margin, d_ingredients[3], d_ingredients[4], d_ingredients[5], ARROW, result, res_count, "\n", margin, d_under[3], d_under[4], d_under[5], ARROW_UNDER, result_under, "\n", margin, d_ingredients[6], d_ingredients[7], d_ingredients[8], "\n", margin, d_under[6], d_under[7], d_under[8] ] return display """ Calculate how many advances each character takes up when written in the default minecraft font """ def char_advance(char: str) -> int: advances = JsonFile(source_path="gm4_guidebook/advances.json").data # find char in database if char in advances: if type(advances[char]) == dict: return advances[char]["unicode"] return advances[char] return 6 """ Splits a string into how a minecraft book would display it in multiple lines """ def split_into_lines(str: str) -> list[int]: lines:list[Any] = [] words:list[Any] = [] # split string into words for word in str.split(" "): # count how many advances are in each word wlen = 0 for char in word: wlen += char_advance(char) words.append((word, wlen)) current_line = "" current_len = 0 # generate each line based on advances of each word for word, wlen in words: if current_len + wlen > 114: # 114 is max number of advances in each line if not current_line == "": lines.append(current_line) current_line = "" current_len = 0 # if a single word is greater than the max, it gets split every 114 advances if wlen > 114: for char in word: if current_len + char_advance(char) > 114: lines.append(current_line) current_line = "" current_len = 0 current_line += char current_len += char_advance(char) continue current_line += word + " " current_len += wlen + 4 # add each line to a list, without trailing spaces lines.append(current_line) for i in range(len(lines)): lines[i] = lines[i].removesuffix(" ") return lines """ Return a bulletted string of the module name, indented if it's an expansion """ def get_toc_line(book_dict: Book) -> str: indent = " ● " if book_dict.module_type == "expansion" else "● " return f"{indent}{book_dict.name}" """ Replaces {"insert": "X"} with custom data (header, locked text, or recipe) """ def populate_insert(element: dict[Any, Any], book: Book, ctx: Context, lectern: bool = False) -> TextComponent: if "insert" in element.keys(): # header if element["insert"] == "title": return { "text": f"{book.name}\n", "underlined": True, "color": "#4AA0C7" } # (default) locked text elif element["insert"] == "locked_text": locked_text = ["\n",{'translate':'gm4.second','fallback':'%1$s',"with":[{'text':'\n\n\n\n ??? '},{'translate': 'gui.gm4.guidebook.locked_page', 'fallback': '\n\n\n\n ??? ','color': 'white','font':'gm4:guidebook'}],'hover_event':{'action':'show_text','value':[{'translate':'text.gm4.guidebook.undiscovered','fallback':'Undiscovered','italic':True,'color':'red'}]}}] return locked_text # title page locked text elif element["insert"] == "locked_text_title": locked_text = ["",{'translate':'gm4.second','fallback':'%1$s',"with":[{'text':'\n\n\n\n ??? '},{'translate': 'gui.gm4.guidebook.locked_page', 'fallback': '\n\n\n\n ??? ','color': 'white','font':'gm4:guidebook'}],'hover_event':{'action':'show_text','value':[{'translate':'text.gm4.guidebook.undiscovered','fallback':'Undiscovered','italic':True,'color':'red'}]}}] return locked_text # recipes elif element["insert"] == "recipe": return generate_recipe_display(element["recipe"], ctx) else: raise ValueError(f'Unknown insert type: {element["insert"]}') return element """ Converts the JSON text component into a string to be placed inside the page NBT """ def stringify_page(page: TextComponent, book: Book, ctx: Context, lectern: bool = False) -> list[dict[Any,Any]|str]: page_with_header: list[dict[Any,Any]|str] = generate_lectern_header(book) if lectern else generate_book_header(book) # populate insertions for a single value if isinstance(page, dict): if "insert" in page.keys(): page = populate_insert(page, book, ctx, lectern) # populate insertions for a list elif isinstance(page, list): for i, element in enumerate(page): if isinstance(element, dict) and "insert" in element.keys(): page[i] = populate_insert(element, book, ctx, lectern) #type: ignore # stringify the page if isinstance(page, list): page_with_header.extend(page) else: page_with_header.append(page) return page_with_header """ Creates a criterion for a prerequisite """ def generate_prereq(prereq: str, module: str): if ":" in prereq: module = prereq.split(":")[0] prereq = prereq.split(":")[1] criterion = { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { f"gm4_guidebook:{module}/unlock/{prereq}": True } } } } ] } } return criterion """ Create the advancement to unlock a section """ def generate_advancement(book: Book, section_index: int) -> Advancement | None: # get the target section (based on index) section: Section = book.sections[section_index] module_id = book.id all_criteria = book.criteria criteria_keys: set[str] = set() reqs = section.requirements # add requirements to advancement for requirement in section.requirements: for criterion in requirement: criteria_keys.add(criterion) if section.prerequisites: for prereq in section.prerequisites: all_criteria[f"prereq/{prereq}"] = generate_prereq(prereq, module_id) criteria_keys.add(f"prereq/{prereq}") reqs.append([f"prereq/{prereq}"]) if len(criteria_keys) == 0: return None # standard checks for load checking and spectator prevention extra_player_checks = [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "spectator" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_guidebook" }, "score": "load.status" }, "range": {"min": 1} }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": book.load_check }, "score": "load.status" }, "range": {"min": 1} }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$ready" }, "score": "gm4_guide" }, "range": {"min": 1} } ] # add requirements to criteria criteria = {k: v for k, v in all_criteria.items() if k in criteria_keys} for criterion in criteria.values(): if "player" not in criterion["conditions"]: criterion["conditions"]["player"] = extra_player_checks else: criterion["conditions"]["player"] = [*criterion["conditions"]["player"], *extra_player_checks] # create advancement that rewards the function return Advancement({ "parent": "gm4_guidebook:root", "criteria": criteria, "requirements": reqs, "rewards": { "function": f"gm4_guidebook:{module_id}/rewards/{section.name}", } }) """ Creates the advancement to hide the display advancements """ def root_advancement() -> Advancement: return Advancement({ "criteria": { "requirement": { "trigger": "minecraft:impossible", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_guidebook" }, "score": "load.status" }, "range": { "min": 1 } } ] } } } }) """ Creates the advancement to show the toast """ def generate_display_advancement(book: Book, project_id: str) -> Advancement: module_name = book.name icon = book.icon if icon.components is None: icon.components = dict() icon.components["minecraft:custom_model_data"] = { "strings": [f"{project_id}:guidebook_icon/{book.id}"] } display = { "icon": { "id": icon.id, "components": icon.components }, "title": [ "", { "translate": "gui.gm4.guidebook.toast", "fallback": "", "color": "white", "font": "gm4:guidebook" }, { "translate": "text.gm4.guidebook.discovered_page", "fallback": "Check your guidebook!", "color": "#4AA0C7", "italic": True } ], "description": module_name, # this isn't actually ever visible "frame": "goal", "show_toast": True, "announce_to_chat": False, "hidden": True } return Advancement({ "display": display, "parent": "gm4_guidebook:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } }) """ Creates the function that is granted when a section is unlocked """ def generate_reward_function(section: Section, book_id: str, book_name: str, desc: Optional[str]) -> Function: # check if any module needs to be loaded if section.enable and len(section.enable) > 0: start = "execute" for module_check in section.enable: if module_check["load"] == -1: start += " unless " else: start += " if " start += f"score {module_check['id']} load.status matches 1.." start += " run " else: start = "" # standard tellraw message tellraw: list[TextComponent] = [ "", { "translate": "text.gm4.guidebook.discovered", "fallback":"%1$s has discovered a guidebook page from %2$s", "with": [ { "selector":"@s" # player }, { "text": f"[{book_name}]", # module name (never translated) "color": "#4AA0C7", "hover_event": { "action": "show_text", "value": [ { "text": book_name, # module name "color": "#4AA0C7" }, { "text": "\n" }, { "translate": f"text.gm4.guidebook.module_desc.{book_id}", # module description "fallback": desc, "italic": True, "color": "gray" } ] } } ] } ] # show tellraw and toast reward = Function([ f'{start}tellraw @s {json.dumps(tellraw)}', f"{start}advancement grant @s only gm4_guidebook:{book_id}/display/{section.name}" ]) # grants other sections when this section is obtained if section.grants: reward.append([f"{start}advancement grant @s only gm4_guidebook:{book_id}/unlock/{grant}" for grant in section.grants]) # update the player's unlocked pages reward.append([f"{start}function gm4_guidebook:{book_id}/rewards/unlock/{section.name}"]) return reward """ Creates the function that updates the player's db entry """ def generate_unlock_function(section: Section, book_id: str, page_index: int, load_map: dict[str,int]) -> tuple[Function, int, dict[str,int]]: # initial setup func = Function([ f"data modify storage gm4_guidebook:temp unlocking.uuid set from entity @s UUID", f'data modify storage gm4_guidebook:temp unlocking.name set value "{book_id}"' ]) # get first page of this section if len(section.enable) > 0: key = "" for module_check in section.enable: key += module_check["id"] # type: ignore if key in load_map: page_index = load_map[key] else: load_map[key] = page_index # unlock each page for i, _ in enumerate(section.pages): page_name = f"{section.name}_{i}" if (len(section.pages) > 1) else section.name # add commands func.append([ f"data modify storage gm4_guidebook:temp unlocking.target_page set value {page_index}", f"data modify storage gm4_guidebook:temp unlocking.lectern_target_page set value {page_index+5}", f'data modify storage gm4_guidebook:temp unlocking.source_page set value "{page_name}"', "function gm4_guidebook:player_db/update with storage gm4_guidebook:temp unlocking" ]) page_index += 1 # clean up func.append(["data remove storage gm4_guidebook:temp unlocking"]) return func, page_index, load_map """ Creates the page storage to store book info for a given module """ def generate_page_storage(book: Book, ctx: Context) -> dict[str, Any]: hand_initial:list[Any] = [] hand_unlockable:dict[str,Any] = {} lectern_initial:list[Any] = [["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}],["",{"translate":"gui.gm4.guidebook.page.toc","fallback":"","color":"white","font":"gm4:guidebook"}],["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}],["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}],["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}]] lectern_unlockable:dict[str,Any] = {} for section_index, section in enumerate(book.sections): # check if the page is unlockable or initial if len(section.enable) == 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0: # add page to initial book for page in section.pages: hand_initial.append(stringify_page(page, book, ctx, False)) lectern_initial.append(stringify_page(page, book, ctx, True)) elif len(section.enable) != 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0: raise ValueError(f'Section "{section.name}" in "{book.id}" has both module dependencies and requirements') else: for page_index, page in enumerate(section.pages): # add locked page to initial book add_locked_page = True ## only add a locked page for one iteration of a complementary page for module_check in section.enable: if module_check["load"] != -1: add_locked_page = False if add_locked_page: if (section_index == 0): locked_text: list[dict[Any, Any]|str] = [{'insert':'title'},{'insert':'locked_text_title'}] else: locked_text: list[dict[Any, Any]|str] = [{'insert':'locked_text'}] hand_initial.append(stringify_page(locked_text, book, ctx, False)) lectern_initial.append(stringify_page(locked_text, book, ctx, True)) # add page to unlockable map page_name = f"{section.name}_{page_index}" if (len(section.pages) > 1) else section.name hand_unlockable[page_name] = stringify_page(page, book, ctx, False) lectern_unlockable[page_name] = stringify_page(page, book, ctx, True) lectern_initial.append(["\n\n",{"translate":"gui.gm4.guidebook.page","fallback":"","color":"white","font":"gm4:guidebook"}]) return { "hand": { "initial": hand_initial, "unlockable": hand_unlockable }, "lectern": { "initial": lectern_initial, "unlockable": lectern_unlockable } } """ Creates the function that populates the page storage """ def generate_setup_storage_function(book: Book, ctx: Context, overlay: bool = False) -> Function: # create page storage storage = generate_page_storage(book, ctx) # write each command to be placed in the function short_circuit = f"execute unless score {book.load_check} load.status matches 1.. run return 0" trigger_map = f"data modify storage gm4_guidebook:register trigger_map.{book.trigger_id} set value {'{'}name:\"{book.id}\",load:\"{book.load_check}\"{'}'}" page_storage = f"data modify storage gm4_guidebook:register pages.{book.id} set value {json.dumps(storage, ensure_ascii=False)}" return Function([ short_circuit, trigger_map, page_storage ], tags=[] if overlay else ["gm4_guidebook:setup_storage"]) """ Creates the function that adds a line to the table of contents """ def generate_add_toc_line_function(book: Book, overlay: bool = False) -> Function: text_component = { "text": get_toc_line(book), "color": "#4AA0C7", "click_event": { "action": "run_command", "command": f"/trigger gm4_guide set {book.trigger_id}" }, "hover_event": { "action": "show_text", "value": [{ "translate": "text.gm4.guidebook.jump_to_section", "fallback": "Jump to Section", "color": "gold" }] } } return Function([ f"execute if score $trigger gm4_guide matches {book.trigger_id} if score {book.load_check} load.status matches 1.. run data modify storage gm4_guidebook:temp page append value {json.dumps(text_component, ensure_ascii=False)}" ], tags=[] if overlay else ["gm4_guidebook:add_toc_line"]) """ Creates the function to summon a guidebook marker with proper NBT """ def generate_summon_marker_function(book: Book, overlay: bool = False) -> Function: marker_nbt = nbtlib.Compound() marker_nbt["CustomName"] = nbtlib.String(f'gm4_{book.id}') marker_nbt["Tags"] = nbtlib.List([nbtlib.String("gm4_guide"),nbtlib.String(f"gm4_guide_{book.id}")]) marker_nbt["data"] = nbtlib.Compound() marker_nbt["data"]["type"] = nbtlib.String(book.module_type) if book.module_type == "expansion": marker_nbt["data"]["base"] = nbtlib.String(book.base_module) marker_nbt["data"]["id"] = nbtlib.String(book.id) marker_nbt["data"]["trigger"] = nbtlib.Int(book.trigger_id) marker_nbt["data"]["module_name"] = nbtlib.String(book.name) marker_nbt["data"]["toc_line"] = nbtlib.String(get_toc_line(book)) marker_nbt["data"]["line_count"] = nbtlib.Int(len(split_into_lines(get_toc_line(book)))) return Function([ f"execute if score {book.load_check} load.status matches 1.. run summon marker ~ {get_pos_hash(book.id)} ~ {nbtlib.serialize_tag(marker_nbt)}"# type: ignore ], tags=[] if overlay else ["gm4_guidebook:summon_marker"]) """ Creates the function to initialize a player's book entry """ def generate_init_player_db_function(book: Book, overlay: bool = False) -> Function: func: Function = Function([], tags=[] if overlay else ["gm4_guidebook:init_player_db"]) # check guidebook unlock advancements for section in book.sections: # skip any pages that are unlocked by default if len(section.enable) == 0 and len(section.requirements) == 0 and len(section.prerequisites) == 0: continue # check for complementary pages if section.enable and len(section.enable) > 0: score_check = " " for module_check in section.enable: if module_check["load"] == -1: score_check += " unless " else: score_check += " if " score_check += f"score {module_check['id']} load.status matches 1.." else: score_check = "" # update player db func.append(f"execute{score_check} if entity @s[advancements={'{'}gm4_guidebook:{book.id}/unlock/{section.name}=true{'}'}] run function gm4_guidebook:{book.id}/rewards/unlock/{section.name}") # early return func.append(["return 1"]) return func """ Creates page unlock toast texture from module icons """ def generate_toast_model(book: Book, ctx: Context) -> Model: # look for module icon # first looks for gm4_apple_trees:gui/guidebook/apple_trees # then for the pack.png icon = ctx.assets.textures.get(f"{ctx.project_id}:gui/guidebook/{book.id}", None) if not icon and ctx.data.icon and ctx.data.icon != PngFile(source_path=Path("base/pack.png")): # use pack.png of root pack if no guidebook texture given icon = ctx.data.icon.copy() # copy image to new file if not icon: # still no icon, use the guidebook book texture return Model({ "parent":"gm4_guidebook:item/guidebook" }) # round corners img = cast(Image.Image, icon.image) # FIXME why needs cast? # type: ignore mask = Image.new(mode='L', size=img.size) mask_draw = ImageDraw.Draw(mask) mask_draw.rounded_rectangle(((0,0),img.size), radius=img.size[0]//6, fill=255) img.putalpha(mask) ctx.assets[f"{ctx.project_id}:gui/guidebook/{book.id}"] = Texture(img) # create model for new texture textures = { "layer0": f"{ctx.project_id}:gui/guidebook/{book.id}" } # some items will tint layer0, so we special case those here. if book.icon.id in IS_DYED: textures = { "layer0": "gm4:item/empty", "layer1": f"{ctx.project_id}:gui/guidebook/{book.id}" } # some items will tint layer1, so we special case those here. if book.icon.id in OVERLAY_DYED: textures = { "layer0": "gm4:item/empty", "layer1": "gm4:item/empty", "layer2": f"{ctx.project_id}:gui/guidebook/{book.id}" } return Model({ "parent": "builtin/generated", "textures": textures, "display":{ "gui":{ "scale": [1.4, 1.4, 1] } } }) """ Clamps a value between to valid RGB decimal numbers """ def clamp(x: int|float): return int(max(0, min(x, 255))) """ Reads an texture and finds the average dominant color """ def get_texture_color(texture: PngFile|None) -> str: if texture is None: return "#000000" # Find the colors that occur most often try: palette: list[int] = texture.image.convert('P', palette=Image.ADAPTIVE, colors=4).getpalette() # type: ignore ; PIL typing is weird except ValueError: return "#000000" if not palette: return "#000000" # get average RGB values r, g, b = 0, 0, 0 n = 0 for i in range(0, min(12, len(palette)), 3): # type: ignore r += palette[i] # type: ignore ; PIL has 'Unknown' type on palette return g += palette[i+1] # type: ignore b += palette[i+2] # type: ignore n += 1 if n > 0: r /= 4 # type: ignore g /= 4 # type: ignore b /= 4 # type: ignore # bump saturation and value to taste h, s, v = colorsys.rgb_to_hsv(r, g, b)# type: ignore s *= 1.5 v *= 0.85 r, g, b = colorsys.hsv_to_rgb(h, s, v) # return hex value return "#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b)) """ Looks for a single texture to represent a vanilla item, even in cases where the item has a model with multiple textures """ def intuit_item_texture(item_id: str, vanilla: Vanilla) -> PngFile|None: item_textures = vanilla.mount("assets/minecraft/textures/item").assets["minecraft"].textures block_textures = vanilla.mount("assets/minecraft/textures/block").assets["minecraft"].textures item_id = item_id.removeprefix("minecraft:") # try invective mapping if (r:=item_textures.get(f"item/{item_id}")): return r elif (r:=block_textures.get(f"block/{item_id}")): return r else: # exhaustively look for a fuzzy-esque name match combined_textures = NamespaceContainer[Texture]() combined_textures.merge(item_textures) combined_textures.merge(block_textures) for id, texture in combined_textures.items(): if f"block/{item_id}" not in id and f"item/{item_id}" not in id: continue return texture ================================================ FILE: gm4_guidebook/legacy_item_sheet.py ================================================ from beet import Context def beet_default(ctx: Context): """Merges the `guidebook_items.json Font with the master `guidebook.json`. This is the temporary-ish organization technique until our custom models/items can be rendered on demand and formed into a spritesheet""" # NOTE these font files will be auto-generated in the future ctx.assets.fonts["gm4:guidebook"].merge( ctx.assets.fonts["gm4:gm4_items"] ) ctx.assets.fonts["gm4:guidebook"].merge( ctx.assets.fonts["gm4:vanilla_items"] ) ================================================ FILE: gm4_guidebook/mod.mcdoc ================================================ use ::java::world::item::SingleItem use ::java::data::advancement::AdvancementCriterion use ::java::util::text::Text use ::java::util::Filterable use ::java::util::slot::SlottedItem use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_guidebook:temp] to struct { modules?: [GuidebookModule], expansions?: [GuidebookModule], check_expansions?: [GuidebookModule], module?: GuidebookModule, expansion?: GuidebookModule, prev_trigger_order?: [int], lectern_pages?: [[Text]], toc_back?: Text, click?: int, book?: struct { trigger: int, uuid: #[uuid] int[] @ 4, count: int, name: string, load: string, }, triggers?: [int], Inventory?: [SlottedItem] @ 0..41, Item?: SlottedItem, unlocking?: struct { uuid?: #[uuid] int[] @ 4, name?: string, target_page?: int, lectern_target_page?: int, source_page?: string, }, lectern_page?: [Text], page?: [Text], page_content?: Text, } struct GuidebookModule { type: string, id: string, base?: string, trigger: int, line_count: int, toc_line: Text, } dispatch minecraft:storage[gm4_guidebook:register] to struct { front_matter?: [Filterable], trigger_order?: [int], lectern_toc?: [Text], trigger_map?: struct { [int]: struct { name: string, load: string, }, }, pages?: struct { [string]: struct { hand: PageState, lectern: PageState, }, }, player_pages?: struct { [#[uuid] string]: struct { [string]: struct { hand: PageState, lectern: PageState, }, }, }, } struct PageState { initial: [Text], unlockable: struct { [string]: [Text], }, } dispatch minecraft:resource[gm4_guidebook] to struct Book { id: string, name: string, module_type: ("expansion" | "base" | "module"), load_check?: string, base_module?: string, icon: SingleItem, criteria: struct AdvancementCriteriaMap { [string]: AdvancementCriterion, }, sections: [Section], description?: string, wiki_link?: string, } struct Section { name: string, pages: [GuidebookText], enable: [struct {[string]: (int | string)}], requirements: [[string]], prerequisites?: [string], grants?: [string], } type GuidebookText = ( string | [GuidebookTextObject] | GuidebookTextObject | ) type GuidebookTextObject = ( GuidebookInsert | Text | ) struct GuidebookInsert { insert: ("title" | "locked_text" | "locked_text_title" | "recipe"), ...gm4_guidebook:insert[[insert]], } dispatch gm4_guidebook:insert[recipe] to struct RecipeInsert { recipe: string, } ================================================ FILE: gm4_guidebook/triggers.json ================================================ { "__important__": "Generated by generate_guidebooks.py. Don't manually update this", "__next__": 125, "animi_shamir": 91, "apple_trees": 83, "arborenda_shamir": 20, "audere_shamir": 8, "auto_crafting": 104, "balloon_animals": 117, "bat_grenades": 90, "beehive_inspector": 51, "better_armour_stands": 74, "better_fire": 57, "block_compressors": 54, "blossoming_pots": 118, "book_binders": 72, "bookshelf_inspector": 116, "boots_of_ostara": 87, "calling_bell": 105, "celaro_shamir": 76, "cement_mixers": 66, "chairs": 73, "combat_expanded": 115, "cooler_caves": 82, "corripio_shamir": 86, "cozy_campfires": 61, "crossbow_cartridges": 65, "custom_crafters": 111, "dangerous_dungeons": 60, "defuse_shamir": 25, "desire_lines": 77, "disassemblers": 81, "display_frames": 5, "double_doors": 106, "dripleaf_filters": 107, "dripleaf_launchers": 108, "enchantment_extractors": 49, "end_fishing": 7, "ender_bolt_shamir": 27, "ender_hoppers": 35, "enderman_support_class": 80, "enlarging_phantoms": 101, "everstone": 75, "falling_stars": 43, "forming_press": 16, "forterra_shamir": 19, "fulcio_shamir": 79, "gemini_shamir": 22, "harvest_moons": 45, "heart_canisters": 15, "helious_shamir": 69, "holographic_tags": 94, "hypexperia_shamir": 17, "iacio_shamir": 88, "icy_strays": 102, "illusioner_nights": 103, "infinitas_shamir": 23, "ink_spitting_squid": 78, "lavish_livestock": 122, "lightning_in_a_bottle": 109, "liquid_minecarts": 47, "liquid_tanks": 63, "live_catch": 11, "lively_lily_pads": 123, "lumos_shamir": 71, "menacing_goblins": 99, "mending_tanks": 13, "metallurgy": 28, "mob_curing": 38, "moneo_shamir": 18, "monsters_unbound": 120, "mountaineering": 110, "musical_shamir": 29, "mysterious_midnights": 42, "nightmare_nights": 40, "note_block_interface": 10, "orb_of_ankou": 85, "particles_pack": 6, "percurro_shamir": 37, "phantom_scarecrows": 55, "pig_tractors": 56, "podzol_rooting_soil": 36, "poses_pack": 92, "potion_liquids": 32, "potion_swords": 62, "record_crafting": 97, "reeling_rods": 121, "relocators": 70, "resurrecting_skeletons": 41, "resurrecting_zombies": 46, "rope_ladders": 112, "sandy_husks": 98, "scuba_gear": 96, "sensus_shamir": 21, "shapeless_portals": 113, "shroomites": 2, "slime_fests": 100, "smelteries": 9, "soul_glass": 58, "spawner_minecarts": 12, "speed_paths": 30, "standard_crafting": 93, "standard_liquids": 64, "sunken_treasure": 4, "survival_refightalized": 119, "sweethearts": 33, "teleportation_anchors": 114, "tinker_shamir": 26, "tinkering_compressors": 52, "tipped_skeletons": 44, "tower_structures": 89, "towering_trees": 124, "tunnel_bores": 59, "undead_players": 67, "vecto_shamir": 95, "vertical_rails": 84, "vibro_shamir": 24, "vigere_shamir": 14, "washing_tanks": 3, "weighted_armour": 68, "xp_storage": 48, "zauber_cauldrons": 53, "zauber_liquids": 31, "ziprails": 50 } ================================================ FILE: gm4_holographic_tags/README.md ================================================ # Holographic Tags Decorate your builds with floating text boxes, anywhere you want! This data pack is based on a concept by [SethBling](https://twitter.com/SethBling/status/1140675391012528128). Holographic Tags Demo ### Features - Place a named Name Tag in an Item Frame to create a floating text box - Place an Item Frame in the same spot to remove it again - Use a dyed Wool block to customize the colour of the floating text Colors of the floating text based on wool type ================================================ FILE: gm4_holographic_tags/assets/translations.csv ================================================ key,en_us advancement.gm4.holographic_tags.title,Holo-riffic! advancement.gm4.holographic_tags.description,Create a Hologram text.gm4.guidebook.module_desc.holographic_tags,Set up floating messages with a simple name tag! text.gm4.guidebook.holographic_tags.description,"Putting a renamed name tag in an item frame will create floating textbox.\n\nTo remove the hologram, place an item frame in the original position." text.gm4.guidebook.holographic_tags.colors,Placing the item frame on a wool block will color the hologram. ================================================ FILE: gm4_holographic_tags/beet.yaml ================================================ id: gm4_holographic_tags name: Holographic Tags version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: name_tag reference: gui/advancement/holographic_tags template: advancement website: description: Set up floating messages with a simple name tag! recommended: [] notes: [] modrinth: project_id: AzpWemXn smithed: pack_id: gm4_holographic_tags wiki: https://wiki.gm4.co/wiki/Holographic_Tags credits: Creator: - BPR Updated by: - Bloo Inspired by: - SethBling Icon Design: - Hozz ================================================ FILE: gm4_holographic_tags/data/gm4/advancement/holographic_tags.json ================================================ { "display": { "icon": { "id": "name_tag", "components": { "minecraft:custom_model_data": {"strings":["gm4_holographic_tags:gui/advancement/holographic_tags"]} } }, "title": { "translate": "advancement.gm4.holographic_tags.title", "fallback": "Holo-riffic!" }, "description": { "translate": "advancement.gm4.holographic_tags.description", "fallback": "Create a Hologram", "color": "gray" } }, "parent": "gm4:root", "criteria": { "create_hologram": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/create_hologram.mcfunction ================================================ # @s = item frame with renamed name tag # run from main # init text display data modify storage gm4_holographic_tags:temp properties.raw_text set from entity @s Item.components."minecraft:custom_name" execute if entity @s[type=glow_item_frame] run data modify storage gm4_holographic_tags:temp properties.glowing set value 1b data modify storage gm4_holographic_tags:temp properties.rotation set from entity @s Rotation execute summon text_display run function gm4_holographic_tags:initialize_hologram data remove storage gm4_holographic_tags:temp properties # sights and sounds advancement grant @a[distance=..4,gamemode=!spectator] only gm4:holographic_tags playsound minecraft:entity.item_frame.remove_item block @a particle minecraft:block{block_state:"minecraft:stripped_acacia_log"} ~ ~ ~ .2 .2 .2 .1 10 # return item frame item execute unless data storage gm4_holographic_tags:temp properties.glowing run summon item ~ ~ ~ {Item:{id:"minecraft:item_frame",count:1},PickupDelay:10s,Motion:[0.0,0.25,0.0]} execute if data storage gm4_holographic_tags:temp properties.glowing run summon item ~ ~ ~ {Item:{id:"minecraft:glow_item_frame",count:1},PickupDelay:10s,Motion:[0.0,0.25,0.0]} kill @s ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/destroy_hologram.mcfunction ================================================ # @s = hologram text display if empty item frame is nearby # at @s positioned ^ ^ ^-0.3 (block face the hologram was placed from) # run from main # prepare data to reduce selector count data modify storage gm4_holographic_tags:temp properties.rotation_hologram set from entity @s Rotation execute store result storage gm4_holographic_tags:temp properties.rotation_x_hologram int 1 run data get storage gm4_holographic_tags:temp properties.rotation_hologram[0] execute store result storage gm4_holographic_tags:temp properties.rotation_y_hologram int 1 run data get storage gm4_holographic_tags:temp properties.rotation_hologram[1] data modify storage gm4_holographic_tags:temp properties.text set from entity @s text.text # attempt move data from hologram to item frame, if destroy failed, also fail this function execute as @e[type=#gm4_holographic_tags:item_frames,limit=1,sort=nearest,distance=..0.1] unless function gm4_holographic_tags:read_hologram_data run return fail data remove storage gm4_holographic_tags:temp properties # particles & hologram removal particle minecraft:block{block_state:"minecraft:stripped_birch_log"} ~ ~ ~ .2 .2 .2 .1 10 kill @s ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/init.mcfunction ================================================ team add gm4_white team add gm4_orange team add gm4_magenta team add gm4_lightblue team add gm4_yellow team add gm4_lime team add gm4_pink team add gm4_gray team add gm4_lightgray team add gm4_cyan team add gm4_purple team add gm4_blue team add gm4_brown team add gm4_green team add gm4_red team add gm4_black team modify gm4_white color white team modify gm4_orange color gold team modify gm4_magenta color light_purple team modify gm4_lightblue color aqua team modify gm4_yellow color yellow team modify gm4_lime color green team modify gm4_pink color red team modify gm4_gray color dark_gray team modify gm4_lightgray color gray team modify gm4_cyan color dark_aqua team modify gm4_purple color dark_purple team modify gm4_blue color blue team modify gm4_brown color dark_blue team modify gm4_green color dark_green team modify gm4_red color dark_red team modify gm4_black color black scoreboard objectives add gm4_entity_version dummy execute unless score holographic_tags gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Holographic Tags"} execute unless score holographic_tags gm4_earliest_version < holographic_tags gm4_modules run scoreboard players operation holographic_tags gm4_earliest_version = holographic_tags gm4_modules scoreboard players set holographic_tags gm4_modules 1 schedule function gm4_holographic_tags:main 1t #$moduleUpdateList ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/initialize_hologram.mcfunction ================================================ # initializes data on the text display # @s = newly spawned text display # run from main data merge entity @s {text:{color:"#FFFFFF",text:"test"},line_width:2147483647 ,billboard:"center",Tags:["gm4_hologram","smithed.entity","smithed.strict"],background:0} data modify entity @s text.text set from storage gm4_holographic_tags:temp properties.raw_text data modify entity @s Rotation set from storage gm4_holographic_tags:temp properties.rotation execute if data storage gm4_holographic_tags:temp properties.glowing run data modify entity @s brightness set value {block:15,sky:15} execute positioned as @s if block ^ ^ ^-0.75 #minecraft:wool run function gm4_holographic_tags:set_color scoreboard players set @s gm4_entity_version 2 ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/main.mcfunction ================================================ execute as @e[type=text_display,tag=gm4_hologram] at @s positioned ^ ^ ^-0.3 if entity @e[type=#gm4_holographic_tags:item_frames,predicate=!gm4_holographic_tags:has_item,distance=..0.1,limit=1] run function gm4_holographic_tags:destroy_hologram execute as @e[type=#gm4_holographic_tags:item_frames,tag=!smithed.entity,tag=!gm4_hologram,predicate=gm4_holographic_tags:has_name_tag] if items entity @s contents *[custom_name] at @s positioned ^ ^ ^0.3 unless entity @e[type=text_display,tag=gm4_hologram,distance=..0.1] run function gm4_holographic_tags:create_hologram tag @e[type=#gm4_holographic_tags:item_frames,tag=gm4_hologram,predicate=!gm4_holographic_tags:has_name_tag] remove gm4_hologram schedule function gm4_holographic_tags:main 16t ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/read_hologram_data.mcfunction ================================================ # Moves data from the hologram to the item frame, unless their rotations are different # @s = item frame ready to receive a nametag # at block face hologram was placed from # run from return_name_tag # check if the rotation matches data modify storage gm4_holographic_tags:temp properties.rotation_item_frame set from entity @s Rotation execute store result storage gm4_holographic_tags:temp properties.rotation_x_item_frame int 1 run data get storage gm4_holographic_tags:temp properties.rotation_item_frame[0] execute store result storage gm4_holographic_tags:temp properties.rotation_y_item_frame int 1 run data get storage gm4_holographic_tags:temp properties.rotation_item_frame[1] execute store success storage gm4_holographic_tags:temp properties.rotation_x_differs int 1 run data modify storage gm4_holographic_tags:temp properties.rotation_x_hologram set from storage gm4_holographic_tags:temp properties.rotation_x_item_frame execute if data storage gm4_holographic_tags:temp properties{rotation_x_differs:1} run return fail execute store success storage gm4_holographic_tags:temp properties.rotation_y_differs int 1 run data modify storage gm4_holographic_tags:temp properties.rotation_y_hologram set from storage gm4_holographic_tags:temp properties.rotation_y_item_frame execute if data storage gm4_holographic_tags:temp properties{rotation_y_differs:1} run return fail # rotation matched, move data data merge entity @s {Tags:["gm4_hologram"],Item:{id:"minecraft:name_tag",count:1,components:{"minecraft:repair_cost":0}}} data modify entity @s Item.components."minecraft:custom_name" set from storage gm4_holographic_tags:temp properties.text # signal that data transfer was successful return 1 ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/set_color.mcfunction ================================================ # @s = item frame with renamed name tag if on a wool block # run from initialize_hologram execute if block ^ ^ ^-.75 white_wool run data modify entity @s text.color set value "#e8ebeb" execute if block ^ ^ ^-.75 orange_wool run data modify entity @s text.color set value "#ee7311" execute if block ^ ^ ^-.75 magenta_wool run data modify entity @s text.color set value "#be45b5" execute if block ^ ^ ^-.75 light_blue_wool run data modify entity @s text.color set value "#37abd6" execute if block ^ ^ ^-.75 yellow_wool run data modify entity @s text.color set value "#f7c527" execute if block ^ ^ ^-.75 lime_wool run data modify entity @s text.color set value "#6fb718" execute if block ^ ^ ^-.75 pink_wool run data modify entity @s text.color set value "#eb88a8" execute if block ^ ^ ^-.75 gray_wool run data modify entity @s text.color set value "#3c4245" execute if block ^ ^ ^-.75 light_gray_wool run data modify entity @s text.color set value "#8b8b84" execute if block ^ ^ ^-.75 cyan_wool run data modify entity @s text.color set value "#15878f" execute if block ^ ^ ^-.75 purple_wool run data modify entity @s text.color set value "#7426a7" execute if block ^ ^ ^-.75 blue_wool run data modify entity @s text.color set value "#323599" execute if block ^ ^ ^-.75 brown_wool run data modify entity @s text.color set value "#6f4425" execute if block ^ ^ ^-.75 green_wool run data modify entity @s text.color set value "#51691a" execute if block ^ ^ ^-.75 red_wool run data modify entity @s text.color set value "#9f2521" execute if block ^ ^ ^-.75 black_wool run data modify entity @s text.color set value "#101115" ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/upgrade_paths/1.5/convert_to_text_display.mcfunction ================================================ # collects data from the existing aec and initiates summoning of a replacement text display # @s = outdated aec-based holographic tag # at @s # run from upgrade_paths/1.5 # summon text display based on aec tp ^ ^ ^.3 data modify storage gm4_holographic_tags:temp properties.raw_text set from entity @s CustomName data modify storage gm4_holographic_tags:temp properties.rotation set from entity @s Rotation execute at @s summon text_display run function gm4_holographic_tags:initialize_hologram data remove storage gm4_holographic_tags:temp properties kill @s ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/function/upgrade_paths/1.5.mcfunction ================================================ # updates old area effect cloud based holographic tags into new text display based ones # @s = player # as @s # run via upgrade paths util execute as @e[type=area_effect_cloud,tag=gm4_hologram,scores={gm4_entity_version=1}] at @s run function gm4_holographic_tags:upgrade_paths/1.5/convert_to_text_display ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/guidebook/holographic_tags.json ================================================ { "id": "holographic_tags", "name": "Holographic Tags", "module_type": "module", "icon": { "id": "minecraft:name_tag" }, "criteria": { "obtain_name_tag": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:name_tag" ] } ] } }, "create_holographic_tag": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:holographic_tags": true } } } } ] } } }, "sections": [ { "name": "creation", "enable": [], "requirements": [ [ "obtain_name_tag" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.holographic_tags.description", "fallback": "Putting a renamed name tag in an item frame will create floating textbox.\n\nTo remove the hologram, place an item frame in the original position." } ] ] }, { "name": "colors", "enable": [], "requirements": [ [ "create_holographic_tag" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.holographic_tags.colors", "fallback": "Placing the item frame on a wool block will color the hologram." } ] ], "grants": [ "creation" ] } ] } ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/predicate/has_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "count": { "min": 1 } } } } } ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/predicate/has_name_tag.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:name_tag" } } } } ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/tags/entity_type/item_frames.json ================================================ { "values": [ "minecraft:item_frame", "minecraft:glow_item_frame" ] } ================================================ FILE: gm4_holographic_tags/data/gm4_holographic_tags/test/create_and_remove.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ setblock ~1 ~1 ~2 gray_concrete execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~2 item replace entity @s weapon.mainhand with item_frame dummy @s use block ~1 ~1 ~2 north item replace entity @s weapon.mainhand with minecraft:name_tag[custom_name="HelloGamemode4"] dummy @s use entity @e[type=item_frame,distance=..4,limit=1] await not entity @e[type=item_frame,distance=..4] clear @s written_book assert entity @e[type=text_display,distance=..4,nbt={text:{text:"HelloGamemode4"}}] execute at @s run tp @e[type=item,distance=..4] ~ ~ ~ await items entity @s weapon.mainhand minecraft:item_frame dummy @s use block ~1 ~1 ~2 north await not entity @e[type=text_display,distance=..4] assert items entity @e[type=item_frame,distance=..4] contents minecraft:name_tag[count=1,custom_name="HelloGamemode4"] ================================================ FILE: gm4_holographic_tags/mod.mcdoc ================================================ use ::java::util::text::Text dispatch minecraft:storage[gm4_holographic_tags:temp] to struct { properties?: struct { raw_text?: Text, glowing?: boolean, rotation?: [float] @ 2, rotation_hologram?: [float] @ 2, rotation_x_hologram?: int, rotation_y_hologram?: int, text?: string, rotation_item_frame?: [float] @ 2, rotation_x_item_frame?: int, rotation_y_item_frame?: int, rotation_x_differs?: int, rotation_y_differs?: int, }, } ================================================ FILE: gm4_iacio_shamir/README.md ================================================ # Iacio Shamir Throw items further! ### Features - Whilst wearing a chestplate with Iacio on it, tridents, enderpearls, throwable potions, snowballs and eggs go further - Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy) ================================================ FILE: gm4_iacio_shamir/beet.yaml ================================================ id: gm4_iacio_shamir name: Iacio Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 model_data: - item: chestplates reference: shamir/iacio template: name: shamir metal: barium textures_path: gm4_metallurgy:item/shamir/barium website: description: Adds the 'Iacio' shamir to Metallurgy. It lets you throw things further! Launch an Ender Pearl into orbit or simply throw your Trident exceptionally far. recommended: [] notes: [] modrinth: project_id: DTk79ZcR wiki: https://wiki.gm4.co/wiki/Metallurgy/Iacio_Shamir credits: Creator: - Denniss Icon Design: - BPR ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/advancement/inventory_changed.json ================================================ { "criteria": { "iacio_inv_change": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": false, "is_sprinting": false }, "equipment": { "chest": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'iacio'}}" } } } } } ] } } }, "rewards": { "function": "gm4_iacio_shamir:check_throw" } } ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/function/add_motion.mcfunction ================================================ #run from check_throw #@s = thrown entity execute store result entity @s Motion[0] double 0.001 run data get entity @s Motion[0] 2000 execute store result entity @s Motion[1] double 0.001 run data get entity @s Motion[1] 2000 execute store result entity @s Motion[2] double 0.001 run data get entity @s Motion[2] 2000 playsound minecraft:entity.witch.throw player @a[distance=..15] ~ ~ ~ .4 1 ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'iacio'}}] if items entity @s contents #gm4_iacio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/function/check_throw.mcfunction ================================================ #run from advancement inventory_changed #@s = player with iacio shamir equipped advancement revoke @s only gm4_iacio_shamir:inventory_changed execute if score @s gm4_iacio_tridnt matches 1.. as @e[type=minecraft:trident,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_item matches 1.. as @e[type=item,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_pearl matches 1.. as @e[type=minecraft:ender_pearl,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_snowbl matches 1.. as @e[type=minecraft:snowball,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_egg matches 1.. as @e[type=minecraft:egg,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_splash matches 1.. as @e[type=minecraft:splash_potion,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion execute if score @s gm4_iacio_linger matches 1.. as @e[type=minecraft:lingering_potion,distance=..3,sort=nearest,limit=1] at @s run function gm4_iacio_shamir:add_motion scoreboard players reset @s gm4_iacio_tridnt scoreboard players reset @s gm4_iacio_item scoreboard players reset @s gm4_iacio_pearl scoreboard players reset @s gm4_iacio_snowbl scoreboard players reset @s gm4_iacio_egg scoreboard players reset @s gm4_iacio_splash scoreboard players reset @s gm4_iacio_linger ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/function/init.mcfunction ================================================ scoreboard objectives add gm4_iacio_tridnt minecraft.used:minecraft.trident scoreboard objectives add gm4_iacio_item minecraft.custom:minecraft.drop scoreboard objectives add gm4_iacio_pearl minecraft.used:minecraft.ender_pearl scoreboard objectives add gm4_iacio_snowbl minecraft.used:minecraft.snowball scoreboard objectives add gm4_iacio_egg minecraft.used:minecraft.egg scoreboard objectives add gm4_iacio_splash minecraft.used:minecraft.splash_potion scoreboard objectives add gm4_iacio_linger minecraft.used:minecraft.lingering_potion execute unless score iacio_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Iacio shamir"} execute unless score iacio_shamir gm4_earliest_version < iacio_shamir gm4_modules run scoreboard players operation iacio_shamir gm4_earliest_version = iacio_shamir gm4_modules scoreboard players set iacio_shamir gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/iacio via #gm4_metallurgy:summon_band/iacio loot spawn ~ ~ ~ loot gm4_iacio_shamir:band ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/guidebook/iacio_shamir.json ================================================ { "id": "iacio_shamir", "name": "Iacio Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_iacio_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'iacio'}}" } } ] } }, "obtain_iacio_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'iacio'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.iacio_shamir.description", "fallback": "Iacio strengthens the throw of projectiles and items." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_iacio_shamir", "obtain_iacio_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.iacio_shamir.usage", "fallback": "The Iacio Shamir is found on Barium Bands. It can be placed onto chestplates.\n\nItems, Tridents, Ender Pearls, Splash and Lingering Potions, Snowballs, and Eggs will fly farther when thrown." } ] ] } ] } ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_iacio_shamir:shamir/iacio"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'iacio'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.iacio", "fallback": "Iacio Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:chest_armor" ] } ================================================ FILE: gm4_iacio_shamir/data/gm4_iacio_shamir/test/throw_item.mcfunction ================================================ # @template gm4_iacio_shamir:test_long_platform # @dummy ~ ~1 ~1 execute at @s run tp @s ~ ~ ~ 270 0 item replace entity @s weapon.mainhand with minecraft:iron_ingot await delay 1t dummy @s drop await items entity @e[type=item,dx=12,dy=2,dz=2,distance=3..5,nbt={OnGround:1b}] contents minecraft:iron_ingot item replace entity @s armor.chest with minecraft:iron_chestplate[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"iacio"}}] await delay 1t item replace entity @s weapon.mainhand with minecraft:gold_ingot await delay 1t dummy @s drop await items entity @e[type=item,dx=12,dy=2,dz=2,distance=6..,nbt={OnGround:1b}] contents minecraft:gold_ingot ================================================ FILE: gm4_iacio_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_iacio_shamir:check_item_validity" ] } ================================================ FILE: gm4_iacio_shamir/data/gm4_metallurgy/tags/function/summon_band/barium.json ================================================ { "values": [ "gm4_iacio_shamir:summon_band" ] } ================================================ FILE: gm4_iacio_shamir/translations.csv ================================================ key,en_us item.gm4.shamir.iacio,Iacio Shamir text.gm4.guidebook.module_desc.iacio_shamir,Adds the 'Iacio' shamir to Metallurgy. It lets you throw things further! Launch an Ender Pearl into orbit or simply throw your Trident exceptionally far. text.gm4.guidebook.iacio_shamir.description,Iacio strengthens the throw of projectiles and items. text.gm4.guidebook.iacio_shamir.usage,"The Iacio Shamir is found on Barium Bands. It can be placed onto chestplates.\n\nItems, Tridents, Ender Pearls, Splash and Lingering Potions, Snowballs, and Eggs will fly farther when thrown." ================================================ FILE: gm4_ink_spitting_squid/README.md ================================================ # Ink Spitting Squid For too long have Squid been defenceless, now it's time for them to fight back! Or at least annoy you with some ink while you continue killing them. ### Features - Squid will spit blinding ink on nearby players for 5 seconds. - Glow Squid will instead inflict glowing and night vision. - Only affects players that have their head submerged in water. ================================================ FILE: gm4_ink_spitting_squid/beet.yaml ================================================ id: gm4_ink_spitting_squid name: Ink Spitting Squid version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: ink_sac reference: gui/advancement/ink_spitting_squid template: advancement - item: glow_ink_sac reference: gui/advancement/glow_ink_spitting_squid template: advancement website: description: Improves the vanilla ink effect by adding Blindness. Glow Squid will give Night Vision when disturbed, which might come in handy if you're out of torches! recommended: [] notes: [] modrinth: project_id: ljOfYHJv planetminecraft: uid: 4581763 video: https://www.youtube.com/watch?v=68LMYEhueZ0 wiki: https://wiki.gm4.co/wiki/Ink_Spitting_Squid credits: Creator: - Energyxxer Updated by: - BPR Icon Design: - Sparks ================================================ FILE: gm4_ink_spitting_squid/data/gm4/advancement/glow_ink_spitting_squid.json ================================================ { "display": { "icon": { "id": "minecraft:glow_ink_sac", "components": { "minecraft:custom_model_data": {"strings":["gm4_ink_spitting_squid:gui/advancement/glow_ink_spitting_squid"]} } }, "title": { "translate": "advancement.gm4.glow_ink_spitting_squid.title", "fallback": "The Light, It Burns!" }, "description": { "translate": "advancement.gm4.glow_ink_spitting_squid.description", "fallback": "Glow due to an underwater glow squid", "color": "gray" }, "frame": "goal" }, "parent": "gm4:ink_spitting_squid", "criteria": { "glow_ink_squirt_hit": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_ink_spitting_squid/data/gm4/advancement/ink_spitting_squid.json ================================================ { "display": { "icon": { "id": "minecraft:ink_sac", "components": { "minecraft:custom_model_data": {"strings":["gm4_ink_spitting_squid:gui/advancement/ink_spitting_squid"]} } }, "title": { "translate": "advancement.gm4.ink_spitting_squid.title", "fallback": "Natural Defenses" }, "description": { "translate": "advancement.gm4.ink_spitting_squid.description", "fallback": "Get blinded by an underwater squid", "color": "gray" } }, "parent": "gm4:root", "criteria": { "ink_squirt_hit": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/glow_squid_squirt.mcfunction ================================================ #@s = a player near a glow squid in water #run from main effect give @s glowing 5 effect give @s night_vision 5 playsound minecraft:entity.glow_squid.hurt hostile @a[distance=..5] ~ ~ ~ 1 2 particle minecraft:glow_squid_ink ^ ^ ^.5 .1 0 .1 0.05 10 normal @s advancement grant @s only gm4:glow_ink_spitting_squid ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/init.mcfunction ================================================ execute unless score ink_spitting_squid gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Ink Spitting Squid"} execute unless score ink_spitting_squid gm4_earliest_version < ink_spitting_squid gm4_modules run scoreboard players operation ink_spitting_squid gm4_earliest_version = ink_spitting_squid gm4_modules scoreboard players set ink_spitting_squid gm4_modules 1 schedule function gm4_ink_spitting_squid:main 1t #$moduleUpdateList ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/main.mcfunction ================================================ execute at @e[type=squid,tag=!smithed.entity] as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^ if predicate gm4_ink_spitting_squid:inkable run function gm4_ink_spitting_squid:squid_squirt execute at @e[type=glow_squid,tag=!smithed.entity] as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^ if predicate gm4_ink_spitting_squid:inkable run function gm4_ink_spitting_squid:glow_squid_squirt schedule function gm4_ink_spitting_squid:main 16t ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/function/squid_squirt.mcfunction ================================================ #@s = a player near a squid in water #run from main effect give @s nausea 5 effect give @s blindness 5 playsound minecraft:entity.squid.hurt hostile @a[distance=..5] ~ ~ ~ 1 2 particle minecraft:squid_ink ^ ^ ^.5 .1 0 .1 0.05 10 normal @s advancement grant @s only gm4:ink_spitting_squid ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/guidebook/ink_spitting_squid.json ================================================ { "id": "ink_spitting_squid", "name": "Ink Spitting Squid", "module_type": "module", "icon": { "id": "minecraft:ink_sac" }, "criteria": { "inked": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:ink_spitting_squid": true } } } } ] } }, "glow_inked": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:glow_ink_spitting_squid": true } } } } ] } } }, "sections": [ { "name": "normal_squid", "enable": [], "requirements": [ [ "inked" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.ink_spitting_squid.normal_squid", "fallback": "Swimming underwater near a squid will cause it to ink the diver.\n\nWhen affected by squid ink, blindness and nausea effects occur." } ] ] }, { "name": "glow_squid", "enable": [], "requirements": [ [ "glow_inked" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.ink_spitting_squid.glow_squid", "fallback": "When glow squids ink, they have the opposite effect from squids.\n\nThose inked with glow ink are affected by night vision and glowing." } ] ], "grants": [ "normal_squid" ] } ] } ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/predicate/inkable.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "effects": { "minecraft:conduit_power": { "duration": { "min": 1 } } } } } }, { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] ================================================ FILE: gm4_ink_spitting_squid/data/gm4_ink_spitting_squid/test/squirt.mcfunction ================================================ # @template gm4_ink_spitting_squid:test_tank # @dummy ~1 ~1 ~1 summon squid ~2 ~1 ~2 await entity @s[nbt={active_effects:[{id:"minecraft:blindness"},{id:"minecraft:nausea"}]}] ================================================ FILE: gm4_ink_spitting_squid/translations.csv ================================================ key,en_us advancement.gm4.ink_spitting_squid.title,Natural Defenses advancement.gm4.ink_spitting_squid.description,Get blinded by an underwater squid advancement.gm4.glow_ink_spitting_squid.title,"The Light, It Burns!" advancement.gm4.glow_ink_spitting_squid.description,Glow due to an underwater glow squid text.gm4.guidebook.module_desc.ink_spitting_squid,"Improves the vanilla ink effect by adding Blindness. Glow Squid will give Night Vision when disturbed, which might come in handy if you're out of torches!" text.gm4.guidebook.ink_spitting_squid.normal_squid,"Swimming underwater near a squid will cause it to ink the diver.\n\nWhen affected by squid ink, blindness and nausea effects occur." text.gm4.guidebook.ink_spitting_squid.glow_squid,"When glow squids ink, they have the opposite effect from squids.\n\nThose inked with glow ink are affected by night vision and glowing." ================================================ FILE: gm4_lavish_livestock/README.md ================================================ # Lavish Livestock Selectively breed your livestock for increased yields! Commercialize your farming! ### Features - Breeding livestock may result in offspring that is abnormally large - Larger livestock drops more loot ================================================ FILE: gm4_lavish_livestock/beet.yaml ================================================ id: gm4_lavish_livestock name: Lavish Livestock version: 1.1.0 data_pack: load: . resource_pack: load: . require: - bolt pipeline: - gm4_lavish_livestock.generate - gm4.plugins.extend.module meta: livestock: - chicken - cow - hoglin - mooshroom - pig - rabbit - sheep gm4: versioning: schedule_loops: [] website: description: Selectively breed your livestock for increased yields! Commercialize your farming! recommended: - gm4_pig_tractors - metallurgy video: null #modrinth: # project_id: #smithed: # pack_id: #planetminecraft: # uid: wiki: https://wiki.gm4.co/wiki/Lavish_Livestock credits: Creator: - Bloo ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/function/init.mcfunction ================================================ execute unless score lavish_livestock gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Lavish Livestock"} execute unless score lavish_livestock gm4_earliest_version < lavish_livestock gm4_modules run scoreboard players operation lavish_livestock gm4_earliest_version = lavish_livestock gm4_modules scoreboard players set lavish_livestock gm4_modules 1 scoreboard objectives add gm4_lavish_livestock_size dummy #$moduleUpdateList ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/guidebook/lavish_livestock.json ================================================ { "id": "lavish_livestock", "name": "Lavish Livestock", "module_type": "module", "icon": { "id": "minecraft:wheat" }, "criteria": { "breed": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "#gm4_lavish_livestock:livestock" } } } }, "sections": [ { "name": "display", "enable": [], "requirements": [ [ "breed" ] ], "pages": [ [ { "insert": "title" }, { "text":"\n" }, { "translate": "text.gm4.guidebook.lavish_livestock.description", "fallback": "Breeding livestock may result in offspring that is abnormally large.\n\nLarger livestock drops more loot." } ], [ { "translate":"text.gm4.guidebook.lavish_livestock.list_header", "fallback":"Livestock", "underlined":true }, {"text":"\n\n"}, {"translate":"entity.minecraft.chicken", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.cow", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.hoglin", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.mooshroom", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.pig", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.rabbit", "underlined":false}, {"text":"\n"}, {"translate":"entity.minecraft.sheep", "underlined":false} ] ] } ] } ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/tags/entity_type/livestock.json ================================================ { "values": ctx.meta['livestock'] } ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/advancement/breed.json ================================================ { "criteria": { "breed_{{ entity_id }}": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "{{ entity_id }}" } } } }, "rewards": { "function": "gm4_lavish_livestock:{{ entity_id }}/revoke_advancement" } } ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/determine_parent.mcfunction ================================================ # Stores the size of each parent into a score # @s = parent of the baby # at location of player who has fed the parent # run from gm4_lavish_livestock:{{ entity_id }}/revoke_advancement # init score if parent does not have a score scoreboard players add @s gm4_lavish_livestock_size 0 # store size of parent into fixed fake player (only one of these triggers, the other one triggers for the other parent) execute if score $parent_a gm4_lavish_livestock_size matches -1 run return run scoreboard players operation $parent_a gm4_lavish_livestock_size = @s gm4_lavish_livestock_size execute if score $parent_b gm4_lavish_livestock_size matches -1 run return run scoreboard players operation $parent_b gm4_lavish_livestock_size = @s gm4_lavish_livestock_size ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/find_baby.mcfunction ================================================ # Selects babies near the breeding site # @s = breeding site # at @s # run from gm4_lavish_livestock:{{ entity_id }}/find_marker # cache parent size scoreboard players operation $size gm4_lavish_livestock_size = @s gm4_lavish_livestock_size execute as @e[type={{ entity_id }},distance=..10,nbt={Age:-24000},limit=1,sort=nearest] run function gm4_lavish_livestock:{{ entity_id }}/modify_baby # remove breeding site marker kill @s ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/find_marker.mcfunction ================================================ # Called once the parent has given birth and initiates breeding sites to look for babies. # @s = undefined # at undefined # scheduled from gm4_lavish_livestock:{{ entity_id }}/revoke_advancement execute as @e[type=marker,tag=gm4_lavish_livestock_breeding_site,tag=gm4_lavish_livestock_{{ entity_id }}] at @s run function gm4_lavish_livestock:{{ entity_id }}/find_baby ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/initialize_marker.mcfunction ================================================ # Initializes the breeding site marker which sticks around awaiting birth # @s = new breeding site marker # at location of player who has fed the parent # run from gm4_lavish_livestock:{{ entity_id }}/determine_parent scoreboard players operation @s gm4_lavish_livestock_size = $parent_a gm4_lavish_livestock_size tag @s add gm4_lavish_livestock_breeding_site tag @s add gm4_lavish_livestock_{{ entity_id }} ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/modify_baby.mcfunction ================================================ # Sets the size of the newborn baby # @s = the newborn baby # at location of breeding site marker # run from gm4_lavish_livestock:{{ entity_id }}/find_baby # get baby size from marker value scoreboard players operation @s gm4_lavish_livestock_size = $size gm4_lavish_livestock_size # if non-vanilla size: add loot table and tag entity (tag is for future-proofing only, it is not currently read) execute if score @s gm4_lavish_livestock_size matches 1.. run tag @s add gm4_lavish_livestock_{{ entity_id }} execute if score @s gm4_lavish_livestock_size matches 1.. run data modify entity @s DeathLootTable set value "gm4_lavish_livestock:{{ entity_id }}/lavish_death" # set scale attribute execute if score @s gm4_lavish_livestock_size matches 1 run attribute @s minecraft:scale modifier add gm4_lavish_livestock:size 0.125 add_multiplied_base execute if score @s gm4_lavish_livestock_size matches 2 run attribute @s minecraft:scale modifier add gm4_lavish_livestock:size 0.25 add_multiplied_base ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/function/revoke_advancement.mcfunction ================================================ # Revokes the breeding advancement and initiates baby tracking # @s = player who bred livestock # at @s # run from advancement gm4_lavish_livestock:{{ entity_id }}/breed advancement revoke @s only gm4_lavish_livestock:{{ entity_id }}/breed # get parent sizes scoreboard players set $parent_a gm4_lavish_livestock_size -1 scoreboard players set $parent_b gm4_lavish_livestock_size -1 execute as @e[type={{ entity_id }},distance=..10,limit=2,sort=nearest,nbt=!{InLove:0}] run function gm4_lavish_livestock:{{ entity_id }}/determine_parent # if the parents differ in size, chose the smaller one execute if score $parent_a gm4_lavish_livestock_size > $parent_b gm4_lavish_livestock_size run scoreboard players operation $parent_a gm4_lavish_livestock_size >< $parent_b gm4_lavish_livestock_size # if both parents are the same size, roll dice for size increase execute if score $parent_a gm4_lavish_livestock_size = $parent_b gm4_lavish_livestock_size if predicate {condition:"minecraft:random_chance",chance:0.025} run scoreboard players add $parent_a gm4_lavish_livestock_size 1 # store size onto marker and wait for baby to be born execute summon marker run function gm4_lavish_livestock:{{ entity_id }}/initialize_marker schedule function gm4_lavish_livestock:{{ entity_id }}/find_marker 1t ================================================ FILE: gm4_lavish_livestock/data/gm4_lavish_livestock/templates/loot_table/lavish_death.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": { "type": "minecraft:score", "target": { "type": "minecraft:context", "target": "this" }, "score": "gm4_lavish_livestock_size", "scale": 2.5 }, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/{{ entity_id }}" } ] } ], "random_sequence": "minecraft:entities/{{ entity_id }}" } ================================================ FILE: gm4_lavish_livestock/generate.py ================================================ import logging from beet import Context, subproject logger = logging.getLogger(__name__) def beet_default(ctx: Context): # List of supported animals defined in beet.yaml as well as the guidebook page # for each supported entity, render a copy of the "templates" directory with the appropriate entity-id for entity in ctx.meta['livestock']: subproject_config = { "data_pack": { "load": [ { f"data/gm4_lavish_livestock/advancement/{entity}": "data/gm4_lavish_livestock/templates/advancement", f"data/gm4_lavish_livestock/function/{entity}": "data/gm4_lavish_livestock/templates/function", f"data/gm4_lavish_livestock/loot_table/{entity}": "data/gm4_lavish_livestock/templates/loot_table", } ], "render": { "advancement": "*", "function": "*", "loot_table": "*" } }, "meta": { "entity_id": entity } } ctx.require(subproject(subproject_config)) ================================================ FILE: gm4_lavish_livestock/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.lavish_livestock,"Selectively breed your livestock for increased yields! Commercialize your farming!" text.gm4.guidebook.lavish_livestock.description,"Breeding livestock may result in offspring that is abnormally large.\n\nLarger livestock drops more loot." text.gm4.guidebook.lavish_livestock.list_header,"Livestock" ================================================ FILE: gm4_lightning_in_a_bottle/README.md ================================================ # Lightning in a Bottle Harness the power of lighting, whenever you feel like it! ### Features - Allows the capturing of lightning during a storm by getting a lighting strike to hit a brewing stand - Throwing the bottle spawns lightning upon making contact with a block - Certain blocks can now become animated, for example Purpur Blocks turn into Shulkers. Read more about specific block conversions on the [Wiki](https://wiki.gm4.co/Lightning_in_a_Bottle). ================================================ FILE: gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/lightning_in_a_bottle_overlay.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": false } } ================================================ FILE: gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/lingering_lightning_in_a_bottle_overlay.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": false } } ================================================ FILE: gm4_lightning_in_a_bottle/assets/gm4_lightning_in_a_bottle/textures/item/splash_lightning_in_a_bottle_overlay.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": false } } ================================================ FILE: gm4_lightning_in_a_bottle/assets/translations.csv ================================================ key,en_us advancement.gm4.lightning_in_a_bottle.lightning_drink.description,Drink a Bottle of Lightning advancement.gm4.lightning_in_a_bottle.lightning_drink.title,Shocking! advancement.gm4.lightning_in_a_bottle.lightning_shulker.description,Strike a Purpur Block with lightning to create a Shulker advancement.gm4.lightning_in_a_bottle.lightning_shulker.title,It's Alive! container.gm4.liquid_tank.liab_lightning,Lightning Tank effect.gm4.lightning_in_a_bottle.lightning,Lightning item.gm4.bottle.effect.lightning,Bottle of Lightning item.gm4.lingering_bottle.effect.lightning,Lingering Bottle of Lightning item.gm4.splash_bottle.effect.lightning,Splash Bottle of Lightning text.gm4.guidebook.module_desc.lightning_in_a_bottle,"Bottle and harness the power of lightning using Brewing Stands! Lightning in a Bottle comes in splash and lingering variants, too." text.gm4.guidebook.lightning_in_a_bottle.description,"Lightning can be absorbed into a thick potion when struck by lightning.\n\nPillagers, evokers, purpur, and prismarine can amplify or animate into new mobs when struck by lightning." text.gm4.guidebook.lightning_in_a_bottle.conversions,Pillagers can be amplified into Evokers.\nEvokers can be amplified into Illusioners.\n\nPurpur Blocks can be animated into Shulkers.\nPrismarine Bricks can be animated into Guardians. text.gm4.guidebook.lightning_in_a_bottle.obtaining,"To harness lightning, place a lightning rod attached to the top or bottom of a brewing stand.\n\nWhen the rod is struck, any thick potions inside the brewing stand will be converted into bottles of lightning." text.gm4.guidebook.lightning_in_a_bottle.usage,"Splash and Lingering variants can be brewed as normal.\n\nWhen a bottle of lightning is drank or thrown, it will release a bolt of lightning!" ================================================ FILE: gm4_lightning_in_a_bottle/beet.yaml ================================================ id: gm4_lightning_in_a_bottle name: Lightning in a Bottle version: 1.9.X data_pack: load: . resource_pack: load: . require: - bolt pipeline: - gm4_liquid_tanks.bolt_liquid_wrappers - gm4.plugins.extend.module - gm4.plugins.include.lib_brewing - gm4.plugins.include.lib_potion_tracking meta: bolt: entrypoint: gm4_lightning_in_a_bottle:liquid_tanks/liquid_features gm4: versioning: required: lib_potion_tracking: 1.4.0 lib_brewing: 1.5.0 schedule_loops: - main - brewing_stand/texture_connector/process model_data: - template: generated_overlay broadcast: - item: potion reference: item/lightning_in_a_bottle - item: lingering_potion reference: item/lingering_lightning_in_a_bottle - item: splash_potion reference: item/splash_lightning_in_a_bottle - item: potion reference: gui/advancement/lightning_in_a_bottle_drink template: name: advancement forward: item/lightning_in_a_bottle - item: purpur_block reference: gui/advancement/lightning_in_a_bottle_shulker template: advancement website: description: Bottle and harness the power of lightning using Brewing Stands! Lightning in a Bottle comes in splash and lingering variants, too. recommended: - gm4_resource_pack - gm4_liquid_tanks - gm4_potion_liquids - gm4_spawner_minecarts notes: - Brewing Stands may need to be broken and replaced to be able to craft Lightning in a Bottle when the module is first installed. modrinth: project_id: GVqJxowR wiki: https://wiki.gm4.co/wiki/Lightning_in_a_Bottle credits: Creator: - Bloo - BPR - TheEpyonProject Icon Design: - BPR ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4/advancement/lightning_in_a_bottle_drink.json ================================================ { "display": { "icon": { "id": "minecraft:potion", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_lightning_in_a_bottle:gui/advancement/lightning_in_a_bottle_drink"]}, "minecraft:potion_contents": { "custom_color": 11985402 } } }, "title": { "translate": "advancement.gm4.lightning_in_a_bottle.lightning_drink.title", "fallback": "Shocking!" }, "description": { "translate": "advancement.gm4.lightning_in_a_bottle.lightning_drink.description", "fallback": "Drink a Bottle of Lightning", "color": "gray" } }, "parent": "gm4:root", "criteria": { "requirement": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4/advancement/lightning_in_a_bottle_shulker.json ================================================ { "display": { "icon": { "id": "minecraft:purpur_block", "components": { "minecraft:custom_model_data": {"strings":["gm4_lightning_in_a_bottle:gui/advancement/lightning_in_a_bottle_shulker"]} } }, "title": { "translate": "advancement.gm4.lightning_in_a_bottle.lightning_shulker.title", "fallback": "It's Alive!" }, "description": { "translate": "advancement.gm4.lightning_in_a_bottle.lightning_shulker.description", "fallback": "Strike a Purpur Block with lightning to create a Shulker", "color": "gray" } }, "parent": "gm4:lightning_in_a_bottle_drink", "criteria": { "requirement": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_brewing/tags/function/insert/lingering.json ================================================ { "values": [ "gm4_lightning_in_a_bottle:brewing_stand/brew/lingering" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_brewing/tags/function/insert/splash.json ================================================ { "values": [ "gm4_lightning_in_a_bottle:brewing_stand/brew/splash" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/drink_lightning.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_lightning_in_a_bottle:1b}" } } } } }, "rewards": { "function": "gm4_lightning_in_a_bottle:lightning/strike_self" } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/lightning_strike.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:lightning_strike", "conditions": { "lightning": { "distance": { "absolute": { "min": 0, "max": 64 } } } } } }, "rewards": { "function": "gm4_lightning_in_a_bottle:lightning/locate" } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/advancement/place_lightning_rod.json ================================================ { "criteria": { "place_lightning_rod": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": "#gm4_lightning_in_a_bottle:lightning_rod" } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:brewing_stand" ] } } } ] } } }, "rewards": { "function": "gm4_lightning_in_a_bottle:brewing_stand/texture_connector/force_update" } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/brew/lingering.mcfunction ================================================ # @s = brewing stand marker with a custom potion to be converted to a lingering potion # run from #gm4_brewing:insert/lingering loot spawn ~ ~ ~ loot gm4_lightning_in_a_bottle:technical/brewing_stand/lingering ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/brew/splash.mcfunction ================================================ # @s = brewing stand marker with a custom potion to be converted to a splash potion # run from #gm4_brewing:insert/splash loot spawn ~ ~ ~ loot gm4_lightning_in_a_bottle:technical/brewing_stand/splash ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/check_fuel.mcfunction ================================================ # Checks if there is fuel in the Brewing Stand # positioned at brewing stand # runs from lightning/check execute store result score $fuel gm4_liab_data run data get block ~ ~ ~ Fuel execute if score $fuel gm4_liab_data matches 1.. run function gm4_lightning_in_a_bottle:brewing_stand/check_potions scoreboard players reset $fuel gm4_liab_data ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/check_potions.mcfunction ================================================ # Checks if there are regular Thick Potions in the Brewing Stand # positioned at brewing stand # runs from brewing_stand/check_fuel # attempt to "brew" Bottles of Lightning scoreboard players set $potion_success gm4_liab_data 0 execute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.0 gm4_lightning_in_a_bottle:brew_lightning execute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.1 gm4_lightning_in_a_bottle:brew_lightning execute store success score $potion_success gm4_liab_data run item modify block ~ ~ ~ container.2 gm4_lightning_in_a_bottle:brew_lightning # consume fuel, if succcess execute if score $potion_success gm4_liab_data matches 1 run function gm4_lightning_in_a_bottle:brewing_stand/consume_fuel scoreboard players reset $potion_success gm4_liab_data ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/consume_fuel.mcfunction ================================================ # Consume fuel if Bottle of Lightning successfully brewed # @s = lightning bolt # positioned at brewing stand # runs from brewing_stand/check_potions # get random fuel cost execute store result score $fuel_cost gm4_liab_data run random value 1..3 # subtract fuel cost from Fuel and set to block's Fuel scoreboard players operation $fuel gm4_liab_data -= $fuel_cost gm4_liab_data execute store result block ~ ~ ~ Fuel int 1 run scoreboard players get $fuel gm4_liab_data ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/force_update.mcfunction ================================================ # forces nearby texture_connectors to update # @s = player who has placed a lightning rod on a brewing stand # at @s # run from advancement place_lightning_rod # revoke advancement advancement revoke @s only gm4_lightning_in_a_bottle:place_lightning_rod # add texture connectors to nearby brewing stands execute as @e[type=marker,tag=gm4_brewing_stand,distance=..8] at @s if block ~ ~1 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] \ align xyz unless entity @e[tag=gm4_lightning_rod_texture_connector,dy=0.01,limit=1] run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/process.mcfunction ================================================ # scheduled from main and self schedule function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/process 16t # process texture connectors for removal or texture change execute as @e[type=item_display,tag=gm4_lightning_rod_texture_connector] at @s run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/update ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/summon.mcfunction ================================================ # summons correct texture connector # @s = @e[type=marker,tag=gm4_brewing_stand] or @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector] # at @s align xyz # run from brewing_stand/texture_connector/force_update and main and upgrade_paths/1.4 # normal execute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:normal_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:["gm4_lightning_rod_texture_connector"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$texture_connector"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}} # exposed execute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:exposed_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:["gm4_lightning_rod_texture_connector"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$texture_connector_exposed"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}} # weathered execute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:weathered_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:["gm4_lightning_rod_texture_connector"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$texture_connector_weathered"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}} # oxidized execute if block ~ ~1 ~ #gm4_lightning_in_a_bottle:oxidized_lightning_rod run summon item_display ~0.5 ~1 ~0.5 {Tags:["gm4_lightning_rod_texture_connector"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$texture_connector_oxidized"}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0f,0f],scale:[0.25,0.25,0.25]}} ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/brewing_stand/texture_connector/update.mcfunction ================================================ # @s = @e[type=item_display,tag=gm4_lightning_rod_texture_connector] # at @s # run from brewing_stand/texture_connector/process # kill if unneeded execute unless block ~ ~-0.1 ~ minecraft:brewing_stand run return run kill @s execute unless block ~ ~ ~ #gm4_lightning_in_a_bottle:lightning_rod run return run kill @s # update texture scoreboard players set $texture_changed gm4_liab_data 0 # normal execute unless score @s gm4_liab.oxidization matches 1 if block ~ ~ ~ #gm4_lightning_in_a_bottle:normal_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {"minecraft:profile":"$texture_connector"} execute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 1 # exposed execute unless score @s gm4_liab.oxidization matches 2 if block ~ ~ ~ #gm4_lightning_in_a_bottle:exposed_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {"minecraft:profile":"$texture_connector_exposed"} execute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 2 # weathered execute unless score @s gm4_liab.oxidization matches 3 if block ~ ~ ~ #gm4_lightning_in_a_bottle:weathered_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {"minecraft:profile":"$texture_connector_weathered"} execute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 3 # oxidized execute unless score @s gm4_liab.oxidization matches 4 if block ~ ~ ~ #gm4_lightning_in_a_bottle:oxidized_lightning_rod store success score $texture_changed gm4_liab_data run data modify entity @s item.components merge value {"minecraft:profile":"$texture_connector_oxidized"} execute if score $texture_changed gm4_liab_data matches 1 run return run scoreboard players set @s gm4_liab.oxidization 4 ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/evoker.mcfunction ================================================ # Creates an Evoker from a Pillager # @s = pillager # at @s # run from lightning/check tag @s add gm4_liab_new_evoker # Spawn new mob summon evoker ~ ~ ~ {Tags:["gm4_liab_new_evoker"]} # Copies old mob data data modify entity @e[type=evoker,tag=gm4_liab_new_evoker,limit=1,distance=0] {} merge from entity @s {} # But modifies the loot table, if it does not already exist, and fully heals the new mob execute as @e[type=evoker,tag=gm4_liab_new_evoker] run execute unless data entity @s DeathLootTable run data merge entity @s {Health:24f} tag @e[type=evoker] remove gm4_liab_new_evoker # kill old mob tp @s ~ -10000 ~ ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/guardian.mcfunction ================================================ # Creates a Guardian from Prismarine Bricks # @s = lightning bolt # positioned 1 block above Prismarine Bricks # run from lightning/check setblock ~ ~ ~ air summon guardian ~ ~ ~ {active_effects:[{id:'minecraft:regeneration',duration:20,amplifier:10b,show_particles:0b}]} # set fake player flag scoreboard players set $found_block gm4_liab_data 1 ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/illusioner.mcfunction ================================================ # Creates an Illusioner from a Evoker # @s = evoker # at @s # run from lightning/check tag @s add gm4_liab_new_illusioner # Spawn new mob summon illusioner ~ ~ ~ {Tags:["gm4_liab_new_illusioner"]} # Copies old mob data data modify entity @e[type=illusioner,tag=gm4_liab_new_illusioner,limit=1,distance=0] {} merge from entity @s {} # But modifies the loot table, if it does not already exist, and fully heals the new mob execute as @e[type=illusioner,tag=gm4_liab_new_illusioner] run execute unless data entity @s DeathLootTable run data merge entity @s {DeathLootTable:"gm4_lightning_in_a_bottle:entities/illusioner",Health:32f} tag @e[type=illusioner] remove gm4_liab_new_illusioner # Kill old mob tp @s ~ -10000 ~ ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/entity/shulker.mcfunction ================================================ # Creates a Shulker from a Purpur Block # @s = lightning bolt # positioned 1 block above a Purpur Block # run from lightning/check setblock ~ ~ ~ air summon shulker ~ ~-.49 ~ {active_effects:[{id:'minecraft:regeneration',duration:20,amplifier:10b,show_particles:0b}],Color:16,DeathLootTable:"gm4_lightning_in_a_bottle:entities/shulker"} advancement grant @a[distance=..5,gamemode=!spectator] only gm4:lightning_in_a_bottle_shulker # set fake player flag scoreboard players set $found_block gm4_liab_data 1 ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/init.mcfunction ================================================ scoreboard objectives add gm4_liab_data dummy scoreboard objectives add gm4_liab.oxidization dummy execute unless score lightning_in_a_bottle gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Lightning in a Bottle"} execute unless score lightning_in_a_bottle gm4_earliest_version < lightning_in_a_bottle gm4_modules run scoreboard players operation lightning_in_a_bottle gm4_earliest_version = lightning_in_a_bottle gm4_modules scoreboard players set lightning_in_a_bottle gm4_modules 1 schedule function gm4_lightning_in_a_bottle:main 2t schedule function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/process 8t ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/check.mcfunction ================================================ # Creates and empowers certain mobs and creates Bottles of Lightning # @s = lightning bolt # at @s # run from lightning/locate # tag processed lightning tag @s add gm4_liab_processed # create Bottles of Lightning from Thick Potions in Brewing Stands under (or above) Lightning Rods execute if block ~ ~-.01 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] if block ~ ~-1.01 ~ brewing_stand positioned ~ ~-1.01 ~ run function gm4_lightning_in_a_bottle:brewing_stand/check_fuel execute if block ~ ~-.01 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=down] if block ~ ~.99 ~ brewing_stand positioned ~ ~.99 ~ run function gm4_lightning_in_a_bottle:brewing_stand/check_fuel # Lightning-based mob transformation # Evokers -> Illusioners execute align xyz positioned ~-3 ~-2 ~-3 as @e[type=evoker,tag=!smithed.entity,dx=6,dy=11,dz=6] at @s run function gm4_lightning_in_a_bottle:entity/illusioner # Pillagers -> Evokers execute align xyz positioned ~-3 ~-2 ~-3 as @e[type=pillager,tag=!smithed.entity,dx=6,dy=11,dz=6] at @s run function gm4_lightning_in_a_bottle:entity/evoker # Creeper Spawners struck by the lightning will become Charged Creepers Spawners execute align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ spawner{SpawnData:{entity:{id:"minecraft:creeper"}}} unless entity @e[tag=!smithed.block,distance=..0.5] run data merge block ~ ~ ~ {MaxSpawnDelay:801s,SpawnData:{entity:{id:"minecraft:creeper",powered:1b}},SpawnPotentials:[{data:{entity:{id:"minecraft:creeper",powered:1b,DeathLootTable:"gm4_lightning_in_a_bottle:entities/charged_creeper"}},weight:1}]} # Lightning-based block -> entity transformation # inside strike location execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ purpur_block unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/shulker execute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ prismarine_bricks unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/guardian # below strike location execute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ purpur_block unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/shulker execute unless score $found_block gm4_liab_data matches 1.. align xyz positioned ~0.5 ~-0.5 ~0.5 if block ~ ~ ~ prismarine_bricks unless entity @e[tag=smithed.block,distance=..0.5] run function gm4_lightning_in_a_bottle:entity/guardian # other lightning-based expansions can happen after function #gm4_lightning_in_a_bottle:lightning_strike # reset fake players scoreboard players reset $found_block gm4_liab_data ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/locate.mcfunction ================================================ # A player near a lightning strike # @s = player, near lightning strike # at @s # run from advancement, gm4_lightning_in_a_bottle:lightning_strike advancement revoke @s only gm4_lightning_in_a_bottle:lightning_strike # Check every lightning bolt execute as @e[type=lightning_bolt,tag=!gm4_liab_processed] at @s run function gm4_lightning_in_a_bottle:lightning/check ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/lightning/strike_self.mcfunction ================================================ # player drinking Bottle of Lightning # @s = player that drank Bottle of Lightning # at @s # from advancement, gm4:lightning_drink advancement revoke @s only gm4_lightning_in_a_bottle:drink_lightning summon lightning_bolt ~ ~ ~ effect give @s speed 2 3 advancement grant @s only gm4:lightning_in_a_bottle_drink ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/main.mcfunction ================================================ # find lightning aecs execute as @e[type=area_effect_cloud,tag=gm4_liab_lingering,predicate=gm4_lightning_in_a_bottle:random_strike] at @s run function gm4_lightning_in_a_bottle:sustain_lingering_lightning # summon lightning rod - brewing stand connectors if needed execute as @e[type=marker,tag=gm4_brewing_stand] at @s if block ~ ~1 ~ #gm4_lightning_in_a_bottle:lightning_rod[facing=up] \ align xyz unless entity @e[tag=gm4_lightning_rod_texture_connector,dy=0.01,limit=1] run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon schedule function gm4_lightning_in_a_bottle:main 4s ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/modify_cloud.mcfunction ================================================ # change the lingering bottle's cloud particle effects # @s = aec with LiaB thrown lingering bottle effects # at a nearby gm4_liab_potion_tracker marker # run from potion_tracking/potion_landed tag @s add gm4_liab_lingering data merge entity @s {custom_particle:{type:"minecraft:electric_spark"},RadiusOnUse:0f,RadiusPerTick:0f} ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/potion_landed.mcfunction ================================================ # force-kills tracker markers in case they are in lazy loaded chunks # @s = gm4_liab_potion_tracker markers # at @s # run from potion_tracking/verify_landed_potion execute if block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod align y run summon lightning_bolt ~ ~ ~ execute unless block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod run summon lightning_bolt ~ ~ ~ execute as @e[type=area_effect_cloud,distance=..8,limit=1,sort=nearest,nbt={potion_contents:{custom_effects:[{id:'minecraft:night_vision',amplifier:12b,duration:1}]}}] run function gm4_lightning_in_a_bottle:potion_tracking/modify_cloud ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/tag_potion.mcfunction ================================================ # run from #gm4_potion_tracking/tag_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:custom_data":{gm4_lightning_in_a_bottle:1b}}}}] add gm4_potion ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/potion_tracking/verify_landed_potion.mcfunction ================================================ # @s = gm4_liab_potion_tracker markers # at @s # run from #gm4_potion_tracking/potion_landed execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:custom_data"{gm4_lightning_in_a_bottle:1b} run function gm4_lightning_in_a_bottle:potion_tracking/potion_landed ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/sustain_lingering_lightning.mcfunction ================================================ # strikes lightning on lingering lightning in a bottle AECs # @s = @e[type=area_effect_cloud,tag=gm4_liab_lingering,predicate=gm4_lightning_in_a_bottle:random_strike] # at @s # run from main # summon lightning; snap to lightning rod if there is one below execute if block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod align y run summon lightning_bolt ~ ~ ~ execute unless block ~ ~-1 ~ #gm4_lightning_in_a_bottle:lightning_rod run summon lightning_bolt ~ ~ ~ ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/function/upgrade_paths/1.4.mcfunction ================================================ # upgrades armor-stand gm4_lightning_rod_texture_connector's to item_displays # @s = player # at @s # run via upgrade paths util execute as @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector] at @s align xyz run function gm4_lightning_in_a_bottle:brewing_stand/texture_connector/summon kill @e[type=armor_stand,tag=gm4_lightning_rod_texture_connector] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/guidebook/lightning_in_a_bottle.json ================================================ { "id": "lightning_in_a_bottle", "name": "Lightning in a Bottle", "module_type": "module", "icon": { "id": "minecraft:lightning_rod" }, "criteria": { "lightning_strike": { "trigger": "minecraft:lightning_strike", "conditions": { "lightning": { "distance": { "absolute": { "min": 0, "max": 64 } } } } }, "obtain_lightning_rod": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#gm4_lightning_in_a_bottle:lightning_rod" } ] } }, "obtain_thick_potion": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:potion", "predicates": { "minecraft:potion_contents": "minecraft:thick" } } ] } }, "obtain_lightning_bottle": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:potion", "minecraft:splash_potion", "minecraft:lingering_potion" ], "predicates": { "minecraft:custom_data": "{gm4_lightning_in_a_bottle:1b}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "lightning_strike" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.lightning_in_a_bottle.description", "fallback": "Lightning can be absorbed into a thick potion when struck by lightning.\n\nPillagers, evokers, purpur, and prismarine can amplify or animate into new mobs when struck by lightning." } ], [ { "translate": "text.gm4.guidebook.lightning_in_a_bottle.conversions", "fallback": "Pillagers can be amplified into Evokers.\nEvokers can be amplified into Illusioners.\n\nPurpur Blocks can be animated into Shulkers.\nPrismarine Bricks can be animated into Guardians." } ] ] }, { "name": "obtaining", "enable": [], "requirements": [ [ "obtain_lightning_rod" ], [ "obtain_thick_potion" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.lightning_in_a_bottle.obtaining", "fallback": "To harness lightning, place a lightning rod attached to the top or bottom of a brewing stand.\n\nWhen the rod is struck, any thick potions inside the brewing stand will be converted into bottles of lightning." } ] ], "prerequisites": [ "description" ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_lightning_bottle" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.lightning_in_a_bottle.usage", "fallback": "Splash and Lingering variants can be brewed as normal.\n\nWhen a bottle of lightning is drank or thrown, it will release a bolt of lightning!" } ] ], "grants": [ "description", "obtaining" ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/bottle_of_lightning.json ================================================ [ { "function": "minecraft:set_name", "name": { "translate": "item.gm4.bottle.effect.lightning", "fallback": "Bottle of Lightning", "color": "white", "italic": false } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.gm4.lightning_in_a_bottle.lightning", "fallback": "Lightning", "color": "red", "italic": false }, { "translate": "potion.potency.0" } ] } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_lightning_in_a_bottle:item/lightning_in_a_bottle"]}, "minecraft:potion_contents": { "custom_color": 11985402 }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_lightning_in_a_bottle:1b}" } ] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/brew_lightning.json ================================================ [ { "function": "minecraft:filtered", "item_filter": { "items": "minecraft:lingering_potion", "components": { "minecraft:potion_contents": { "potion": "minecraft:thick" } } }, "modifier": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:lingering_bottle_of_lightning" }, "on_pass": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:lingering_bottle_of_lightning" } }, { "function": "minecraft:filtered", "item_filter": { "items": "minecraft:splash_potion", "components": { "minecraft:potion_contents": { "potion": "minecraft:thick" } } }, "modifier": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:splash_bottle_of_lightning" }, "on_pass": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:splash_bottle_of_lightning" } }, { "function": "minecraft:filtered", "item_filter": { "items": "minecraft:potion", "components": { "minecraft:potion_contents": { "potion": "minecraft:thick" } } }, "modifier": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:bottle_of_lightning" }, "on_pass": { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:bottle_of_lightning" } } ] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/lingering_bottle_of_lightning.json ================================================ [ { "function": "minecraft:set_name", "name": { "translate": "item.gm4.lingering_bottle.effect.lightning", "fallback": "Lingering Bottle of Lightning", "color": "white", "italic": false } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.gm4.lightning_in_a_bottle.lightning", "fallback": "Lightning", "color": "red", "italic": false }, { "translate": "potion.potency.0" } ] } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_lightning_in_a_bottle:item/lingering_lightning_in_a_bottle"]}, "minecraft:potion_contents": { "custom_color": 11985402, "custom_effects": [ { "id": "minecraft:night_vision", "amplifier": 12, "duration": 1 } ] }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_lightning_in_a_bottle:1b}" } ] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/set_zero.json ================================================ { "function": "minecraft:set_count", "count": 0 } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/item_modifier/splash_bottle_of_lightning.json ================================================ [ { "function": "minecraft:set_name", "name": { "translate": "item.gm4.splash_bottle.effect.lightning", "fallback": "Splash Bottle of Lightning", "color": "white", "italic": false } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.gm4.lightning_in_a_bottle.lightning", "fallback": "Lightning", "color": "red", "italic": false }, { "translate": "potion.potency.0" } ] } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_lightning_in_a_bottle:item/splash_lightning_in_a_bottle"]}, "minecraft:potion_contents": { "custom_color": 11985402 }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_lightning_in_a_bottle:1b}" } ] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/charged_creeper.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/creeper" } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/illusioner.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:golden_carrot", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 0, "max": 3 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ] } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/entities/shulker.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "bonus_rolls": 0, "entries": [ { "type": "minecraft:item", "name": "minecraft:shulker_shell", "functions": [ { "function": "minecraft:set_count", "count": 1, "add": false, "conditions": [ { "condition": "minecraft:random_chance_with_enchanted_bonus", "enchantment": "minecraft:looting", "unenchanted_chance": 0.1, "enchanted_chance": { "type": "minecraft:linear", "base": 0.125, "per_level_above_first": 0.025 } } ] } ] } ], "conditions": [ { "condition": "minecraft:killed_by_player" } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/bottle_of_lightning.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:potion", "functions": [ { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:bottle_of_lightning" } ] } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/lingering_bottle_of_lightning.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:lingering_potion", "functions": [ { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:lingering_bottle_of_lightning" } ] } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/items/splash_bottle_of_lightning.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:splash_potion", "functions": [ { "function": "minecraft:reference", "name": "gm4_lightning_in_a_bottle:splash_bottle_of_lightning" } ] } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/technical/brewing_stand/lingering.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_lightning_in_a_bottle:items/lingering_bottle_of_lightning", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_lightning_in_a_bottle:1b}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/loot_table/technical/brewing_stand/splash.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_lightning_in_a_bottle:1b}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/modules/liquid_tanks/liquid_features.bolt ================================================ from gm4_liquid_tanks:liquid_wrappers import liquid @liquid class BottledLightning: id = 'liab_lightning' name = "Lightning" capacity = 300 skin = 'lightning_liquid' liquid.init() @liquid.item_fill("glass_bottle", "potion[custom_data~{gm4_lightning_in_a_bottle:1b}]", 1) def fill_bottle(): loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_lightning_in_a_bottle:items/bottle_of_lightning @liquid.util_below def lightning_strike(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] unless entity @s[predicate=gm4_lightning_in_a_bottle:on_fire] run function gm4_lightning_in_a_bottle:liquid_tanks/util/lightning: execute at @s run summon lightning_bolt ~ ~ ~ scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.firework_rocket.twinkle block @a[distance=..8] ~ ~ ~ 2 1.5 advancement grant @s only gm4:lightning_in_a_bottle_drink ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/predicate/on_fire.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_on_fire": true } } } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/predicate/random_strike.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/exposed_lightning_rod.json ================================================ { "values": [ "minecraft:exposed_lightning_rod", "minecraft:waxed_exposed_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/lightning_rod.json ================================================ { "values": [ "minecraft:lightning_rod", "minecraft:exposed_lightning_rod", "minecraft:weathered_lightning_rod", "minecraft:oxidized_lightning_rod", "minecraft:waxed_lightning_rod", "minecraft:waxed_exposed_lightning_rod", "minecraft:waxed_weathered_lightning_rod", "minecraft:waxed_oxidized_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/normal_lightning_rod.json ================================================ { "values": [ "minecraft:lightning_rod", "minecraft:waxed_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/oxidized_lightning_rod.json ================================================ { "values": [ "minecraft:oxidized_lightning_rod", "minecraft:waxed_oxidized_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/block/weathered_lightning_rod.json ================================================ { "values": [ "minecraft:weathered_lightning_rod", "minecraft:waxed_weathered_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/entity_type/potion_tracker.json ================================================ { "values": [ "minecraft:marker", "minecraft:lingering_potion", "minecraft:splash_potion" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/function/lightning_strike.json ================================================ { "values": [] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/tags/item/lightning_rod.json ================================================ { "values": [ "minecraft:lightning_rod", "minecraft:exposed_lightning_rod", "minecraft:weathered_lightning_rod", "minecraft:oxidized_lightning_rod", "minecraft:waxed_lightning_rod", "minecraft:waxed_exposed_lightning_rod", "minecraft:waxed_weathered_lightning_rod", "minecraft:waxed_oxidized_lightning_rod" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/brew_splash.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ item replace entity @s weapon.mainhand with minecraft:brewing_stand execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1 dummy @s use block ~1 ~1 ~1 await entity @e[type=marker,tag=gm4_brewing_stand,distance=..4] loot replace block ~1 ~1 ~1 container.0 loot gm4_lightning_in_a_bottle:items/bottle_of_lightning item replace block ~1 ~1 ~1 container.3 with minecraft:gunpowder item replace block ~1 ~1 ~1 container.4 with minecraft:blaze_powder await delay 1t data merge block ~1 ~1 ~1 {BrewTime:40s} await items block ~1 ~1 ~1 container.0 minecraft:splash_potion[custom_data~{gm4_lightning_in_a_bottle:1b}] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/lightning_strike.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ give @s brewing_stand execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1 dummy @s use block ~1 ~1 ~1 await entity @e[type=marker,tag=gm4_brewing_stand,distance=..4] give @s lightning_rod execute at @s run tp @s ~ ~ ~ facing ~ ~-0.5 ~1 dummy @s use block ~1 ~2 ~1 item replace block ~1 ~1 ~1 container.0 with minecraft:potion[potion_contents="minecraft:thick"] item replace block ~1 ~1 ~1 container.4 with minecraft:blaze_powder await delay 1s summon lightning_bolt ~1.5 ~3 ~1.5 await items block ~1 ~1 ~1 container.0 minecraft:potion[count=1,custom_data~{gm4_lightning_in_a_bottle:1b}] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ loot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1 dummy @s use item await entity @e[type=lightning_bolt,distance=..4] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_evoker.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ summon pillager ~1.5 ~1 ~1.5 loot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning execute at @s run tp @s ~ ~ ~ facing ~ ~ ~1 dummy @s use item await entity @e[type=evoker,distance=..4] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_guardian.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ setblock ~1 ~ ~1 prismarine_bricks loot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1 dummy @s use item await entity @e[type=guardian,distance=..4] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_illusioner.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ summon pillager ~1.5 ~1 ~1.5 loot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning execute at @s run tp @s ~ ~ ~ facing ~ ~ ~1 dummy @s use item await entity @e[type=evoker,distance=..4] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_lightning_in_a_bottle/test/throw_shulker.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~ setblock ~1 ~ ~1 purpur_block loot give @s loot gm4_lightning_in_a_bottle:items/splash_bottle_of_lightning execute at @s run tp @s ~ ~ ~ facing ~ ~-1.5 ~1 dummy @s use item await entity @e[type=shulker,distance=..4] ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_potion_tracking/tags/function/potion_landed.json ================================================ { "values": [ "gm4_lightning_in_a_bottle:potion_tracking/verify_landed_potion" ] } ================================================ FILE: gm4_lightning_in_a_bottle/data/gm4_potion_tracking/tags/function/tag_potion.json ================================================ { "values": [ "gm4_lightning_in_a_bottle:potion_tracking/tag_potion" ] } ================================================ FILE: gm4_liquid_minecarts/README.md ================================================ # Liquid Minecarts Normal Liquid Tanks can't move, but with this data pack they can ride on rails! ### Features - Expands the Gamemode 4 data pack [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) by allowing them to be mobile and work on rails - Allows a liquid tank to load/unload fluid like a hopper does to a chest - An activator rail forces the tank cart to fully empty itself ================================================ FILE: gm4_liquid_minecarts/assets/translations.csv ================================================ key,en_us item.gm4.liquid_minecart,Minecart with Liquid Tank text.gm4.liquid_minecarts.level_report,% Full advancement.gm4.liquid_minecarts.title,Liquid Locomotive advancement.gm4.liquid_minecarts.description,Put a liquid tank on wheels text.gm4.guidebook.module_desc.liquid_minecarts,Adds Liquid Tank Minecarts that allow you to move your liquids from one Liquid Tank to another. text.gm4.guidebook.liquid_minecarts.crafting,Combining a liquid tank and a minecart in a crafting table will craft a liquid minecart.\n\nLiquid minecarts can be used to move liquids from one tank to another. text.gm4.guidebook.liquid_minecarts.usage,"Unlike liquid tanks, liquid minecarts cannot interact with any entities or blocks in the world.\n\nLiquid minecarts can be filled by a tank pointing into the minecart and can be drained by driving one over a tank." text.gm4.guidebook.liquid_minecarts.usage_1,"Similar to a tank, if a liquid minecart already has liquid in it, it will only accept the contents of tanks with the same liquid.\n\nDriving a liquid minecart over an activator rail will discard any liquid inside." ================================================ FILE: gm4_liquid_minecarts/beet.yaml ================================================ id: gm4_liquid_minecarts name: Liquid Minecarts version: 1.9.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: gm4_liquid_tanks: 3.1.0 lib_machines: 1.5.0 schedule_loops: [main] model_data: - item: hopper_minecart reference: item/liquid_minecart template: generated - item: hopper_minecart reference: gui/advancement/liquid_minecarts_create template: name: advancement forward: item/liquid_minecart website: description: Adds Liquid Tank Minecarts that allow you to move your liquids from one Liquid Tank to another. recommended: - gm4_potion_liquids notes: [] modrinth: project_id: Ymtg3OOc wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Liquid_Minecarts credits: Creator: - Sparks Updated by: - SpecialBuilder32 - BPR Icon Design: - Hozz ================================================ FILE: gm4_liquid_minecarts/data/gm4/advancement/liquid_minecarts_create.json ================================================ { "display": { "icon": { "id": "hopper_minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_minecarts:gui/advancement/liquid_minecarts_create"]} } }, "title": { "translate": "advancement.gm4.liquid_minecarts.title", "fallback": "Liquid Locomotive" }, "description": { "translate": "advancement.gm4.liquid_minecarts.description", "fallback": "Put a liquid tank on wheels", "color": "gray" } }, "parent": "gm4:liquid_tanks_create", "criteria": { "obtain_tunnel_bore": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper_minecart" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_minecart\"}}" } } ] } } } } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/advancement/recipes/liquid_minecart.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_liquid_minecarts:liquid_minecart" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper_minecart", "minecraft:comparator" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_liquid_minecarts:liquid_minecart" ] } } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/compare_load_liquid.mcfunction ================================================ #@s = liquid minecart containing a liquid with a liquid tank containing liquid pointed at it #run from try_to_load data modify storage gm4_liquid_minecarts:compare liquid set from entity @e[type=marker,limit=1,sort=nearest,distance=..1,tag=gm4_liquid_tank] data.gm4_liquid_tanks.liquid_tag execute store success score @s gm4_lm_data run data modify storage gm4_liquid_minecarts:compare liquid set from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag execute if score @s gm4_lm_data matches 0 run function gm4_liquid_minecarts:load_liquid ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/compare_unload_liquid.mcfunction ================================================ #@s = liquid minecart containing a liquid with a liquid tank containing liquid below it #run from try_to_unload data modify storage gm4_liquid_minecarts:compare liquid set from entity @e[type=marker,limit=1,sort=nearest,distance=..0.1,tag=gm4_liquid_tank] data.gm4_liquid_tanks.liquid_tag execute store success score @s gm4_lm_data run data modify storage gm4_liquid_minecarts:compare liquid set from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag execute if score @s gm4_lm_data matches 0 run function gm4_liquid_minecarts:unload_liquid ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/copy_tank_data.mcfunction ================================================ #@s = gm4_liquid_minecart_display copying tank data to it's item, at location of tank #run from init_liquid data modify entity @s item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag set from entity @e[type=marker,limit=1,tag=gm4_liquid_tank,sort=nearest,distance=..2] data.gm4_liquid_tanks.liquid_tag data modify entity @s item.components."minecraft:custom_data".gm4_liquid_minecarts.tank.texture set from entity @e[type=item_display,tag=gm4_liquid_tank_liquid_display,limit=1,sort=nearest,distance=..2] item data modify entity @s item.components."minecraft:custom_data".gm4_liquid_minecarts.tank.CustomName set from block ~ ~ ~ CustomName ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/drain_minecart.mcfunction ================================================ #@s = liquid minecart going over active activator rail #run from command_block_minecart (liquid minecart) scoreboard players set @s gm4_lt_value 0 tag @s add gm4_liquid_minecart_empty execute as @e[type=item_display,limit=1,sort=nearest,tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:set_empty_data function gm4_liquid_minecarts:liquid_value_update playsound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 0.0 ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init.mcfunction ================================================ scoreboard objectives add gm4_lm_data dummy scoreboard players set #5 gm4_lm_data 5 scoreboard players set #2 gm4_lm_data 2 scoreboard players set #100 gm4_lm_data 100 data merge storage gm4_liquid_minecarts:compare {liquid:"null"} execute unless score liquid_minecarts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Liquid Minecarts"} execute unless score liquid_minecarts gm4_earliest_version < liquid_minecarts gm4_modules run scoreboard players operation liquid_minecarts gm4_earliest_version = liquid_minecarts gm4_modules scoreboard players set liquid_minecarts gm4_modules 1 schedule function gm4_liquid_minecarts:main 1t #$moduleUpdateList ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init_liquid.mcfunction ================================================ #@s = empty liquid minecart next to a liquid tank pointed at it containing liquid, at tank location #run from liquid_minecarts:try_to_load execute anchored feet facing entity @s feet positioned ^ ^ ^1 as @e[type=item_display,limit=1,sort=nearest,distance=..1,tag=gm4_liquid_minecart_display] positioned ^ ^ ^-1 run function gm4_liquid_minecarts:copy_tank_data tag @s remove gm4_liquid_minecart_empty #set tank max based on 40% of hopper max scoreboard players operation @s gm4_lt_max = @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_max scoreboard players operation @s gm4_lt_max /= #5 gm4_lm_data scoreboard players operation @s gm4_lt_max *= #2 gm4_lm_data #fill the tank function gm4_liquid_minecarts:load_liquid ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/init_tank.mcfunction ================================================ #@s = liquid minecart #run from try_to_unload #summon item_display summon item_display ~ ~ ~ {CustomName:"gm4_liquid_tank_liquid_display",Tags:["gm4_liquid_tank_liquid_display","smithed.entity","smithed.strict","gm4_lm_needs_texture"],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation: [0f,0f,0f,1f],translation:[0f,0.2185f,0f],scale:[0.83,0.83,0.83]},item_display:head} data modify entity @e[type=item_display,tag=gm4_lm_needs_texture,limit=1,sort=nearest] item set from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.tank.texture data modify entity @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] data.gm4_liquid_tanks.liquid_tag set from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag tag @e[type=item_display] remove gm4_lm_needs_texture #setup tank data data modify block ~ ~ ~ CustomName set from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.tank.CustomName scoreboard players operation @s gm4_lm_data = @s gm4_lt_max scoreboard players operation @s gm4_lm_data *= #5 gm4_lm_data scoreboard players operation @s gm4_lm_data /= #2 gm4_lm_data scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] gm4_lt_max = @s gm4_lm_data #apply liquid tag data modify entity @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] Tags append from entity @s Passengers[0].item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag tag @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] remove gm4_lt_empty #load all cart liquid into tank scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest,distance=..0.1] gm4_lt_value = @s gm4_lt_value execute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank,distance=..0.1] run function gm4_liquid_tanks:liquid_value_update scoreboard players set @s gm4_lt_value 0 tag @s add gm4_liquid_minecart_empty execute as @e[type=armor_stand,limit=1,sort=nearest,tag=gm4_liquid_minecart_stand] run function gm4_liquid_minecarts:set_empty_data playsound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 1.5 function gm4_liquid_minecarts:liquid_value_update ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/level_report.mcfunction ================================================ #@s = players looking at liquid minecart #run from level_report_ray execute as @e[type=command_block_minecart,tag=gm4_liquid_minecart,distance=..1,limit=1,sort=nearest] run function gm4_liquid_minecarts:liquid_value_update title @s actionbar [{"score":{"name":"@e[type=command_block_minecart,tag=gm4_liquid_minecart,distance=..1,limit=1,sort=nearest]","objective":"gm4_lm_data"},"color":"dark_green"},{"translate":"text.gm4.liquid_minecarts.level_report","fallback":"% Full","color":"dark_green"}] tag @s add gm4_lt_found_tank ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/level_report_ray.mcfunction ================================================ #@s = all players at @s #run from main execute anchored eyes positioned ^ ^ ^.5 positioned ~ ~-0.5 ~ if entity @e[distance=..1,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^1.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^2.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^3.5 positioned ~ ~-0.5 ~ if entity @e[distance=..0.5,type=command_block_minecart,tag=gm4_liquid_minecart,limit=1,sort=nearest] run function gm4_liquid_minecarts:level_report tag @s remove gm4_lt_found_tank ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/liquid_value_update.mcfunction ================================================ #@s = liquid minecart #run from load_liquid, unload_liquid and create #calculate tank fullness percentage scoreboard players operation @s gm4_lm_data = @s gm4_lt_value scoreboard players operation @s gm4_lm_data *= #100 gm4_lm_data scoreboard players operation @s gm4_lm_data /= @s gm4_lt_max #1%-50% execute if score @s gm4_lt_value matches 1.. if score @s gm4_lm_data matches 0..50 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/low"}} #51%-99% execute unless score @s gm4_lt_value = @s gm4_lt_max if score @s gm4_lm_data matches 51..100 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/high"}} #100% execute if score @s gm4_lt_value = @s gm4_lt_max on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/full"}} #0% execute if score @s gm4_lt_value matches 0 on passengers run data modify entity @s[type=item_display,tag=gm4_liquid_minecart_display] item merge value {id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/empty"}} ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/load_check.mcfunction ================================================ #@s = liquid minecart #run from main #load execute if block ~1 ~ ~ hopper[facing=west] align xyz positioned ~1.5 ~0.5 ~0.5 run function gm4_liquid_minecarts:try_to_load execute if block ~-1 ~ ~ hopper[facing=east] align xyz positioned ~-0.5 ~0.5 ~0.5 run function gm4_liquid_minecarts:try_to_load execute if block ~ ~ ~1 hopper[facing=north] align xyz positioned ~0.5 ~0.5 ~1.5 run function gm4_liquid_minecarts:try_to_load execute if block ~ ~ ~-1 hopper[facing=south] align xyz positioned ~0.5 ~0.5 ~-0.5 run function gm4_liquid_minecarts:try_to_load execute if block ~ ~1 ~ hopper[facing=down] positioned ~ ~1.5 ~ run function gm4_liquid_minecarts:try_to_load #unload execute if block ~ ~-1 ~ hopper positioned ~ ~-0.5 ~ run function gm4_liquid_minecarts:try_to_unload ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/load_liquid.mcfunction ================================================ #@s liquid minecart that can accept the current tank's liquid, at liquid tank block location #run from compare_load_liquid and init_liquid #take all the liquid in the tank (or as much as the minecart can hold) (amount of liquid to take stored in gm4_lm_data) #get remaining space in minecart scoreboard players operation @s gm4_lm_data = @s gm4_lt_max scoreboard players operation @s gm4_lm_data -= @s gm4_lt_value #lower lm_data if tank has less liquid than the remaining space scoreboard players operation @s gm4_lm_data < @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value #add liquid to minecart scoreboard players operation @s gm4_lt_value += @s gm4_lm_data #take liquid from tank scoreboard players operation @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value -= @s gm4_lm_data #update display function gm4_liquid_minecarts:liquid_value_update execute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] run function gm4_liquid_tanks:liquid_value_update playsound minecraft:block.brewing_stand.brew block @a ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/create_cart.mcfunction ================================================ # places the liquid_minecart down # @s = hopper_minecart with the liquid_minecart name # located at @s # run from gm4_liquid_minecarts:machine/verify_place_cart scoreboard players set $placed_block gm4_machine_data 1 # summon new command block minecart summon command_block_minecart ~ ~ ~ {Command:"execute if score @s gm4_lt_value matches 1.. run function gm4_liquid_minecarts:drain_minecart",CustomName:{"text":"Liquid Minecart","italic":false},Tags:["gm4_liquid_minecart","gm4_liquid_minecart_empty","gm4_machine_cart","gm4_new_machine"],DisplayState:{"Name":"minecraft:hopper"},DisplayOffset:1,Passengers:[{id:"minecraft:item_display",Tags:["gm4_liquid_minecart_display","gm4_machine_cart","smithed.entity","smithed.strict","gm4_new_machine"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/empty","minecraft:custom_data":{gm4_liquid_minecarts:{liquid_tag:"null"}}}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0.0,0.7275,0.0],scale:[0.83,0.83,0.83]},item_display:"head"}]} tp @e[type=command_block_minecart,distance=..0.1,tag=gm4_new_machine] @s scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 execute as @e[type=command_block_minecart,distance=..0.1,tag=gm4_new_machine,limit=1] run function gm4_liquid_minecarts:liquid_value_update # clean up kill @s tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/drop_item.mcfunction ================================================ # drops the correct item # @s = invalid item entity # located at @s # run from gm4_liquid_minecarts:machine/destroy_cart # drop item, and set flag execute store success score $dropped_item gm4_machine_data run loot spawn ~ ~ ~ loot gm4_liquid_minecarts:entities/liquid_minecart # kill original (invalid) item kill @s ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/scan_hoppers.mcfunction ================================================ # searches for hoppers with invalid items # @s = liquid_minecart marker # located at @s # run from gm4_liquid_minecarts:machine/destroy_cart # find hopper with the invalid item scoreboard players set $found_item gm4_machine_data 0 execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if block ~ ~ ~ hopper{Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]} run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper # if no hoppers found, find hopper minecarts with the invalid item execute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3,nbt={Items:[{id:"minecraft:minecart",components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}]}] run function gm4_liquid_minecarts:machine/destroy_cart/update_hopper_minecart ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/update_hopper.mcfunction ================================================ # updates hoppers with invalid items # @s = liquid_minecart marker # located at the hopper with an invalid item # run from gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers # replace correct slot with proper item data modify storage gm4_machines:temp Items set from block ~ ~ ~ Items execute if data storage gm4_machines:temp Items[{Slot:0b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace block ~ ~ ~ container.0 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:1b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace block ~ ~ ~ container.1 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:2b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace block ~ ~ ~ container.2 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:3b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace block ~ ~ ~ container.3 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:4b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace block ~ ~ ~ container.4 loot gm4_liquid_minecarts:entities/liquid_minecart # clean up data remove storage gm4_machines:temp Items scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart/update_hopper_minecart.mcfunction ================================================ # updates hopper minecarts with invalid items # @s = hopper minecart with invalid item # located at @s # run from gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers # replace correct slot with proper item data modify storage gm4_machines:temp Items set from entity @s Items execute if data storage gm4_machines:temp Items[{Slot:0b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace entity @s container.0 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:1b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace entity @s container.1 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:2b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace entity @s container.2 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:3b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace entity @s container.3 loot gm4_liquid_minecarts:entities/liquid_minecart execute if data storage gm4_machines:temp Items[{Slot:4b,components:{"minecraft:custom_name":{"text":"Liquid Minecart","italic":false}}}] run loot replace entity @s container.4 loot gm4_liquid_minecarts:entities/liquid_minecart # clean up data remove storage gm4_machines:temp Items scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/destroy_cart.mcfunction ================================================ # destroys the liquid_minecart # @s = liquid_minecart marker # located at @s # run from gm4_liquid_minecarts:machine/verify_destroy # drop item scoreboard players set $dropped_item gm4_machine_data 0 execute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:"minecraft:minecart",count:1,components:{"minecraft:custom_name":{"italic":false,"text":"Liquid Minecart"}}}},limit=1,sort=nearest] at @s run function gm4_liquid_minecarts:machine/destroy_cart/drop_item # scan hoppers if no item was broken execute if score $dropped_item gm4_machine_data matches 0 run function gm4_liquid_minecarts:machine/destroy_cart/scan_hoppers # kill marker kill @s ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/verify_destroy_cart.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:machine/destroy_cart ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/machine/verify_place_cart.mcfunction ================================================ # verifies that the placed down machine minecart was from this module # @s = machine minecart # located at the machine minecart # run from #gm4_machines:place_cart execute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{"translate":"item.gm4.liquid_minecart","fallback":"Minecart with Liquid Tank","italic":false}} run function gm4_liquid_minecarts:machine/create_cart ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/main.mcfunction ================================================ #look for hoppers pointing into or below the liquid minecart execute as @e[type=command_block_minecart,tag=gm4_liquid_minecart] at @s run function gm4_liquid_minecarts:load_check #minecart level report execute as @a[gamemode=!spectator] at @s run function gm4_liquid_minecarts:level_report_ray #self-perpetuating clock schedule function gm4_liquid_minecarts:main 16t ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/set_empty_data.mcfunction ================================================ #@s liquid minecart display of a minecart that has 0 liquid in it #run from unload_liquid or init_tank or drain_minecart data modify entity @s item.components."minecraft:custom_data".gm4_liquid_minecarts.liquid_tag set value "empty" data modify entity @s item.components."minecraft:custom_data".gm4_liquid_minecarts.tank set value {texture:"null",CustomName:"null"} ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/try_to_load.mcfunction ================================================ #@s = liquid minecart with a hopper pointing at it #run from liquid_minecarts:load_check #if the minecart has a liquid in it and the tank does too execute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=!gm4_volatile_liquid,scores={gm4_lt_value=1..}] if score @s gm4_lt_value < @s gm4_lt_max run function gm4_liquid_minecarts:compare_load_liquid #if the minecart is empty and the tank has contents execute if entity @s[tag=gm4_liquid_minecart_empty] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=!gm4_volatile_liquid,scores={gm4_lt_value=1..}] run function gm4_liquid_minecarts:init_liquid #if the minecart is empty and the tank has volitile contents execute if entity @s[tag=gm4_liquid_minecart_empty] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,tag=gm4_volatile_liquid,scores={gm4_lt_value=1..}] run playsound minecraft:entity.generic.extinguish_fire block @a ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/try_to_unload.mcfunction ================================================ #@s = liquid minecart with a hopper below it #run from load_check #if the minecart has a liquid in it and the tank does too execute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,scores={gm4_lt_value=1..}] align xyz positioned ~.5 ~.5 ~.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_value < @e[type=marker,tag=gm4_liquid_tank,limit=1,sort=nearest] gm4_lt_max run function gm4_liquid_minecarts:compare_unload_liquid #if the minecart has liquid but the tank is empty execute if entity @s[scores={gm4_lt_value=1..}] if entity @e[type=marker,distance=..0.1,tag=gm4_liquid_tank,scores={gm4_lt_value=0}] align xyz positioned ~.5 ~.5 ~.5 run function gm4_liquid_minecarts:init_tank ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/unload_liquid.mcfunction ================================================ #@s liquid minecart above a liquid tank that can accept the liquid #run from compare_unload_liquid #take all the liquid in the tank (or as much as the minecart can hold) (amount of liquid to take stored in gm4_lm_data) #get remaining space in tank scoreboard players operation @s gm4_lm_data = @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_max scoreboard players operation @s gm4_lm_data -= @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value #lower lm_data if tank has less space than minecart's liquid level scoreboard players operation @s gm4_lm_data < @s gm4_lt_value #remove liquid from minecart scoreboard players operation @s gm4_lt_value -= @s gm4_lm_data #give liquid to tank scoreboard players operation @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] gm4_lt_value += @s gm4_lm_data #update display function gm4_liquid_minecarts:liquid_value_update execute as @e[type=marker,limit=1,sort=nearest,tag=gm4_liquid_tank] run function gm4_liquid_tanks:liquid_value_update playsound minecraft:block.brewing_stand.brew block @a ~ ~ ~ 1.0 1.5 #if cart is empty, reset cart execute if score @s gm4_lt_value matches 0 run tag @s add gm4_liquid_minecart_empty execute if score @s gm4_lt_value matches 0 as @e[type=item_display,limit=1,sort=nearest,tag=gm4_liquid_minecart_display] run function gm4_liquid_minecarts:set_empty_data ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/upgrade_paths/1.8/entity_replacement.mcfunction ================================================ # @s = gm4_liquid_minecart cart # at self # run by upgrade_paths/1.8 # add new block offset data data merge entity @s {DisplayOffset:1} # replace armor stand with item display summon item_display ~ ~ ~ {Tags:["gm4_liquid_minecart_display","gm4_machine_cart","smithed.entity","smithed.strict","gm4_new_machine"],item:{id:"minecraft:player_head",count:1,components:{"minecraft:profile":"$liquid_minecart_display/empty","minecraft:custom_data":{gm4_liquid_minecarts:{liquid_tag:"null"}}}},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0.0,0.7275,0.0],scale:[0.83,0.83,0.83]},item_display:"head"} data modify entity @e[tag=gm4_new_machine,distance=..2,limit=1] item.components."minecraft:custom_data".gm4_liquid_minecarts set from entity @e[type=armor_stand,limit=1,distance=..1,sort=nearest,tag=gm4_liquid_minecart_stand] equipment.feet ride @e[tag=gm4_new_machine,tag=gm4_liquid_minecart_display,limit=1] mount @s execute on passengers run kill @s[type=armor_stand,tag=gm4_liquid_minecart_stand] tag @e[tag=gm4_new_machine,distance=..1] remove gm4_new_machine scoreboard players set @s gm4_entity_version 2 ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/function/upgrade_paths/1.8.mcfunction ================================================ execute as @e[type=command_block_minecart,tag=gm4_liquid_minecart,scores={gm4_entity_version=1}] at @s run function gm4_liquid_minecarts:upgrade_paths/1.8/entity_replacement ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/guidebook/liquid_minecarts.json ================================================ { "id": "liquid_minecarts", "name": "Liquid Minecarts", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:hopper_minecart" }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } }, "obtain_liquid_minecart": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper_minecart" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_minecart\"}}" } } ] } } }, "sections": [ { "name": "crafting", "enable": [], "requirements": [ [ "obtain_liquid_tank" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.liquid_minecarts.crafting", "fallback": "Combining a liquid tank and a minecart in a crafting table will craft a liquid minecart.\n\nLiquid minecarts can be used to move liquids from one tank to another." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_liquid_minecart" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.liquid_minecarts.usage", "fallback": "Unlike liquid tanks, liquid minecarts cannot interact with any entities or blocks in the world.\n\nLiquid minecarts can be filled by a tank pointing into the minecart and can be drained by driving one over a tank." } ], [ { "translate": "text.gm4.guidebook.liquid_minecarts.usage_1", "fallback": "Similar to a tank, if a liquid minecart already has liquid in it, it will only accept the contents of tanks with the same liquid.\n\nDriving a liquid minecart over an activator rail will discard any liquid inside." } ] ] } ] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/loot_table/entities/liquid_minecart.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_liquid_minecarts:items/liquid_minecart" } ] } ] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/loot_table/items/liquid_minecart.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:hopper_minecart", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_minecarts:item/liquid_minecart"]} } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'liquid_minecart'}}" }, { "function": "set_name", "name": [ { "translate": "item.gm4.liquid_minecart", "fallback": "Minecart with Liquid Tank", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/recipe/liquid_minecart.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "IGI", "ICI", " H " ], "key": { "I": "minecraft:iron_ingot", "G": "minecraft:glass", "C": "minecraft:comparator", "H": "minecraft:hopper_minecart" }, "result": { "id": "minecraft:hopper_minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_minecarts:item/liquid_minecart"]}, "minecraft:custom_data": "{gm4_machines:{id:'liquid_minecart'}}", "minecraft:custom_name": {"translate":"item.gm4.liquid_minecart","fallback":"Minecart with Liquid Tank","color":"white","italic":false} } } } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/tags/function/load.json ================================================ { "values": [ "gm4_liquid_minecarts:load" ] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/test/place.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ # @optional setblock ~1 ~1 ~1 rail loot give @s loot gm4_liquid_minecarts:items/liquid_minecart execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~1 ~1 await entity @e[tag=gm4_liquid_minecart,distance=..3] ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_minecarts/test/transport.mcfunction ================================================ # @template gm4_liquid_minecarts:test_transport # @dummy ~1 ~1 ~ execute positioned ~2 ~1 ~2 run tag @e[tag=gm4_liquid_tank,distance=..1] add test_source execute positioned ~4 ~1 ~1 run tag @e[tag=gm4_liquid_tank,distance=..1] add test_destination # create lava tank item replace block ~2 ~1 ~2 container.0 with minecraft:lava_bucket await items block ~2 ~1 ~2 container.0 minecraft:bucket await entity @e[tag=gm4_liquid_tank,tag=test_source,tag=gm4_lt_lava,scores={gm4_lt_value=3}] # place liquid minecart loot replace entity @s weapon.mainhand loot gm4_liquid_minecarts:items/liquid_minecart execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~2 ~1 ~1 await entity @e[tag=gm4_liquid_minecart,scores={gm4_lt_value=3}] assert entity @e[tag=gm4_liquid_tank,tag=test_source,tag=gm4_lt_empty,scores={gm4_lt_value=0}] # send the minecart setblock ~2 ~ ~1 redstone_block await entity @e[tag=gm4_liquid_tank,tag=test_destination,tag=gm4_lt_lava,scores={gm4_lt_value=3}] assert entity @e[tag=gm4_liquid_minecart,scores={gm4_lt_value=0}] ================================================ FILE: gm4_liquid_minecarts/data/gm4_liquid_tanks/tags/function/load.json ================================================ { "values": [] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_machines/tags/function/destroy_cart.json ================================================ { "values": [ "gm4_liquid_minecarts:machine/verify_destroy_cart" ] } ================================================ FILE: gm4_liquid_minecarts/data/gm4_machines/tags/function/place_cart.json ================================================ { "values": [ "gm4_liquid_minecarts:machine/verify_place_cart" ] } ================================================ FILE: gm4_liquid_tanks/README.md ================================================ # Liquid Tanks Store liquids like water and lava or liquids like soup and honey in a compact form to enable autobottling! ### Features - Enables the maximum storage of 100 buckets in one tank - Entities below and above a tank can interact with it - with above depositing and below extracting - The tank can be disabled with redstone, to block extraction and insertion - Out of the box, liquid tanks supports Milk, Honey, Water, Lava, XP and Soup. Read more about the other liquids supported on the [Wiki](https://wiki.gm4.co/Liquid_Tanks/Standard_Liquids). ================================================ FILE: gm4_liquid_tanks/assets/gm4_liquid_tanks/models/block/liquid_tank.json ================================================ { "textures": { "top": "gm4_liquid_tanks:block/liquid_tank_top", "bottom": "gm4_liquid_tanks:block/liquid_tank_top", "side": "gm4_liquid_tanks:block/liquid_tank_side", "particle": "gm4_liquid_tanks:block/liquid_tank_side" }, "elements": [ { "from": [4, 11, 4], "to": [12, 18, 12], "faces": { "north": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "north"}, "east": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "east"}, "south": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "west"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [0, 0, 16, 16], "texture": "#bottom", "cullface": "down"} } } ] } ================================================ FILE: gm4_liquid_tanks/assets/gm4_liquid_tanks/models/item/liquid_tank_full.json ================================================ { "parent": "minecraft:block/block", "ambientocclusion": false, "textures": { "particle": "minecraft:block/hopper_outside", "top": "minecraft:block/hopper_top", "side": "minecraft:block/hopper_outside", "inside": "minecraft:block/hopper_inside", "5": "gm4_liquid_tanks:block/liquid_tank_side", "6": "gm4_liquid_tanks:block/liquid_tank_top" }, "elements": [ { "from": [ 0, 10, 0 ], "to": [ 16, 11, 16 ], "faces": { "down": { "texture": "#side" }, "up": { "texture": "#inside", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "west" }, "east": { "texture": "#side", "cullface": "east" } } }, { "from": [ 0, 11, 0 ], "to": [ 2, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "west" }, "east": { "texture": "#side", "cullface": "up" } } }, { "from": [ 14, 11, 0 ], "to": [ 16, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "south" }, "west": { "texture": "#side", "cullface": "up" }, "east": { "texture": "#side", "cullface": "east" } } }, { "from": [ 2, 11, 0 ], "to": [ 14, 16, 2 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "north" }, "south": { "texture": "#side", "cullface": "up" } } }, { "from": [ 2, 11, 14 ], "to": [ 14, 16, 16 ], "faces": { "up": { "texture": "#top", "cullface": "up" }, "north": { "texture": "#side", "cullface": "up" }, "south": { "texture": "#side", "cullface": "south" } } }, { "from": [ 4, 4, 4 ], "to": [ 12, 10, 12 ], "faces": { "down": { "texture": "#side" }, "north": { "texture": "#side" }, "south": { "texture": "#side" }, "west": { "texture": "#side" }, "east": { "texture": "#side" } } }, { "from": [ 6, 0, 6 ], "to": [ 10, 4, 10 ], "faces": { "down": { "texture": "#side", "cullface": "down" }, "north": { "texture": "#side" }, "south": { "texture": "#side" }, "west": { "texture": "#side" }, "east": { "texture": "#side" } } }, { "from": [ 4, 11, 4 ], "to": [ 12, 18, 12 ], "rotation": { "angle": 0, "axis": "y", "origin": [ 4.5, 10.5, 4.5 ] }, "faces": { "north": { "uv": [ 0, 0, 16, 14 ], "texture": "#5" }, "east": { "uv": [ 0, 0, 16, 14 ], "texture": "#5" }, "south": { "uv": [ 0, 0, 16, 14 ], "texture": "#5" }, "west": { "uv": [ 0, 0, 16, 14 ], "texture": "#5" }, "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#6" } } } ] } ================================================ FILE: gm4_liquid_tanks/assets/translations.csv ================================================ key,en_us advancement.gm4.liquid_tanks.description,Find out that a liquid tank is not an epic submarine advancement.gm4.liquid_tanks.title,"Oh, That Kind of Tank" advancement.gm4.standard_liquids.description,Bottle your own experience from a liquid tank advancement.gm4.standard_liquids.title,Experience Quicksave block.gm4.liquid_tank,Liquid Tank container.gm4.liquid_tank.beetroot_soup,Beetroot Soup Tank container.gm4.liquid_tank.empty,Empty Tank container.gm4.liquid_tank.experience,Experience Tank container.gm4.liquid_tank.glow_ink,Glow Ink Tank container.gm4.liquid_tank.honey,Honey Tank container.gm4.liquid_tank.ink,Ink Tank container.gm4.liquid_tank.lava,Lava Tank container.gm4.liquid_tank.milk,Milk Tank container.gm4.liquid_tank.mushroom_stew,Mushroom Stew Tank container.gm4.liquid_tank.powder_snow,Powder Snow Tank container.gm4.liquid_tank.rabbit_stew,Rabbit Stew Tank container.gm4.liquid_tank.water,Water Tank text.gm4.liquid_tanks.level_report.buckets,Buckets text.gm4.liquid_tanks.level_report.levels,Levels item.gm4.glow_ink_bottle,Glow Ink Bottle item.gm4.ink_bottle,Ink Bottle text.gm4.guidebook.module_desc.liquid_tanks,"Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them!" text.gm4.guidebook.liquid_tanks.description,Liquid Tanks can store various liquids in bulk.\n\nThe first slot of the liquid tank acts as both the input and output of the liquid tank. text.gm4.guidebook.liqud_tanks.crafting,Liquid Tanks can be crafted in a crafting table: text.gm4.guidebook.module_desc.standard_liquids,"Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them!" text.gm4.guidebook.standard_liquids.water,"Standard liquids can be stored by liquid tanks.\n\nWater Tank\n- Drains water buckets, water bottles\n- Fills buckets, bottles\n- Fills adjacent cauldrons" text.gm4.guidebook.standard_liquids.lava,Lava Tank\n- Drains lava buckets\n- Fills buckets\n- Fuels adjacent furnaces\n- Drains lava cauldrons\n- Fills adjacent cauldrons text.gm4.guidebook.standard_liquids.rabbit_stew_and_beetroot_soup,"Rabbit Stew Tank\n- Drains rabbit stew\n- Fills bowls\n- Feeds drinkers\n\nBeetroot Soup Tank\n- Drains beetroot soup, beetroot\n- Fills bowls\n- Feeds drinkers" text.gm4.guidebook.standard_liquids.mushroom_stew_and_milk,Mushroom Stew Tank\n- Drains mushroom stew\n- Fills bowls\n- Milks mooshrooms\n- Feeds drinkers\n\nMilk Tank\n- Drains milk buckets\n- Fills buckets\n- Milks cows\n- Clear mob effects text.gm4.guidebook.standard_liquids.honey,"Honey Tanks\n- Drains honey bottles, honey blocks\n- Fills bottles\n- Casts honey blocks into cauldrons\n- Clears mob poison\n- Feeds drinkers" text.gm4.guidebook.standard_liquids.experience,"Experience Tanks\n- Drains bottles o' enchanting, enchanted books\n- Fills bottles\n- Absorbs experience orbs, experience points\n- Fills experience points" container.gm4.liquid_tank.ominous_bottle_0,Ominous I Tank container.gm4.liquid_tank.ominous_bottle_1,Ominous II Tank container.gm4.liquid_tank.ominous_bottle_2,Ominous III Tank container.gm4.liquid_tank.ominous_bottle_3,Ominous IV Tank container.gm4.liquid_tank.ominous_bottle_4,Ominous V Tank ================================================ FILE: gm4_liquid_tanks/beet.yaml ================================================ id: gm4_liquid_tanks name: Liquid Tanks version: 3.1.X data_pack: load: . resource_pack: load: . require: - bolt pipeline: - override_formatting - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: bolt: entrypoint: - gm4_standard_liquids:main gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: [main] model_data: - item: player_head reference: item/liquid_tank model: item/liquid_tank_full - item: glass template: custom broadcast: - reference: block/liquid_tank - reference: block/liquid_tank_side model: block/liquid_tank transforms: - name: item_display origin: [0.5,0.9,0.5] scale: [0.438,0.438,0.438] translation: [0,0,0] display: head - item: honey_block reference: block/cast_honey_block template: vanilla - item: potion template: vanilla broadcast: - reference: gm4_standard_liquids:item/ink_bottle - reference: gm4_standard_liquids:item/glow_ink_bottle - item: hopper reference: gui/advancement/liquid_tanks_create template: name: advancement forward: item/liquid_tank_full - item: experience_bottle reference: standard_liquids:gui/advancement/standard_liquids template: advancement gui_fonts: - translation: gui.gm4.liquid_tank container: hopper texture: gui/container/liquid_tank website: description: Store liquids like Water, Lava, Milk, or Soup compactly in special tanks and interact with them! recommended: - gm4_resource_pack - gm4_potion_liquids - gm4_zauber_liquids - gm4_liquid_minecarts - gm4_cement_mixers notes: [] modrinth: project_id: h4BcuD3C video: https://www.youtube.com/watch?v=qa9lcbii1BE wiki: https://wiki.gm4.co/wiki/Liquid_Tanks credits: Creator: - SpecialBuilder32 Updated by: - SpecialBuilder32 - BPR Textures by: - Vilder50 - Kyrius Icon Design: - DuckJr ================================================ FILE: gm4_liquid_tanks/bolt-docs.md ================================================ # Liquid Tanks Bolt Wrappers Liquid tanks has a bolt-powered interface to define the myriad of liquid types and items that interact with them, without needing to create lots of redundant function files directly. This interface is an *experimental* design, and so maybe not recommended to be replicated for other modules without careful thought. # Prereqs - Add `bolt` to the beet.yaml requirements - Add `gm4_liquid_tanks.bolt_liquid_wrappers` to the beet.yaml pipeline - Configure a beet entrypoint; typically: ``` meta: bolt: entrypoint: - gm4_potion_liquids:main ``` # Basic Usage Liquids are defined through a class definitions, typically done in a `main.bolt` file, located in `data/gm4_module_namespace/modules/main.bolt`. At the start of the file, import the wrapper with `from gm4_liquid_tanks:liquid_wrappers import liquid` Each liquid type is a class, defined with the `@liquid` decorator, with 4 class attributes. - `id`: internal id of the liquid - `name`: display name in the hopper ie "Water" becomes "Water Tank" - `capacity`: maximum fluid units the tank holds - `skin`: (optional) resource location for the liquid's skin texture. If omitted, defaults to `liquids/id` Additional behavior is added by calling or defining methods within the class. ## Tank Init The default tank init function is created by calling `liquid.init()`. Additional commands can be appended to the end of the init function by decorating a method: ```py @liquid.init() def arbitrary_fcn_name(): say additional commands done here! advancement grant @a[distance=..2] gm4:blood_tank ``` ## Item Fill/Drain Each item that a tank fills or drains is registered by calling `liquid.item_fill` or `liquid.item_drain`. Most items that can be both filled or drained (like a bucket or bottle) only need to call `item_fill`, which also in turn defines its `item_drain` reverse direction. An item that only is fillable (like adding water to concrete powder) can be created with `item_fill(reversible=False)`. Similarly, an item that is only drainable (like enchanted pages) can be created with `item_drain` directly. The arguments of the method define the two items and the amount of liquid imparted to/from the tank by that item. These items are defined by their item stack component test. e.g. `paper[custom_data~{gm4_book_binders:{item:"enchanted_page"}}]` ```py liquid.item_fill('bucket', 'water_bucket', 3) liquid.item_fill('glass_bottle', 'minecraft:potion[potion_contents={potion:"water"}]', 1) liquid.item_drain('paper[custom_data~{gm4_book_binders:{item:"enchanted_page"}}]', 'paper', 5) ``` If the output item requires additional data to be set after being processed by the liquid tank, or if any additional commands are present at the end of the item process file (for advancements for example), then the decorator approach is required. The first set of commands placed before a `yield` is called at the step where the final item data is applied to the `weapon.mainhand` of the forceload armorstand (UUID=`344d47-4-4-4-f04ce104d`), generally following the form: `loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:ink_bottle`. The second set of commands after a `yield` generates at the end of the function. ```py @liquid.item_fill('glass_bottle', 'experience_bottle', 9) def experience_bottle(): item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with minecraft:experience_bottle yield execute if score $smart_success gm4_lt_value matches 1 run advancement grant @a[distance=..4,gamemode=!spectator] only gm4:standard_liquids ``` ## Util Below Some basic util-below functionality is available for liquids that have a "dispense" function. Other util-below functionality should be added directly through the creation of the usual function files. This set of commands is called on tanks of the matching type, and run as provided by a decorated method. ```py @liquid.util_below def dispense_ink(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink ``` # Advanced Usage ## Standard Units Liquid containers that are commonly used by many items can easily be defined as a "Standard Unit", which will reuse function files wherever possible. Glass bottles and buckets are examples of this. A defined standard unit acts in place of the normal `liquid.item_fill` method, with all set arguments already bound. ```py bottle = liquid.standard_unit('glass_bottle', 1) liquid.item_fill('glass_bottle', 'honey_bottle', 1) # then becomes bottle('honey_bottle') ``` Standard units take an optional `f_name` string parameter that allows the actual function name to be defined, which may prevent collisions when more than one standard unit uses the same item type. ## Naming Schemes By default, function files are names according to a preset number of schemes, usually by the item name or potion type if available. Additioinal schemes can be registered to the wrapper via its `schemes` attribute. This functionality is not used yet in the codebase, so please refer to the source code for more details. ## Partially Bound Liquid Defaults Liquids with commonly repeated properties (mainly liquid value) can be made with a new instance of the "Liquid" object, replacing the usage of the included `liquid` instance. ================================================ FILE: gm4_liquid_tanks/bolt_liquid_wrappers.py ================================================ # beet plugin to add the liquid_wrappers.bolt module to other gm4 datapacks more easily from beet import Context from bolt import Module from pathlib import Path def beet_default(ctx: Context): ctx.data[Module]['gm4_liquid_tanks:liquid_wrappers'] = Module(source_path=Path("gm4_liquid_tanks/data/gm4_liquid_tanks/modules/liquid_wrappers.bolt")) ================================================ FILE: gm4_liquid_tanks/data/gm4/advancement/liquid_tanks_create.json ================================================ { "display": { "icon": { "id": "hopper", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_tanks:gui/advancement/liquid_tanks_create"]} } }, "title": { "translate": "advancement.gm4.liquid_tanks.title", "fallback": "Oh, That Kind of Tank" }, "description": { "translate": "advancement.gm4.liquid_tanks.description", "fallback": "Find out that a liquid tank is not an epic submarine", "color": "gray" } }, "parent": "gm4:root", "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } } } } ================================================ FILE: gm4_liquid_tanks/data/gm4/advancement/standard_liquids.json ================================================ { "display": { "icon": { "id": "experience_bottle", "components": { "minecraft:custom_model_data": {"strings":["standard_liquids:gui/advancement/standard_liquids"]} } }, "title": { "translate": "advancement.gm4.standard_liquids.title", "fallback": "Experience Quicksave" }, "description": { "translate": "advancement.gm4.standard_liquids.description", "fallback": "Bottle your own experience from a liquid tank", "color": "gray" } }, "parent": "gm4:liquid_tanks_create", "criteria": { "bottle_experience": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/advancement/recipes/liquid_tank.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_liquid_tanks:liquid_tank" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper", "minecraft:comparator" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_liquid_tanks:liquid_tank" ] } } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/apply_output.mcfunction ================================================ # run from liquid_tanks:smart_item_drain and smart_item_fill # @s = processing tank # merge count from input and set to tank item_modifier gm4_liquid_tanks:apply_output_count: function: "minecraft:set_count" count: type: "minecraft:score" target: type: "minecraft:fixed" name: "$stack_size" score: "gm4_lt_value" item replace block ~ ~ ~ container.0 from entity 344d47-4-4-4-f04ce104d weapon.mainhand gm4_liquid_tanks:apply_output_count item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with air # apply value delta scoreboard players operation @s gm4_lt_value += $stack_value gm4_lt_value # record success scoreboard players set $smart_success gm4_lt_value 1 ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/empty.mcfunction ================================================ #@s = liquid tank #run from liquid_tanks:liquid_value_update scoreboard players set @s gm4_lt_value 0 execute positioned ~ ~ ~ run kill @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5] data merge block ~ ~ ~ {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "empty" function #gm4_liquid_tanks:remove_liquid_tags tag @s add gm4_lt_empty ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/init.mcfunction ================================================ scoreboard objectives add gm4_lt_value dummy scoreboard objectives add gm4_lt_max dummy scoreboard objectives add gm4_lt_prior_val dummy scoreboard objectives add gm4_lt_disp_val dummy scoreboard objectives add gm4_lt_util dummy execute unless score liquid_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Liquid Tanks"} execute unless score liquid_tanks gm4_earliest_version < liquid_tanks gm4_modules run scoreboard players operation liquid_tanks gm4_earliest_version = liquid_tanks gm4_modules scoreboard players set liquid_tanks gm4_modules 1 schedule function gm4_liquid_tanks:main 1t #$moduleUpdateList ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/item_process.mcfunction ================================================ #@s = liquid tank with item in first slot #run from liquid_tanks:process # get stack count for smart interface execute store result score $stack_size gm4_lt_value if items block ~ ~ ~ container.0 * #tank init execute if score @s[tag=gm4_lt_empty] gm4_lt_value matches 0 unless entity @s[tag=gm4_lt_fill] run function #gm4_liquid_tanks:tank_init #item drain execute unless entity @s[tag=gm4_lt_fill] run function #gm4_liquid_tanks:item_drain #item fill execute unless entity @s[tag=gm4_lt_drain] run function #gm4_liquid_tanks:item_fill ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/level_report_ray.mcfunction ================================================ #@s = all players at @s #run from main execute anchored eyes positioned ^ ^ ^.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^1.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^2.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check execute unless entity @s[tag=gm4_lt_found_tank] anchored eyes positioned ^ ^ ^3.5 if block ~ ~ ~ hopper align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_liquid_tank,distance=..0.1] run function #gm4_liquid_tanks:level_report_check tag @s remove gm4_lt_found_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/liquid_value_update.mcfunction ================================================ #@s = liquid tank #run from liquid_tanks:process #normalize incase of overflow scoreboard players operation @s gm4_lt_value < @s gm4_lt_max #store new value of prior_value scoreboard players operation @s gm4_lt_prior_val = @s gm4_lt_value #if value of 0, set to empty execute if score @s gm4_lt_value matches ..0 at @s run function gm4_liquid_tanks:empty #calculating teleport distance scoreboard players operation last_liquid_height gm4_lt_disp_val = @s gm4_lt_disp_val scoreboard players operation liquid_height_calc gm4_lt_disp_val = @s gm4_lt_value scoreboard players set #10 gm4_lt_disp_val 10 scoreboard players operation liquid_height_calc gm4_lt_disp_val *= #10 gm4_lt_disp_val scoreboard players operation liquid_height_calc gm4_lt_disp_val /= @s gm4_lt_max scoreboard players operation @s gm4_lt_disp_val = liquid_height_calc gm4_lt_disp_val scoreboard players operation liquid_height_calc gm4_lt_disp_val -= last_liquid_height gm4_lt_disp_val #teleport proper number of times. execute if score liquid_height_calc gm4_lt_disp_val matches 1.. at @s run function gm4_liquid_tanks:teleport_display_up execute if score liquid_height_calc gm4_lt_disp_val matches ..-1 at @s run function gm4_liquid_tanks:teleport_display_down ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/create.mcfunction ================================================ # places the liquid_tank down # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/verify_place_down # place block depending on face_placement execute if score $face_placement gm4_machine_data matches 1..2 run function gm4_liquid_tanks:machine/rotate/down execute if score $face_placement gm4_machine_data matches 3 run function gm4_liquid_tanks:machine/rotate/south execute if score $face_placement gm4_machine_data matches 4 run function gm4_liquid_tanks:machine/rotate/west execute if score $face_placement gm4_machine_data matches 5 run function gm4_liquid_tanks:machine/rotate/north execute if score $face_placement gm4_machine_data matches 6 run function gm4_liquid_tanks:machine/rotate/east # initialize scores execute as @e[type=marker,tag=gm4_new_machine,limit=1] run function gm4_liquid_tanks:machine/init_tank_scores # mark block as placed playsound block.end_portal_frame.fill block @a[distance=..30] ~ ~ ~ 1 0.5 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/destroy.mcfunction ================================================ # destroys the liquid_tank # @s = liquid_tank marker # located at @s # run from gm4_liquid_tanks:machine/verify_destroy # kill entities related to machine block execute positioned ~ ~0.4 ~ run kill @e[type=item_display,tag=gm4_liquid_tank_display,limit=1,distance=..0.01] execute positioned ~ ~0.15 ~ run kill @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.3,limit=1] execute positioned ~ ~0.5 ~ run kill @e[type=area_effect_cloud,distance=..0.5,tag=gm4_lt_util_block] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:hopper",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle minecraft:block{block_state:"minecraft:glass"} ~ ~0.5 ~ .1 .25 .1 .05 30 normal @a execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_liquid_tanks:items/liquid_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/init_tank_scores.mcfunction ================================================ # @s = new liquid tank marker # run from machine/create scoreboard players set @s gm4_lt_value 0 scoreboard players set @s gm4_lt_max 100 scoreboard players set @s gm4_lt_prior_val 0 tag @s add gm4_lt_empty ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/down.mcfunction ================================================ # places the liquid_tank down based on rotation # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/create # place hopper setblock ~ ~ ~ hopper[facing=down]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} # summon display entity and marker entity summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'} summon marker ~ ~ ~ {Tags:["gm4_liquid_tank","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank",Rotation:[0.0f,0.0f]} ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/east.mcfunction ================================================ # places the liquid_tank down based on rotation # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/create # place hopper setblock ~ ~ ~ hopper[facing=east]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} # summon display entity and marker entity summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank_side"]}}},Rotation:[-90.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'} summon marker ~ ~ ~ {Tags:["gm4_liquid_tank","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank",Rotation:[-90.0f,0.0f]} ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/north.mcfunction ================================================ # places the liquid_tank down based on rotation # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/create # place hopper setblock ~ ~ ~ hopper[facing=north]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} # summon display entity and marker entity summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank_side"]}}},Rotation:[180.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'} summon marker ~ ~ ~ {Tags:["gm4_liquid_tank","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank",Rotation:[180.0f,0.0f]} ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/south.mcfunction ================================================ # places the liquid_tank down based on rotation # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/create # place hopper setblock ~ ~ ~ hopper[facing=south]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} # summon display entity and marker entity summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank_side"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'} summon marker ~ ~ ~ {Tags:["gm4_liquid_tank","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank",Rotation:[0.0f,0.0f]} ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/rotate/west.mcfunction ================================================ # places the liquid_tank down based on rotation # @s = player who placed the liquid_tank # located at the center of the placed block # run from gm4_liquid_tanks:machine/create # place hopper setblock ~ ~ ~ hopper[facing=west]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.liquid_tank.empty","fallback":"Empty Tank","font":"gm4:default","color":"#404040"}]]}} # summon display entity and marker entity summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank_side"]}}},Rotation:[90.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]},item_display:'head'} summon marker ~ ~ ~ {Tags:["gm4_liquid_tank","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank",Rotation:[90.0f,0.0f]} ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_liquid_tank] run function gm4_liquid_tanks:machine/destroy ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"liquid_tank"} run function gm4_liquid_tanks:machine/create ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/main.mcfunction ================================================ # process machine execute as @e[type=marker,tag=gm4_liquid_tank] at @s run function gm4_liquid_tanks:process #tank level report execute as @a[gamemode=!spectator] at @s run function gm4_liquid_tanks:level_report_ray #self-perpetuating clock schedule function gm4_liquid_tanks:main 16t ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/process.mcfunction ================================================ #@s = liquid tanks #run from main #item processing execute if items block ~ ~ ~ container.0 * run function gm4_liquid_tanks:item_process #last item action resetting (requires updated tank data, so no refrence to storage) execute unless items block ~ ~ ~ container.0 * run tag @s remove gm4_lt_drain execute unless items block ~ ~ ~ container.0 * run tag @s remove gm4_lt_fill #entity processing execute if block ~ ~ ~ hopper[enabled=true] align xyz positioned ~ ~1 ~ if entity @e[type=!armor_stand,dx=0] run function #gm4_liquid_tanks:util_above execute if block ~ ~ ~ hopper[enabled=true] align xyz positioned ~ ~-1 ~ if entity @e[type=!armor_stand,dx=0] run function #gm4_liquid_tanks:util_below #display level update execute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/smart_item_drain.mcfunction ================================================ # run from expansions in their recipe files (ie standard_liquids:item_drain/bottle) # @s = liquid tank to be processed # calculate space required in tank for item stack scoreboard players operation $stack_value gm4_lt_value = $stack_size gm4_lt_value scoreboard players operation $stack_value gm4_lt_value *= $item_value gm4_lt_value # calculate available room in tank scoreboard players operation $tank_room gm4_lt_value = @s gm4_lt_max scoreboard players operation $tank_room gm4_lt_value -= @s gm4_lt_value # if there is room, continue scoreboard players set $smart_success gm4_lt_value 0 execute if score $stack_value gm4_lt_value <= $tank_room gm4_lt_value run function gm4_liquid_tanks:apply_output ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/smart_item_fill.mcfunction ================================================ # run from expansions in their recipe files (ie standard_liquids:item_fill/water_bucket) # @s = liquid tank to be processed # calculate space required in tank for item stack scoreboard players operation $stack_value gm4_lt_value = $stack_size gm4_lt_value scoreboard players operation $stack_value gm4_lt_value *= $item_value gm4_lt_value # calculate positive of stack_value scoreboard players set #-1 gm4_lt_value -1 scoreboard players operation $stack_value_pos gm4_lt_value = $stack_value gm4_lt_value scoreboard players operation $stack_value_pos gm4_lt_value *= #-1 gm4_lt_value # if there is enough liquid, continue scoreboard players set $smart_success gm4_lt_value 0 execute if score $stack_value_pos gm4_lt_value <= @s gm4_lt_value run function gm4_liquid_tanks:apply_output ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/teleport_display_down.mcfunction ================================================ #@s = liquid tank #run from liquid_value_update #teleport display down execute as @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5,limit=1] at @s run teleport @s ~ ~-.04 ~ scoreboard players add liquid_height_calc gm4_lt_disp_val 1 #loop if needed execute if score liquid_height_calc gm4_lt_disp_val matches ..-1 run function gm4_liquid_tanks:teleport_display_down ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/teleport_display_up.mcfunction ================================================ #@s = liquid tank #run from liquid_value_update #teleport display up execute as @e[type=item_display,tag=gm4_liquid_tank_liquid_display,distance=..0.5,limit=1] at @s run teleport @s ~ ~.04 ~ scoreboard players remove liquid_height_calc gm4_lt_disp_val 1 #loop if needed execute if score liquid_height_calc gm4_lt_disp_val matches 1.. run function gm4_liquid_tanks:teleport_display_up ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/upgrade_paths/2.8/entity_replacement.mcfunction ================================================ # @s = gm4_liquid_tank marker # at center of block # run by upgrade_paths/2.5 # replace primary armor stand with item display summon item_display ~ ~0.4 ~ {Tags:["gm4_liquid_tank_display","gm4_machine_stand","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_liquid_tank_display",item:{id:"glass",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/liquid_tank"]}}},Rotation:[0.0f,0.0f],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.438,0.438,0.438]}} data modify entity @e[type=item_display,limit=1,distance=..1,tag=gm4_new_machine] Rotation set from entity @e[type=armor_stand,limit=1,distance=..1,tag=gm4_liquid_tank_stand] Rotation kill @e[type=armor_stand,limit=1,distance=..1,tag=gm4_liquid_tank_stand] scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[tag=gm4_new_machine,distance=..1] remove gm4_new_machine # replace liquid armor stand with item display execute at @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1] positioned ~ ~1.15 ~ run summon item_display ~ ~ ~ {CustomName:"gm4_liquid_tank_liquid_display",Tags:["gm4_liquid_tank_liquid_display","smithed.entity","smithed.strict","gm4_new_liquid"],transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.001f,0f],scale:[0.83,0.83,0.83]},item_display:'head'} data modify entity @e[type=item_display,tag=gm4_new_liquid,limit=1,distance=..1] item set from entity @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1] equipment.head kill @e[type=armor_stand,limit=1,tag=gm4_liquid_tank_display,distance=..1] tag @e[tag=gm4_new_liquid,distance=..1] remove gm4_new_liquid scoreboard players set @s gm4_entity_version 2 ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/function/upgrade_paths/2.8.mcfunction ================================================ execute as @e[type=marker,tag=gm4_liquid_tank,scores={gm4_entity_version=1}] at @s run function gm4_liquid_tanks:upgrade_paths/2.8/entity_replacement ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/guidebook/liquid_tanks.json ================================================ { "id": "liquid_tanks", "name": "Liquid Tanks", "module_type": "base", "icon": { "id": "minecraft:glass" }, "criteria": { "obtain_hopper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:hopper" ] } ] } }, "obtain_comparator": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:comparator" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.liquid_tanks.description", "fallback": "Liquid Tanks can store various liquids in bulk.\n\nThe first slot of the liquid tank acts as both the input and output of the liquid tank." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_hopper" ], [ "obtain_comparator" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.liqud_tanks.crafting", "fallback": "Liquid Tanks can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_liquid_tanks:liquid_tank" } ] ] } ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/loot_table/items/liquid_tank.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_tanks:item/liquid_tank"]}, "minecraft:profile": "$liquid_tank" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'liquid_tank'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.liquid_tank", "fallback": "Liquid Tank", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/modules/liquid_wrappers.bolt ================================================ from functools import wraps, partial import re from inspect import isgeneratorfunction from beet import Context from mecha import Mecha, AstItemStack from bolt.contrib.defer import Defer from gm4.utils import add_namespace from gm4_liquid_tanks.mcmeta_stacksize import retrieve_stacksizes unstackables, stackable_16, _ = retrieve_stacksizes(ctx.cache, "26.1") # function that generates no mcfunction def emptyfunc(): pass class Liquid: """Base class providing decorators and infrastructure for adding Liquid Tanks liquids""" id: str = None capacity: int = None name: str = None skin: str = None # defaults to value of `liquids/id` if not otherwise set _fields = ['id', 'capacity', 'name'] _generators = [] # functions that create mcfunction using bolt _defer_counters = { '_singleton_util_below_tail': 0, '_singleton_util_below_head': 0 } # classvar for util_below cleanup defers def __init__(self, *args, **kwargs): # create instance attributes (named defined by _fields) based on constructor input_args = dict(zip(self._fields, args)) | kwargs for field in self._fields: if input_args.get(field, None): setattr(self, field, input_args.get(field, None)) self.units = {} # reusable quantities shared amongst liquids self.naming_schemes = NamingSchemes() # stores which function names are taken and generates new ones self.struc = Liquid self.mc = ctx.inject(Mecha) self.defer = ctx.inject(Defer) def __call__(self, cls): """instance acts as decorator for defining new class-structures""" @wraps(cls, updated=()) class DecoratedLiquid(cls, Liquid): pass # set unbound DecoratedLiquid class attributes for field in self._fields: if getattr(self, field, None): setattr(DecoratedLiquid, field, getattr(self, field, None)) # use the skin file of "id" if not otherwise specified. if not DecoratedLiquid.skin: DecoratedLiquid.skin = "liquids/"+DecoratedLiquid.id self.struc = DecoratedLiquid # link access to class variables through `self` for fcn in DecoratedLiquid._generators: fcn() # create the mcfunction DecoratedLiquid._generators.clear() return DecoratedLiquid def init(self, fcn=emptyfunc): @wraps(fcn) def wrapped_fcn(): function ~/../liquid_init/{self.struc.id}: data merge block ~ ~ ~ {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":f"container.gm4.liquid_tank.{self.struc.id}","fallback":f"{self.struc.name} Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":f"container.gm4.liquid_tank.{self.struc.id}","fallback":f"{self.struc.name} Tank","font":"gm4:default","color":"#404040"}]]}} summon item_display ~ ~ ~: CustomName: "gm4_liquid_tank_liquid_display" Tags: ["gm4_liquid_tank_liquid_display","smithed.entity","smithed.strict"] item: id: player_head count:1b components:{ "minecraft:profile": f"${(~/).split(':')[0]}:{self.struc.skin}" } transformation: left_rotation: [0f,0f,0f,1f] right_rotation: [0f,0f,0f,1f] translation: [0f,0.2185f,0f] scale: [0.83, 0.83, 0.83] item_display: head data modify entity @s data.gm4_liquid_tanks.liquid_tag set value f"gm4_lt_{self.struc.id}" scoreboard players set @s gm4_lt_max self.struc.capacity tag @s add f'gm4_lt_{self.struc.id}' tag @s remove gm4_lt_empty fcn() append function ~/../remove_liquid_tags: append function_tag gm4_liquid_tanks:remove_liquid_tags {"values": [(~/)]} tag @s remove f'gm4_lt_{self.struc.id}' # add function-tag hooks append function_tag gm4_liquid_tanks:tank_init {"values": [(~/../tank_init)]} append function_tag gm4_liquid_tanks:item_fill {"values": [(~/../item_fill)]} append function_tag gm4_liquid_tanks:item_drain {"values": [(~/../item_drain)]} append function_tag gm4_liquid_tanks:util_below {"values": [(~/../util_below)]} # append function_tag gm4_liquid_tanks:util_above {"values": [(~/../util_above)]} # give nicer info about this wrapped function if not used as decorator if fcn: wrapped_fcn.__qualname__ = "Liquid.init" else: wrapped_fcn.__qualname__ = fcn.__qualname__ self.struc._generators.append(wrapped_fcn) return wrapped_fcn @staticmethod def _default_set_output(item:str): item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with item def item_fill(self, input: str, output: str, value: int, reversable: bool = True, ignore_standard_units: bool = False): def dec_with_args(fcn, fcn_to_replace): @wraps(fcn) def wrapped_fcn(): output_id = output.split('[', 1)[0].removeprefix('minecraft:') ns_output = add_namespace(output_id, "minecraft") # retrieve max allowable stack size if ns_output in unstackables: stack_limit = "1" elif ns_output in stackable_16: stack_limit = "..16" else: stack_limit = "..64" # FIXME this should remove that execute subcommand from the chain.. somehow # retrieve name for generated function if not isinstance(fcn, partial): # not Liquid._default_set_output: func_name = fcn.__name__ self.naming_schemes.register(func_name, ~/../item_fill) else: func_name = self.naming_schemes.retrieve_and_register(input, output, ~/../item_fill) # transform any supplied mcfunction into generator genfcn = self._multiple_mcfunction(fcn) append function ~/../item_fill: execute if entity @s[tag=f'gm4_lt_{self.struc.id}'] if score $stack_size gm4_lt_value matches stack_limit if items block ~ ~ ~ container.0 input run function ~/{func_name}: scoreboard players set $item_value gm4_lt_value (-value) next(genfcn) # runs _default_set_output unless alternative is supplied function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill next(genfcn) # give nicer info about this wrapped function if not used as decorator if isinstance(fcn, partial): wrapped_fcn.__qualname__ = "Liquid.item_fill" else: wrapped_fcn.__qualname__ = fcn.__qualname__ if fcn_to_replace in self.struc._generators: self.struc._generators.remove(fcn_to_replace) self.struc._generators.append(wrapped_fcn) return wrapped_fcn # create reverse if reversable: self.item_drain(output, input, value) default_dec = dec_with_args(partial(self._default_set_output, item=output), None) return_dec = partial(dec_with_args, fcn_to_replace=default_dec) return return_dec def standard_unit(self, item: str, value: int, f_name: str = None): if not f_name: # mcfunction name f_name = item self.units.update({(item, value): f_name}) # let unit act as an 'item_fill' decorator with input already set def dispatch(output: str): return partial(self.item_fill, input=item, value=value)(output=output) return dispatch def item_drain(self, input: str, output: str, value: int): def dec_with_args(fcn, fcn_to_replace): @wraps(fcn) def wrapped_fcn(): # see if we can reuse a standard unit func_name = self.units.get((output, value), None) if func_name: self.naming_schemes.register(func_name, ~/../item_drain) # if not, retrive the name for the generated function if not func_name: func_name = self.naming_schemes.retrieve_and_register(input, output, ~/../item_drain) # transform any supplied mcfunction into generator genfcn = self._multiple_mcfunction(fcn) append function ~/../item_drain: execute if entity @s[tag=f'gm4_lt_{self.struc.id}'] if items block ~ ~ ~ container.0 input run function ~/{func_name}: scoreboard players set $item_value gm4_lt_value value next(genfcn) # runs _default_set_output unless alternative is supplied function gm4_liquid_tanks:smart_item_drain tag @s add gm4_lt_drain append function ~/../tank_init: execute if items block ~ ~ ~ container.0 input run function ~/../liquid_init/{self.struc.id} # give nicer info about this wrapped function if not used as decorator if isinstance(fcn, partial): wrapped_fcn.__qualname__ = "Liquid.item_fill" else: wrapped_fcn.__qualname__ = fcn.__qualname__ if fcn_to_replace in self.struc._generators: self.struc._generators.remove(fcn_to_replace) self.struc._generators.append(wrapped_fcn) return wrapped_fcn default_dec = dec_with_args(partial(self._default_set_output, item=output), None) return_dec = partial(dec_with_args, fcn_to_replace=default_dec) return return_dec def util_below(self, fcn=emptyfunc): # util below must always be used as a decorator - there is no "standard" interface # util is designed to work alongside existing functions (and not entirely in bolt) @wraps(fcn) def wrapped_fcn(): # function header if needed if ~/../util_below not in ctx.data.functions or "tag @s add gm4_processing_tank" not in ctx.data.functions[~/../util_below].lines: Liquid._defer_counters['_singleton_util_below_head'] += 1 @self.defer def _end_util_below(): Liquid._defer_counters['_singleton_util_below_head'] -= 1 if Liquid._defer_counters['_singleton_util_below_head'] <= 0: # only emit the commands if this is the last section of util_below prepend function ~/../util_below: tag @s add gm4_processing_tank # NOTE the function tail (tag remove processing_tank) cannot be removed easily by bolt, # so modules using both these wrappers and normal files will need to leave that line omitted # add commands append function ~/../util_below: execute if score @s[tag=f'gm4_lt_{self.struc.id}'] gm4_lt_value matches 1.. expand: fcn() @self.defer def _end_util_below(): Liquid._defer_counters['_singleton_util_below_tail'] -= 1 if Liquid._defer_counters['_singleton_util_below_tail'] <= 0: # only emit the commands if this is the last section of util_below append function ~/../util_below: tag @s remove gm4_processing_tank self.struc._generators.append(wrapped_fcn) Liquid._defer_counters['_singleton_util_below_tail'] += 1 return wrapped_fcn @staticmethod def _multiple_mcfunction(fcn): """Ensures the given function operates as a generator, allowing for multiple chunks of returned mcfunction""" if isgeneratorfunction(fcn): def accept_stopiteration(): # bolt does not have try/except yet, so this is an alternate implementation fcninst = fcn() while True: yield next(fcninst, None) return accept_stopiteration() else: def genfunc(): yield fcn() while True: yield None return genfunc() class NamingSchemes(): """Helper class for controlling how item_drain/ and item_fill/ functions are named""" used_names: dict[str, set[str]] = {} def __init__(self): self.schemes = [ self.potion, self.not_air, self.output_name, self.input_name, self.combined_name ] def retrieve_and_register(self, input: str, output: str, location: str) -> str: local_used_names = self.used_names.setdefault(location, set()) for scheme in self.schemes: func_name = scheme(input, output) if func_name and func_name not in local_used_names: local_used_names.add(func_name) return func_name return "NULL" # FIXME error logging from bolt? How to def register(self, func_name: str, location: str): local_used_names = self.used_names.setdefault(location, set()) local_used_names.add(func_name) @staticmethod def output_name(input_name: str, output_name: str) -> str: return output_name.split('[', 1)[0].removeprefix('minecraft:') @staticmethod def input_name(input_name: str, output_name: str) -> str: return input_name.split('[', 1)[0].removeprefix('minecraft:') @staticmethod def combined_name(input_name: str, output_name: str) -> str: return f"{input_name.split('[', 1)[0].removeprefix('minecraft:')}_{output_name.split('[', 1)[0].removeprefix('minecraft:')}" @staticmethod def potion(input_name: str, output_name: str) -> str | bool: m = re.match(r'.+?potion_contents=\{potion:\"(.+)\"\}', output_name) if m: return f"{m.group(1)}_potion" return False @staticmethod def not_air(input_name: str, output_name: str) -> str | bool: if output_name == "air": return input_name # always name a clear item operation after what is being cleared return False liquid = Liquid() # common instance for most cases ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/recipe/liquid_tank.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "IGI", "ICI", " H " ], "key": { "I": "minecraft:iron_ingot", "G": "minecraft:glass", "C": "minecraft:comparator", "H": "minecraft:hopper" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_liquid_tanks:item/liquid_tank"]}, "minecraft:profile": "$liquid_tank", "minecraft:custom_data": "{gm4_machines:{id:'liquid_tank'}}", "minecraft:custom_name": {"translate":"block.gm4.liquid_tank","fallback":"Liquid Tank","color":"white","italic":false} } } } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/item_drain.json ================================================ { "values":[ "gm4_standard_liquids:item_drain" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json ================================================ { "values":[ "gm4_standard_liquids:item_fill" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/level_report_check.json ================================================ { "values":[ "gm4_standard_liquids:level_report_check" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/remove_liquid_tags.json ================================================ { "values":[ "gm4_standard_liquids:remove_liquid_tags" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/tank_init.json ================================================ { "values":[ "gm4_standard_liquids:tank_init" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/util_above.json ================================================ { "values":[ "gm4_standard_liquids:util_above" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/tags/function/util_below.json ================================================ { "values":[ "gm4_standard_liquids:util_below" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/change_type.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # @timeout 200 # create lava tank item replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket await entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside # make sure it doesn't accept water item replace block ~1 ~3 ~1 container.0 with minecraft:water_bucket await delay 1s assert items block ~1 ~3 ~1 container.0 minecraft:water_bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside # empty the lava data merge block ~1 ~3 ~1 {Items:[]} await delay 1s item replace block ~1 ~3 ~1 container.0 with minecraft:bucket await items block ~1 ~3 ~1 container.0 minecraft:lava_bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside # change to water tank data merge block ~1 ~3 ~1 {Items:[]} await delay 1s item replace block ~1 ~3 ~1 container.0 with minecraft:water_bucket await items block ~1 ~3 ~1 container.0 minecraft:bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_water,scores={gm4_lt_value=3,gm4_lt_max=300}] inside ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/deposit_xp.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # @dummy ~ ~1 ~ xp add @s 100 execute at @s run tp @s ~1 ~4 ~1 await entity @s[level=0] # there is a slight loss of xp points assert score @e[tag=gm4_liquid_tank,distance=..5,limit=1] gm4_lt_value matches 80..100 ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/drain_xp.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # @dummy ~ ~1 ~ item replace block ~1 ~3 ~1 container.0 with minecraft:experience_bottle 10 execute at @s run tp @s ~1 ~1 ~1 await entity @s[level=6] await score @e[tag=gm4_liquid_tank,distance=..5,limit=1] gm4_lt_value matches 0 ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/honey_cast.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # @dummy ~ ~1 ~ # @timeout 800 # create honey tank item replace block ~1 ~3 ~1 container.0 with minecraft:honey_block await not items block ~1 ~3 ~1 container.0 minecraft:honey_block # place cauldron setblock ~2 ~3 ~1 cauldron # link cauldron (dummy faces tank) execute at @s run tp @s ~ ~ ~ -45 -45 await delay 1s assert entity @e[tag=gm4_lt_util_block,type=area_effect_cloud] inside # check casting success await entity @e[type=item_display,tag=gm4_lt_honey_display] inside await delay 5s assert entity @e[type=item,nbt={Item:{id:"minecraft:honey_block"}}] inside ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/lava_fuel.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # @dummy ~ ~1 ~ # create lava tank item replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket await not items block ~1 ~3 ~1 container.0 minecraft:lava_bucket # place furnace setblock ~2 ~3 ~1 furnace # link furnace (dummy faces tank) execute at @s run tp @s ~ ~ ~ -45 ~-45 await delay 1s assert entity @e[tag=gm4_lt_util_block,type=area_effect_cloud] inside # check furnace fueling item replace block ~2 ~3 ~1 container.0 with minecraft:raw_iron await delay 1s assert block ~2 ~3 ~1 minecraft:furnace[lit=true] assert score @n[tag=gm4_liquid_tank] gm4_lt_value matches 2 # check we don't duplicate fuel setblock ~2 ~3 ~1 stone setblock ~1 ~3 ~ blast_furnace setblock ~1 ~3 ~2 furnace setblock ~ ~3 ~1 furnace await entity @e[tag=gm4_lt_util_block,type=area_effect_cloud,y_rotation=90] inside item replace block ~1 ~3 ~ container.0 with minecraft:raw_iron item replace block ~1 ~3 ~2 container.0 with minecraft:raw_iron item replace block ~ ~3 ~1 container.0 with minecraft:raw_iron await delay 1s scoreboard objectives add gm4_test dummy scoreboard players set $fueled gm4_test 0 execute if block ~1 ~3 ~ minecraft:blast_furnace[lit=true] run scoreboard players add $fueled gm4_test 1 execute if block ~1 ~3 ~2 minecraft:furnace[lit=true] run scoreboard players add $fueled gm4_test 1 execute if block ~ ~3 ~1 minecraft:furnace[lit=true] run scoreboard players add $fueled gm4_test 1 assert score $fueled gm4_test matches 2 assert score @n[tag=gm4_liquid_tank] gm4_lt_value matches 0 ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/lava_tank.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # create lava tank item replace block ~1 ~3 ~1 container.0 with minecraft:lava_bucket await items block ~1 ~3 ~1 container.0 minecraft:bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_lava,scores={gm4_lt_value=3,gm4_lt_max=300}] inside # empty the tank data merge block ~1 ~3 ~1 {Items:[]} await delay 1s item replace block ~1 ~3 ~1 container.0 with minecraft:bucket await items block ~1 ~3 ~1 container.0 minecraft:lava_bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside # try bucket on empty tank item replace block ~1 ~3 ~1 container.0 with minecraft:bucket await delay 1s await items block ~1 ~3 ~1 container.0 minecraft:bucket ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/milk_tank.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup # create milk tank await delay 1s summon cow ~1.5 ~4 ~1.5 await entity @e[tag=gm4_liquid_tank,tag=gm4_lt_milk,scores={gm4_lt_value=3,gm4_lt_max=300}] inside # check cow is on cooldown await delay 2s assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_milk,scores={gm4_lt_value=3,gm4_lt_max=300}] inside # empty the tank item replace block ~1 ~3 ~1 container.0 with minecraft:bucket await items block ~1 ~3 ~1 container.0 minecraft:milk_bucket assert entity @e[tag=gm4_liquid_tank,tag=gm4_lt_empty,scores={gm4_lt_value=0}] inside ================================================ FILE: gm4_liquid_tanks/data/gm4_liquid_tanks/test/place.mcfunction ================================================ # @template gm4:test_platform # @dummy ~ ~1 ~ loot give @s loot gm4_liquid_tanks:items/liquid_tank execute at @s run tp @s ~ ~ ~ facing ~1 ~-1.5 ~1 dummy @s use block ~1 ~ ~1 assert block ~1 ~1 ~1 hopper assert entity @e[tag=gm4_liquid_tank,distance=..3] ================================================ FILE: gm4_liquid_tanks/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_liquid_tanks:machine/verify_destroy" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_liquid_tanks:machine/verify_place_down" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/advancement/use_glow_ink_bottle_on_sign.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:any_block_use", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_standard_liquids:{potion:\"glowing\"}}" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:all_signs" } } } ] } } }, "rewards": { "function": "gm4_standard_liquids:util/signs/glow_ink_sign" } } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/advancement/use_ink_bottle_on_sign.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:any_block_use", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_standard_liquids:{potion:\"blindness\"}}" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:all_signs" } } } ] } } }, "rewards": { "function": "gm4_standard_liquids:util/signs/ink_sign" } } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/100.mcfunction ================================================ #@s = player looking at tank positioned as tank stand #run from standard_liquids:level_report_check title @s actionbar [{"score":{"name":"@e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1]","objective":"gm4_lt_value"},"color":"dark_green"},{"text":" / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] tag @s add gm4_lt_found_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/300.mcfunction ================================================ #@s = player looking at tank positioned as tank stand #run from standard_liquids:level_report_check #calculate displayed value from raw value scoreboard players operation $gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value scoreboard players operation $gm4_lt_report_remain gm4_lt_value = $gm4_lt_report_calc gm4_lt_value scoreboard players set #3 gm4_lt_value 3 scoreboard players operation $gm4_lt_report_calc gm4_lt_value /= #3 gm4_lt_value scoreboard players operation $gm4_lt_report_remain gm4_lt_value %= #3 gm4_lt_value execute if score $gm4_lt_report_calc gm4_lt_value matches 0 if score $gm4_lt_report_remain gm4_lt_value matches 1.. run scoreboard players reset $gm4_lt_report_calc gm4_lt_value execute if score $gm4_lt_report_remain gm4_lt_value matches 0 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":" / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] execute if score $gm4_lt_report_remain gm4_lt_value matches 1 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":"⅓ / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] execute if score $gm4_lt_report_remain gm4_lt_value matches 2 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":"⅔ / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] scoreboard players reset $gm4_lt_report_calc gm4_lt_value scoreboard players reset $gm4_lt_report_remain gm4_lt_value tag @s add gm4_lt_found_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/400.mcfunction ================================================ #@s = player looking at tank positioned as tank stand #run from standard_liquids:level_report_check #calculate displayed value from raw value scoreboard players operation $gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value scoreboard players operation $gm4_lt_report_remain gm4_lt_value = $gm4_lt_report_calc gm4_lt_value scoreboard players set #4 gm4_lt_value 4 scoreboard players operation $gm4_lt_report_calc gm4_lt_value /= #4 gm4_lt_value scoreboard players operation $gm4_lt_report_remain gm4_lt_value %= #4 gm4_lt_value execute if score $gm4_lt_report_calc gm4_lt_value matches 0 if score $gm4_lt_report_remain gm4_lt_value matches 1.. run scoreboard players reset $gm4_lt_report_calc gm4_lt_value execute if score $gm4_lt_report_remain gm4_lt_value matches 0 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":" / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] execute if score $gm4_lt_report_remain gm4_lt_value matches 1 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":"¼ / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] execute if score $gm4_lt_report_remain gm4_lt_value matches 2 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":"½ / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] execute if score $gm4_lt_report_remain gm4_lt_value matches 3 run title @s actionbar [{"score":{"name":"$gm4_lt_report_calc","objective":"gm4_lt_value"},"color":"dark_green"},{"text":"¾ / 100 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.buckets","fallback":"Buckets","color":"dark_green"}] scoreboard players reset gm4_lt_report_calc gm4_lt_value tag @s add gm4_lt_found_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report/experience.mcfunction ================================================ #@s = player looking at tank positioned as tank stand #run from standard_liquids:level_report_check #getting value of tank being looked at scoreboard players operation gm4_lt_report_calc gm4_lt_value = @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_value #values hardcoded # 0-15 formula prior_points = 0 for lvl in range(1,52): if lvl <= 16: current_points = lvl**2 + 6*lvl elif lvl <= 31: current_points = 2.5*lvl**2 - 40.5*lvl + 360 else: current_points = 4.5*lvl**2 - 162.5*lvl + 2220 execute if score gm4_lt_report_calc gm4_lt_value matches (int(prior_points), int(current_points-1)) run title @s actionbar [{"text":f"{lvl-1} / 50 ","color":"dark_green"},{"translate":"text.gm4.liquid_tanks.level_report.levels","fallback":"Levels","color":"dark_green"}] prior_points = current_points scoreboard players reset gm4_lt_report_calc gm4_lt_value tag @s add gm4_lt_found_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/level_report_check.mcfunction ================================================ #@s = player looking at tank positioned at tank marker #run from #gm4_liquid_tanks:level_report_check in liquid_tanks:level_report_ray #actual max of 100 execute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 100 run function gm4_standard_liquids:level_report/100 #actual max of 300 execute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 300 run function gm4_standard_liquids:level_report/300 #actual max of 400 execute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 400 run function gm4_standard_liquids:level_report/400 #max 5345 (xp) execute if score @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] gm4_lt_max matches 5345 run function gm4_standard_liquids:level_report/experience #linking of util tanks to adjacent blocks execute as @e[type=marker,tag=gm4_liquid_tank,distance=..0.1,limit=1] positioned ~ ~-0.5 ~ run function gm4_standard_liquids:util/link_blocks ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_lava_cauldron.mcfunction ================================================ #@s = lava tank below a cauldron, at the cauldron # run from standard_liquids:util/drain_cauldron scoreboard players add @s gm4_lt_value 3 setblock ~ ~ ~ cauldron playsound item.bucket.fill_lava block @a[distance=..10] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_powder_snow_cauldron.mcfunction ================================================ #@s = snow tank below a cauldron, at the cauldron # run from standard_liquids:util/drain_cauldron scoreboard players set $drain_success gm4_lt_util 0 execute store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=1] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1 execute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=2] if score @s gm4_lt_value matches ..298 run scoreboard players add @s gm4_lt_value 2 execute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:powder_snow_cauldron[level=3] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3 execute if score $drain_success gm4_lt_util matches 1 run setblock ~ ~ ~ cauldron execute if score $drain_success gm4_lt_util matches 1 run playsound item.bucket.fill_powder_snow block @a[distance=..10] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/drain_water_cauldron.mcfunction ================================================ #@s = water tank below a cauldron, at the cauldron # run from standard_liquids:util/drain_cauldron scoreboard players set $drain_success gm4_lt_util 0 execute store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=1] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1 execute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=2] if score @s gm4_lt_value matches ..298 run scoreboard players add @s gm4_lt_value 2 execute unless score $drain_success gm4_lt_util matches 1 store success score $drain_success gm4_lt_util if block ~ ~ ~ minecraft:water_cauldron[level=3] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3 execute if score $drain_success gm4_lt_util matches 1 run setblock ~ ~ ~ cauldron execute if score $drain_success gm4_lt_util matches 1 run playsound item.bucket.fill block @a[distance=..10] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_lava_cauldron.mcfunction ================================================ #@s = liquid tank, positioned at empty cauldron #run from standard_liquids:util/water_tank execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3 execute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:lava_cauldron execute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty_lava block @a[distance=..10] execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_powder_snow_cauldron.mcfunction ================================================ #@s = liquid tank, positioned at empty cauldron #run from standard_liquids:util/water_tank execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3 execute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:powder_snow_cauldron[level=3] execute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty_powder_snow block @a[distance=..10] execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/cauldrons/fill_water_cauldron.mcfunction ================================================ #@s = liquid tank, positioned at empty cauldron #run from standard_liquids:util/water_tank execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_value 3 execute if score @s gm4_lt_util matches 3.. run setblock ~ ~ ~ minecraft:water_cauldron[level=3] execute if score @s gm4_lt_util matches 3.. run playsound item.bucket.empty block @a[distance=..10] execute if score @s gm4_lt_util matches 3.. run scoreboard players remove @s gm4_lt_util 3 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/drain_cauldron.mcfunction ================================================ #@s = liquid tank with cauldron above it, at cauldron #run from util_above #init tank execute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:water_cauldron at @s run function gm4_standard_liquids:liquid_init/water execute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:lava_cauldron at @s run function gm4_standard_liquids:liquid_init/lava execute if entity @s[tag=gm4_lt_empty] if block ~ ~ ~ minecraft:powder_snow_cauldron at @s run function gm4_standard_liquids:liquid_init/powder_snow #water execute if entity @s[tag=gm4_lt_water] if score @s gm4_lt_value matches ..299 run function gm4_standard_liquids:util/cauldrons/drain_water_cauldron #powder_snow execute if entity @s[tag=gm4_lt_powder_snow] if score @s gm4_lt_value matches ..299 run function gm4_standard_liquids:util/cauldrons/drain_powder_snow_cauldron #lava execute if entity @s[tag=gm4_lt_lava] if block ~ ~ ~ minecraft:lava_cauldron if score @s gm4_lt_value matches ..297 run function gm4_standard_liquids:util/cauldrons/drain_lava_cauldron ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_levels.mcfunction ================================================ #@s = player above experience tank at center of tank #run from standard_liquids:util/experience/scheduled_deposit execute unless score @s gm4_lt_util matches 0.. run scoreboard players set @s gm4_lt_util 16 scoreboard players remove @s gm4_lt_util 1 execute if score @s gm4_lt_util matches ..0 run function gm4_standard_liquids:util/experience/deposit_one_level ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_one_level.mcfunction ================================================ #@s = player above experience tank at center of tank #run from standard_liquids:util/experience/deposit_levels # calculate points to remove one level execute store result score $points gm4_lt_util run experience query @s points execute store result score $levels gm4_lt_util run experience query @s levels scoreboard players set #2 gm4_lt_util 2 scoreboard players set #5 gm4_lt_util 5 scoreboard players set #9 gm4_lt_util 9 scoreboard players operation $level_calc gm4_lt_util = $levels gm4_lt_util execute unless score $levels gm4_lt_util matches 0 run scoreboard players remove $level_calc gm4_lt_util 1 execute if score $points gm4_lt_util matches 1.. run scoreboard players operation $level_calc gm4_lt_util = $points gm4_lt_util execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 1..15 run scoreboard players operation $level_calc gm4_lt_util *= #2 gm4_lt_util execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 1..15 run scoreboard players add $level_calc gm4_lt_util 7 execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 16..30 run scoreboard players operation $level_calc gm4_lt_util *= #5 gm4_lt_util execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 16..30 run scoreboard players remove $level_calc gm4_lt_util 38 execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 31.. run scoreboard players operation $level_calc gm4_lt_util *= #9 gm4_lt_util execute if score $points gm4_lt_util matches 0 if score $levels gm4_lt_util matches 31.. run scoreboard players remove $level_calc gm4_lt_util 158 # decrease points to whatever will fit into the tank scoreboard players set $overflow_calc gm4_lt_util 5345 scoreboard players operation $overflow_calc gm4_lt_util -= @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value scoreboard players operation $level_calc gm4_lt_util < $overflow_calc gm4_lt_util # add points to tank and remove from player scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value += $level_calc gm4_lt_util scoreboard players set #-1 gm4_lt_util -1 scoreboard players operation $level_calc gm4_lt_util *= #-1 gm4_lt_util execute store result storage gm4_liquid_tanks:temp exp.points int 1.0 run scoreboard players get $level_calc gm4_lt_util function gm4_standard_liquids:util/experience/macro_experience with storage gm4_liquid_tanks:temp exp execute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update # vfx execute unless score $level_calc gm4_lt_util matches 0 run playsound minecraft:entity.experience_orb.pickup block @s function #gm4_liquid_tanks:level_report_check # reset accelerating clock scoreboard players add @s gm4_lt_value 1 execute if score @s gm4_lt_value matches 1..4 run scoreboard players set @s gm4_lt_util 16 execute if score @s gm4_lt_value matches 5..10 run scoreboard players set @s gm4_lt_util 12 execute if score @s gm4_lt_value matches 11..18 run scoreboard players set @s gm4_lt_util 8 execute if score @s gm4_lt_value matches 19.. run scoreboard players set @s gm4_lt_util 4 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/deposit_points.mcfunction ================================================ #@s = player above experience tank at center of tank #run from standard_liquids:tick #dumps 5 (or 1) points of experience from player into tank execute store result score $available_points gm4_lt_util run experience query @s points execute if score $available_points gm4_lt_util matches 0 if entity @s[level=1..] run scoreboard players set $available_points gm4_lt_util 5 execute if score $available_points gm4_lt_util matches 4.. if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value matches ..5340 run experience add @s -4 points execute if score $available_points gm4_lt_util matches 4.. if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value matches ..5340 run scoreboard players add @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value 4 execute if score $available_points gm4_lt_util matches 1.. run experience add @s -1 points execute if score $available_points gm4_lt_util matches 1.. run scoreboard players add @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value 1 function #gm4_liquid_tanks:level_report_check execute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/macro_experience.mcfunction ================================================ # macro-function to add/remove a dynamic number of experience points # run from util/experience/deposit_one_level, util/experience/withdraw_one_level $experience add @s $(points) points ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/scheduled_deposit.mcfunction ================================================ # scheduled from standard_liquids:util_above # initialize empty tanks execute as @a[gamemode=!spectator,level=1..] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_empty] run function gm4_standard_liquids:liquid_init/experience # non-sneaking deposits points execute as @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_experience] gm4_lt_value matches ..5344 run function gm4_standard_liquids:util/experience/deposit_points # sneaking deposits levels scoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_value scoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_util execute as @a[gamemode=!spectator,predicate=gm4_standard_liquids:sneaking] at @s if block ~ ~-0.4 ~ hopper[enabled=true] positioned ~ ~-0.4 ~ align xyz positioned ~0.5 ~0.5 ~0.5 if score @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5,tag=gm4_lt_experience] gm4_lt_value matches ..5344 run function gm4_standard_liquids:util/experience/deposit_levels scoreboard players set $schedule_deposit_exp gm4_lt_util 2 schedule function gm4_standard_liquids:util/experience/scheduled_deposit 1t ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/scheduled_withdraw.mcfunction ================================================ # scheduled from standard_liquids:util_below # non-sneaking retrieves points execute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_experience] at @s if block ~ ~ ~ hopper[enabled=true] positioned ~ ~-2.5 ~ if entity @a[distance=..0.5,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] if score @s gm4_lt_value matches 1.. run function gm4_standard_liquids:util/experience/withdraw_points # sneaking retrieves levels scoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_value scoreboard players reset @a[gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] gm4_lt_util execute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_experience] at @s if block ~ ~ ~ hopper[enabled=true] positioned ~ ~-2.5 ~ if score @s gm4_lt_value matches 1.. as @a[distance=..0.5,gamemode=!spectator,predicate=gm4_standard_liquids:sneaking,limit=1] positioned ~ ~2.5 ~ run function gm4_standard_liquids:util/experience/withdraw_levels scoreboard players set $schedule_withdraw_exp gm4_lt_util 2 schedule function gm4_standard_liquids:util/experience/scheduled_withdraw 1t ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_levels.mcfunction ================================================ #@s = player below experience tank at center of tank #run from standard_liquids:util/experience/scheduled_withdraw execute unless score @s gm4_lt_util matches 0.. run scoreboard players set @s gm4_lt_util 16 scoreboard players remove @s gm4_lt_util 1 execute if score @s gm4_lt_util matches ..0 run function gm4_standard_liquids:util/experience/withdraw_one_level ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_one_level.mcfunction ================================================ #@s = player below experience tank at center of tank #run from standard_liquids:util/experience/deposit_levels # calculate points to add one level execute store result score $points gm4_lt_util run experience query @s points execute store result score $levels gm4_lt_util run experience query @s levels scoreboard players set #2 gm4_lt_util 2 scoreboard players set #5 gm4_lt_util 5 scoreboard players set #9 gm4_lt_util 9 scoreboard players operation $level_calc gm4_lt_util = $levels gm4_lt_util execute if score $levels gm4_lt_util matches 0..15 run scoreboard players operation $level_calc gm4_lt_util *= #2 gm4_lt_util execute if score $levels gm4_lt_util matches 0..15 run scoreboard players add $level_calc gm4_lt_util 7 execute if score $levels gm4_lt_util matches 16..30 run scoreboard players operation $level_calc gm4_lt_util *= #5 gm4_lt_util execute if score $levels gm4_lt_util matches 16..30 run scoreboard players remove $level_calc gm4_lt_util 38 execute if score $levels gm4_lt_util matches 31.. run scoreboard players operation $level_calc gm4_lt_util *= #9 gm4_lt_util execute if score $levels gm4_lt_util matches 31.. run scoreboard players remove $level_calc gm4_lt_util 158 scoreboard players operation $level_calc gm4_lt_util -= $points gm4_lt_util # decrease points to not take more than tank has scoreboard players operation $level_calc gm4_lt_util < @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value # remove points from tank and add to player scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] gm4_lt_value -= $level_calc gm4_lt_util execute store result storage gm4_liquid_tanks:temp exp.points int 1.0 run scoreboard players get $level_calc gm4_lt_util function gm4_standard_liquids:util/experience/macro_experience with storage gm4_liquid_tanks:temp exp execute as @e[type=marker,tag=gm4_liquid_tank,limit=1,distance=..0.5] unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update # vfx execute unless score $level_calc gm4_lt_util matches 0 run playsound minecraft:entity.experience_orb.pickup block @s from itertools import product, count c = count(0) for offset in product([0, -0.05, 0.05], repeat=2): # summons 5 xp orbs at different locations, for a "bigger" looking withdrawl if 0 not in offset: continue dx, dz = offset execute unless score $level_calc gm4_lt_util matches 0 run summon experience_orb ~dx ~-0.6 ~dz {Age:(5994-next(c)),Value:0} function #gm4_liquid_tanks:level_report_check # reset accelerating clock scoreboard players add @s gm4_lt_value 1 execute if score @s gm4_lt_value matches 1..4 run scoreboard players set @s gm4_lt_util 16 execute if score @s gm4_lt_value matches 5..10 run scoreboard players set @s gm4_lt_util 12 execute if score @s gm4_lt_value matches 11..18 run scoreboard players set @s gm4_lt_util 8 execute if score @s gm4_lt_value matches 19.. run scoreboard players set @s gm4_lt_util 4 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience/withdraw_points.mcfunction ================================================ #@s = tank with player below it positioned ~ ~-2.5 ~ #run from standard_liquids:tick execute if score @s gm4_lt_value matches 4.. run experience add @a[distance=..0.5,limit=1,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] 4 execute if score @s gm4_lt_value matches 4.. run scoreboard players remove @s gm4_lt_value 4 execute if score @s gm4_lt_value matches 1.. run experience add @a[distance=..0.5,limit=1,gamemode=!spectator,predicate=!gm4_standard_liquids:sneaking] 1 execute if score @s gm4_lt_value matches 1.. run scoreboard players remove @s gm4_lt_value 1 execute if score @s gm4_lt_value matches 1.. run summon experience_orb ~ ~1.8 ~ {Age:5995,Value:0} execute as @a[distance=..0.5,limit=1,gamemode=!spectator] positioned ~ ~2.5 ~ align xyz positioned ~0.5 ~0.5 ~0.5 run function #gm4_liquid_tanks:level_report_check execute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/experience_orb.mcfunction ================================================ #@s = xp-orb above liquid tank #run from standard_liquids:util_above #get xp orb's value execute store result score experience_value gm4_lt_util run data get entity @s Value #try to add to tank execute store success score deposit_success gm4_lt_util run scoreboard players operation @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,limit=1,scores={gm4_lt_value=..1394}] gm4_lt_value += experience_value gm4_lt_util #if added, kill self execute if score deposit_success gm4_lt_util matches 1 run kill @s ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/fill_cauldrons.mcfunction ================================================ #@s = liquid tank filling a cauldron #run from util_above execute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0] run scoreboard players add @s gm4_lt_util 3 scoreboard players operation @s gm4_lt_util < @s gm4_lt_value execute if entity @s[tag=gm4_lt_water] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_water_cauldron execute if entity @s[tag=gm4_lt_lava] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_lava_cauldron execute if entity @s[tag=gm4_lt_powder_snow] at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron run function gm4_standard_liquids:util/cauldrons/fill_powder_snow_cauldron scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/fuel_furnace.mcfunction ================================================ #@s = liquid tank, positioned at furnace #scheduled run from standard_liquids:util/furnace_fueling/furnace_start #remove hoe if not furnace not started execute if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=false] if items block ~ ~ ~ container.1 *[custom_data~{tankhoe:1b}] run item replace block ~ ~ ~ container.1 with air #adjust burntime and remove lava scoreboard players operation @s gm4_lt_prior_val = @s gm4_lt_value execute unless block ~ ~ ~ #gm4_standard_liquids:double_speed store success score lava_fueling gm4_lt_util if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=true]{cooking_time_spent:1s,lit_time_remaining:200s} run data merge block ~ ~ ~ {lit_time_remaining:6600s} execute if block ~ ~ ~ #gm4_standard_liquids:double_speed store success score lava_fueling gm4_lt_util if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=true]{cooking_time_spent:1s,lit_time_remaining:100s} run data merge block ~ ~ ~ {lit_time_remaining:3300s} execute if score lava_fueling gm4_lt_util matches 1.. run scoreboard players remove @s gm4_lt_value 1 scoreboard players reset lava_fueling gm4_lt_util tag @s remove gm4_lt_furnace_start execute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/furnace_start.mcfunction ================================================ #@s = liquid tank, positioned at furnace #run from standard_liquids:util/furnace_fueling/lava_tank execute if score @s gm4_lt_util matches 1.. run item replace block ~ ~ ~ container.1 with wooden_hoe[damage=59,item_name="Bug",custom_data={tankhoe:1b}] 1 execute if score @s gm4_lt_util matches 1.. run data merge block ~ ~ ~ {cooking_time_spent:0} execute if score @s gm4_lt_util matches 1.. run tag @s add gm4_lt_furnace_start execute if score @s gm4_lt_util matches 1.. run scoreboard players remove @s gm4_lt_util 1 #schedule furnace fueling one tick later; when furnace processes hoe and ignites schedule function gm4_standard_liquids:util/furnace_fueling/scheduled_furnace_fuel 1t ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/lava_tank.mcfunction ================================================ #@s = lava liquid tank #run from util_above execute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0] run scoreboard players add @s gm4_lt_util 1 scoreboard players operation @s gm4_lt_util < @s gm4_lt_value execute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ #gm4_standard_liquids:furnace[lit=false]{Items:[{Slot:0b}]} unless block ~ ~ ~ #gm4_standard_liquids:furnace{Items:[{Slot:1b}]} run function gm4_standard_liquids:util/furnace_fueling/furnace_start scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/furnace_fueling/scheduled_furnace_fuel.mcfunction ================================================ #@s = server. Scheduled function #scheduled by standard_liquids:util/furnace_fueling/furnace_start #provide lava to tanks ignited last tick execute as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_lt_furnace_start] at @s align xyz positioned ~ ~1 ~ at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_furnace,dx=0,limit=4] positioned ^ ^-1 ^1 run function gm4_standard_liquids:util/furnace_fueling/fuel_furnace ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_cauldron.mcfunction ================================================ #@s = liquid tank, positioned at empty cauldron #run from standard_liquids:util_above execute if score @s gm4_lt_util matches 4.. run scoreboard players remove @s gm4_lt_value 4 execute if score @s gm4_lt_util matches 4.. run summon item_display ~0.5 ~ ~0.5 : Tags:["gm4_lt_honey_display","gm4_no_edit"] CustomName:"gm4_lt_honey_display" item: id: "minecraft:honey_block" count: 1 components: {"minecraft:custom_model_data":{"strings":["gm4_liquid_tanks:block/cast_honey_block"]}} transformation: left_rotation: [0,0,0,1] right_rotation: [0,0,0,1] scale: [0.9,0.01,0.9] translation: [0.0,0.2,0.0] teleport_duration: 4 execute if score @s gm4_lt_util matches 4.. run playsound block.honey_block.slide block @a[distance=..10] ~ ~ ~ 1 0.5 execute if score @s gm4_lt_util matches 4.. run scoreboard players remove @s gm4_lt_util 4 execute unless score @s gm4_lt_prior_val = @s gm4_lt_value run function gm4_liquid_tanks:liquid_value_update schedule function gm4_standard_liquids:util/honey_casting/scheduled_honey_rise 4t ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_rise.mcfunction ================================================ #@s = gm4_honey_display #run from standard_liquids:util/honey_casting/scheduled_honey_rise scoreboard players add @s gm4_lt_util 1 execute if score @s gm4_lt_util matches ..12 run teleport @s ~ ~0.060 ~ execute unless block ~ ~ ~ #minecraft:cauldrons run kill @s execute if score @s gm4_lt_util matches 16.. run function gm4_standard_liquids:util/honey_casting/honey_stop ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_stop.mcfunction ================================================ #@s = gm4_lt_honey_display #run from standard_liquids:util/honey_casting/honey_rise summon item ~ ~ ~ {Item:{id:"honey_block",count:1}} playsound block.honey_block.place block @a[distance=..10] kill @s execute unless entity @e[type=item_display,tag=gm4_lt_honey_display,limit=1] run schedule clear gm4_standard_liquids:util/honey_casting/honey_rise ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/honey_tank.mcfunction ================================================ #@s = honey liquid tank #run from util_above execute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0] run scoreboard players add @s gm4_lt_util 4 scoreboard players operation @s gm4_lt_util < @s gm4_lt_value execute at @e[type=area_effect_cloud,tag=gm4_lt_util_block,tag=gm4_ltu_cauldron,dx=0,limit=4] positioned ^ ^-1 ^1 if block ~ ~ ~ minecraft:cauldron align xz unless entity @e[type=item_display,tag=gm4_lt_honey_display,dx=0] run function gm4_standard_liquids:util/honey_casting/honey_cauldron ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/honey_casting/scheduled_honey_rise.mcfunction ================================================ #@s = server #scheduled from standard_liquids:util/honey_casting/honey_cauldron and self execute as @e[type=item_display,tag=gm4_lt_honey_display] at @s run function gm4_standard_liquids:util/honey_casting/honey_rise schedule function gm4_standard_liquids:util/honey_casting/scheduled_honey_rise 4t ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/link_blocks.mcfunction ================================================ #@s = tank stand being looked at #run from standard_liquids:level_report_check #checks adjacent blocks and summons corresponding area_effect_clouds execute positioned ~ ~1 ~ run kill @e[type=area_effect_cloud,distance=..0.5,tag=gm4_lt_util_block] #cauldron execute if block ~-1 ~ ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_west","gm4_ltu_cauldron"],Rotation:[90.0f,0.0f],Radius:0,Duration:-1} execute if block ~1 ~ ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_east","gm4_ltu_cauldron"],Rotation:[-90.0f,0.0f],Radius:0,Duration:-1} execute if block ~ ~ ~-1 #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_north","gm4_ltu_cauldron"],Rotation:[180.0f,0.0f],Radius:0,Duration:-1} execute if block ~ ~ ~1 #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_south","gm4_ltu_cauldron"],Rotation:[0.0f,0.0f],Radius:0,Duration:-1} execute if block ~ ~1 ~ #minecraft:cauldrons run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_dripstone_cauldron"],Rotation:[0.0f,-90.0f],Radius:0,Duration:-1} #furnace execute if block ~-1 ~ ~ #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_west","gm4_ltu_furnace"],Rotation:[90.0f,0.0f],Radius:0,Duration:-1} execute if block ~1 ~ ~ #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_east","gm4_ltu_furnace"],Rotation:[-90.0f,0.0f],Radius:0,Duration:-1} execute if block ~ ~ ~-1 #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_north","gm4_ltu_furnace"],Rotation:[180.0f,0.0f],Radius:0,Duration:-1} execute if block ~ ~ ~1 #gm4_standard_liquids:furnace run summon area_effect_cloud ~ ~1 ~ {custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},CustomName:"gm4_lt_util_block",Tags:["gm4_lt_util_block","gm4_ltu_south","gm4_ltu_furnace"],Rotation:[0.0f,0.0f],Radius:0,Duration:-1} ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/beetroot_soup.mcfunction ================================================ #@s = living-base entity below beetroot soup tank #run from standard_liquids:util_below effect give @s saturation 1 5 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 particle minecraft:item{item:"minecraft:red_concrete"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/glow_ink.mcfunction ================================================ #@s = living-base entity below glow ink tank #run from standard_liquids:util_below effect give @s glowing 60 0 effect give @s night_vision 90 0 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/honey.mcfunction ================================================ #@s = living-base entity below honey tank #run from standard_liquids:util_below effect give @s saturation 1 5 effect clear @s poison scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound item.honey_bottle.drink block @a[distance=..8] ~ ~ ~ .5 1.5 particle falling_honey ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/ink.mcfunction ================================================ #@s = living-base entity below ink tank #run from standard_liquids:util_below effect give @s blindness 120 0 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/milk.mcfunction ================================================ #@s = living-base entity below milk tank #run from standard_liquids:util_below effect clear @s scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 3 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 particle minecraft:item{item:"minecraft:snow"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/mushroom_stew.mcfunction ================================================ #@s = living-base entity below mushroom stew tank #run from standard_liquids:util_below effect give @s saturation 1 5 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 particle minecraft:item{item:"minecraft:white_terracotta"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/liquid_dispensing/rabbit_stew.mcfunction ================================================ #@s = living-base entity below rabbit stew tank #run from standard_liquids:util_below effect give @s saturation 1 9 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 particle minecraft:item{item:"minecraft:smooth_red_sandstone"} ~0.5 ~1 ~0.5 0.2 0.2 0.2 0 20 normal @a[distance=..16] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/cow.mcfunction ================================================ #@s = cow above liquid tank #run from standard_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/milk #add milk to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_milk,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/glow_squid.mcfunction ================================================ #@s = cow above liquid tank #run from standard_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/glow_ink #add milk to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_glow_ink,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 1 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/mooshroom.mcfunction ================================================ #@s = mooshroom above liquid tank #run from standard_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/mushroom_stew #add mushroom stew to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_mushroom_stew,distance=..8] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/snow_golem.mcfunction ================================================ #@s = snow_golem above liquid tank #run from standard_liquids:util_above scoreboard players add @s gm4_lt_util 1 execute at @s run particle minecraft:snowflake ~ ~0.2 ~ 0.25 0 0.25 0 5 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/powder_snow #add snow to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_powder_snow,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 1 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/mobs/squid.mcfunction ================================================ #@s = squid above liquid tank #run from standard_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/ink #add milk to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_ink,distance=..8] if score @s gm4_lt_value matches ..297 run scoreboard players add @s gm4_lt_value 3 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_glow_ink_sac_back.mcfunction ================================================ # @s = player clicked a sign with an ink bottle # at the sign they clicked # run from ink_sign data merge block ~ ~ ~ {back_text:{has_glowing_text:1b}} execute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle playsound minecraft:item.glow_ink_sac.use block @p[distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_glow_ink_sac_front.mcfunction ================================================ # @s = player clicked a sign with an ink bottle # at the sign they clicked # run from ink_sign data merge block ~ ~ ~ {front_text:{has_glowing_text:1b}} execute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle playsound minecraft:item.glow_ink_sac.use block @p[distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_ink_sac_back.mcfunction ================================================ # @s = player clicked a sign with an ink bottle # at the sign they clicked, alixn xyz # run from ink_sign data merge block ~ ~ ~ {back_text:{has_glowing_text:0b}} execute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle playsound minecraft:item.ink_sac.use block @p[distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/apply_ink_sac_front.mcfunction ================================================ # @s = player clicked a sign with an ink bottle # at the sign they clicked, alixn xyz # run from ink_sign data merge block ~ ~ ~ {front_text:{has_glowing_text:0b}} execute if entity @s[gamemode=!creative] run item replace entity @s weapon.mainhand with minecraft:glass_bottle playsound minecraft:item.ink_sac.use block @p[distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/front_back_detection.mcfunction ================================================ # @s = player attempting to apply ink # at sign block, align xyz # run from ink_sign and glow_ink_sign # lookup table converting blockstate to normal direction execute summon marker run function gm4_standard_liquids:util/signs/sign_normal_lookup # detection for which side of the sign center-plane is the player on scoreboard players set $sign_front gm4_lt_util 0 execute at @e[type=marker,tag=gm4_ink_normal,limit=1,distance=..4] positioned ^ ^ ^-1 facing entity @s feet rotated ~ 0 positioned ^ ^ ^1 if entity @e[type=marker,tag=gm4_ink_normal,distance=..1.414] run scoreboard players set $sign_front gm4_lt_util 1 kill @e[tag=gm4_ink_normal,type=marker,distance=..4] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/glow_ink_sign.mcfunction ================================================ # @s = player that just used an glow ink bottle on a sign # run from advancement use_ink_bottle_on_sign advancement revoke @s only gm4_standard_liquids:use_glow_ink_bottle_on_sign summon marker ~ ~ ~ {Tags:["gm4_ink_ray"]} execute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_ink_ray,limit=1] ^ ^ ^ ~ ~ scoreboard players set $ray gm4_lt_util 0 execute as @e[tag=gm4_ink_ray,distance=..8] at @s run function gm4_standard_liquids:util/signs/ray execute at @e[tag=gm4_ink_ray,distance=..8] align xyz run function gm4_standard_liquids:util/signs/front_back_detection execute at @e[tag=gm4_ink_ray,distance=..8] if block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} run playsound minecraft:block.sign.waxed_interact_fail block @p[distance=..8] execute if score $sign_front gm4_lt_util matches 1 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{front_text:{has_glowing_text:1b}} run function gm4_standard_liquids:util/signs/apply_glow_ink_sac_front execute if score $sign_front gm4_lt_util matches 0 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{back_text:{has_glowing_text:1b}} run function gm4_standard_liquids:util/signs/apply_glow_ink_sac_back kill @e[tag=gm4_ink_ray,type=marker,distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/ink_sign.mcfunction ================================================ # @s = player that just used an ink bottle on a sign # run from advancement use_ink_bottle_on_sign advancement revoke @s only gm4_standard_liquids:use_ink_bottle_on_sign summon marker ~ ~ ~ {Tags:["gm4_ink_ray"]} execute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_ink_ray,limit=1] ^ ^ ^ ~ ~ scoreboard players set $ray gm4_lt_util 0 execute as @e[tag=gm4_ink_ray,distance=..8] at @s run function gm4_standard_liquids:util/signs/ray execute at @e[tag=gm4_ink_ray,distance=..8] align xyz run function gm4_standard_liquids:util/signs/front_back_detection execute at @e[tag=gm4_ink_ray,distance=..8] if block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} run playsound minecraft:block.sign.waxed_interact_fail block @p[distance=..8] execute if score $sign_front gm4_lt_util matches 1 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{front_text:{has_glowing_text:0b}} run function gm4_standard_liquids:util/signs/apply_ink_sac_front execute if score $sign_front gm4_lt_util matches 0 at @e[tag=gm4_ink_ray,distance=..8] align xyz unless block ~ ~ ~ #minecraft:all_signs{is_waxed:1b} unless block ~ ~ ~ #minecraft:all_signs{back_text:{has_glowing_text:0b}} run function gm4_standard_liquids:util/signs/apply_ink_sac_back kill @e[tag=gm4_ink_ray,type=marker,distance=..8] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/ray.mcfunction ================================================ # @s = marker ray used to detect the sign # run from both ink_sign and glow_ink_sign scoreboard players add $ray gm4_lt_util 1 tp @s ^ ^ ^0.01 execute if score $ray gm4_lt_util matches 0..500 at @s unless block ~ ~ ~ #minecraft:all_signs run function gm4_standard_liquids:util/signs/ray ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util/signs/sign_normal_lookup.mcfunction ================================================ # @s = gm4_ink_normal marker # at sign block align xyz # run from front_back_detection tag @s add gm4_ink_normal execute if block ~ ~ ~ #minecraft:all_signs[rotation=0] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=1] positioned ~0.5 ~0.5 ~0.5 rotated 22.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=2] positioned ~0.5 ~0.5 ~0.5 rotated 45 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=3] positioned ~0.5 ~0.5 ~0.5 rotated 67.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=4] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=5] positioned ~0.5 ~0.5 ~0.5 rotated 112.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=6] positioned ~0.5 ~0.5 ~0.5 rotated 135 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=7] positioned ~0.5 ~0.5 ~0.5 rotated 157.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=8] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=9] positioned ~0.5 ~0.5 ~0.5 rotated 202.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=10] positioned ~0.5 ~0.5 ~0.5 rotated 225 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=11] positioned ~0.5 ~0.5 ~0.5 rotated 247.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=12] positioned ~0.5 ~0.5 ~0.5 rotated 270 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=13] positioned ~0.5 ~0.5 ~0.5 rotated 292.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=14] positioned ~0.5 ~0.5 ~0.5 rotated 315 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:all_signs[rotation=15] positioned ~0.5 ~0.5 ~0.5 rotated 337.5 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=south] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=west] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=north] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:wall_hanging_signs[facing=east] positioned ~0.5 ~0.5 ~0.5 rotated -90 0 run teleport @s ^ ^ ^1 ~ ~ execute if block ~ ~ ~ #minecraft:wall_signs[facing=south] positioned ~0.5 ~0.5 ~0.5 rotated 0 0 run teleport @s ^ ^ ^0.5625 ~ ~ execute if block ~ ~ ~ #minecraft:wall_signs[facing=west] positioned ~0.5 ~0.5 ~0.5 rotated 90 0 run teleport @s ^ ^ ^0.5625 ~ ~ execute if block ~ ~ ~ #minecraft:wall_signs[facing=north] positioned ~0.5 ~0.5 ~0.5 rotated 180 0 run teleport @s ^ ^ ^0.5625 ~ ~ execute if block ~ ~ ~ #minecraft:wall_signs[facing=east] positioned ~0.5 ~0.5 ~0.5 rotated -90 0 run teleport @s ^ ^ ^0.5625 ~ ~ ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util_above.mcfunction ================================================ #@s = tank with entity above it positioned ~ ~1 ~ #run from liquid_tanks:process via #gm4_liquid_tanks:util_above tag @s add gm4_processing_tank #cow execute as @e[dx=0,type=cow,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/cow #mooshroom execute as @e[dx=0,type=mooshroom,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/mooshroom #snow golem execute as @e[dx=0,type=snow_golem,tag=!smithed.entity,predicate=gm4_standard_liquids:suspended_snow_golem] run function gm4_standard_liquids:util/mobs/snow_golem #squids execute as @e[dx=0,type=squid,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/squid execute as @e[dx=0,type=glow_squid,tag=!smithed.entity] run function gm4_standard_liquids:util/mobs/glow_squid #experience orb execute positioned ~0.5 ~ ~0.5 if entity @e[distance=..0.5,type=experience_orb] if score @s[tag=gm4_lt_empty] gm4_lt_value matches 0 at @s run function gm4_standard_liquids:liquid_init/experience execute positioned ~0.5 ~ ~0.5 if score @s[tag=gm4_lt_experience] gm4_lt_value matches ..5344 as @e[distance=..0.5,type=experience_orb] run function gm4_standard_liquids:util/experience_orb #player depositing experience execute if score $schedule_deposit_exp gm4_lt_util matches 2.. run schedule clear gm4_standard_liquids:util/experience/scheduled_deposit execute positioned ~0.5 ~ ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run scoreboard players set $schedule_deposit_exp gm4_lt_util 1 execute positioned ~0.5 ~ ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run schedule function gm4_standard_liquids:util/experience/scheduled_deposit 1t #dripstone cauldron execute if entity @e[dx=0,type=area_effect_cloud,tag=gm4_ltu_dripstone_cauldron] run function gm4_standard_liquids:util/drain_cauldron #cauldrons execute if entity @s[tag=gm4_lt_water] run function gm4_standard_liquids:util/fill_cauldrons execute if entity @s[tag=gm4_lt_lava] run function gm4_standard_liquids:util/fill_cauldrons execute if entity @s[tag=gm4_lt_powder_snow] run function gm4_standard_liquids:util/fill_cauldrons #honey cauldron execute if entity @s[tag=gm4_lt_honey] run function gm4_standard_liquids:util/honey_casting/honey_tank #furnace execute if entity @s[tag=gm4_lt_lava] run function gm4_standard_liquids:util/furnace_fueling/lava_tank tag @s remove gm4_processing_tank ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/function/util_below.mcfunction ================================================ #@s = tank with entity above it positioned ~ ~-1 ~ #run from liquid_tanks:process via #gm4_liquid_tanks:util_below tag @s add gm4_processing_tank #milk clearing potion effects execute if score @s[tag=gm4_lt_milk] gm4_lt_value matches 3.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt={active_effects:[{}]}] run function gm4_standard_liquids:util/liquid_dispensing/milk #honey clearing poison and applying saturation execute if score @s[tag=gm4_lt_honey] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt={active_effects:[{id:'minecraft:poison'}]}] run function gm4_standard_liquids:util/liquid_dispensing/honey execute if score @s[tag=gm4_lt_honey] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/honey #mushroom soup applying saturation execute if score @s[tag=gm4_lt_mushroom_stew] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/mushroom_stew #rabbit stew applying saturation execute if score @s[tag=gm4_lt_rabbit_stew] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/rabbit_stew #beetroot soup applying saturation execute if score @s[tag=gm4_lt_beetroot_soup] gm4_lt_value matches 1.. as @a[gamemode=!spectator,limit=1,dx=0] unless entity @s[nbt={foodLevel:20}] run function gm4_standard_liquids:util/liquid_dispensing/beetroot_soup #ink tanks applying effects execute if score @s[tag=gm4_lt_ink] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink execute if score @s[tag=gm4_lt_glow_ink] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:glowing'}]}] run function gm4_standard_liquids:util/liquid_dispensing/glow_ink #player withdrawing experience execute if score $schedule_withdraw_exp gm4_lt_util matches 2.. run schedule clear gm4_standard_liquids:util/experience/scheduled_withdraw execute if entity @s[tag=gm4_lt_experience] positioned ~0.5 ~-1 ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run scoreboard players set $schedule_withdraw_exp gm4_lt_util 1 execute if entity @s[tag=gm4_lt_experience] positioned ~0.5 ~-1 ~0.5 if entity @a[distance=..0.5,gamemode=!spectator] run schedule function gm4_standard_liquids:util/experience/scheduled_withdraw 1t # tag @s remove gm4_processing_tank # this line is now added by main.bolt ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/guidebook/standard_liquids.json ================================================ { "id": "standard_liquids", "name": "Standard Liquids", "module_type": "expansion", "load_check": "liquid_tanks", "base_module": "liquid_tanks", "wiki_link": "https://wiki.gm4.co/Liquid_Tanks/Standard_Liquids", "icon": { "id": "minecraft:lava_bucket" }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } } }, "sections": [ { "name": "interactions", "enable": [], "requirements": [ [ "obtain_liquid_tank" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.standard_liquids.water", "fallback": "Standard liquids can be stored by liquid tanks.\n\nWater Tank\n- Drains water buckets, water bottles\n- Fills buckets, bottles\n- Fills adjacent cauldrons" } ], [ { "translate": "text.gm4.guidebook.standard_liquids.lava", "fallback": "Lava Tank\n- Drains lava buckets\n- Fills buckets\n- Fuels adjacent furnaces\n- Drains lava cauldrons\n- Fills adjacent cauldrons" } ], [ { "translate": "text.gm4.guidebook.standard_liquids.rabbit_stew_and_beetroot_soup", "fallback": "Rabbit Stew Tank\n- Drains rabbit stew\n- Fills bowls\n- Feeds drinkers\n\nBeetroot Soup Tank\n- Drains beetroot soup, beetroot\n- Fills bowls\n- Feeds drinkers" } ], [ { "translate": "text.gm4.guidebook.standard_liquids.mushroom_stew_and_milk", "fallback": "Mushroom Stew Tank\n- Drains mushroom stew\n- Fills bowls\n- Milks mooshrooms\n- Feeds drinkers\n\nMilk Tank\n- Drains milk buckets\n- Fills buckets\n- Milks cows\n- Clear mob effects" } ], [ { "translate": "text.gm4.guidebook.standard_liquids.honey", "fallback": "Honey Tanks\n- Drains honey bottles, honey blocks\n- Fills bottles\n- Casts honey blocks into cauldrons\n- Clears mob poison\n- Feeds drinkers" } ], [ { "translate": "text.gm4.guidebook.standard_liquids.experience", "fallback": "Experience Tanks\n- Drains bottles o' enchanting, enchanted books\n- Fills bottles\n- Absorbs experience orbs, experience points\n- Fills experience points" } ] ] } ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/loot_table/glow_ink_bottle.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "potion", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_standard_liquids:item/glow_ink_bottle"]}, "minecraft:potion_contents": { "custom_color": 9828808, "custom_effects": [ { "id": "minecraft:glowing", "amplifier": 0, "duration": 1200 }, { "id": "minecraft:night_vision", "amplifier": 0, "duration": 1800 } ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_standard_liquids:{potion:'glowing'}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.gm4.glow_ink_bottle", "fallback": "Glow Ink Bottle", "italic": false }, "target": "item_name" } ] } ] } ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/loot_table/ink_bottle.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "potion", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_standard_liquids:item/ink_bottle"]}, "minecraft:potion_contents": { "custom_color": 68378, "custom_effects": [ { "id": "minecraft:blindness", "amplifier": 0, "duration": 2400 } ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_standard_liquids:{potion:'blindness'}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.gm4.ink_bottle", "fallback": "Ink Bottle", "italic": false }, "target": "item_name" } ] } ] } ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/modules/main.bolt ================================================ import re from gm4_liquid_tanks:liquid_wrappers import liquid bucket = liquid.standard_unit('bucket', 3) bowl = liquid.standard_unit('bowl', 1) bottle = liquid.standard_unit('glass_bottle', 1) @liquid class Lava: id = 'lava' name = 'Lava' capacity = 300 liquid.init() bucket('lava_bucket') # item_fill on a standard unit @liquid class Water: id = 'water' name = 'Water' capacity = 300 liquid.init() bucket('water_bucket') bottle('minecraft:potion[potion_contents={potion:"water"}]') @liquid class Milk: id = 'milk' name = 'Milk' capacity = 300 liquid.init() bucket('milk_bucket') @liquid class PowderSnow: id = 'powder_snow' name = 'Powder Snow' capacity = 300 liquid.init() bucket('powder_snow_bucket') @liquid class MushroomStew: id = 'mushroom_stew' name = 'Mushroom Stew' capacity = 300 liquid.init() bowl('mushroom_stew') @liquid class RabbitStew: id = 'rabbit_stew' name = 'Rabbit Stew' capacity = 300 liquid.init() bowl('rabbit_stew') @liquid class BeetrootSoup: id = 'beetroot_soup' name = 'Beetroot Soup' capacity = 300 liquid.init() bowl('beetroot_soup') liquid.item_drain('beetroot', 'air', 1) @liquid class Honey: id = 'honey' name = 'Honey' capacity = 400 liquid.init() bottle('honey_bottle') liquid.item_drain('honey_block', 'air', 4) @liquid class Experience: id = 'experience' name = 'Experience' capacity = 5345 liquid.init() @liquid.item_fill('glass_bottle', 'experience_bottle', 9) def experience_bottle(): item replace entity 344d47-4-4-4-f04ce104d weapon.mainhand with minecraft:experience_bottle yield execute if score $smart_success gm4_lt_value matches 1 run advancement grant @a[distance=..4,gamemode=!spectator] only gm4:standard_liquids liquid.item_drain('enchanted_book', 'book', 7) liquid.item_drain('paper[custom_data~{gm4_book_binders:{item:"enchanted_page"}}]', 'paper', 5) #TODO I could add a custom naming rule here - more as an example than necessary - for enchanted_page @liquid class Ink: id = 'ink' name = 'Ink' capacity = 300 liquid.init() liquid.item_drain('ink_sac', 'air', 1) @bottle('minecraft:potion[custom_data~{gm4_standard_liquids:{potion:"blindness"}}]') def ink_bottle(): loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:ink_bottle @liquid.util_below def dispense_ink(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:blindness'}]}] run function gm4_standard_liquids:util/liquid_dispensing/ink @liquid class GlowInk: id = 'glow_ink' name = 'Glow Ink' capacity = 300 liquid.init() liquid.item_drain('glow_ink_sac', 'air', 1) @bottle('minecraft:potion[custom_data~{gm4_standard_liquids:{potion:"glowing"}}]') def glow_ink_bottle(): loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_standard_liquids:glow_ink_bottle liquid.item_fill('item_frame', 'glow_item_frame', 1, reversable=False) @liquid.util_below def dispense_ink(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:glowing'}]}] run function gm4_standard_liquids:util/liquid_dispensing/glow_ink # tell bolt how to name different ominous bottles - they have the same item id so this is a special case def omnious_naming_scheme(input_name: str, output_name: str) -> str | bool: m = re.match(r'ominous_bottle\[ominous_bottle_amplifier=(\d+)\]', output_name) if m: return f"ominous_bottle_{m.group(1)}" return False liquid.naming_schemes.schemes.insert(0, omnious_naming_scheme) for lvl, numeral_lvl in zip((0,1,2,3,4), ("I", "II", "III", "IV", "V")): @liquid class OminousBottle: id = f'ominous_bottle_{lvl}' name = f'Ominous {numeral_lvl}' capacity = 300 skin = 'liquids/ominous_bottle' liquid.init() bottle(f"ominous_bottle[ominous_bottle_amplifier={lvl}]") @liquid.util_below def dispense_omen(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:bad_omen'}]}] run function f"gm4_standard_liquids:util/liquid_dispensing/ominous_bottle_{lvl}": effect give @s bad_omen 6000 (0+lvl) scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/predicate/sneaking.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/predicate/suspended_snow_golem.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{OnGround:0b}" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": {} } } } ] ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/tags/block/double_speed.json ================================================ { "values": [ "minecraft:blast_furnace", "minecraft:smoker" ] } ================================================ FILE: gm4_liquid_tanks/data/gm4_standard_liquids/tags/block/furnace.json ================================================ { "values": [ "minecraft:furnace", "minecraft:blast_furnace", "minecraft:smoker" ] } ================================================ FILE: gm4_liquid_tanks/mcmeta_stacksize.py ================================================ # beet plugin to generate lists of items of each stack size, using misodes mcmeta git repo import json from beet import ProjectCache from gm4.utils import add_namespace def retrieve_stacksizes(cache: ProjectCache, version: str) -> tuple[list[str], list[str], list[str]]: # retrieve item_components.json url = f"https://raw.githubusercontent.com/misode/mcmeta/refs/tags/{version}-summary/item_components/data.json" path = cache["mcmeta_stacksize"].download(url) with open(path) as f: default_components = json.load(f) # parse components into stack size lists unstackables: list[str] = [] stackable_16: list[str] = [] stackable_64: list[str] = [] for item_id, components in default_components.items(): match components["minecraft:max_stack_size"]: case 1: unstackables.append(add_namespace(item_id, "minecraft")) case 16: stackable_16.append(add_namespace(item_id, "minecraft")) case 64: stackable_64.append(add_namespace(item_id, "minecraft")) case _: pass return unstackables, stackable_16, stackable_64 ================================================ FILE: gm4_liquid_tanks/mod.mcdoc ================================================ dispatch minecraft:storage[gm4_liquid_tanks:temp] to struct { exp?: struct { points: int, }, } ================================================ FILE: gm4_liquid_tanks/override_formatting.py ================================================ from beet import Context from mecha import Mecha def beet_default(ctx: Context): ctx.inject(Mecha).serialize.formatting.layout = 'dense' ================================================ FILE: gm4_live_catch/README.md ================================================ # Live Catch Catch live fish whilst pulling in a fishing reel! ### Features - When reeling in a fishing rod, instead of producing a fish item, a live/mob variant will be spawned - Fish that spawn have 1 health so easily die ================================================ FILE: gm4_live_catch/beet.yaml ================================================ id: gm4_live_catch name: Live Catch version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: model_data: - item: pufferfish reference: gui/advancement/live_catch template: advancement website: description: Catch live fish when fishing! But watch out for Pufferfish, those might make for a nasty surprise! recommended: - gm4_end_fishing - gm4_reeling_rods notes: [] search_keywords: - fishing modrinth: project_id: uSXn7pVW wiki: https://wiki.gm4.co/wiki/Live_Catch credits: Creator: - Modulorium Icon Design: - BPR ================================================ FILE: gm4_live_catch/data/gm4/advancement/live_catch.json ================================================ { "display": { "icon": { "id": "pufferfish", "components": { "minecraft:custom_model_data": {"strings":["gm4_live_catch:gui/advancement/live_catch"]} } }, "title": { "translate": "advancement.gm4.live_catch.title", "fallback": "Watch Out!" }, "description": { "translate": "advancement.gm4.live_catch.description", "fallback": "Catch a pufferfish to the face.", "color": "gray" } }, "parent": "gm4:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_live_catch/data/gm4_live_catch/advancement/catch_cod.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": [], "item": { "items": [ "minecraft:cod" ] } } } }, "rewards": { "function": "gm4_live_catch:fish/cod/catch" } } ================================================ FILE: gm4_live_catch/data/gm4_live_catch/advancement/catch_pufferfish.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": [], "item": { "items": [ "minecraft:pufferfish" ] } } } }, "rewards": { "function": "gm4_live_catch:fish/pufferfish/catch" } } ================================================ FILE: gm4_live_catch/data/gm4_live_catch/advancement/catch_salmon.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": [], "item": { "items": [ "minecraft:salmon" ] } } } }, "rewards": { "function": "gm4_live_catch:fish/salmon/catch" } } ================================================ FILE: gm4_live_catch/data/gm4_live_catch/advancement/catch_tropical_fish.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:fishing_rod_hooked", "conditions": { "entity": [], "item": { "items": [ "minecraft:tropical_fish" ] } } } }, "rewards": { "function": "gm4_live_catch:fish/tropical_fish/catch" } } ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/cod/catch.mcfunction ================================================ # Executes when player catches a fish # @s = player that caught a fish # at @s # run from advancement, gm4_live_catch:catch_FISH_TYPE advancement revoke @s only gm4_live_catch:catch_cod # add fisher tag tag @s add gm4_lc_fished_cod # item doesnt spawn until after 1 tick schedule function gm4_live_catch:fish/cod/target 1t ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/cod/summon.mcfunction ================================================ # Summons the fish at the fish item # @s = item that was fished # at @s # run from gm4_live_catch:fish/FISH_TYPE/target # prepare storage data modify storage gm4_live_catch:temp/input Target set from entity @s data modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]} # modify storage execute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000 # summon fish / store data summon cod ~ ~1 ~ {Health:1f,Tags:["gm4_lc_cod_new"]} data modify entity @e[type=cod,limit=1,tag=gm4_lc_cod_new] {} merge from storage gm4_live_catch:temp/output Target # remove tag @e[type=cod] remove gm4_lc_cod_new # kill item kill @s ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/cod/target.mcfunction ================================================ # Executes as the fish item a tick after the player catches it # @s = player that caught a fish # at @s # run from gm4_live_catch:fish/FISH_TYPE/catch # summon fish at item execute at @a[tag=gm4_lc_fished_cod] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:"minecraft:cod",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/cod/summon # remove fisher tag tag @a remove gm4_lc_fished_cod ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/catch.mcfunction ================================================ # Executes when player catches a fish # @s = player that caught a fish # at @s # run from advancement, gm4_live_catch:catch_FISH_TYPE advancement revoke @s only gm4_live_catch:catch_pufferfish # advancement advancement grant @s only gm4:live_catch # add fisher tag tag @s add gm4_lc_fished_pufferfish # item doesnt spawn until after 1 tick schedule function gm4_live_catch:fish/pufferfish/target 1t ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/summon.mcfunction ================================================ # Summons the fish at the fish item # @s = item that was fished # at @s # run from gm4_live_catch:fish/FISH_TYPE/target # prepare storage data modify storage gm4_live_catch:temp/input Target set from entity @s data modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]} # modify storage execute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000 # summon fish / store data summon pufferfish ~ ~1 ~ {Health:1f,Tags:["gm4_lc_pufferfish_new"]} data modify entity @e[type=pufferfish,limit=1,tag=gm4_lc_pufferfish_new] {} merge from storage gm4_live_catch:temp/output Target # remove tag @e[type=pufferfish] remove gm4_lc_pufferfish_new # kill item kill @s ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/pufferfish/target.mcfunction ================================================ # Executes as the fish item a tick after the player catches it # @s = player that caught a fish # at @s # run from gm4_live_catch:fish/FISH_TYPE/catch # summon fish at item execute at @a[tag=gm4_lc_fished_pufferfish] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:"minecraft:pufferfish",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/pufferfish/summon # remove fisher tag tag @a remove gm4_lc_fished_pufferfish ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/salmon/catch.mcfunction ================================================ # Executes when player catches a fish # @s = player that caught a fish # at @s # run from advancement, gm4_live_catch:catch_FISH_TYPE advancement revoke @s only gm4_live_catch:catch_salmon # add fisher tag tag @s add gm4_lc_fished_salmon # item doesnt spawn until after 1 tick schedule function gm4_live_catch:fish/salmon/target 1t ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/salmon/summon.mcfunction ================================================ # Summons the fish at the fish item # @s = item that was fished # at @s # run from gm4_live_catch:fish/FISH_TYPE/target # prepare storage data modify storage gm4_live_catch:temp/input Target set from entity @s data modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]} # modify storage execute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000 # summon fish / store data execute store result score $salmon_size gm4_live_catch.data run random value 1..1000 execute if score $salmon_size gm4_live_catch.data matches 1..316 run summon salmon ~ ~1 ~ {Health:1f,Tags:["gm4_lc_salmon_new"],type:"small"} execute if score $salmon_size gm4_live_catch.data matches 317..842 run summon salmon ~ ~1 ~ {Health:1f,Tags:["gm4_lc_salmon_new"],type:"medium"} execute if score $salmon_size gm4_live_catch.data matches 843..1000 run summon salmon ~ ~1 ~ {Health:1f,Tags:["gm4_lc_salmon_new"],type:"large"} data modify entity @e[type=salmon,limit=1,tag=gm4_lc_salmon_new] {} merge from storage gm4_live_catch:temp/output Target # remove tag @e[type=salmon] remove gm4_lc_salmon_new # kill item kill @s ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/salmon/target.mcfunction ================================================ # Executes as the fish item a tick after the player catches it # @s = player that caught a fish # at @s # run from gm4_live_catch:fish/FISH_TYPE/catch # summon fish at item execute at @a[tag=gm4_lc_fished_salmon] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:"minecraft:salmon",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/salmon/summon # remove fisher tag tag @a remove gm4_lc_fished_salmon ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/catch.mcfunction ================================================ # Executes when player catches a fish # @s = player that caught a fish # at @s # run from advancement, gm4_live_catch:catch_FISH_TYPE advancement revoke @s only gm4_live_catch:catch_tropical_fish # add fisher tag tag @s add gm4_lc_fished_tropical_fish # item doesnt spawn until after 1 tick schedule function gm4_live_catch:fish/tropical_fish/target 1t ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/summon.mcfunction ================================================ # Summons the fish at the fish item # @s = item that was fished # at @s # run from gm4_live_catch:fish/FISH_TYPE/target # prepare storage data modify storage gm4_live_catch:temp/input Target set from entity @s data modify storage gm4_live_catch:temp/output Target set value {Motion:[0d,0d,0d]} # modify storage execute store result storage gm4_live_catch:temp/output Target.Motion[0] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[0] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[1] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[1] 13000 execute store result storage gm4_live_catch:temp/output Target.Motion[2] double 0.0001 run data get storage gm4_live_catch:temp/input Target.Motion[2] 15000 data modify storage gm4_live_catch:temp/output Target merge value {Health:1f,Tags:["gm4_lc_tropical_fish_new"]} # summon fish / store data summon tropical_fish ~ ~ ~ data modify entity @e[type=tropical_fish,limit=1,distance=0] {} merge from storage gm4_live_catch:temp/output Target # remove tag @e[type=tropical_fish] remove gm4_lc_tropical_fish_new # kill item kill @s ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/fish/tropical_fish/target.mcfunction ================================================ # Executes as the fish item a tick after the player catches it # @s = player that caught a fish # at @s # run from gm4_live_catch:fish/FISH_TYPE/catch # summon fish at item execute at @a[tag=gm4_lc_fished_tropical_fish] as @e[type=item,limit=1,sort=furthest,nbt={Item:{id:"minecraft:tropical_fish",count:1},OnGround:0b,Age:0s}] unless data entity @s Item.components at @s run function gm4_live_catch:fish/tropical_fish/summon # remove fisher tag tag @a remove gm4_lc_fished_tropical_fish ================================================ FILE: gm4_live_catch/data/gm4_live_catch/function/init.mcfunction ================================================ execute unless score live_catch gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Live Catch"} execute unless score live_catch gm4_earliest_version < live_catch gm4_modules run scoreboard players operation live_catch gm4_earliest_version = live_catch gm4_modules scoreboard players set live_catch gm4_modules 1 scoreboard objectives add gm4_live_catch.data dummy #$moduleUpdateList ================================================ FILE: gm4_live_catch/data/gm4_live_catch/guidebook/live_catch.json ================================================ { "id": "live_catch", "name": "Live Catch", "module_type": "module", "icon": { "id": "minecraft:cod" }, "criteria": { "use_fishing_rod": { "trigger": "minecraft:fishing_rod_hooked", "conditions": {} } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "use_fishing_rod" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.live_catch.description", "fallback": "When fishing, if a fisher reels in a fish, instead of an item, an actual fish will be launched towards the fisher.\n\nThe fish that spawn have half a heart of health, so they will easily die." } ] ] } ] } ================================================ FILE: gm4_live_catch/mod.mcdoc ================================================ dispatch minecraft:storage[gm4_live_catch:temp/input] to struct { Target?: minecraft:entity[%fallback], } dispatch minecraft:storage[gm4_live_catch:temp/output] to struct { Target?: minecraft:entity[%fallback], } ================================================ FILE: gm4_live_catch/translations.csv ================================================ key,en_us advancement.gm4.live_catch.title,Watch Out! advancement.gm4.live_catch.description,Catch a pufferfish to the face. text.gm4.guidebook.module_desc.live_catch,"Catch live fish when fishing! But watch out for Pufferfish, those might make for a nasty surprise!" text.gm4.guidebook.live_catch.description,"When fishing, if a fisher reels in a fish, instead of an item, an actual fish will be launched towards the fisher.\n\nThe fish that spawn have half a heart of health, so they will easily die." ================================================ FILE: gm4_lively_lily_pads/README.md ================================================ # Lively Lily Pads Place decorations on lily pads! A spore blossom being placed on a lily pad ### Features Place the following on lily pads: - Candles* - Lanterns* - Torches* - Coral Fans - Cactus Flowers - Spore Blossoms \* Emit light. Candles need to be lit. ================================================ FILE: gm4_lively_lily_pads/beet.yaml ================================================ id: gm4_lively_lily_pads name: Lively Lily Pads version: 3.3.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main,tick] website: description: Place decorations on Lily Pads! recommended: - gm4_blossoming_pots notes: [] search_keywords: - candle - plant - coral - spore - lantern modrinth: project_id: 7wnTwrbr smithed: pack_id: gm4_lively_lily_pads planetminecraft: uid: 6138391 wiki: https://wiki.gm4.co/wiki/Lively_Lily_Pads credits: Creator: - runcows Icon Design: - runcows ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/candle_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_candle_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/interactions/candle/interact_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/id_init.json ================================================ { "criteria": { "no_score": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_llp.id": {} } } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:player/set_id" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/placement_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_lively_lily_pads:holding_placeable_item" }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] }, "nbt": "{Tags:[\"gm4_llp_holding_item\"]}" } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_placement_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/interactions/placement/interact_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/punch_perma_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_hurt_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_perma_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/attacks/perma/hit_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/punch_placement_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_hurt_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_placement_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/attacks/placement/hit_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/unwaxed_copper_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_unwaxed_copper_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/interact_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/advancement/waxed_copper_rcd.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction", "nbt": "{Tags:[\"gm4_llp_waxed_copper_rcd\"]}" } } ] } } }, "rewards": { "function": "gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/interact_rcd" } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/init.mcfunction ================================================ execute unless score lively_lily_pads gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Lively Lily Pads"} execute unless score lively_lily_pads gm4_earliest_version < lively_lily_pads gm4_modules run scoreboard players operation lively_lily_pads gm4_earliest_version = lively_lily_pads gm4_modules scoreboard players set lively_lily_pads gm4_modules 1 # detect pre-gm4 lively lily pads # | We do this in mechanics/interactions/placement/interact_rcd scoreboard objectives add gm4_llp.data dummy scoreboard objectives add gm4_llp.id dummy execute unless score $next gm4_llp.id matches 0.. run scoreboard players set $next gm4_llp.id 0 schedule function gm4_lively_lily_pads:main 1t schedule function gm4_lively_lily_pads:tick 1t ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/main.mcfunction ================================================ schedule function gm4_lively_lily_pads:main 16t # execute as player execute as @a[gamemode=!adventure,gamemode=!spectator] at @s run function gm4_lively_lily_pads:player/as # clean up execute as @e[type=minecraft:block_display,tag=gm4_llp_display] at @s unless block ~ ~ ~ minecraft:lily_pad run function gm4_lively_lily_pads:mechanics/cleanup/kill ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/perma/hit_rcd.mcfunction ================================================ # perma rcd hit, need to break # @s = player who left clicked on a perma rcd # at @s # run from advancement: punch_perma_rcd advancement revoke @s only gm4_lively_lily_pads:punch_perma_rcd # set creative flag execute if entity @s[gamemode=creative] run scoreboard players set $creative gm4_llp.data 1 # process attack execute as @e[type=interaction,tag=gm4_llp_perma_rcd,distance=..8] if data entity @s attack at @s run function gm4_lively_lily_pads:mechanics/attacks/perma/process_interaction ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/perma/process_interaction.mcfunction ================================================ # @s = punched gm4_llp_perma_rcd interaction # at @s # run from mechanics/attacks/perma/hit_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s attack.timestamp 1 # clean data remove entity @s attack # fail if old attack execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # break decoration and perma rcd execute align xyz as @e[type=block_display,tag=gm4_llp_display,dx=0,limit=1] at @s run function gm4_lively_lily_pads:mechanics/cleanup/kill # reset creative score, was checked in mechanics/cleanup/kill scoreboard players reset $creative gm4_llp.data ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/placement/hit_rcd.mcfunction ================================================ # rcd hit, need to break rcd and lily pad # @s = player who left clicked a placement rcd # at @s # run from advancement: punch_placement_rcd advancement revoke @s only gm4_lively_lily_pads:punch_placement_rcd # set creative flag execute if entity @s[gamemode=creative] run scoreboard players set $creative gm4_llp.data 1 # process interaction execute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=..8] if data entity @s attack at @s run function gm4_lively_lily_pads:mechanics/attacks/placement/process_interaction ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/attacks/placement/process_interaction.mcfunction ================================================ # @s = punched gm4_llp_candle_rcd interaction # at @s # run from mechanics/attacks/placement/hit_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s attack.timestamp 1 # clean data remove entity @s attack # fail if old attack execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # kill placement rcd kill @s # if survival, break lily pad with item execute unless score $creative gm4_llp.data matches 1 run return run setblock ~ ~ ~ air destroy # if creative setblock ~ ~ ~ air scoreboard players reset $creative gm4_llp.data playsound minecraft:block.big_dripleaf.break block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/cleanup/kill.mcfunction ================================================ # cleans up block display and drops item if needed # @s = gm4_llp_display block_display # at @s # run from main and mechanics/attacks/perma/process_interaction # delete light execute if entity @s[tag=gm4_llp_light] run fill ~ ~1 ~ ~ ~1 ~ air replace light # set up item data data remove storage gm4_llp:temp item data modify storage gm4_llp:temp item.id set from entity @s block_state.Name data merge storage gm4_llp:temp {item:{count:1,motion:[0.0d,0.2d,0.0d]}} execute if entity @s[tag=gm4_llp_candle] run data modify storage gm4_llp:temp item.count set from entity @s block_state.Properties.candles execute store result storage gm4_llp:temp item.motion[0] double .01 run random value -10..10 execute store result storage gm4_llp:temp item.motion[2] double .01 run random value -10..10 # drop item unless a player in creative hit it execute unless score $creative gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/cleanup/summon_item with storage gm4_llp:temp item # break sound execute if entity @s[tag=gm4_llp_candle] run playsound minecraft:block.candle.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_wood_sound] run playsound minecraft:block.wood.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_lantern_sound] run playsound minecraft:block.lantern.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_wet_grass_sound] run playsound minecraft:block.wet_grass.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_stone_sound] run playsound minecraft:block.stone.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_spore_blossom_sound] run playsound minecraft:block.spore_blossom.break block @a[distance=..16] ~ ~ ~ execute if entity @s[tag=gm4_llp_cactus_flower_sound] run playsound minecraft:block.cactus_flower.break block @a[distance=..16] ~ ~ ~ # kill entities kill @e[type=minecraft:interaction,tag=gm4_llp_perma_rcd,limit=1,distance=..0.1] kill @s ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/cleanup/summon_item.mcfunction ================================================ # summons item # @s = gm4_llp_display block_display # at @s # with {id, count, motion} # run from mechanics/cleanup/kill $summon minecraft:item ~ ~-.02 ~ {Item:{id:"$(id)",count:$(count)},Motion:$(motion)} ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/add_candle.mcfunction ================================================ # adds candles if needed # @s = candle block display # at @s # run from mechanics/interactions/candle/process_display # fail if different candle execute store success score $different_candle gm4_llp.data run data modify storage gm4_llp:temp held_item set from entity @s block_state.Name execute if score $different_candle gm4_llp.data matches 1 run return fail # fail if 4 candles already execute if data entity @s {block_state:{Properties:{candles:"4"}}} run return 1 # set flag to remove item scoreboard players set $placement_success gm4_llp.data 1 # sound playsound minecraft:block.candle.place block @a[distance=..16] ~ ~ ~ # increase candle count execute if data entity @s {block_state:{Properties:{candles:"3"}}} run data modify entity @s block_state.Properties.candles set value "4" execute if data entity @s {block_state:{Properties:{candles:"2"}}} run data modify entity @s block_state.Properties.candles set value "3" execute if data entity @s {block_state:{Properties:{candles:"1"}}} run data modify entity @s block_state.Properties.candles set value "2" # update light blocks if needed execute if entity @s[tag=gm4_llp_lit_candle] run function gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks return 1 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/find_igniter.mcfunction ================================================ # @s = player who ignited candle # at @s # run from mechanics/interactions/candle/interact_rcd scoreboard players reset $ignited gm4_llp.data execute if score $mainhand gm4_llp.data matches 1 if items entity @s weapon.mainhand fire_charge run function gm4_lively_lily_pads:mechanics/interactions/candle/used_mainhand_fire_charge execute if score $mainhand gm4_llp.data matches 1 if items entity @s weapon.mainhand flint_and_steel run function gm4_lively_lily_pads:mechanics/interactions/candle/used_mainhand_flint_and_steel execute if score $offhand gm4_llp.data matches 1 if items entity @s weapon.offhand fire_charge run function gm4_lively_lily_pads:mechanics/interactions/candle/used_offhand_fire_charge execute if score $offhand gm4_llp.data matches 1 if items entity @s weapon.offhand flint_and_steel run function gm4_lively_lily_pads:mechanics/interactions/candle/used_offhand_flint_and_steel ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/get_mainhand_data.mcfunction ================================================ # stores mainhand item data # @s = player who right clicked on a candle # at @s # run from mechanics/interactions/candle/interact_rcd scoreboard players set $mainhand gm4_llp.data 1 data modify storage gm4_llp:temp held_item set from entity @s SelectedItem.id execute store success score $holding_lighter gm4_llp.data if items entity @s weapon.mainhand #gm4_lively_lily_pads:candle_igniters execute store success score $holding_candle gm4_llp.data if items entity @s weapon.mainhand #minecraft:candles ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/get_offhand_data.mcfunction ================================================ # stores offhand item data # @s = player who right clicked on a candle # at @s # run from mechanics/interactions/candle/interact_rcd scoreboard players set $offhand gm4_llp.data 1 data modify storage gm4_llp:temp held_item set from entity @s equipment.offhand.id execute store success score $holding_lighter gm4_llp.data if items entity @s weapon.offhand #gm4_lively_lily_pads:candle_igniters execute store success score $holding_candle gm4_llp.data if items entity @s weapon.offhand #minecraft:candles ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/interact_rcd.mcfunction ================================================ # candle right click # @s = player who right clicked on a candle # at @s # run from advancement: candle_rcd advancement revoke @s only gm4_lively_lily_pads:candle_rcd # reset scoreboard players set $mainhand gm4_llp.data 0 scoreboard players set $offhand gm4_llp.data 0 scoreboard players set $holding_lighter gm4_llp.data 0 scoreboard players set $holding_candle gm4_llp.data 0 scoreboard players set $ignited gm4_llp.data 0 scoreboard players set $extinguished gm4_llp.data 0 # item information execute if items entity @s weapon.mainhand #gm4_lively_lily_pads:candle_interactable run function gm4_lively_lily_pads:mechanics/interactions/candle/get_mainhand_data execute unless score $mainhand gm4_llp.data matches 1 if items entity @s weapon.offhand #gm4_lively_lily_pads:candle_interactable run function gm4_lively_lily_pads:mechanics/interactions/candle/get_offhand_data # find interaction execute as @e[type=interaction,tag=gm4_llp_candle_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/candle/process_interaction # player effects execute if score $extinguished gm4_llp.data matches 1 run swing @s mainhand execute if score $ignited gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/interactions/candle/find_igniter execute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run swing @s mainhand execute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.offhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run swing @s offhand # reset scoreboard players reset $placement_success gm4_llp.data ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/light_candle.mcfunction ================================================ # light candle display # @s = candle block display # at @s # run from mechanics/interactions/candle/process_display execute store success score $ignited gm4_llp.data run data modify entity @s block_state.Properties.lit set value "true" # return if not ignited execute if score $ignited gm4_llp.data matches 0 run return fail # light tag @s add gm4_llp_lit_candle function gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks return 1 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/process_display.mcfunction ================================================ # decides how to modify the candle that was interacted with # @s = candle block display # at @s # run from mechanics/interactions/candle/process_interaction # try to add candle execute if score $holding_candle gm4_llp.data matches 1 if function gm4_lively_lily_pads:mechanics/interactions/candle/add_candle run return 1 # not holding candle try to light execute if score $holding_lighter gm4_llp.data matches 1 if function gm4_lively_lily_pads:mechanics/interactions/candle/light_candle run return 1 # if ignition failed, but igniter was mainhand, don't extinguish execute if score $ignited gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 1 run return fail # try to extinguish candle execute store result score $extinguished gm4_llp.data run data modify entity @s block_state.Properties.lit set value "false" execute if score $extinguished gm4_llp.data matches 0 run return fail # extinguish tag @s remove gm4_llp_lit_candle execute if block ~ ~1 ~ light run setblock ~ ~1 ~ air playsound block.candle.extinguish block @a[distance=..16] ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/process_interaction.mcfunction ================================================ # @s = interacted gm4_llp_candle_rcd interaction # at @s # run from mechanics/interactions/candle/interact_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1 # clean data remove entity @s interaction # fail if old interaction execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # process execute align xyz as @e[type=block_display,tag=gm4_llp_candle,dx=0,limit=1] at @s run function gm4_lively_lily_pads:mechanics/interactions/candle/process_display ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/update_light_blocks.mcfunction ================================================ # updates light blocks # @s = candle block display # at @s # run from mechanics/interactions/candle/light_candle and mechanics/interactions/candle/add_candle and mechanics/particles/candle_count execute if block ~ ~1 ~ light run setblock ~ ~1 ~ air execute if data entity @s {block_state:{Properties:{candles:"4"}}} run setblock ~ ~1 ~ light[level=12] keep execute if data entity @s {block_state:{Properties:{candles:"3"}}} run setblock ~ ~1 ~ light[level=9] keep execute if data entity @s {block_state:{Properties:{candles:"2"}}} run setblock ~ ~1 ~ light[level=6] keep execute if data entity @s {block_state:{Properties:{candles:"1"}}} run setblock ~ ~1 ~ light[level=3] keep ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_mainhand_fire_charge.mcfunction ================================================ # fire charge use logic # @s = player who ignited candle # at @s # run from mechanics/interactions/candle/find_igniter swing @s mainhand # sound playsound minecraft:item.firecharge.use player @a[distance=..16] # return if creative execute if entity @s[gamemode=creative] run return 1 # use item item modify entity @s weapon.mainhand {function:"minecraft:set_count",count:-1,add:1b} ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_mainhand_flint_and_steel.mcfunction ================================================ # calculates damage for flint and steel # @s = player who ignited candle # at @s # run from mechanics/interactions/candle/find_igniter swing @s mainhand # sound playsound minecraft:item.flintandsteel.use player @a[distance=..16] ~ ~ ~ # return if creative execute if entity @s[gamemode=creative] run return 1 # damage execute store result score $level gm4_llp.data run data get entity @s SelectedItem.components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $level gm4_llp.data 1 scoreboard players set $chance gm4_llp.data 100 scoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data execute store result score $rand gm4_llp.data run random value 1..100 execute if score $rand gm4_llp.data < $chance gm4_llp.data run item modify entity @s weapon.mainhand {"function":"minecraft:set_damage","damage":-0.0205,"add":true} execute unless items entity @s weapon.mainhand flint_and_steel[damage=64] run return 1 # 0 durability remaining, break item item replace entity @s weapon.mainhand with air playsound minecraft:entity.item.break player @a[distance=..16] ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_offhand_fire_charge.mcfunction ================================================ # fire charge use logic # @s = player who ignited candle # at @s # run from mechanics/interactions/candle/find_igniter swing @s offhand # sound playsound minecraft:item.firecharge.use player @a[distance=..16] # return if creative execute if entity @s[gamemode=creative] run return 1 # use item item modify entity @s weapon.offhand {function:"minecraft:set_count",count:-1,add:1b} ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/candle/used_offhand_flint_and_steel.mcfunction ================================================ # calculates damage for flint and steel # @s = player who ignited candle # at @s # run from mechanics/interactions/candle/find_igniter swing @s offhand # sound playsound minecraft:item.flintandsteel.use player @a[distance=..16] ~ ~ ~ # return if creative execute if entity @s[gamemode=creative] run return 1 # damage execute store result score $level gm4_llp.data run data get entity @s equipment.offhand.components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $level gm4_llp.data 1 scoreboard players set $chance gm4_llp.data 100 scoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data execute store result score $rand gm4_llp.data run random value 1..100 execute if score $rand gm4_llp.data < $chance gm4_llp.data run item modify entity @s weapon.offhand {"function":"minecraft:set_damage","damage":-0.0205,"add":true} execute unless items entity @s weapon.offhand flint_and_steel[damage=64] run return 1 # 0 durability remaining, break item item replace entity @s weapon.offhand with air playsound minecraft:entity.item.break player @a[distance=..16] ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/cactus_flower.mcfunction ================================================ # places cactus_flower displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_cactus_flower_sound","smithed.entity"],\ block_state:{\ Name:"minecraft:cactus_flower"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # sound playsound minecraft:block.cactus_flower.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/candles.mcfunction ================================================ # places candle displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # with {DisplayType} # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/upgrade_candle $summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_candle","gm4_llp_light","smithed.entity"],\ block_state:{\ Name:"$(DisplayType)",\ Properties:{\ candles:"1"\ }\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } summon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:["gm4_llp_candle_rcd","gm4_llp_perma_rcd","smithed.entity","smithed.strict"]} # sound playsound minecraft:block.candle.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/copper_lantern.mcfunction ================================================ # places copper lantern displays # @s = placement rcd # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # with {DisplayType} # run from mechanics/interactions/placement/process_interaction $summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.14","gm4_llp_lantern_sound","gm4_llp_unwaxed_copper_lantern","smithed.entity"],\ block_state:{\ Name:"$(DisplayType)"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } summon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:["gm4_llp_unwaxed_copper_rcd","gm4_llp_perma_rcd","smithed.entity","smithed.strict"]} # light block setblock ~ ~1 ~ light[level=14] keep # sound playsound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/copper_torch.mcfunction ================================================ # places copper torch displays # @s = placement rcd # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.14","gm4_llp_wood_sound","gm4_llp_smoke_torch","smithed.entity"],\ block_state:{\ Name:"minecraft:copper_torch"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=14] keep # sound playsound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/coral_fan.mcfunction ================================================ # places coral_fan displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # with {DisplayType} # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display $summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_wet_grass_sound","smithed.entity"],\ block_state:{\ Name:"$(DisplayType)"\ },\ transformation:{\ scale:[0.5f,0.6f,0.5f],\ translation:[-0.25f,0f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # sound playsound minecraft:block.wet_grass.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/dead_coral_fan.mcfunction ================================================ # places dead_coral_fan displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # with {DisplayType} # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display $summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_stone_sound","smithed.entity"],\ block_state:{\ Name:"$(DisplayType)"\ },\ transformation:{\ scale:[0.5f,0.6f,0.5f],\ translation:[-0.25f,0f,-0.25f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # sound playsound minecraft:block.stone.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/get_mainhand_data.mcfunction ================================================ # stores mainhand item data # @s = player who right clicked on interaction holding a supported item # at @s # run from mechanics/interactions/placement/interact_rcd scoreboard players set $mainhand gm4_llp.data 1 data modify storage gm4_llp:temp DisplayType set from entity @s SelectedItem.id execute if items entity @s weapon.mainhand #gm4_lively_lily_pads:coral_fan run \ scoreboard players set $item_type gm4_llp.data 1 execute if items entity @s weapon.mainhand #gm4_lively_lily_pads:dead_coral_fan run \ scoreboard players set $item_type gm4_llp.data 2 execute if items entity @s weapon.mainhand minecraft:torch run \ scoreboard players set $item_type gm4_llp.data 3 execute if items entity @s weapon.mainhand minecraft:lantern run \ scoreboard players set $item_type gm4_llp.data 4 execute if items entity @s weapon.mainhand minecraft:soul_torch run \ scoreboard players set $item_type gm4_llp.data 5 execute if items entity @s weapon.mainhand minecraft:soul_lantern run \ scoreboard players set $item_type gm4_llp.data 6 execute if items entity @s weapon.mainhand #minecraft:candles run \ scoreboard players set $item_type gm4_llp.data 7 execute if items entity @s weapon.mainhand minecraft:cactus_flower run \ scoreboard players set $item_type gm4_llp.data 8 execute if items entity @s weapon.mainhand minecraft:redstone_torch run \ scoreboard players set $item_type gm4_llp.data 9 execute if items entity @s weapon.mainhand minecraft:spore_blossom run \ scoreboard players set $item_type gm4_llp.data 10 execute if items entity @s weapon.mainhand #gm4_lively_lily_pads:copper_lanterns run \ scoreboard players set $item_type gm4_llp.data 11 execute if items entity @s weapon.mainhand #gm4_lively_lily_pads:waxed_copper_lanterns run \ scoreboard players set $item_type gm4_llp.data 12 execute if items entity @s weapon.mainhand minecraft:copper_torch run \ scoreboard players set $item_type gm4_llp.data 13 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/get_offhand_data.mcfunction ================================================ # stores offhand item data # @s = player who right clicked on interaction holding a supported item # at @s # run from mechanics/interactions/placement/interact_rcd scoreboard players set $offhand gm4_llp.data 1 data modify storage gm4_llp:temp DisplayType set from entity @s equipment.offhand.id execute if items entity @s weapon.offhand #gm4_lively_lily_pads:coral_fan run \ scoreboard players set $item_type gm4_llp.data 1 execute if items entity @s weapon.offhand #gm4_lively_lily_pads:dead_coral_fan run \ scoreboard players set $item_type gm4_llp.data 2 execute if items entity @s weapon.offhand minecraft:torch run \ scoreboard players set $item_type gm4_llp.data 3 execute if items entity @s weapon.offhand minecraft:lantern run \ scoreboard players set $item_type gm4_llp.data 4 execute if items entity @s weapon.offhand minecraft:soul_torch run \ scoreboard players set $item_type gm4_llp.data 5 execute if items entity @s weapon.offhand minecraft:soul_lantern run \ scoreboard players set $item_type gm4_llp.data 6 execute if items entity @s weapon.offhand #minecraft:candles run \ scoreboard players set $item_type gm4_llp.data 7 execute if items entity @s weapon.offhand minecraft:cactus_flower run \ scoreboard players set $item_type gm4_llp.data 8 execute if items entity @s weapon.offhand minecraft:redstone_torch run \ scoreboard players set $item_type gm4_llp.data 9 execute if items entity @s weapon.offhand minecraft:spore_blossom run \ scoreboard players set $item_type gm4_llp.data 10 execute if items entity @s weapon.offhand #gm4_lively_lily_pads:copper_lanterns run \ scoreboard players set $item_type gm4_llp.data 11 execute if items entity @s weapon.offhand #gm4_lively_lily_pads:waxed_copper_lanterns run \ scoreboard players set $item_type gm4_llp.data 12 execute if items entity @s weapon.offhand minecraft:copper_torch run \ scoreboard players set $item_type gm4_llp.data 13 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/interact_rcd.mcfunction ================================================ # place interaction logic # @s = player who right clicked on interaction holding a supported item # at @s # run from advancement: placement_rcd advancement revoke @s only gm4_lively_lily_pads:placement_rcd # brief check to enable Upgrade_Path 3.0 execute if entity @e[type=minecraft:interaction,tag=lilyPadInt,limit=1,distance=..64] run scoreboard players set lively_lily_pads gm4_earliest_version 0 # reset scoreboard players set $mainhand gm4_llp.data 0 scoreboard players set $offhand gm4_llp.data 0 # item information execute if predicate gm4_lively_lily_pads:mainhand_placeable_item run function gm4_lively_lily_pads:mechanics/interactions/placement/get_mainhand_data execute unless score $mainhand gm4_llp.data matches 1 if predicate gm4_lively_lily_pads:offhand_placeable_item run function gm4_lively_lily_pads:mechanics/interactions/placement/get_offhand_data # process interaction execute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/placement/process_interaction # remove item if successful execute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $placement_success gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 run swing @s mainhand execute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.offhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $placement_success gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 run swing @s offhand # reset scoreboard players reset $placement_success gm4_llp.data ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/lantern.mcfunction ================================================ # places lantern displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.14","gm4_llp_lantern_sound","smithed.entity"],\ block_state:{\ Name:"minecraft:lantern"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=14] keep # sound playsound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/process_interaction.mcfunction ================================================ # placement decision # @s = placement rcd # at @s # run from mechanics/interactions/placement/interact_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1 # clean data remove entity @s interaction # fail if old interaction execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # select type execute if score $item_type gm4_llp.data matches 1 run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if score $item_type gm4_llp.data matches 2 run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp execute if score $item_type gm4_llp.data matches 3 run function gm4_lively_lily_pads:mechanics/interactions/placement/torch execute if score $item_type gm4_llp.data matches 4 run function gm4_lively_lily_pads:mechanics/interactions/placement/lantern execute if score $item_type gm4_llp.data matches 5 run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_torch execute if score $item_type gm4_llp.data matches 6 run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_lantern execute if score $item_type gm4_llp.data matches 7 run function gm4_lively_lily_pads:mechanics/interactions/placement/candles with storage gm4_llp:temp execute if score $item_type gm4_llp.data matches 8 run function gm4_lively_lily_pads:mechanics/interactions/placement/cactus_flower execute if score $item_type gm4_llp.data matches 9 run function gm4_lively_lily_pads:mechanics/interactions/placement/redstone_torch execute if score $item_type gm4_llp.data matches 10 run function gm4_lively_lily_pads:mechanics/interactions/placement/spore_blossom execute if score $item_type gm4_llp.data matches 11 run function gm4_lively_lily_pads:mechanics/interactions/placement/copper_lantern with storage gm4_llp:temp execute if score $item_type gm4_llp.data matches 12 run function gm4_lively_lily_pads:mechanics/interactions/placement/waxed_copper_lantern with storage gm4_llp:temp execute if score $item_type gm4_llp.data matches 13 run function gm4_lively_lily_pads:mechanics/interactions/placement/copper_torch # set flag scoreboard players set $placement_success gm4_llp.data 1 # remove placement rcd kill @s ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/redstone_torch.mcfunction ================================================ # places redstone_torch displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.6","gm4_llp_wood_sound","smithed.entity"],\ block_state:{\ Name:"minecraft:redstone_torch"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=6] keep # sound playsound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/soul_lantern.mcfunction ================================================ # places soul lantern displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.9","gm4_llp_lantern_sound","smithed.entity"],\ block_state:{\ Name:"minecraft:soul_lantern"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=9] keep # sound playsound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/soul_torch.mcfunction ================================================ # places soul torch displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.9","gm4_llp_wood_sound","gm4_llp_smoke_torch","smithed.entity"],\ block_state:{\ Name:"minecraft:soul_torch"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=9] keep # sound playsound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/spore_blossom.mcfunction ================================================ # places spore_blossom displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_spore_blossom_sound","smithed.entity"],\ block_state:{\ Name:"minecraft:spore_blossom"\ },\ transformation:{\ scale:[0.5f,0.5f,0.7f],\ translation:[-0.25f,0.7f,0.25f],\ left_rotation:[0.707f,0f,0f,0.707f],\ right_rotation:[0.707f,0f,0f,0.707f]\ }\ } # sound playsound minecraft:block.spore_blossom.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/torch.mcfunction ================================================ # places torch displays # @s = placement rcd or old block display if upgrade path # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # run from mechanics/interactions/placement/process_interaction and upgrade_paths/3.0/update_legacy_display summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.14","gm4_llp_wood_sound","gm4_llp_smoke_torch","smithed.entity"],\ block_state:{\ Name:"minecraft:torch"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } # light block setblock ~ ~1 ~ light[level=14] keep # sound playsound minecraft:block.wood.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/placement/waxed_copper_lantern.mcfunction ================================================ # places waxed copper lantern displays # @s = placement rcd # at lily_pad align xyz positioned ~.5 ~.02 ~.5 # with {DisplayType} # run from mechanics/interactions/placement/process_interaction $summon minecraft:block_display ~ ~ ~ {\ Tags:["gm4_llp_display","gm4_llp_light","gm4_llp_light.14","gm4_llp_lantern_sound","gm4_llp_waxed_copper_lantern","smithed.entity"],\ block_state:{\ Name:"$(DisplayType)"\ },\ transformation:{\ scale:[0.8f,0.8f,0.8f],\ translation:[-0.4f,0f,-0.4f],\ left_rotation:[0f,0f,0f,1f],\ right_rotation:[0f,0f,0f,1f]\ }\ } summon minecraft:interaction ~ ~ ~ {width:0.4f,height:0.4f,Tags:["gm4_llp_waxed_copper_rcd","gm4_llp_perma_rcd","smithed.entity","smithed.strict"]} # light block setblock ~ ~1 ~ light[level=14] keep # sound playsound minecraft:block.lantern.place block @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/attempt_oxidization.mcfunction ================================================ # simple oxidization logic with just a probability # @s = block display, tag=gm4_llp_light, tag=gm4_llp_unwaxed_copper_lantern # at @s # run from mechanics/particles/select_type # this is only run once per entity every 8 ticks (0.4 seconds) # with a 1/6500 chance every 0.4 seconds, in 30 minutes there will be a ~50% chance of oxidization execute store result score $rand gm4_llp.data run random value 1..6500 execute if score $rand gm4_llp.data matches 2.. run return fail # oxidize execute if data entity @s {block_state:{Name:"minecraft:copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:exposed_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:exposed_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:weathered_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:weathered_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:oxidized_copper_lantern" ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/interact_rcd.mcfunction ================================================ # unwaxed copper lantern right click # @s = player who right clicked on an unwaxed copper lantern # at @s # run from advancement: unwaxed_copper_rcd advancement revoke @s only gm4_lively_lily_pads:unwaxed_copper_rcd # reset scoreboards scoreboard players set $mainhand gm4_llp.data 0 scoreboard players set $offhand gm4_llp.data 0 scoreboard players set $wax_used gm4_llp.data 0 scoreboard players set $axe_used gm4_llp.data 0 # item data, need both mainhand and offhand execute if items entity @s weapon.mainhand #minecraft:axes run scoreboard players set $mainhand gm4_llp.data 1 execute if items entity @s weapon.mainhand honeycomb run scoreboard players set $mainhand gm4_llp.data 2 execute if items entity @s weapon.offhand #minecraft:axes run scoreboard players set $offhand gm4_llp.data 1 execute if items entity @s weapon.offhand honeycomb run scoreboard players set $offhand gm4_llp.data 2 # find interaction execute as @e[type=interaction,tag=gm4_llp_unwaxed_copper_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/process_interaction # item usage execute if score $wax_used gm4_llp.data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $wax_used gm4_llp.data matches 1 run swing @s mainhand execute if score $wax_used gm4_llp.data matches 2 run item modify entity @s[gamemode=!creative] weapon.offhand {function:"minecraft:set_count",count:-1,add:1b} execute if score $wax_used gm4_llp.data matches 2 run swing @s offhand execute if score $axe_used gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_mainhand_axe execute if score $axe_used gm4_llp.data matches 1 run swing @s mainhand execute if score $axe_used gm4_llp.data matches 2 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_offhand_axe execute if score $axe_used gm4_llp.data matches 2 run swing @s offhand ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/process_display.mcfunction ================================================ # @s = gm4_llp_unwaxed_copper_lantern block display # at associated interaction # run from mechanics/interactions/unwaxed_copper_lantern/process_interaction scoreboard players set $interaction_processed gm4_llp.data 0 # if mainhand honeycomb, wax execute if score $interaction_processed gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 1 # if no neither item in mainhand, but honeycomb in offhand, wax execute if score $interaction_processed gm4_llp.data matches 0 if score $mainhand gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 2 # check if can scrape execute if score $interaction_processed gm4_llp.data matches 0 store success score $can_scrape gm4_llp.data unless data entity @s {block_state:{Name:"minecraft:copper_lantern"}} # if cant scrape, but offhand honeycomb, wax execute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 2 store success score $interaction_processed gm4_llp.data run scoreboard players set $wax_used gm4_llp.data 2 # if can scrape and mainhand axe, scrape execute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 1 if score $mainhand gm4_llp.data matches 1 store success score $interaction_processed gm4_llp.data run scoreboard players set $axe_used gm4_llp.data 1 # if can scrape and offhand axe, scrape execute if score $interaction_processed gm4_llp.data matches 0 if score $can_scrape gm4_llp.data matches 1 if score $offhand gm4_llp.data matches 1 store success score $interaction_processed gm4_llp.data run scoreboard players set $axe_used gm4_llp.data 2 # fail if nothing to do execute if score $interaction_processed gm4_llp.data matches 0 run return fail # modify display execute if score $wax_used gm4_llp.data matches 1..2 run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/wax_display execute if score $axe_used gm4_llp.data matches 1..2 run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/scrape_display ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/process_interaction.mcfunction ================================================ # @s = gm4_llp_unwaxed_copper_rcd rcd # at @s # run from mechanics/interactions/unwaxed_copper_lantern/interact_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1 # clean data remove entity @s interaction # fail if old interaction execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # fail if neither item execute if score $mainhand gm4_llp.data matches 0 if score $offhand gm4_llp.data matches 0 run return fail # redirect to display execute as @e[type=block_display,tag=gm4_llp_unwaxed_copper_lantern,distance=..0.1,limit=1] run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/process_display # wax execute if score $wax_used gm4_llp.data matches 1..2 run tag @s remove gm4_llp_unwaxed_copper_rcd execute if score $wax_used gm4_llp.data matches 1..2 run tag @s add gm4_llp_waxed_copper_rcd ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/scrape_display.mcfunction ================================================ # @s = gm4_llp_unwaxed_copper_lantern block display # at associated interaction # run from mechanics/interactions/unwaxed_copper_lantern/process_display # visuals particle minecraft:scrape ~ ~.2 ~ 0.3 0.3 0.3 1 16 playsound item.axe.scrape block @a[distance=..16] ~ ~ ~ # modify execute if data entity @s {block_state:{Name:"minecraft:exposed_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:weathered_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:exposed_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:oxidized_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:weathered_copper_lantern" ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/unwaxed_copper_lantern/wax_display.mcfunction ================================================ # @s = gm4_llp_unwaxed_copper_lantern block display # at associated interaction # run from mechanics/interactions/unwaxed_copper_lantern/process_display # visuals particle minecraft:wax_on ~ ~.2 ~ 0.3 0.3 0.3 1 16 playsound item.honeycomb.wax_on block @a[distance=..16] ~ ~ ~ # update tags tag @s remove gm4_llp_unwaxed_copper_lantern tag @s add gm4_llp_waxed_copper_lantern # modify execute if data entity @s {block_state:{Name:"minecraft:copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:waxed_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:exposed_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:waxed_exposed_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:weathered_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:waxed_weathered_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:oxidized_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:waxed_oxidized_copper_lantern" ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe.mcfunction ================================================ # damages axe # @s = player holding axe # at @s # run from mechanics/interactions/waxed_copper_lantern/used_mainhand_axe execute store result score $damage gm4_llp.data run data get entity @s SelectedItem.components."minecraft:damage" execute store result storage gm4_llp:temp damage int 1 run scoreboard players add $damage gm4_llp.data 1 function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/set_damage_mainhand with storage gm4_llp:temp ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/damage_offhand_axe.mcfunction ================================================ # damages axe # @s = player holding axe # at @s # run from mechanics/interactions/waxed_copper_lantern/used_offhand_axe execute store result score $damage gm4_llp.data run data get entity @s equipment.offhand.components."minecraft:damage" execute store result storage gm4_llp:temp damage int 1 run scoreboard players add $damage gm4_llp.data 1 function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/set_damage_offhand with storage gm4_llp:temp ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/interact_rcd.mcfunction ================================================ # waxed copper lantern right click # @s = player who right clicked on an waxed copper lantern # at @s # run from advancement: waxed_copper_rcd advancement revoke @s only gm4_lively_lily_pads:waxed_copper_rcd # reset scoreboards scoreboard players set $mainhand gm4_llp.data 0 scoreboard players set $offhand gm4_llp.data 0 scoreboard players set $holding_axe gm4_llp.data 0 scoreboard players set $scraped gm4_llp.data 0 # item data, only care about axes execute if items entity @s weapon.mainhand #minecraft:axes store success score $holding_axe gm4_llp.data run scoreboard players set $mainhand gm4_llp.data 1 execute unless score $mainhand gm4_llp.data matches 1 if items entity @s weapon.offhand #minecraft:axes store success score $holding_axe gm4_llp.data run scoreboard players set $offhand gm4_llp.data 1 # find interaction execute as @e[type=interaction,tag=gm4_llp_waxed_copper_rcd,distance=..8] if data entity @s interaction at @s run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/process_interaction # fail if not scraped execute if score $scraped gm4_llp.data matches 0 run return fail # update axe durability execute if score $mainhand gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_mainhand_axe execute if score $mainhand gm4_llp.data matches 1 run swing @s mainhand execute if score $offhand gm4_llp.data matches 1 if entity @s[gamemode=!creative] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/used_offhand_axe execute if score $offhand gm4_llp.data matches 1 run swing @s offhand ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/max_durability_mainhand_axe.mcfunction ================================================ # returns 1 if max durability reached # @s = player holding axe # at @s # run from mechanics/interactions/waxed_copper_lantern/used_mainhand_axe execute if items entity @s weapon.mainhand golden_axe[damage=32] run return 1 execute if items entity @s weapon.mainhand wooden_axe[damage=59] run return 1 execute if items entity @s weapon.mainhand stone_axe[damage=131] run return 1 execute if items entity @s weapon.mainhand copper_axe[damage=190] run return 1 execute if items entity @s weapon.mainhand iron_axe[damage=250] run return 1 execute if items entity @s weapon.mainhand diamond_axe[damage=1561] run return 1 execute if items entity @s weapon.mainhand netherite_axe[damage=2031] run return 1 return fail ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/max_durability_offhand_axe.mcfunction ================================================ # returns 1 if max durability reached # @s = player holding axe # at @s # run from mechanics/interactions/waxed_copper_lantern/used_offhand_axe execute if items entity @s weapon.offhand golden_axe[damage=32] run return 1 execute if items entity @s weapon.offhand wooden_axe[damage=59] run return 1 execute if items entity @s weapon.offhand stone_axe[damage=131] run return 1 execute if items entity @s weapon.offhand copper_axe[damage=190] run return 1 execute if items entity @s weapon.offhand iron_axe[damage=250] run return 1 execute if items entity @s weapon.offhand diamond_axe[damage=1561] run return 1 execute if items entity @s weapon.offhand netherite_axe[damage=2031] run return 1 return fail ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/process_interaction.mcfunction ================================================ # @s = gm4_llp_waxed_copper_rcd rcd # at @s # run from mechanics/interactions/waxed_copper_lantern/interact_rcd # store time to check execute store result score $gametime gm4_llp.data run time query gametime execute store result score $check_gametime gm4_llp.data run data get entity @s interaction.timestamp 1 # clean data remove entity @s interaction # fail if old interaction execute unless score $gametime gm4_llp.data = $check_gametime gm4_llp.data run return fail # no axe, no effect execute if score $holding_axe gm4_llp.data matches 0 run return fail # scrape off wax particle minecraft:wax_off ~ ~.2 ~ 0.3 0.3 0.3 1 16 playsound item.axe.wax_off block @a[distance=..16] ~ ~ ~ tag @s remove gm4_llp_waxed_copper_rcd tag @s add gm4_llp_unwaxed_copper_rcd # modify display to match execute as @e[type=minecraft:block_display,tag=gm4_llp_waxed_copper_lantern,distance=..0.1,limit=1] run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/scrape_display # set flag scoreboard players set $scraped gm4_llp.data 1 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/scrape_display.mcfunction ================================================ # @s = gm4_llp_waxed_copper_lantern block display # at associated gm4_llp_waxed_copper_rcd rcd # run from mechanics/interactions/waxed_copper_lantern/process_interaction # update tags tag @s remove gm4_llp_waxed_copper_lantern tag @s add gm4_llp_unwaxed_copper_lantern # modify execute if data entity @s {block_state:{Name:"minecraft:waxed_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:waxed_exposed_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:exposed_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:waxed_weathered_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:weathered_copper_lantern" execute if data entity @s {block_state:{Name:"minecraft:waxed_oxidized_copper_lantern"}} run return run data modify entity @s block_state.Name set value "minecraft:oxidized_copper_lantern" ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/set_damage_mainhand.mcfunction ================================================ # @s = player who scraped wax # at @s # run from mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe $item modify entity @s weapon.mainhand {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/set_damage_offhand.mcfunction ================================================ # @s = player who scraped wax # at @s # run from mechanics/interactions/waxed_copper_lantern/damage_offhand_axe $item modify entity @s weapon.offhand {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/used_mainhand_axe.mcfunction ================================================ # calculates damage for axe # @s = player who scraped wax # at @s # run from mechanics/interactions/waxed_copper_lantern/interact_rcd and mechanics/interactions/unwaxed_copper_lantern/interact_rcd # damage execute store result score $level gm4_llp.data run data get entity @s SelectedItem.components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $level gm4_llp.data 1 scoreboard players set $chance gm4_llp.data 100 scoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data execute store result score $rand gm4_llp.data run random value 1..100 execute if score $rand gm4_llp.data < $chance gm4_llp.data run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/damage_mainhand_axe # fail if not max durability execute unless function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/max_durability_mainhand_axe run return fail # 0 durability remaining, break item item replace entity @s weapon.mainhand with air playsound minecraft:entity.item.break player @a[distance=..16] ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/interactions/waxed_copper_lantern/used_offhand_axe.mcfunction ================================================ # calculates damage for axe # @s = player who scraped wax # at @s # run from mechanics/interactions/waxed_copper_lantern/interact_rcd and mechanics/interactions/unwaxed_copper_lantern/interact_rcd # damage execute store result score $level gm4_llp.data run data get entity @s equipment.offhand.components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $level gm4_llp.data 1 scoreboard players set $chance gm4_llp.data 100 scoreboard players operation $chance gm4_llp.data /= $level gm4_llp.data execute store result score $rand gm4_llp.data run random value 1..100 execute if score $rand gm4_llp.data < $chance gm4_llp.data run function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/damage_offhand_axe # fail if not max durability execute unless function gm4_lively_lily_pads:mechanics/interactions/waxed_copper_lantern/max_durability_offhand_axe run return fail # 0 durability remaining, break item item replace entity @s weapon.offhand with air playsound minecraft:entity.item.break player @a[distance=..16] ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/1_candle.mcfunction ================================================ # displays flames for a 1 candle display # @s = candle display # at @s # run from mechanics/particles/candle_count particle small_flame ~ ~.42 ~ execute if score $rand gm4_llp.data matches 1 run particle smoke ~ ~.43 ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/2_candle.mcfunction ================================================ # displays flames for a 2 candle display # @s = candle display # at @s # run from mechanics/particles/candle_count particle small_flame ~.1 ~.42 ~-.05 particle small_flame ~-.1 ~.37 ~ execute if score $rand gm4_llp.data matches 1 run particle smoke ~.1 ~.43 ~-.05 execute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~ ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/3_candle.mcfunction ================================================ # displays flames for a 3 candle display # @s = candle display # at @s # run from mechanics/particles/candle_count particle small_flame ~.05 ~.42 ~-.05 particle small_flame ~-.1 ~.37 ~ particle small_flame ~ ~.27 ~.1 execute if score $rand gm4_llp.data matches 1 run particle smoke ~.05 ~.43 ~-.05 execute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~ execute if score $rand gm4_llp.data matches 3 run particle smoke ~ ~.28 ~.1 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/4_candle.mcfunction ================================================ # displays flames for a 4 candle display # @s = candle display # at @s # run from mechanics/particles/candle_count particle small_flame ~.05 ~.42 ~-.1 particle small_flame ~-.1 ~.37 ~-.1 particle small_flame ~.1 ~.37 ~.05 particle small_flame ~-.05 ~.27 ~.05 execute if score $rand gm4_llp.data matches 1 run particle smoke ~.05 ~.43 ~-.1 execute if score $rand gm4_llp.data matches 2 run particle smoke ~-.1 ~.38 ~-.1 execute if score $rand gm4_llp.data matches 3 run particle smoke ~.1 ~.38 ~.05 execute if score $rand gm4_llp.data matches 4 run particle smoke ~-.05 ~.28 ~.05 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/candle_count.mcfunction ================================================ # checks candle count and redirects to correct function # @s = candle display # at @s # run from mechanics/particles/select_type # light block function gm4_lively_lily_pads:mechanics/interactions/candle/update_light_blocks # particles execute store result score $rand gm4_llp.data run random value 1..4 execute if data entity @s {block_state:{Properties:{candles:"1"}}} run return run function gm4_lively_lily_pads:mechanics/particles/1_candle execute if data entity @s {block_state:{Properties:{candles:"2"}}} run return run function gm4_lively_lily_pads:mechanics/particles/2_candle execute if data entity @s {block_state:{Properties:{candles:"3"}}} run return run function gm4_lively_lily_pads:mechanics/particles/3_candle function gm4_lively_lily_pads:mechanics/particles/4_candle ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/particles/select_type.mcfunction ================================================ # dispatches type # @s = block display, tag=gm4_llp_light # at @s # run from tick execute if entity @s[tag=gm4_llp_lit_candle] run return run function gm4_lively_lily_pads:mechanics/particles/candle_count execute store result score $rand gm4_llp.data run random value 1..10 execute if entity @s[tag=gm4_llp_smoke_torch] \ if score $rand gm4_llp.data matches 1..6 run particle smoke ~ ~.6 ~ execute if data entity @s {block_state:{Name:"minecraft:soul_torch"}} \ if score $rand gm4_llp.data matches 1..9 run particle soul_fire_flame ~ ~.58 ~ execute if data entity @s {block_state:{Name:"minecraft:torch"}} \ if score $rand gm4_llp.data matches 1..9 run particle flame ~ ~.58 ~ execute if data entity @s {block_state:{Name:"minecraft:copper_torch"}} \ if score $rand gm4_llp.data matches 1..9 run particle copper_fire_flame ~ ~.58 ~ execute if data entity @s {block_state:{Name:"minecraft:redstone_torch"}} \ if score $rand gm4_llp.data matches 1..8 run particle dust{color:[1,0,0],scale:0.8} ~ ~.58 ~ # refresh light block execute if block ~ ~1 ~ light run setblock ~ ~1 ~ air execute if entity @s[tag=gm4_llp_light.14] run setblock ~ ~1 ~ light[level=14] keep execute if entity @s[tag=gm4_llp_light.9] run setblock ~ ~1 ~ light[level=9] keep execute if entity @s[tag=gm4_llp_light.6] run setblock ~ ~1 ~ light[level=6] keep # copper lantern oxidization execute if entity @s[tag=gm4_llp_unwaxed_copper_lantern] run function gm4_lively_lily_pads:mechanics/interactions/unwaxed_copper_lantern/attempt_oxidization ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/create.mcfunction ================================================ # Sets up rcd # @s = new interaction # at @s # run from mechanics/right_click_detection/found data merge entity @s {width:0.4f,height:0.3f,Tags:["gm4_llp_placement_rcd","smithed.entity","smithed.strict"]} scoreboard players operation @s gm4_llp.id = $player gm4_llp.id ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/found.mcfunction ================================================ # execute at nearest lily pad in front of player # @s = player holding supported item # at lily_pad align xyz # run from mechanics/right_click_detection/ray # visuals particle scrape ~.5 ~.12 ~.5 0 0 0 0 1 # spawn an interaction if needed scoreboard players operation $player gm4_llp.id = @s gm4_llp.id execute unless entity @e[type=interaction,tag=gm4_llp_placement_rcd,dx=0,limit=1] positioned ~.5 ~.02 ~.5 \ summon minecraft:interaction run function gm4_lively_lily_pads:mechanics/right_click_detection/create # start loop scoreboard players set $timer gm4_llp.data 10 function gm4_lively_lily_pads:mechanics/right_click_detection/loop ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/loop.mcfunction ================================================ # loops as long as a "right click detection" interaction exists # @s = arbitrary # at unknown # run from mechanics/right_click_detection/found and scheduled from self # count down scoreboard players remove $timer gm4_llp.data 1 execute as @e[type=interaction,tag=gm4_llp_placement_rcd] at @s run function gm4_lively_lily_pads:mechanics/right_click_detection/process # loop if needed execute if score $timer gm4_llp.data matches 0.. run schedule function gm4_lively_lily_pads:mechanics/right_click_detection/loop 10t ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/process.mcfunction ================================================ # processes the "right click detection" interaction so that it is despawned when unneeded # @s = gm4_llp_placement_rcd interaction # at @s # run from mechanics/right_click_detection/loop # refresh timer scoreboard players set $timer gm4_llp.data 10 # kill rcd if uneeded execute unless entity @p[tag=gm4_llp_holding_item,distance=..6] run return run kill @s execute unless block ~ ~ ~ lily_pad run return run kill @s execute align xyz if entity @e[type=block_display,tag=gm4_llp_display,dx=0] run return run kill @s # kill if multiple interaction with the same id, which therefore belong to the same player scoreboard players set $duplicate_exists gm4_llp.data 0 scoreboard players operation $check_id gm4_llp.id = @s gm4_llp.id execute as @e[type=interaction,tag=gm4_llp_placement_rcd,distance=0.1..16] if score @s gm4_llp.id = $check_id gm4_llp.id run scoreboard players set $duplicate_exists gm4_llp.data 1 execute if score $duplicate_exists gm4_llp.data matches 1 run kill @s ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/mechanics/right_click_detection/ray.mcfunction ================================================ # raycasts from the players head that moves forward until it finds a lily_pad block # @s = player holding supported item # at @s anchored eyes, moving forward # run from player/holding_item and self # Vertical Offset = 1 - Detection Height execute if block ~ ~.5 ~ minecraft:lily_pad if block ~ ~ ~ minecraft:lily_pad align xyz \ unless entity @e[type=minecraft:block_display,limit=1,dx=0,tag=gm4_llp_display] \ run return run function gm4_lively_lily_pads:mechanics/right_click_detection/found # loop scoreboard players remove $ray gm4_llp.data 1 execute if score $ray gm4_llp.data matches 0.. positioned ^ ^ ^.5 run function gm4_lively_lily_pads:mechanics/right_click_detection/ray # Raycast Step = Detection Height ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/as.mcfunction ================================================ # @s = player # at @s # run from main tag @s remove gm4_llp_holding_item execute if predicate gm4_lively_lily_pads:holding_placeable_item run function gm4_lively_lily_pads:player/holding_item ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/holding_item.mcfunction ================================================ # @s = player holding supported item # at @s # run from player/as tag @s add gm4_llp_holding_item # raycast for lily_pad # | 6 blocks, 0.5 forward at a time scoreboard players set $ray gm4_llp.data 12 execute anchored eyes positioned ^ ^ ^ run function gm4_lively_lily_pads:mechanics/right_click_detection/ray ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/player/set_id.mcfunction ================================================ # @s = player # at @s # run from advancement: id_init # revoke to handle username changes advancement revoke @s only gm4_lively_lily_pads:id_init scoreboard players operation @s gm4_llp.id = $next gm4_llp.id scoreboard players add $next gm4_llp.id 1 ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/tick.mcfunction ================================================ schedule function gm4_lively_lily_pads:tick 8t # selects displays for particles, light_block refreshing, oxidization execute as @e[type=block_display,tag=gm4_llp_light] at @s run function gm4_lively_lily_pads:mechanics/particles/select_type ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0/update_legacy_display.mcfunction ================================================ # upgrades and then kills legacy lilyPadLight # @s = old block display, tag=lilyPadLight # at @s align xyz positioned ~.5 ~.02 ~.5 # run from upgrade_paths/3.0 # block_state.Name needed for coral fan and candle type info data modify storage gm4_llp:temp DisplayType set from entity @s block_state.Name ## Select Type execute if data entity @s {block_state:{Name:"minecraft:torch"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/torch execute if data entity @s {block_state:{Name:"minecraft:soul_torch"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_torch execute if data entity @s {block_state:{Name:"minecraft:redstone_torch"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/redstone_torch execute if data entity @s {block_state:{Name:"minecraft:lantern"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/lantern execute if data entity @s {block_state:{Name:"minecraft:soul_lantern"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/soul_lantern execute if data entity @s {block_state:{Name:"minecraft:cactus_flower"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/cactus_flower execute if data entity @s {block_state:{Name:"minecraft:spore_blossom"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/spore_blossom execute if data entity @s block_state.Properties.candles run function gm4_lively_lily_pads:upgrade_paths/3.0/upgrade_candle with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:brain_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:bubble_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:fire_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:horn_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:tube_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:dead_brain_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:dead_bubble_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:dead_fire_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:dead_horn_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp execute if data entity @s {block_state:{Name:"minecraft:dead_tube_coral_fan"}} run function gm4_lively_lily_pads:mechanics/interactions/placement/dead_coral_fan with storage gm4_llp:temp # kill old kill @s ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0/upgrade_candle.mcfunction ================================================ # string manipulation and data transfer from legacy candles # @s = block display, tag=lilyPadLight # at @s align xyz positioned ~.5 ~.02 ~.5 # run from upgrade_paths/3.0/update_legacy_display # summon new display function gm4_lively_lily_pads:mechanics/interactions/placement/candles with storage gm4_llp:temp # set additional data from old display data modify entity @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] block_state.Properties.candles \ set from entity @s block_state.Properties.candles data modify entity @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] block_state.Properties.lit \ set from entity @s block_state.Properties.lit execute if data entity @s {block_state:{Properties:{lit:"true"}}} \ run tag @e[type=minecraft:block_display,tag=gm4_llp_candle,limit=1,distance=..0.1] add gm4_llp_lit_candle ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.0.mcfunction ================================================ # upgrade path from pre-gm4 LLP # @s = player # at @s # run via upgrade paths util # kill old non-useful entities kill @e[type=minecraft:interaction,tag=lilyPadInt] kill @e[type=minecraft:block_display,tag=lilyPadLight2] # upgrade remaining execute as @e[type=minecraft:block_display,tag=lilyPadLight] at @s align xyz positioned ~.5 ~0.02 ~.5 \ run function gm4_lively_lily_pads:upgrade_paths/3.0/update_legacy_display # CHECK TO ENABLE UPGRADE PATH IN mechanics/interactions/placement/interact_rcd ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.1.mcfunction ================================================ # add gm4_llp_perma_rcd tag to gm4_llp_candle_rcd # @s = player # at @s # run via upgrade paths util tag @e[type=interaction,tag=gm4_llp_candle_rcd,tag=!gm4_llp_perma_rcd] add gm4_llp_perma_rcd ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/function/upgrade_paths/3.3.mcfunction ================================================ # remove `response:1b` from gm4_llp_perma_rcd interactions # @s = player # at @s # run via upgrade paths util execute as @e[type=interaction,tag=gm4_llp_perma_rcd,nbt={response:1b}] run data modify entity @s response set value 0b ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/guidebook/lively_lily_pads.json ================================================ { "id": "lively_lily_pads", "name": "Lively Lily Pads", "module_type": "module", "icon": { "id": "minecraft:lily_pad" }, "criteria": { "obtain_pad": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:lily_pad" ] } ] } }, "obtain_placeable_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#gm4_lively_lily_pads:placeable_item" } ] } } }, "sections": [ { "name": "display", "enable": [], "requirements": [ [ "obtain_pad", "obtain_placeable_item" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.lively_lily_pads.description", "fallback": "Simply right click the particles on lily pads with decorations to add them on top!\nCandles will need lighting." } ], [ { "translate":"text.gm4.guidebook.lively_lily_pads.item_list.header", "fallback":"Decorations:", "underlined":true }, { "text":"\n\n" }, { "translate": "text.gm4.guidebook.lively_lily_pads.item_list", "fallback": "Candles\nLanterns\nTorches\nCoral Fans\nCactus Flower\nSpore Blossom", "underlined":false } ] ] } ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/holding_placeable_item.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:reference", "name": "gm4_lively_lily_pads:mainhand_placeable_item" }, { "condition": "minecraft:reference", "name": "gm4_lively_lily_pads:offhand_placeable_item" } ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/mainhand_placeable_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_lively_lily_pads:placeable_item" } } } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/predicate/offhand_placeable_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_lively_lily_pads:placeable_item" } } } } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/candle_igniters.json ================================================ { "values": [ "minecraft:fire_charge", "minecraft:flint_and_steel" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/candle_interactable.json ================================================ { "values": [ "#minecraft:candles", "#gm4_lively_lily_pads:candle_igniters" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/copper_lanterns.json ================================================ { "values": [ "minecraft:copper_lantern", "minecraft:exposed_copper_lantern", "minecraft:weathered_copper_lantern", "minecraft:oxidized_copper_lantern" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/coral_fan.json ================================================ { "values": [ "minecraft:brain_coral_fan", "minecraft:bubble_coral_fan", "minecraft:fire_coral_fan", "minecraft:horn_coral_fan", "minecraft:tube_coral_fan" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/dead_coral_fan.json ================================================ { "values": [ "minecraft:dead_brain_coral_fan", "minecraft:dead_bubble_coral_fan", "minecraft:dead_fire_coral_fan", "minecraft:dead_horn_coral_fan", "minecraft:dead_tube_coral_fan" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/placeable_item.json ================================================ { "values": [ "#gm4_lively_lily_pads:copper_lanterns", "#gm4_lively_lily_pads:coral_fan", "#gm4_lively_lily_pads:dead_coral_fan", "#gm4_lively_lily_pads:waxed_copper_lanterns", "#minecraft:candles", "minecraft:cactus_flower", "minecraft:copper_torch", "minecraft:lantern", "minecraft:redstone_torch", "minecraft:torch", "minecraft:soul_lantern", "minecraft:soul_torch", "minecraft:spore_blossom" ] } ================================================ FILE: gm4_lively_lily_pads/data/gm4_lively_lily_pads/tags/item/waxed_copper_lanterns.json ================================================ { "values": [ "minecraft:waxed_copper_lantern", "minecraft:waxed_exposed_copper_lantern", "minecraft:waxed_weathered_copper_lantern", "minecraft:waxed_oxidized_copper_lantern" ] } ================================================ FILE: gm4_lively_lily_pads/mod.mcdoc ================================================ use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_llp:temp] to struct { item?: struct { id: #[id="item"] string, count: int, motion: [double] @ 3, }, held_item?: #[id="item"] string, DisplayType?: #[id="item"] string, damage?: int, } ================================================ FILE: gm4_lively_lily_pads/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.lively_lily_pads,"Place decorations on Lily Pads!" text.gm4.guidebook.lively_lily_pads.description,"Simply right click the particles on lily pads with decorations to add them on top!\nCandles will need lighting." text.gm4.guidebook.lively_lily_pads.item_list.header,"Decorations:" text.gm4.guidebook.lively_lily_pads.item_list,"Candles\nLanterns\nTorches\nCoral Fans\nCactus Flower\nSpore Blossom" ================================================ FILE: gm4_lumos_shamir/README.md ================================================ # Lumo Shamir The darkness is now a little less lonely when you can auto-place torches! ### Features - When a tool with Lumos on it detects a player is in a light level below 2, a torch from the inventory will be used - The torch is placed a the feet of the player - Builds on Gamemode 4's fun extension of the Enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy) ================================================ FILE: gm4_lumos_shamir/assets/translations.csv ================================================ key,en_us item.gm4.shamir.lumos,Lumos Shamir text.gm4.guidebook.module_desc.lumos_shamir,Adds the shamir 'Lumos' to Metallurgy. It places torches when it is dark. text.gm4.guidebook.lumos_shamir.description,Lumos takes torches from the inventory and places them if the light level is too low. text.gm4.guidebook.lumos_shamir.usage,The Lumos Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes and shovels.\n\nHolding the tool will cause torches to be placed when standing in low light levels. ================================================ FILE: gm4_lumos_shamir/beet.yaml ================================================ id: gm4_lumos_shamir name: Lumos Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 schedule_loops: [main] model_data: - item: [pickaxes, shovels] reference: shamir/lumos template: name: shamir metal: curies_bismium textures_path: gm4_metallurgy:item/shamir/curies_bismium website: description: Adds the shamir 'Lumos' to Metallurgy. It places torches when it is dark. recommended: [] notes: [] modrinth: project_id: vYbLApXc wiki: https://wiki.gm4.co/wiki/Metallurgy/Lumos_Shamir credits: Creators: - InternetAlien - SirSheepe Idea By: - Misode Icon Design: - BPR ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/active.mcfunction ================================================ #run from main #@s = players holding a lumos tool execute store success score $has_torches gm4_ml_data run clear @s torch 0 execute at @s if score $has_torches gm4_ml_data matches 1 if predicate gm4_lumos_shamir:check_air unless block ~ ~ ~ #gm4:water unless block ~ ~-1 ~ #gm4_lumos_shamir:torch_unplaceable if predicate gm4_lumos_shamir:check_block run function gm4_lumos_shamir:place_torch ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'lumos'}}] if items entity @s contents #gm4_lumos_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/init.mcfunction ================================================ execute unless score lumos_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Lumos Shamir"} execute unless score lumos_shamir gm4_earliest_version < lumos_shamir gm4_modules run scoreboard players operation lumos_shamir gm4_earliest_version = lumos_shamir gm4_modules scoreboard players set lumos_shamir gm4_modules 1 schedule function gm4_lumos_shamir:main 4t #$moduleUpdateList ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/main.mcfunction ================================================ execute as @a[gamemode=!spectator,gamemode=!adventure,predicate=gm4_lumos_shamir:holding_lumos] at @s run function gm4_lumos_shamir:active scoreboard players reset has_torches gm4_ml_data schedule function gm4_lumos_shamir:main 16t ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/place_torch.mcfunction ================================================ #run from active #@s = player with torches setblock ~ ~ ~ minecraft:torch clear @s[gamemode=!creative] torch 1 playsound minecraft:block.wood.place block @a ~ ~ ~ 1 1 execute align xyz positioned ~0.5 ~0.5 ~0.5 run particle minecraft:firework ~ ~0.4 ~ 0.08 0 0.08 0.01 3 ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/lumos via #gm4_metallurgy:summon_band/lumos loot spawn ~ ~ ~ loot gm4_lumos_shamir:band ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/guidebook/lumos_shamir.json ================================================ { "id": "lumos_shamir", "name": "Lumos Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_lumos_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'lumos'}}" } } ] } }, "obtain_lumos_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'lumos'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.lumos_shamir.description", "fallback": "Lumos takes torches from the inventory and places them if the light level is too low." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_lumos_shamir", "obtain_lumos_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.lumos_shamir.usage", "fallback": "The Lumos Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes and shovels.\n\nHolding the tool will cause torches to be placed when standing in low light levels." } ] ] } ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:curies_bismium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_lumos_shamir:shamir/lumos"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'lumos'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.lumos", "fallback": "Lumos Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/check_air.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "light": { "light": { "min": 0, "max": 1 } }, "block": { "blocks": "#gm4:replaceable" } } }, { "condition": "minecraft:location_check", "predicate": { "light": { "light": { "min": 0, "max": 1 } }, "block": { "blocks": [ "minecraft:snow" ], "state": { "layers": "1" } } } } ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/check_block.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:trapdoors", "state": { "half": "top", "open": "false" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#gm4_lumos_shamir:torch_placeable" } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": [ "minecraft:grindstone" ], "state": { "face": "floor" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": [ "minecraft:piston_head" ], "state": { "facing": "up" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:fence_gates", "state": { "open": "false" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "top" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:slabs", "state": { "type": "double" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:stairs", "state": { "half": "top" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": [ "minecraft:end_portal_frame" ], "state": { "eye": "true" } } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": [ "minecraft:bell" ], "state": { "attachment": "floor" } } } } ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/predicate/holding_lumos.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'lumos'}}" } } } } } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/tags/block/torch_placeable.json ================================================ { "values": [ "#gm4:full_collision", "#minecraft:anvil", "#minecraft:fences", "#minecraft:walls", "minecraft:piston", "minecraft:red_stained_glass_pane", "minecraft:green_stained_glass_pane", "minecraft:glass_pane", "minecraft:chorus_flower", "minecraft:sticky_piston", "minecraft:flowering_azalea", "minecraft:blue_stained_glass_pane", "minecraft:brown_stained_glass_pane", "minecraft:purple_stained_glass_pane", "minecraft:white_stained_glass_pane", "minecraft:yellow_stained_glass_pane", "minecraft:lime_stained_glass_pane", "minecraft:light_gray_stained_glass_pane", "minecraft:magenta_stained_glass_pane", "minecraft:dragon_egg", "minecraft:iron_bars", "minecraft:light_blue_stained_glass_pane", "minecraft:azalea", "minecraft:scaffolding", "minecraft:pink_stained_glass_pane", "minecraft:gray_stained_glass_pane", "minecraft:orange_stained_glass_pane", "minecraft:cyan_stained_glass_pane", "minecraft:black_stained_glass_pane" ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/tags/block/torch_unplaceable.json ================================================ { "values": [ "#minecraft:air", "#minecraft:flowers", "#minecraft:saplings", "#minecraft:leaves", "#minecraft:wool_carpets", "#minecraft:cauldrons", "#minecraft:wooden_pressure_plates", "#minecraft:signs", "#minecraft:banners", "#minecraft:beds", "#minecraft:rails", "#minecraft:doors", "#minecraft:buttons", "minecraft:water", "minecraft:stone_pressure_plate", "minecraft:red_mushroom", "minecraft:brown_mushroom", "minecraft:ladder", "minecraft:composter", "minecraft:cobweb", "minecraft:chorus_plant", "minecraft:chest", "minecraft:cactus", "minecraft:lily_pad", "minecraft:ender_chest", "minecraft:enchanting_table", "minecraft:dirt_path", "minecraft:sea_pickle", "minecraft:honey_block", "minecraft:stonecutter", "minecraft:campfire", "minecraft:flower_pot", "minecraft:bamboo_sapling", "minecraft:bamboo", "minecraft:brewing_stand", "minecraft:daylight_detector", "minecraft:hopper", "minecraft:tripwire_hook", "minecraft:repeater", "minecraft:comparator", "minecraft:lectern", "minecraft:light_weighted_pressure_plate", "minecraft:heavy_weighted_pressure_plate", "minecraft:trapped_chest", "minecraft:redstone_wire", "minecraft:farmland", "minecraft:lever", "minecraft:conduit", "minecraft:turtle_egg", "minecraft:skeleton_skull", "minecraft:wither_skeleton_skull", "minecraft:player_head", "minecraft:zombie_head", "minecraft:creeper_head", "minecraft:dragon_head", "minecraft:tube_coral", "minecraft:brain_coral", "minecraft:bubble_coral", "minecraft:fire_coral", "minecraft:horn_coral", "minecraft:tube_coral_fan", "minecraft:brain_coral_fan", "minecraft:bubble_coral_fan", "minecraft:fire_coral_fan", "minecraft:horn_coral_fan", "minecraft:dead_tube_coral", "minecraft:dead_brain_coral", "minecraft:dead_bubble_coral", "minecraft:dead_fire_coral", "minecraft:dead_horn_coral", "minecraft:dead_tube_coral_fan", "minecraft:dead_brain_coral_fan", "minecraft:dead_bubble_coral_fan", "minecraft:dead_fire_coral_fan", "minecraft:dead_horn_coral_fan" ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:pickaxes", "#minecraft:shovels" ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/test/already_light.mcfunction ================================================ # @template gm4_lumos_shamir:test_dark # @dummy ~1 ~1 ~1 # @optional setblock ~1 ~3 ~1 minecraft:glowstone give @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"lumos"}}] give @s torch 16 await delay 1s await block ~1 ~1 ~1 minecraft:air ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/test/invalid_spot.mcfunction ================================================ # @template gm4_lumos_shamir:test_dark # @dummy ~1 ~1 ~1 setblock ~1 ~1 ~1 minecraft:ladder give @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"lumos"}}] give @s torch 16 await delay 1s await block ~1 ~1 ~1 minecraft:ladder ================================================ FILE: gm4_lumos_shamir/data/gm4_lumos_shamir/test/place_torch.mcfunction ================================================ # @template gm4_lumos_shamir:test_dark # @dummy ~1 ~1 ~1 give @s diamond_pickaxe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"lumos"}}] await delay 1s give @s torch 16 await block ~1 ~1 ~1 torch assert items entity @s container.* minecraft:torch[count=15] ================================================ FILE: gm4_lumos_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_lumos_shamir:check_item_validity" ] } ================================================ FILE: gm4_lumos_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json ================================================ { "values": [ "gm4_lumos_shamir:summon_band" ] } ================================================ FILE: gm4_mending_tanks/README.md ================================================ # Mending Tanks Mending items but using a Gamemode 4 Liquid Tank! ### Features - Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack - Allows XP fluid in a tank to repair damaged items if they have the mending enchant ================================================ FILE: gm4_mending_tanks/beet.yaml ================================================ id: gm4_mending_tanks name: Mending Tanks version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_liquid_tanks: 3.1.0 website: description: Enables Liquid Tanks filled with Experience to repair tools with the mending enchant on them. recommended: [] notes: [] modrinth: project_id: DPYixL7Y wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Mending_Tanks credits: Creator: - Kroppeb Icon Design: - Sparks ================================================ FILE: gm4_mending_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json ================================================ { "values":[ "gm4_mending_tanks:item_fill" ] } ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/function/check_item.mcfunction ================================================ #@s = experience liquid tank with item in first slot #run from mending_tanks:item_fill execute store result score $damage gm4_lt_util run data get block ~ ~ ~ Items[0].components."minecraft:damage" execute if score $damage gm4_lt_util matches 1.. run function gm4_mending_tanks:repair # smart storage is bypassed within repair, which merges the data back to the tool itself. ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/function/init.mcfunction ================================================ scoreboard objectives add gm4_lt_util dummy scoreboard players set #mt_repair_per_xp gm4_lt_util 2 scoreboard players set #mt_max_repair gm4_lt_util 32 execute unless score mending_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Mending Tanks"} execute unless score mending_tanks gm4_earliest_version < mending_tanks gm4_modules run scoreboard players operation mending_tanks gm4_earliest_version = mending_tanks gm4_modules scoreboard players set mending_tanks gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/function/item_fill.mcfunction ================================================ #@s = liquid tank with item in first slot #run from liquid_tanks:item_process #experience tank execute if entity @s[tag=gm4_lt_experience] if items block ~ ~ ~ container.0 *[minecraft:enchantments~[{enchantments:["minecraft:mending"]}]] run function gm4_mending_tanks:check_item ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/function/repair.mcfunction ================================================ #@s = experience liquid tank with item in first slot #run from mending_tanks:check_item # we will repair min(Damage, repair_points, max_repair) scoreboard players operation $repair gm4_lt_util = @s gm4_lt_value execute if score $repair gm4_lt_util matches ..-1 run scoreboard players set $repair gm4_lt_util 0 ## convert xp points to repair points scoreboard players operation $repair gm4_lt_util *= #mt_repair_per_xp gm4_lt_util scoreboard players operation $repair gm4_lt_util < $damage gm4_lt_util scoreboard players operation $repair gm4_lt_util < #mt_max_repair gm4_lt_util # subtract $repair from Damage scoreboard players operation $damage gm4_lt_util -= $repair gm4_lt_util execute store result block ~ ~ ~ Items[0].components."minecraft:damage" int 1 run scoreboard players get $damage gm4_lt_util # convert repair cost to xp_points (rounded up) and add to value scoreboard players remove $repair gm4_lt_util 1 scoreboard players operation $repair gm4_lt_util /= #mt_repair_per_xp gm4_lt_util scoreboard players add $repair gm4_lt_util 1 scoreboard players operation @s gm4_lt_value -= $repair gm4_lt_util ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/guidebook/mending_tanks.json ================================================ { "id": "mending_tanks", "name": "Mending Tanks", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:diamond_axe", "components": { "minecraft:enchantments": { "minecraft:mending": 1 } } }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } }, "obtain_mending_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "enchantments": [ { "enchantments": "minecraft:mending" } ] } ] } } }, "sections": [ { "name": "usage", "enable": [], "requirements": [ [ "obtain_liquid_tank" ], [ "obtain_mending_item" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.mending_tanks.usage", "fallback": "Items with the Mending enchantment will be reapaired when placed inside an Experience Tank." } ] ] } ] } ================================================ FILE: gm4_mending_tanks/data/gm4_mending_tanks/test/repair_item.mcfunction ================================================ # @template gm4_liquid_tanks:test_setup item replace block ~1 ~3 ~1 container.0 with minecraft:experience_bottle 10 await items block ~1 ~3 ~1 container.* minecraft:glass_bottle item replace block ~1 ~3 ~1 container.0 with air await delay 1s item replace block ~1 ~3 ~1 container.0 with minecraft:elytra[damage=30,enchantments={mending:1}] await items block ~1 ~3 ~1 container.0 minecraft:elytra[damage=0] ================================================ FILE: gm4_mending_tanks/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.mending_tanks,Enables Liquid Tanks filled with Experience to repair tools with the mending enchant on them. text.gm4.guidebook.mending_tanks.usage,Items with the Mending enchantment will be reapaired when placed inside an Experience Tank. ================================================ FILE: gm4_metallurgy/README.md ================================================ # Metallurgy Custom enchantment system for armor and tools. Comes with a builtin set of "Shamirs" but can be expanded by other data packs! ### Features - Block up stone types with TNT to obtain special ores - Create a Mould by dropping Clay and Obsidian on a block of Sand - After a complex sequence of heating and adding ores, a Shamir will be made - Apply Shamirs to tools and armor by using a Piston and Anvil Read more about all the details on the [Wiki](https://wiki.gm4.co/Metallurgy). ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/elytra_anim.png to=gm4_metallurgy:optifine/cit/aluminium/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/aluminium/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/aluminium/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/aluminium/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/aluminium/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/aluminium/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/aluminium/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/elytra_anim.png to=gm4_metallurgy:optifine/cit/barimium/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/barimium/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/barimium/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barimium/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barimium/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barimium/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barimium/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/elytra_anim.png to=gm4_metallurgy:optifine/cit/barium/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/barium/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/barium/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/barium/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/barium/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/barium/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/barium/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/elytra_anim.png to=gm4_metallurgy:optifine/cit/bismuth/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/bismuth/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/bismuth/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/bismuth/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/bismuth/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/bismuth/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/bismuth/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/elytra_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/spyglass.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/spyglass_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/spyglass.png x=0 y=0 w=16 h=16 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/curies_bismium/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/curies_bismium/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/curies_bismium/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/chainmail_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/chainmail_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/chainmail_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/diamond_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/diamond_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/diamond_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/diamond_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/diamond_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/diamond_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/elytra.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/elytra_anim.png to=gm4_metallurgy:optifine/cit/thorium/elytra.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/gold_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/gold_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/gold_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/gold_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/gold_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/gold_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/iron_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/iron_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/iron_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/iron_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/iron_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/iron_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/leather_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_1_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_overlay_anim.png to=gm4_metallurgy:optifine/cit/thorium/leather_layer_1_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/leather_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/leather_layer_2_overlay.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_overlay_anim.png to=gm4_metallurgy:optifine/cit/thorium/leather_layer_2_overlay.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/netherite_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/netherite_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/netherite_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/netherite_layer_2.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/netherite_layer_2_anim.png to=gm4_metallurgy:optifine/cit/thorium/netherite_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/anim/thorium/turtle_layer_1.properties ================================================ from=gm4_metallurgy:optifine/cit/thorium/turtle_layer_1_anim.png to=gm4_metallurgy:optifine/cit/thorium/turtle_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=54 tile.1=0 duration.1=1 tile.2=1 duration.2=1 tile.3=2 duration.3=1 tile.4=3 duration.4=1 ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/barimium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/curies_bismium/spyglass.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/curies_bismium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/optifine/cit/thorium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/axe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/boots.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/broken_elytra.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/elytra.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/hoe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/leather_leggings.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/leggings.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/netherite_helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/pickaxe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/shears.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/shovel.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/aluminium/turtle_helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/compass.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/hoe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/sword.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barimium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/axe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/compass.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/hoe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/pickaxe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/barium/shovel.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/axe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/boots.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/fishing_rod.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/pickaxe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/shovel.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/bismuth/sword.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/axe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/boots.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/bow.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/broken_elytra.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/bucket.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/clock.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/compass.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/crossbow.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/elytra.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/fishing_rod.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/flint_and_steel.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/hoe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/leather_leggings.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/leggings.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/netherite_helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/pickaxe.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/shears.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/shovel.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/spyglass.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/sword.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3 ] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/curies_bismium/turtle_helmet.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/boots.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/sword.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/gm4_metallurgy/textures/item/shamir/thorium/trident.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3] } } ================================================ FILE: gm4_metallurgy/assets/model_data.yaml ================================================ model_data: - item: player_head template: generated broadcast: - textures: item/band/mundane_band reference: item/mundane_band - reference: item/lump/baryte - reference: item/lump/bauxite - reference: item/lump/bismutite - reference: item/lump/thorianite - item: player_head template: vanilla broadcast: - reference: block/mould/cool_empty - reference: block/mould/hot_empty - reference: block/mould/cool_metal - reference: block/mould/hot_metal - item: obsidian reference: item/slightly_damaged_obsidian template: vanilla - reference: shamir/defuse item: armor template: name: shamir metal: aluminium textures_path: item/shamir/aluminium - reference: shamir/moneo item: [tools, elytra, shears] template: name: shamir metal: aluminium textures_path: item/shamir/aluminium - reference: shamir/arborenda item: axes template: name: shamir metal: barium textures_path: item/shamir/barium - reference: shamir/sensus item: compass template: name: shamir metal: barium textures_path: item/shamir/barium - reference: shamir/gemini item: hoes template: name: shamir metal: barimium textures_path: item/shamir/barimium - reference: shamir/musical item: [swords, trident] template: name: shamir metal: barimium textures_path: item/shamir/barimium - reference: shamir/forterra item: pickaxes template: name: shamir metal: bismuth textures_path: item/shamir/bismuth - reference: shamir/hypexperia item: [swords, pickaxes, axes, shovels, fishing_rod] template: name: shamir metal: bismuth textures_path: item/shamir/bismuth - reference: shamir/vibro item: boots template: name: shamir metal: thorium textures_path: item/shamir/thorium - reference: shamir/ender_bolt item: [swords, trident] template: name: shamir metal: thorium textures_path: item/shamir/thorium - reference: shamir/infinitas item: buckets template: name: shamir metal: curies_bismium textures_path: item/shamir/curies_bismium - reference: shamir/tinker item: [pickaxes, shovels, hoes, swords] template: name: shamir metal: curies_bismium textures_path: item/shamir/curies_bismium - item: lava_bucket reference: gui/advancement/metallurgy_overheat_cast template: advancement - item: player_head reference: gui/advancement/metallurgy_blast_ore template: name: advancement forward: item/lump/bauxite - item: player_head reference: gui/advancement/metallurgy_cast template: name: advancement forward: shamir/defuse/band ================================================ FILE: gm4_metallurgy/assets/translations.csv ================================================ key,en_us advancement.gm4.metallurgy.blast_ore.description,Blast open some rock and find the metal within. advancement.gm4.metallurgy.blast_ore.title,How Ad-ore-able advancement.gm4.metallurgy.cast.description,Create a mould and add some metal. advancement.gm4.metallurgy.cast.title,Firebender advancement.gm4.metallurgy.overheat_cast.description,Destroy a mould containing molten metal. advancement.gm4.metallurgy.overheat_cast.title,Blame Me for the Mess item.gm4.metallurgy.aluminium,Aluminium item.gm4.metallurgy.band,%s Band item.gm4.metallurgy.barimium,Barimium item.gm4.metallurgy.barium,Barium item.gm4.metallurgy.baryte_lump,Baryte Lump item.gm4.metallurgy.bauxite_lump,Bauxite Lump item.gm4.metallurgy.mundane_band,Mundane Band item.gm4.metallurgy.obsidian_cast,Obsidian Cast item.gm4.metallurgy.shamir,Shamir item.gm4.metallurgy.thorianite_lump,Thorianite Lump item.gm4.metallurgy.thorium,Thorium item.gm4.shamir.arborenda,Arborenda Shamir item.gm4.shamir.defuse,Defuse Shamir item.gm4.shamir.ender_bolt,Ender Bolt Shamir item.gm4.shamir.forterra,Forterra Shamir item.gm4.shamir.gemini,Gemini Shamir item.gm4.shamir.hypexperia,Hypexperia Shamir item.gm4.shamir.moneo,Moneo Shamir item.gm4.shamir.musical,Musical Shamir item.gm4.shamir.sensus,Sensus Shamir item.gm4.shamir.tinker,Tinker Shamir item.gm4.slightly_damaged_obsidian,Slightly Damaged Obsidian item.gm4.slightly_overheated_obsidian,Slightly Overheated Obsidian text.gm4.metallurgy.aluminium,Aluminium text.gm4.metallurgy.barium,Barium text.gm4.metallurgy.contains,Contains text.gm4.metallurgy.thorium,Thorium item.gm4.shamir.vibro,Vibro Shamir text.gm4.metallurgy.copper,Copper item.gm4.metallurgy.malachite_lump,Malachite Lump item.gm4.shamir.infinitas,Infinitas Shamir item.gm4.metallurgy.curies_bismium,Curie's Bismium item.gm4.metallurgy.bismuth.red,B item.gm4.metallurgy.bismuth.orange,i item.gm4.metallurgy.bismuth.yellow,s item.gm4.metallurgy.bismuth.green,m item.gm4.metallurgy.bismuth.blue,u item.gm4.metallurgy.bismuth.purple,t item.gm4.metallurgy.bismuth.magenta,h item.gm4.metallurgy.bismuth_band.red,Bi item.gm4.metallurgy.bismuth_band.orange,sm item.gm4.metallurgy.bismuth_band.yellow,ut item.gm4.metallurgy.bismuth_band.green,"h " item.gm4.metallurgy.bismuth_band.blue,Ba item.gm4.metallurgy.bismuth_band.purple,nd item.gm4.metallurgy.bismuth_band.magenta,\u200c item.gm4.metallurgy.thorium_brass,Thorium Brass item.gm4.metallurgy.bismutite_lump,Bismutite Lump item.gm4.metallurgy.copper,Copper text.gm4.guidebook.module_desc.arborenda_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.arborenda_shamir.description,Arborenda boosts a single swing to be able to knock down an entire tree. text.gm4.guidebook.arborenda_shamir.usage,"The Arborenda Shamir is found on Barium Bands. It can be placed onto axes.\n\nWhen mining a log, the entire tree will also break, taking up durability of the axe for each log broken." text.gm4.guidebook.module_desc.defuse_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.defuse_shamir.description,Defuse prevents nearby Creepers from exploding. text.gm4.guidebook.defuse_shamir.usage,"The Defuse Shamir is found on Aluminium Bands. It can be placed onto armour.\n\nNearby creepers will become defused, and will never be able to explode." text.gm4.guidebook.module_desc.ender_bolt_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.ender_bolt_shamir.description,Ender Bolt creates a damaging wither chain when attacking a mob. text.gm4.guidebook.ender_bolt_shamir.usage,"The Ender Bolt Shamir is found on Thorium Bands. It can be placed onto swords and tridents.\n\nA mob hit will Ender Bolt will wither away, passing the effect to other nearby mobs." text.gm4.guidebook.module_desc.forterra_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.forterra_shamir.description,"Forterra causes extra raw metals, redstone, and amethyst to be found when mining stone." text.gm4.guidebook.forterra_shamir.usage,"The Forterra Shamir is found on Bismuth Bands. It can be placed onto pickaxes.\n\nWhen mining stone, raw copper, raw iron, raw gold, redstone, and amethyst shards will drop. Drop rates are height dependent." text.gm4.guidebook.module_desc.gemini_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.gemini_shamir.description,Gemini modifies breeding to always produce twins. text.gm4.guidebook.gemini_shamir.usage,The Gemini Shamir is found on Barimium Bands. It can be placed onto hoes.\n\nHolding the hoe in the offhand will cause any bred animals to produce identical twins. text.gm4.guidebook.module_desc.hypexperia_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.hypexperia_shamir.description,Hypexperia causes extra experience to drop from all sources of experience orbs. text.gm4.guidebook.hypexperia_shamir.usage,"The Hypexperia Shamir is found on Bismuth Bands. It can be placed onto tools, swords, and fishing rods.\n\nNearby experience orbs will double in value when the item is held." text.gm4.guidebook.module_desc.infinitas_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.infinitas_shamir.description,Infinitas items are infinite liquid sources. It also pulls mobs and items towards the user. text.gm4.guidebook.infinitas_shamir.usage,The Infinitas Shamir is found on Curie's Bismium Bands. It can be placed onto empty or filled buckets.\n\nInfinitas buckets can be used infinitely and will never get filled (if empty) or drained (if full). text.gm4.guidebook.infinitas_shamir.vacuum,Holding an empty infinitas bucket will attract mobs and items in an 11x11 area.\n\nMobs affected by infinitas will be on cooldown until the user moves away or deselects the bucket. text.gm4.guidebook.module_desc.metallurgy,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.metallurgy.description,"Custom abilities, called shamirs, can be added to tools and armour, like enchantments.\n\nShamirs are exclusive, meaning only one can be applied to an item at a time." text.gm4.guidebook.metallurgy.section.lump_obtaining,Obtaining Ore text.gm4.guidebook.metallurgy.lump_obtaining,"Blowing up stone-type blocks with tnt will drop metal ore lumps.\n\nEach of the four stone types (stone, granite, andesite, and diorite) drop a different metal lump." text.gm4.guidebook.metallurgy.section.casting,Casting text.gm4.guidebook.metallurgy.mould,A mould can be created by dropping 1 obsidian and 1 clay ball on a sand block.\n\nMoulds must be heated by placing lava on top of them. Overheating a mould causes it to smoke and break. text.gm4.guidebook.metallurgy.mould_1,"Without lava, the mould will cool over time and must be reheated to added metal.\n\nIf no metal is added to the cast before it completely cools down, the obsidian will drop, losing the clay ball." text.gm4.guidebook.metallurgy.adding_metal,Ore lumps can be dropped in one by one into a heated mould. 23 ore lumps must be added for a proper cast.\n\nAlloys can be made using a 17-6 ratio: Aluminium + Barium or Thorium + Bismuth. text.gm4.guidebook.metallurgy.recycling,"If a cast is dropped into the mould, it will return the obsidian and about half of its metal will recycled.\n\nPure metal bands supply 12 ore of their metal, while alloy metal bands supply 9 primary ore and 3 secondary ore." text.gm4.guidebook.metallurgy.cooling,"Once a mould completely cools down, a Shamir Band will form.\n\nIf the casting process was done incorrectly, a useless Mundane Band will be on the cast." text.gm4.guidebook.metallurgy.section.shamirs,Shamirs text.gm4.guidebook.metallurgy.metal_properties,"Each band type has a specific attribute.\n\nBismuth is creation, Thorium is destruction, and Curie's Bismium is equivalence." text.gm4.guidebook.metallurgy.metal_properties_1,"Alluminium is supression, Barium is amplification, and Barimium is modification." text.gm4.guidebook.metallurgy.smooshing,"To attach a shamir to an item, drop the cast and item on an anvil.\n\n'Smoosh' them together by powering a downwards facing piston placed two blocks above the anvil." text.gm4.guidebook.metallurgy.smooshing_1,"To detach a shamir, do the same 'smooshing' process after dropping the shamir-bearing item and one obsidian." text.gm4.guidebook.module_desc.moneo_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.moneo_shamir.description,Moneo slows mining and flying when durability is low. text.gm4.guidebook.moneo_shamir.usage,"The Moneo Shamir is found on Aluminium Bands. It can be placed onto tools, shears, and elytra.\n\nLow durability tools will cause mining fatigue, and low durability elytra will cause slowness and blindness." text.gm4.guidebook.module_desc.musical_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.musical_shamir.description,Musical modifies strength and speed based on consecutive mob kills. text.gm4.guidebook.musical_shamir.usage,"The Musical Shamir is found on Barimium Bands. It can be placed onto swords.\n\nWhen killing mobs, music is played and Slowness and Strength I are granted." text.gm4.guidebook.musical_shamir.usage_1,"After many kills, the music will become darker, and Speed and Strength III are granted instead." text.gm4.guidebook.module_desc.sensus_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.sensus_shamir.description,"Sensus enhances mining, by playing sounds from neaby ores." text.gm4.guidebook.sensus_shamir.usage,The Sensus Shamir is found on Barium Bands. It can be placed onto compasses.\n\nHolding the compass will play sounds from nearby ores in a 7x7x5 area centered at the user. text.gm4.guidebook.module_desc.tinker_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.tinker_shamir.description,Tinker causes items to be converted to their equivalent storage block form. text.gm4.guidebook.tinker_shamir.usage,"The Tinker Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes, shovels, hoes, and swords.\n\nHolding the tool will convert items into their block form, such as iron ingots to iron blocks." text.gm4.guidebook.tinker_shamir.usage_pickaxes,"Each tool tinkers a set of items, matching the tool.\n\nPickaxes will tinker emeralds, diamonds, redstone, coal, lapis, gold ingots, iron ingots, gold nuggets, and iron nuggets." text.gm4.guidebook.tinker_shamir.usage_other_tools,Shovels will tinker snow balls and clay balls.\n\nHoes will tinker melon slices and wheat.\n\nSwords will tinker slime balls. text.gm4.guidebook.module_desc.vibro_shamir,"Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them!" text.gm4.guidebook.vibro_shamir.description,Vibro grants high jumps and creates deadly shockwaves. text.gm4.guidebook.vibro_shamir.usage,"The Vibro Shamir is found on Thorium Bands. It can be placed onto boots.\n\nWhen sneaking, users who take fall damage will hurt mobs within a 6 block radius. Damage is based on distance from the user and the blocks between." text.gm4.guidebook.vibro_shamir.jump_boost,"Sneaking on the ground will allow the user to gain temporary jump boost. The level of jump boost is dependent on the sneak time.\n\nWhen using the Vibro Jump, the user will take damage when landing." ================================================ FILE: gm4_metallurgy/beet.yaml ================================================ id: gm4_metallurgy name: Metallurgy version: 1.8.X data_pack: load: . resource_pack: load: . pipeline: - shamir_model_template - gm4.plugins.extend.module - gm4.plugins.include.lib_lore meta: gm4: versioning: required: lib_lore: 1.4.0 schedule_loops: - main - tick website: description: Introduces 4 custom ores, 6 custom metals and a whole bunch of custom enchants to the game. Cast metal bands that hold magical properties called 'Shamirs' and upgrade your armour and tools with them! recommended: - gm4_resource_pack - gm4_audere_shamir - gm4_fulcio_shamir - gm4_iacio_shamir - gm4_lumos_shamir - gm4_orb_of_ankou - gm4_percurro_shamir - gm4_vecto_shamir notes: - Modifies the stone block loot table. May cause incompatibilities with Datapacks that also modify this loot table. search_keywords: - arborenda - defuse - forterra - gemini - hypexperia - infinitas - moneo - musical - sensus - tinker - vibro - shamir modrinth: project_id: raWyrHxi wiki: https://wiki.gm4.co/wiki/Metallurgy credits: Creators: - Sparks - SpecialBuilder32 - Bloo - BPR - SirSheepe Updated by: - Denniss - Misode - Modulorium - TheEpyonProject Textures by: - Memo Icon Design: - DuckJr ================================================ FILE: gm4_metallurgy/data/gm4/advancement/metallurgy_blast_ore.json ================================================ { "display": { "icon": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:gui/advancement/metallurgy_blast_ore"]}, "minecraft:profile": "$gm4_metallurgy:ore/aluminium" } }, "title": { "translate": "advancement.gm4.metallurgy.blast_ore.title", "fallback": "How Ad-ore-able" }, "description": { "translate": "advancement.gm4.metallurgy.blast_ore.description", "fallback": "Blast open some rock and find the metal within.", "color": "gray" } }, "parent": "gm4:root", "criteria": { "pickup_ore": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{item:\"ore\"}}" } } ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4/advancement/metallurgy_cast.json ================================================ { "display": { "icon": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:gui/advancement/metallurgy_cast"]}, "minecraft:profile": "$gm4_metallurgy:band/aluminium" } }, "title": { "translate": "advancement.gm4.metallurgy.cast.title", "fallback": "Firebender" }, "description": { "translate": "advancement.gm4.metallurgy.cast.description", "fallback": "Create a mould and add some metal.", "color": "gray" } }, "parent": "gm4:metallurgy_blast_ore", "criteria": { "metallurgy_cast": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_metallurgy/data/gm4/advancement/metallurgy_overheat_cast.json ================================================ { "display": { "icon": { "id": "minecraft:lava_bucket", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:gui/advancement/metallurgy_overheat_cast"]} } }, "title": { "translate": "advancement.gm4.metallurgy.overheat_cast.title", "fallback": "Blame Me for the Mess" }, "description": { "translate": "advancement.gm4.metallurgy.overheat_cast.description", "fallback": "Destroy a mould containing molten metal.", "color": "gray" }, "hidden": true }, "parent": "gm4:metallurgy_cast", "criteria": { "metallurgy_overheat_cast": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/active.mcfunction ================================================ # Grants a tag to players holding arborenda. This tag semms to be unused. # @s = player with the arborenda shamir in their hands # at @s # run from metallurgy:shamir_in_hand tag @s add gm4_has_arborenda scoreboard players set $arborenda_active gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'arborenda'}}] if items entity @s contents #gm4_arborenda_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/init_scoreboards.mcfunction ================================================ # @s = unspecified # at = unspecified # run from gm4_metallurgy:init scoreboard objectives add gm4_use_axe_net minecraft.used:minecraft.netherite_axe scoreboard objectives add gm4_use_axe_dia minecraft.used:minecraft.diamond_axe scoreboard objectives add gm4_use_axe_gol minecraft.used:minecraft.golden_axe scoreboard objectives add gm4_use_axe_iro minecraft.used:minecraft.iron_axe scoreboard objectives add gm4_use_axe_cop minecraft.used:minecraft.copper_axe scoreboard objectives add gm4_use_axe_sto minecraft.used:minecraft.stone_axe scoreboard objectives add gm4_use_axe_woo minecraft.used:minecraft.wooden_axe scoreboard objectives add gm4_arb_depth dummy scoreboard objectives add gm4_arb_data dummy scoreboard players set #1 gm4_arb_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/player/analyze_axe.mcfunction ================================================ # Calculates the speed of the axe used to break blocks. # @s = player that just used an axe with arborenda # at @s # run from gm4_arborenda:player/chop # safe axe nbt (also used to calculate unbreaking numbers in gm4_arborenda_shamir:player/modify_axe_durability) data modify storage gm4_arborenda_shamir:temp tool set from entity @s SelectedItem # set base material speed / breaking delay between block breaks execute if score @s gm4_use_axe_net matches 1.. run scoreboard players set $axe_delay gm4_arb_data 5 execute if score @s gm4_use_axe_dia matches 1.. run scoreboard players set $axe_delay gm4_arb_data 6 execute if score @s gm4_use_axe_gol matches 1.. run scoreboard players set $axe_delay gm4_arb_data 3 execute if score @s gm4_use_axe_iro matches 1.. run scoreboard players set $axe_delay gm4_arb_data 8 execute if score @s gm4_use_axe_cop matches 1.. run scoreboard players set $axe_delay gm4_arb_data 10 execute if score @s gm4_use_axe_sto matches 1.. run scoreboard players set $axe_delay gm4_arb_data 13 execute if score @s gm4_use_axe_woo matches 1.. run scoreboard players set $axe_delay gm4_arb_data 22 # efficiency bonus (simplified formula, does not match vanilla) execute store result score $efficiency_level gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components."minecraft:enchantments"."minecraft:efficiency" scoreboard players operation $axe_delay gm4_arb_data -= $efficiency_level gm4_arb_data # limit to min delay of 1 tick between block breaks scoreboard players operation $axe_delay gm4_arb_data > #1 gm4_arb_data # calculate max depth scoreboard players set $max_depth gm4_arb_data 32 scoreboard players operation $max_depth gm4_arb_data *= $axe_delay gm4_arb_data ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/player/check_for_axe.mcfunction ================================================ # Checks whether the player has used an arborenda axe. # @s = all players # at world spawn # run from gm4_metallurgy:tick execute if entity @s[scores={gm4_use_axe_net=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_dia=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_gol=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_cop=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_iro=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_sto=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop execute if entity @s[scores={gm4_use_axe_woo=1..},predicate=gm4_metallurgy:arborenda_active] at @s run function gm4_arborenda_shamir:player/chop scoreboard players reset @s gm4_use_axe_net scoreboard players reset @s gm4_use_axe_dia scoreboard players reset @s gm4_use_axe_gol scoreboard players reset @s gm4_use_axe_cop scoreboard players reset @s gm4_use_axe_iro scoreboard players reset @s gm4_use_axe_sto scoreboard players reset @s gm4_use_axe_woo ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/player/chop.mcfunction ================================================ # Starts arborenda chopping sequence. # @s = player that just used an axe with arborenda # at @s # run from gm4_arborenda:player/check_for_axe # place marker on first trunk block scoreboard players set $success gm4_arb_data 0 execute as @e[type=item,limit=1,distance=..5,sort=nearest,nbt={Age:0s}] at @s store success score $success gm4_arb_data \ if items entity @s container.* #gm4_arborenda_shamir:trunks align xyz run summon marker ~0.5 ~0.5 ~0.5 {Tags:[gm4_arborenda_trunk_source,gm4_arborenda_trunk,gm4_arborenda_init]} # identify axe (used for enchantment support) execute if score $success gm4_arb_data matches 1 run function gm4_arborenda_shamir:player/analyze_axe # identify tree scoreboard players set $chop_count gm4_arb_data -1 scoreboard players set $current_depth gm4_arb_data 0 execute if score $success gm4_arb_data matches 1 run function gm4_arborenda_shamir:trunk/next_depth # chop tree and use durability execute if score $chop_count gm4_arb_data matches 1.. run function gm4_arborenda_shamir:player/modify_axe_durability execute if score $chop_count gm4_arb_data matches 1.. run schedule function gm4_arborenda_shamir:trunk/destroy_sequenced 1t # kill first trunk marker (does not need to be processed by module, as it was already broken by the axe itself) kill @e[type=marker,tag=gm4_arborenda_trunk_source] # clear storage data remove storage gm4_arborenda_shamir:temp tool ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/player/modify_axe_durability.mcfunction ================================================ # Reduces the durability on an arborenda axe according to the amount of blocks broken. # @s = player that just used an axe with arborenda # at @s # run from gm4_arborenda:player/chop # get max damage - 1 for material type execute if score @s gm4_use_axe_net matches 1.. run scoreboard players set $max_damage gm4_arb_data 2030 execute if score @s gm4_use_axe_dia matches 1.. run scoreboard players set $max_damage gm4_arb_data 1560 execute if score @s gm4_use_axe_gol matches 1.. run scoreboard players set $max_damage gm4_arb_data 31 execute if score @s gm4_use_axe_iro matches 1.. run scoreboard players set $max_damage gm4_arb_data 249 execute if score @s gm4_use_axe_cop matches 1.. run scoreboard players set $max_damage gm4_arb_data 189 execute if score @s gm4_use_axe_sto matches 1.. run scoreboard players set $max_damage gm4_arb_data 130 execute if score @s gm4_use_axe_woo matches 1.. run scoreboard players set $max_damage gm4_arb_data 58 # get unbreaking level execute store result score $unbreaking_level gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $unbreaking_level gm4_arb_data 1 scoreboard players set $damage_chance gm4_arb_data 100 scoreboard players operation $damage_chance gm4_arb_data /= $unbreaking_level gm4_arb_data # calclulate and apply damage execute store result score $current_damage gm4_arb_data run data get storage gm4_arborenda_shamir:temp tool.components."minecraft:damage" execute store result score $incoming_damage gm4_arb_data run loot spawn ~ -4096 ~ loot gm4_arborenda_shamir:roll_binomial_distribution scoreboard players operation $current_damage gm4_arb_data += $incoming_damage gm4_arb_data scoreboard players operation $current_damage gm4_arb_data < $max_damage gm4_arb_data execute store result storage gm4_arborenda_shamir:temp damage int 1 run scoreboard players get $current_damage gm4_arb_data function gm4_arborenda_shamir:player/set_damage with storage gm4_arborenda_shamir:temp ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/player/set_damage.mcfunction ================================================ # run from player/modify_axe_durability $item modify entity @s weapon.mainhand {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium loot spawn ~ ~ ~ loot gm4_arborenda_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/check_depth.mcfunction ================================================ # Checks whether the trunk block should be destroyed. # @s = trunk marker with depth score # at @s # run from gm4_arborenda_shamir:trunk/destroy_sequenced # destroy this trunk if depth is negative execute if score @s gm4_arb_depth matches ..0 at @s run function gm4_arborenda_shamir:trunk/destroy_block # reschedule gm4_arborenda_shamir:trunk/destroy_sequenced schedule function gm4_arborenda_shamir:trunk/destroy_sequenced 1t ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/destroy_block.mcfunction ================================================ # Destroys the block at a trunks location and kills the marker. # @s = trunk marker # at @s # run from gm4_arborenda_shamir:trunk/check_depth execute if block ~ ~ ~ #gm4_arborenda_shamir:trunks run setblock ~ ~ ~ air destroy kill @s ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/destroy_sequenced.mcfunction ================================================ # Destroys marked trunk block one by one according to their depth score (in sequence). # @s = none # at world spawn # scheduled from gm4_arborenda_shamir:player/chop and self via gm4_arborenda_shamir:trunk/check_depth if trunk markers remain scoreboard players remove @e[type=marker,tag=gm4_arborenda_trunk] gm4_arb_depth 1 execute as @e[type=marker,tag=gm4_arborenda_trunk,scores={gm4_arb_depth=-2147483648..2147483647}] run function gm4_arborenda_shamir:trunk/check_depth ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark.mcfunction ================================================ # Checks for adjacent trunk blocks and summons a marker at their locations. # @s = trunk marker on the furthest depth (with gm4_arborenda_init tag) # at @s # run from gm4_arborenda_shamir:trunk/next_depth execute positioned ~ ~1 ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~-1 ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~1 ~ unless block ~ ~ ~ #gm4_arborenda_shamir:trunks run function gm4_arborenda_shamir:trunk/neighbors/mark_top execute if block ~ ~ ~ #gm4_arborenda_shamir:foliage positioned ~ ~-1 ~ run function gm4_arborenda_shamir:trunk/neighbors/mark_bottom scoreboard players add $chop_count gm4_arb_data 1 tag @s remove gm4_arborenda_init ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark_bottom.mcfunction ================================================ # Breaks fungus cap foliage and mangrove roots from the top to the bottom. # @s = trunk marker within foliage (#gm4_arborenda_shamir:foliage) # at @s positioned ~ ~-1 ~ # run from gm4_arborenda_shamir:trunk/neighbors/mark execute if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/neighbors/mark_top.mcfunction ================================================ # Checks for adjacent trunk blocks generated diagonally above a trunk. # @s = trunk marker on the furthest depth without a log above it # at @s positioned ~ ~1 ~ # run from gm4_arborenda_shamir:trunk/neighbors/mark execute positioned ~1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~ if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~ ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~-1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~-1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} execute positioned ~-1 ~ ~-1 if block ~ ~ ~ #gm4_arborenda_shamir:trunks unless block ~1 ~ ~ #gm4_arborenda_shamir:trunks unless block ~ ~ ~1 #gm4_arborenda_shamir:trunks unless entity @e[type=marker,tag=gm4_arborenda_trunk,distance=..0.5] run summon marker ~ ~ ~ {CustomName:"gm4_arborenda_trunk",Tags:[gm4_arborenda_trunk,gm4_arborenda_init]} ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/function/trunk/next_depth.mcfunction ================================================ # Recurses over connected trunk blocks to summon a marker at each. # @s = player that just used an axe with arborenda # at @s # run from gm4_arborenda:player/chop and self execute as @e[type=marker,tag=gm4_arborenda_init] at @s run function gm4_arborenda_shamir:trunk/neighbors/mark # finish the new trunk markers execute store result score @e[type=marker,tag=gm4_arborenda_init] gm4_arb_depth run scoreboard players operation $current_depth gm4_arb_data += $axe_delay gm4_arb_data execute if score $current_depth gm4_arb_data <= $max_depth gm4_arb_data if score $chop_count gm4_arb_data matches ..256 if entity @e[type=marker,tag=gm4_arborenda_init] run function gm4_arborenda_shamir:trunk/next_depth ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/guidebook/arborenda_shamir.json ================================================ { "id": "arborenda_shamir", "name": "Arborenda Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Arborenda_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_arborenda_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'arborenda'}}" } } ] } }, "obtain_arborenda_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'arborenda'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.arborenda_shamir.description", "fallback": "Arborenda boosts a single swing to be able to knock down an entire tree." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_arborenda_shamir", "obtain_arborenda_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.arborenda_shamir.usage", "fallback": "The Arborenda Shamir is found on Barium Bands. It can be placed onto axes.\n\nWhen mining a log, the entire tree will also break, taking up durability of the axe for each log broken." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/arborenda"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'arborenda'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.arborenda", "fallback": "Arborenda Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/loot_table/roll_binomial_distribution.json ================================================ { "pools": [ { "rolls": { "type": "minecraft:binomial", "n": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$chop_count" }, "score": "gm4_arb_data" }, "p": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$damage_chance" }, "score": "gm4_arb_data", "scale": 0.01 } }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone", "functions": [ { "function": "minecraft:set_count", "count": 0 } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/tags/block/foliage.json ================================================ { "values": [ "#minecraft:wart_blocks", "minecraft:mangrove_roots", "minecraft:shroomlight" ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/tags/block/trunks.json ================================================ { "values": [ "#gm4_arborenda_shamir:foliage", "minecraft:acacia_log", "minecraft:acacia_wood", "minecraft:birch_log", "minecraft:birch_wood", "minecraft:cherry_log", "minecraft:cherry_wood", "minecraft:crimson_stem", "minecraft:crimson_hyphae", "minecraft:dark_oak_log", "minecraft:dark_oak_wood", "minecraft:jungle_log", "minecraft:jungle_wood", "minecraft:mangrove_log", "minecraft:mangrove_wood", "minecraft:oak_log", "minecraft:oak_wood", "minecraft:pale_oak_log", "minecraft:pale_oak_wood", "minecraft:spruce_log", "minecraft:spruce_wood", "minecraft:warped_stem", "minecraft:warped_hyphae" ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/tags/item/trunks.json ================================================ { "values": [ "minecraft:acacia_log", "minecraft:acacia_wood", "minecraft:birch_log", "minecraft:birch_wood", "minecraft:cherry_log", "minecraft:cherry_wood", "minecraft:crimson_stem", "minecraft:crimson_hyphae", "minecraft:dark_oak_log", "minecraft:dark_oak_wood", "minecraft:jungle_log", "minecraft:jungle_wood", "minecraft:mangrove_log", "minecraft:mangrove_roots", "minecraft:mangrove_wood", "minecraft:oak_log", "minecraft:oak_wood", "minecraft:pale_oak_log", "minecraft:pale_oak_wood", "minecraft:spruce_log", "minecraft:spruce_wood", "minecraft:warped_stem", "minecraft:warped_hyphae" ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:axes" ] } ================================================ FILE: gm4_metallurgy/data/gm4_arborenda_shamir/test/chop.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~ ~1 dirt setblock ~1 ~1 ~1 birch_log setblock ~1 ~2 ~1 birch_log setblock ~1 ~3 ~1 birch_log setblock ~1 ~4 ~2 birch_log give @s minecraft:iron_axe[damage=10,custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"arborenda"}}] dummy @s mine ~1 ~2 ~1 await delay 2s assert block ~1 ~1 ~1 birch_log assert block ~1 ~2 ~1 air assert block ~1 ~3 ~1 air assert block ~1 ~4 ~2 air assert items entity @s weapon.mainhand *[damage=13] ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/function/active.mcfunction ================================================ #@s = at players wearing a defuse armor piece #run from active execute as @e[type=creeper,tag=!smithed.entity,distance=..6] run data merge entity @s {Fuse:32767s,ExplosionRadius:0} tag @e[type=bat,tag=!smithed.entity,distance=..6] add gm4_defused_bat ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'defuse'}}] if items entity @s contents #gm4_defuse_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium loot spawn ~ ~ ~ loot gm4_defuse_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/guidebook/defuse_shamir.json ================================================ { "id": "defuse_shamir", "name": "Defuse Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Defuse_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_defuse_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'defuse'}}" } } ] } }, "obtain_defuse_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.defuse_shamir.description", "fallback": "Defuse prevents nearby Creepers from exploding." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_defuse_shamir", "obtain_defuse_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.defuse_shamir.usage", "fallback": "The Defuse Shamir is found on Aluminium Bands. It can be placed onto armour.\n\nNearby creepers will become defused, and will never be able to explode." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:aluminium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/defuse"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'defuse'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.defuse", "fallback": "Defuse Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:foot_armor", "#minecraft:leg_armor", "#minecraft:chest_armor", "#minecraft:head_armor" ] } ================================================ FILE: gm4_metallurgy/data/gm4_defuse_shamir/test/creeper_defused.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 item replace entity @s armor.chest with iron_chestplate[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"defuse"}}] summon creeper ~1.5 ~1 ~2.5 await delay 5s assert entity @e[type=creeper] inside assert entity @s[nbt={Health:20f}] ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/advancement/join.json ================================================ { "criteria": { "join_world": { "trigger": "location" } }, "rewards": { "function": "gm4_ender_bolt_shamir:id/assign_player" } } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/advancement/use.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_hurt_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_ender_bolt_shamir:valid_items", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"ender_bolt\"}}" } } } } } ], "entity": [] } } }, "rewards": { "function": "gm4_ender_bolt_shamir:infection/start" } } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'ender_bolt'}}] if items entity @s contents #gm4_ender_bolt_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/id/assign_pet.mcfunction ================================================ # gives pets the ender bolt id of their owner # @s = a pat that has not yet received an ender bolt id # run from gm4_ender_bolt_shamir:infection/check_ignore_list execute store result score @s gm4_ender_bolt_own_id run data get entity @s Owner[3] ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/id/assign_player.mcfunction ================================================ # @s = player who joined for the first time # run from advancement gm4_ender_bolt_shamir:join execute store result score @s gm4_ender_bolt_own_id run data get entity @s UUID[3] ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/active.mcfunction ================================================ # manages the ender bolt infection on infected entities # @s = entitiy infected with ender bolt # at @s # run from gm4_metallurgy:main # manage infection scoreboard players remove @s gm4_bolt_time 1 execute if score @s gm4_bolt_time matches -40 run function gm4_ender_bolt_shamir:infection/end # ender bolt effects particle portal ~ ~ ~ .1 .5 .1 .8 10 execute if score @s gm4_bolt_time matches 1.. run function gm4_ender_bolt_shamir:infection/symptoms ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/check_ignore_list.mcfunction ================================================ # analyzes an entity that is about to be infected with ender bolt # @s = a living entity that is not an armor stand # at source of infection # run from infection/spread # store id of pet owner as own id for pets (in case they haven't been processed yet) execute unless score @s gm4_ender_bolt_own_id matches -2147483648..2147483647 if entity @s[type=#gm4_ender_bolt_shamir:pets] if data entity @s Owner run function gm4_ender_bolt_shamir:id/assign_pet # start infection execute if score $enable_pvp gm4_ender_bolt_foreign_id matches 0 unless score @s gm4_ender_bolt_own_id matches -2147483648..2147483647 run function gm4_ender_bolt_shamir:infection/infect execute if score $enable_pvp gm4_ender_bolt_foreign_id matches 1 unless score @s gm4_ender_bolt_own_id = $source gm4_ender_bolt_foreign_id run function gm4_ender_bolt_shamir:infection/infect ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/end.mcfunction ================================================ # ends the ender bolt infection on an entity # @s = entitiy infected with ender bolt, at end of infection # at @s # run from gm4_ender_bolt_shamir:infection/active scoreboard players reset @s gm4_bolt_time scoreboard players reset @s gm4_ender_bolt_foreign_id ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/infect.mcfunction ================================================ # starts ender bolt on an entity # @s = a living entity that is not an armor stand # at source of infection # run from infection/check_ignore_list # get and store origin id scoreboard players operation @s gm4_ender_bolt_foreign_id = $source gm4_ender_bolt_foreign_id # apply ender bolt scoreboard players set @s gm4_bolt_time 10 ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/spread.mcfunction ================================================ # spreads ender bolt to nearby entities # @s = varies, either player starting ender bolt or an infected entity # at @s # run from infection/start and infection/active # remember infection source id scoreboard players operation $source gm4_ender_bolt_foreign_id = @s gm4_ender_bolt_foreign_id # spread execute as @e[distance=..1.6,type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict] unless score @s gm4_bolt_time matches -40.. run function gm4_ender_bolt_shamir:infection/check_ignore_list ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/start.mcfunction ================================================ # starts ender bolt on nearby entities # @s = player using ender bolt (dealt damage) # at @s # run from advancement gm4_ender_bolt_shamir:use # revoke advancement advancement revoke @s only gm4_ender_bolt_shamir:use # spread scoreboard players operation @s gm4_ender_bolt_foreign_id = @s gm4_ender_bolt_own_id execute if entity @s[gamemode=!spectator] positioned ^ ^ ^2 run function gm4_ender_bolt_shamir:infection/spread ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/infection/symptoms.mcfunction ================================================ # applies ender bolt symptoms to infected entities # @s = entitiy infected with ender bolt # at @s # run from infection/active # additional particles and damage particle portal ~ ~ ~ .1 .5 .1 .8 10 effect give @s wither 2 0 true # spread function gm4_ender_bolt_shamir:infection/spread ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/thorium via #gm4_metallurgy:summon_band/thorium loot spawn ~ ~ ~ loot gm4_ender_bolt_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/guidebook/ender_bolt_shamir.json ================================================ { "id": "ender_bolt_shamir", "name": "Ender Bolt Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Ender_Bolt_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_ender_bolt_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'ender_bolt'}}" } } ] } }, "obtain_ender_bolt_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'ender_bolt'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.ender_bolt_shamir.description", "fallback": "Ender Bolt creates a damaging wither chain when attacking a mob." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_ender_bolt_shamir", "obtain_ender_bolt_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.ender_bolt_shamir.usage", "fallback": "The Ender Bolt Shamir is found on Thorium Bands. It can be placed onto swords and tridents.\n\nA mob hit will Ender Bolt will wither away, passing the effect to other nearby mobs." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:thorium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/ender_bolt"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'ender_bolt'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.ender_bolt", "fallback": "Ender Bolt Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/tags/entity_type/pets.json ================================================ { "values": [ "minecraft:cat", "minecraft:donkey", "minecraft:horse", "minecraft:llama", "minecraft:mule", "minecraft:nautilus", "minecraft:parrot", "minecraft:skeleton_horse", "minecraft:trader_llama", "minecraft:wolf", "minecraft:zombie_horse" ] } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:swords", "minecraft:mace", "minecraft:trident" ] } ================================================ FILE: gm4_metallurgy/data/gm4_ender_bolt_shamir/test/infect_and_spread.mcfunction ================================================ # @template gm4:test_platform # @dummy ~0.5 ~1 ~0.5 give @s iron_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"ender_bolt"}}] await delay 1s summon pig ~0.5 ~1 ~2.5 {NoAI:1b} dummy @s attack @e[type=pig,distance=..4,limit=1] await entity @e[type=pig,nbt={active_effects:[{id:"minecraft:wither"}]}] summon pig ~1.5 ~1 ~2.5 {NoAI:1b,Tags:[gm4_test_ender_bolt]} await entity @e[type=pig,tag=gm4_test_ender_bolt,nbt={active_effects:[{id:"minecraft:wither"}]}] ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'forterra'}}] if items entity @s contents #gm4_forterra_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth loot spawn ~ ~ ~ loot gm4_forterra_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/guidebook/forterra_shamir.json ================================================ { "id": "forterra_shamir", "name": "Forterra Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Forterra_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_forterra_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'forterra'}}" } } ] } }, "obtain_forterra_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.forterra_shamir.description", "fallback": "Forterra causes extra raw metals, redstone, and amethyst to be found when mining stone." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_forterra_shamir", "obtain_forterra_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.forterra_shamir.usage", "fallback": "The Forterra Shamir is found on Bismuth Bands. It can be placed onto pickaxes.\n\nWhen mining stone, raw copper, raw iron, raw gold, redstone, and amethyst shards will drop. Drop rates are height dependent." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bismuth_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/forterra"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'forterra'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.forterra", "fallback": "Forterra Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/loot_table/deepslate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:cobbled_deepslate" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 50, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 16 } } } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": -40 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 7 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 7 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 15, "max": 16 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:amethyst_shard", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:emerald", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } }, "biomes": "minecraft:windswept_hills" } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 16 } } } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_gold", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 32 } } } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:raw_gold", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -31, "max": 0 } } } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_copper", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -15, "max": 112 } } } } ] }, { "type": "minecraft:item", "weight": 70, "name": "minecraft:raw_copper", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 17, "max": 48 } } } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_iron", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 50, "name": "minecraft:raw_iron", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -15, "max": 31 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -7, "max": 128 } } } } ] }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 17, "max": 88 } } } } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 33, "max": 64 } } } } ] }, { "type": "minecraft:empty", "weight": 400 } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/loot_table/stone.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:cobblestone" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 50, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 16 } } } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": -40 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 7 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 7 }, "add": false }, { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 15, "max": 16 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:amethyst_shard", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:emerald", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } }, "biomes": "minecraft:windswept_hills" } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_gold", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 32 } } } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:raw_gold", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -31, "max": 0 } } } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_copper", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -15, "max": 112 } } } } ] }, { "type": "minecraft:item", "weight": 70, "name": "minecraft:raw_copper", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 17, "max": 48 } } } } ] }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:raw_iron", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -63, "max": 64 } } } } ] }, { "type": "minecraft:item", "weight": 50, "name": "minecraft:raw_iron", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -15, "max": 31 } } } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -7, "max": 128 } } } } ] }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 17, "max": 88 } } } } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:coal", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:uniform_bonus_count", "parameters": { "bonusMultiplier": 1.25 } } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 33, "max": 64 } } } } ] }, { "type": "minecraft:empty", "weight": 1000 } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_forterra_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:pickaxes" ] } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_allay.json ================================================ { "criteria": { "duplicate_allay": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "item": { "items": [ "minecraft:amethyst_shard" ] }, "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:allay" } } ] } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_allay" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_armadillo.json ================================================ { "criteria": { "breed_armadillos": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "armadillo" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_armadillo" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_axolotl.json ================================================ { "criteria": { "breed_axolotls": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "axolotl" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_axolotl" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_bee.json ================================================ { "criteria": { "breed_bees": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "bee" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_bee" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_cat.json ================================================ { "criteria": { "breed_cats": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "cat" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_cat" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_chicken.json ================================================ { "criteria": { "breed_chickens": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "chicken" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_chicken" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_cow.json ================================================ { "criteria": { "breed_cows": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "cow" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_cow" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_donkey.json ================================================ { "criteria": { "breed_donkeys": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "donkey" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_donkey" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_fox.json ================================================ { "criteria": { "breed_foxes": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "fox" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_fox" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_frog.json ================================================ { "criteria": { "breed_frogs": { "trigger": "minecraft:bred_animals", "conditions": { "parent": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:frog" } } ], "partner": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:frog" } } ] } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_frog" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_goat.json ================================================ { "criteria": { "breed_goats": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "goat" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_goat" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_hoglin.json ================================================ { "criteria": { "breed_hoglins": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "hoglin" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_hoglin" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_horse.json ================================================ { "criteria": { "breed_horses": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "horse" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_horse" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_llama.json ================================================ { "criteria": { "breed_llamas": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "llama" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_llama" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_mooshroom.json ================================================ { "criteria": { "breed_mooshrooms": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "mooshroom" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_mooshroom" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_mule.json ================================================ { "criteria": { "breed_mules": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "mule" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_mule" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_ocelot.json ================================================ { "criteria": { "breed_ocelots": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "ocelot" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_ocelot" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_panda.json ================================================ { "criteria": { "breed_pandas": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "panda" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_panda" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_pig.json ================================================ { "criteria": { "breed_pigs": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "pig" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_pig" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_rabbit.json ================================================ { "criteria": { "breed_rabbits": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "rabbit" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_rabbit" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_sheep.json ================================================ { "criteria": { "breed_sheep": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "sheep" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_sheep" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_strider.json ================================================ { "criteria": { "breed_striders": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "strider" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_strider" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_trader_llama.json ================================================ { "criteria": { "breed_trader_llamas": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "trader_llama" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_trader_llama" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_turtle.json ================================================ { "criteria": { "breed_turtles": { "trigger": "minecraft:bred_animals", "conditions": { "parent": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:turtle" } } ], "partner": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:turtle" } } ] } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_turtle" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/advancement/breed_wolf.json ================================================ { "criteria": { "breed_wolves": { "trigger": "minecraft:bred_animals", "conditions": { "child": { "type": "wolf" } } } }, "rewards": { "function": "gm4_gemini_shamir:breed/check_wolf" } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/find_baby.mcfunction ================================================ # finds recently gemini bred animals # scheduled from gm4_gemini_shamir:breed/check_* execute as @e[type=marker,tag=gm4_gemini_bred] at @s run function gm4_gemini_shamir:baby/pick_type ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/pick_type.mcfunction ================================================ # determine type # run from gm4_gemini_shamir:baby/find_baby execute if entity @s[tag=gm4_gemini_axolotl] as @e[type=axolotl,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_axolotl execute if entity @s[tag=gm4_gemini_cat] as @e[type=cat,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_cat execute if entity @s[tag=gm4_gemini_chicken] as @e[type=chicken,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_chicken execute if entity @s[tag=gm4_gemini_cow] as @e[type=cow,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_cow execute if entity @s[tag=gm4_gemini_donkey] as @e[type=donkey,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_donkey execute if entity @s[tag=gm4_gemini_fox] as @e[type=fox,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_fox execute if entity @s[tag=gm4_gemini_goat] as @e[type=goat,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_goat execute if entity @s[tag=gm4_gemini_horse] as @e[type=horse,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_horse execute if entity @s[tag=gm4_gemini_llama] as @e[type=llama,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_llama execute if entity @s[tag=gm4_gemini_mule] as @e[type=mule,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_mule execute if entity @s[tag=gm4_gemini_ocelot] as @e[type=ocelot,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_ocelot execute if entity @s[tag=gm4_gemini_panda] as @e[type=panda,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_panda execute if entity @s[tag=gm4_gemini_pig] as @e[type=pig,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_pig execute if entity @s[tag=gm4_gemini_rabbit] as @e[type=rabbit,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_rabbit execute if entity @s[tag=gm4_gemini_sheep] as @e[type=sheep,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_sheep execute if entity @s[tag=gm4_gemini_trader_llama] as @e[type=trader_llama,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_trader_llama execute if entity @s[tag=gm4_gemini_wolf] as @e[type=wolf,distance=..10,nbt={Age:-24000},limit=1,sort=nearest] at @s run function gm4_gemini_shamir:baby/spawn_wolf kill @s ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_axolotl.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred axolotl summon axolotl ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=axolotl,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant data modify entity @e[type=axolotl,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b tag @e[type=axolotl,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_cat.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred cat summon cat ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant data modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner data modify entity @e[type=cat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b tag @e[type=cat,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_chicken.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred chicken summon chicken ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=chicken,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant tag @e[type=chicken,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_cow.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred cow summon cow ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=cow,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant tag @e[type=cow,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_donkey.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred donkey summon donkey ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=donkey,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner tag @e[type=donkey,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_fox.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred fox summon fox ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=fox,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Trusted set from entity @s Trusted data modify entity @e[type=fox,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Type set from entity @s Type tag @e[type=fox,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_goat.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred goat summon goat ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=goat,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] IsScreamingGoat set from entity @s IsScreamingGoat tag @e[type=goat,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_horse.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred horse summon horse ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=horse,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant tag @e[type=horse,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_llama.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred llama summon llama ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=llama,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant tag @e[type=llama,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_mule.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred mule summon mule ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=mule,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner tag @e[type=mule,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_ocelot.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred ocelot summon ocelot ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=ocelot,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Trusting set from entity @s Trusting data modify entity @e[type=ocelot,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] PersistenceRequired set value 1b tag @e[type=ocelot,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_panda.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred panda summon panda ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=panda,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] MainGene set from entity @s MainGene data modify entity @e[type=panda,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] HiddenGene set from entity @s HiddenGene tag @e[type=panda,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_pig.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred pig summon pig ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=pig,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant tag @e[type=pig,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_rabbit.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred rabbit summon rabbit ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=rabbit,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] RabbitType set from entity @s RabbitType tag @e[type=rabbit,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_sheep.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred sheep summon sheep ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=sheep,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Color set from entity @s Color tag @e[type=sheep,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_trader_llama.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred trader llama summon trader_llama ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=trader_llama,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Variant set from entity @s Variant tag @e[type=trader_llama,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/baby/spawn_wolf.mcfunction ================================================ # run from gm4_gemini_shamir:baby/pick_type # @s = recently bred wolf summon wolf ~ ~ ~ {Tags:["gm4_gemini_baby"],Age:-23999} data modify entity @e[type=wolf,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] Owner set from entity @s Owner data modify entity @e[type=wolf,tag=gm4_gemini_baby,distance=..2,sort=nearest,limit=1] variant set from entity @s variant tag @e[type=wolf,tag=gm4_gemini_baby,sort=nearest,limit=1] remove gm4_gemini_baby ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_allay.mcfunction ================================================ # run from breed_allay.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=allay,distance=..10,limit=1,sort=nearest,nbt={DuplicationCooldown:6000L}] at @s run summon allay ~ ~ ~ {DuplicationCooldown:6000L} advancement revoke @s only gm4_gemini_shamir:breed_allay ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_armadillo.mcfunction ================================================ # run from breed_armadillo.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=armadillo,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon armadillo ~ ~ ~ {Age:-23999} advancement revoke @s only gm4_gemini_shamir:breed_armadillo ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_axolotl.mcfunction ================================================ # run from breed_axolotl.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=axolotl,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_axolotl"]} advancement revoke @s only gm4_gemini_shamir:breed_axolotl schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_bee.mcfunction ================================================ # run from breed_bee.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=bee,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon bee ~ ~ ~ {Age:-23999} advancement revoke @s only gm4_gemini_shamir:breed_bee ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_cat.mcfunction ================================================ # run from breed_cat.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=cat,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_cat"]} advancement revoke @s only gm4_gemini_shamir:breed_cat schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_chicken.mcfunction ================================================ # run from breed_chicken.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=chicken,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_chicken"]} advancement revoke @s only gm4_gemini_shamir:breed_chicken schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_cow.mcfunction ================================================ # run from breed_cow.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=cow,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_cow"]} advancement revoke @s only gm4_gemini_shamir:breed_cow schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_donkey.mcfunction ================================================ # run from breed_donkey.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=donkey,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_donkey"]} advancement revoke @s only gm4_gemini_shamir:breed_donkey schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_fox.mcfunction ================================================ # run from breed_fox.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=fox,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_fox"]} advancement revoke @s only gm4_gemini_shamir:breed_fox schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_frog.mcfunction ================================================ # run from breed_frog.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini run data modify entity @e[type=frog,distance=..10,limit=1,sort=nearest,nbt=!{Brain:{memories:{"minecraft:is_pregnant":{value:{}}}}}] Brain.memories.is_pregnant.value set value {} advancement revoke @s only gm4_gemini_shamir:breed_frog ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_goat.mcfunction ================================================ # run from breed_goat.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=goat,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_goat"]} advancement revoke @s only gm4_gemini_shamir:breed_goat schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_hoglin.mcfunction ================================================ # run from breed_hoglin.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=hoglin,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon hoglin ~ ~ ~ {Age:-23999} advancement revoke @s only gm4_gemini_shamir:breed_hoglin ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_horse.mcfunction ================================================ # run from breed_horse.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=horse,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_horse"]} advancement revoke @s only gm4_gemini_shamir:breed_horse schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_llama.mcfunction ================================================ # run from breed_llama.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=llama,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_llama"]} advancement revoke @s only gm4_gemini_shamir:breed_llama schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_mooshroom.mcfunction ================================================ # run from breed_mooshroom.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=mooshroom,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon mooshroom ~ ~ ~ {Age:-23999} advancement revoke @s only gm4_gemini_shamir:breed_mooshroom ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_ocelot.mcfunction ================================================ # run from breed_ocelot.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=ocelot,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_ocelot"]} advancement revoke @s only gm4_gemini_shamir:breed_ocelot schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_panda.mcfunction ================================================ # run from breed_panda.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=panda,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_panda"]} advancement revoke @s only gm4_gemini_shamir:breed_panda schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_pig.mcfunction ================================================ # run from breed_pig.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=pig,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_pig"]} advancement revoke @s only gm4_gemini_shamir:breed_pig schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_rabbit.mcfunction ================================================ # run from breed_rabbit.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=rabbit,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_rabbit"]} advancement revoke @s only gm4_gemini_shamir:breed_rabbit schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_sheep.mcfunction ================================================ # run from breed_sheep.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=sheep,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_sheep"]} advancement revoke @s only gm4_gemini_shamir:breed_sheep schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_strider.mcfunction ================================================ # run from breed_strider.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=strider,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon strider ~ ~ ~ {Age:-23999} advancement revoke @s only gm4_gemini_shamir:breed_strider ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_trader_llama.mcfunction ================================================ # run from breed_trader_llama.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=trader_llama,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_llama"]} advancement revoke @s only gm4_gemini_shamir:breed_trader_llama schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_turtle.mcfunction ================================================ # run from breed_turtle.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini run data modify entity @e[type=turtle,distance=..10,limit=1,sort=nearest,nbt=!{has_egg:1b}] has_egg set value 1b advancement revoke @s only gm4_gemini_shamir:breed_turtle ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/breed/check_wolf.mcfunction ================================================ # run from breed_wolf.json (advancement) # @s = player who has bred a mob execute if predicate gm4_gemini_shamir:holding_gemini as @e[type=wolf,distance=..10,limit=1,sort=nearest,nbt=!{InLove:0}] at @s run summon marker ~ ~ ~ {Tags:["gm4_gemini_bred","gm4_gemini_wolf"]} advancement revoke @s only gm4_gemini_shamir:breed_wolf schedule function gm4_gemini_shamir:baby/find_baby 1t ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'gemini'}}] if items entity @s contents #gm4_gemini_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/main.mcfunction ================================================ # @s = player with gemini in off or mainhand # run from metallurgy main tag @s add gm4_has_gemini ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium loot spawn ~ ~ ~ loot gm4_gemini_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/guidebook/gemini_shamir.json ================================================ { "id": "gemini_shamir", "name": "Gemini Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Gemini_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_gemini_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'gemini'}}" } } ] } }, "obtain_gemini_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'gemini'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.gemini_shamir.description", "fallback": "Gemini modifies breeding to always produce twins." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_gemini_shamir", "obtain_gemini_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.gemini_shamir.usage", "fallback": "The Gemini Shamir is found on Barimium Bands. It can be placed onto hoes.\n\nHolding the hoe in the offhand will cause any bred animals to produce identical twins." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barimium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/gemini"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'gemini'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.gemini", "fallback": "Gemini Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/predicate/holding_gemini.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'gemini'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/predicate/test_is_baby.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_baby": true } } } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:hoes" ] } ================================================ FILE: gm4_metallurgy/data/gm4_gemini_shamir/test/breed.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 summon pig ~0.5 ~1 ~2.5 {Tags:[gm4_test_gemini_1]} summon pig ~2.5 ~1 ~2.5 {Tags:[gm4_test_gemini_2]} item replace entity @s weapon.offhand with minecraft:iron_hoe[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"gemini"}}] item replace entity @s weapon.mainhand with minecraft:carrot 2 dummy @s use entity @e[type=pig,distance=..4,tag=gm4_test_gemini_1,limit=1] dummy @s use entity @e[type=pig,distance=..4,tag=gm4_test_gemini_2,limit=1] await delay 4s scoreboard objectives add gm4_test dummy execute store result score $babies gm4_test if entity @e[type=pig,distance=..4,predicate=gm4_gemini_shamir:test_is_baby] assert score $babies gm4_test matches 2 ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/function/active.mcfunction ================================================ # @s = player with the hypexperia shamir in their hands # run from metallurgy:shamir_in_hand tag @s add gm4_has_hypexperia scoreboard players set $hypexperia_active gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'hypexperia'}}] if items entity @s contents #gm4_hypexperia_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/function/double_xp.mcfunction ================================================ # run from hypexperia:find_orbs # @s = experience orb that hasn't been doubled yet execute store result score xp_value gm4_ml_data run data get entity @s Value 1 execute if score xp_value gm4_ml_data matches 1..12 store result entity @s Value short 2 run scoreboard players get xp_value gm4_ml_data execute if score xp_value gm4_ml_data matches 1..12 run particle totem_of_undying ~ ~0.2 ~ 0 0 0 0.2 10 execute if score xp_value gm4_ml_data matches 1..12 run playsound block.note_block.xylophone player @a ~ ~ ~ 0.1 0.3 tag @s add gm4_doubled_xp ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/function/find_orbs.mcfunction ================================================ # run from metallurgy:tick # @s = none execute as @a[tag=gm4_has_hypexperia] at @s as @e[type=experience_orb,distance=..5,tag=!gm4_doubled_xp,limit=1,sort=nearest] at @s run function gm4_hypexperia_shamir:double_xp ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth loot spawn ~ ~ ~ loot gm4_hypexperia_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/guidebook/hypexperia_shamir.json ================================================ { "id": "hypexperia_shamir", "name": "Hypexperia Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Hypexperia_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_hypexperia_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'hypexperia'}}" } } ] } }, "obtain_hypexperia_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.hypexperia_shamir.description", "fallback": "Hypexperia causes extra experience to drop from all sources of experience orbs." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_hypexperia_shamir", "obtain_hypexperia_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.hypexperia_shamir.usage", "fallback": "The Hypexperia Shamir is found on Bismuth Bands. It can be placed onto tools, swords, and fishing rods.\n\nNearby experience orbs will double in value when the item is held." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bismuth_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/hypexperia"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'hypexperia'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.hypexperia", "fallback": "Hypexperia Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_hypexperia_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:axes", "#minecraft:pickaxes", "#minecraft:shovels", "#minecraft:swords", "minecraft:fishing_rod", "minecraft:mace", "minecraft:trident" ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/bucket_inventory_change.json ================================================ { "criteria": { "bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } ] } }, "lava_bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:lava_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } ] } }, "milk_bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:milk_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } ] } }, "powder_snow_bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:powder_snow_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } ] } }, "water_bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:water_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } ] } } }, "requirements": [ [ "bucket", "lava_bucket", "milk_bucket", "powder_snow_bucket", "water_bucket" ] ], "rewards": { "function": "gm4_infinitas_shamir:add_tags" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/empty/pickup_mainhand.json ================================================ { "criteria": { "cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}", "equipment": { "mainhand": { "items": [ "minecraft:lava_bucket", "minecraft:powder_snow_bucket", "minecraft:water_bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:cauldron" ] } } } ] } }, "lava_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}" } } ], "item": { "items": [ "minecraft:lava_bucket" ] } } }, "milk_bucket": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}" } } ], "item": { "items": [ "minecraft:bucket" ] } } }, "powder_snow_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}" } } ], "item": { "items": [ "minecraft:powder_snow_bucket" ] } } }, "water_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}" } } ], "item": { "items": [ "minecraft:water_bucket" ] } } } }, "requirements": [ [ "cauldron", "lava_bucket", "milk_bucket", "powder_snow_bucket", "water_bucket" ] ], "rewards": { "function": "gm4_infinitas_shamir:empty/pickup" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/empty/pickup_offhand.json ================================================ { "criteria": { "cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}", "equipment": { "offhand": { "items": [ "minecraft:lava_bucket", "minecraft:powder_snow_bucket", "minecraft:water_bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:cauldron" ] } } } ] } }, "lava_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}" } } ], "item": { "items": [ "minecraft:lava_bucket" ] } } }, "milk_bucket": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}" } } ], "item": { "items": [ "minecraft:bucket" ] } } }, "powder_snow_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}" } } ], "item": { "items": [ "minecraft:powder_snow_bucket" ] } } }, "water_bucket": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}" } } ], "item": { "items": [ "minecraft:water_bucket" ] } } } }, "requirements": [ [ "cauldron", "lava_bucket", "milk_bucket", "powder_snow_bucket", "water_bucket" ] ], "rewards": { "function": "gm4_infinitas_shamir:empty/pickup" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/lava/place_mainhand.json ================================================ { "criteria": { "place_lava": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$lava_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:lava_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lava" ] } } } ] } }, "use_on_cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$lava_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_lava\"]}", "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lava_cauldron" ] } } } ] } } }, "requirements": [ [ "place_lava", "use_on_cauldron" ] ], "rewards": { "function": "gm4_infinitas_shamir:lava/place" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/lava/place_offhand.json ================================================ { "criteria": { "place_lava": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$lava_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:lava_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lava" ] } } } ] } }, "use_on_cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$lava_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_lava\"]}", "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lava_cauldron" ] } } } ] } } }, "requirements": [ [ "place_lava", "use_on_cauldron" ] ], "rewards": { "function": "gm4_infinitas_shamir:lava/place" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/milk/drink_mainhand.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:consume_item", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:milk_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ] } } }, "rewards": { "function": "gm4_infinitas_shamir:milk/drink" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/milk/drink_offhand.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:consume_item", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:milk_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ] } } }, "rewards": { "function": "gm4_infinitas_shamir:milk/drink" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/powder_snow/place_mainhand.json ================================================ { "criteria": { "place_powder_snow": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$powder_snow_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:powder_snow_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:powder_snow" ] } } } ] } }, "use_on_cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$powder_snow_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_powder_snow\"]}", "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:powder_snow_cauldron" ] } } } ] } } }, "requirements": [ [ "place_powder_snow", "use_on_cauldron" ] ], "rewards": { "function": "gm4_infinitas_shamir:powder_snow/place" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/powder_snow/place_offhand.json ================================================ { "criteria": { "place_powder_snow": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$powder_snow_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:powder_snow_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:powder_snow" ] } } } ] } }, "use_on_cauldron": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$powder_snow_infinitas" }, "score": "gm4_ml_data" }, "range": 1 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_powder_snow\"]}", "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:powder_snow_cauldron" ] } } } ] } } }, "requirements": [ [ "place_powder_snow", "use_on_cauldron" ] ], "rewards": { "function": "gm4_infinitas_shamir:powder_snow/place" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/rejoin_bucket_check.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_infinitas_leave": { "min": 1, "max": 99999 } } } ] } } }, "rewards": { "function": "gm4_infinitas_shamir:rejoin_check" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/water/pickup_fish.json ================================================ { "criteria": { "pickup_fish_mainhand": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_water\"]}" } } ], "item": { "items": [ "minecraft:axolotl_bucket", "minecraft:cod_bucket", "minecraft:pufferfish_bucket", "minecraft:salmon_bucket", "minecraft:tadpole_bucket", "minecraft:tropical_fish_bucket" ] } } }, "pickup_fish_offhand": { "trigger": "minecraft:filled_bucket", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_water\"]}" } } ], "item": { "items": [ "minecraft:axolotl_bucket", "minecraft:cod_bucket", "minecraft:pufferfish_bucket", "minecraft:salmon_bucket", "minecraft:tadpole_bucket", "minecraft:tropical_fish_bucket" ] } } } }, "requirements": [ [ "pickup_fish_mainhand", "pickup_fish_offhand" ] ], "rewards": { "function": "gm4_infinitas_shamir:water/pickup" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/advancement/water/place.json ================================================ { "criteria": { "place_water_mainhand": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:water_bucket", "minecraft:axolotl_bucket", "minecraft:cod_bucket", "minecraft:pufferfish_bucket", "minecraft:salmon_bucket", "minecraft:tadpole_bucket", "minecraft:tropical_fish_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:flower_pot", "minecraft:water" ] } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:waterloggable" } } }, { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:the_nether" } } ] } ] } }, "use_on_cauldron_mainhand": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_water\"]}", "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:water_cauldron" ] } } } ] } }, "place_water_offhand": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "creative" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket", "minecraft:axolotl_bucket", "minecraft:cod_bucket", "minecraft:pufferfish_bucket", "minecraft:salmon_bucket", "minecraft:tadpole_bucket", "minecraft:tropical_fish_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:\"infinitas\"}}" } } } } } ], "location": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:flower_pot", "minecraft:water" ] } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:waterloggable" } } }, { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:the_nether" } } ] } ] } }, "use_on_cauldron_offhand": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_water\"]}", "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:water_cauldron" ] } } } ] } } }, "requirements": [ [ "place_water_mainhand", "use_on_cauldron_mainhand", "place_water_offhand", "use_on_cauldron_offhand" ] ], "rewards": { "function": "gm4_infinitas_shamir:water/place" } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/active.mcfunction ================================================ # @s = player holding an Infinitas bucket in one or the other hand # run from metallurgy:shamir_in_hand execute as @e[tag=gm4_no_infinitas] at @s unless entity @a[predicate=gm4_metallurgy:infinitas_active,distance=..10] run tag @s remove gm4_no_infinitas execute positioned ~-5 ~-1 ~-5 run tag @e[type=!player,tag=!smithed.strict,dx=10,dy=2,dz=10,nbt={DeathTime:0s}] add gm4_in_infinitas execute positioned ~-5 ~-1 ~-5 run tag @e[type=item,dx=10,dy=2,dz=10] add gm4_in_infinitas tag @e[tag=gm4_in_infinitas,distance=..1.2] add gm4_no_infinitas tag @e[tag=gm4_no_infinitas] remove gm4_in_infinitas #sounds execute if entity @e[tag=gm4_in_infinitas,distance=6..8] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .1 execute if entity @e[tag=gm4_in_infinitas,distance=3..5.99] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .3 execute if entity @e[tag=gm4_in_infinitas,distance=..2.99] run playsound ui.toast.out player @a[distance=..10] ~ ~ ~ .5 .7 ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/add_tags.mcfunction ================================================ # Updates player tags when an Infinitas Bucket enters their inventory # @s = player, earned Infinitas bucket_inventory_change advancement # at @s # run from gm4_infinitas_shamir:rejoin_check, or advancement, gm4_infinitas_shamir:bucket_inventory_change tag @s add gm4_has_infinitas tag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={bucket=true}}] add gm4_has_empty_infinitas tag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={lava_bucket=true}}] add gm4_has_lava_infinitas tag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={powder_snow_bucket=true}}] add gm4_has_powder_snow_infinitas tag @s[advancements={gm4_infinitas_shamir:bucket_inventory_change={water_bucket=true}}] add gm4_has_water_infinitas advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change function gm4_infinitas_shamir:clock/active ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents #gm4_infinitas_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 execute if score $lava_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents minecraft:lava_bucket run scoreboard players set valid_item gm4_ml_data 1 execute if score $powder_snow_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'infinitas'}}] if items entity @s contents minecraft:powder_snow_bucket run scoreboard players set valid_item gm4_ml_data 1 # updates Spiraculum shamirs to Infinitas execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents #gm4_infinitas_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 execute if score $lava_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents minecraft:lava_bucket run scoreboard players set valid_item gm4_ml_data 1 execute if score $powder_snow_infinitas gm4_ml_data matches 1 if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'spiraculum'}}] if items entity @s contents minecraft:powder_snow_bucket run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/clock/active.mcfunction ================================================ # Initially run as player who earned bucket_inventory_change advancement # run from gm4_infinitas_shamir:add_tags or scheduled from self execute as @a[tag=gm4_has_infinitas] run function gm4_infinitas_shamir:clock/inventory_check execute if entity @a[tag=gm4_has_infinitas,limit=1] run schedule function gm4_infinitas_shamir:clock/active 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/clock/inventory_check.mcfunction ================================================ # Checks if the player has an empty or Infinitas Water Bucket in their inventory # @s = player with tag, gm4_has_infinitas # run from gm4_infinitas_shamir:clock/active execute if entity @s[tag=gm4_has_empty_infinitas] run function gm4_infinitas_shamir:empty/check_inventory execute if score $lava_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_has_lava_infinitas] run function gm4_infinitas_shamir:lava/check_inventory execute if score $powder_snow_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_has_powder_snow_infinitas] run function gm4_infinitas_shamir:powder_snow/check_inventory execute if entity @s[tag=gm4_has_water_infinitas] run function gm4_infinitas_shamir:water/check_inventory ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/debug/clear.mcfunction ================================================ # for testing purposes, revoke everything and apply some tags to reset inventory # at @s # run manually advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change advancement revoke @s only gm4_infinitas_shamir:rejoin_bucket_check advancement revoke @s only gm4_infinitas_shamir:empty/pickup_mainhand advancement revoke @s only gm4_infinitas_shamir:empty/pickup_offhand advancement revoke @s only gm4_infinitas_shamir:lava/place_mainhand advancement revoke @s only gm4_infinitas_shamir:lava/place_offhand advancement revoke @s only gm4_infinitas_shamir:milk/drink_mainhand advancement revoke @s only gm4_infinitas_shamir:milk/drink_offhand advancement revoke @s only gm4_infinitas_shamir:powder_snow/place_mainhand advancement revoke @s only gm4_infinitas_shamir:powder_snow/place_offhand advancement revoke @s only gm4_infinitas_shamir:water/pickup_fish advancement revoke @s only gm4_infinitas_shamir:water/place scoreboard players reset @s gm4_infinitas_leave scoreboard players reset @s gm4_infinitas_success_check tag @s remove gm4_infinitas_delay_replace_empty tag @s remove gm4_infinitas_delay_replace_fish tag @s remove gm4_infinitas_delay_replace_milk tag @s remove gm4_infinitas_delay_replace_powder_snow tag @s remove gm4_infinitas_delay_replace_water tag @s add gm4_has_empty_infinitas execute if score $lava_infinitas gm4_ml_data matches 1 run tag @s add gm4_has_lava_infinitas execute if score $powder_snow_infinitas gm4_ml_data matches 1 run tag @s add gm4_has_powder_snow_infinitas tag @s add gm4_has_water_infinitas function gm4_infinitas_shamir:clock/inventory_check ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/call.mcfunction ================================================ # Checks player tags with Infinitas, to properly replace their item # scheduled 1t after using an Infinitas Bucket execute as @a[tag=gm4_infinitas_delay_replace] at @s run function gm4_infinitas_shamir:delayed_replace/check_tag ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/check_tag.mcfunction ================================================ # Checks which delay replace tag the player has # @s = player # at @s # run from gm4_infinitas_shamir:delayed_replace/call execute if entity @s[tag=gm4_infinitas_delay_replace_empty] run function gm4_infinitas_shamir:delayed_replace/empty execute if entity @s[tag=gm4_infinitas_delay_replace_fish] run function gm4_infinitas_shamir:delayed_replace/fish execute if score $lava_infinitas gm4_ml_data matches 1 if entity @s[tag=gm4_infinitas_delay_replace_lava] run function gm4_infinitas_shamir:delayed_replace/lava execute if entity @s[tag=gm4_infinitas_delay_replace_milk] run function gm4_infinitas_shamir:delayed_replace/milk execute if entity @s[tag=gm4_infinitas_delay_replace_powder_snow] run function gm4_infinitas_shamir:delayed_replace/powder_snow execute if entity @s[tag=gm4_infinitas_delay_replace_water] run function gm4_infinitas_shamir:delayed_replace/water scoreboard players reset @s gm4_infinitas_success_check ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/empty.mcfunction ================================================ # Checks which hand slot player used to pickup liquid # @s = player now holding filled bucket, previously holding Infinitas Empty Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:empty/pickup_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/empty] weapon.mainhand with bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:empty/pickup_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/empty] weapon.offhand with bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir # clean up advancement revoke @s only gm4_infinitas_shamir:empty/pickup_mainhand advancement revoke @s only gm4_infinitas_shamir:empty/pickup_offhand tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_empty ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish/mainhand_check.mcfunction ================================================ # Checks which fish was picked up # @s = player holding Water Infinitas in mainhand # at @s # run from gm4_infinitas_shamir:delayed_replace/fish execute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/axolotl] weapon.mainhand with axolotl_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/cod] weapon.mainhand with cod_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/pufferfish] weapon.mainhand with pufferfish_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/salmon] weapon.mainhand with salmon_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/tadpole] weapon.mainhand with tadpole_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/pickup/tropical_fish] weapon.mainhand with tropical_fish_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish/offhand_check.mcfunction ================================================ # Checks which fish was picked up # @s = player holding Water Infinitas in offhand # at @s # run from gm4_infinitas_shamir:delayed_replace/fish execute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/axolotl] weapon.offhand with axolotl_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/cod] weapon.offhand with cod_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/pufferfish] weapon.offhand with pufferfish_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/salmon] weapon.offhand with salmon_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/tadpole] weapon.offhand with tadpole_bucket execute unless score @s gm4_infinitas_success_check matches 1 store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/pickup/tropical_fish] weapon.offhand with tropical_fish_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/fish.mcfunction ================================================ # Checks which hand slot player used to pickup a fish # @s = player holding fish bucket, previously holding Infinitas Water Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag scoreboard players reset @s gm4_infinitas_success_check data modify storage gm4_infinitas_shamir:bucket fish_data set from entity @s SelectedItem.components # TODO 1.20.5: restore fish data execute if entity @s[advancements={gm4_infinitas_shamir:water/pickup_fish={pickup_fish_mainhand=true}}] run function gm4_infinitas_shamir:delayed_replace/fish/mainhand_check execute if entity @s[advancements={gm4_infinitas_shamir:water/pickup_fish={pickup_fish_offhand=true}}] run function gm4_infinitas_shamir:delayed_replace/fish/offhand_check # clean up advancement revoke @s only gm4_infinitas_shamir:water/pickup_fish data remove storage gm4_infinitas_shamir:bucket fish_data tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_fish ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/lava.mcfunction ================================================ # Checks which hand slot player used to place lava # @s = player holding lava bucket, previously holding Infinitas Lava Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:lava/place_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with lava_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:lava/place_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with lava_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir # clean up advancement revoke @s only gm4_infinitas_shamir:lava/place_mainhand advancement revoke @s only gm4_infinitas_shamir:lava/place_offhand tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_lava ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/milk.mcfunction ================================================ # Checks which hand slot player used to drink milk # @s = player holding milk bucket, previously holding Infinitas Milk Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:milk/drink_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with milk_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:milk/drink_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with milk_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir # clean up advancement revoke @s only gm4_infinitas_shamir:milk/drink_mainhand advancement revoke @s only gm4_infinitas_shamir:milk/drink_offhand tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_milk ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/powder_snow.mcfunction ================================================ # Checks which hand slot player used to place powder snow # @s = player holding powder snow bucket, previously holding Infinitas Powder Snow Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:powder_snow/place_mainhand=true},predicate=gm4_infinitas_shamir:mainhand/after/use_bucket] weapon.mainhand with powder_snow_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir execute store success score @s gm4_infinitas_success_check run item replace entity @s[advancements={gm4_infinitas_shamir:powder_snow/place_offhand=true},predicate=gm4_infinitas_shamir:offhand/after/use_bucket] weapon.offhand with powder_snow_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir # clean up advancement revoke @s only gm4_infinitas_shamir:powder_snow/place_mainhand advancement revoke @s only gm4_infinitas_shamir:powder_snow/place_offhand tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_powder_snow ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/delayed_replace/water.mcfunction ================================================ # Checks which hand slot player used to place water # @s = player holding water bucket, previously holding Infinitas Water Bucket # at @s # run from gm4_infinitas_shamir:delayed_replace/check_tag execute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:mainhand/after/water,predicate=gm4_infinitas_shamir:mainhand/after/water_advancement] weapon.mainhand with water_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.mainhand gm4_infinitas_shamir:restore_shamir execute store success score @s gm4_infinitas_success_check run item replace entity @s[predicate=gm4_infinitas_shamir:offhand/after/water,predicate=gm4_infinitas_shamir:offhand/after/water_advancement] weapon.offhand with water_bucket execute if score @s gm4_infinitas_success_check matches 1 run item modify entity @s weapon.offhand gm4_infinitas_shamir:restore_shamir # clean up advancement revoke @s only gm4_infinitas_shamir:water/place tag @s remove gm4_infinitas_delay_replace tag @s remove gm4_infinitas_delay_replace_water ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/check_holding.mcfunction ================================================ # Checks which hand player is holding an Infinitas Empty Bucket # @s = player with Infinitas Empty Bucket in their inventory # run from gm4_infinitas_shamir:empty/check_inventory tag @s add gm4_has_empty_infinitas tag @s[predicate=gm4_infinitas_shamir:mainhand/holding/empty] add gm4_infinitas_mainhand_empty tag @s[predicate=gm4_infinitas_shamir:offhand/holding/empty] add gm4_infinitas_offhand_empty ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/check_inventory.mcfunction ================================================ # Checks player's inventory for an Infinitas Empty Bucket # @s = player with tag, gm4_has_empty_infinitas # run from gm4_infinitas_shamir:clock/inventory_check tag @s remove gm4_has_empty_infinitas tag @s remove gm4_infinitas_mainhand_empty tag @s remove gm4_infinitas_offhand_empty scoreboard players reset @s gm4_infinitas_empty_held execute store result score @s gm4_infinitas_empty_held run clear @s bucket[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] 0 execute if score @s gm4_infinitas_empty_held matches 1.. run function gm4_infinitas_shamir:empty/check_holding execute unless score @s gm4_infinitas_empty_held matches 1.. run function gm4_infinitas_shamir:empty/remove_tag ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/pickup.mcfunction ================================================ # Player picking up a liquid using Infinitas Empty Bucket # @s = player using an Infinitas Empty Bucket # at @s # run from advancement, gm4_infinitas_shamir:empty/pickup_(mainhand or offhand) tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_empty schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/empty/remove_tag.mcfunction ================================================ # Player no longer possessing any Infinitas Empty Buckets # @s = player # at @s # run from gm4_infinitas_shamir:empty/check_inventory tag @s remove gm4_has_empty_infinitas tag @s[tag=!gm4_has_lava_infinitas,tag=!gm4_has_powder_snow_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change bucket ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/check_holding.mcfunction ================================================ # Checks which hand player is holding an Infinitas Lava Bucket # @s = player with Infinitas Lava Bucket in their inventory # run from gm4_infinitas_shamir:lava/check_inventory tag @s add gm4_has_lava_infinitas tag @s[predicate=gm4_infinitas_shamir:mainhand/holding/lava] add gm4_infinitas_mainhand_lava tag @s[predicate=gm4_infinitas_shamir:offhand/holding/lava] add gm4_infinitas_offhand_lava ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/check_inventory.mcfunction ================================================ # Checks player's inventory for an Infinitas Lava Bucket # @s = player with tag, gm4_has_lava_infinitas # run from gm4_infinitas_shamir:clock/inventory_check tag @s remove gm4_has_lava_infinitas tag @s remove gm4_infinitas_mainhand_lava tag @s remove gm4_infinitas_offhand_lava scoreboard players reset @s gm4_infinitas_lava_held execute store result score @s gm4_infinitas_lava_held run clear @s lava_bucket[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] 0 execute if score @s gm4_infinitas_lava_held matches 1.. run function gm4_infinitas_shamir:lava/check_holding execute unless score @s gm4_infinitas_lava_held matches 1.. run function gm4_infinitas_shamir:lava/remove_tag ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/place.mcfunction ================================================ # Player placing lava using Infinitas Lava Bucket # @s = player using an Infinitas Lava Bucket # at @s # run from advancement, gm4_infinitas_shamir:lava/place_(mainhand or offhand) tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_lava schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/lava/remove_tag.mcfunction ================================================ # Player no longer possessing any Infinitas Lava Buckets # @s = player # at @s # run from gm4_infinitas_shamir:lava/check_inventory tag @s remove gm4_has_lava_infinitas tag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_powder_snow_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change lava_bucket ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/make_unstackable.mcfunction ================================================ # Makes the bucket unstackable # @s = item to receive the shamir # @e[tag=gm4_ml_source] = shamir item # called from #gm4_metallurgy:apply_band item modify entity @s contents gm4_infinitas_shamir:make_unstackable ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/milk/drink.mcfunction ================================================ # Player drinking milk using Infinitas Milk Bucket # @s = player drinking an Infinitas Milk Bucket # at @s # run from advancement, gm4_infinitas_shamir:milk/drink_(mainhand or offhand) tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_milk schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/check_holding.mcfunction ================================================ # Checks which hand player is holding an Infinitas Powder Snow Bucket # @s = player with Infinitas Powder Snow Bucket in their inventory # run from gm4_infinitas_shamir:powder_snow/check_inventory tag @s add gm4_has_powder_snow_infinitas tag @s[predicate=gm4_infinitas_shamir:mainhand/holding/powder_snow] add gm4_infinitas_mainhand_powder_snow tag @s[predicate=gm4_infinitas_shamir:offhand/holding/powder_snow] add gm4_infinitas_offhand_powder_snow ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/check_inventory.mcfunction ================================================ # Checks player's inventory for an Infinitas Powder snow Bucket # @s = player with tag, gm4_has_powder_snow_infinitas # run from gm4_infinitas_shamir:clock/inventory_check tag @s remove gm4_has_powder_snow_infinitas tag @s remove gm4_infinitas_mainhand_powder_snow tag @s remove gm4_infinitas_offhand_powder_snow scoreboard players reset @s gm4_infinitas_powder_snow_held execute store result score @s gm4_infinitas_powder_snow_held run clear @s powder_snow_bucket[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] 0 execute if score @s gm4_infinitas_powder_snow_held matches 1.. run function gm4_infinitas_shamir:powder_snow/check_holding execute unless score @s gm4_infinitas_powder_snow_held matches 1.. run function gm4_infinitas_shamir:powder_snow/remove_tag ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/place.mcfunction ================================================ # Player placing powder snow using Infinitas Powder Snow Bucket # @s = player using an Infinitas Powder Snow Bucket # at @s # run from advancement, gm4_infinitas_shamir:powder_snow/place_(mainhand or offhand) tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_powder_snow schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/powder_snow/remove_tag.mcfunction ================================================ # Player no longer possessing any Infinitas Powder Snow Buckets # @s = player # at @s # run from gm4_infinitas_shamir:powder_snow/check_inventory tag @s remove gm4_has_powder_snow_infinitas tag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_lava_infinitas,tag=!gm4_has_water_infinitas] remove gm4_has_infinitas advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change powder_snow_bucket ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/rejoin_check.mcfunction ================================================ # Forces a player to do an Infinitas tag check # @s = player rejoining world # at @s # run from advancement, gm4_infinitas_shamir:rejoin_bucket_check advancement revoke @s only gm4_infinitas_shamir:rejoin_bucket_check scoreboard players reset @s gm4_infinitas_leave function gm4_infinitas_shamir:add_tags ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/spiral.mcfunction ================================================ # run from metallurgy:tick # @s = players holding an Infinitas bucket execute positioned ~ ~-1 ~1 as @e[tag=gm4_in_infinitas,dx=5,dy=2,dz=4] run data merge entity @s {Motion:[-0.9d,0.0d,-0.1d]} execute positioned ~-1 ~-1 ~ as @e[tag=gm4_in_infinitas,dx=-4,dy=2,dz=5] run data merge entity @s {Motion:[0.1d,0.0d,-0.9d]} execute positioned ~ ~-1 ~-1 as @e[tag=gm4_in_infinitas,dx=-5,dy=2,dz=-4] run data merge entity @s {Motion:[0.9d,0.0d,0.1d]} execute positioned ~1 ~-1 ~ as @e[tag=gm4_in_infinitas,dx=4,dy=2,dz=-5] run data merge entity @s {Motion:[-0.1d,0.0d,0.9d]} ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/curies_bismium via #gm4_metallurgy:summon_band/curies_bismium loot spawn ~ ~ ~ loot gm4_infinitas_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/water/check_holding.mcfunction ================================================ # Checks which hand player is holding an Infinitas Water Bucket # @s = player with Infinitas Water Bucket in their inventory # run from gm4_infinitas_shamir:water/check_inventory tag @s add gm4_has_water_infinitas tag @s[predicate=gm4_infinitas_shamir:mainhand/holding/water] add gm4_infinitas_mainhand_water tag @s[predicate=gm4_infinitas_shamir:offhand/holding/water] add gm4_infinitas_offhand_water ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/water/check_inventory.mcfunction ================================================ # Checks player's inventory for an Infinitas Water Bucket # @s = player with tag, gm4_has_water_infinitas # run from gm4_infinitas_shamir:clock/inventory_check tag @s remove gm4_has_water_infinitas tag @s remove gm4_infinitas_mainhand_water tag @s remove gm4_infinitas_offhand_water scoreboard players reset @s gm4_infinitas_water_held execute store result score @s gm4_infinitas_water_held run clear @s water_bucket[custom_data={gm4_metallurgy:{active_shamir:"infinitas"}}] 0 execute if score @s gm4_infinitas_water_held matches 1.. run function gm4_infinitas_shamir:water/check_holding execute unless score @s gm4_infinitas_water_held matches 1.. run function gm4_infinitas_shamir:water/remove_tag ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/water/pickup.mcfunction ================================================ # Player picking up a fish using Infinitas Water Bucket # @s = player using an Infinitas Water Bucket # at @s # run from advancement, gm4_infinitas_shamir:water/pickup_(mainhand or offhand) tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_fish schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/water/place.mcfunction ================================================ # Player placing water using Infinitas Water Bucket # @s = player using an Infinitas Water Bucket # at @s # run from advancement, gm4_infinitas_shamir:water/place tag @s add gm4_infinitas_delay_replace tag @s add gm4_infinitas_delay_replace_water schedule function gm4_infinitas_shamir:delayed_replace/call 1t ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/function/water/remove_tag.mcfunction ================================================ # Player no longer possessing any Infinitas Water Buckets # @s = player # at @s # run from gm4_infinitas_shamir:water/check_inventory tag @s remove gm4_has_water_infinitas tag @s[tag=!gm4_has_empty_infinitas,tag=!gm4_has_lava_infinitas,tag=!gm4_has_powder_snow_infinitas] remove gm4_has_infinitas advancement revoke @s only gm4_infinitas_shamir:bucket_inventory_change water_bucket ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/guidebook/infinitas_shamir.json ================================================ { "id": "infinitas_shamir", "name": "Infinitas Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Infinitas_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_infinitas_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'infinitas'}}" } } ] } }, "obtain_infinitas_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.infinitas_shamir.description", "fallback": "Infinitas items are infinite liquid sources. It also pulls mobs and items towards the user." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_infinitas_shamir", "obtain_infinitas_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.infinitas_shamir.usage", "fallback": "The Infinitas Shamir is found on Curie's Bismium Bands. It can be placed onto empty or filled buckets.\n\nInfinitas buckets can be used infinitely and will never get filled (if empty) or drained (if full)." } ], [ { "translate": "text.gm4.guidebook.infinitas_shamir.vacuum", "fallback": "Holding an empty infinitas bucket will attract mobs and items in an 11x11 area.\n\nMobs affected by infinitas will be on cooldown until the user moves away or deselects the bucket." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/item_modifier/make_unstackable.json ================================================ { "function": "minecraft:set_components", "components": { "minecraft:max_stack_size": 1 } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/item_modifier/restore_shamir.json ================================================ [ { "function": "minecraft:set_components", "components": { "minecraft:max_stack_size": 1, "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/infinitas"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,custom_model_data:3420100,metal:{type:'curies_bismium'},active_shamir:'infinitas'}}" }, { "function": "minecraft:set_lore", "mode": "replace_all", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.curies_bismium", "fallback": "Curie's Bismium" } ], "italic": false, "color": "#467A1B" }, { "translate": "item.gm4.shamir.infinitas", "fallback": "Infinitas Shamir", "italic": false, "color": "gray" } ] } ] ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:curies_bismium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/infinitas"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'infinitas'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.infinitas", "fallback": "Infinitas Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/empty.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:lava_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:milk_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:powder_snow_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:water_bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/axolotl.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:axolotl_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/cod.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:cod_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/pufferfish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:pufferfish_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/salmon.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:salmon_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/tadpole.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:tadpole_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/pickup/tropical_fish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:tropical_fish_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/use_bucket.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/water.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:water_bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/after/water_advancement.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_infinitas_shamir:water/place": { "place_water_mainhand": true } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_infinitas_shamir:water/place": { "use_on_cauldron_mainhand": true } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/empty.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/lava.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:lava_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/powder_snow.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:powder_snow_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/mainhand/holding/water.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:water_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/empty.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:lava_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:milk_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:powder_snow_bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/fish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/axolotl.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:axolotl_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/cod.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:cod_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/pufferfish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:pufferfish_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/salmon.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:salmon_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/tadpole.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:tadpole_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/pickup/tropical_fish.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:tropical_fish_bucket" ] } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/use_bucket.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/water.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket" ] } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/after/water_advancement.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_infinitas_shamir:water/place": { "place_water_offhand": true } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_infinitas_shamir:water/place": { "use_on_cauldron_offhand": true } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/empty.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/lava.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:lava_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/powder_snow.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:powder_snow_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/predicate/offhand/holding/water.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'infinitas'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items.json ================================================ { "values": [ "minecraft:axolotl_bucket", "minecraft:bucket", "minecraft:cod_bucket", "minecraft:milk_bucket", "minecraft:pufferfish_bucket", "minecraft:salmon_bucket", "minecraft:tadpole_bucket", "minecraft:tropical_fish_bucket", "minecraft:water_bucket" ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items_lava.json ================================================ { "values": [ "minecraft:lava_bucket" ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/tags/item/valid_items_powder_snow.json ================================================ { "values": [ "minecraft:powder_snow_bucket" ] } ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/test/check_empty_pickup.mcfunction ================================================ # @template gm4_metallurgy:test_smooshing # @dummy ~0.5 ~4 ~1.5 # @skyaccess execute at @s run tp @s ~ ~ ~ 270 50 summon item ~1.5 ~2.5 ~1.5 {Item:{id:"minecraft:bucket"}} loot spawn ~1.5 ~2.5 ~1.5 loot gm4_infinitas_shamir:band await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..6] contents minecraft:obsidian # equip smooshed infinitas bucket execute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tag @s add gm4_test_infinitas_bucket item replace entity @s weapon.mainhand from entity @e[type=item,tag=gm4_test_infinitas_bucket,distance=..6,limit=1] contents await items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] setblock ~1 ~4 ~1 water dummy @s use item await delay 2t assert items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] ================================================ FILE: gm4_metallurgy/data/gm4_infinitas_shamir/test/check_unsmoosh_after_use.mcfunction ================================================ # @template gm4_metallurgy:test_smooshing # @dummy ~0.5 ~4 ~1.5 # repeat steps from check_empty_pickup execute at @s run tp @s ~ ~ ~ 270 50 summon item ~1.5 ~2.5 ~1.5 {Item:{id:"minecraft:bucket"}} loot spawn ~1.5 ~2.5 ~1.5 loot gm4_infinitas_shamir:band await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..6] contents minecraft:obsidian execute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tag @s add gm4_test_infinitas_bucket item replace entity @s weapon.mainhand from entity @e[type=item,tag=gm4_test_infinitas_bucket,distance=..6,limit=1] contents await items entity @s weapon.mainhand *[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] setblock ~1 ~4 ~1 water dummy @s use item await delay 2t # below is unsmoosh dummy @s drop execute as @e[type=item,distance=..6] if items entity @s contents minecraft:bucket run tp @s ~1.5 ~2.5 ~1.5 await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..6] contents minecraft:player_head[custom_data~{gm4_metallurgy:{stored_shamir:"infinitas"}}] execute as @e[type=item,distance=..6] if items entity @s contents minecraft:player_head unless data entity @s Item.components."minecraft:custom_data".gm4_metallurgy.stored_shamir run fail "Unsmooshed shamir did not properly transfer shamir to cast" ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_aluminium.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal scoreboard players operation @s gm4_ml_ore_al += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} execute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:"minecraft:andesite"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9 particle minecraft:block{block_state:"minecraft:pink_terracotta"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"aluminium"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_barimium.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal # add primary metal scoreboard players operation @s gm4_ml_ore_al += $metal_amount gm4_ml_data # add secondary metal execute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1] scoreboard players operation @s gm4_ml_ore_ba += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} # visuals particle minecraft:block{block_state:"minecraft:dead_fire_coral_block"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"barimium"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_barium.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize #add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal scoreboard players operation @s gm4_ml_ore_ba += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} execute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:"minecraft:granite"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9 particle minecraft:block{block_state:"minecraft:white_concrete_powder"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"barium"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_bismuth.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal scoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} execute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:"minecraft:stone"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9 particle minecraft:block{block_state:"minecraft:melon"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"bismuth"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_copper.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize #add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal scoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} execute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:"minecraft:stone"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9 particle minecraft:block{block_state:"minecraft:weathered_copper"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"copper"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_curies_bismium.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal # add primary metal scoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data # add secondary metal execute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1] scoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} # visuals particle minecraft:block{block_state:"minecraft:lime_concrete_powder"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"curies_bismium"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_thorium.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal scoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} execute unless score $is_obsidian_cast gm4_ml_data matches 1.. run particle minecraft:block{block_state:"minecraft:diorite"} ~.45 ~0.1 ~.65 .1 .1 .1 0 9 particle minecraft:block{block_state:"minecraft:dead_fire_coral_block"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"thorium"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/add_thorium_brass.mcfunction ================================================ # @s = sand ring that needs to accept a metal # run from initialize # add score to sand ring tag @s add gm4_contains_metal item modify entity @s armor.head gm4_metallurgy:mould/hot_metal # add primary metal scoreboard players operation @s gm4_ml_ore_th += $metal_amount gm4_ml_data # add secondary metal execute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[1] scoreboard players operation @s gm4_ml_ore_bi += $metal_amount gm4_ml_data execute if score $is_obsidian_cast gm4_ml_data matches 1.. run summon item ~.45 ~0.1 ~.65 {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]},"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} # visuals particle minecraft:block{block_state:"minecraft:lime_concrete_powder"} ~.45 ~0.1 ~.65 .1 .1 .1 0 2 playsound item.bucket.empty_lava block @a[distance=..8] ~ ~ ~ .25 1.5 advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_cast kill @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,limit=1,predicate=gm4_metallurgy:on_ground,nbt={Item:{count:1,components:{"minecraft:custom_data":{gm4_metallurgy:{metal:{type:"thorium_brass"}}}}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/add_metal/initialize.mcfunction ================================================ # @s = armor_stand mould entity # runs from sustain_mould # determine ore type and primary metal amount data modify storage gm4_metallurgy:temp/item/ore gm4_metallurgy set from entity @e[type=item,tag=gm4_ml_in_animation,dx=0,dz=0,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,limit=1] Item.components."minecraft:custom_data".gm4_metallurgy execute store result score $metal_amount gm4_ml_data run data get storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal.amount[0] execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy{item:"obsidian_cast"} run scoreboard players set $is_obsidian_cast gm4_ml_data 1 # store recasted shamir id execute if score $is_obsidian_cast gm4_ml_data matches 1 run data modify entity @s equipment.feet.components."minecraft:custom_data".gm4_metallurgy set from storage gm4_metallurgy:temp/item/ore gm4_metallurgy # absorb ore item execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"aluminium"} run function gm4_metallurgy:casting/add_metal/add_aluminium execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"barimium"} run function gm4_metallurgy:casting/add_metal/add_barimium execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"barium"} run function gm4_metallurgy:casting/add_metal/add_barium execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"bismuth"} run function gm4_metallurgy:casting/add_metal/add_bismuth execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"copper"} run function gm4_metallurgy:casting/add_metal/add_copper execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"thorium"} run function gm4_metallurgy:casting/add_metal/add_thorium execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"curies_bismium"} run function gm4_metallurgy:casting/add_metal/add_curies_bismium execute if data storage gm4_metallurgy:temp/item/ore gm4_metallurgy.metal{type:"thorium_brass"} run function gm4_metallurgy:casting/add_metal/add_thorium_brass # reset storage and scoreboard values scoreboard players reset $metal_amount gm4_ml_data scoreboard players reset $is_obsidian_cast gm4_ml_data data remove storage gm4_metallurgy:temp/item/ore gm4_metallurgy # make all ores on top jump execute as @e[type=item,tag=!gm4_ml_in_animation,dx=0,dz=0,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,limit=1] run data merge entity @s {Motion:[0.0,0.35,0.0],PickupDelay:30,Tags:["gm4_ml_in_animation"]} ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/create_mould.mcfunction ================================================ # @s = obsidian block with count of 1 on top of sand next to a clay ball with a count of 1 # run from main summon armor_stand ~.45 ~-1.150 ~.65 {CustomName:"gm4_sand_ring",Tags:["gm4_sand_ring","gm4_new_sand_ring"],equipment:{feet:{id:"minecraft:stick",count:1},head:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:block/mould/cool_empty"]},"minecraft:profile":"$mould/cool_empty"}}},Silent:1b,Invulnerable:1b,Marker:1b,Invisible:1b,NoGravity:1b,Small:1b,HasVisualFire:1b} scoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_al 0 scoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_ba 0 scoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_bi 0 scoreboard players add @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_ore_th 0 scoreboard players set @e[type=armor_stand,tag=gm4_new_sand_ring] gm4_ml_heat 30 tag @e[type=armor_stand,tag=gm4_new_sand_ring] remove gm4_new_sand_ring kill @e[type=item,limit=1,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_clay_ball,predicate=gm4_metallurgy:on_ground] kill @e[type=item,limit=1,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_obsidian,predicate=gm4_metallurgy:on_ground] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/destroy_mould.mcfunction ================================================ # decides in which way the mould should be destroyed depending on temperature and metal content # @s = moulds that need destroying # at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand) # run from sustain_mould # check for metal values in mold, drop corresponding items # mould contains no metal execute if score @s gm4_ml_heat matches ..89 if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run summon item ~ ~ ~ {Item:{id:"minecraft:obsidian",count:1,components:{"minecraft:lore":[{"translate":"item.gm4.slightly_damaged_obsidian","fallback":"Slightly Damaged Obsidian","color":"dark_gray"}]}}} # set mould with metal in it execute if score @s gm4_ml_heat matches ..49 unless entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/set_mould # heated mould is broken with metal in it execute if score @s gm4_ml_heat matches 50..89 unless entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/overheat_mould # mould exceeds heat capacity execute if score @s gm4_ml_heat matches 90.. run function gm4_metallurgy:casting/overheat_mould # kill mould playsound item.hoe.till block @a ~ ~ ~ .25 .9 tp ~ -2050 ~ kill @s ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/finish_band.mcfunction ================================================ # @s = mould requesting a band # run from any function in casting/summon_band tag @e[type=item,distance=..0.1,predicate=gm4_metallurgy:has_shamir,nbt={Age:0s}] add gm4_ml_band # kill the band that matches the recasted band execute store success score $has_recasted_band gm4_ml_data run data modify storage gm4_metallurgy:temp/item/cast stored_shamir set from entity @s equipment.feet.components."minecraft:custom_data".gm4_metallurgy.stored_shamir execute if score $has_recasted_band gm4_ml_data matches 1 as @e[type=item,tag=gm4_ml_band] run function gm4_metallurgy:casting/prevent_duplicate_recast data remove storage gm4_metallurgy:temp/item/cast recasted_shamir data remove storage gm4_metallurgy:temp/item/cast stored_shamir #select a random item and kill others tag @e[type=item,tag=gm4_ml_band,sort=random,limit=1] add gm4_ml_selected_band kill @e[type=item,tag=!gm4_ml_selected_band,tag=gm4_ml_band] scoreboard players set $band_applied gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/overheat_mould.mcfunction ================================================ # creates lava & fire in place of a destroyed mould when broken whilst still hot # @s = moulds that need to explode in fire and Death # at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand) # run from destroy_mould setblock ~ ~-1 ~ lava[level=1] summon item ~ ~ ~ {Item:{id:"minecraft:magma_block",count:1,components:{"minecraft:lore":[{"translate":"item.gm4.slightly_overheated_obsidian","fallback":"Slightly Overheated Obsidian","italic":false}]}},Motion:[0.0,0.2,0.0]} particle large_smoke ~ ~ ~ 0.2 0.2 0.2 0.05 20 playsound block.fire.extinguish block @a ~ ~ ~ .25 .9 fill ~1 ~1 ~1 ~-1 ~-1 ~-1 fire replace air advancement grant @a[distance=..5,gamemode=!spectator] only gm4:metallurgy_overheat_cast ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/prevent_duplicate_recast.mcfunction ================================================ # @s = new obsidian cast that was created by a recasted band # run from any function in casting/finish_band data modify storage gm4_metallurgy:temp/item/cast recasted_shamir set from storage gm4_metallurgy:temp/item/cast stored_shamir execute store result score $different_shamir gm4_ml_data run data modify storage gm4_metallurgy:temp/item/cast recasted_shamir set from entity @s Item.components."minecraft:custom_data".gm4_metallurgy.stored_shamir execute unless score $different_shamir gm4_ml_data matches 1 run kill @s ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/set_mould.mcfunction ================================================ # summons a shamir for a destroyed mould which contained a proper recipe # @s = moulds that needs a band # at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand) # run from destroy_mould # initialise fake players scoreboard players set $band_applied gm4_ml_data 0 # check metal values execute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=23,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/aluminium execute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=23,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/barium execute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=17,gm4_ml_ore_ba=6,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/barimium execute if entity @s[scores={gm4_ml_ore_bi=23,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=0}] run function gm4_metallurgy:casting/summon_band/bismuth execute if entity @s[scores={gm4_ml_ore_bi=0,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=23}] run function gm4_metallurgy:casting/summon_band/thorium execute if entity @s[scores={gm4_ml_ore_bi=6,gm4_ml_ore_al=0,gm4_ml_ore_ba=0,gm4_ml_ore_th=17}] run function gm4_metallurgy:casting/summon_band/curies_bismium # apply broken band if all other bands fail execute if score $band_applied gm4_ml_data matches 0 run summon item ~ ~ ~ {Item:{id:"minecraft:player_head",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_metallurgy:item/mundane_band"]},"minecraft:profile":"$band/mundane","minecraft:item_name":{"translate":"item.gm4.metallurgy.obsidian_cast","fallback":"Obsidian Cast"},"minecraft:lore":[{"italic":false,"color":"gray","translate":"item.gm4.metallurgy.mundane_band","fallback":"Mundane Band"}]}}} # spawn xp if band was applied execute if score $band_applied gm4_ml_data matches 1 if entity @p[distance=..4,gamemode=!spectator] run summon experience_orb ~ ~ ~ {Value:37s} ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/aluminium.mcfunction ================================================ # @s = mould requesting a aluminium band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/aluminium #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/barimium.mcfunction ================================================ # @s = mould requesting a barimium band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/barimium #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/barium.mcfunction ================================================ # @s = mould requesting a barium band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/barium #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/bismuth.mcfunction ================================================ # @s = mould requesting a bismuth band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/bismuth #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/curies_bismium.mcfunction ================================================ # @s = mould requesting a curies_bismium band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/curies_bismium #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/summon_band/thorium.mcfunction ================================================ # @s = mould requesting a thorium band # run from set_mould #call expansions to summon their bands function #gm4_metallurgy:summon_band/thorium #select a random shamir and finish the band creation function gm4_metallurgy:casting/finish_band ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/casting/sustain_mould.mcfunction ================================================ # maintains active moulds # @s = armor_stand moulds # at @s positioned ~ ~1.23 ~ (at the x-z location of the mould, just above the surface of the sand) # run from main # manage heat scoreboard players remove @s gm4_ml_heat 1 execute if block ~ ~ ~ lava run scoreboard players add @s gm4_ml_heat 3 # kill moulds that left their sand block execute if score @s gm4_ml_heat matches 1..89 unless block ~ ~-1 ~ #minecraft:sand run function gm4_metallurgy:casting/destroy_mould execute unless score @s gm4_ml_heat matches 1..89 run function gm4_metallurgy:casting/destroy_mould # add metals if player desires to do so execute if score @s gm4_ml_heat matches 50..89 align xyz if entity @e[type=item,predicate=gm4_metallurgy:is_castable,predicate=gm4_metallurgy:on_ground,dx=0,dy=0,dz=0] run function gm4_metallurgy:casting/add_metal/initialize # hot ring without metal execute if score @s[tag=!gm4_contains_metal] gm4_ml_heat matches 50..51 run item modify entity @s armor.head gm4_metallurgy:mould/hot_empty # hot ring with metal execute if score @s[tag=gm4_contains_metal] gm4_ml_heat matches 50..51 run item modify entity @s armor.head gm4_metallurgy:mould/hot_metal # cool (I'm way too awesome!) ring without metals execute if score @s[tag=!gm4_contains_metal] gm4_ml_heat matches 48..49 run item modify entity @s armor.head gm4_metallurgy:mould/cool_empty # cool ring with metal execute if score @s[tag=gm4_contains_metal] gm4_ml_heat matches 48..49 run item modify entity @s armor.head gm4_metallurgy:mould/cool_metal execute if score @s gm4_ml_heat matches 56.. run particle lava ~ ~ ~ 0 0 0 0.005 1 execute if score @s gm4_ml_heat matches 80.. run particle large_smoke ~ ~ ~ 0 0 0 0.05 6 ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/init.mcfunction ================================================ scoreboard objectives add gm4_ml_data dummy scoreboard objectives add gm4_ml_heat dummy scoreboard objectives add gm4_ml_ore_al dummy scoreboard objectives add gm4_ml_ore_ba dummy scoreboard objectives add gm4_ml_ore_bi dummy scoreboard objectives add gm4_ml_ore_th dummy #arborenda function gm4_arborenda_shamir:init_scoreboards #declare gm4_arborenda_shamir:temp #ender_bolt scoreboard objectives add gm4_bolt_time dummy scoreboard objectives add gm4_ender_bolt_own_id dummy scoreboard objectives add gm4_ender_bolt_foreign_id dummy execute unless score $enable_pvp gm4_ender_bolt_foreign_id matches 0..1 run scoreboard players set $enable_pvp gm4_ender_bolt_foreign_id 1 #infinitas scoreboard objectives add gm4_infinitas_empty_held dummy scoreboard objectives add gm4_infinitas_lava_held dummy scoreboard objectives add gm4_infinitas_powder_snow_held dummy scoreboard objectives add gm4_infinitas_water_held dummy scoreboard objectives add gm4_infinitas_leave minecraft.custom:leave_game scoreboard objectives add gm4_infinitas_success_check dummy scoreboard players add $lava_infinitas gm4_ml_data 0 scoreboard players add $powder_snow_infinitas gm4_ml_data 0 #musical scoreboard objectives add gm4_note_collect totalKillCount scoreboard objectives add gm4_note_time dummy #sensus scoreboard players set $current_sensus_layer gm4_ml_data 0 #vibro scoreboard objectives add gm4_vibro_fall minecraft.custom:minecraft.fall_one_cm scoreboard objectives add gm4_vibro_hurt minecraft.custom:minecraft.damage_taken scoreboard objectives add gm4_vibro_absorb minecraft.custom:minecraft.damage_absorbed scoreboard objectives add gm4_vibro_shock dummy scoreboard objectives add gm4_vibro_sneak dummy scoreboard players set #shock_multiplier gm4_vibro_shock 20 scoreboard players set #100 gm4_vibro_shock 100 execute unless score metallurgy gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Metallurgy"} execute unless score metallurgy gm4_earliest_version < metallurgy gm4_modules run scoreboard players operation metallurgy gm4_earliest_version = metallurgy gm4_modules scoreboard players set metallurgy gm4_modules 1 schedule function gm4_metallurgy:main 1t schedule function gm4_metallurgy:tick 1t #$moduleUpdateList ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/main.mcfunction ================================================ schedule function gm4_metallurgy:main 16t # give radiation poisoning effect give @a[gamemode=!spectator,gamemode=!creative,predicate=gm4_metallurgy:carries_thorium] minecraft:mining_fatigue 2 1 # manage moulds execute as @e[type=armor_stand,tag=gm4_sand_ring] at @s positioned ~ ~1.23 ~ run function gm4_metallurgy:casting/sustain_mould # check for moulds waiting to be created execute as @e[type=item,predicate=gm4_metallurgy:is_obsidian,predicate=gm4_metallurgy:on_ground] at @s if block ~ ~-0.1 ~ #minecraft:sand align xyz unless entity @e[type=armor_stand,tag=gm4_sand_ring,dx=0,dy=-1,dz=0,limit=1] if entity @e[type=item,dx=0,dy=0,dz=0,predicate=gm4_metallurgy:is_clay_ball,predicate=gm4_metallurgy:on_ground,limit=1] run function gm4_metallurgy:casting/create_mould # check for shamir on anvil scoreboard players reset found_item_on_anvil gm4_ml_data execute as @e[type=item,tag=!gm4_ml_smooshed,predicate=gm4_metallurgy:on_ground,predicate=gm4_metallurgy:smooshing/has_shamir] at @s if block ~ ~-1 ~ #minecraft:anvil run function gm4_metallurgy:smooshing/item_on_anvil #============================== SHAMIR CLOCKING ================================ # (for shamirs that are included with the base module) scoreboard players set $arborenda_active gm4_ml_data 0 scoreboard players set $hypexperia_active gm4_ml_data 0 scoreboard players add $current_sensus_layer gm4_ml_data 1 execute if score $current_sensus_layer gm4_ml_data matches 6.. run scoreboard players set $current_sensus_layer gm4_ml_data 0 scoreboard players reset $tool_max_damage gm4_ml_data scoreboard players reset $tool_current_damage gm4_ml_data execute as @a run function gm4_metallurgy:player execute as @e[scores={gm4_bolt_time=-40..}] at @s run function gm4_ender_bolt_shamir:infection/active execute as @e[type=trident,predicate=gm4_metallurgy:is_ender_bolt_trident,nbt={inGround:1b}] at @s run function gm4_ender_bolt_shamir:infection/symptoms ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/player.mcfunction ================================================ # @s = a player not in spectator # run from main tag @s remove gm4_has_arborenda tag @s remove gm4_has_hypexperia tag @s remove gm4_has_musical tag @s remove gm4_has_sensus tag @s remove gm4_has_tinker tag @s remove gm4_has_vibro execute if predicate gm4_metallurgy:shamir_in_hand at @s[gamemode=!spectator] run function gm4_metallurgy:shamir_in_hand execute if predicate gm4_metallurgy:shamir_equipped at @s[gamemode=!spectator] run function gm4_metallurgy:shamir_equipped execute if entity @s[tag=!gm4_has_musical] run function gm4_musical_shamir:songs/reset_player scoreboard players reset @s[tag=!gm4_has_vibro] gm4_vibro_sneak ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/shamir_equipped.mcfunction ================================================ # @s = player with an active shamir in their armor slots # run from player execute if predicate gm4_metallurgy:defuse_active run function gm4_defuse_shamir:active execute if predicate gm4_moneo_shamir:wear_chest_moneo run function gm4_moneo_shamir:active_armor_chest execute if predicate gm4_metallurgy:vibro_active run function gm4_vibro_shamir:active ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/shamir_in_hand.mcfunction ================================================ # @s = player with an active shamir in their hands # run from player execute if predicate gm4_metallurgy:arborenda_active run function gm4_arborenda_shamir:active execute if predicate gm4_metallurgy:hypexperia_active run function gm4_hypexperia_shamir:active execute if predicate gm4_metallurgy:moneo_active run function gm4_moneo_shamir:active_tool execute if entity @s[scores={gm4_note_collect=1..},predicate=gm4_metallurgy:musical_active] run function gm4_musical_shamir:active execute if predicate gm4_metallurgy:sensus_active run function gm4_sensus_shamir:active execute if predicate gm4_metallurgy:infinitas_active run function gm4_infinitas_shamir:active execute if predicate gm4_metallurgy:tinker_active run function gm4_tinker_shamir:active ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/check.mcfunction ================================================ # @s = obsidian cast with a shamir on it # called from smooshing/prepare_transfer # check whether the other item is valid scoreboard players set valid_item gm4_ml_data 0 execute as @e[type=item,dx=0,limit=1,predicate=gm4_metallurgy:smooshing/valid_item] run function gm4_metallurgy:smooshing/add_band/check_item execute if score valid_item gm4_ml_data matches 1 run data merge entity @s {Item:{id:"minecraft:obsidian"},Tags:["gm4_ml_smooshed"]} execute if score valid_item gm4_ml_data matches 1 run item modify entity @s contents gm4_metallurgy:slightly_damaged_obsidian execute if score valid_item gm4_ml_data matches 1 run data remove entity @s Item.components."minecraft:custom_data".gm4_metallurgy ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/check_item.mcfunction ================================================ # @s = potential item to receive the shamir # called from smooshing/add_band/check function #gm4_metallurgy:check_item_validity execute if score valid_item gm4_ml_data matches 1 run function gm4_metallurgy:smooshing/add_band/found_item ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/add_band/found_item.mcfunction ================================================ # @s = item to receive the shamir # @e[tag=gm4_ml_source] = shamir item # called from smooshing/add_band/check_item # apply the shamir to the item, copying its tags in the process tag @s add gm4_ml_smooshed data modify entity @s Item.components."minecraft:custom_data" merge value {gm4_metallurgy:{has_shamir:1b}} data modify entity @s Item.components."minecraft:custom_data".gm4_metallurgy.active_shamir set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components."minecraft:custom_data".gm4_metallurgy.stored_shamir data modify entity @s Item.components."minecraft:custom_data".gm4_metallurgy.metal.type set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components."minecraft:custom_data".gm4_metallurgy.metal.type data modify entity @s Item.components."minecraft:lore" prepend from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components."minecraft:lore"[] execute as @e[type=item,tag=gm4_ml_source,dx=0,limit=1] if data entity @s Item.components."minecraft:custom_data".gm4_metallurgy.custom_model_data run data modify entity @s Item.components."minecraft:custom_model_data" set from entity @s Item.components."minecraft:custom_data".gm4_metallurgy.custom_model_data data modify entity @s Item.components."minecraft:custom_data".gm4_metallurgy.custom_model_data set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components."minecraft:custom_model_data" execute unless data entity @s Item.components."minecraft:custom_model_data" run data modify entity @s Item.components."minecraft:custom_model_data" set from entity @e[type=item,tag=gm4_ml_source,dx=0,limit=1] Item.components."minecraft:custom_model_data" function #gm4_metallurgy:apply_band # use anvil durability function gm4_metallurgy:smooshing/anvil/use ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/anvil.mcfunction ================================================ # checks the facing of the anvil and degrades it # @s = varies; an item used in the smooshing process # at align xyz in anvil # run from gm4_metallurgy:smooshing/anvil/degrade execute if block ~ ~ ~ anvil[facing=north] run setblock ~ ~ ~ chipped_anvil[facing=north] execute if block ~ ~ ~ anvil[facing=south] run setblock ~ ~ ~ chipped_anvil[facing=south] execute if block ~ ~ ~ anvil[facing=east] run setblock ~ ~ ~ chipped_anvil[facing=east] execute if block ~ ~ ~ anvil[facing=west] run setblock ~ ~ ~ chipped_anvil[facing=west] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/chipped_anvil.mcfunction ================================================ # checks the facing of the chipped_anvil and degrades it # @s = varies; an item used in the smooshing process # at align xyz in anvil # run from gm4_metallurgy:smooshing/anvil/degrade execute if block ~ ~ ~ chipped_anvil[facing=north] run setblock ~ ~ ~ damaged_anvil[facing=north] execute if block ~ ~ ~ chipped_anvil[facing=south] run setblock ~ ~ ~ damaged_anvil[facing=south] execute if block ~ ~ ~ chipped_anvil[facing=east] run setblock ~ ~ ~ damaged_anvil[facing=east] execute if block ~ ~ ~ chipped_anvil[facing=west] run setblock ~ ~ ~ damaged_anvil[facing=west] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade/damaged_anvil.mcfunction ================================================ # checks the facing of the damaged_anvil and degrades it # @s = varies; an item used in the smooshing process # at align xyz in anvil # run from gm4_metallurgy:smooshing/anvil/degrade execute if block ~ ~ ~ chipped_anvil[facing=north] run setblock ~ ~ ~ damaged_anvil[facing=north] execute if block ~ ~ ~ chipped_anvil[facing=south] run setblock ~ ~ ~ damaged_anvil[facing=south] execute if block ~ ~ ~ chipped_anvil[facing=east] run setblock ~ ~ ~ damaged_anvil[facing=east] execute if block ~ ~ ~ chipped_anvil[facing=west] run setblock ~ ~ ~ damaged_anvil[facing=west] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/degrade.mcfunction ================================================ # decides which damage level to degrade to # @s = varies; an item used in the smooshing process # at align xyz in anvil # run from gm4_metallurgy:smooshing/anvil/use # degrade anvil block execute if block ~ ~ ~ minecraft:damaged_anvil run setblock ~ ~ ~ air replace execute if block ~ ~ ~ minecraft:chipped_anvil run function gm4_metallurgy:smooshing/anvil/degrade/chipped_anvil execute if block ~ ~ ~ minecraft:anvil run function gm4_metallurgy:smooshing/anvil/degrade/anvil # particles particle minecraft:block{block_state:"minecraft:anvil"} ~0.5 ~1 ~0.5 0.2 0 0.2 0 5 ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/anvil/use.mcfunction ================================================ # Emulates vanilla anvil use. Anvils have a chance of losing 1 durability during smooshing. # @s = varies; an item used in the smooshing process # at align xyz in block over anvil # run from gm4_metallurgy:smooshing/add_band/found_item and gm4_metallurgy:smooshing/remove_band/found_obsidian # use anvil (12% chance) execute if predicate gm4_metallurgy:smooshing/anvil_damage_chance positioned ~ ~-1 ~ run function gm4_metallurgy:smooshing/anvil/degrade # sound playsound minecraft:entity.zombie.attack_iron_door block @a[distance=..16] ~ ~ ~ 0.6 0.7 ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/item_on_anvil.mcfunction ================================================ # @s = item on avil with a shamir on it # run from main scoreboard players set found_item_on_anvil gm4_ml_data 1 tag @s add gm4_ml_on_anvil ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/prepare_transfer.mcfunction ================================================ # @s = item being crushed by a piston that has a shamir # run from tick tag @s add gm4_ml_source execute if data entity @s Item.components."minecraft:custom_data".gm4_metallurgy.stored_shamir run function gm4_metallurgy:smooshing/add_band/check execute if data entity @s Item.components."minecraft:custom_data".gm4_metallurgy.active_shamir run function gm4_metallurgy:smooshing/remove_band/check tag @s remove gm4_ml_source ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/check.mcfunction ================================================ # @s = item being crushed by a piston that has a shamir # run from smooshing/prepare_transfer #check whether the other item is an obsidian block scoreboard players set $valid_obsidian gm4_ml_data 0 execute if entity @e[type=item,dx=0,predicate=gm4_metallurgy:is_obsidian,limit=1] run function gm4_metallurgy:smooshing/remove_band/found_obsidian #if both custom model data tags are the same, then we can delete it execute store success score custom_model_data gm4_ml_data run data modify entity @s Item.components."minecraft:custom_data".gm4_metallurgy.custom_model_data set from entity @s Item.components."minecraft:custom_model_data" execute if score $valid_obsidian gm4_ml_data matches 1 run function gm4_metallurgy:smooshing/remove_band/clear_data ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/clear_data.mcfunction ================================================ # @s = armor/tool with the band # run from smooshing/remove_band/check execute if score custom_model_data gm4_ml_data matches 0 run data remove entity @s Item.components."minecraft:custom_model_data" # Line 8 only clears custom data, while max stack size is its own component execute if items entity @s contents *[custom_data~{gm4_metallurgy:{active_shamir:"infinitas"}}] run data remove entity @s Item.components."minecraft:max_stack_size" data remove entity @s Item.components."minecraft:custom_data".gm4_metallurgy execute if items entity @s contents *[custom_data={}] run data remove entity @s Item.components."minecraft:custom_data" # use lib_lore to remove the correct lines of lore data modify storage gm4_lore:temp Source set from entity @s Item.components."minecraft:lore" # check legacy Metallurgy lore data modify storage gm4_lore:temp Target set value '{"color":"aqua","fallback":"Shamir","italic":false,"translate":"item.gm4.metallurgy.shamir"}' scoreboard players set $start gm4_lore 0 function #gm4_lore:search execute unless score $index gm4_lore matches -1 run return run function gm4_metallurgy:smooshing/remove_band/clear_legacy_lore # use lib_lore to remove the correct lines of lore data modify storage gm4_lore:temp Target set from entity @s Item.components."minecraft:lore"[0] scoreboard players set $start gm4_lore 0 scoreboard players set $extra gm4_lore 1 function #gm4_lore:remove data modify entity @s Item.components."minecraft:lore" set from storage gm4_lore:temp Source ## Metallurgy lore 1.21+ # Name: Obsidian Cast # Lore: Band # Shamir ## Old Metallurgy lore (pre 1.21) # Name: Obsidian Cast # Lore: Band # Shamir # ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/clear_legacy_lore.mcfunction ================================================ # @s = armor/tool with the band # run from smooshing/remove_band/clear_data # use lib_lore to remove the correct lines of lore ## NOTE: gm4_lore:temp Target is still "Shamir" from clear_data search scoreboard players set $start gm4_lore -1 scoreboard players set $extra gm4_lore 2 function #gm4_lore:remove data modify entity @s Item.components."minecraft:lore" set from storage gm4_lore:temp Source ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/found_obsidian.mcfunction ================================================ # @s = item being crushed by a piston that has a shamir # run from smooshing/remove_band/check function gm4_metallurgy:smooshing/remove_band/spawn_band with entity @s Item.components."minecraft:custom_data".gm4_metallurgy # use anvil durability function gm4_metallurgy:smooshing/anvil/use ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/smooshing/remove_band/spawn_band.mcfunction ================================================ $execute store result score $valid_obsidian gm4_ml_data run loot spawn ~ ~ ~ loot gm4_$(active_shamir)_shamir:band tag @n[type=item,nbt={Age:0s}] add gm4_ml_smooshed kill @e[type=item,dx=0,predicate=gm4_metallurgy:is_obsidian,limit=1] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/function/tick.mcfunction ================================================ # prepare for item smooshing execute if score found_item_on_anvil gm4_ml_data matches 1 as @e[type=item,tag=gm4_ml_on_anvil] at @s if block ~ ~ ~ minecraft:moving_piston align xyz if entity @e[type=item,dx=0,predicate=gm4_metallurgy:smooshing/valid_item] run function gm4_metallurgy:smooshing/prepare_transfer # TODO: Disabling this functionality until someone updates the code # infinitas # execute if entity @e[tag=gm4_in_infinitas] as @a[predicate=gm4_metallurgy:infinitas_active] at @s run function gm4_infinitas_shamir:spiral # arborenda execute as @a run function gm4_arborenda_shamir:player/check_for_axe # hypexperia execute if score $hypexperia_active gm4_ml_data matches 1 run function gm4_hypexperia_shamir:find_orbs # vibro execute as @a[gamemode=!spectator,tag=gm4_has_vibro,predicate=gm4_vibro_shamir:sneak_on_ground] at @s run function gm4_vibro_shamir:jump execute as @a[gamemode=!spectator,scores={gm4_vibro_sneak=1..},predicate=!gm4_vibro_shamir:sneak_on_ground] run function gm4_vibro_shamir:remove_jump scoreboard players reset @a gm4_vibro_fall scoreboard players reset @a gm4_vibro_hurt scoreboard players reset @a gm4_vibro_absorb schedule function gm4_metallurgy:tick 1t ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/guidebook/metallurgy.json ================================================ { "id": "metallurgy", "name": "Metallurgy", "module_type": "base", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_tnt": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:tnt" ] } ] } }, "obtain_obsidian": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:obsidian" ] } ] } }, "obtain_lump": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{item:\"ore\"}}" } } ] } }, "obtain_obsidian_cast": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,item:\"obsidian_cast\"}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.metallurgy.description", "fallback": "Custom abilities, called shamirs, can be added to tools and armour, like enchantments.\n\nShamirs are exclusive, meaning only one can be applied to an item at a time." } ] ] }, { "name": "lump_obtaining", "enable": [], "requirements": [ [ "obtain_tnt" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.metallurgy.section.lump_obtaining", "fallback": "Obtaining Ore", "bold": true }, "\n", { "translate": "text.gm4.guidebook.metallurgy.lump_obtaining", "fallback": "Blowing up stone-type blocks with tnt will drop metal ore lumps.\n\nEach of the four stone types (stone, granite, andesite, and diorite) drop a different metal lump." } ] ] }, { "name": "casting", "enable": [], "requirements": [ [ "obtain_obsidian" ], [ "obtain_lump" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.metallurgy.section.casting", "fallback": "Casting", "bold": true }, "\n", { "translate": "text.gm4.guidebook.metallurgy.mould", "fallback": "A mould can be created by dropping 1 obsidian and 1 clay ball on a sand block.\n\nMoulds must be heated by placing lava on top of them. Overheating a mould causes it to smoke and break." } ], [ { "translate": "text.gm4.guidebook.metallurgy.mould_1", "fallback": "Without lava, the mould will cool over time and must be reheated to added metal.\n\nIf no metal is added to the cast before it completely cools down, the obsidian will drop, losing the clay ball." } ], [ { "translate": "text.gm4.guidebook.metallurgy.adding_metal", "fallback": "Ore lumps can be dropped in one by one into a heated mould. 23 ore lumps must be added for a proper cast.\n\nAlloys can be made using a 17-6 ratio: Aluminium + Barium or Thorium + Bismuth." } ], [ { "translate": "text.gm4.guidebook.metallurgy.recycling", "fallback": "If a cast is dropped into the mould, it will return the obsidian and about half of its metal will recycled.\n\nPure metal bands supply 12 ore of their metal, while alloy metal bands supply 9 primary ore and 3 secondary ore." } ], [ { "translate": "text.gm4.guidebook.metallurgy.cooling", "fallback": "Once a mould completely cools down, a Shamir Band will form.\n\nIf the casting process was done incorrectly, a useless Mundane Band will be on the cast." } ] ], "grants": [ "lump_obtaining" ] }, { "name": "shamirs", "enable": [], "requirements": [ [ "obtain_obsidian_cast" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.metallurgy.section.shamirs", "fallback": "Shamirs", "bold": true }, "\n", { "translate": "text.gm4.guidebook.metallurgy.metal_properties", "fallback": "Each band type has a specific attribute.\n\nBismuth is creation, Thorium is destruction, and Curie's Bismium is equivalence." } ], [ { "translate": "text.gm4.guidebook.metallurgy.metal_properties_1", "fallback": "Alluminium is supression, Barium is amplification, and Barimium is modification." } ], [ { "translate": "text.gm4.guidebook.metallurgy.smooshing", "fallback": "To attach a shamir to an item, drop the cast and item on an anvil.\n\n'Smoosh' them together by powering a downwards facing piston placed two blocks above the anvil." } ], [ { "translate": "text.gm4.guidebook.metallurgy.smooshing_1", "fallback": "To detach a shamir, do the same 'smooshing' process after dropping the shamir-bearing item and one obsidian." } ] ], "grants": [ "casting" ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/cool_empty.json ================================================ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:block/mould/cool_empty"]}, "minecraft:profile": "$mould/cool_empty" } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/cool_metal.json ================================================ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:block/mould/cool_metal"]}, "minecraft:profile": "$mould/cool_metal" } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/hot_empty.json ================================================ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:block/mould/hot_empty"]}, "minecraft:profile": "$mould/hot_empty" } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/item_modifier/mould/hot_metal.json ================================================ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:block/mould/hot_metal"]}, "minecraft:profile": "$mould/hot_metal" } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/item_modifier/slightly_damaged_obsidian.json ================================================ [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:item/slightly_damaged_obsidian"]}, "!minecraft:item_name": {}, "!minecraft:custom_name": {}, "!minecraft:profile": {} } }, { "function": "minecraft:set_lore", "mode": "replace_all", "lore": [ { "translate": "item.gm4.slightly_damaged_obsidian", "fallback": "Slightly Damaged Obsidian", "color": "dark_gray" } ] } ] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/aluminium_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/aluminium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'aluminium',amount:[12s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.aluminium", "fallback": "Aluminium" } ], "italic": false, "color": "#F47989" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/barimium_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/barimium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'barimium',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.barimium", "fallback": "Barimium" } ], "italic": false, "color": "#D18A8A" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/barium_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/barium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'barium',amount:[12s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.barium", "fallback": "Barium" } ], "italic": false, "color": "#F0EAD6" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/baryte_lump.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.baryte_lump", "fallback": "Baryte Lump" } }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "translate": "text.gm4.metallurgy.contains", "fallback": "Contains ", "italic": false, "color": "gray" }, { "translate": "text.gm4.metallurgy.barium", "fallback": "Barium", "italic": false, "color": "#F0EAD6" } ] ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:item/lump/baryte"]}, "minecraft:profile": "$ore/barium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{metal:{type:'barium',amount:[1s],castable:1b},item:'ore'}}" } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/bauxite_lump.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.bauxite_lump", "fallback": "Bauxite Lump" } }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "translate": "text.gm4.metallurgy.contains", "fallback": "Contains ", "italic": false, "color": "gray" }, { "translate": "text.gm4.metallurgy.aluminium", "fallback": "Aluminium", "italic": false, "color": "#F47989" } ] ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:item/lump/bauxite"]}, "minecraft:profile": "$ore/aluminium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{metal:{type:'aluminium',amount:[1s],castable:1b},item:'ore'}}" } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/bismuth_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/bismuth" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'bismuth',amount:[12s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ [ { "translate": "item.gm4.metallurgy.bismuth_band.red", "fallback": "Bi", "italic": false, "color": "#F47989" }, { "translate": "item.gm4.metallurgy.bismuth_band.orange", "fallback": "sm", "italic": false, "color": "#F5B478" }, { "translate": "item.gm4.metallurgy.bismuth_band.yellow", "fallback": "ut", "italic": false, "color": "#F5DD79" }, { "translate": "item.gm4.metallurgy.bismuth_band.green", "fallback": "h ", "italic": false, "color": "#78F4AE" }, { "translate": "item.gm4.metallurgy.bismuth_band.blue", "fallback": "Ba", "italic": false, "color": "#79D6F5" }, { "translate": "item.gm4.metallurgy.bismuth_band.purple", "fallback": "nd", "italic": false, "color": "#8378F5" }, { "translate": "item.gm4.metallurgy.bismuth_band.magenta", "fallback": "\u200c", "italic": false, "color": "#D579F5" } ] ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/bismutite_lump.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.bismutite_lump", "fallback": "Bismutite Lump" } }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "translate": "text.gm4.metallurgy.contains", "fallback":"Contains ", "italic": false, "color": "gray" }, { "translate": "item.gm4.metallurgy.bismuth.red", "fallback": "B", "italic": false, "color": "#F47989" }, { "translate": "item.gm4.metallurgy.bismuth.orange", "fallback": "i", "italic": false, "color": "#F5B478" }, { "translate": "item.gm4.metallurgy.bismuth.yellow", "fallback": "s", "italic": false, "color": "#F5DD79" }, { "translate": "item.gm4.metallurgy.bismuth.green", "fallback": "m", "italic": false, "color": "#78F4AE" }, { "translate": "item.gm4.metallurgy.bismuth.blue", "fallback": "u", "italic": false, "color": "#79D6F5" }, { "translate": "item.gm4.metallurgy.bismuth.purple", "fallback": "t", "italic": false, "color": "#8378F5" }, { "translate": "item.gm4.metallurgy.bismuth.magenta", "fallback": "h", "italic": false, "color": "#D579F5" } ] ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:item/lump/bismutite"]}, "minecraft:profile": "$ore/bismuth" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{metal:{type:'bismuth',amount:[1s],castable:1b},item:'ore'}}" } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/copper_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/copper_RETIRED" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'copper',amount:[12s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.copper", "fallback": "Copper" } ], "italic": false, "color": "gold" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/curies_bismium_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/curies_bismium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'curies_bismium',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.curies_bismium", "fallback": "Curie's Bismium" } ], "italic": false, "color": "#467A1B" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/malachite_lump.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.malachite_lump", "fallback": "Malachite Lump" } }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "translate": "text.gm4.metallurgy.contains", "fallback": "Contains ", "italic": false, "color": "gray" }, { "translate": "text.gm4.metallurgy.copper", "fallback": "Copper", "italic": false, "color": "gold" } ] ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": { "floats": [ 3420018 ] }, "minecraft:profile": "$ore/copper_RETIRED" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{metal:{type:'copper',amount:[1s],castable:1b},item:'ore'}}" } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/thorianite_lump.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.thorianite_lump", "fallback": "Thorianite Lump" } }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "translate": "text.gm4.metallurgy.contains", "fallback": "Contains ", "italic": false, "color": "gray" }, { "translate": "text.gm4.metallurgy.thorium", "fallback": "Thorium", "italic": false, "color": "#767676" } ] ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:item/lump/thorianite"]}, "minecraft:profile": "$ore/thorium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{metal:{type:'thorium',amount:[1s],castable:1b},item:'ore'}}" } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/thorium_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/thorium" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'thorium',amount:[12s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.thorium", "fallback": "Thorium" } ], "italic": false, "color": "#767676" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/loot_table/thorium_brass_band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:profile": "$band/thorium_brass_RETIRED" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{has_shamir:1b,metal:{type:'thorium_brass',amount:[9s,3s],castable:1b},item:'obsidian_cast'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.metallurgy.obsidian_cast", "fallback": "Obsidian Cast" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.metallurgy.band", "fallback": "%s Band", "with": [ { "translate": "item.gm4.metallurgy.thorium_brass", "fallback": "Thorium Brass" } ], "italic": false, "color": "dark_green" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/arborenda_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": false }, "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'arborenda'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/carries_thorium.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "player.cursor": { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "player.crafting.*": { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{type:'thorium'},item:'ore'}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/defuse_active.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "legs": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "chest": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'defuse'}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/forterra_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/has_shamir.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/hypexperia_active.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'hypexperia'}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/infinitas_active.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_mainhand_empty\"]}", "flags": { "is_sneaking": true } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_infinitas_offhand_empty\"]}", "flags": { "is_sneaking": true } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/is_castable.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "count": 1, "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{metal:{castable:1b}}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/is_clay_ball.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:clay_ball", "count": 1 } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/is_ender_bolt_trident.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'ender_bolt'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/is_obsidian.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:obsidian", "count": 1 } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/levity_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'levity'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/moneo_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/musical_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'musical'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/on_ground.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_on_ground": true } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/sensus_active.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/shamir_equipped.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "legs": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "chest": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/shamir_in_hand.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/anvil_damage_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.12 } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/has_shamir.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "count": 1 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } } ] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/smooshing/valid_item.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "count": 1 } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b}}" } } } } } } ] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/tinker_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'tinker'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/predicate/vibro_active.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "items": "#minecraft:foot_armor", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vibro'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/apply_band.json ================================================ { "values": [ "gm4_infinitas_shamir:make_unstackable", "gm4_moneo_shamir:store_maximum" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_arborenda_shamir:check_item_validity", "gm4_defuse_shamir:check_item_validity", "gm4_ender_bolt_shamir:check_item_validity", "gm4_forterra_shamir:check_item_validity", "gm4_gemini_shamir:check_item_validity", "gm4_hypexperia_shamir:check_item_validity", "gm4_moneo_shamir:check_item_validity", "gm4_musical_shamir:check_item_validity", "gm4_sensus_shamir:check_item_validity", "gm4_infinitas_shamir:check_item_validity", "gm4_tinker_shamir:check_item_validity", "gm4_vibro_shamir:check_item_validity" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/aluminium.json ================================================ { "values":[ "gm4_defuse_shamir:summon_band", "gm4_moneo_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/barimium.json ================================================ { "values":[ "gm4_musical_shamir:summon_band", "gm4_gemini_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/barium.json ================================================ { "values":[ "gm4_sensus_shamir:summon_band", "gm4_arborenda_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/bismuth.json ================================================ { "values":[ "gm4_forterra_shamir:summon_band", "gm4_hypexperia_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json ================================================ { "values":[ "gm4_infinitas_shamir:summon_band", "gm4_tinker_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/tags/function/summon_band/thorium.json ================================================ { "values":[ "gm4_ender_bolt_shamir:summon_band", "gm4_vibro_shamir:summon_band" ] } ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/cast_add_lumps.mcfunction ================================================ # @template gm4_metallurgy:test_casting # @timeout 300 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:obsidian"}} summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:clay_ball"}} await entity @e[tag=gm4_sand_ring] inside setblock ~1 ~2 ~1 lava await delay 10s setblock ~1 ~2 ~1 air summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:player_head",components:{"minecraft:custom_data":{gm4_metallurgy:{item:"ore",metal:{castable:1b,type:"barium",amount:[1s]}}}}}} await delay 2s setblock ~1 ~1 ~1 air await items entity @e[type=item,distance=..4] contents minecraft:magma_block ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/cast_create_and_destroy.mcfunction ================================================ # @template gm4_metallurgy:test_casting summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:obsidian"}} summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:clay_ball"}} await entity @e[tag=gm4_sand_ring] inside setblock ~1 ~1 ~1 air await items entity @e[type=item,distance=..4] contents minecraft:obsidian assert not items entity @e[type=item,distance=..4] contents minecraft:clay_ball ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/cast_mundane.mcfunction ================================================ # @template gm4_metallurgy:test_casting # @timeout 400 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:obsidian"}} summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:clay_ball"}} await entity @e[tag=gm4_sand_ring] inside setblock ~1 ~2 ~1 lava await delay 10s setblock ~1 ~2 ~1 air summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:player_head",components:{"minecraft:custom_data":{gm4_metallurgy:{item:"ore",metal:{castable:1b,type:"barium",amount:[1s]}}}}}} await delay 5s setblock ~1 ~1 ~1 air # no good way to detect mundane band await items entity @e[type=item,distance=..4] contents minecraft:player_head ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/cast_overheat.mcfunction ================================================ # @template gm4_metallurgy:test_casting # @timeout 600 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:obsidian"}} summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:clay_ball"}} await entity @e[tag=gm4_sand_ring] inside setblock ~1 ~2 ~1 lava await delay 22s assert entity @e[tag=gm4_sand_ring] inside await delay 2s assert not entity @e[tag=gm4_sand_ring] inside assert block ~1 ~2 ~1 lava[level=0] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/cast_successful.mcfunction ================================================ # @template gm4_metallurgy:test_casting # @timeout 400 summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:obsidian"}} summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:clay_ball"}} await entity @e[tag=gm4_sand_ring] inside setblock ~1 ~2 ~1 lava await delay 10s setblock ~1 ~2 ~1 air summon item ~1.5 ~3 ~1.5 {Item:{id:"minecraft:player_head",components:{"minecraft:custom_data":{gm4_metallurgy:{item:"ore",metal:{castable:1b,type:"barium",amount:[1s]}}}}}} await delay 2s scoreboard players set @e[tag=gm4_sand_ring,distance=..4] gm4_ml_ore_ba 23 await delay 3s setblock ~1 ~1 ~1 air await items entity @e[type=item,distance=..4] contents minecraft:player_head[custom_data~{gm4_metallurgy:{item:"obsidian_cast",has_shamir:1b,metal:{castable:1b,type:"barium",amount:[12s]}}}] ================================================ FILE: gm4_metallurgy/data/gm4_metallurgy/test/smoosh.mcfunction ================================================ # @template gm4_metallurgy:test_smooshing loot spawn ~1.5 ~2.5 ~1.8 loot gm4_hypexperia_shamir:band summon item ~1.5 ~2.5 ~1.8 {Item:{id:"minecraft:diamond_sword"}} await delay 1s setblock ~1 ~4 ~1 redstone_block await items entity @e[type=item,distance=..4] contents minecraft:diamond_sword[custom_data~{gm4_metallurgy:{active_shamir:"hypexperia"}}] assert items entity @e[type=item,distance=..4] contents minecraft:obsidian ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/active_armor_chest.mcfunction ================================================ # @s = players wearing armor with moneo # run from shamir_equipped scoreboard players set $tool_current_damage gm4_ml_data 0 scoreboard players set $tool_max_damage gm4_ml_data 0 execute store result score $tool_current_damage gm4_ml_data run data get entity @s equipment.chest.components."minecraft:damage" execute store result score $tool_max_damage gm4_ml_data run data get entity @s equipment.chest.components."minecraft:custom_data".MaxDurability execute if score $tool_max_damage gm4_ml_data matches 432 run function gm4_moneo_shamir:armor/elytra ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/active_tool.mcfunction ================================================ # @s = players holding a moneo tool # run from shamir_in_hand scoreboard players set $tool_current_damage gm4_ml_data 0 scoreboard players set $tool_max_damage gm4_ml_data 0 execute store result score $tool_current_damage gm4_ml_data run data get entity @s SelectedItem.components."minecraft:damage" execute store result score $tool_max_damage gm4_ml_data run data get entity @s SelectedItem.components."minecraft:custom_data".MaxDurability # update newly upgraded netherite gear execute if score $tool_max_damage gm4_ml_data matches 1561 if predicate gm4_moneo_shamir:holding_netherite run function gm4_moneo_shamir:update_netherite # activate moneo execute if score $tool_max_damage gm4_ml_data matches 59 run function gm4_moneo_shamir:tools/materials/wood execute if score $tool_max_damage gm4_ml_data matches 131 run function gm4_moneo_shamir:tools/materials/stone execute if score $tool_max_damage gm4_ml_data matches 190 run function gm4_moneo_shamir:tools/materials/copper execute if score $tool_max_damage gm4_ml_data matches 250 run function gm4_moneo_shamir:tools/materials/iron execute if score $tool_max_damage gm4_ml_data matches 1561 run function gm4_moneo_shamir:tools/materials/diamond execute if score $tool_max_damage gm4_ml_data matches 2031 run function gm4_moneo_shamir:tools/materials/netherite # | gold used to be listed as 33 max damage, this is kept for compatibility with old items execute if score $tool_max_damage gm4_ml_data matches 32..33 run function gm4_moneo_shamir:tools/materials/gold execute if score $tool_max_damage gm4_ml_data matches 237 run function gm4_moneo_shamir:tools/shears ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/armor/elytra.mcfunction ================================================ # run from active_armor_chest # @s = player wearing the moneo elytra scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data tag @s[nbt={FallFlying:1b}] add gm4_moneo_ff execute if score $tool_max_damage gm4_ml_data matches 10..20 run effect give @s[tag=gm4_moneo_ff] minecraft:slowness 2 1 execute if score $tool_max_damage gm4_ml_data matches 10..20 at @s[tag=gm4_moneo_ff] run playsound minecraft:entity.bat.takeoff master @s ~ ~ ~ 5 1.65 execute if score $tool_max_damage gm4_ml_data matches 2..20 at @s[tag=!gm4_moneo_ff] run playsound minecraft:entity.bat.takeoff master @s ~ ~ ~ 5 1.65 execute if score $tool_max_damage gm4_ml_data matches 2..9 run effect give @s[tag=gm4_moneo_ff] minecraft:slowness 2 2 execute if score $tool_max_damage gm4_ml_data matches 2..9 at @s[tag=gm4_moneo_ff] run playsound minecraft:block.bell.use master @s ~ ~ ~ 5 0 tag @s remove gm4_moneo_ff ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'moneo'}}] if items entity @s contents #gm4_moneo_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/store_maximum.mcfunction ================================================ # run from #gm4_metallurgy:apply_band # @s = moneo tool item # used by Audere Shamir as well execute if items entity @s contents minecraft:wooden_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 59 execute if items entity @s contents minecraft:wooden_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 59 execute if items entity @s contents minecraft:wooden_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 59 execute if items entity @s contents minecraft:wooden_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 59 execute if items entity @s contents minecraft:stone_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 131 execute if items entity @s contents minecraft:stone_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 131 execute if items entity @s contents minecraft:stone_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 131 execute if items entity @s contents minecraft:stone_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 131 execute if items entity @s contents minecraft:copper_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 190 execute if items entity @s contents minecraft:copper_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 190 execute if items entity @s contents minecraft:copper_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 190 execute if items entity @s contents minecraft:copper_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 190 execute if items entity @s contents minecraft:iron_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 250 execute if items entity @s contents minecraft:iron_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 250 execute if items entity @s contents minecraft:iron_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 250 execute if items entity @s contents minecraft:iron_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 250 execute if items entity @s contents minecraft:diamond_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 1561 execute if items entity @s contents minecraft:diamond_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 1561 execute if items entity @s contents minecraft:diamond_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 1561 execute if items entity @s contents minecraft:diamond_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 1561 execute if items entity @s contents minecraft:netherite_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 2031 execute if items entity @s contents minecraft:netherite_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 2031 execute if items entity @s contents minecraft:netherite_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 2031 execute if items entity @s contents minecraft:netherite_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 2031 execute if items entity @s contents minecraft:golden_shovel run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 32 execute if items entity @s contents minecraft:golden_pickaxe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 32 execute if items entity @s contents minecraft:golden_hoe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 32 execute if items entity @s contents minecraft:golden_axe run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 32 execute if items entity @s contents minecraft:shears run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 237 execute if items entity @s contents minecraft:elytra run data modify entity @s Item.components."minecraft:custom_data".MaxDurability set value 432 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium loot spawn ~ ~ ~ loot gm4_moneo_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/copper.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 16..30 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..30 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1 execute if score $tool_max_damage gm4_ml_data matches ..15 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/diamond.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 21..50 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..50 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 2 execute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/gold.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 6..10 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..10 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1.4 execute if score $tool_max_damage gm4_ml_data matches ..5 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/iron.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 21..40 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..40 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1 execute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/netherite.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 21..50 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..50 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 2 execute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/stone.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 21..30 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..30 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 0.7 execute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/materials/wood.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 11..20 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..20 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 0 execute if score $tool_max_damage gm4_ml_data matches ..10 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/tools/shears.mcfunction ================================================ # run from active_tool # @s = player holding the moneo tool scoreboard players operation $tool_max_damage gm4_ml_data -= $tool_current_damage gm4_ml_data execute if score $tool_max_damage gm4_ml_data matches 21..35 run effect give @s minecraft:mining_fatigue 2 0 execute if score $tool_max_damage gm4_ml_data matches ..35 at @s run playsound minecraft:block.lantern.hit master @s ~ ~ ~ 5 1 execute if score $tool_max_damage gm4_ml_data matches ..20 run effect give @s minecraft:mining_fatigue 2 1 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/function/update_netherite.mcfunction ================================================ # @s = player holding a netherite moneo tool that has the wrong MaxDurability # run from active_tool # item modifier item modify entity @s weapon.mainhand gm4_moneo_shamir:netherite_update # correctly set the max damage scoreboard players set $tool_max_damage gm4_ml_data 2031 ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/guidebook/moneo_shamir.json ================================================ { "id": "moneo_shamir", "name": "Moneo Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Moneo_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_moneo_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'moneo'}}" } } ] } }, "obtain_moneo_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.moneo_shamir.description", "fallback": "Moneo slows mining and flying when durability is low." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_moneo_shamir", "obtain_moneo_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.moneo_shamir.usage", "fallback": "The Moneo Shamir is found on Aluminium Bands. It can be placed onto tools, shears, and elytra.\n\nLow durability tools will cause mining fatigue, and low durability elytra will cause slowness and blindness." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/item_modifier/netherite_update.json ================================================ { "function": "minecraft:set_custom_data", "tag": "{MaxDurability:2031}" } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:aluminium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/moneo"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'moneo'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.moneo", "fallback": "Moneo Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/predicate/holding_moneo.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_moneo_shamir:valid_tools", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/predicate/holding_netherite.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_moneo_shamir:netherite_tools" } } } } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/predicate/wear_chest_moneo.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "chest": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'moneo'}}" } } } } } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/tags/item/netherite_tools.json ================================================ { "values": [ "minecraft:netherite_shovel", "minecraft:netherite_pickaxe", "minecraft:netherite_hoe", "minecraft:netherite_axe" ] } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/tags/item/valid_items.json ================================================ { "values": [ "#gm4_moneo_shamir:valid_tools", "minecraft:elytra" ] } ================================================ FILE: gm4_metallurgy/data/gm4_moneo_shamir/tags/item/valid_tools.json ================================================ { "values": [ "#minecraft:axes", "#minecraft:hoes", "#minecraft:pickaxes", "#minecraft:shovels", "minecraft:shears" ] } ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/active.mcfunction ================================================ #@s = players holding musical with gm4_note_collect=1.. #at @s #run from metallurgy:shamir_in_hand tag @s add gm4_has_musical #particle indicators execute if score @s gm4_note_collect matches 1 run particle note ~ ~1 ~ .992 .992 .992 .5 1 normal @a[distance=..8] execute if score @s gm4_note_collect matches 2 run particle note ~ ~1 ~ 1 1 1 .5 4 normal @a[distance=..8] execute if score @s gm4_note_collect matches 3 run particle note ~ ~1 ~ 1.2 1.2 1.2 .5 8 normal @a[distance=..8] #activate song effects execute if score @s gm4_note_collect matches 4.. run function gm4_musical_shamir:songs/mellohi ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'musical'}}] if items entity @s contents #gm4_musical_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/songs/chirp.mcfunction ================================================ #@s = players holding musical with gm4_note_time=54.. and gm4_note_collect=10.. #at @s #run from musical_shamir:songs/mellohi_end #start song execute if score @s gm4_note_time matches 60 run playsound minecraft:music_disc.chirp player @s ~ 10000 ~ 300000000 2 #effects execute if score @s gm4_note_time matches 60 run effect give @s speed 91 2 execute if score @s gm4_note_time matches 60 run effect give @s strength 91 2 #particle particle note ~ ~1 ~ 1.4 1.4 1.4 .5 6 normal @a[distance=..8] #end song execute if score @s gm4_note_time matches 174.. run function gm4_musical_shamir:songs/reset_player ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/songs/mellohi.mcfunction ================================================ #@s = players holding musical with gm4_note_collect=4.. #at @s #run from musical_shamir:main #start song timer scoreboard players add @s gm4_note_time 1 #start song execute if score @s gm4_note_time matches 1 run playsound minecraft:music_disc.mellohi player @s ~ 10000 ~ 300000000 2 #effects execute if score @s gm4_note_time matches 1 run effect give @s slowness 48 0 execute if score @s gm4_note_time matches 1 run effect give @s strength 48 0 #particles particle note ~ ~1 ~ 1.4 1.4 1.4 .5 12 normal @a[distance=..8] #song end execute if score @s gm4_note_time matches 60.. run function gm4_musical_shamir:songs/mellohi_end ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/songs/mellohi_end.mcfunction ================================================ #@s = players holding musical with gm4_note_time=54.. #at @s #run from musical_shamir:songs/mellohi #reset players with not enough mob kills execute if score @s gm4_note_collect matches ..7 run function gm4_musical_shamir:songs/reset_player #queue 'chirp' for player with enough mob kills execute if score @s gm4_note_collect matches 8.. run function gm4_musical_shamir:songs/chirp ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/songs/reset_player.mcfunction ================================================ #@s = players holding musical with gm4_note_time=54.. but gm4_note_collect=..9 #at @s #run from musical_shamir:songs/mellohi_end and musical_shamir:songs/chirp and metallurgy:main #clear effect execute if score @s gm4_note_time matches 1..60 run effect clear @s minecraft:slowness execute if score @s gm4_note_time matches 1..174 run effect clear @s minecraft:strength execute if score @s gm4_note_time matches 60..174 run effect clear @s minecraft:speed #stop sounds if neccessary execute if score @s gm4_note_time matches 1..60 run stopsound @s player minecraft:music_disc.mellohi execute if score @s gm4_note_time matches 60..174 run stopsound @s player minecraft:music_disc.chirp #reset player scoreboard players reset @s gm4_note_time scoreboard players reset @s gm4_note_collect ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/barimium via #gm4_metallurgy:summon_band/barimium loot spawn ~ ~ ~ loot gm4_musical_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/guidebook/musical_shamir.json ================================================ { "id": "musical_shamir", "name": "Musical Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Musical_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_musical_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'musical'}}" } } ] } }, "obtain_musical_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'musical'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.musical_shamir.description", "fallback": "Musical modifies strength and speed based on consecutive mob kills." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_musical_shamir", "obtain_musical_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.musical_shamir.usage", "fallback": "The Musical Shamir is found on Barimium Bands. It can be placed onto swords.\n\nWhen killing mobs, music is played and Slowness and Strength I are granted." } ], [ { "translate": "text.gm4.guidebook.musical_shamir.usage_1", "fallback": "After many kills, the music will become darker, and Speed and Strength III are granted instead." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barimium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/musical"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'musical'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.musical", "fallback": "Musical Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:swords", "minecraft:mace", "minecraft:trident" ] } ================================================ FILE: gm4_metallurgy/data/gm4_musical_shamir/test/gain_buff.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 # @timeout 150 item replace entity @s weapon.mainhand with diamond_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"musical"}}] await delay 1s summon pig ~0.5 ~1 ~1.5 {Health:1f,Tags:[gm4_test_musical_1]} dummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_1,limit=1] await delay 1s summon pig ~0.5 ~1 ~2.5 {Health:1f,Tags:[gm4_test_musical_2]} dummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_2,limit=1] await delay 1s summon pig ~2.5 ~1 ~1.5 {Health:1f,Tags:[gm4_test_musical_3]} dummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_3,limit=1] await delay 1s assert not entity @s[nbt={active_effects:[{id:"minecraft:strength"}]}] summon pig ~2.5 ~1 ~2.5 {Health:1f,Tags:[gm4_test_musical_4]} dummy @s attack @e[type=pig,distance=..4,tag=gm4_test_musical_4,limit=1] await entity @s[nbt={active_effects:[{id:"minecraft:strength"},{id:"minecraft:slowness"}]}] dummy @s selectslot 2 await not entity @s[nbt={active_effects:[{id:"minecraft:strength"}]}] ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/active.mcfunction ================================================ # @s player holding sensus #run from metallurgy:shamir_in_hand tag @s add gm4_has_sensus execute if score $current_sensus_layer gm4_ml_data matches 0 positioned ~-3 ~-2 ~-3 run function gm4_sensus_shamir:block_search/search execute if score $current_sensus_layer gm4_ml_data matches 1 positioned ~-3 ~-1 ~-3 run function gm4_sensus_shamir:block_search/search execute if score $current_sensus_layer gm4_ml_data matches 2 positioned ~-3 ~0 ~-3 run function gm4_sensus_shamir:block_search/search execute if score $current_sensus_layer gm4_ml_data matches 3 positioned ~-3 ~1 ~-3 run function gm4_sensus_shamir:block_search/search execute if score $current_sensus_layer gm4_ml_data matches 4 positioned ~-3 ~2 ~-3 run function gm4_sensus_shamir:block_search/search execute if score $current_sensus_layer gm4_ml_data matches 5 positioned ~-3 ~3 ~-3 run function gm4_sensus_shamir:block_search/search ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_coal_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4 setblock ~ ~ ~ coal_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_copper_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ copper_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_diamond_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ diamond_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_emerald_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ emerald_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_gold_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ gold_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_iron_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ iron_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_lapis_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ lapis_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/ancient_debris.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on ancient_debris # at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ ancient_debris ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/nether_gold_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on nether_gold_ore # at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ nether_gold_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether/nether_quartz_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on nether_quartz_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9 setblock ~ ~ ~ nether_quartz_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_nether_quartz_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on nether_quartz_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ nether_quartz_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/coal_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4 setblock ~ ~ ~ coal_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/copper_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ copper_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_coal_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on coal_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.4 setblock ~ ~ ~ deepslate_coal_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_copper_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on copper_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ deepslate_copper_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_diamond_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ deepslate_diamond_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_emerald_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ deepslate_emerald_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_gold_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ deepslate_gold_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_iron_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ deepslate_iron_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_lapis_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ deepslate_lapis_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/deepslate_redstone_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9 setblock ~ ~ ~ deepslate_redstone_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/diamond_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on diamond_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ diamond_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/emerald_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ emerald_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/gold_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on gold_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ gold_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/iron_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on iron_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.6 setblock ~ ~ ~ iron_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/lapis_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on emerald_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 1.3 setblock ~ ~ ~ lapis_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_overworld/redstone_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore # at command_block location # locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9 setblock ~ ~ ~ redstone_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/mark_redstone_ore.mcfunction ================================================ # @s = none, run by command blocks placed during block_search/search.mcfunction on redstone_ore #at command_block location #locate ores and play sound playsound entity.zombie.attack_iron_door block @a[tag=gm4_has_sensus,distance=..8] ~ ~ ~ 0.05 0.9 setblock ~ ~ ~ redstone_ore ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/block_search/search.mcfunction ================================================ # @s = player with sensus at location of layer to scan # run from sensus_shamir:active fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/coal_ore"} replace coal_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/copper_ore"} replace copper_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/iron_ore"} replace iron_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/gold_ore"} replace gold_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/lapis_ore"} replace lapis_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/redstone_ore"} replace redstone_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/emerald_ore"} replace emerald_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/diamond_ore"} replace diamond_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_coal_ore"} replace deepslate_coal_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_copper_ore"} replace deepslate_copper_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_iron_ore"} replace deepslate_iron_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_gold_ore"} replace deepslate_gold_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_lapis_ore"} replace deepslate_lapis_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_redstone_ore"} replace deepslate_redstone_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_emerald_ore"} replace deepslate_emerald_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_overworld/deepslate_diamond_ore"} replace deepslate_diamond_ore # nether fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_nether/nether_quartz_ore"} replace nether_quartz_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_nether/nether_gold_ore"} replace nether_gold_ore fill ~ ~ ~ ~6 ~ ~6 command_block{auto:1b,Command:"function gm4_sensus_shamir:block_search/mark_nether/ancient_debris"} replace ancient_debris ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'sensus'}}] if items entity @s contents #gm4_sensus_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/barium via #gm4_metallurgy:summon_band/barium loot spawn ~ ~ ~ loot gm4_sensus_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/guidebook/sensus_shamir.json ================================================ { "id": "sensus_shamir", "name": "Sensus Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Sensus_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_sensus_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'sensus'}}" } } ] } }, "obtain_sensus_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'sensus'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.sensus_shamir.description", "fallback": "Sensus enhances mining, by playing sounds from neaby ores." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_sensus_shamir", "obtain_sensus_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.sensus_shamir.usage", "fallback": "The Sensus Shamir is found on Barium Bands. It can be placed onto compasses.\n\nHolding the compass will play sounds from nearby ores in a 7x7x5 area centered at the user." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/sensus"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'sensus'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.sensus", "fallback": "Sensus Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_sensus_shamir/tags/item/valid_items.json ================================================ { "values": [ "minecraft:compass" ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/active.mcfunction ================================================ # @s = players holding a tinker tool # at @s # run from gm4_metallurgy:shamir_in_hand scoreboard players set $success gm4_ml_data 0 execute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:shovels run function gm4_tinker_shamir:tool/shovel execute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:pickaxes run function gm4_tinker_shamir:tool/pickaxe execute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:swords run function gm4_tinker_shamir:tool/sword execute if score $success gm4_ml_data matches 0 if items entity @s weapon.mainhand #minecraft:hoes run function gm4_tinker_shamir:tool/hoe scoreboard players reset $success gm4_ml_data ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'tinker'}}] if items entity @s contents #gm4_tinker_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/clay_ball.mcfunction ================================================ # @s = player holding tinker shovel # at @s # run from tool/shovel clear @s clay_ball 64 give @s clay 16 playsound block.gravel.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/coal.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s coal 63 give @s coal_block 7 playsound block.stone.fall player @s ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/copper_ingot.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s copper_ingot 63 give @s copper_block 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/diamond.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s diamond 63 give @s diamond_block 7 playsound block.glass.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/emerald.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s emerald 63 give @s emerald_block 7 playsound block.glass.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/gold_ingot.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s gold_ingot 63 give @s gold_block 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/gold_nugget.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s gold_nugget 63 give @s gold_ingot 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/iron_ingot.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s iron_ingot 63 give @s iron_block 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/iron_nugget.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s iron_nugget 63 give @s iron_ingot 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/lapis_lazuli.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s lapis_lazuli 63 give @s lapis_block 7 playsound block.stone.fall player @s ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/melon_slice.mcfunction ================================================ # @s = player holding tinker hoe # at @s # run from tool/hoe clear @s melon_slice 63 give @s melon 7 playsound minecraft:block.pumpkin.carve ambient @a ~ ~ ~ 0.2 0.2 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/netherite_ingot.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s netherite_ingot 63 give @s netherite_block 7 playsound block.metal.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_copper.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s raw_copper 63 give @s raw_copper_block 7 playsound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_gold.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s raw_gold 63 give @s raw_gold_block 7 playsound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/raw_iron.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s raw_iron 63 give @s raw_iron_block 7 playsound block.stone.fall ambient @a ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/redstone.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from tool/pickaxe clear @s redstone 63 give @s redstone_block 7 playsound block.stone.fall player @s ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/slime_ball.mcfunction ================================================ # @s = player holding tinker sword # at @s # run from tool/sword clear @s slime_ball 63 give @s slime_block 7 playsound minecraft:block.slime_block.fall player @s ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/snowball.mcfunction ================================================ # @s = player holding tinker shovel # at @s # run from tool/shovel clear @s snowball 16 give @s snow_block 4 playsound block.snow.fall player @s ~ ~ ~ 0.2 0.8 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/compact/wheat.mcfunction ================================================ # @s = player holding tinker hoe # at @s # run from tool/hoe clear @s wheat 63 give @s hay_block 7 playsound minecraft:block.pumpkin.carve ambient @a ~ ~ ~ 0.2 0.2 scoreboard players set $success gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/curies_bismium via #gm4_metallurgy:summon_band/curies_bismium loot spawn ~ ~ ~ loot gm4_tinker_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/tool/hoe.mcfunction ================================================ # @s = player holding tinker shovel # at @s # run from gm4_tinker_shamir:active # check for compacting operations execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/melon_slice run function gm4_tinker_shamir:compact/melon_slice execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/wheat run function gm4_tinker_shamir:compact/wheat ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/tool/pickaxe.mcfunction ================================================ # @s = player holding tinker pickaxe # at @s # run from gm4_tinker_shamir:active # check for compacting operations execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/netherite_ingot run function gm4_tinker_shamir:compact/netherite_ingot execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/emerald run function gm4_tinker_shamir:compact/emerald execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/diamond run function gm4_tinker_shamir:compact/diamond execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/redstone run function gm4_tinker_shamir:compact/redstone execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/coal run function gm4_tinker_shamir:compact/coal execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/lapis_lazuli run function gm4_tinker_shamir:compact/lapis_lazuli execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/iron_ingot run function gm4_tinker_shamir:compact/iron_ingot execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/gold_ingot run function gm4_tinker_shamir:compact/gold_ingot execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/iron_nugget run function gm4_tinker_shamir:compact/iron_nugget execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/gold_nugget run function gm4_tinker_shamir:compact/gold_nugget execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/copper_ingot run function gm4_tinker_shamir:compact/copper_ingot execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_iron run function gm4_tinker_shamir:compact/raw_iron execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_gold run function gm4_tinker_shamir:compact/raw_gold execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/raw_copper run function gm4_tinker_shamir:compact/raw_copper ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/tool/shovel.mcfunction ================================================ # @s = player holding tinker shovel # at @s # run from gm4_tinker_shamir:active # check for compacting operations execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/snowball run function gm4_tinker_shamir:compact/snowball execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/clay_ball run function gm4_tinker_shamir:compact/clay_ball ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/function/tool/sword.mcfunction ================================================ # @s = player holding tinker sword # at @s # run from gm4_tinker_shamir:active # check for compacting operations execute if score $success gm4_ml_data matches 0 if predicate gm4_tinker_shamir:has_full_stack/slime_ball run function gm4_tinker_shamir:compact/slime_ball ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/guidebook/tinker_shamir.json ================================================ { "id": "tinker_shamir", "name": "Tinker Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Tinker_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_tinker_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'tinker'}}" } } ] } }, "obtain_tinker_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'tinker'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.tinker_shamir.description", "fallback": "Tinker causes items to be converted to their equivalent storage block form." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_tinker_shamir", "obtain_tinker_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.tinker_shamir.usage", "fallback": "The Tinker Shamir is found on Curie's Bismium Bands. It can be placed onto pickaxes, shovels, hoes, and swords.\n\nHolding the tool will convert items into their block form, such as iron ingots to iron blocks." } ], [ { "translate": "text.gm4.guidebook.tinker_shamir.usage_pickaxes", "fallback": "Each tool tinkers a set of items, matching the tool.\n\nPickaxes will tinker emeralds, diamonds, redstone, coal, lapis, gold ingots, iron ingots, gold nuggets, and iron nuggets." } ], [ { "translate": "text.gm4.guidebook.tinker_shamir.usage_other_tools", "fallback": "Shovels will tinker snow balls and clay balls.\n\nHoes will tinker melon slices and wheat.\n\nSwords will tinker slime balls." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:curies_bismium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/tinker"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'tinker'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.tinker", "fallback": "Tinker Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/clay_ball.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:clay_ball", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:clay_ball", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:clay_ball", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/coal.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:coal", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:coal", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:coal", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/copper_ingot.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:copper_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:copper_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:copper_ingot", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/diamond.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:diamond", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:diamond", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:diamond", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/emerald.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:emerald", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:emerald", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:emerald", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/gold_ingot.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:gold_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:gold_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:gold_ingot", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/gold_nugget.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:gold_nugget", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:gold_nugget", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:gold_nugget", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/iron_ingot.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:iron_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:iron_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:iron_ingot", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/iron_nugget.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:iron_nugget", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:iron_nugget", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:iron_nugget", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/lapis_lazuli.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:lapis_lazuli", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:lapis_lazuli", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:lapis_lazuli", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/melon_slice.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:melon_slice", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:melon_slice", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:melon_slice", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/netherite_ingot.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:netherite_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:netherite_ingot", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:netherite_ingot", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_copper.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:raw_copper", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:raw_copper", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:raw_copper", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_gold.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:raw_gold", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:raw_gold", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:raw_gold", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/raw_iron.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:raw_iron", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:raw_iron", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:raw_iron", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/redstone.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:redstone", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:redstone", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:redstone", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/slime_ball.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:slime_ball", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:slime_ball", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:slime_ball", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/snowball.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:snowball", "count": 16 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:snowball", "count": 16 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:snowball", "count": 16 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/predicate/has_full_stack/wheat.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "container.*": { "items": "minecraft:wheat", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "armor.*": { "items": "minecraft:wheat", "count": 64 } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.offhand": { "items": "minecraft:wheat", "count": 64 } } } } ] } ================================================ FILE: gm4_metallurgy/data/gm4_tinker_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:hoes", "#minecraft:pickaxes", "#minecraft:shovels", "#minecraft:swords" ] } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/advancement/vibro_fall_damage.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:entity_hurt_player", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": "this", "score": "gm4_vibro_fall" }, "range": { "min": 300 } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true }, "equipment": { "feet": { "items": "#minecraft:foot_armor", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'vibro'}}" } } } } } ] } } }, "rewards": { "function": "gm4_vibro_shamir:shockwave" } } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/active.mcfunction ================================================ # @s = players wearing vibro boots # run from metallurgy:shamir_equipped tag @s add gm4_has_vibro ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vibro'}}] if items entity @s contents #gm4_vibro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/desire_lines.mcfunction ================================================ # @s = player who used vibro # run from shockwave # center block is guaranteed function gm4_desire_lines:path # 3x3 area has a 50% chance to convert execute positioned ~-1 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~ ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~1 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~-1 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~1 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~-1 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~ ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path execute positioned ~1 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_high run function gm4_desire_lines:path # 5x5 border has 25% chance to convert execute positioned ~-2 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-1 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~ ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~1 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~2 ~ ~-2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-2 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~2 ~ ~-1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-2 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~2 ~ ~ if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-2 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~2 ~ ~1 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-2 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~-1 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~ ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~1 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path execute positioned ~2 ~ ~2 if predicate gm4_vibro_shamir:desire_lines_chance_low run function gm4_desire_lines:path ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/jump.mcfunction ================================================ # @s = vibro player sneaking on the ground # run from gm4_metallurgy:tick # add sneak number scoreboard players add @s gm4_vibro_sneak 1 # apply jump boost based on sneak number attribute @s[scores={gm4_vibro_sneak=1}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.4 add_value attribute @s[scores={gm4_vibro_sneak=6}] jump_strength modifier remove gm4_vibro_shamir:jump_boost attribute @s[scores={gm4_vibro_sneak=6}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.6 add_value attribute @s[scores={gm4_vibro_sneak=11}] jump_strength modifier remove gm4_vibro_shamir:jump_boost attribute @s[scores={gm4_vibro_sneak=11}] jump_strength modifier add gm4_vibro_shamir:jump_boost 0.7 add_value attribute @s[scores={gm4_vibro_sneak=16}] jump_strength modifier remove gm4_vibro_shamir:jump_boost attribute @s[scores={gm4_vibro_sneak=16}] jump_strength modifier add gm4_vibro_shamir:jump_boost 1.0 add_value # playsound (A Major Scale) execute if score @s gm4_vibro_sneak matches 1 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.189207 execute if score @s gm4_vibro_sneak matches 6 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.259921 execute if score @s gm4_vibro_sneak matches 11 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.334840 execute if score @s gm4_vibro_sneak matches 16 run playsound minecraft:block.stone.step block @a[distance=..8] ~ ~ ~ 0.6 1.498307 ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/remove_jump.mcfunction ================================================ # @s = vibro player no longer sneaking on the ground # run from gm4_metallurgy:tick scoreboard players reset @s gm4_vibro_sneak attribute @s jump_strength modifier remove gm4_vibro_shamir:jump_boost ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/activate.mcfunction ================================================ # @s = none # located at world spawn # run from shockwave execute as @a[scores={gm4_vibro_shock=1..}] at @s run function gm4_vibro_shamir:shock/user scoreboard players reset @a gm4_vibro_shock ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/apply_mob.mcfunction ================================================ # @s = mob that will take damage from a vibro shockwave # run from shock/calculate # apply new health execute store result score $health gm4_vibro_shock run data get entity @s Health 100 scoreboard players operation $health gm4_vibro_shock -= $shockwave gm4_vibro_shock execute if score $health gm4_vibro_shock matches 1.. run execute store result entity @s Health float .01 run scoreboard players get $health gm4_vibro_shock execute if score $health gm4_vibro_shock matches ..0 run kill @s # knockback mob ## get player pos data modify storage gm4_vibro_shamir:temp Pos set from entity @a[tag=gm4_vibro_user,limit=1] Pos execute store result score $target_x gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[0] execute store result score $target_z gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[2] ## get vector data modify storage gm4_vibro_shamir:temp Pos set from entity @s Pos execute store result score $motion_x gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[0] execute store result score $motion_z gm4_vibro_shock run data get storage gm4_vibro_shamir:temp Pos[2] scoreboard players operation $motion_x gm4_vibro_shock -= $target_x gm4_vibro_shock scoreboard players operation $motion_z gm4_vibro_shock -= $target_z gm4_vibro_shock ## set motion execute store result entity @s[tag=!smithed.strict] Motion[0] double 0.2 run scoreboard players get $motion_x gm4_vibro_shock execute store result entity @s[tag=!smithed.strict] Motion[2] double 0.2 run scoreboard players get $motion_z gm4_vibro_shock data modify entity @s[tag=!smithed.strict] Motion[1] set value 0.35d ## clean up data remove storage gm4_vibro_shamir:temp Pos # visuals effect give @s resistance 1 4 true effect give @s[type=#minecraft:undead] instant_health effect give @s[type=!#minecraft:undead] instant_damage playsound minecraft:entity.player.attack.crit player @a[distance=..8] ~ ~ ~ 1 1.4 particle minecraft:crit ~ ~.5 ~ 0 0 0 .5 20 particle minecraft:damage_indicator ~ ~.5 ~ 0 0 0 .5 5 tag @a[tag=gm4_vibro_user,limit=1] add gm4_vibro_shock ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/apply_player.mcfunction ================================================ # @s = player that will take damage from a vibro shockwave # run from shock/calculate tag @s add gm4_vibro_attacked # calculate new health execute store result score $health gm4_vibro_shock run data get entity @s Health 100 scoreboard players operation $health gm4_vibro_shock -= $shockwave gm4_vibro_shock scoreboard players operation $health gm4_vibro_shock /= #100 gm4_vibro_shock # calculate amount of max_health to remove to get to new health execute store result score $remove_health gm4_vibro_shock run attribute @s minecraft:max_health get scoreboard players operation $remove_health gm4_vibro_shock -= $health gm4_vibro_shock # lower player's max health to their new health execute if score $remove_health gm4_vibro_shock matches 512.. run attribute @s minecraft:max_health modifier add minecraft:ff6db900-dbd6-47bd-9219-66c7282a84af -512 add_value execute if score $remove_health gm4_vibro_shock matches 512.. run scoreboard players remove $remove_health gm4_vibro_shock 512 execute if score $remove_health gm4_vibro_shock matches 256.. run attribute @s minecraft:max_health modifier add minecraft:c45a7b6f-ac1c-44b4-8d5f-bc4aaa743f80 -256 add_value execute if score $remove_health gm4_vibro_shock matches 256.. run scoreboard players remove $remove_health gm4_vibro_shock 256 execute if score $remove_health gm4_vibro_shock matches 128.. run attribute @s minecraft:max_health modifier add minecraft:fb369a6d-7026-4274-9888-d2e1c66a5959 -128 add_value execute if score $remove_health gm4_vibro_shock matches 128.. run scoreboard players remove $remove_health gm4_vibro_shock 128 execute if score $remove_health gm4_vibro_shock matches 64.. run attribute @s minecraft:max_health modifier add minecraft:9dd58507-2a53-4ab6-8688-b0fa0be103ab -64 add_value execute if score $remove_health gm4_vibro_shock matches 64.. run scoreboard players remove $remove_health gm4_vibro_shock 64 execute if score $remove_health gm4_vibro_shock matches 32.. run attribute @s minecraft:max_health modifier add minecraft:54197d85-31a1-4862-b63a-39d7e6249656 -32 add_value execute if score $remove_health gm4_vibro_shock matches 32.. run scoreboard players remove $remove_health gm4_vibro_shock 32 execute if score $remove_health gm4_vibro_shock matches 16.. run attribute @s minecraft:max_health modifier add minecraft:8e3c149e-0e7c-452e-b0c1-729289c27838 -16 add_value execute if score $remove_health gm4_vibro_shock matches 16.. run scoreboard players remove $remove_health gm4_vibro_shock 16 execute if score $remove_health gm4_vibro_shock matches 8.. run attribute @s minecraft:max_health modifier add minecraft:30aabc20-f152-4399-ae1f-25c5d2bc4ab6 -8 add_value execute if score $remove_health gm4_vibro_shock matches 8.. run scoreboard players remove $remove_health gm4_vibro_shock 8 execute if score $remove_health gm4_vibro_shock matches 4.. run attribute @s minecraft:max_health modifier add minecraft:552ce249-02c9-44ff-a7c7-1c85b84d56aa -4 add_value execute if score $remove_health gm4_vibro_shock matches 4.. run scoreboard players remove $remove_health gm4_vibro_shock 4 execute if score $remove_health gm4_vibro_shock matches 2.. run attribute @s minecraft:max_health modifier add minecraft:4da9ec81-1250-437d-bd99-57be649410e3 -2 add_value execute if score $remove_health gm4_vibro_shock matches 2.. run scoreboard players remove $remove_health gm4_vibro_shock 2 execute if score $remove_health gm4_vibro_shock matches 1.. run attribute @s minecraft:max_health modifier add minecraft:66ff51d4-70ad-4213-84ce-21b7b48fa316 -1 add_value execute if score $remove_health gm4_vibro_shock matches 1.. run scoreboard players remove $remove_health gm4_vibro_shock 1 # update the player's health effect give @s minecraft:instant_health 1 0 true effect give @s instant_damage 1 3 true execute if score $health gm4_vibro_shock matches 1.. run effect give @s resistance 1 4 true execute if score $health gm4_vibro_shock matches ..0 run function gm4_vibro_shamir:shock/revert_health # visuals playsound minecraft:entity.player.attack.crit player @a[distance=..8] ~ ~ ~ 1 1.4 particle minecraft:crit ~ ~.5 ~ 0 0 0 .5 20 particle minecraft:damage_indicator ~ ~.5 ~ 0 0 0 .5 5 tag @a[tag=gm4_vibro_user,limit=1] add gm4_vibro_shock # revert max health attribute schedule function gm4_vibro_shamir:shock/check_shock 1t ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/calculate.mcfunction ================================================ # @s = mob within 6 blocks of a vibro shockwave # run from shock/activate # raycast to the vibro player summon marker ~ ~ ~ {CustomName:"gm4_vibro_ray",Tags:["gm4_vibro_ray"]} execute as @e[type=marker,tag=gm4_vibro_ray,limit=1] at @s run function gm4_vibro_shamir:shock/ray_execute # damage dealt to the vibro player is multiplied by 2 and divided by the distance+dampening scoreboard players operation $shockwave gm4_vibro_shock = $damage gm4_vibro_shock scoreboard players operation $shockwave gm4_vibro_shock *= #shock_multiplier gm4_vibro_shock scoreboard players operation $shockwave gm4_vibro_shock /= $ray gm4_vibro_shock # if damage was more than .5 health (.25 hearts), damage the mob execute if score $shockwave gm4_vibro_shock matches 50.. unless entity @s[type=player] run function gm4_vibro_shamir:shock/apply_mob execute if score $shockwave gm4_vibro_shock matches 50.. if entity @s[type=player,gamemode=!spectator,gamemode=!creative] run function gm4_vibro_shamir:shock/apply_player ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/check_shock.mcfunction ================================================ # @s = none # located at world spawn # run from shock/apply_player execute as @a[tag=gm4_vibro_attacked] run function gm4_vibro_shamir:shock/revert_health ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/ray.mcfunction ================================================ # @s = ray casting marker # run from shock/ray_execute scoreboard players add $ray gm4_vibro_shock 1 execute if block ~ ~ ~ #gm4:full_collision run scoreboard players add $ray gm4_vibro_shock 2 execute unless block ~ ~ ~ #gm4:full_collision unless block ~ ~ ~ #gm4:no_collision run scoreboard players add $ray gm4_vibro_shock 1 execute if score $ray gm4_vibro_shock matches 0..12 unless entity @a[tag=gm4_vibro_user,distance=..0.6,limit=1] positioned ^ ^ ^0.5 run function gm4_vibro_shamir:shock/ray ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/ray_execute.mcfunction ================================================ # @s = vibro ray marker # run from shock/calculate execute facing entity @a[tag=gm4_vibro_user,limit=1] feet run tp @s ~ ~ ~ ~ ~ scoreboard players reset $ray gm4_vibro_shock execute at @s run function gm4_vibro_shamir:shock/ray kill @s ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/revert_health.mcfunction ================================================ # @s = player that was attacked by vibro # run from shock/check_shock # revert max health attribute @s minecraft:max_health modifier remove minecraft:ff6db900-dbd6-47bd-9219-66c7282a84af attribute @s minecraft:max_health modifier remove minecraft:c45a7b6f-ac1c-44b4-8d5f-bc4aaa743f80 attribute @s minecraft:max_health modifier remove minecraft:fb369a6d-7026-4274-9888-d2e1c66a5959 attribute @s minecraft:max_health modifier remove minecraft:9dd58507-2a53-4ab6-8688-b0fa0be103ab attribute @s minecraft:max_health modifier remove minecraft:54197d85-31a1-4862-b63a-39d7e6249656 attribute @s minecraft:max_health modifier remove minecraft:8e3c149e-0e7c-452e-b0c1-729289c27838 attribute @s minecraft:max_health modifier remove minecraft:30aabc20-f152-4399-ae1f-25c5d2bc4ab6 attribute @s minecraft:max_health modifier remove minecraft:552ce249-02c9-44ff-a7c7-1c85b84d56aa attribute @s minecraft:max_health modifier remove minecraft:4da9ec81-1250-437d-bd99-57be649410e3 attribute @s minecraft:max_health modifier remove minecraft:66ff51d4-70ad-4213-84ce-21b7b48fa316 tag @s remove gm4_vibro_attacked ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shock/user.mcfunction ================================================ # @s = player who used vibro # run from shock/activate # set up player tag @s add gm4_vibro_user scoreboard players operation $damage gm4_vibro_shock = @s gm4_vibro_shock # calculate damage dealt to mobs execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!gm4_vibro_user,distance=..6] at @s run function gm4_vibro_shamir:shock/calculate # visuals particle minecraft:cloud ~ ~.3 ~ 0.2 0.2 0.2 0.1 20 particle minecraft:smoke ~ ~.3 ~ 0.3 0.3 0.3 0.02 40 particle minecraft:mycelium ~ ~ ~ 1 1 1 5 50 particle minecraft:dust_color_transition{from_color:[0.239,0.251,0.247],to_color:[1.000,0.996,0.961],scale:1} ~ ~.2 ~ 2 0 2 0 200 playsound minecraft:item.shovel.flatten block @a[distance=..8] ~ ~ ~ 1 0.1 execute if entity @s[tag=gm4_vibro_shock] run playsound minecraft:item.totem.use player @a[distance=..8] ~ ~ ~ 0.1 2 # clean up tag @s remove gm4_vibro_shock tag @s remove gm4_vibro_user ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/shockwave.mcfunction ================================================ # @s = player wearing vibro boots that just took fall damage while sneaking # run from advancement vibro_fall_damage advancement revoke @s only gm4_vibro_shamir:vibro_fall_damage # jump boost cooldown scoreboard players set @s gm4_vibro_sneak -10 # hurt mobs scoreboard players operation @s gm4_vibro_shock = @s gm4_vibro_hurt scoreboard players operation @s gm4_vibro_shock += @s gm4_vibro_absorb schedule function gm4_vibro_shamir:shock/activate 1t # terminate if desire lines is not installed execute unless score gm4_desire_lines load.status matches 1.. run return 1 # desire lines is installed, apply guarenteed effect (unless the player has some strong desire lines inhibiting item) in a 5x5 # | the inverse sneak penalty is not enough to cicumvent desire lines in this case scoreboard players set $probability gm4_desire_lines 100 scoreboard players operation $probability gm4_desire_lines -= #sneak_penality gm4_desire_lines function #gm4_desire_lines:expansion execute if predicate {"condition":"minecraft:random_chance","chance":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$probability"},"score":"gm4_desire_lines","scale":0.01}} run function gm4_vibro_shamir:desire_lines ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/thorium via #gm4_metallurgy:summon_band/thorium loot spawn ~ ~ ~ loot gm4_vibro_shamir:band ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/guidebook/vibro_shamir.json ================================================ { "id": "vibro_shamir", "name": "Vibro Shamir", "module_type": "expansion", "load_check": "metallurgy", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Vibro_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_vibro_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vibro'}}" } } ] } }, "obtain_vibro_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vibro'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.vibro_shamir.description", "fallback": "Vibro grants high jumps and creates deadly shockwaves." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_vibro_shamir", "obtain_vibro_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.vibro_shamir.usage", "fallback": "The Vibro Shamir is found on Thorium Bands. It can be placed onto boots.\n\nWhen sneaking, users who take fall damage will hurt mobs within a 6 block radius. Damage is based on distance from the user and the blocks between." } ], [ { "translate": "text.gm4.guidebook.vibro_shamir.jump_boost", "fallback": "Sneaking on the ground will allow the user to gain temporary jump boost. The level of jump boost is dependent on the sneak time.\n\nWhen using the Vibro Jump, the user will take damage when landing." } ] ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:thorium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_metallurgy:shamir/vibro"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'vibro'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.vibro", "fallback": "Vibro Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/predicate/desire_lines_chance_high.json ================================================ { "condition": "random_chance", "chance": 0.5 } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/predicate/desire_lines_chance_low.json ================================================ { "condition": "random_chance", "chance": 0.25 } ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/predicate/sneak_on_ground.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "stepping_on": { "block": { "blocks": "#gm4:no_collision" } } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } } ] ================================================ FILE: gm4_metallurgy/data/gm4_vibro_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:foot_armor" ] } ================================================ FILE: gm4_metallurgy/data/minecraft/loot_table/blocks/andesite.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:item", "name": "minecraft:andesite" } ], "conditions": [ { "condition": "minecraft:survives_explosion" }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } } ] }, { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bauxite_lump", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.1 } ] }, { "type": "minecraft:item", "name": "minecraft:andesite", "conditions": [ { "condition": "minecraft:survives_explosion" } ] } ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } ] } ] } ], "random_sequence": "minecraft:blocks/andesite", "__smithed__": { "rules": [ { "type": "smithed:append", "target": "pools[0].conditions", "source": { "type": "smithed:reference", "path": "pools[0].conditions[1]" } }, { "type": "smithed:append", "target": "pools", "source": { "type": "smithed:reference", "path": "pools[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_metallurgy/data/minecraft/loot_table/blocks/deepslate.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ], "name": "minecraft:deepslate" }, { "type": "minecraft:loot_table", "value": "gm4_forterra_shamir:deepslate", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}" } } } ] }, { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:survives_explosion" } ], "name": "minecraft:cobbled_deepslate" } ] } ] } ], "random_sequence": "minecraft:blocks/deepslate", "__smithed__": { "rules": [ { "type": "smithed:insert", "index": 1, "target": "pools[0].entries[0].children", "source": { "type": "smithed:reference", "path": "pools[0].entries[0].children[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_metallurgy/data/minecraft/loot_table/blocks/diorite.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:item", "name": "minecraft:diorite" } ], "conditions": [ { "condition": "minecraft:survives_explosion" }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } } ] }, { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:thorianite_lump", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.1 } ] }, { "type": "minecraft:item", "name": "minecraft:diorite", "conditions": [ { "condition": "minecraft:survives_explosion" } ] } ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } ] } ] } ], "random_sequence": "minecraft:blocks/diorite", "__smithed__": { "rules": [ { "type": "smithed:append", "target": "pools[0].conditions", "source": { "type": "smithed:reference", "path": "pools[0].conditions[1]" } }, { "type": "smithed:append", "target": "pools", "source": { "type": "smithed:reference", "path": "pools[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_metallurgy/data/minecraft/loot_table/blocks/granite.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:item", "name": "minecraft:granite" } ], "conditions": [ { "condition": "minecraft:survives_explosion" }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } } ] }, { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:baryte_lump", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.1 } ] }, { "type": "minecraft:item", "name": "minecraft:granite", "conditions": [ { "condition": "minecraft:survives_explosion" } ] } ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:tnt" } } ] } ] } ], "random_sequence": "minecraft:blocks/granite", "__smithed__": { "rules": [ { "type": "smithed:append", "target": "pools[0].conditions", "source": { "type": "smithed:reference", "path": "pools[0].conditions[1]" } }, { "type": "smithed:append", "target": "pools", "source": { "type": "smithed:reference", "path": "pools[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_metallurgy/data/minecraft/loot_table/blocks/stone.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } } ], "name": "minecraft:stone" }, { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bismutite_lump", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": [ "minecraft:tnt", "minecraft:creeper", "minecraft:wither", "minecraft:wither_skull" ] } }, { "condition": "minecraft:random_chance", "chance": 0.1 } ] }, { "type": "minecraft:loot_table", "value": "gm4_forterra_shamir:stone", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'forterra'}}" } } } ] }, { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:survives_explosion" } ], "name": "minecraft:cobblestone" } ] } ] } ], "random_sequence": "minecraft:blocks/stone", "__smithed__": { "rules": [ { "type": "smithed:insert", "index": 1, "target": "pools[0].entries[0].children", "source": { "type": "smithed:reference", "path": "pools[0].entries[0].children[2]" } }, { "type": "smithed:insert", "index": 1, "target": "pools[0].entries[0].children", "source": { "type": "smithed:reference", "path": "pools[0].entries[0].children[1]" } } ], "priority": { "default": 0 } } } ================================================ FILE: gm4_metallurgy/mod.mcdoc ================================================ use ::java::world::item::ItemStack use ::java::world::component::DataComponentPatch dispatch minecraft:storage[gm4_arborenda_shamir:temp] to struct { tool?: ItemStack, damage?: int, } dispatch minecraft:storage[gm4_infinitas_shamir:bucket] to struct { fish_data?: DataComponentPatch, } dispatch minecraft:storage[gm4_metallurgy:temp/item/cast] to struct { stored_shamir?: string, recasted_shamir?: string, } dispatch minecraft:storage[gm4_metallurgy:temp/item/ore] to struct { gm4_metallurgy?: CustomData, } dispatch minecraft:storage[gm4_vibro_shamir:temp] to struct { Pos?: [double] @ 3, } dispatch mcdoc:custom_data[gm4_metallurgy] to struct CustomData { has_shamir?: 1b, active_shamir?: string, stored_shamir?: string, ore_type?: MetalType, custom_model_data?: int, item?: ItemType, metal?: struct { type: MetalType, amount?: [short], castable?: 1b, }, } type ItemType = ("ore" | "obsidian_cast") type MetalType = ("aluminium" | "barimium" | "barium" | "bismuth" | "copper" | "curies_bismium" | "thorium_brass" | "thorium") ================================================ FILE: gm4_metallurgy/shamir_model_template.py ================================================ from beet import Context, Model, NamespaceProxy, ListOption, ResourcePack from beet.contrib.vanilla import Vanilla, ClientJar from beet.contrib.optifine import OptifineProperties from typing import Any, ClassVar, Literal from itertools import product, chain, count import re import logging from copy import deepcopy from gm4.plugins.resource_pack import ModelData, TemplateOptions, JsonType from gm4.utils import add_namespace, MapOption parent_logger = logging.getLogger("gm4."+__name__) TOOL_MATERIALS = ["wooden", "stone", "copper", "iron", "golden", "diamond", "netherite"] ARMOR_MATERIALS = ["leather", "copper", "chainmail", "iron", "golden", "diamond", "netherite"] TOOLS = ["axe", "hoe", "pickaxe", "shovel"] ARMOR = ["boots", "chestplate", "helmet", "leggings"] BUCKETABLE = ["water", "lava", "milk", "powder_snow", "cod", "salmon", "pufferfish", "tropical_fish", "tadpole", "axolotl"] TEXTURELESS = ["shield"] # item model is unable to receive layer in vanilla SPECIAL_MODEL_IGNORES = ["shield"] # models with special case handling, that cannot be customized with resource packs the way we want. # define item group lookups GROUP_LOOKUP = { "armor": [f"{material}_{armor}" for material, armor in product(ARMOR_MATERIALS, ARMOR)] + ["turtle_helmet"], "tools": [f"{material}_{tool}" for material, tool in product(TOOL_MATERIALS, TOOLS)], "weapons": [f"{material}_{weapon}" for material, weapon in product(TOOL_MATERIALS, ["sword", "axe"])] + ["trident"], "pickaxes": [f"{material}_pickaxe" for material in TOOL_MATERIALS], "shovels": [f"{material}_shovel" for material in TOOL_MATERIALS], "axes": [f"{material}_axe" for material in TOOL_MATERIALS], "hoes": [f"{material}_hoe" for material in TOOL_MATERIALS], "swords": [f"{material}_sword" for material in TOOL_MATERIALS], "boots": [f"{material}_boots" for material in ARMOR_MATERIALS], "leggings": [f"{material}_leggings" for material in ARMOR_MATERIALS], "chestplates": [f"{material}_chestplate" for material in ARMOR_MATERIALS], "helmets": [f"{material}_helmet" for material in ARMOR_MATERIALS] + ["turtle_helmet"], "buckets": [f"{substance}_bucket" for substance in BUCKETABLE] + ["bucket"] } TEXTURE_LOOKUP = { # what texture to use if the exact item name is not present item: "boots" for item in GROUP_LOOKUP["boots"]} | { item: "leggings" for item in GROUP_LOOKUP["leggings"]} | { item: "chestplate" for item in GROUP_LOOKUP["chestplates"]} | { item: "helmet" for item in GROUP_LOOKUP["helmets"]} | { item: "pickaxe" for item in GROUP_LOOKUP["pickaxes"]} | { item: "shovel" for item in GROUP_LOOKUP["shovels"]} | { item: "axe" for item in GROUP_LOOKUP["axes"]} | { item: "hoe" for item in GROUP_LOOKUP["hoes"]} | { item: "sword" for item in GROUP_LOOKUP["swords"]} | { item: "bucket" for item in GROUP_LOOKUP["buckets"]} | { "recovery_compass": "compass", "carrot_on_a_stick": "fishing_rod", "warped_fungus_on_a_stick": "fishing_rod" } class ShamirTemplate(TemplateOptions): """Model Template for generating models for shamirs on tools/armor""" name: Literal["shamir"] = "shamir" texture_map = ["", "band"] textures_path: str = "" # directory of texture files to use for shamirs, falling back to the default metallurgy textures metal: Literal["aluminium", "barimium", "barium", "bismuth", "curies_bismium", "thorium"] # the metallurgy metal this shamir is made of _item_def_map: dict[str, JsonType] = {} bound_ctx: ClassVar[Context] metallurgy_assets: ClassVar[ResourcePack] = ResourcePack(path="gm4_metallurgy") # load metallurgy textures so expansion shamirs can fall back on their vanilla_models_jar: ClassVar[ClientJar] def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]) -> list[Model]: logger = parent_logger.getChild(self.bound_ctx.project_id) models_loc = f"{config.reference}" models: dict[str, str] = {} # the value of config.models to be applied after going through special cases ret_list: list[Model] = [] for item in config.item.entries(): if item == "player_head": # create the band item-model, which shares the same CMD as all the tools/armor m = Model({ "parent": "item/generated", "textures": { "layer0": config.textures["band"] } }) models_container[f"{models_loc}/band"] = m ret_list.append(m) models.update({"player_head": f"{models_loc}/band"}) continue # find the texture to use; first in this module at the path directed if (t:=add_namespace(f"{self.textures_path}/{item}" , self.bound_ctx.project_id)) in self.bound_ctx.assets.textures: # check for the item exactly texture = t elif (t:=add_namespace(f"{self.textures_path}/{TEXTURE_LOOKUP.get(item)}" , self.bound_ctx.project_id)) in self.bound_ctx.assets.textures: # check for a generic "axe" texture texture = t # then in the base gm4_metallurgy textures elif (t:=add_namespace(f"item/shamir/{self.metal}/{item}" , "gm4_metallurgy")) in self.metallurgy_assets.textures: # check for the item exactly texture = t logger.debug(f"An appropiate texture for '{item}' could not be found in {self.textures_path}, falling back to the texture {t}") elif (t:=add_namespace(f"item/shamir/{self.metal}/{TEXTURE_LOOKUP.get(item)}" , "gm4_metallurgy")) in self.metallurgy_assets.textures: # check for a generic "axe" texture texture = t logger.debug(f"An appropiate texture for '{item}' could not be found in {self.textures_path}, falling back to the texture {t}") else: if item not in TEXTURELESS: logger.warning(f"No shamir texture for '{item}' could be found!") texture = "gm4:item/empty" # generate the models, using the vanilla models as a base total_layers = 0 # number of texture layers in vanilla base_layers = 0 # number of texture layers on the simplest item ie trim-less armor if item in GROUP_LOOKUP["armor"]: total_layers = 1 # put the texture above the trims base_layers = 0 # untrimmed armor has no layer1 if item.startswith("leather"): total_layers = 2 # and the dyed portion base_layers = 1 m = Model({ "parent": f"minecraft:item/{item}", "textures": { f"layer{base_layers+1}": texture } }) models_container[f"{models_loc}/{item}"] = m ret_list.append(m) # define recursive search function for looking at vanilla item definitions to copy/modify def recursive_extract_variants(json: dict[str, Any]) -> tuple[list[str], list[Any]]: ret_variants: list[str] = [] ret_pointers: list[Any] = [] for val in json.values(): match val: case {"type": "minecraft:model", "model": str(m)}: ret_variants.append(m.split('/')[-1]) # ie, iron_chestplate_quartz_trim, fishing_rod_cast, compass_00, elytra_broken ect... ret_pointers.append(val) case list()|dict(): # val is dict, or list of dicts for elem in val if isinstance(val, list) else [val]: # type: ignore ; this is json if isinstance(elem, dict): rec_varis, rec_pts = recursive_extract_variants(elem) # type: ignore ; this is json ret_variants.extend(rec_varis) ret_pointers.extend(rec_pts) case _: pass return ret_variants, ret_pointers # create texture variants, using the vanilla item definition as a template mutatable_itemdef_copy = deepcopy(self.vanilla_models_jar.assets.item_models[f"minecraft:{item}"].data["model"]) item_variants, itemdef_compounds = recursive_extract_variants(mutatable_itemdef_copy) for item_variant, itemdef_compound in zip(item_variants, itemdef_compounds): texture_variant = ('/'.join(texture.split('/')[0:-1] + [item_variant])) # is there an explicit texture for this variant. ie broken_elytra.png? variant_tex_exists = texture_variant in self.bound_ctx.assets.textures or texture_variant in self.metallurgy_assets.textures if (variant_path:=f"{models_loc}/{item_variant}") not in models_container: # create a new model file if one does not exist m = Model({ "parent": f"minecraft:item/{item_variant}", "textures": { f"layer{total_layers+1}": texture_variant if variant_tex_exists else texture } }) models_container[f"{models_loc}/{item_variant}"] = m ret_list.append(m) itemdef_compound["model"] = variant_path # update our copy to point to the new model if item_variants: self._item_def_map[item] = mutatable_itemdef_copy models.update({item: "NULL"}) # actual model paths contained within itemdef compound elif item in SPECIAL_MODEL_IGNORES: # use the vanilla item-def anyway self._item_def_map[item] = mutatable_itemdef_copy models.update({item: "NULL"}) # actual model paths contained within itemdef compound else: models.update({item: f"{models_loc}/{item}"}) config.model = MapOption(models) return ret_list def get_item_def_entry(self, config: ModelData, item: str) -> None|JsonType: # TODO fill me out, replacing ComplexBypass return self._item_def_map.get(item) def mutate_config(self, config: ModelData): expanded_items = set(chain.from_iterable([GROUP_LOOKUP.get(group, [group]) for group in config.item.entries()])) | {"player_head"} config.item = ListOption(list(expanded_items)) config.model = MapOption({item: config.reference for item in expanded_items}) if isinstance(config.textures.root, list): config.textures = MapOption({"band": f"gm4_metallurgy:item/band/{self.metal}_band"}) else: # isinstance(.., dict): config.textures = MapOption({"band": f"gm4_metallurgy:item/band/{self.metal}_band"}|config.textures.root) def optifine_armor_properties_merging(pack: ResourcePack, path: str, current: OptifineProperties, conflict: OptifineProperties) -> bool: if not path.startswith("gm4_metallurgy:cit"): # only apply this rule to metallurgy files return False merged = current.text.splitlines() pattern = re.compile(r"^nbt.CustomModelData=regex:\((.+)\)$", flags=re.MULTILINE) for i, current_line, conflict_line in zip(count(), current.text.splitlines(), conflict.text.splitlines()): current_match = pattern.match(current_line) conflict_match = pattern.match(conflict_line) if not current_match or not conflict_match: # this line is not the nbt.CustomModelData config if current_line != conflict_line: return False # the files are not the same, abort the merge continue # process the next line pair current_cmd = set(current_match.group(1).split("|")) conflict_cmd = set(conflict_match.group(1).split("|")) merged[i] = f"nbt.CustomModelData=regex:({'|'.join(sorted(current_cmd|conflict_cmd))})" current.text = "\n".join(merged) return True def beet_default(ctx: Context): # bind context object to a ClassVar so it can be accessed later during template processing ShamirTemplate.bound_ctx = ctx vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' ShamirTemplate.vanilla_models_jar = vanilla.mount("assets/minecraft/items") merge_policy(ctx) def merge_policy(ctx: Context): ctx.assets.merge_policy.extend_namespace(OptifineProperties, optifine_armor_properties_merging) # a separate plugin to register the merge policy - used for the pyproject.toml custom policy workaround when using broadcast pipelines ================================================ FILE: gm4_midnight_menaces/README.md ================================================ # Mysterious Midnights Full moons gain a element of surprise with random events. ### Features - Every full moon, there is a chance of a random event bing triggered. - When triggered, all players will hear a wolf howl sound. - This adds 6 more events to the base data pack called [Mysterious Midnights]($dynamicLink:gm4_mysterious_midnights) Read more about all the options on the [Wiki](https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces). ================================================ FILE: gm4_midnight_menaces/beet.yaml ================================================ id: gm4_midnight_menaces name: Midnight Menaces version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_mysterious_midnights: 1.8.0 schedule_loops: [main] website: description: Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! recommended: [] notes: [] modrinth: project_id: 9aTlLrlw wiki: https://wiki.gm4.co/wiki/Mysterious_Midnights/Midnight_Menaces credits: Creator: - BPR Icon Design: - BPR ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/dawn_active_check.mcfunction ================================================ # @s = none # at world spawn # called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event. execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_enlarging_phantoms,tag=gm4_mysterious_midnights_active] run scoreboard players reset enlarging_phantoms gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute unless score enlarging_phantoms gm4_menace_data matches 1 run function gm4_enlarging_phantoms:initialise ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/initialise.mcfunction ================================================ # @s = none # at world spawn # called by event. Only runs once per enlarging phantom night. # start slow clock schedule function gm4_enlarging_phantoms:slow_clock 1t # initialise is done scoreboard players set enlarging_phantoms gm4_menace_data 1 ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/set_pos.mcfunction ================================================ # @s = none # at world spawn # called by slow_clock # spread spawn point around a random player, in a 24 block radius execute at @r[x=0,gamemode=!spectator] run spreadplayers ~ ~ 0 24 false @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] # set Y position relative to player (20-40 blocks above the nearest player) execute at @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] store result score phantom_altitude_base gm4_menace_data run data get entity @p Pos[1] execute store result score phantom_altitude gm4_menace_data run data get entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] UUID[0] scoreboard players operation phantom_altitude gm4_menace_data %= 21 gm4_menace_data scoreboard players add phantom_altitude gm4_menace_data 20 scoreboard players operation phantom_altitude gm4_menace_data += phantom_altitude_base gm4_menace_data execute store result entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] Pos[1] double 1 run scoreboard players get phantom_altitude gm4_menace_data # summon new phantom execute as @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] at @s run summon phantom ~ ~ ~ {Tags:["gm4_enlarged_phantom"]} # set size of new phantom execute as @e[tag=gm4_enlarged_phantom] run function gm4_enlarging_phantoms:set_size # reset scores scoreboard players reset phantom_altitude gm4_menace_data scoreboard players reset phantom_altitude_base gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/set_size.mcfunction ================================================ # @s = enlarged phantom # called by set_pos execute store result score @s gm4_menace_data run data get entity @s UUID[0] scoreboard players operation @s gm4_menace_data %= 100 gm4_menace_data # 35% size 3, 40% size 5, 25% size 7 data merge entity @s[scores={gm4_menace_data=..34}] {size:3,Health:24.0f,attributes:[{id:"minecraft:max_health",base:24.0d},{id:"minecraft:attack_damage",base:5.0d}]} data merge entity @s[scores={gm4_menace_data=35..74}] {size:5,Health:30.0f,attributes:[{id:"minecraft:max_health",base:30.0d},{id:"minecraft:attack_damage",base:7.0d}]} data merge entity @s[scores={gm4_menace_data=75..}] {size:7,Health:40.0f,attributes:[{id:"minecraft:max_health",base:40.0d},{id:"minecraft:attack_damage",base:9.0d}]} scoreboard players reset @s gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/setup.mcfunction ================================================ # called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_enlarging_phantoms",Tags:["gm4_mysterious_midnights_expansion","gm4_enlarging_phantoms"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/function/slow_clock.mcfunction ================================================ # @s = none # at world spawn # called by event # summon potential spawn points summon minecraft:area_effect_cloud 29999998 1 7134 {CustomName:"gm4_phantom_spawn_point",Tags:["gm4_phantom_spawn_point"],Duration:1,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} # randomizer (average spawn rate: 1 every 40 seconds) execute store result score phantom_random_value gm4_menace_data run data get entity @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point,limit=1] UUID[0] scoreboard players operation phantom_random_value gm4_menace_data %= 100 gm4_menace_data execute if score phantom_random_value gm4_menace_data matches 50.. if entity @a[x=0,limit=1] run function gm4_enlarging_phantoms:set_pos # kill spawn points kill @e[type=area_effect_cloud,tag=gm4_phantom_spawn_point] # reset scores scoreboard players reset phantom_random_value gm4_menace_data # loop every 20 seconds execute if score enlarging_phantoms gm4_menace_data matches 1 run schedule function gm4_enlarging_phantoms:slow_clock 20s ================================================ FILE: gm4_midnight_menaces/data/gm4_enlarging_phantoms/guidebook/enlarging_phantoms.json ================================================ { "id": "enlarging_phantoms", "name": "Enlarging Phantoms", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Enlarging_Phantoms", "icon": { "id": "minecraft:phantom_membrane" }, "criteria": { "fight_enlarged_phantom": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:phantom", "nbt": "{Tags:['gm4_enlarged_phantom']}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_enlarged_phantom" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.enlarging_phantoms.description", "fallback": "During an Enlarging Phantoms event, larger phantoms will spawn in the sky, regardless of insomniacs.\n\nLarger phantoms have more health and greater attack strength." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=minecraft:skeleton,tag=!smithed.entity,tag=!gm4_icy_stray_checked,x=0,predicate=gm4_icy_strays:stray_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_icy_strays:stray_transform tag @e[type=skeleton] add gm4_icy_stray_checked ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_icy_strays",Tags:["gm4_mysterious_midnights_expansion","gm4_icy_strays"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/function/stray_transform.mcfunction ================================================ # @s = skeleton to be converted into a stray # called by event summon stray ~ ~ ~ {equipment:{mainhand:{id:"minecraft:bow",count:1}},DeathLootTable:"gm4_icy_strays:entities/icy_stray"} tp @e[type=stray,limit=1,distance=0] @s data merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/guidebook/icy_strays.json ================================================ { "id": "icy_strays", "name": "Icy Strays", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Icy_Strays", "icon": { "id": "minecraft:ice" }, "criteria": { "fight_icy_stray": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:stray", "nbt": "{DeathLootTable:\"gm4_icy_strays:entities/icy_stray\"}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_icy_stray" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.icy_strays.description", "fallback": "During an Icy Strays event, half of the skeletons will spawn as strays.\n\nThese strays will drop ice when killed with looting." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/loot_table/entities/icy_stray.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/stray" } ] }, { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:ice", "weight": 1, "functions": [ { "function": "set_count", "count": 0 }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 2, "max": 4 } } ] } ] }, { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:packed_ice", "weight": 1, "functions": [ { "function": "set_count", "count": -1 }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 1, "max": 3 } } ] } ] }, { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:blue_ice", "weight": 1, "functions": [ { "function": "set_count", "count": -1 }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 2 } } ] } ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_icy_strays/predicate/stray_convert_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=#gm4_illusioner_nights:illusioner_convertable,tag=!smithed.entity,tag=!gm4_mm_illusioner_checked,x=0,predicate=gm4_illusioner_nights:illusioner_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_illusioner_nights:illusioner_transform tag @e[type=#gm4_illusioner_nights:illusioner_convertable] add gm4_mm_illusioner_checked ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/function/illusioner_transform.mcfunction ================================================ # @s = skeleton, zombie, or creeper to be converted into an illusioner # called by event summon illusioner ~ ~ ~ {DeathLootTable:"gm4_illusioner_nights:entities/illusioner",equipment:{mainhand:{id:"minecraft:bow",count:1}}} tp @e[type=illusioner,limit=1,distance=0] @s data merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/function/setup.mcfunction ================================================ # called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_illusioner_nights",Tags:["gm4_mysterious_midnights_expansion","gm4_illusioner_nights"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/guidebook/illusioner_nights.json ================================================ { "id": "illusioner_nights", "name": "Illusioner Nights", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Illusioner_Nights", "icon": { "id": "minecraft:lingering_potion", "components": { "minecraft:potion_contents": "minecraft:long_invisibility" } }, "criteria": { "fight_illusioner": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:illusioner", "nbt": "{DeathLootTable:\"gm4_illusioner_nights:entities/illusioner\"}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_illusioner" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.illusioner_nights.description", "fallback": "During an Illusioner Nights event, illusioners will spawn.\n\nThese illusioners will drop golden carrots, and some potions when killed." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/loot_table/entities/illusioner.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:golden_carrot", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 3 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ] } ] }, { "conditions": [ { "condition": "random_chance_with_enchanted_bonus", "enchantment": "minecraft:looting", "unenchanted_chance": 0.1, "enchanted_chance": { "type": "minecraft:linear", "base": 0.15, "per_level_above_first": 0.05 } } ], "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:potion", "weight": 2, "functions": [ { "function": "set_components", "components": { "minecraft:potion_contents": "minecraft:long_invisibility" } } ] }, { "type": "item", "name": "minecraft:potion", "weight": 3, "functions": [ { "function": "set_components", "components": { "minecraft:potion_contents": "minecraft:long_night_vision" } } ] }, { "type": "item", "name": "minecraft:lingering_potion", "weight": 1, "functions": [ { "function": "set_components", "components": { "minecraft:custom_name": {"text":"Lingering Potion of Blindness","italic":false}, "minecraft:potion_contents": { "potion": "minecraft:mundane", "custom_effects": [ { "duration": 1200, "id": "minecraft:blindness", "amplifier": 0 } ] } } } ] } ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/predicate/illusioner_convert_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.02 } ================================================ FILE: gm4_midnight_menaces/data/gm4_illusioner_nights/tags/entity_type/illusioner_convertable.json ================================================ { "values": [ "minecraft:creeper", "minecraft:skeleton", "minecraft:zombie" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=#gm4_menacing_goblins:goblin_convertable,tag=!smithed.entity,tag=!gm4_goblin_checked,x=0,predicate=gm4_menacing_goblins:goblin_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_menacing_goblins:goblin_transform tag @e[type=#gm4_menacing_goblins:goblin_convertable] add gm4_goblin_checked ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/check_player.mcfunction ================================================ # checks if nearby players have any valuables # @s = goblin if there are nearby players # located at @s # run from main tag @r[gamemode=!creative,gamemode=!spectator,distance=..3] add gm4_goblin_target execute store result score diamond gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] diamond 0 execute store result score iron_ingot gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] iron_ingot 0 execute store result score gold_ingot gm4_menace_data run clear @a[tag=gm4_goblin_target,limit=1,distance=..3] gold_ingot 0 # randomizer, (50% diamond, 25% iron, 20% gold attempts will fail) execute if score diamond gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_diamond_full] if predicate gm4_menacing_goblins:diamond_steal_chance run function gm4_menacing_goblins:goblin_steal/diamond execute if score iron_ingot gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_iron_full] if predicate gm4_menacing_goblins:iron_steal_chance run function gm4_menacing_goblins:goblin_steal/iron_ingot execute if score gold_ingot gm4_menace_data matches 1.. unless entity @s[tag=gm4_goblin_gold_full] if predicate gm4_menacing_goblins:gold_steal_chance run function gm4_menacing_goblins:goblin_steal/gold_ingot scoreboard players reset diamond gm4_menace_data scoreboard players reset iron_ingot gm4_menace_data scoreboard players reset gold_ingot gm4_menace_data tag @a remove gm4_goblin_target ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/diamond.mcfunction ================================================ # steals a diamond from the player # @s = goblin if there are nearby players with diamonds # located at @s # run from goblin_steal/check_player # get current diamond count execute store result score count gm4_menace_data run data get entity @s equipment.feet.count # take 1 diamond from player clear @a[tag=gm4_goblin_target,limit=1,distance=..3] diamond 1 # store diamonds at feet slot execute if score count gm4_menace_data matches 0 run data modify entity @s equipment.feet set value {id:"minecraft:diamond",count:1} execute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.feet.count byte 1 run scoreboard players add count gm4_menace_data 1 # show that it got stolen data modify entity @s equipment.offhand set value {id:"minecraft:diamond",count:1} playsound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2 playsound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2 playsound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2 particle minecraft:block{block_state:"minecraft:diamond_block"} ~ ~ ~ 0 0 0 1 15 force # mark full inventory with tag (to prevent continuous data checks) execute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_diamond_full # clear scores scoreboard players reset count gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/gold_ingot.mcfunction ================================================ # steals a gold ingot from the player # @s = goblin if there are nearby players with gold ingots # located at @s # run from goblin_steal/check_player # get current gold ingot count execute store result score count gm4_menace_data run data get entity @s equipment.chest.count # take 1 gold ingot from player clear @a[tag=gm4_goblin_target,limit=1,distance=..3] gold_ingot 1 # store gold ingots at chest slot execute if score count gm4_menace_data matches 0 run data modify entity @s equipment.chest set value {id:"minecraft:gold_ingot",count:1} execute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.chest.count byte 1 run scoreboard players add count gm4_menace_data 1 # show that it got stolen data modify entity @s equipment.offhand set value {id:"minecraft:gold_ingot",count:1} playsound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2 playsound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2 playsound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2 particle minecraft:block{block_state:"minecraft:gold_block"} ~ ~ ~ 0 0 0 1 15 force # mark full inventory with tag (to prevent continuous data checks) execute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_gold_full # clear scores scoreboard players reset count gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_steal/iron_ingot.mcfunction ================================================ # steals an iron ingot from the player # @s = goblin if there are nearby players with iron ingots # located at @s # run from goblin_steal/check_player # get current iron ingot count execute store result score count gm4_menace_data run data get entity @s equipment.feet.count # take 1 iron ingot from player clear @a[tag=gm4_goblin_target,limit=1,distance=..3] iron_ingot 1 # store iron ingots at feet slot execute if score count gm4_menace_data matches 0 run data modify entity @s equipment.feet set value {id:"minecraft:iron_ingot",count:1} execute if score count gm4_menace_data matches 1..63 if predicate gm4_menacing_goblins:store_chance store result entity @s equipment.feet.count byte 1 run scoreboard players add count gm4_menace_data 1 # show that it got stolen data modify entity @s equipment.offhand set value {id:"minecraft:iron_ingot",count:1} playsound minecraft:entity.zombie.ambient hostile @a[distance=..5] ~ ~ ~ 0.2 2 playsound minecraft:entity.witch.celebrate hostile @a[distance=..5] ~ ~ ~ 1 2 playsound minecraft:block.chain.break hostile @a[distance=..5] ~ ~ ~ 2 2 particle minecraft:block{block_state:"minecraft:iron_block"} ~ ~ ~ 0 0 0 1 15 force # mark full inventory with tag (to prevent continuous data checks) execute if score count gm4_menace_data matches 64.. run tag @s add gm4_goblin_iron_full # clear scores scoreboard players reset count gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/goblin_transform.mcfunction ================================================ # @s = skeleton, zombie, or creeper to be converted into a goblin # called by event summon zombie ~ ~ ~ {CustomName:{"translate":"entity.gm4.goblin","fallback":"Goblin§"},CustomNameVisible:0b,Team:"gm4_hide_name",DeathLootTable:"gm4_menacing_goblins:entities/goblin",LeftHanded:1b,CanPickUpLoot:0b,Health:24f,IsBaby:1b,CanBreakDoors:0b,Tags:["gm4_goblin","smithed.entity"],equipment:{mainhand:{id:"minecraft:golden_sword",count:1},head:{id:"minecraft:carved_pumpkin",count:1,components:{"minecraft:enchantments":{"minecraft:thorns":3}}}},drop_chances:{mainhand:0.3F,head:0F},active_effects:[{id:'minecraft:resistance',amplifier:4b,duration:20,show_particles:1b}],attributes:[{id:"minecraft:max_health",base:24.0d},{id:"minecraft:follow_range",base:48.0d}]} scoreboard players set @e[type=zombie,tag=gm4_goblin,distance=0] gm4_entity_version 1 tp @e[type=zombie,limit=1,distance=0] @s data merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/main.mcfunction ================================================ execute as @e[type=zombie,tag=gm4_goblin] unless entity @s[tag=gm4_goblin_diamond_full,tag=gm4_goblin_iron_full,tag=gm4_goblin_gold_full] at @s if entity @a[limit=1,distance=..3] run function gm4_menacing_goblins:goblin_steal/check_player schedule function gm4_menacing_goblins:main 16t ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_menacing_goblins",Tags:["gm4_mysterious_midnights_expansion","gm4_menacing_goblins"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/guidebook/menacing_goblins.json ================================================ { "id": "menacing_goblins", "name": "Menacing Goblins", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Menacing_Goblins", "icon": { "id": "minecraft:carved_pumpkin" }, "criteria": { "fight_goblin": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:zombie", "nbt": "{Tags:['gm4_goblin']}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_goblin" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.menacing_goblins.description", "fallback": "During a Menacing Goblins event, golden sword wielding goblins will spawn.\n\nThese goblins have more health than normal zombies and can track enemies from a far distance." } ], [ { "translate": "text.gm4.guidebook.menacing_goblins.behavior", "fallback": "Goblins wear a pumpkin with Thorns III.\n\nGoblins will steal diamonds, iron ingots, and gold ingots when nearby.\n\nWhen killed, they will drop most of the items they stole, along with some rotten flesh, iron nuggets, and golden nuggets." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/loot_table/entities/goblin.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:rotten_flesh", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 2 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ] } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "item", "name": "minecraft:iron_nugget", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 2 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ] }, { "type": "item", "name": "minecraft:gold_nugget", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 1 } }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 0, "max": 1 } } ] } ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/diamond_steal_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.50 } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/goblin_convert_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.02 } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/gold_steal_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.80 } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/iron_steal_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.75 } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/predicate/store_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.85 } ================================================ FILE: gm4_midnight_menaces/data/gm4_menacing_goblins/tags/entity_type/goblin_convertable.json ================================================ { "values": [ "minecraft:creeper", "minecraft:skeleton", "minecraft:zombie" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_midnight_menaces/function/active_night.mcfunction ================================================ # @s = none # at world spawn # run from #gm4_mysterious_midnights:active_night execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_slime_fests,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_slime_fests:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_sandy_husks,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_sandy_husks:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_icy_strays,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_icy_strays:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_enlarging_phantoms,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_enlarging_phantoms:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_menacing_goblins,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_menacing_goblins:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_illusioner_nights,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_illusioner_nights:event ================================================ FILE: gm4_midnight_menaces/data/gm4_midnight_menaces/function/init.mcfunction ================================================ scoreboard objectives add gm4_reslimify dummy scoreboard objectives add gm4_menace_data dummy scoreboard players set 100 gm4_menace_data 100 scoreboard players set 17 gm4_menace_data 17 scoreboard players set 21 gm4_menace_data 21 scoreboard players set 2 gm4_menace_data 2 scoreboard objectives add gm4_entity_version dummy team add gm4_hide_name team modify gm4_hide_name nametagVisibility never execute unless score midnight_menaces gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Midnight Menaces"} execute unless score midnight_menaces gm4_earliest_version < midnight_menaces gm4_modules run scoreboard players operation midnight_menaces gm4_earliest_version = midnight_menaces gm4_modules scoreboard players set midnight_menaces gm4_modules 1 schedule function gm4_menacing_goblins:main 1t #$moduleUpdateList ================================================ FILE: gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/active_night.json ================================================ { "values":[ "gm4_midnight_menaces:active_night" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/end_pulse.json ================================================ { "values":[ "gm4_enlarging_phantoms:dawn_active_check" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_common_expansion.json ================================================ { "values":[ "gm4_sandy_husks:setup", "gm4_icy_strays:setup" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_rare_expansion.json ================================================ { "values":[ "gm4_menacing_goblins:setup", "gm4_illusioner_nights:setup" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_mysterious_midnights/tags/function/setup_uncommon_expansion.json ================================================ { "values":[ "gm4_enlarging_phantoms:setup", "gm4_slime_fests:setup" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_nightmare_nights/tags/function/nightmare_night_expansion.json ================================================ { "values":[ "gm4_enlarging_phantoms:setup", "gm4_menacing_goblins:setup", "gm4_illusioner_nights:setup" ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=minecraft:zombie,tag=!smithed.entity,tag=!gm4_sandy_husk_checked,x=0,predicate=gm4_sandy_husks:husk_convert_chance,nbt={PersistenceRequired:0b}] unless data entity @s DeathLootTable at @s run function gm4_sandy_husks:husk_transform tag @e[type=zombie] add gm4_sandy_husk_checked ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/function/husk_transform.mcfunction ================================================ # @s = zombie to be converted into a husk # called by event summon husk ~ ~ ~ {DeathLootTable:"gm4_sandy_husks:entities/sandy_husk"} tp @e[type=husk,limit=1,distance=0] @s data merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_sandy_husks",Tags:["gm4_mysterious_midnights_expansion","gm4_sandy_husks"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/guidebook/sandy_husks.json ================================================ { "id": "sandy_husks", "name": "Sandy Husks", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Sandy_Husks", "icon": { "id": "minecraft:sand" }, "criteria": { "fight_sandy_husk": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:husk", "nbt": "{DeathLootTable:\"gm4_sandy_husks:entities/sandy_husk\"}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_sandy_husk" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.sandy_husks.description", "fallback": "During a Sandy Husks event, half of zombies will spawn as husks.\n\nThese husks will drop sand when killed with looting." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/loot_table/entities/sandy_husk.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/husk" } ] }, { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:sand", "functions": [ { "function": "set_count", "count": 0 }, { "function": "minecraft:enchanted_count_increase", "enchantment": "minecraft:looting", "count": { "min": 1, "max": 3 } } ] } ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_sandy_husks/predicate/husk_convert_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/absorb_slime_ball.mcfunction ================================================ # @s = slimeball item on the ground # at @s # called by spawn_slime # remove 1 from count of slimeball stack execute store result score count gm4_reslimify run data get entity @s Item.count 0.99 execute store result entity @s Item.count byte 1 run scoreboard players get count gm4_reslimify # Spigot fix execute if score count gm4_reslimify matches 0 run kill @s # reset timer to 0 scoreboard players set @s gm4_reslimify 0 ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/complete_merge.mcfunction ================================================ # @s = slime to be merged with another # at @s # called by merge_slimes data merge entity @s {Size:0,DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} playsound minecraft:entity.slime.squish hostile @a[distance=..15] ~ ~ ~ .5 .8 ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/event.mcfunction ================================================ # @s = none # at world spawn # called by midnight menaces base if this expansion was selected. pulsed every 0.8 seconds throughout the night. # resurrecting slimes execute as @e[type=minecraft:item,x=0,nbt={OnGround:1b}] if items entity @s contents minecraft:slime_ball run function gm4_slime_fests:mark_slime_ball execute as @e[type=minecraft:item,scores={gm4_reslimify=8..}] at @s run function gm4_slime_fests:spawn_slime # slime takeover execute as @e[type=#gm4_slime_fests:slime_convertable,x=0,tag=!smithed.entity,nbt={PersistenceRequired:0b}] at @s run function gm4_slime_fests:slime_transform # merging slimes scoreboard players reset @e[type=minecraft:slime] gm4_menace_data execute at @e[type=minecraft:slime,x=0,tag=!smithed.entity] run scoreboard players add @e[type=minecraft:slime,tag=!smithed.entity,distance=0.1..5] gm4_menace_data 1 execute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes execute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes execute as @e[type=minecraft:slime,tag=!gm4_merged_slime,tag=!gm4_giant_slime,scores={gm4_menace_data=1..7},limit=1] at @s if entity @e[type=minecraft:slime,distance=0.1..3,limit=1] run function gm4_slime_fests:merge_slimes tag @e[type=minecraft:slime] remove gm4_merged_slime ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/mark_slime_ball.mcfunction ================================================ # @s = slime_ball item on the ground # at world spawn # called by event scoreboard players add @s gm4_reslimify 1 execute at @s run particle minecraft:entity_effect{color:[0.0,1.0,0.1,1.0]} ~ ~ ~ 0 0 0 1 0 ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/merge_slimes.mcfunction ================================================ # @s = slime if there are any nearby slimes # called by event # store size of all nearby slimes execute as @e[type=minecraft:slime,tag=!smithed.entity,distance=..3] store result score @s gm4_menace_data run data get entity @s Size # choose one random slime with the same size execute as @e[type=minecraft:slime,tag=!smithed.entity,distance=0.01..3] if score @s gm4_menace_data = @e[type=minecraft:slime,distance=0,limit=1] gm4_menace_data run tag @s add gm4_slime_size_match tag @e[type=minecraft:slime,tag=gm4_slime_size_match,limit=1,sort=random] add gm4_merged_slime tag @e[type=minecraft:slime,distance=..3] remove gm4_slime_size_match # kill original slime execute if entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] run function gm4_slime_fests:complete_merge # calculations for size and health ## size = (current_size * 2) + 1 scoreboard players operation size gm4_menace_data = @s gm4_menace_data scoreboard players operation size gm4_menace_data *= 2 gm4_menace_data scoreboard players add size gm4_menace_data 1 ## health = (new_size + 1)^2 scoreboard players operation health gm4_menace_data = size gm4_menace_data scoreboard players add health gm4_menace_data 1 scoreboard players operation health gm4_menace_data *= health gm4_menace_data # apply size to new merged slime execute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] Size int 1 run scoreboard players get size gm4_menace_data execute if score size gm4_menace_data matches 7.. run tag @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] add gm4_giant_slime data merge entity @e[type=minecraft:slime,tag=gm4_merged_slime,tag=gm4_giant_slime,limit=1] {DeathLootTable:"gm4_slime_fests:entities/giant_slime"} # apply health and attack damage to new merged slime execute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] attributes[{id:"minecraft:max_health"}].base double 1 run scoreboard players get health gm4_menace_data execute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] Health float 1 run scoreboard players get health gm4_menace_data execute store result entity @e[type=minecraft:slime,tag=gm4_merged_slime,limit=1] attributes[{id:"minecraft:attack_damage"}].base double 1 run scoreboard players get health gm4_menace_data ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/setup.mcfunction ================================================ # called upon start of an uncommon mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_slime_fests",Tags:["gm4_mysterious_midnights_expansion","gm4_slime_fests"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/slime_transform.mcfunction ================================================ # @s = creeper/spider to be converted into a slime # called by event summon slime ~ ~ ~ {Size:0} tp @e[type=slime,limit=1,distance=0] @s data merge entity @s {DeathTime:19s,Health:0f,DeathLootTable:"gm4:empty"} ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/function/spawn_slime.mcfunction ================================================ # @s = slimeball item on the ground # at @s # called by event summon slime ~ ~ ~ {Size:0,DeathLootTable:"gm4:empty",active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}]} playsound block.slime_block.hit hostile @a[distance=..16] ~ ~ ~ .6 .8 function gm4_slime_fests:absorb_slime_ball ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/guidebook/slime_fests.json ================================================ { "id": "slime_fests", "name": "Slime Fests", "module_type": "expansion", "load_check": "midnight_menaces", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Midnight_Menaces/Slime_Fests", "icon": { "id": "minecraft:slime_ball" }, "criteria": { "fight_slime": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:slime", "type_specific": { "type": "slime", "size": 0 }, "nbt": "{DeathLootTable:\"minecraft:empty\"}" } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:slime", "nbt": "{DeathLootTable:\"gm4_slime_fests:entities/giant_slime\"}" } } ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_slime" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.slime_fests.description", "fallback": "During a Slime Fests event, Slimes will merge, naturally spawn, and reanimate from slimeballs.\n\nSmall slimes will spawn in dark spaces and slimeballs on the floor will turn into slimes." } ], [ { "translate": "text.gm4.guidebook.slime_fests.merging", "fallback": "Two slimes of the same size will merge together to form a larger slime.\n\nHuge slimes can be created this way, which will drop a special loot table when killed." } ] ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/loot_table/entities/giant_slime.json ================================================ { "pools": [ { "rolls": { "min": 0, "max": 1 }, "entries": [ { "type": "item", "name": "minecraft:diamond", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 1 } } ] }, { "type": "item", "name": "minecraft:emerald", "weight": 9, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 2 } } ] } ] }, { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "item", "name": "minecraft:oak_leaves", "weight": 5, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:spruce_leaves", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:birch_leaves", "weight": 4, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:jungle_leaves", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:acacia_leaves", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:dark_oak_leaves", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:stick", "weight": 2, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:clay_ball", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:dirt", "weight": 4, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:sugar_cane", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] } ] }, { "rolls": { "min": 1, "max": 4 }, "entries": [ { "type": "item", "name": "minecraft:iron_nugget", "weight": 10, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:gold_nugget", "weight": 5, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:redstone", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:coal", "weight": 20, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:lapis_lazuli", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 4 } } ] } ] }, { "rolls": { "min": 0, "max": 2 }, "entries": [ { "type": "item", "name": "minecraft:cocoa_beans", "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:wheat_seeds", "weight": 5, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:melon_seeds", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:pumpkin_seeds", "weight": 3, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:beetroot_seeds", "weight": 4, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] } ] }, { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "item", "name": "minecraft:bone", "weight": 15, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:gunpowder", "weight": 10, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:rotten_flesh", "weight": 15, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:string", "weight": 10, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:feather", "weight": 15, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] } ] } ] } ================================================ FILE: gm4_midnight_menaces/data/gm4_slime_fests/tags/entity_type/slime_convertable.json ================================================ { "values": [ "minecraft:creeper", "minecraft:spider" ] } ================================================ FILE: gm4_midnight_menaces/translations.csv ================================================ key,en_us entity.gm4.goblin,Goblin§ text.gm4.guidebook.module_desc.enlarging_phantoms,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.enlarging_phantoms.description,"During an Enlarging Phantoms event, larger phantoms will spawn in the sky, regardless of insomniacs.\n\nLarger phantoms have more health and greater attack strength." text.gm4.guidebook.module_desc.icy_strays,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.icy_strays.description,"During an Icy Strays event, half of the skeletons will spawn as strays.\n\nThese strays will drop ice when killed with looting." text.gm4.guidebook.module_desc.illusioner_nights,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.illusioner_nights.description,"During an Illusioner Nights event, illusioners will spawn.\n\nThese illusioners will drop golden carrots, and some potions when killed." text.gm4.guidebook.module_desc.menacing_goblins,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.menacing_goblins.description,"During a Menacing Goblins event, golden sword wielding goblins will spawn.\n\nThese goblins have more health than normal zombies and can track enemies from a far distance." text.gm4.guidebook.menacing_goblins.behavior,"Goblins wear a pumpkin with Thorns III.\n\nGoblins will steal diamonds, iron ingots, and gold ingots when nearby.\n\nWhen killed, they will drop most of the items they stole, along with some rotten flesh, iron nuggets, and golden nuggets." text.gm4.guidebook.module_desc.sandy_husks,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.sandy_husks.description,"During a Sandy Husks event, half of zombies will spawn as husks.\n\nThese husks will drop sand when killed with looting." text.gm4.guidebook.module_desc.slime_fests,Adds 7 new events to Mysterious Midnights! From nights with merging Slimes to scary Illusioners -- this is a variety pack you shouldn't miss out on! text.gm4.guidebook.slime_fests.description,"During a Slime Fests event, Slimes will merge, naturally spawn, and reanimate from slimeballs.\n\nSmall slimes will spawn in dark spaces and slimeballs on the floor will turn into slimes." text.gm4.guidebook.slime_fests.merging,"Two slimes of the same size will merge together to form a larger slime.\n\nHuge slimes can be created this way, which will drop a special loot table when killed." ================================================ FILE: gm4_monsters_unbound/README.md ================================================ # Monsters Unbound Use special weapon and armour modifiers to defend against mobs that grow ever stronger! Spore Zombies in Lush Caves ### Features - The longer you stay alive the stronger mobs will become. - Different biomes grant special buffs to mobs that spawn in them, creating bigger Slimes or Spore Zombies that keep regrowing! - Weaker Phantoms that take damage if they try to fly into water, as they deserve. - Mobs will drop new Modified armour and weapons. These come with special attributes that allow you to customize your gear! - Modifiers range from a ramping speed boost to a loyal immortal dog to fight by your side. Or a piece of armour that teleports you randomly, if that's what you like. A full list of all modifiers to mobs, weapons and armor can be found at the [Wiki](https://wiki.gm4.co/Monsters_Unbound). ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/glacial.json ================================================ { "textures": { "0": "gm4_monsters_unbound:item/elite_headwear/glacial", "particle": "gm4_monsters_unbound:item/elite_headwear/glacial" }, "elements": [ { "from": [3, 1, 8], "to": [8, 15, 8], "rotation": {"angle": 45, "axis": "z", "origin": [5.5, 4, 8]}, "faces": { "north": {"uv": [0, 0, 5, 14], "texture": "#0"}, "south": {"uv": [0, 0, 5, 14], "texture": "#0"} } }, { "from": [8.5, 1.5, 7], "to": [8.5, 6.5, 21], "rotation": {"angle": -22.5, "axis": "x", "origin": [8.5, 4, 10]}, "faces": { "east": {"uv": [0, 0, 5, 14], "rotation": 270, "texture": "#0"}, "west": {"uv": [0, 0, 5, 14], "rotation": 90, "texture": "#0"} } }, { "from": [6, 4, 7], "to": [11, 4, 21], "rotation": {"angle": -22.5, "axis": "x", "origin": [8.5, 4, 10]}, "faces": { "up": {"uv": [0, 0, 5, 14], "rotation": 180, "texture": "#0"}, "down": {"uv": [0, 0, 5, 14], "texture": "#0"} } }, { "from": [9.5, 4, 2.5], "to": [9.5, 18, 7.5], "rotation": {"angle": -22.5, "axis": "z", "origin": [9.5, 7, 5]}, "faces": { "east": {"uv": [0, 0, 5, 14], "texture": "#0"}, "west": {"uv": [0, 0, 5, 14], "texture": "#0"} } }, { "from": [7, 4, 5], "to": [12, 18, 5], "rotation": {"angle": -22.5, "axis": "z", "origin": [9.5, 7, 5]}, "faces": { "north": {"uv": [0, 0, 5, 14], "texture": "#0"}, "south": {"uv": [0, 0, 5, 14], "texture": "#0"} } }, { "from": [7, 2, -3.675], "to": [12, 2, 10.325], "rotation": {"angle": -22.5, "axis": "y", "origin": [9.5, 2, 7.325]}, "faces": { "up": {"uv": [0, 0, 5, 14], "texture": "#0"}, "down": {"uv": [0, 0, 5, 14], "rotation": 180, "texture": "#0"} } }, { "from": [9.5, -0.5, -3.675], "to": [9.5, 4.5, 10.325], "rotation": {"angle": -22.5, "axis": "y", "origin": [9.5, 2, 7.325]}, "faces": { "east": {"uv": [0, 0, 5, 14], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 0, 5, 14], "rotation": 270, "texture": "#0"} } }, { "from": [5.5, 1, 5.5], "to": [5.5, 15, 10.5], "rotation": {"angle": 45, "axis": "z", "origin": [5.5, 4, 8]}, "faces": { "east": {"uv": [0, 0, 5, 14], "texture": "#0"}, "west": {"uv": [0, 0, 5, 14], "texture": "#0"} } }, { "from": [8.75, 5, -2.75], "to": [11.75, 5, 6.25], "rotation": {"angle": 22.5, "axis": "x", "origin": [10.25, 5, 4.25]}, "faces": { "up": {"uv": [5, 0, 8, 9], "texture": "#0"}, "down": {"uv": [5, 0, 8, 9], "rotation": 180, "texture": "#0"} } }, { "from": [-2.75, 1.5, 7.25], "to": [6.25, 4.5, 7.25], "rotation": {"angle": -22.5, "axis": "y", "origin": [4.25, 3, 7.25]}, "faces": { "north": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"}, "south": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"} } }, { "from": [-2.75, 3, 5.75], "to": [6.25, 3, 8.75], "rotation": {"angle": -22.5, "axis": "y", "origin": [4.25, 3, 7.25]}, "faces": { "up": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"}, "down": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"} } }, { "from": [9.25, 3, 5.75], "to": [18.25, 3, 8.75], "rotation": {"angle": -22.5, "axis": "z", "origin": [11.25, 3, 7.25]}, "faces": { "up": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"}, "down": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } }, { "from": [9.25, 0.5, 7.25], "to": [18.25, 3.5, 7.25], "rotation": {"angle": -22.5, "axis": "z", "origin": [11.25, 2, 7.25]}, "faces": { "north": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"}, "south": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } }, { "from": [3.75, 2, 10.25], "to": [6.75, 2, 19.25], "rotation": {"angle": -45, "axis": "y", "origin": [5.25, 2, 12.25]}, "faces": { "up": {"uv": [5, 0, 8, 9], "rotation": 180, "texture": "#0"}, "down": {"uv": [5, 0, 8, 9], "texture": "#0"} } }, { "from": [5.25, 0.5, 10.25], "to": [5.25, 3.5, 19.25], "rotation": {"angle": -45, "axis": "y", "origin": [5.25, 2, 12.25]}, "faces": { "east": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"}, "west": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } }, { "from": [10.75, 2, 7.25], "to": [13.75, 2, 16.25], "rotation": {"angle": 45, "axis": "y", "origin": [12.25, 2, 9.25]}, "faces": { "up": {"uv": [5, 0, 8, 9], "rotation": 180, "texture": "#0"}, "down": {"uv": [5, 0, 8, 9], "texture": "#0"} } }, { "from": [12.25, 0.5, 7.25], "to": [12.25, 3.5, 16.25], "rotation": {"angle": 45, "axis": "y", "origin": [12.25, 2, 9.25]}, "faces": { "east": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"}, "west": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } }, { "from": [10.25, 3.5, -2.75], "to": [10.25, 6.5, 6.25], "rotation": {"angle": 22.5, "axis": "x", "origin": [10.25, 5, 4.25]}, "faces": { "east": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"}, "west": {"uv": [5, 0, 8, 9], "rotation": 270, "texture": "#0"} } }, { "from": [8.25, 4, 8.75], "to": [23.25, 4, 11.75], "rotation": {"angle": 22.5, "axis": "z", "origin": [12.25, 4, 10.25]}, "faces": { "up": {"uv": [9, 0, 12, 15], "rotation": 90, "texture": "#0"}, "down": {"uv": [9, 0, 12, 15], "rotation": 90, "texture": "#0"} } }, { "from": [4.75, 5, 9.25], "to": [7.75, 20, 9.25], "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 9, 9.25]}, "faces": { "north": {"uv": [9, 0, 12, 15], "texture": "#0"}, "south": {"uv": [5, 0, 8, 9], "texture": "#0"} } }, { "from": [6.25, 5, 7.75], "to": [6.25, 20, 10.75], "rotation": {"angle": 22.5, "axis": "z", "origin": [6.25, 9, 9.25]}, "faces": { "east": {"uv": [9, 0, 12, 15], "texture": "#0"}, "west": {"uv": [9, 0, 12, 15], "texture": "#0"} } }, { "from": [8.75, 3, 10.25], "to": [11.75, 18, 10.25], "rotation": {"angle": -45, "axis": "z", "origin": [10.25, 7, 10.25]}, "faces": { "north": {"uv": [9, 0, 12, 15], "texture": "#0"}, "south": {"uv": [5, 0, 8, 9], "texture": "#0"} } }, { "from": [10.25, 3, 8.75], "to": [10.25, 18, 11.75], "rotation": {"angle": -45, "axis": "z", "origin": [10.25, 7, 10.25]}, "faces": { "east": {"uv": [9, 0, 12, 15], "texture": "#0"}, "west": {"uv": [9, 0, 12, 15], "texture": "#0"} } }, { "from": [8.25, 2.5, 10.25], "to": [23.25, 5.5, 10.25], "rotation": {"angle": 22.5, "axis": "z", "origin": [12.25, 4, 10.25]}, "faces": { "north": {"uv": [9, 0, 12, 15], "rotation": 270, "texture": "#0"}, "south": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } }, { "from": [8.75, 2, 6.25], "to": [11.75, 2, 21.25], "rotation": {"angle": 22.5, "axis": "x", "origin": [10.25, 2, 10.25]}, "faces": { "up": {"uv": [9, 0, 12, 15], "rotation": 180, "texture": "#0"}, "down": {"uv": [9, 0, 12, 15], "texture": "#0"} } }, { "from": [10.25, 0.5, 6.25], "to": [10.25, 3.5, 21.25], "rotation": {"angle": 22.5, "axis": "x", "origin": [10.25, 2, 10.25]}, "faces": { "east": {"uv": [9, 0, 12, 15], "rotation": 270, "texture": "#0"}, "west": {"uv": [5, 0, 8, 9], "rotation": 90, "texture": "#0"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "rotation": [0, -22.5, 0], "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/mending.json ================================================ { "textures": { "0": "gm4_monsters_unbound:item/elite_headwear/mending", "particle": "gm4_monsters_unbound:item/elite_headwear/mending" }, "elements": [ { "from": [4, 0, 3.5], "to": [12, 8, 3.5], "rotation": {"angle": 0, "axis": "y", "origin": [4, 0, 3.5]}, "faces": { "north": {"uv": [0, 0, 4, 4], "texture": "#0"}, "east": {"uv": [0, 0, 0, 4], "texture": "#0"}, "south": {"uv": [0, 0, 4, 4], "texture": "#0"}, "west": {"uv": [0, 0, 0, 4], "texture": "#0"}, "up": {"uv": [4, 0, 0, 0], "texture": "#0"}, "down": {"uv": [4, 0, 0, 0], "texture": "#0"} } }, { "from": [4, 7, 7], "to": [6, 12, 8], "rotation": {"angle": 22.5, "axis": "z", "origin": [4, 8, 7]}, "faces": { "north": {"uv": [1, 5.5, 2, 8], "texture": "#0"}, "east": {"uv": [1, 5.5, 1.5, 8], "texture": "#0"}, "south": {"uv": [1, 5.5, 2, 8], "texture": "#0"}, "west": {"uv": [1, 5.5, 1.5, 8], "texture": "#0"}, "up": {"uv": [4, 4.5, 3, 4], "texture": "#0"}, "down": {"uv": [6, 2.5, 5, 3], "texture": "#0"} } }, { "from": [11.60685, 14.31283, 7], "to": [12.60685, 16.31283, 8], "rotation": {"angle": 22.5, "axis": "z", "origin": [11.60685, 14.31283, 7]}, "faces": { "north": {"uv": [0.5, 4, 1, 5], "texture": "#0"}, "east": {"uv": [0.5, 4, 1, 5], "texture": "#0"}, "south": {"uv": [0.5, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0.5, 4, 1, 5], "texture": "#0"}, "up": {"uv": [3.5, 5, 3, 4.5], "texture": "#0"}, "down": {"uv": [4.5, 2.5, 4, 3], "texture": "#0"} } }, { "from": [11.53073, 11.69552, 7], "to": [12.53073, 14.69552, 8], "rotation": {"angle": 0, "axis": "y", "origin": [11.53073, 11.69552, 7]}, "faces": { "north": {"uv": [0.5, 4.5, 1, 6], "texture": "#0"}, "east": {"uv": [0.5, 4.5, 1, 6], "texture": "#0"}, "south": {"uv": [0.5, 4.5, 1, 6], "texture": "#0"}, "west": {"uv": [0.5, 4.5, 1, 6], "texture": "#0"}, "up": {"uv": [3, 5.5, 2.5, 5], "texture": "#0"}, "down": {"uv": [5.5, 3, 5, 3.5], "texture": "#0"} } }, { "from": [10, 7, 7], "to": [12, 12, 8], "rotation": {"angle": -22.5, "axis": "z", "origin": [12, 8, 7]}, "faces": { "north": {"uv": [0, 5.5, 1, 8], "texture": "#0"}, "east": {"uv": [0.5, 5.5, 1, 8], "texture": "#0"}, "south": {"uv": [0, 5.5, 1, 8], "texture": "#0"}, "west": {"uv": [0.5, 5.5, 1, 8], "texture": "#0"}, "up": {"uv": [3, 4.5, 2, 4], "texture": "#0"}, "down": {"uv": [5, 3, 4, 3.5], "texture": "#0"} } }, { "from": [3.46927, 11.69552, 7], "to": [4.46927, 14.69552, 8], "rotation": {"angle": 0, "axis": "z", "origin": [4.46927, 11.69552, 7]}, "faces": { "north": {"uv": [1, 4.5, 1.5, 6], "texture": "#0"}, "east": {"uv": [1, 4.5, 1.5, 6], "texture": "#0"}, "south": {"uv": [1, 4.5, 1.5, 6], "texture": "#0"}, "west": {"uv": [1, 4.5, 1.5, 6], "texture": "#0"}, "up": {"uv": [3.5, 5.5, 3, 5], "texture": "#0"}, "down": {"uv": [6, 3, 5.5, 3.5], "texture": "#0"} } }, { "from": [3.39315, 14.31283, 7], "to": [4.39315, 16.31283, 8], "rotation": {"angle": -22.5, "axis": "z", "origin": [4.39315, 14.31283, 7]}, "faces": { "north": {"uv": [1, 4, 1.5, 5], "texture": "#0"}, "east": {"uv": [1, 4, 1.5, 5], "texture": "#0"}, "south": {"uv": [1, 4, 1.5, 5], "texture": "#0"}, "west": {"uv": [1, 4, 1.5, 5], "texture": "#0"}, "up": {"uv": [3, 5, 2.5, 4.5], "texture": "#0"}, "down": {"uv": [5, 2.5, 4.5, 3], "texture": "#0"} } }, { "from": [6.5, 8, 6.5], "to": [9.5, 13, 7.5], "rotation": {"angle": 0, "axis": "y", "origin": [7.5, 8, 6.5]}, "faces": { "north": {"uv": [4, 0, 5.5, 2.5], "texture": "#0"}, "east": {"uv": [4, 0, 4.5, 2.5], "texture": "#0"}, "south": {"uv": [4, 0, 5.5, 2.5], "texture": "#0"}, "west": {"uv": [5, 0, 5.5, 2.5], "texture": "#0"}, "up": {"uv": [5.5, 0.5, 4, 0], "texture": "#0"}, "down": {"uv": [5.5, 2, 4, 2.5], "texture": "#0"} } }, { "from": [4, 10.5, 7.25], "to": [5, 14.5, 7.25], "rotation": {"angle": 45, "axis": "z", "origin": [4, 14.5, 7.25]}, "faces": { "north": {"uv": [4.5, 3.5, 5, 5.5], "texture": "#0"}, "east": {"uv": [0, 0, 0, 2], "texture": "#0"}, "south": {"uv": [4.5, 3.5, 5, 5.5], "texture": "#0"}, "west": {"uv": [0, 0, 0, 2], "texture": "#0"}, "up": {"uv": [0, 0, 0.5, 0], "texture": "#0"}, "down": {"uv": [0, 0, 0.5, 0], "texture": "#0"} } }, { "from": [11, 10.5, 7.25], "to": [12, 14.5, 7.25], "rotation": {"angle": -45, "axis": "z", "origin": [12, 14.5, 7.25]}, "faces": { "north": {"uv": [5.5, 3.5, 5, 5.5], "texture": "#0"}, "east": {"uv": [0, 0, 0, 2], "texture": "#0"}, "south": {"uv": [5.5, 3.5, 5, 5.5], "texture": "#0"}, "west": {"uv": [0, 0, 0, 2], "texture": "#0"}, "up": {"uv": [0.5, 0, 0, 0], "texture": "#0"}, "down": {"uv": [0.5, 0, 0, 0], "texture": "#0"} } }, { "from": [8, 10.5, 7.25], "to": [12, 11.5, 7.25], "rotation": {"angle": 0, "axis": "z", "origin": [12, 10.5, 7.25]}, "faces": { "north": {"uv": [3, 5.5, 3.5, 7.5], "rotation": 270, "texture": "#0"}, "east": {"uv": [0.5, 0, 1, 0], "rotation": 90, "texture": "#0"}, "south": {"uv": [3, 5.5, 3.5, 7.5], "rotation": 90, "texture": "#0"}, "west": {"uv": [0.5, 0, 1, 0], "rotation": 90, "texture": "#0"}, "up": {"uv": [0, 0, 0, 2], "rotation": 90, "texture": "#0"}, "down": {"uv": [0, 0, 0, 2], "rotation": 90, "texture": "#0"} } }, { "from": [4, 10.5, 7.25], "to": [8, 11.5, 7.25], "rotation": {"angle": 0, "axis": "y", "origin": [4, 10.5, 7.25]}, "faces": { "north": {"uv": [2.5, 7.5, 3, 5.5], "rotation": 270, "texture": "#0"}, "east": {"uv": [0.5, 0, 1, 0], "rotation": 90, "texture": "#0"}, "south": {"uv": [2.5, 7.5, 3, 5.5], "rotation": 90, "texture": "#0"}, "west": {"uv": [0.5, 0, 1, 0], "rotation": 90, "texture": "#0"}, "up": {"uv": [0, 2, 0, 0], "rotation": 90, "texture": "#0"}, "down": {"uv": [0, 2, 0, 0], "rotation": 90, "texture": "#0"} } }, { "from": [3.15224, 1, 4.26537], "to": [4.15224, 2, 4.26537], "rotation": {"angle": 22.5, "axis": "y", "origin": [2.15224, 1, 4.26537]}, "faces": { "north": {"uv": [3, 2.5, 3.5, 3], "texture": "#0"}, "east": {"uv": [0, 0, 0, 1], "texture": "#0"}, "south": {"uv": [2.5, 2.5, 3, 3], "texture": "#0"}, "west": {"uv": [0, 0, 0, 1], "texture": "#0"}, "up": {"uv": [0, 0, 1, 0], "texture": "#0"}, "down": {"uv": [0, 0, 1, 0], "texture": "#0"} } }, { "from": [11.84776, 4, 4.26537], "to": [12.84776, 5, 4.26537], "rotation": {"angle": -22.5, "axis": "y", "origin": [13.84776, 4, 4.26537]}, "faces": { "north": {"uv": [3.5, 2.5, 3, 3], "texture": "#0"}, "east": {"uv": [0, 0, 0, 1], "texture": "#0"}, "south": {"uv": [3, 2.5, 2.5, 3], "texture": "#0"}, "west": {"uv": [0, 0, 0, 1], "texture": "#0"}, "up": {"uv": [1, 0, 0, 0], "texture": "#0"}, "down": {"uv": [1, 0, 0, 0], "texture": "#0"} } }, { "from": [1.66191, 1, 5.2969], "to": [3.66191, 3, 5.2969], "rotation": {"angle": 45, "axis": "y", "origin": [1.66191, 1, 5.2969]}, "faces": { "north": {"uv": [3.5, 5.5, 4.5, 6.5], "texture": "#0"}, "east": {"uv": [0, 0, 0, 2], "texture": "#0"}, "south": {"uv": [4.5, 5.5, 5.5, 6.5], "texture": "#0"}, "west": {"uv": [0, 0, 0, 2], "texture": "#0"}, "up": {"uv": [0, 0, 2, 0], "texture": "#0"}, "down": {"uv": [0, 0, 2, 0], "texture": "#0"} } }, { "from": [12.33809, 4, 5.2969], "to": [14.33809, 6, 5.2969], "rotation": {"angle": -45, "axis": "y", "origin": [14.33809, 4, 5.2969]}, "faces": { "north": {"uv": [4.5, 5.5, 3.5, 6.5], "texture": "#0"}, "east": {"uv": [0, 0, 0, 2], "texture": "#0"}, "south": {"uv": [5.5, 5.5, 4.5, 6.5], "texture": "#0"}, "west": {"uv": [0, 0, 0, 2], "texture": "#0"}, "up": {"uv": [2, 0, 0, 0], "texture": "#0"}, "down": {"uv": [2, 0, 0, 0], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/elite_headwear/pearlescent.json ================================================ { "textures": { "0": "gm4_monsters_unbound:item/elite_headwear/pearlescent", "particle": "gm4_monsters_unbound:item/elite_headwear/pearlescent" }, "elements": [ { "from": [8.5, 2, 3], "to": [11.5, 5, 4], "rotation": {"angle": 0, "axis": "y", "origin": [3.5, -3, -4]}, "faces": { "north": {"uv": [2, 2, 5, 5], "texture": "#0"}, "east": {"uv": [0, 2, 2, 5], "texture": "#0"}, "south": {"uv": [12, 2, 15, 5], "texture": "#0"}, "west": {"uv": [5, 2, 7, 5], "texture": "#0"}, "up": {"uv": [5, 2, 2, 0], "texture": "#0"}, "down": {"uv": [5, 7, 2, 5], "texture": "#0"} } }, { "from": [8.25, 1.75, 2.475], "to": [11.75, 5.25, 3.475], "rotation": {"angle": 0, "axis": "y", "origin": [3.5, -3, -4.525]}, "faces": { "east": {"uv": [7, 2, 8, 5], "texture": "#0"}, "south": {"uv": [11, 2, 8, 5], "texture": "#0"}, "west": {"uv": [11, 2, 12, 5], "texture": "#0"}, "up": {"uv": [11, 1, 8, 2], "texture": "#0"}, "down": {"uv": [11, 5, 8, 6], "texture": "#0"} } }, { "from": [11.75, 5.25, 3.475], "to": [8.25, 1.75, 2.475], "rotation": {"angle": 0, "axis": "y", "origin": [7, 0.5, -3.025]}, "faces": { "north": {"uv": [11, 5, 8, 2], "texture": "#0"}, "east": {"uv": [11, 5, 12, 2], "texture": "#0"}, "west": {"uv": [7, 5, 8, 2], "texture": "#0"}, "up": {"uv": [8, 5, 11, 6], "texture": "#0"}, "down": {"uv": [8, 1, 11, 2], "texture": "#0"} } }, { "from": [3.5, 2.5, 3.5], "to": [12.5, 4.5, 12.5], "rotation": {"angle": 0, "axis": "y", "origin": [4, 3, 4]}, "faces": { "north": {"uv": [0, 7, 8, 9], "texture": "#0"}, "east": {"uv": [8, 9, 0, 11], "texture": "#0"}, "south": {"uv": [0, 11, 8, 13], "texture": "#0"}, "west": {"uv": [0, 9, 8, 11], "texture": "#0"} } }, { "from": [12.5, 4.5, 12.5], "to": [3.5, 2.5, 3.5], "rotation": {"angle": 0, "axis": "y", "origin": [12, 4, 12]}, "faces": { "north": {"uv": [8, 13, 0, 11], "texture": "#0"}, "east": {"uv": [8, 11, 0, 9], "texture": "#0"}, "south": {"uv": [8, 9, 0, 7], "texture": "#0"}, "west": {"uv": [8, 11, 0, 9], "texture": "#0"} } }, { "from": [4.5, 2, 3], "to": [7.5, 5, 4], "rotation": {"angle": 0, "axis": "y", "origin": [12.5, -3, -4]}, "faces": { "north": {"uv": [5, 2, 2, 5], "texture": "#0"}, "east": {"uv": [7, 2, 5, 5], "texture": "#0"}, "south": {"uv": [15, 2, 12, 5], "texture": "#0"}, "west": {"uv": [2, 2, 0, 5], "texture": "#0"}, "up": {"uv": [2, 2, 5, 0], "texture": "#0"}, "down": {"uv": [2, 7, 5, 5], "texture": "#0"} } }, { "from": [7.75, 5.25, 3.475], "to": [4.25, 1.75, 2.475], "rotation": {"angle": 0, "axis": "y", "origin": [9, 0.5, -3.025]}, "faces": { "north": {"uv": [8, 5, 11, 2], "texture": "#0"}, "east": {"uv": [8, 5, 7, 2], "texture": "#0"}, "west": {"uv": [12, 5, 11, 2], "texture": "#0"}, "up": {"uv": [11, 5, 8, 6], "texture": "#0"}, "down": {"uv": [11, 1, 8, 2], "texture": "#0"} } }, { "from": [4.25, 1.75, 2.475], "to": [7.75, 5.25, 3.475], "rotation": {"angle": 0, "axis": "y", "origin": [12.5, -3, -4.525]}, "faces": { "east": {"uv": [12, 2, 11, 5], "texture": "#0"}, "south": {"uv": [8, 2, 11, 5], "texture": "#0"}, "west": {"uv": [8, 2, 7, 5], "texture": "#0"}, "up": {"uv": [8, 1, 11, 2], "texture": "#0"}, "down": {"uv": [8, 5, 11, 6], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/cherry.json ================================================ { "textures": { "1": "gm4_monsters_unbound:item/spore/cherry", "particle": "gm4_monsters_unbound:item/spore/cherry" }, "elements": [ { "from": [3.5, -0.5, 3.5], "to": [12.5, 8.5, 12.5], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 4, 8, 8], "texture": "#1"}, "east": {"uv": [0, 4, 4, 8], "texture": "#1"}, "south": {"uv": [12, 4, 16, 8], "texture": "#1"}, "west": {"uv": [8, 4, 12, 8], "texture": "#1"}, "up": {"uv": [4, 0, 8, 4], "texture": "#1"} } }, { "from": [12.5, 8.5, 12.5], "to": [3.5, -0.5, 3.5], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 8, 16, 4], "texture": "#1"}, "east": {"uv": [8, 8, 12, 4], "texture": "#1"}, "south": {"uv": [4, 8, 8, 4], "texture": "#1"}, "west": {"uv": [0, 8, 4, 4], "texture": "#1"}, "down": {"uv": [8, 4, 4, 0], "texture": "#1"} } }, { "from": [3, -1, 3], "to": [13, 9, 13], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 12, 8, 16], "texture": "#1"}, "east": {"uv": [0, 12, 4, 16], "texture": "#1"}, "south": {"uv": [12, 12, 16, 16], "texture": "#1"}, "west": {"uv": [8, 12, 12, 16], "texture": "#1"}, "up": {"uv": [4, 8, 8, 12], "texture": "#1"} } }, { "from": [13, 9, 13], "to": [3, -1, 3], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 16, 16, 12], "texture": "#1"}, "east": {"uv": [8, 16, 12, 12], "texture": "#1"}, "south": {"uv": [4, 16, 8, 12], "texture": "#1"}, "west": {"uv": [0, 16, 4, 12], "texture": "#1"}, "down": {"uv": [8, 12, 4, 8], "texture": "#1"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/default.json ================================================ { "textures": { "1": "gm4_monsters_unbound:item/spore/default", "particle": "gm4_monsters_unbound:item/spore/default" }, "elements": [ { "from": [3.5, -0.5, 3.5], "to": [12.5, 8.5, 12.5], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 4, 8, 8], "texture": "#1"}, "east": {"uv": [0, 4, 4, 8], "texture": "#1"}, "south": {"uv": [12, 4, 16, 8], "texture": "#1"}, "west": {"uv": [8, 4, 12, 8], "texture": "#1"}, "up": {"uv": [4, 0, 8, 4], "texture": "#1"} } }, { "from": [12.5, 8.5, 12.5], "to": [3.5, -0.5, 3.5], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 8, 16, 4], "texture": "#1"}, "east": {"uv": [8, 8, 12, 4], "texture": "#1"}, "south": {"uv": [4, 8, 8, 4], "texture": "#1"}, "west": {"uv": [0, 8, 4, 4], "texture": "#1"}, "down": {"uv": [8, 4, 4, 0], "texture": "#1"} } }, { "from": [3, -1, 3], "to": [13, 9, 13], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 12, 8, 16], "texture": "#1"}, "east": {"uv": [0, 12, 4, 16], "texture": "#1"}, "south": {"uv": [12, 12, 16, 16], "texture": "#1"}, "west": {"uv": [8, 12, 12, 16], "texture": "#1"}, "up": {"uv": [4, 8, 8, 12], "texture": "#1"} } }, { "from": [13, 9, 13], "to": [3, -1, 3], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 16, 16, 12], "texture": "#1"}, "east": {"uv": [8, 16, 12, 12], "texture": "#1"}, "south": {"uv": [4, 16, 8, 12], "texture": "#1"}, "west": {"uv": [0, 16, 4, 12], "texture": "#1"}, "down": {"uv": [8, 12, 4, 8], "texture": "#1"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/gm4_monsters_unbound/models/item/spore/flowering.json ================================================ { "textures": { "1": "gm4_monsters_unbound:item/spore/flowering", "particle": "gm4_monsters_unbound:item/spore/flowering" }, "elements": [ { "from": [3.5, -0.5, 3.5], "to": [12.5, 8.5, 12.5], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 4, 8, 8], "texture": "#1"}, "east": {"uv": [0, 4, 4, 8], "texture": "#1"}, "south": {"uv": [12, 4, 16, 8], "texture": "#1"}, "west": {"uv": [8, 4, 12, 8], "texture": "#1"}, "up": {"uv": [4, 0, 8, 4], "texture": "#1"} } }, { "from": [12.5, 8.5, 12.5], "to": [3.5, -0.5, 3.5], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 8, 16, 4], "texture": "#1"}, "east": {"uv": [8, 8, 12, 4], "texture": "#1"}, "south": {"uv": [4, 8, 8, 4], "texture": "#1"}, "west": {"uv": [0, 8, 4, 4], "texture": "#1"}, "down": {"uv": [8, 4, 4, 0], "texture": "#1"} } }, { "from": [3, -1, 3], "to": [13, 9, 13], "rotation": {"angle": 0, "axis": "y", "origin": [5, 6, 5]}, "faces": { "north": {"uv": [4, 12, 8, 16], "texture": "#1"}, "east": {"uv": [0, 12, 4, 16], "texture": "#1"}, "south": {"uv": [12, 12, 16, 16], "texture": "#1"}, "west": {"uv": [8, 12, 12, 16], "texture": "#1"}, "up": {"uv": [4, 8, 8, 12], "texture": "#1"} } }, { "from": [13, 9, 13], "to": [3, -1, 3], "rotation": {"angle": 0, "axis": "y", "origin": [13, 14, 13]}, "faces": { "north": {"uv": [12, 16, 16, 12], "texture": "#1"}, "east": {"uv": [8, 16, 12, 12], "texture": "#1"}, "south": {"uv": [4, 16, 8, 12], "texture": "#1"}, "west": {"uv": [0, 16, 4, 12], "texture": "#1"}, "down": {"uv": [8, 12, 4, 8], "texture": "#1"} } } ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "thirdperson_lefthand": { "rotation": [75, 45, 0], "translation": [0, 2.5, 0], "scale": [0.375, 0.375, 0.375] }, "firstperson_righthand": { "rotation": [0, 45, 0], "scale": [0.4, 0.4, 0.4] }, "firstperson_lefthand": { "rotation": [0, 225, 0], "scale": [0.4, 0.4, 0.4] }, "ground": { "translation": [0, 3, 0], "scale": [0.25, 0.25, 0.25] }, "gui": { "rotation": [30, 225, 0], "scale": [0.625, 0.625, 0.625] }, "head": { "translation": [0, 6.45, 0], "scale": [1.61, 1.61, 1.61] }, "fixed": { "scale": [0.5, 0.5, 0.5] } } } ================================================ FILE: gm4_monsters_unbound/assets/model_data.yaml ================================================ model_data: - item: pearlescent_froglight reference: item/elite_headwear/pearlescent - item: lime_glazed_terracotta reference: item/elite_headwear/mending - item: packed_ice reference: item/elite_headwear/glacial - item: azalea_leaves reference: item/spore/default - item: flowering_azalea_leaves reference: item/spore/flowering - item: cherry_leaves reference: item/spore/cherry ================================================ FILE: gm4_monsters_unbound/beet.yaml ================================================ id: gm4_monsters_unbound name: Monsters Unbound version: 1.2.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_forceload - gm4.plugins.include.lib_lore meta: gm4: versioning: required: lib_forceload: 1.6.0 lib_lore: 1.4.0 schedule_loops: - tick - main - slow_clock website: description: Mobs gain special effects based on their biome. recommended: - gm4_survival_refightalized wiki: https://wiki.gm4.co/wiki/Monsters_Unbound credits: Creator: - Djones Icon Design: - Hozz Textures: - Kyrius - rednls ================================================ FILE: gm4_monsters_unbound/data/gm4/advancement/monsters_unbound_elite_kill.json ================================================ { "display": { "icon": { "id": "minecraft:iron_axe" }, "title": { "translate": "advancement.gm4.monsters_unbound.elite_kill.title", "fallback": "Elite Hunter" }, "description": { "translate": "advancement.gm4.monsters_unbound.elite_kill.description", "fallback": "Kill any Elite monster", "color": "gray" }, "frame": "task" }, "parent": "gm4:root", "criteria": { "kill_elite": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite\"]}" } } ] } } } } ================================================ FILE: gm4_monsters_unbound/data/gm4/advancement/monsters_unbound_elite_kill_all.json ================================================ { "display": { "icon": { "id": "minecraft:diamond_axe" }, "title": { "translate": "advancement.gm4.monsters_unbound.elite_kill_all.title", "fallback": "Elites Hunted" }, "description": { "translate": "advancement.gm4.monsters_unbound.elite_kill_all.description", "fallback": "Kill one of every Elite monster", "color": "gray" }, "frame": "challenge" }, "parent": "gm4:monsters_unbound_elite_kill", "criteria": { "blazing": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.blazing\"]}" } } ] } }, "gargantuan": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.gargantuan\"]}" } } ] } }, "glacial": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.glacial\"]}" } } ] } }, "mending": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.mending\"]}" } } ] } }, "pearlescent": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.pearlescent\"]}" } } ] } }, "splitting": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.splitting\"]}" } } ] } }, "volatile": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.volatile\"]}" } } ] } }, "vorpal": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.vorpal\"]}" } } ] } }, "zephyr": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.zephyr\"]}" } } ] } } }, "requirements": [ [ "blazing" ], [ "gargantuan" ], [ "glacial" ], [ "mending" ], [ "pearlescent" ], [ "splitting" ], [ "volatile" ], [ "vorpal" ], [ "zephyr" ] ], "rewards": { "experience": 100 } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/charging.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "source_entity": { "nbt": "{Tags:[\"gm4_mu_charging_attack\"]}" } } } } }, "rewards": { "function": "gm4_monsters_unbound:mob/process/attack_effect/charging_attack" } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/slowing.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:entity_hurt_player", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_frozen\"]}" } } } ], "damage": { "blocked": false, "source_entity": { "nbt": "{Tags:[\"gm4_mu_slowing_attack\"]}" } } } } }, "rewards": { "function": "gm4_monsters_unbound:mob/process/attack_effect/slowing_attack" } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/toxic.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "blocked": false, "source_entity": { "nbt": "{Tags:[\"gm4_mu_toxic_attack\"]}" } } } } }, "rewards": { "function": "gm4_monsters_unbound:mob/process/attack_effect/toxic_attack" } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/damaged/attack_effect/weakness.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "blocked": false, "source_entity": { "nbt": "{Tags:[\"gm4_mu_weakness_attack\"]}" } } } } }, "rewards": { "function": "gm4_monsters_unbound:mob/process/attack_effect/weakness_attack" } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/advancement/elite/on_hit.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.on_hit\"]}" } } ] } } }, "rewards": { "function": "gm4_monsters_unbound:mob/process/elite/on_hit/run" } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/check_item.mcfunction ================================================ # check items on ground for Survival Refightalized items # @s = item # at unspecified # run from tick # tag item as checked and try to process tag @s add gm4_mu_item_checked scoreboard players set $item_processed gm4_mu_data 0 # check for spores execute if items entity @s contents *[custom_data~{gm4_mu_spore:{}}] run function gm4_monsters_unbound:mob/process/spore/initialise # check for elite death markers execute if items entity @s contents *[custom_data~{gm4_mu_elite_on_death:{}}] at @s run function gm4_monsters_unbound:mob/process/elite/on_death/run ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/effect/fear.mcfunction ================================================ # temporary clock for fear effect # @s = unspecified # at unspecified # schedule from here # schedule from effect/fear/apply scoreboard players set $keep_tick.feared_entity gm4_mu_keep_tick 0 execute as @a[tag=gm4_mu_feared] at @s run function gm4_monsters_unbound:effect/fear/tick execute if score $keep_tick.feared_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/fear 5t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/effect/freeze.mcfunction ================================================ # temporary clock for freeze effect # @s = unspecified # at unspecified # schedule from here # schedule from effect/freeze/apply scoreboard players set $keep_tick.frozen_entity gm4_mu_keep_tick 0 execute as @e[tag=gm4_mu_frozen] at @s run function gm4_monsters_unbound:effect/freeze/tick execute if score $keep_tick.frozen_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/freeze 5t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/blazing_flare.mcfunction ================================================ # temporary clock for blazing elite flare # @s = unspecified # at unspecified # schedule from here # schedule from mob/process/elite/blazing/init_flare scoreboard players set $keep_tick.elite_process_flare gm4_mu_keep_tick 0 execute as @e[type=block_display,tag=gm4_mu_elite_flare] at @s run function gm4_monsters_unbound:mob/process/elite/blazing/process_flare execute if score $keep_tick.elite_process_flare gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/blazing_flare 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/glacial_death.mcfunction ================================================ # temporary clock for glacial elite death # @s = unspecified # at unspecified # schedule from here # schedule from mob/process/elite/glacial/death scoreboard players set $keep_tick.elite_glacial_death gm4_mu_keep_tick 0 execute as @e[type=marker,tag=gm4_mu_elite.glacial_processing] at @s run function gm4_monsters_unbound:mob/process/elite/glacial/process_explosion execute if score $keep_tick.elite_glacial_death gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/glacial_death 2t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/volatile_pillar.mcfunction ================================================ # temporary clock for volatile elite pillars # @s = unspecified # at unspecified # schedule from here # schedule from mob/process/elite/volatile/pillar_location scoreboard players set $keep_tick.elite_pillar_volatile gm4_mu_keep_tick 0 execute as @e[type=marker,tag=gm4_mu_elite.volatile_pillar] at @s run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_process execute if score $keep_tick.elite_pillar_volatile gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/volatile_pillar 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/vorpal_death.mcfunction ================================================ # temporary clock for vorpal elite death skull # @s = unspecified # at unspecified # schedule from here # schedule from mob/process/elite/vorpal/init_fear_cloud scoreboard players set $keep_tick.elite_death_vorpal gm4_mu_keep_tick 0 execute as @e[type=item_display,tag=gm4_mu_elite.fear_cloud] at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/process_fear_cloud execute if score $keep_tick.elite_death_vorpal gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/vorpal_death 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/clocks/elite/zephyr_process.mcfunction ================================================ # temporary clock for skeleton zephyr elite charging # @s = unspecified # at unspecified # schedule from here # schedule from mob/process/elite/zephyr/skeleton/start scoreboard players set $keep_tick.elite_process_zephyr gm4_mu_keep_tick 0 execute as @e[type=#gm4_monsters_unbound:skeleton_types,tag=gm4_mu_elite.zephyr_skeleton_burst] at @s run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/arrow_burst execute if score $keep_tick.elite_process_zephyr gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/zephyr_process 3t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/blazing/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 46 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/blazing/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 46 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/gargantuan/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 96 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/gargantuan/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 96 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/glacial/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 1 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/glacial/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 1 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/mending/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 16 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/mending/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 16 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/pearlescent/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 86 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/pearlescent/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 86 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/splitting/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 66 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/splitting/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 66 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/volatile/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 76 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/volatile/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 76 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/vorpal/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 56 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/vorpal/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 56 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/zephyr/skeleton.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 31 summon skeleton ~ ~ ~ {Tags:["gm4_mu_elite","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/debug/spawn_elite/zephyr/zombie.mcfunction ================================================ scoreboard players set $prepicked_elite gm4_mu_data 31 summon zombie ~ ~ ~ {Tags:["gm4_sr_was_baby","gm4_mu_debug_mob"]} execute if score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless score gm4_survival_refightalized load.status matches 1.. as @n[tag=gm4_mu_debug_mob] run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/apply.mcfunction ================================================ # apply fear to this player # @s = player to hit with fear # at @s # run from mob/process/elite/vorpal/fear_hit # failsafe - don't fear spectators execute if entity @s[gamemode=spectator] run return 0 # particles and sound particle dust{color:[0.000,0.000,0.000],scale:1} ~ ~ ~ 0.0666 0.0666 0.0666 2 6 normal playsound minecraft:entity.witch.celebrate hostile @s ~ ~ ~ 1 2 playsound minecraft:entity.witch.death hostile @s ~ ~ ~ 1 0.666 # set timer scoreboard players operation $add_fear_time gm4_mu_data = $fear_seconds gm4_mu_data scoreboard players operation $add_fear_time gm4_mu_data *= #4 gm4_mu_data # effects effect give @s blindness 3 0 true effect give @s darkness 3 0 true effect give @s nausea 3 0 true effect give @s wither 1 0 true # apply attributes attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total attribute @s minecraft:attack_speed modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total attribute @s minecraft:block_break_speed modifier add gm4_monsters_unbound:feared -0.5 add_multiplied_total # apply fear scoreboard players operation @s gm4_mu_feared_time += $add_fear_time gm4_mu_data tag @s add gm4_mu_feared execute unless score $keep_tick.feared_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/fear 5t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/playsound.mcfunction ================================================ # play fear sounds # @s = player with fear effect # at @s # run from effect/fear/tick execute store result score $picksound gm4_mu_data run random value 1..11 execute if score $picksound gm4_mu_data matches 1..2 run playsound entity.creeper.primed hostile @s ^1 ^ ^-1 1 1 execute if score $picksound gm4_mu_data matches 3..4 run playsound entity.creeper.primed hostile @s ^-1 ^ ^-1 1 1 execute if score $picksound gm4_mu_data matches 5 run playsound entity.zombie.ambient hostile @s ^2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 6 run playsound entity.zombie.ambient hostile @s ^-2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 7 run playsound entity.skeleton.ambient hostile @s ^2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 8 run playsound entity.skeleton.ambient hostile @s ^-2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 9 run playsound entity.spider.ambient hostile @s ^2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 10 run playsound entity.spider.ambient hostile @s ^-2 ^ ^-3 1 1 execute if score $picksound gm4_mu_data matches 11 run playsound entity.witch.ambient hostile @s ^2 ^ ^-3 1 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/remove.mcfunction ================================================ # remove fear from this player # @s = player with fear effect # at @s # run from effect/fear/tick attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:feared attribute @s minecraft:attack_speed modifier remove gm4_monsters_unbound:feared attribute @s minecraft:block_break_speed modifier remove gm4_monsters_unbound:feared tag @s remove gm4_mu_feared ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/fear/tick.mcfunction ================================================ # tick fear effect for this player # @s = player with fear effect # at @s # run from clocks/effect/fear # tick down effect, remove if it reaches 0 scoreboard players remove @s gm4_mu_feared_time 1 execute if score @s gm4_mu_feared_time matches ..0 run return run function gm4_monsters_unbound:effect/fear/remove # re-apply effects effect give @s[scores={gm4_mu_feared_time=9..}] blindness 3 0 true effect give @s[scores={gm4_mu_feared_time=9..}] darkness 3 0 true effect give @s[scores={gm4_mu_feared_time=9..}] nausea 3 0 true effect give @s wither 1 0 true # sounds scoreboard players operation $playsound gm4_mu_data = @s gm4_mu_feared_time scoreboard players operation $playsound gm4_mu_data %= #4 gm4_mu_data execute if score $playsound gm4_mu_data matches 0 if predicate {condition:"random_chance",chance:0.666} run function gm4_monsters_unbound:effect/fear/playsound # particles execute anchored eyes run particle dust{color:[0.000,0.000,0.000],scale:4} ^ ^ ^0.15 0.2 0.2 0.2 2 6 force @s execute anchored eyes run particle dust{color:[0.000,0.000,0.000],scale:4} ^ ^ ^0.75 0.4 0.4 0.4 2 18 force @s # keep clock running scoreboard players set $keep_tick.feared_entity gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply.mcfunction ================================================ # apply freeze to this entity # @s = entity to freeze # at @s # run from effect/freeze/apply_from_slow # run from mob/process/elite/glacial/explode # don't freeze spectators execute if entity @s[gamemode=spectator] run return 0 # take tiny fraction of damage for show damage @s 0.01 freeze # set timer scoreboard players operation $add_freeze_time gm4_mu_data = $freeze_seconds gm4_mu_data scoreboard players operation $add_freeze_time gm4_mu_data *= #4 gm4_mu_data scoreboard players reset $freeze_seconds gm4_mu_data # set attributes based on entity type execute if entity @s[type=player] run function gm4_monsters_unbound:effect/freeze/apply_player execute if entity @s[type=!player] run function gm4_monsters_unbound:effect/freeze/apply_entity # apply freeze scoreboard players operation @s gm4_mu_frozen_time += $add_freeze_time gm4_mu_data tag @s add gm4_mu_frozen execute unless score $keep_tick.frozen_entity gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/effect/freeze 5t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_chill.mcfunction ================================================ # apply a stack of chill # @s = player that was hit # at unspecified # run from mob/process/attack_effect/slowing_attack execute if entity @s[tag=gm4_mu_immune_slowness] run return 0 scoreboard players set $slowness_level gm4_mu_data -1 execute if data entity @s active_effects[{id:"minecraft:slowness"}] store result score $slowness_level gm4_mu_data run data get entity @s active_effects[{id:"minecraft:slowness"}].amplifier execute store result storage gm4_monsters_unbound:temp slowness.level int 1 run scoreboard players add $slowness_level gm4_mu_data 1 execute unless score $slowness_level gm4_mu_data matches 6.. run function gm4_monsters_unbound:effect/freeze/stack_slow with storage gm4_monsters_unbound:temp slowness execute if score $slowness_level gm4_mu_data matches 6.. run function gm4_monsters_unbound:effect/freeze/apply_from_slow data remove storage gm4_monsters_unbound:temp slowness ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_entity.mcfunction ================================================ # apply freeze to this non-player entity # @s = non-player entity to freeze # at @s # run from effect/freeze/apply # apply attributes attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:follow_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:frozen 1 add_value ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_from_slow.mcfunction ================================================ # apply freeze from Chill slow # @s = entity with 7 stacks of Chill # at @s # run from effect/freeze/apply_chill effect clear @s slowness execute unless score $freeze_seconds gm4_mu_data matches 1.. run scoreboard players set $freeze_seconds gm4_mu_data 3 function gm4_monsters_unbound:effect/freeze/apply ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/apply_player.mcfunction ================================================ # apply freeze to this player # @s = player to freeze # at @s # run from effect/freeze/apply # apply attributes attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:attack_speed modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:frozen 1 add_multiplied_total attribute @s minecraft:entity_interaction_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total attribute @s minecraft:block_interaction_range modifier add gm4_monsters_unbound:frozen -1 add_multiplied_total ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/stack_slow.mcfunction ================================================ # stack slowness level on multiple Chill hits # @s = entity with slowness effect # at @s # run from effect/freeze/apply_chill $effect give @s slowness 15 $(level) ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/thaw_entity.mcfunction ================================================ # thaw entity # @s = entity with freeze effect # at @s # run from effect/freeze/tick attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:follow_range modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:jump_strength modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:frozen playsound minecraft:block.snow.break player @a ~ ~ ~ 1.5 1.25 tag @s remove gm4_mu_frozen ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/thaw_player.mcfunction ================================================ # thaw player # @s = player with freeze effect # at @s # run from effect/freeze/tick attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:attack_speed modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:jump_strength modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:entity_interaction_range modifier remove gm4_monsters_unbound:frozen attribute @s minecraft:block_interaction_range modifier remove gm4_monsters_unbound:frozen playsound minecraft:block.snow.break player @a ~ ~ ~ 1.5 1.25 tag @s remove gm4_mu_frozen ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/effect/freeze/tick.mcfunction ================================================ # tick freeze effect for this entity # @s = entity with freeze effect # at @s # run from clocks/effect/freeze scoreboard players remove @s gm4_mu_frozen_time 1 execute if score @s[type=player] gm4_mu_frozen_time matches ..0 run return run function gm4_monsters_unbound:effect/freeze/thaw_player execute if score @s[type=!player] gm4_mu_frozen_time matches ..0 run return run function gm4_monsters_unbound:effect/freeze/thaw_entity particle dust{color:[0.725,0.910,0.918],scale:2} ~ ~0.9 ~ 0.3 0.65 0.3 0 1 normal particle snowflake ~ ~0.9 ~ 0.3 0.65 0.3 0 6 normal scoreboard players set $keep_tick.frozen_entity gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/init.mcfunction ================================================ execute unless score monsters_unbound gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Monsters Unbound"} execute unless score monsters_unbound gm4_earliest_version < monsters_unbound gm4_modules run scoreboard players operation monsters_unbound gm4_earliest_version = monsters_unbound gm4_modules scoreboard players set monsters_unbound gm4_modules 1 # scoreboards scoreboard objectives add gm4_mu_data dummy scoreboard objectives add gm4_mu_timer dummy scoreboard objectives add gm4_mu_generation dummy scoreboard objectives add gm4_mu_frozen_time dummy scoreboard objectives add gm4_mu_feared_time dummy scoreboard objectives add gm4_mu_keep_tick dummy scoreboard objectives add gm4_mu_config dummy # add Survival Refightalized objectives for compatibility scoreboard objectives add gm4_sr_data dummy scoreboard objectives add gm4_sr_arrow.damage_change dummy scoreboard objectives add gm4_sr_arrow.fire_delay dummy # configs execute unless score $spawn_phantoms gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $spawn_phantoms gm4_mu_config 1 # disable natural phantom spawning execute unless score $phantoms_disabled gm4_mu_data matches 1 run gamerule spawn_phantoms false execute unless score $phantoms_disabled gm4_mu_data matches 1 run data modify storage gm4:log queue append value {type:"text",message:{"text":"[INFO] Monsters Unbound changed gamerule spawn_phantoms to false"}} scoreboard players set $phantoms_disabled gm4_mu_data 1 execute store result score $doinsomnia gm4_mu_data run gamerule spawn_phantoms execute if score $spawn_phantoms gm4_mu_config matches 1 if score $doinsomnia gm4_mu_data matches 1 run data modify storage gm4:log queue append value {type:"text",message:[{"text":"[WARN]","color":"red"},{"text":" Monsters Unbound requires minecraft:spawn_phantoms to be false, but it is true. ","color":"white"},{"text":"click here to fix","color":"red","click_event":{"action":"suggest_command","command":"/gamerule spawn_phantoms false"}}]} # mob caps execute unless score $mob_limit.husk_army gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.husk_army gm4_mu_config 128 execute unless score $mob_limit.spore_zombie gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.spore_zombie gm4_mu_config 128 execute unless score $mob_limit.phantom gm4_mu_config matches -2147483648..2147483647 run scoreboard players set $mob_limit.phantom gm4_mu_config 48 # elite teams team add gm4_mu_elite.glacial team modify gm4_mu_elite.glacial prefix {"translate":"text.gm4.monsters_unbound.elite_name.glacial","fallback":"Glacial "} team add gm4_mu_elite.mending team modify gm4_mu_elite.mending prefix {"translate":"text.gm4.monsters_unbound.elite_name.slate","fallback":"Slate "} team add gm4_mu_elite.blazing team modify gm4_mu_elite.blazing prefix {"translate":"text.gm4.monsters_unbound.elite_name.blazing","fallback":"Blazing "} team add gm4_mu_elite.zephyr team modify gm4_mu_elite.zephyr prefix {"translate":"text.gm4.monsters_unbound.elite_name.zephyr","fallback":"Zephyr "} team add gm4_mu_elite.gargantuan team modify gm4_mu_elite.gargantuan prefix {"translate":"text.gm4.monsters_unbound.elite_name.gargantuan","fallback":"Gargantuan "} team add gm4_mu_elite.vorpal team modify gm4_mu_elite.vorpal prefix {"translate":"text.gm4.monsters_unbound.elite_name.vorpal","fallback":"Vorpal "} team add gm4_mu_elite.splitting team modify gm4_mu_elite.splitting prefix {"translate":"text.gm4.monsters_unbound.elite_name.splitting","fallback":"Splitting "} team add gm4_mu_elite.split team modify gm4_mu_elite.split prefix {"translate":"text.gm4.monsters_unbound.elite_name.split","fallback":"Split "} team add gm4_mu_elite.volatile team modify gm4_mu_elite.volatile prefix {"translate":"text.gm4.monsters_unbound.elite_name.volatile","fallback":"Volatile "} team add gm4_mu_elite.pearlescent team modify gm4_mu_elite.pearlescent prefix {"translate":"text.gm4.monsters_unbound.elite_name.pearlescent","fallback":"Pearlescent "} # constants scoreboard players set #2 gm4_mu_data 2 scoreboard players set #4 gm4_mu_data 4 # start clocks schedule function gm4_monsters_unbound:tick 1t schedule function gm4_monsters_unbound:main 1t schedule function gm4_monsters_unbound:slow_clock 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/main.mcfunction ================================================ schedule function gm4_monsters_unbound:main 16t # modify mobs # if survival_refightalized is installed the modification is instead started from there execute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=!smithed.entity,tag=!gm4_mu_processed,nbt=!{PersistenceRequired:1b}] at @s run function gm4_monsters_unbound:mob/init/check_mob # phantoms drown under water # if survival_refightalized is installed this happens from there instead execute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=phantom,tag=!smithed.entity] at @s if block ~ ~ ~ #gm4:water run damage @s 2 drown # process cloaked creepers execute as @e[type=creeper,tag=gm4_mu_cloaked_creeper] at @s if entity @a[gamemode=!spectator,gamemode=!creative,distance=..3.1] run function gm4_monsters_unbound:mob/process/cloaked_creeper # zombie spores execute as @e[type=item,tag=gm4_mu_spore] at @s run function gm4_monsters_unbound:mob/process/spore/advance execute as @e[type=#gm4_monsters_unbound:zombie_types,tag=gm4_mu_spore_zombie,predicate=gm4_monsters_unbound:technical/on_fire] run function gm4_monsters_unbound:mob/process/spore/burn_on_head # traps execute as @e[type=marker,tag=gm4_mu_snowy_trap] at @s if entity @a[gamemode=!spectator,gamemode=!creative,distance=..7] run function gm4_monsters_unbound:mob/process/reveal_snowy_trap execute as @e[type=marker,tag=gm4_mu_dripstone_trap] at @s positioned ~-3.5 ~-34 ~-3.5 if entity @a[gamemode=!spectator,gamemode=!creative,dx=6,dy=28,dz=6] at @s run function gm4_monsters_unbound:mob/process/reveal_dripstone_trap # elites execute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.process] at @s run function gm4_monsters_unbound:mob/process/elite/check_type ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/check_mob.mcfunction ================================================ # initiate newly spawned mobs (mobs without any tags) # @s = mobs that can be buffed # at @s # run from main # /!\ This function only runs if Survival Refightalized is not installed # pre-mark mob as processed if it spawned in the air (from a spawner), these do not get modified # mobs in the modify_in_air list are ignored here execute if block ~ ~-0.01 ~ #gm4:no_collision run tag @s[type=!#gm4_monsters_unbound:modify_in_air] add gm4_sr_from_spawner # if the mob is riding another mob *do* modify them scoreboard players set $mounted gm4_mu_data 0 execute if entity @s[tag=gm4_sr_from_spawner] on vehicle run scoreboard players set $mounted gm4_mu_data 1 execute if score $mounted gm4_mu_data matches 1 run tag @s remove gm4_sr_from_spawner function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/pick.mcfunction ================================================ # pick elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/mob_type/skeleton/base # run from mob/init/mob_type/zombie/base tag @s add gm4_mu_elite # zombie villagers are not replaced execute if entity @s[type=zombie_villager] run return 0 # don't allow elites to be jockeys ride @s dismount # don't allow entities from splits to be elites execute if entity @s[tag=gm4_mu_split_entity] run return 0 # pick a random elite, or use prepicked if set execute store result score $elite_pick gm4_mu_data run random value 1..100 execute if score $prepicked_elite gm4_mu_data matches 1..100 run scoreboard players operation $elite_pick gm4_mu_data = $prepicked_elite gm4_mu_data scoreboard players reset $prepicked_elite gm4_mu_data # do not allow Gargantuan Elite if there is no space execute if score $elite_pick gm4_mu_data matches 96.. unless block ~ ~1 ~ #gm4:no_collision store result score $elite_pick gm4_mu_data run random value 1..95 # GLACIAL 15% # 3.5x health, 45% KB resist # attacks apply chill (15 sec stacking slowness, applies freeze at 7 stacks) # explode in a ball of frost on death, exploding after a delay to freeze entities inside for 3 seconds # frozen entities cannot act execute if score $elite_pick gm4_mu_data matches ..15 run return run function gm4_monsters_unbound:mob/init/elite/type/glacial # MENDING 15% # 2.5x health, -25% speed # heals undead in LoS, restoring 24 health and granting them resistance II for 1 second # explode in a healing orb on death, heals nearby mobs, can be destroyed to grant everything in radius regeneration execute if score $elite_pick gm4_mu_data matches 16..30 run return run function gm4_monsters_unbound:mob/init/elite/type/mending # ZEPHYR 15% # 3x health, +15% speed, +0.5 attack knockback, immune to fall damage # after spotting a player stand still to charge for ~4 seconds, then activate: # zombie: charge at the player, dealing 25% increased damage # skeleton: fire up to 16 arrows in rapid succession that deal 0.5 arrow damage, then gain a speed boost execute if score $elite_pick gm4_mu_data matches 31..45 run return run function gm4_monsters_unbound:mob/init/elite/type/zephyr # BLAZING 10% # 3.5x health, -45% speed, -99% damage, can't burn # fire aspect II / flame II # occasionally stops to shoot homing fireballs at the closest player, exploding when they hit terrain / a player to deal 5 explosion damage execute if score $elite_pick gm4_mu_data matches 46..55 run return run function gm4_monsters_unbound:mob/init/elite/type/blazing # VORPAL 10% # 3.5x health # can teleports up to 8 blocks away when hit, 65% chance # On Death shoot a black cloud tracking the closest player, causing them to go blind, obscuring their vision and removing sounds execute if score $elite_pick gm4_mu_data matches 56..65 run return run function gm4_monsters_unbound:mob/init/elite/type/vorpal # SPLITTING 10% # 3.5x health # on death splits into 5 miniature versions of the entity, with -50% in scale and reduced stats execute if score $elite_pick gm4_mu_data matches 66..75 run return run function gm4_monsters_unbound:mob/init/elite/type/splitting # VOLATILE 10% # 3.5x health, +20% movement speed, +25% attack damage, arrow delay set to 0 # calls down pillars of energy that explode after 4 seconds, leaving a dragon_fireball execute if score $elite_pick gm4_mu_data matches 76..85 run return run function gm4_monsters_unbound:mob/init/elite/type/volatile # PEARLESCENT 10% # 3.5x health # occasionally slow to shoot a beam of light at a player, damaging them over time execute if score $elite_pick gm4_mu_data matches 86..95 run return run function gm4_monsters_unbound:mob/init/elite/type/pearlescent # GARGANTUAN 5% # 6.5x health (4.5x for skeleton), +50% size, +35% attack damage, 1.75 attack knockback, 85% movement efficiency, -35% speed # projectile protection 4, skeletons have punch II and power I on bow # based on missing health gain up to 150% speed, 50% attack damage and from 85-100% knockback resistance # Occasionally charges up a stomp attack that slows and deals 75% damage to players within 7 blocks execute if score $elite_pick gm4_mu_data matches 96.. run return run function gm4_monsters_unbound:mob/init/elite/type/gargantuan ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/blazing.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.blazing attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.fire 2.5 add_multiplied_total attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.fire -0.99 add_multiplied_total attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.fire -0.45 add_multiplied_total attribute @s minecraft:burning_time modifier add gm4_monsters_unbound:elite_buff.fire -1 add_multiplied_total enchant @s[type=#gm4_monsters_unbound:skeleton_types] flame scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.damage_change -18 scoreboard players add @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 2 item replace entity @s[type=!#gm4_monsters_unbound:skeleton_types] weapon.mainhand with blaze_rod[enchantments={fire_aspect:2}] data modify entity @s drop_chances.mainhand set value 0 item replace entity @s armor.head with magma_block[enchantments={binding_curse:1},enchantment_glint_override=false] data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.blazing ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/gargantuan.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.gargantuan tag @s add gm4_mu_elite.process attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.giant 5.5 add_multiplied_total attribute @s minecraft:gravity modifier add gm4_monsters_unbound:elite_buff.giant 0.5 add_multiplied_total attribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:elite_buff.giant 0.5 add_multiplied_total attribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.giant 1.75 add_value attribute @s minecraft:water_movement_efficiency modifier add gm4_monsters_unbound:elite_buff.giant 0.85 add_value attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.giant -0.35 add_multiplied_total attribute @s[type=#gm4_monsters_unbound:skeleton_types] minecraft:scale modifier add gm4_monsters_unbound:elite_buff.giant_size 0.507537 add_multiplied_total attribute @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:scale modifier add gm4_monsters_unbound:elite_buff.giant_size 0.538461 add_multiplied_total enchant @s[type=#gm4_monsters_unbound:skeleton_types] punch 2 enchant @s[type=#gm4_monsters_unbound:skeleton_types] power 1 scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 7 item replace entity @s armor.head with cobblestone[enchantment_glint_override=false,minecraft:enchantments={projectile_protection:5,binding_curse:1}] 1 data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.gargantuan ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/glacial.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_slowing_attack tag @s add gm4_mu_elite.glacial attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.frost 2.5 add_multiplied_total attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:elite_buff.frost 0.45 add_value loot replace entity @s armor.head loot gm4_monsters_unbound:elite/glacial data modify entity @s drop_chances.head set value 1 team join gm4_mu_elite.glacial ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/mending.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.mending attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.heal 1.5 add_multiplied_total attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.heal -0.25 add_multiplied_total loot replace entity @s armor.head loot gm4_monsters_unbound:elite/mending data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.mending ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/pearlescent.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.pearlescent attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.pearlescent 2.5 add_multiplied_total attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent 0.2 add_multiplied_total item replace entity @s weapon.mainhand with air loot replace entity @s armor.head loot gm4_monsters_unbound:elite/pearlescent data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.pearlescent ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/splitting.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.splitting attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.vorpal 2.5 add_multiplied_total loot replace entity @s[type=!#gm4_monsters_unbound:skeleton_types] armor.head loot gm4_monsters_unbound:elite/splitting_zombie loot replace entity @s[type=#gm4_monsters_unbound:skeleton_types] armor.head loot gm4_monsters_unbound:elite/splitting_skeleton data modify entity @s drop_chances.head set value 1 team join gm4_mu_elite.splitting ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/volatile.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.volatile attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.volatile 2.5 add_multiplied_total loot replace entity @s armor.head loot gm4_monsters_unbound:elite/volatile data modify entity @s drop_chances.head set value 1 team join gm4_mu_elite.volatile scoreboard players set @s gm4_sr_arrow.fire_delay 0 scoreboard players set @s gm4_sr_arrow.damage_change -10 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/vorpal.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.vorpal tag @s add gm4_mu_elite.on_hit attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.vorpal 2.5 add_multiplied_total attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.vorpal 0.25 add_multiplied_total loot replace entity @s armor.head loot gm4_monsters_unbound:elite/vorpal data modify entity @s drop_chances.head set value 1 scoreboard players add @s gm4_sr_arrow.damage_change 5 team join gm4_mu_elite.vorpal ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/elite/type/zephyr.mcfunction ================================================ # pick this elite type to spawn # @s = zombie / skeleton types # at @s # run from mob/init/elite/pick tag @s add gm4_mu_elite.process tag @s add gm4_mu_elite.zephyr effect give @s wind_charged infinite 0 true attribute @s minecraft:max_health modifier add gm4_monsters_unbound:elite_buff.speed 2.5 add_multiplied_total attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed 0.15 add_multiplied_total attribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.speed 0.5 add_value attribute @s minecraft:fall_damage_multiplier modifier add gm4_monsters_unbound:elite_buff.speed -1 add_multiplied_total item replace entity @s armor.head with white_wool[enchantments={binding_curse:1},enchantment_glint_override=false] data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.zephyr scoreboard players set @s gm4_sr_arrow.fire_delay 0 scoreboard players set @s gm4_sr_arrow.damage_change -15 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/initialize.mcfunction ================================================ # initiate newly spawned mobs (mobs without any tags) # @s = mobs that can be buffed # at @s # run from mob/init/check_mob # /!\ This function only runs if Survival Refightalized is not installed scoreboard players reset $mob_extras gm4_sr_data tag @s add gm4_mu_processed # remove baby zombies except chicken jockeys (will be turned into Elites) scoreboard players set $was_baby gm4_mu_data 0 execute if entity @s[type=zombie] if predicate {condition:"all_of",terms:[{condition:"entity_properties",entity:"this",predicate:{flags:{is_baby:1b}}},{condition:"inverted",term:{condition:"entity_properties",entity:"this",predicate:{vehicle:{}}}}]} store success score $was_baby gm4_mu_data run data modify entity @s IsBaby set value 0b execute if score $was_baby gm4_mu_data matches 1 run tag @s add gm4_sr_was_baby function gm4_monsters_unbound:mob/init/mob_type # heal to max health effect give @s[type=#minecraft:undead] instant_damage 1 20 true effect give @s[type=!#minecraft:undead] instant_health 1 20 true # process any spawned mobs (uses sr instead of mu to be compatible with survival_refightalized) execute if score $mob_extras gm4_sr_data matches 1.. unless entity @s[tag=gm4_sr_extra_mob] as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob] at @s run function gm4_monsters_unbound:mob/init/initialize tag @s remove gm4_sr_extra_mob ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/base.mcfunction ================================================ # calculate modifiers for newly spawned creeper # @s = creeper # at @s # run from mob/init/mob_type # | Biome Modifiers # snowy execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/snowy] run function gm4_monsters_unbound:mob/init/mob_type/creeper/snowy # mountainous execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.30},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/mountainous"}]} run function gm4_monsters_unbound:mob/init/mob_type/creeper/mountainous # burned execute if predicate gm4_monsters_unbound:biome/burned store result entity @s Fuse int 0.75 run data get entity @s Fuse # flowering execute if predicate gm4_monsters_unbound:biome/flowering run function gm4_monsters_unbound:mob/init/mob_type/creeper/flowering # toxic tag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_toxic_creeper execute if entity @s[tag=gm4_mu_toxic_creeper] run function gm4_monsters_unbound:mob/process/toxic_creeper # growth attribute @s[predicate=gm4_monsters_unbound:biome/growth] minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.growth 0.2 add_multiplied_base # underground data modify entity @s[predicate=gm4_monsters_unbound:mob/underground] ExplosionRadius set value 4s # dripstone caves execute if biome ~ ~ ~ dripstone_caves if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/creeper/dripstone_caves ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/dripstone_caves.mcfunction ================================================ # replace with spider # @s = creeper # at @s # run from mob/init/mob_type/creeper/base summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/flowering.mcfunction ================================================ # apply invisibility to creeper # @s = creeper # at @s # run from mob/init/mob_type/creeper/base tag @s add gm4_mu_cloaked_creeper effect give @s invisibility 35 0 data modify entity @s ExplosionRadius set value 2s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/mountainous.mcfunction ================================================ # make this creeper stronger # @s = creeper # at @s # run from mob/init/mob_type/creeper/base attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:stat_change.gargantuan 0.4 add_value attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/creeper/snowy.mcfunction ================================================ # replace creeper with a snowy trap or zombie/stray # @s = creeper # at @s # run from mob/init/mob_type/creeper/base tp @s ~ ~-2050 ~ kill @s scoreboard players set $removed_mob gm4_sr_data 1 execute if block ~ ~ ~ snow run return run summon marker ~ ~ ~ {Tags:["gm4_mu_trap","gm4_mu_snowy_trap"],CustomName:'{"text":"GM4 Monsters Unbound - Snow Trap"}'} execute store result score $pick_entity gm4_mu_data run random value 1..2 scoreboard players set $mob_extras gm4_sr_data 1 execute if score $pick_entity gm4_mu_data matches 1 run summon zombie ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if score $pick_entity gm4_mu_data matches 2 run summon stray ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/base.mcfunction ================================================ # calculate modifiers for newly spawned enderman # @s = enderman # at @s # run from mob/init/mob_type # | Biome Modifiers # flowering execute if predicate gm4_monsters_unbound:biome/flowering if predicate {condition:"minecraft:random_chance",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/enderman/flowering # toxic execute if predicate gm4_monsters_unbound:biome/toxic if predicate {condition:"minecraft:random_chance",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/enderman/toxic # burned execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/burned] store success score $mob_extras gm4_sr_data run summon enderman ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/burned] store success score $mob_extras gm4_sr_data run summon enderman ~-.05 ~ ~.05 {Tags:["gm4_sr_extra_mob"]} # growth execute if predicate gm4_monsters_unbound:biome/growth run function gm4_monsters_unbound:mob/init/mob_type/enderman/growth # underground execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:technical/underground] if predicate {condition:"minecraft:random_chance",chance:0.15} run function gm4_monsters_unbound:mob/init/mob_type/enderman/underground # dripstone caves execute if biome ~ ~ ~ dripstone_caves if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/enderman/dripstone_caves # the end execute if dimension the_end run attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.the_end 0.2 add_multiplied_base execute if dimension the_end run attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.the_end 0.15 add_multiplied_base # nether wastes execute if biome ~ ~ ~ nether_wastes if predicate {condition:"minecraft:random_chance",chance:0.95} run function gm4_monsters_unbound:mob/init/mob_type/enderman/nether_wastes # soul sand valley execute if biome ~ ~ ~ soul_sand_valley if predicate {condition:"minecraft:random_chance",chance:0.95} run function gm4_monsters_unbound:mob/init/mob_type/enderman/soul_sand_valley ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/dripstone_caves.mcfunction ================================================ # replace with spider # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/flowering.mcfunction ================================================ # replace enderman with a slime # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon slime ~ ~ ~ {Tags:["gm4_sr_extra_mob"],Size:2} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/growth.mcfunction ================================================ # replace enderman with a 3 skeletons # @s = enderman # at @s # run from mob/init/mob_type/enderman/base execute if biome ~ ~ ~ mangrove_swamp run summon bogged ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if biome ~ ~ ~ snowy_taiga run summon stray ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute unless biome ~ ~ ~ mangrove_swamp unless biome ~ ~ ~ snowy_taiga run summon skeleton ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} summon skeleton ~0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"]} summon skeleton ~-0.15 ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/nether_wastes.mcfunction ================================================ # replace enderman with blaze # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon blaze ~ ~0.3 ~ {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/soul_sand_valley.mcfunction ================================================ # replace enderman with wither skeleton # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon wither_skeleton ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/toxic.mcfunction ================================================ # replace enderman with a witch # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon witch ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/enderman/underground.mcfunction ================================================ # spawn 5 more enderman # @s = enderman # at @s # run from mob/init/mob_type/enderman/base summon enderman ~0.15 ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} summon enderman ~0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"]} summon enderman ~-0.15 ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} summon enderman ~0.15 ~ ~ {Tags:["gm4_sr_extra_mob"]} summon enderman ~ ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/base.mcfunction ================================================ # calculate modifiers for newly spawned skeleton / stray # @s = skeleton types # at @s # run from mob/init/mob_type # elites - don't get other modifiers - 5% of spawns execute store result score $nearby_elites gm4_mu_data if entity @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite,distance=..64] execute if score $nearby_elites gm4_mu_data matches ..3 if predicate {condition:"minecraft:random_chance",chance:0.05} run tag @s[tag=!gm4_sr_extra_mob] add gm4_mu_elite execute if entity @s[tag=gm4_mu_elite,tag=!gm4_sr_from_spawner] run return run function gm4_monsters_unbound:mob/init/elite/pick # | Biome Modifiers # snowy execute if entity @s[type=stray,predicate=gm4_monsters_unbound:biome/snowy,predicate=!gm4_monsters_unbound:biome/growth] run loot replace entity @s weapon.offhand loot gm4_monsters_unbound:mob/equip_arrow/stray_snowy # mountainous execute if predicate gm4_monsters_unbound:biome/mountainous positioned ~ ~35 ~ store result score $phantom_count gm4_mu_data if entity @e[type=phantom,distance=..32] execute if score $spawn_phantoms gm4_mu_config matches 1 if score $phantom_count gm4_mu_data < $mob_limit.phantom gm4_mu_config if predicate gm4_monsters_unbound:chance/spawn_phantom run function gm4_monsters_unbound:mob/init/mob_type/zombie/spawn_phantoms # flowering execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.85},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/flowering"}]} run function gm4_monsters_unbound:mob/init/mob_type/skeleton/flowering # toxic tag @s add gm4_mu_self execute if entity @s[type=bogged,predicate=gm4_monsters_unbound:biome/toxic] if predicate {condition:"minecraft:random_chance",chance:0.15} summon spider run function gm4_monsters_unbound:mob/init/mob_type/skeleton/toxic tag @s remove gm4_mu_self # burning execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.15},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/burned"}]} run enchant @s flame 1 # growth execute if entity @s[type=!bogged,predicate=gm4_monsters_unbound:biome/growth] run function gm4_monsters_unbound:mob/init/mob_type/skeleton/growth # dripstone caves execute if predicate {condition:"minecraft:all_of",terms:[{condition:"location_check",predicate:{biomes:"dripstone_caves"}},{condition:"random_chance",chance:0.6}]} run item replace entity @s weapon.mainhand with stone_pickaxe # underground execute if predicate gm4_monsters_unbound:technical/underground if predicate {condition:"minecraft:random_chance",chance:0.4} run function gm4_monsters_unbound:mob/init/mob_type/skeleton/underground # soul sand valley execute if biome ~ ~ ~ soul_sand_valley run effect give @s fire_resistance infinite 0 true ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/flowering.mcfunction ================================================ # replace skeleton with zombie # @s = skeleton # at @s # run from mob/init/mob_type/skeleton/base summon zombie ~.1 ~ ~ {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 tp @s ~ ~-2050 ~ kill @s scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/growth.mcfunction ================================================ # apply growth effects to skeleton # @s = skeleton # at @s # run from mob/init/mob_type/skeleton/base item replace entity @s weapon.mainhand with air attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.growth 4 add_value attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.growth 0.25 add_multiplied_base ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/toxic.mcfunction ================================================ # make the bogged ride a spider # @s = bogged # at @s # run from mob/init/mob_type/skeleton/base tag @s add gm4_sr_extra_mob ride @e[tag=gm4_mu_self,distance=..0.1,limit=1] mount @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/skeleton/underground.mcfunction ================================================ # apply an underground buff # @s = skeleton # at @s # run from mob/init/mob_type/skeleton/base execute store result score $buff_picked gm4_mu_data run random value 1..4 execute if score $buff_picked gm4_mu_data matches 1 run effect give @s regeneration infinite 0 execute if score $buff_picked gm4_mu_data matches 2 run scoreboard players add @s[tag=!gm4_mu_elite.split_entity] gm4_sr_arrow.damage_change 4 execute if score $buff_picked gm4_mu_data matches 3 run scoreboard players remove @s gm4_sr_arrow.fire_delay 1 execute if score $buff_picked gm4_mu_data matches 4 run item replace entity @s weapon.mainhand with stone_sword ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/cave_spider.mcfunction ================================================ # calculate modifiers for newly spawned cave spider # @s = cave spider # at @s # run from mob/init/mob_type # | Biome Modifiers # mountainous execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.40},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/mountainous"}]} run effect give @s speed infinite 0 # burned execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.50},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/burned"}]} run effect give @s fire_resistance infinite 0 # toxic tag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_toxic_attack # growth execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] store success score $mob_extras gm4_sr_data run summon cave_spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] if predicate {condition:"minecraft:random_chance",chance:0.60} store success score $mob_extras gm4_sr_data run summon cave_spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} # dripstone caves execute if biome ~ ~ ~ dripstone_caves run attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.dripstone_caves 1 add_multiplied_total ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/gargantuan.mcfunction ================================================ # make spider gargantuan # @s = spider # at @s # run from mob/init/mob_type/spider/spider # run from mob/init/mob_type/spider/underground/pick attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total attribute @s minecraft:scale modifier add gm4_monsters_unbound:stat_change.gargantuan 0.25 add_multiplied_total attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.gargantuan 0.75 add_multiplied_total effect give @s weaving infinite 0 team join gm4_mu_elite.gargantuan tag @s add gm4_mu_elite tag @s add gm4_mu_elite.gargantuan ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/lush_caves.mcfunction ================================================ # replace spider with 4 silverfish # @s = spider # at @s # run from mob/init/mob_type/spider/spider summon silverfish ~0.15 ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} summon silverfish ~0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"]} summon silverfish ~-0.15 ~ ~0.15 {Tags:["gm4_sr_extra_mob"]} summon silverfish ~-0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/spider.mcfunction ================================================ # calculate modifiers for newly spawned spider # @s = spider # at @s # run from mob/init/mob_type # | Biome Modifiers # snowy execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.15},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/snowy"}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan # mountainous execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.40},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/mountainous"}]} run effect give @s speed infinite 0 # burned execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.50},{condition:"minecraft:reference",name:"gm4_monsters_unbound:biome/burned"}]} run effect give @s fire_resistance infinite 0 # flowering execute if biome ~ ~ ~ lush_caves if predicate {condition:"minecraft:random_chance",chance:0.50} run function gm4_monsters_unbound:mob/init/mob_type/spider/lush_caves # toxic execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/toxic] run function gm4_monsters_unbound:mob/init/mob_type/spider/toxic # growth execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] store success score $mob_extras gm4_sr_data run summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if entity @s[tag=!gm4_sr_extra_mob,predicate=gm4_monsters_unbound:biome/growth] if predicate {condition:"minecraft:random_chance",chance:0.60} store success score $mob_extras gm4_sr_data run summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} # dripstone caves execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.1},{condition:"minecraft:location_check",predicate:{biomes:"dripstone_caves"}}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan # underground execute if predicate {condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:0.25},{condition:"minecraft:reference",name:"gm4_monsters_unbound:technical/underground"}]} run function gm4_monsters_unbound:mob/init/mob_type/spider/underground/pick ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/toxic.mcfunction ================================================ # summon 3 cave spiders # @s = spider # at @s # run from mob/init/mob_type/spider/spider summon cave_spider ~ ~ ~0.15 {Tags:["gm4_sr_extra_mob"],attributes:[{id:"minecraft:max_health",base:9}]} summon cave_spider ~0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"],attributes:[{id:"minecraft:max_health",base:9}]} summon cave_spider ~-0.15 ~ ~-0.15 {Tags:["gm4_sr_extra_mob"],attributes:[{id:"minecraft:max_health",base:9}]} scoreboard players set $mob_extras gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/underground/pick.mcfunction ================================================ # pick underground buff # @s = spider # at @s # run from mob/init/mob_type/spider/spider execute store result score $buff_picked gm4_mu_data run random value 1..3 execute if score $buff_picked gm4_mu_data matches 1 run effect give @s invisibility infinite 0 execute if score $buff_picked gm4_mu_data matches 2 run function gm4_monsters_unbound:mob/init/mob_type/spider/gargantuan execute if score $buff_picked gm4_mu_data matches 3 run function gm4_monsters_unbound:mob/init/mob_type/spider/underground/replace_with_cave_spider ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/spider/underground/replace_with_cave_spider.mcfunction ================================================ # replace with cave spider # @s = spider # at @s # run from mob/init/mob_type/spider/underground/pick summon cave_spider ~.1 ~ ~ {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 tp @s ~ ~-2050 ~ kill @s scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/base.mcfunction ================================================ # calculate modifiers for newly spawned zombie / zombie villager # @s = zombie types # at @s # run from mob/init/mob_type # elites - don't get other modifiers - 5% of spawns (replaces baby zombies) execute if entity @s[tag=gm4_sr_was_baby,tag=!gm4_sr_from_spawner] store result score $nearby_elites gm4_mu_data if entity @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite,distance=..64] execute if entity @s[tag=gm4_sr_was_baby,tag=!gm4_sr_from_spawner] if score $nearby_elites gm4_mu_data matches ..3 run return run function gm4_monsters_unbound:mob/init/elite/pick # | Biome Modifiers # snowy execute if predicate gm4_monsters_unbound:biome/snowy run function gm4_monsters_unbound:mob/init/mob_type/zombie/snowy tag @s[predicate=gm4_monsters_unbound:biome/snowy] add gm4_mu_slowing_attack # mountainous execute if predicate gm4_monsters_unbound:biome/mountainous run function gm4_monsters_unbound:mob/init/mob_type/zombie/mountainous # burned execute if entity @s[type=husk,predicate=gm4_monsters_unbound:biome/burned] run function gm4_monsters_unbound:mob/init/mob_type/zombie/burned_husk # flowering execute if predicate gm4_monsters_unbound:biome/flowering run tag @s add gm4_mu_spore_zombie execute if entity @s[tag=gm4_mu_spore_zombie] run function gm4_monsters_unbound:mob/init/mob_type/zombie/flowering # toxic tag @s[predicate=gm4_monsters_unbound:biome/toxic] add gm4_mu_weakness_attack effect give @s[predicate=gm4_monsters_unbound:biome/toxic] infested infinite 0 # reef execute if entity @s[type=drowned,predicate=gm4_monsters_unbound:biome/reef] run function gm4_monsters_unbound:mob/init/mob_type/zombie/reef_drowned # growth execute if entity @s[type=!zombie_villager,tag=!gm4_mu_spore_zombie,predicate=gm4_monsters_unbound:biome/growth] run function gm4_monsters_unbound:mob/init/mob_type/zombie/growth # dripstone caves execute if entity @s[tag=!gm4_sr_extra_mob] if biome ~ ~ ~ dripstone_caves run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/try # underground (not dripstone caves) execute if predicate {condition:"all_of",terms:[{condition:"reference",name:"gm4_monsters_unbound:technical/underground"},{condition:"inverted",term:{condition:"location_check",predicate:{"biomes":"dripstone_caves"}}},{condition:"random_chance",chance:0.5}]} run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/pick ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/burned_husk.mcfunction ================================================ # apply burned husk effects # @s = husk # at @s # run from mob/init/mob_type/zombie/base attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.burned_husk -0.65 add_multiplied_total attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.burned_husk -0.25 add_multiplied_total execute at @p[gamemode=!spectator] store result score $husk_count gm4_mu_data if entity @e[type=husk,distance=..128] execute if entity @s[tag=!gm4_sr_extra_mob] unless score $husk_count gm4_mu_data > $mob_limit.husk_army gm4_mu_config run function gm4_monsters_unbound:mob/init/mob_type/zombie/burned_husk_army ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/burned_husk_army.mcfunction ================================================ # spawn up to 11 extra husks # @s = husk # at @s # run from mob/init/mob_type/zombie/burned_husk execute if block ~1 ~ ~ #gm4:no_collision if block ~1 ~1 ~ #gm4:no_collision run summon husk ~1 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if block ~-1 ~ ~ #gm4:no_collision if block ~-1 ~1 ~ #gm4:no_collision run summon husk ~-1 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if block ~ ~ ~1 #gm4:no_collision if block ~ ~1 ~1 #gm4:no_collision run summon husk ~ ~ ~1 {Tags:["gm4_sr_extra_mob"]} execute if block ~ ~ ~-1 #gm4:no_collision if block ~ ~1 ~-1 #gm4:no_collision run summon husk ~ ~ ~-1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.5} if block ~1 ~ ~1 #gm4:no_collision if block ~1 ~1 ~1 #gm4:no_collision run summon husk ~1 ~ ~1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.5} if block ~-1 ~ ~-1 #gm4:no_collision if block ~-1 ~1 ~-1 #gm4:no_collision run summon husk ~-1 ~ ~-1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.5} if block ~1 ~ ~-1 #gm4:no_collision if block ~1 ~1 ~-1 #gm4:no_collision run summon husk ~1 ~ ~-1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.25} if block ~-1 ~ ~1 #gm4:no_collision if block ~-1 ~1 ~1 #gm4:no_collision run summon husk ~-1 ~ ~1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.25} if block ~2 ~ ~-1 #gm4:no_collision if block ~2 ~1 ~-1 #gm4:no_collision run summon husk ~2 ~ ~-1 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.25} if block ~-1 ~ ~2 #gm4:no_collision if block ~-1 ~1 ~2 #gm4:no_collision run summon husk ~-1 ~ ~2 {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.25} if block ~2 ~ ~2 #gm4:no_collision if block ~2 ~1 ~2 #gm4:no_collision run summon husk ~2 ~ ~2 {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/place.mcfunction ================================================ # place dripstone trap # @s = zombie # at @s positioned ~ ~x ~ # run from mob/init/mob_type/zombie/dripstone_caves/raycast tp @s ~ ~-2050 ~ kill @s scoreboard players set $removed_mob gm4_sr_data 1 scoreboard players set $raycast_limit gm4_mu_data -1 execute align y run summon marker ~ ~ ~ {Tags:["gm4_mu_trap","gm4_mu_dripstone_trap"],CustomName:'{"text":"GM4 Monsters Unbound - Dripstone Trap"}'} ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/raycast.mcfunction ================================================ # zombie dripstone try to find place for a trap # @s = zombie # at @s positioned ~ ~x ~ # run from mob/init/mob_type/zombie/dripstone_caves/try # run from here execute if block ~ ~1 ~ #gm4_monsters_unbound:dripstone run return run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/place scoreboard players remove $raycast_limit gm4_mu_data 1 execute if score $raycast_limit gm4_mu_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/raycast ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/dripstone_caves/try.mcfunction ================================================ # zombie dripstone try to place a trap # @s = zombie # at @s # run from mob/init/mob_type/zombie/base tp @s ~ ~-2050 ~ kill @s scoreboard players set $removed_mob gm4_sr_data 1 scoreboard players set $raycast_limit gm4_mu_data 32 execute positioned ~ ~1 ~ run function gm4_monsters_unbound:mob/init/mob_type/zombie/dripstone_caves/raycast # stop if the raycast was succesful execute if score $raycast_limit gm4_mu_data matches -1 run return 0 scoreboard players set $spawned_mob gm4_mu_data 0 execute if block ~.875 ~ ~.875 #gm4:no_collision if block ~.875 ~ ~-.875 #gm4:no_collision if block ~-.875 ~ ~.875 #gm4:no_collision if block ~-.875 ~ ~-.875 #gm4:no_collision store success score $spawned_mob gm4_mu_data run summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if score $spawned_mob gm4_mu_data matches 0 run summon skeleton ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} scoreboard players set $mob_extras gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/equip_shield.mcfunction ================================================ # give the zombie a shield and bonus stats # @s = zombie # at @s # run from mob/init/mob_type/zombie/underground/pick # run from mob/init/mob_type/zombie/mountainous # run from mob/init/mob_type/zombie/snowy tag @s add gm4_mu_shielded_zombie item replace entity @s weapon.offhand with shield attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:stat_change.shield 0.9 add_value attribute @s minecraft:armor modifier add gm4_monsters_unbound:stat_change.shield 20 add_value attribute @s minecraft:armor_toughness modifier add gm4_monsters_unbound:stat_change.shield 10 add_value ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/flowering.mcfunction ================================================ # set flowering zombie stats # @s = zombie # at @s # run from mob/init/mob_type/zombie/base # in cherry grove use cherry leaves execute if biome ~ ~ ~ cherry_grove run tag @s add gm4_mu_spore_zombie.cherry # lower max health attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.spore_zombie -0.2 add_multiplied_total # put spore on head and store generation loot replace entity @s armor.head loot gm4_monsters_unbound:mob/equip_armor/spore execute store result entity @s equipment.head.components."minecraft:custom_data".gm4_mu_spore.generation int 1 run scoreboard players add @s gm4_mu_generation 1 # let generation determine dropchance of spore scoreboard players set $spore_dropchange gm4_mu_data 11 execute store result entity @s drop_chances.head float 0.1 run scoreboard players operation $spore_dropchange gm4_mu_data -= @s gm4_mu_generation # remove any possible elite triggers data remove entity @s attributes[{id:"minecraft:max_health"}].modifiers[{id:"minecraft:leader_zombie_bonus"}] data modify entity @s IsBaby set value 0b tag @s remove gm4_sr_was_baby ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/growth.mcfunction ================================================ # apply growth effects to zombie # @s = zombie # at @s # run from mob/init/mob_type/zombie/base execute if biome ~ ~ ~ mangrove_swamp run summon bogged ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if biome ~ ~ ~ snowy_taiga run summon stray ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} execute unless biome ~ ~ ~ mangrove_swamp unless biome ~ ~ ~ snowy_taiga run summon skeleton ~.05 ~ ~ {Tags:["gm4_sr_extra_mob"]} summon skeleton ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} summon skeleton ~-.05 ~ ~.05 {Tags:["gm4_sr_extra_mob"]} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/mountainous.mcfunction ================================================ # set mountain zombie stats # @s = zombie # at @s # run from mob/init/mob_type/zombie/base execute positioned ~ ~35 ~ store result score $phantom_count gm4_mu_data if entity @e[type=phantom,distance=..32] execute if score $spawn_phantoms gm4_mu_config matches 1 if score $phantom_count gm4_mu_data < $mob_limit.phantom gm4_mu_config if predicate gm4_monsters_unbound:chance/spawn_phantom run function gm4_monsters_unbound:mob/init/mob_type/zombie/spawn_phantoms attribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:stat_change.mountainous 1 add_value attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.mountainous 1 add_value execute if predicate {condition:"minecraft:random_chance",chance:0.15} run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/reef_drowned.mcfunction ================================================ # apply reef effects to drowned # @s = drowned # at @s # run from mob/init/mob_type/zombie/base attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.reef 1 add_multiplied_base attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.reef 2 add_value execute if predicate {condition:"minecraft:random_chance",chance:0.6} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon drowned ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.6} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon drowned ~ ~ ~ {Tags:["gm4_sr_extra_mob"]} execute if predicate {condition:"minecraft:random_chance",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~ execute if predicate {condition:"minecraft:random_chance",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~ execute if predicate {condition:"minecraft:random_chance",chance:0.45} if entity @s[tag=!gm4_sr_extra_mob] store success score $mob_extras gm4_sr_data run summon guardian ~ ~ ~ execute if predicate {condition:"minecraft:random_chance",chance:0.33} run item replace entity @s[tag=!gm4_sr_extra_mob] weapon.mainhand with trident scoreboard players set @s gm4_sr_arrow.fire_delay 0 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/snowy.mcfunction ================================================ # set snowy zombie stats # @s = zombie # at @s # run from mob/init/mob_type/zombie/base attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:stat_change.snowy -0.15 add_multiplied_total attribute @s minecraft:max_health modifier add gm4_monsters_unbound:stat_change.snowy 0.2 add_multiplied_total execute if predicate {condition:"minecraft:random_chance",chance:0.05} run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/spawn_phantoms.mcfunction ================================================ # spawn phantoms # @s = zombie / skeleton # at @s # run from mob/init/mob_type/zombie/base # run from mob/init/mob_type/skeleton/base execute if block ~ ~35 ~ #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~ ~35 ~ {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} execute if block ~2 ~35 ~ #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~2 ~35 ~ {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} execute if block ~-1 ~35 ~2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-1 ~35 ~2 {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} execute if predicate {condition:"random_chance",chance:0.5} if block ~-2 ~35 ~-1 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-2 ~35 ~-1 {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} execute if predicate {condition:"random_chance",chance:0.5} if block ~2 ~35 ~-2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~2 ~35 ~-2 {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} execute if predicate {condition:"random_chance",chance:0.5} if block ~-2 ~35 ~2 #gm4:no_collision store success score $mob_extras gm4_sr_data run summon phantom ~-2 ~35 ~2 {Tags:["gm4_sr_extra_mob","gm4_mu_phantom"]} ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/offhand_weapon.mcfunction ================================================ # give the zombie an offhand weapon and bonus stats # @s = zombie # at @s # run from mob/init/mob_type/zombie/underground/pick tag @s add gm4_mu_offhanding_zombie item replace entity @s weapon.offhand with stone_sword attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:stat_change.offhand_weapon 1.5 add_value ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/pick.mcfunction ================================================ # pick underground buff # @s = zombie # at @s # run from mob/init/mob_type/zombie/base execute store result score $buff_picked gm4_mu_data run random value 1..6 execute if score $buff_picked gm4_mu_data matches 1 run effect give @s resistance infinite 0 execute if score $buff_picked gm4_mu_data matches 2 run effect give @s speed infinite 0 execute if score $buff_picked gm4_mu_data matches 3 run effect give @s regeneration infinite 0 execute if score $buff_picked gm4_mu_data matches 4 run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/offhand_weapon execute if score $buff_picked gm4_mu_data matches 5 run function gm4_monsters_unbound:mob/init/mob_type/zombie/equip_shield execute if score $buff_picked gm4_mu_data matches 6 run function gm4_monsters_unbound:mob/init/mob_type/zombie/underground/replace_with_skeleton ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type/zombie/underground/replace_with_skeleton.mcfunction ================================================ # replace with 2 melee skeletons # @s = zombie # at @s # run from mob/init/mob_type/zombie/underground/pick # gm4_sr_melee_skeleton tag is to avoid survival_refightalized treating this skeleton as holding a bow summon skeleton ~.05 ~ ~ {Tags:["gm4_sr_extra_mob","gm4_sr_melee_skeleton"],equipment:{}} summon skeleton ~ ~ ~ {Tags:["gm4_sr_extra_mob","gm4_sr_melee_skeleton"],equipment:{}} tp @s ~ ~-2050 ~ kill @s scoreboard players set $mob_extras gm4_sr_data 1 scoreboard players set $removed_mob gm4_sr_data 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/init/mob_type.mcfunction ================================================ # check what mob is being processed # @s = mobs that can be buffed # at @s # run from mob/init/initialize # run from function call gm4_survival_refightalized:init_mob, from gm4_survival_refightalized:mob/init/initiate # zombie, zombie_villager, husk, drowned execute if entity @s[type=#gm4_monsters_unbound:zombie_types] run return run function gm4_monsters_unbound:mob/init/mob_type/zombie/base # skeleton, bogged, stray execute if entity @s[type=#gm4_monsters_unbound:skeleton_types,type=!wither_skeleton] run return run function gm4_monsters_unbound:mob/init/mob_type/skeleton/base execute if entity @s[type=spider] run return run function gm4_monsters_unbound:mob/init/mob_type/spider/spider execute if entity @s[type=creeper] run return run function gm4_monsters_unbound:mob/init/mob_type/creeper/base execute if entity @s[type=cave_spider] run return run function gm4_monsters_unbound:mob/init/mob_type/spider/cave_spider execute if entity @s[type=enderman] run return run function gm4_monsters_unbound:mob/init/mob_type/enderman/base ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/charging_attack.mcfunction ================================================ # damage players hit by charging attacks # @s = player that was hit # at unspecified advancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/charging execute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_charging_attack,limit=1,sort=nearest] run function gm4_monsters_unbound:mob/process/elite/zephyr/charge_complete effect give @s slowness 1 3 true effect give @s nausea 4 0 false summon breeze_wind_charge ~ ~ ~ {Motion:[0.0d,-1.0d,0.0d]} ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/slowing_attack.mcfunction ================================================ # slow players hit with slowing attack # @s = player that was hit # at unspecified advancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/slowing scoreboard players set $freeze_seconds gm4_mu_data 3 function gm4_monsters_unbound:effect/freeze/apply_chill ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/toxic_attack.mcfunction ================================================ # weakness and hunger players hit with a toxic attack # @s = player that was hit # at unspecified advancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/toxic # scale effect with world difficulty (on easy no effect is applied) execute store result score $worlddiff gm4_mu_data run difficulty execute if score $worlddiff gm4_mu_data matches 2 run effect give @s[tag=!gm4_mu_immune_weakness] weakness 2 0 execute if score $worlddiff gm4_mu_data matches 3 run effect give @s[tag=!gm4_mu_immune_weakness] weakness 4 0 execute if score $worlddiff gm4_mu_data matches 2 run effect give @s[tag=!gm4_mu_immune_hunger] hunger 2 2 execute if score $worlddiff gm4_mu_data matches 3 run effect give @s[tag=!gm4_mu_immune_hunger] hunger 4 2 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/attack_effect/weakness_attack.mcfunction ================================================ # weaken players hit with weakness attack # @s = player that was hit # at unspecified advancement revoke @s only gm4_monsters_unbound:damaged/attack_effect/weakness effect give @s[tag=!gm4_mu_immune_weakness] weakness 15 0 effect give @s[tag=!gm4_mu_immune_hunger] hunger 15 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/cloaked_creeper.mcfunction ================================================ # uncloak creeper if a player is nearby # @s = cloaked creeper # at @s # run from main effect clear @s invisibility tag @s remove gm4_mu_cloaked_creeper ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/flare_damage.mcfunction ================================================ # damage player hit by flare # @s = player # at near @s # run from mob/process/elite/blazing/flare_explode execute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages gamerule show_death_messages false damage @s 5 explosion tag @s add gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a ["",{"translate":"text.gm4.monsters_unbound.death.blazing_elite_flare","fallback":"%s was blown up by a Blazing Flare",with:[{"selector":"@s"}]}] tag @s remove gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/flare_explode.mcfunction ================================================ # explode the flare # @s = flare block_display # at @s # run from mob/process/elite/blazing/process_flare particle flame ~ ~ ~ 0.01 0.01 0.01 0.1 32 particle explosion ~ ~ ~ 0 0 0 40 0 playsound entity.generic.explode hostile @a ~ ~ ~ 1 1.4 playsound item.firecharge.use hostile @a ~ ~ ~ 1 0.7 # hit players tag @s add gm4_mu_self execute positioned ~-.22 ~-.22 ~-.22 as @a[dx=0,dy=0,dz=0] positioned ~-0.34 ~-0.34 ~-0.34 as @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/blazing/flare_damage tag @s remove gm4_mu_self kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/init_flare.mcfunction ================================================ # init flare block_display # @s = flare block_display # at @s # run from mob/process/elite/blazing/process data merge entity @s {Tags:["gm4_mu_elite_flare"],teleport_duration:1,brightness:{sky:15,block:15},transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[-0.125f,-0.125f,-0.125f],scale:[0.25f,0.25f,0.25f]},block_state:{Name:"minecraft:magma_block"}} playsound minecraft:entity.blaze.shoot hostile @a ~ ~ ~ 1 1.2 tp @s ~ ~ ~ ~ ~ scoreboard players set @s gm4_mu_data 0 execute unless score $keep_tick.elite_process_flare gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/blazing_flare 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/process.mcfunction ================================================ # process blazing elite # @s = blazing elite # at @s # run from mob/process/elite/check_type scoreboard players set $has_target gm4_mu_data 0 execute on target if entity @s[type=player] run scoreboard players set $has_target gm4_mu_data 1 execute if score $has_target gm4_mu_data matches 1 run scoreboard players add @s gm4_mu_timer 1 execute if score $has_target gm4_mu_data matches 0 run scoreboard players set @s[scores={gm4_mu_timer=3..5}] gm4_mu_timer 6 scoreboard players set @s[scores={gm4_mu_timer=10..}] gm4_mu_timer 0 execute if score @s gm4_mu_timer matches 3 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~ -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare execute if score @s[type=#gm4_monsters_unbound:zombie_types] gm4_mu_timer matches 4 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~90 -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare execute if score @s[type=#gm4_monsters_unbound:zombie_types] gm4_mu_timer matches 5 anchored eyes positioned ^ ^-0.25 ^ on target facing entity @s eyes rotated ~-90 -75 summon block_display run function gm4_monsters_unbound:mob/process/elite/blazing/init_flare ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/blazing/process_flare.mcfunction ================================================ # process the flare # @s = flare block_display # at @s # run from clocks/elite/blazing_flare # particles particle flame ^ ^ ^0.0125 0.12 0.12 0.12 0.015 2 # track towards closest player until nearby, then fly off execute if score @s gm4_mu_data matches 0 positioned ^ ^ ^0.7 if entity @p[gamemode=!spectator,gamemode=!creative,distance=..2] run scoreboard players set @s gm4_mu_data 1 execute if score @s[scores={gm4_mu_data=0}] gm4_mu_timer matches ..60 facing entity @p[gamemode=!spectator,gamemode=!creative] eyes positioned ^ ^ ^50 rotated as @s positioned ^ ^ ^500 facing entity @s eyes facing ^ ^ ^-1 positioned as @s run tp @s ~ ~ ~ ~ ~ tp @s[scores={gm4_mu_timer=..10}] ^ ^ ^0.35 tp @s[scores={gm4_mu_timer=11..60}] ^ ^ ^0.25 tp @s[scores={gm4_mu_timer=61..70}] ^ ^ ^0.15 tp @s[scores={gm4_mu_timer=71..}] ^ ^ ^0.05 scoreboard players set $flare_hit gm4_mu_data 0 # hit players execute positioned ~-.15 ~-.15 ~-.15 as @a[dx=0,dy=0,dz=0] positioned ~-0.55 ~-0.55 ~-0.55 if entity @s[dx=0,dy=0,dz=0] run scoreboard players set $flare_hit gm4_mu_data 1 # hit terrain execute unless block ~ ~ ~ #gm4:no_collision run scoreboard players set $flare_hit gm4_mu_data 1 # timer ran out scoreboard players add @s gm4_mu_timer 1 execute if score @s gm4_mu_timer matches 80.. run scoreboard players set $flare_hit gm4_mu_data 1 # explode when something is hit execute if score $flare_hit gm4_mu_data matches 1 run return run function gm4_monsters_unbound:mob/process/elite/blazing/flare_explode # keep running scoreboard players set $keep_tick.elite_process_flare gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/check_type.mcfunction ================================================ # process elites # @s = elite mob # at @s # run from main execute if entity @s[tag=gm4_mu_elite.mending] run function gm4_monsters_unbound:mob/process/elite/mending/process execute if entity @s[tag=gm4_mu_elite.blazing] run function gm4_monsters_unbound:mob/process/elite/blazing/process execute if entity @s[tag=gm4_mu_elite.zephyr] run function gm4_monsters_unbound:mob/process/elite/zephyr/process execute if entity @s[tag=gm4_mu_elite.gargantuan] run function gm4_monsters_unbound:mob/process/elite/gargantuan/process execute if entity @s[tag=gm4_mu_elite.pearlescent] run function gm4_monsters_unbound:mob/process/elite/pearlescent/process execute if entity @s[tag=gm4_mu_elite.splitting] run function gm4_monsters_unbound:mob/process/elite/splitting/process execute if entity @s[tag=gm4_mu_elite.volatile] run function gm4_monsters_unbound:mob/process/elite/volatile/process ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/activate.mcfunction ================================================ # activate gargantuan elite ground slam # @s = gargantuan elite # at @s # run from mob/process/elite/check_type attribute @s minecraft:follow_range modifier remove gm4_monsters_unbound:elite_buff.giant.charging attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.giant.charging playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1.25 0 execute store result storage gm4_monsters_unbound:temp deal.damage float 1.75 run attribute @s minecraft:attack_damage get tag @s add gm4_mu_self execute as @a[distance=..7,gamemode=!spectator] run function gm4_monsters_unbound:mob/process/elite/gargantuan/player_hit with storage gm4_monsters_unbound:temp deal tag @s remove gm4_mu_self data remove storage gm4_monsters_unbound:temp deal scoreboard players set $particle_ring gm4_mu_data 72 execute rotated 0 0 run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring_big scoreboard players set @s gm4_mu_timer -6 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/eval_stats.mcfunction ================================================ # set gargantuan elite stats # @s = gargantuan elite # at @s # run from mob/process/elite/gargantuan/update_stats $attribute @s movement_speed modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(speed) add_multiplied_total $attribute @s attack_damage modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(damage) add_multiplied_total $attribute @s knockback_resistance modifier add gm4_monsters_unbound:elite_buff.giant.health_reduction_stats $(knockback_resistance) add_value ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/particle_ring.mcfunction ================================================ # show a particle ring for gargantuan elite ground slam # @s = gargantuan elite # at @s # run from mob/process/elite/gargantuan/process # run from here particle block{block_state:"chest"} ^ ^0.2 ^7 0.15 0.15 0.15 0.5 2 particle block{block_state:"chest"} ^ ^0.4 ^7 0.15 0.15 0.15 0.5 2 particle block{block_state:"chest"} ^ ^0.6 ^7 0.15 0.15 0.15 0.5 2 scoreboard players remove $particle_ring gm4_mu_data 1 execute if score $particle_ring gm4_mu_data matches 1.. rotated ~5 ~ run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/particle_ring_big.mcfunction ================================================ # show a particle ring for gargantuan elite ground slam # @s = gargantuan elite # at @s # run from mob/process/elite/activate # run from run particle block{block_state:"chest"} ^ ^ ^7 0.225 0.225 0.225 1 5 particle block{block_state:"chest"} ^ ^0.2 ^7 0.225 0.225 0.225 1 5 particle block{block_state:"chest"} ^ ^0.4 ^7 0.225 0.225 0.225 1 5 particle block{block_state:"chest"} ^ ^0.6 ^7 0.225 0.225 0.225 1 5 particle block{block_state:"chest"} ^ ^0.8 ^7 0.225 0.225 0.225 1 5 scoreboard players remove $particle_ring gm4_mu_data 1 execute if score $particle_ring gm4_mu_data matches 1.. rotated ~5 ~ run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring_big ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/player_hit.mcfunction ================================================ # damage player from gargantuan ground slam # @s = player that got hit # at @s # run from mob/process/elite/gargantuan/activate particle block{block_state:"chest"} ~ ~1.2 ~ 0.325 0.925 0.325 1 12 $damage @s $(damage) mob_attack by @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_self,limit=1,distance=..7] effect give @s slowness 3 3 effect give @s nausea 5 0 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/process.mcfunction ================================================ # process gargantuan elite # @s = gargantuan elite # at @s # run from mob/process/elite/check_type # check health execute store result score $curr_health gm4_mu_data run data get entity @s Health 1000 execute unless score $curr_health gm4_mu_data = @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/gargantuan/update_stats # no nearby players execute unless score @s gm4_mu_timer matches 1.. unless entity @a[gamemode=!spectator,distance=..7] run return 0 # otherwise 40% chance to start attack (60% to return and not use it) execute unless score @s gm4_mu_timer matches 1.. if entity @a[gamemode=!spectator,distance=..7] if predicate {condition:"minecraft:random_chance",chance:0.6} run return 0 scoreboard players add @s gm4_mu_timer 1 scoreboard players set @s[scores={gm4_mu_timer=20..}] gm4_mu_timer 0 scoreboard players set $particle_ring gm4_mu_data 72 execute if score @s gm4_mu_timer matches 2..4 rotated 0 0 run function gm4_monsters_unbound:mob/process/elite/gargantuan/particle_ring attribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.giant.charging -1 add_multiplied_total attribute @s[scores={gm4_mu_timer=1}] minecraft:follow_range modifier add gm4_monsters_unbound:elite_buff.giant.charging -1 add_multiplied_total execute if score @s gm4_mu_timer matches 2 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.2 execute if score @s gm4_mu_timer matches 3 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.4 execute if score @s gm4_mu_timer matches 4 run playsound minecraft:entity.zombie.attack_wooden_door hostile @a ~ ~ ~ 1 1.7 data modify entity @s[scores={gm4_mu_timer=4}] Motion set value [0d,0.5d,0d] execute if score @s gm4_mu_timer matches 5 run function gm4_monsters_unbound:mob/process/elite/gargantuan/activate ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/gargantuan/update_stats.mcfunction ================================================ # update gargantuan elite stats # @s = gargantuan elite # at @s # run from mob/process/elite/gargantuan/process scoreboard players operation @s gm4_mu_data = $curr_health gm4_mu_data attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats attribute @s minecraft:knockback_resistance modifier remove gm4_monsters_unbound:elite_buff.giant.health_reduction_stats execute store result score $max_health gm4_mu_data run attribute @s minecraft:max_health get 10 scoreboard players operation $curr_health gm4_mu_data /= $max_health gm4_mu_data scoreboard players set $curr_health_percent_lost gm4_mu_data 100 scoreboard players operation $curr_health_percent_lost gm4_mu_data -= $curr_health gm4_mu_data execute if score $curr_health_percent_lost gm4_mu_data matches 50.. run effect give @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:resistance infinite 0 true execute if score $curr_health_percent_lost gm4_mu_data matches 75.. run effect give @s[type=!#gm4_monsters_unbound:skeleton_types] minecraft:resistance infinite 1 true execute if score $curr_health_percent_lost gm4_mu_data matches 50.. run scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 4 execute if score $curr_health_percent_lost gm4_mu_data matches 75.. run scoreboard players set @s[type=#gm4_monsters_unbound:skeleton_types] gm4_sr_arrow.fire_delay 6 execute store result storage gm4_monsters_unbound:temp set.speed float 0.015 run scoreboard players get $curr_health_percent_lost gm4_mu_data execute store result storage gm4_monsters_unbound:temp set.damage float 0.005 run scoreboard players get $curr_health_percent_lost gm4_mu_data execute store result storage gm4_monsters_unbound:temp set.knockback_resistance float 0.0015 run scoreboard players add $curr_health_percent_lost gm4_mu_data 567 function gm4_monsters_unbound:mob/process/elite/gargantuan/eval_stats with storage gm4_monsters_unbound:temp set data remove storage gm4_monsters_unbound:temp set ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/death.mcfunction ================================================ # run on glacial elite death # @s = glacial elite # at @s # run from mob/process/elite/on_death/run summon marker ~ ~-1 ~ {Tags:["gm4_mu_elite_death_marker","gm4_mu_elite.glacial_processing"]} execute unless score $keep_tick.elite_glacial_death gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/glacial_death 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/explode.mcfunction ================================================ # explode the glacial bomb # @s = glacial elite death marker # at @s # run from mob/process/elite/glacial/process_explosion scoreboard players set $freeze_seconds gm4_mu_data 3 execute as @e[distance=..4.81,type=!#gm4:non_living,tag=!smithed.entity,tag=!smithed.strict] run function gm4_monsters_unbound:effect/freeze/apply execute as @a[gamemode=!spectator,distance=..12] facing entity @s eyes positioned ^ ^ ^4.5 positioned ~-.05 ~-.05 ~-.05 if entity @s[dx=0,dy=0,dz=0] positioned ~-0.9 ~-0.9 ~-0.9 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:effect/freeze/apply playsound block.glass.break hostile @a[distance=..4.81] ~ ~ ~ 1 0.8 kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/process_explosion.mcfunction ================================================ # process the glacial bomb # @s = glacial elite death marker # at @s # run from clocks/elite/glacial_death # before show warning particle dust{color:[0.725,0.910,0.918],scale:3} ~ ~ ~ 0.04 0.04 0.04 0 4 normal particle snowflake ~ ~ ~ 1.75 1.75 1.75 0 7 normal scoreboard players set $frost_ring_yaw gm4_mu_data 0 execute if score @s gm4_mu_data matches ..360 rotated 0 80 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_yaw_loop # explode after 2 seconds scoreboard players add @s gm4_mu_data 20 playsound minecraft:block.snow.break hostile @a[distance=..4.81] ~ ~ ~ 1.55 1.2 playsound minecraft:block.snow.fall hostile @a[distance=..4.81] ~ ~ ~ 2 0.75 playsound minecraft:block.snow.fall hostile @a[distance=4.81..16] ~ ~ ~ 1 0.6 execute if score @s gm4_mu_data matches 400.. run return run function gm4_monsters_unbound:mob/process/elite/glacial/explode scoreboard players set $keep_tick.elite_glacial_death gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_pitch_loop_big.mcfunction ================================================ # show warning particles # @s = glacial elite death marker # at @s # run from mob/process/elite/glacial/warning_yaw_loop # run from here particle dust{color:[0.725,0.910,0.918],scale:2} ^ ^ ^4.8 0.02 0.02 0.02 0 1 normal scoreboard players remove $frost_ring_pitch gm4_mu_data 5 execute if score $frost_ring_pitch gm4_mu_data matches -85.. rotated ~5 ~-5 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_big ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_pitch_loop_small.mcfunction ================================================ # show warning particles # @s = glacial elite death marker # at @s # run from mob/process/elite/glacial/warning_yaw_loop # run from here execute if predicate {condition:"minecraft:random_chance",chance:0.15} run particle snowflake ^ ^ ^4.8 0.005 0.005 0.005 0 1 normal scoreboard players remove $frost_ring_pitch gm4_mu_data 5 execute if score $frost_ring_pitch gm4_mu_data matches -85.. rotated ~5 ~-5 run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_small ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/glacial/warning_yaw_loop.mcfunction ================================================ # show warning particles # @s = glacial elite death marker # at @s # run from mob/process/elite/glacial/process_explosion # run from here scoreboard players set $frost_ring_pitch gm4_mu_data 80 execute if score $frost_ring_yaw gm4_mu_data < @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_big execute unless score $frost_ring_yaw gm4_mu_data < @s gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/glacial/warning_pitch_loop_small scoreboard players add $frost_ring_yaw gm4_mu_data 10 execute if score $frost_ring_yaw gm4_mu_data matches ..360 rotated ~10 ~ run function gm4_monsters_unbound:mob/process/elite/glacial/warning_yaw_loop ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/check_los_raycast.mcfunction ================================================ # check LOS to this undead # @s = undead near mending elite # at @s # run from mob/process/elite/mending/process # run from here execute if score $target_healed gm4_mu_data matches 1.. run return 0 tag @s remove gm4_mu_target scoreboard players add $raycast_travel_distance gm4_mu_data 3 execute positioned ~-.05 ~-.05 ~-.05 if entity @s[dx=0,dy=0,dz=0] positioned ~-0.9 ~-0.9 ~-0.9 if entity @s[dx=0,dy=0,dz=0] at @s anchored eyes positioned ^ ^ ^ run function gm4_monsters_unbound:mob/process/elite/mending/trigger execute if score $target_healed gm4_mu_data matches 1.. run return run function gm4_monsters_unbound:mob/process/elite/mending/particle_raycast execute unless score $raycast_travel_distance gm4_mu_data matches ..300 run return run scoreboard players reset $raycast_travel_distance gm4_mu_data execute positioned ^ ^ ^.3 if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/process/elite/mending/check_los_raycast ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/check_target.mcfunction ================================================ # check if this entity is a valid target to be healed # @s = undead near mending elite # at @s # run from mob/process/elite/mending/process execute store result score $curr_health gm4_mu_data run data get entity @s Health 10 execute store result score $max_health gm4_mu_data run attribute @s minecraft:max_health get 10 # remove a slight amount from max_health to fix floating point errors scoreboard players remove $max_health gm4_mu_data 2 execute if score $curr_health gm4_mu_data < $max_health gm4_mu_data run tag @s add gm4_mu_target ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/particle_raycast.mcfunction ================================================ # check LOS to this undead # @s = undead near mending elite # at @s # run from mob/process/elite/mending/process # run from here scoreboard players remove $raycast_travel_distance gm4_mu_data 1 particle dust_color_transition{from_color:[0.000,1.000,0.000],scale:0.65,to_color:[0.000,0.000,0.000]} ~ ~ ~ 0.1 0.1 0.1 0 0 execute unless score $raycast_travel_distance gm4_mu_data matches 1.. run particle dust_color_transition{from_color:[0.000,1.000,0.000],scale:0.85,to_color:[0.000,0.000,0.000]} ~ ~ ~ 0.22 0.22 0.22 0.5 12 execute if score $raycast_travel_distance gm4_mu_data matches 1.. positioned ^ ^ ^-.1 run function gm4_monsters_unbound:mob/process/elite/mending/particle_raycast ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/process.mcfunction ================================================ # process mending elite # @s = mending elite # at @s # run from mob/process/elite/check_type execute as @e[type=#minecraft:undead,tag=!gm4_mu_elite.mending,distance=..30,limit=12,sort=random] run function gm4_monsters_unbound:mob/process/elite/mending/check_target tag @s add gm4_mu_self scoreboard players set $target_healed gm4_mu_data 0 execute at @s anchored eyes positioned ^ ^0.4375 ^ as @e[type=#minecraft:undead,tag=gm4_mu_target,distance=..30,sort=random] facing entity @s eyes run function gm4_monsters_unbound:mob/process/elite/mending/check_los_raycast tag @s remove gm4_mu_self ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/mending/trigger.mcfunction ================================================ # heal this undead # @s = undead near mending elite # at @s # run from mob/process/elite/mending/check_los_raycast scoreboard players set $target_healed gm4_mu_data 1 effect give @s instant_damage 1 2 false effect give @s resistance 1 1 false particle heart ^ ^ ^ 0.2 0.2 0.2 0.05 1 playsound minecraft:item.bottle.fill hostile @a ~ ~ ~ 0.7 2 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_death/run.mcfunction ================================================ # check which elite has died # @s = item dropped from killed elite # at @s # run from check_item execute store result score $elite_type gm4_mu_data run data get entity @s Item.components."minecraft:custom_data".gm4_mu_elite_on_death.id execute if score $elite_type gm4_mu_data matches 1 run function gm4_monsters_unbound:mob/process/elite/glacial/death execute if score $elite_type gm4_mu_data matches 2 positioned ~ ~1.75 ~ summon item_display run function gm4_monsters_unbound:mob/process/elite/vorpal/init_fear_cloud execute if score $elite_type gm4_mu_data matches 3 positioned ~ ~0.25 ~ run function gm4_monsters_unbound:mob/process/elite/splitting/zombie execute if score $elite_type gm4_mu_data matches 4 positioned ~ ~0.25 ~ run function gm4_monsters_unbound:mob/process/elite/splitting/skeleton execute if score $elite_type gm4_mu_data matches 5 run function gm4_monsters_unbound:mob/process/elite/volatile/death kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_hit/check_mob.mcfunction ================================================ # process elite that got hit # @s = elite that got hit # at @s # run from mob/process/elite/on_hit/run execute if entity @s[tag=gm4_mu_elite.vorpal] if predicate {condition:"minecraft:random_chance",chance:0.65} run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/run execute if entity @s[tag=gm4_mu_elite.zephyr] run function gm4_monsters_unbound:mob/process/elite/zephyr/hit_when_charging ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/on_hit/run.mcfunction ================================================ # process elites being hit # @s = player that hit an elite # at @s advancement revoke @s only gm4_monsters_unbound:elite/on_hit execute as @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.on_hit,nbt={HurtTime:10s},limit=1,sort=nearest] at @s run function gm4_monsters_unbound:mob/process/elite/on_hit/check_mob ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/get_facing.mcfunction ================================================ # get facing direction towards target # @s = marker # at elite anchored eyes positioned ^ ^ ^0.2 # run from mob/process/elite/pearlescent/laser tp @s ~ ~ ~ facing entity @p[tag=gm4_mu_target] eyes data modify storage gm4_monsters_unbound:temp Rotation set from entity @s Rotation kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser.mcfunction ================================================ # shoot laser # @s = pearlescent elite # at @s # run from mob/process/elite/pearlescent/process playsound block.campfire.crackle hostile @a ~ ~ ~ 0.5 0.8 particle flash{color:-1} ~ ~1.8 ~ execute on target run tag @s[type=player] add gm4_mu_target execute unless entity @p[tag=gm4_mu_target] run return 0 tag @s add gm4_mu_self scoreboard players set $laser_limit gm4_mu_data 150 execute anchored eyes positioned ^ ^ ^0.2 summon marker run function gm4_monsters_unbound:mob/process/elite/pearlescent/get_facing data modify entity @s Rotation set from storage gm4_monsters_unbound:temp Rotation data remove storage gm4_monsters_unbound:temp Rotation execute at @s anchored eyes positioned ^ ^ ^0.2 run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_raycast execute on target run tag @s remove gm4_mu_target tag @s remove gm4_mu_self ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser_damage.mcfunction ================================================ # deal damage to hit player # @s = player hit by laser # at near @s # run from mob/process/elite/pearlescent/laser_raycast scoreboard players set $attack_hit gm4_mu_data 1 scoreboard players set $laser_limit gm4_mu_data 0 execute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages gamerule show_death_messages false damage @s 1.0 in_fire tag @s add gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a ["",{"translate":"text.gm4.monsters_unbound.death.pearlescent_elite_laser","fallback":"%s was seen by %s",with:[{"selector":"@s"},{"selector":"@e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_elite.pearlescent,distance=..32,limit=1]"}]}] tag @s remove gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/laser_raycast.mcfunction ================================================ # raycast to target player # @s = pearlescent elite # at @s # run from mob/process/elite/pearlescent/laser # run from here particle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^0.125 ^ ^ 0.01 0.01 0.01 0 1 particle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^-0.125 ^ ^ 0.01 0.01 0.01 0 1 particle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^0.125 ^ ^0.1 0.01 0.01 0.01 0 1 particle dust_color_transition{from_color:[0.400,0.325,0.450],to_color:[0.800,0.650,0.900],scale:1.25} ^-0.125 ^ ^0.1 0.01 0.01 0.01 0 1 execute positioned ~-0.1 ~-0.1 ~-0.1 as @a[gamemode=!spectator,dx=0,dy=0,dz=0] positioned ~-0.8 ~-0.8 ~-0.8 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_damage scoreboard players remove $laser_limit gm4_mu_data 1 execute if score $laser_limit gm4_mu_data matches 1.. positioned ^ ^ ^0.2 if block ~ ~ ~ #gm4:no_collision run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser_raycast ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/pearlescent/process.mcfunction ================================================ # process pearlescent elite # @s = pearlescent elite # at @s # run from mob/process/elite/check_type # 33% chance to start attack if mob has a target scoreboard players set $attack gm4_mu_data 0 execute if score @s gm4_mu_timer matches 1.. run scoreboard players set $attack gm4_mu_data 1 execute unless score $attack gm4_mu_data matches 1 on target if entity @s[type=player] if predicate {condition:"minecraft:random_chance",chance:0.33} run scoreboard players set $attack gm4_mu_data 1 execute if score $attack gm4_mu_data matches 0 run return 0 scoreboard players add @s gm4_mu_timer 1 scoreboard players set @s[scores={gm4_mu_timer=300..}] gm4_mu_timer 0 execute if score @s gm4_mu_timer matches 1 run playsound block.beacon.activate hostile @a ~ ~ ~ 1 0.7 execute if score @s gm4_mu_timer matches 101..110 run playsound block.beacon.deactivate hostile @a ~ ~ ~ 1 0.7 attribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent.charging -0.75 add_multiplied_total attribute @s[scores={gm4_mu_timer=5}] minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.pearlescent.charging attribute @s[scores={gm4_mu_timer=5}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.pearlescent.firing -0.33 add_multiplied_total attribute @s[scores={gm4_mu_timer=101..110}] minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.pearlescent.firing execute if score @s gm4_mu_timer matches ..100 run particle block{block_state:"pearlescent_froglight"} ~ ~2 ~ 0.3 0.3 0.3 0.5 8 scoreboard players set $attack_hit gm4_mu_data 0 execute if score @s gm4_mu_timer matches 5..100 run function gm4_monsters_unbound:mob/process/elite/pearlescent/laser execute if score @s gm4_mu_timer matches 10.. if score $attack_hit gm4_mu_data matches 0 run scoreboard players add @s gm4_mu_timer 10 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/init_entity.mcfunction ================================================ # init split entity # @s = split entity # at @s # run from mob/process/elite/splitting/skeleton # run from mob/process/elite/splitting/zombie attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:gravity modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:jump_strength modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:knockback_resistance modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:max_health modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:scale modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:step_height modifier add gm4_monsters_unbound:split_entity -0.5 add_multiplied_total attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:split_entity 0.33 add_multiplied_total attribute @s[type=#gm4_monsters_unbound:skeleton_types] minecraft:follow_range modifier add gm4_monsters_unbound:split_entity -0.66 add_multiplied_total scoreboard players set @s gm4_sr_arrow.fire_delay 6 scoreboard players set @s gm4_sr_arrow.damage_change -14 data modify entity @s CustomName set from storage gm4_monsters_unbound:temp CustomName execute store result entity @s Motion[0] double 0.01 run random value -30..30 execute store result entity @s Motion[1] double 0.01 run random value 20..60 execute store result entity @s Motion[2] double 0.01 run random value -30..30 tag @s add gm4_mu_elite.split_entity tag @s add gm4_mu_split_entity execute if score gm4_survival_refightalized load.status matches 1.. if dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute if score gm4_survival_refightalized load.status matches 1.. unless dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_else execute unless score gm4_survival_refightalized load.status matches 1.. run function gm4_monsters_unbound:mob/init/initialize item replace entity @s armor.head with spawner data modify entity @s drop_chances.head set value 0 team join gm4_mu_elite.split execute if score $has_bow gm4_mu_data matches 0 run item replace entity @s[type=#gm4_monsters_unbound:skeleton_types] weapon.mainhand with wooden_sword ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/process.mcfunction ================================================ # process splitting elite # @s = splitting elite # at @s # run from mob/process/elite/check_type data modify entity @s equipment.head.components."minecraft:custom_name" set from entity @s CustomName ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/skeleton.mcfunction ================================================ # split splitting elite on death # @s = item # at @s # run from mob/process/elite/on_death/run data modify storage gm4_monsters_unbound:temp CustomName set from entity @s Item.components."minecraft:custom_name" # only 2-3 of the spawned skeletons will have bows, the rest will be melee with wooden swords scoreboard players set $has_bow gm4_mu_data 1 execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute store result score $has_bow gm4_mu_data run random value 0..1 execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity scoreboard players set $has_bow gm4_mu_data 0 execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon skeleton run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity data remove storage gm4_monsters_unbound:temp CustomName ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/splitting/zombie.mcfunction ================================================ # split splitting elite on death # @s = item # at @s # run from mob/process/elite/on_death/run data modify storage gm4_monsters_unbound:temp CustomName set from entity @s Item.components."minecraft:custom_name" execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity execute summon zombie run function gm4_monsters_unbound:mob/process/elite/splitting/init_entity data remove storage gm4_monsters_unbound:temp CustomName ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/death.mcfunction ================================================ # spawn many volatile pillars on death # @s = item # at @s # run from mob/process/elite/on_death/run execute positioned ~ ~ ~3 summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location execute positioned ~ ~ ~-3 summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location execute positioned ~3 ~ ~ summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location execute positioned ~-3 ~ ~ summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_damage.mcfunction ================================================ # damage from volatile pillar # @s = player that was hit # at near @s # run from mob/process/elite/volatile/pillar_explode effect give @s slowness 2 2 effect give @s nausea 4 0 execute store result score $showDeathMessages gm4_mu_data run gamerule show_death_messages gamerule show_death_messages false damage @s 9.0 explosion tag @s add gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 at @s unless entity @e[type=player,tag=gm4_mu_self,distance=..0.1,limit=1] run tellraw @a ["",{"translate":"text.gm4.monsters_unbound.death.volatile_elite_meteorite","fallback":"%s was struck by a meteorite",with:[{"selector":"@s"}]}] tag @s remove gm4_mu_self execute if score $showDeathMessages gm4_mu_data matches 1 run gamerule show_death_messages true ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_explode.mcfunction ================================================ # explode volatile pillar # @s = pillar marker # at @s # run from mob/process/elite/volatile/pillar_process execute if score @s gm4_mu_data matches 2 as @a[gamemode=!spectator,distance=..2.25] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage execute if score @s gm4_mu_data matches 3 as @a[gamemode=!spectator,distance=..2.5] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage execute if score @s gm4_mu_data matches 4 as @a[gamemode=!spectator,distance=..2.75] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage execute if score @s gm4_mu_data matches 5 as @a[gamemode=!spectator,distance=..3] run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_damage kill @s particle minecraft:dragon_breath ~ ~ ~ 0.2 0.2 0.2 0.33 64 particle minecraft:dragon_breath ~ ~0.25 ~ 0.5 0.5 0.5 0 32 particle minecraft:dragon_breath ~ ~5 ~ 0.2 8 0.2 1 32 playsound entity.dragon_fireball.explode hostile @a[distance=..32] ~ ~ ~ 1 0.9 0.5 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_location.mcfunction ================================================ # get a location for volatile pillar # @s = pillar marker # at @s # run from mob/process/elite/volatile/process tag @s add gm4_mu_elite.volatile_pillar execute store result score @s gm4_mu_timer run random value 0..14 execute store result score @s gm4_mu_data run random value 2..5 scoreboard players operation @s gm4_mu_timer -= @s gm4_mu_data scoreboard players operation @s gm4_mu_timer -= @s gm4_mu_data execute store result score $randomX gm4_mu_data run random value 0..12 execute store result score $randomZ gm4_mu_data run random value 0..12 tp @s ~-6 ~ ~-6 execute at @s if score $randomX gm4_mu_data matches 8.. run tp @s ~8 ~ ~ execute if score $randomX gm4_mu_data matches 8.. run scoreboard players remove $randomX gm4_mu_data 8 execute at @s if score $randomX gm4_mu_data matches 4.. run tp @s ~4 ~ ~ execute if score $randomX gm4_mu_data matches 4.. run scoreboard players remove $randomX gm4_mu_data 4 execute at @s if score $randomX gm4_mu_data matches 2.. run tp @s ~2 ~ ~ execute if score $randomX gm4_mu_data matches 2.. run scoreboard players remove $randomX gm4_mu_data 2 execute at @s if score $randomX gm4_mu_data matches 1.. run tp @s ~1 ~ ~ execute if score $randomX gm4_mu_data matches 1.. run scoreboard players remove $randomX gm4_mu_data 1 execute at @s if score $randomZ gm4_mu_data matches 8.. run tp @s ~ ~ ~8 execute if score $randomZ gm4_mu_data matches 8.. run scoreboard players remove $randomZ gm4_mu_data 8 execute at @s if score $randomZ gm4_mu_data matches 4.. run tp @s ~ ~ ~4 execute if score $randomZ gm4_mu_data matches 4.. run scoreboard players remove $randomZ gm4_mu_data 4 execute at @s if score $randomZ gm4_mu_data matches 2.. run tp @s ~ ~ ~2 execute if score $randomZ gm4_mu_data matches 2.. run scoreboard players remove $randomZ gm4_mu_data 2 execute at @s if score $randomZ gm4_mu_data matches 1.. run tp @s ~ ~ ~1 execute if score $randomZ gm4_mu_data matches 1.. run scoreboard players remove $randomZ gm4_mu_data 1 scoreboard players set $move_y_limit gm4_mu_data 12 execute at @s store result score $location_found gm4_mu_data run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y execute if score $location_found gm4_mu_data matches 0 run return run kill @s execute unless score $keep_tick.elite_pillar_volatile gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/volatile_pillar 1t execute at @s run playsound minecraft:entity.ender_dragon.shoot hostile @a ~ ~ ~ 1 0.5 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_location_y.mcfunction ================================================ # get a location for volatile pillar # @s = pillar marker # at @s # run from mob/process/elite/volatile/pillar_location # run from here execute if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision align y run return run tp @s ~ ~ ~ scoreboard players remove $move_y_limit gm4_mu_data 1 execute if score $move_y_limit gm4_mu_data matches 0 run return 0 execute if block ~ ~ ~ #gm4:no_collision positioned ~ ~-1 ~ run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y execute positioned ~ ~1 ~ run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location_y ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_particle_ring.mcfunction ================================================ # volatile pillar particles # @s = pillar marker # at @s rotated ~x ~ # run from clocks/elite/pillaer_process # run from here execute if score @s gm4_mu_data matches 2 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.25 0 0 0 1 0 normal execute if score @s gm4_mu_data matches 3 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.5 0 0 0 1 0 normal execute if score @s gm4_mu_data matches 4 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^2.75 0 0 0 1 0 normal execute if score @s gm4_mu_data matches 5 run particle dust_color_transition{from_color:[0.667,0.000,0.667],scale:1,to_color:[0.000,0.000,0.000]} ^ ^ ^3 0 0 0 1 0 normal scoreboard players remove $particle_ring gm4_mu_data 6 execute if score $particle_ring gm4_mu_data matches 1.. rotated ~6 ~ run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_particle_ring ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/pillar_process.mcfunction ================================================ # process volatile pillar # @s = pillar marker # at @s # run from clocks/elite/volatile_pillar particle block{block_state:"purple_glazed_terracotta"} ~ ~5 ~ 0.2 8 0.2 1 32 scoreboard players set $particle_ring gm4_mu_data 360 function gm4_monsters_unbound:mob/process/elite/volatile/pillar_particle_ring scoreboard players add @s gm4_mu_timer 1 execute if score @s gm4_mu_timer matches 60 run playsound minecraft:entity.breeze.inhale hostile @a ~ ~ ~ 2 2 execute if score @s gm4_mu_timer matches 70.. run return run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_explode scoreboard players set $keep_tick.elite_pillar_volatile gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/volatile/process.mcfunction ================================================ # process volatile elite # @s = volatile elite # at @s # run from mob/process/elite/check_type scoreboard players set $has_target gm4_mu_data 0 execute on target if entity @s[type=player,distance=..22] run scoreboard players set $has_target gm4_mu_data 1 execute if score $has_target gm4_mu_data matches 0 run return 0 scoreboard players add @s gm4_mu_timer 1 execute if predicate {condition:"random_chance","chance":0.45} run scoreboard players add @s gm4_mu_timer 1 execute if score @s gm4_mu_timer matches 8..12 run particle block{block_state:"purple_glazed_terracotta"} ~ ~2 ~ 0 4 0 0.25 32 execute if score @s gm4_mu_timer matches 8..12 on target at @s summon marker run function gm4_monsters_unbound:mob/process/elite/volatile/pillar_location scoreboard players set @s[scores={gm4_mu_timer=12..}] gm4_mu_timer 0 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/fear_hit.mcfunction ================================================ # apply fear to hit player # @s = player that was hit # at @s # run from mob/process/elite/vorpal/process_fear_cloud scoreboard players set $player_hit gm4_mu_data 1 execute store result score $fear_seconds gm4_mu_data run random value 10..16 function gm4_monsters_unbound:effect/fear/apply ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/init_fear_cloud.mcfunction ================================================ # spawn fear cloud skull # @s = block_display # at @s # run from mob/process/elite/on_death/run data merge entity @s {Tags:["gm4_mu_elite.fear_cloud"],teleport_duration:1,brightness:{sky:15,block:15},transformation:{left_rotation:[0f,1f,0f,0f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.25f,0f],scale:[1f,1f,1f]},item:{id:"minecraft:wither_skeleton_skull",count:1}} playsound minecraft:entity.blaze.shoot hostile @a ~ ~ ~ 1 1.2 tp @s ~ ~ ~ facing entity @p[gamemode=!spectator] execute unless score $keep_tick.elite_death_vorpal gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/vorpal_death 1t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/process_fear_cloud.mcfunction ================================================ # process fear cloud skull # @s = block_display # at @s # run from clocks/elite/vorpal_death # particles particle dust{color:[0.000,0.000,0.000],scale:1} ^ ^ ^0.0125 0.2666 0.2666 0.2666 0.666 4 normal scoreboard players add @s gm4_mu_timer 1 # track towards closest player execute facing entity @p[gamemode=!spectator,gamemode=!creative] eyes positioned ^ ^ ^25 rotated as @s positioned ^ ^ ^25 facing entity @s eyes facing ^ ^ ^-1 positioned as @s run tp @s ~ ~ ~ ~ ~ tp @s[scores={gm4_mu_timer=..29}] ^ ^ ^0.025 tp @s[scores={gm4_mu_timer=30..60}] ^ ^ ^0.075 tp @s[scores={gm4_mu_timer=61..90}] ^ ^ ^0.125 tp @s[scores={gm4_mu_timer=91..120}] ^ ^ ^0.200 tp @s[scores={gm4_mu_timer=121..140}] ^ ^ ^0.300 tp @s[scores={gm4_mu_timer=141..160}] ^ ^ ^0.450 tp @s[scores={gm4_mu_timer=161..}] ^ ^ ^0.650 # hit players scoreboard players set $player_hit gm4_mu_data 0 execute positioned ~-.15 ~-.15 ~-.15 as @a[dx=0,dy=0,dz=0,gamemode=!spectator,gamemode=!creative] positioned ~-0.55 ~-0.55 ~-0.55 if entity @s[dx=0,dy=0,dz=0] run function gm4_monsters_unbound:mob/process/elite/vorpal/fear_hit execute if score $player_hit gm4_mu_data matches 1 run return run kill @s # timer ran out execute if score @s gm4_mu_timer matches 240.. run return run kill @s # keep running if entity is still around scoreboard players set $keep_tick.elite_death_vorpal gm4_mu_keep_tick 1 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/randomize.mcfunction ================================================ # get random teleport location # @s = marker # at @s # run from clocks/elite/vorpal/warp/spawn_marker execute store result score $randomX gm4_mu_data run random value 0..12 execute store result score $randomZ gm4_mu_data run random value 0..12 execute at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/tp_marker ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/run.mcfunction ================================================ # teleport the elite randomly # @s = vorpal elite # at @s # run from clocks/elite/on_hit/check_mob # teleport up to 12 blocks away tag @s add gm4_mu_target execute positioned ~-6 ~ ~-6 summon marker run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/spawn_marker tag @s remove gm4_mu_target playsound minecraft:entity.enderman.teleport hostile @a ~ ~ ~ 1 0.75 execute at @s run particle minecraft:portal ~ ~1.75 ~ 0 0 0 0.75 32 execute at @s run playsound minecraft:entity.enderman.teleport hostile @a ~ ~ ~ 1 0.75 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/set_ypos.mcfunction ================================================ # get random teleport location # @s = marker # at @s # run from clocks/elite/vorpal/warp/tp_marker execute at @s run tp @s ~ ~-1 ~ scoreboard players add $set_y gm4_mu_data 1 scoreboard players set $warp_safe gm4_mu_data 0 execute at @s if predicate gm4_monsters_unbound:technical/valid_tp unless entity @a[gamemode=!creative,gamemode=!spectator,distance=..3] run scoreboard players set $warp_safe gm4_mu_data 1 execute if score $warp_safe gm4_mu_data matches 1 run scoreboard players set $warp_attempt gm4_mu_data 33 execute unless score $set_y gm4_mu_data matches 8.. at @s unless score $warp_safe gm4_mu_data matches 1 run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/set_ypos ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/spawn_marker.mcfunction ================================================ # get random teleport location # @s = marker # at @s # run from clocks/elite/vorpal/warp/run execute store result score $y_pos gm4_mu_data run data get entity @s Pos[1] scoreboard players set $warp_attempt gm4_mu_data 0 function gm4_monsters_unbound:mob/process/elite/vorpal/warp/randomize execute if score $warp_safe gm4_mu_data matches 1 at @s align xyz run tp @e[type=#gm4_monsters_unbound:elite_types,tag=gm4_mu_target] ~.5 ~ ~.5 kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/vorpal/warp/tp_marker.mcfunction ================================================ # get random teleport location # @s = marker # at @s # run from clocks/elite/vorpal/warp/randomize # run from here execute at @s if score $randomX gm4_mu_data matches 8.. run tp @s ~8 ~ ~ execute if score $randomX gm4_mu_data matches 8.. run scoreboard players remove $randomX gm4_mu_data 8 execute at @s if score $randomX gm4_mu_data matches 4.. run tp @s ~4 ~ ~ execute if score $randomX gm4_mu_data matches 4.. run scoreboard players remove $randomX gm4_mu_data 4 execute at @s if score $randomX gm4_mu_data matches 2.. run tp @s ~2 ~ ~ execute if score $randomX gm4_mu_data matches 2.. run scoreboard players remove $randomX gm4_mu_data 2 execute at @s if score $randomX gm4_mu_data matches 1.. run tp @s ~1 ~ ~ execute if score $randomX gm4_mu_data matches 1.. run scoreboard players remove $randomX gm4_mu_data 1 execute at @s if score $randomZ gm4_mu_data matches 8.. run tp @s ~ ~ ~8 execute if score $randomZ gm4_mu_data matches 8.. run scoreboard players remove $randomZ gm4_mu_data 8 execute at @s if score $randomZ gm4_mu_data matches 4.. run tp @s ~ ~ ~4 execute if score $randomZ gm4_mu_data matches 4.. run scoreboard players remove $randomZ gm4_mu_data 4 execute at @s if score $randomZ gm4_mu_data matches 2.. run tp @s ~ ~ ~2 execute if score $randomZ gm4_mu_data matches 2.. run scoreboard players remove $randomZ gm4_mu_data 2 execute at @s if score $randomZ gm4_mu_data matches 1.. run tp @s ~ ~ ~1 execute if score $randomZ gm4_mu_data matches 1.. run scoreboard players remove $randomZ gm4_mu_data 1 execute store result entity @s Pos[1] double 1 run scoreboard players get $y_pos gm4_mu_data execute at @s run tp @s ~ ~4 ~ scoreboard players set $set_y gm4_mu_data 0 execute at @s run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/set_ypos scoreboard players add $warp_attempt gm4_mu_data 1 execute unless score $warp_attempt gm4_mu_data matches 33.. run function gm4_monsters_unbound:mob/process/elite/vorpal/warp/randomize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/activate.mcfunction ================================================ # activate charged attack # @s = zephyr elite # at @s # run from mob/process/elite/zephyr/process execute anchored eyes positioned ^ ^-1.15 ^ run particle gust_emitter_small ~ ~ ~ 0 0 0 1 1 normal playsound minecraft:entity.breeze.wind_burst hostile @a ~ ~ ~ 1 0 # skeletons shoot arrows instead of speed burst execute if entity @s[type=#gm4_monsters_unbound:skeleton_types] run return run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/start summon breeze_wind_charge ~ ~ ~ {Motion:[0.0,-5.0,0.0]} attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging attribute @s minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed.charged 1.5 add_multiplied_total attribute @s minecraft:attack_damage modifier add gm4_monsters_unbound:elite_buff.speed.charged 0.75 add_multiplied_total attribute @s minecraft:attack_knockback modifier add gm4_monsters_unbound:elite_buff.speed.charged 2 add_value tag @s add gm4_mu_charging_attack ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/charge_complete.mcfunction ================================================ # charge is complete # @s = zephyr elite # at @s # run from mob/process/attack_effect/charging_attack attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged # don't charge again until player target is lost tag @s remove gm4_mu_charging_attack tag @s remove gm4_mu_elite.on_hit scoreboard players set @s gm4_mu_timer -12 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/hit_when_charging.mcfunction ================================================ # remove charge if mob is hit # @s = zephyr elite # at @s # run from mob/process/elite/on_hit/check_mob execute anchored eyes positioned ^ ^-0.15 ^ run particle small_gust ~ ~ ~ 0.45 0.45 0.45 1 16 normal playsound minecraft:entity.breeze.hurt hostile @a ~ ~ ~ 1 0 effect give @s slowness 1 9 true attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged execute if score @s gm4_mu_timer matches 2.. run summon breeze_wind_charge ~ ~ ~ {Motion:[0.0,-5.0,0.0]} # disable charge for a little time tag @s remove gm4_mu_elite.zephyr_skeleton_burst tag @s remove gm4_mu_charging_attack tag @s remove gm4_mu_elite.on_hit scoreboard players set @s gm4_mu_timer -4 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/lose_charge.mcfunction ================================================ # remove charge if target is lost # @s = zephyr elite # at @s # run from mob/process/elite/zephyr/process attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charging attribute @s minecraft:movement_speed modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_damage modifier remove gm4_monsters_unbound:elite_buff.speed.charged attribute @s minecraft:attack_knockback modifier remove gm4_monsters_unbound:elite_buff.speed.charged scoreboard players reset @s gm4_mu_timer effect give @s[tag=gm4_mu_elite.zephyr_skeleton_burst] speed 3 3 tag @s remove gm4_mu_elite.zephyr_skeleton_burst tag @s remove gm4_mu_elite.on_hit ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/process.mcfunction ================================================ # process zephyr elite # @s = zephyr elite # at @s # run from mob/process/elite/check_type scoreboard players set $has_target gm4_mu_data 0 execute on target run scoreboard players set $has_target gm4_mu_data 1 execute if entity @s[type=#gm4_monsters_unbound:skeleton_types,scores={gm4_mu_timer=1..}] run scoreboard players set $has_target gm4_mu_data 1 # no target execute if score $has_target gm4_mu_data matches 0 if score @s gm4_mu_timer matches -2147483648..2147483647 run function gm4_monsters_unbound:mob/process/elite/zephyr/lose_charge execute if score $has_target gm4_mu_data matches 0 run return run scoreboard players reset @s gm4_mu_timer scoreboard players add @s gm4_mu_timer 1 execute if score @s gm4_mu_timer matches 1..4 anchored eyes positioned ^ ^-0.15 ^ run particle small_gust ~ ~ ~ 0.35 0.35 0.35 1 6 normal tag @s[scores={gm4_mu_timer=1}] add gm4_mu_elite.on_hit attribute @s[scores={gm4_mu_timer=1}] minecraft:movement_speed modifier add gm4_monsters_unbound:elite_buff.speed.charging -1 add_multiplied_total execute if score @s gm4_mu_timer matches 2 run playsound minecraft:entity.breeze.inhale hostile @a ~ ~ ~ 1 0.5 execute if score @s gm4_mu_timer matches 3 run playsound minecraft:entity.breeze.charge hostile @a ~ ~ ~ 1 0.5 execute if score @s gm4_mu_timer matches 4 run playsound minecraft:entity.breeze.idle_air hostile @a ~ ~ ~ 1 0.65 execute if score @s gm4_mu_timer matches 5 run function gm4_monsters_unbound:mob/process/elite/zephyr/activate execute if score @s[type=#gm4_monsters_unbound:skeleton_types] gm4_mu_timer matches 6..10 run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/arrow_burst scoreboard players reset @s[scores={gm4_mu_timer=14..},tag=!gm4_mu_charging_attack] gm4_mu_timer ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/arrow_burst.mcfunction ================================================ # shoot many arrows # @s = zephyr elite # at @s # run from mob/process/elite/zephyr/process # run from clocks/elite/zephyr_process scoreboard players add @s gm4_mu_data 1 execute if score @s gm4_mu_data matches 16.. run return run function gm4_monsters_unbound:mob/process/elite/zephyr/lose_charge scoreboard players set $keep_tick.elite_process_zephyr gm4_mu_keep_tick 1 execute anchored eyes positioned ^ ^ ^0.05 on target facing entity @s eyes summon arrow run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/init_arrow ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/get_target_pos.mcfunction ================================================ # get pos of target # @s = marker # at @s # run from mob/process/elite/zephyr/skeleton/init_arrow data modify storage gm4_monsters_unbound:temp Pos set from entity @s Pos execute store result score $target_x gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[0] 100 execute store result score $target_y gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[1] 100 execute store result score $target_z gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[2] 100 kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/init_arrow.mcfunction ================================================ # init arrow burst arrow # @s = arrow # at @s # run from mob/process/elite/zephyr/skeleton/arrow_burst # don't process this arrow in survival_refightalized tag @s add gm4_sr_arrow_checked # arrow deals half damage data modify entity @s damage set value 0.5 # get player pos execute positioned ^ ^ ^10 summon marker run function gm4_monsters_unbound:mob/process/elite/zephyr/skeleton/get_target_pos # get vector data modify storage gm4_monsters_unbound:temp Pos set from entity @s Pos execute store result score $motion_x gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[0] 100 execute store result score $motion_y gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[1] 100 execute store result score $motion_z gm4_mu_data run data get storage gm4_monsters_unbound:temp Pos[2] 100 execute store result score $motion_x_offset gm4_mu_data run random value -128..128 execute store result score $motion_y_offset gm4_mu_data run random value -32..32 execute store result score $motion_z_offset gm4_mu_data run random value -128..128 scoreboard players operation $target_x gm4_mu_data += $motion_x_offset gm4_mu_data scoreboard players operation $target_y gm4_mu_data += $motion_y_offset gm4_mu_data scoreboard players operation $target_z gm4_mu_data += $motion_z_offset gm4_mu_data scoreboard players operation $motion_x gm4_mu_data -= $target_x gm4_mu_data scoreboard players operation $motion_y gm4_mu_data -= $target_y gm4_mu_data scoreboard players operation $motion_z gm4_mu_data -= $target_z gm4_mu_data # set motion execute store result entity @s Motion[0] double -0.0016517 run scoreboard players get $motion_x gm4_mu_data execute store result entity @s Motion[1] double -0.0016517 run scoreboard players get $motion_y gm4_mu_data execute store result entity @s Motion[2] double -0.0016517 run scoreboard players get $motion_z gm4_mu_data data remove storage gm4_monsters_unbound:temp Pos ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/elite/zephyr/skeleton/start.mcfunction ================================================ # start arrow burst for skeleton zephyr elite # @s = zephyr elite # at @s # run from mob/process/elite/zephyr/process tag @s add gm4_mu_elite.zephyr_skeleton_burst scoreboard players set @s gm4_mu_data 0 execute unless score $keep_tick.elite_process_zephyr gm4_mu_keep_tick matches 1 run schedule function gm4_monsters_unbound:clocks/elite/zephyr_process 2t ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/reveal_dripstone_trap.mcfunction ================================================ # reveal dripstone trap when a player gets below # @s = hidden dripstone trap # at @s # run from main kill @s execute unless block ~ ~1 ~ #gm4_monsters_unbound:dripstone run return 0 # spring the trap particle block{block_state:"dripstone_block"} ~ ~ ~ 0.2 0.6 0.2 1 24 particle block{block_state:"dripstone_block"} ~ ~-16 ~ 0.2 10 0.2 1 64 playsound minecraft:block.dripstone_block.break block @a[distance=..42] ~ ~ ~ 1.5 0.8 1 execute store result score $pick_entity gm4_mu_data run random value 1..3 scoreboard players set $mob_extras gm4_sr_data 1 execute if score $pick_entity gm4_mu_data matches 1 run summon skeleton ~ ~-0.8 ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:"fall_damage_multiplier",base:1,modifiers:[{id:"gm4_monsters_unbound:stat_change.dripstone_trap",amount:-0.95,operation:"add_multiplied_total"}]}]} execute if score $pick_entity gm4_mu_data matches 2 run summon zombie ~ ~-0.8 ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:"fall_damage_multiplier",base:1,modifiers:[{id:"gm4_monsters_unbound:stat_change.dripstone_trap",amount:-0.95,operation:"add_multiplied_total"}]}]} execute if score $pick_entity gm4_mu_data matches 3 run summon spider ~ ~ ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,-0.275d,0.0d],attributes:[{id:"fall_damage_multiplier",base:1,modifiers:[{id:"gm4_monsters_unbound:stat_change.dripstone_trap",amount:-0.95,operation:"add_multiplied_total"}]}]} execute if score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_survival_refightalized:mob/init/initiate execute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/reveal_snowy_trap.mcfunction ================================================ # reveal snowy trap when a player gets nearby # @s = hidden snowy trap # at @s # run from main kill @s execute unless block ~ ~ ~ snow run return 0 # spring the trap particle block{block_state:"snow"} ~ ~1 ~ 0.2 0.6 0.2 1 12 playsound minecraft:block.snow.place block @a ~ ~ ~ 1.5 0.8 execute store result score $pick_entity gm4_mu_data run random value 1..3 scoreboard players set $mob_extras gm4_sr_data 1 execute if score $pick_entity gm4_mu_data matches 1 run summon zombie ~ ~-0.75 ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,0.5d,0.0d]} execute if score $pick_entity gm4_mu_data matches 2 run summon stray ~ ~-0.75 ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,0.5d,0.0d]} execute if score $pick_entity gm4_mu_data matches 3 run summon creeper ~ ~-0.75 ~ {Tags:["gm4_sr_extra_mob"],Motion:[0.0d,0.5d,0.0d]} execute if score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_survival_refightalized:mob/init/initiate execute unless score gm4_survival_refightalized load.status matches 1.. as @e[type=#gm4_monsters_unbound:modify,tag=gm4_sr_extra_mob,distance=..1,limit=1] at @s run function gm4_monsters_unbound:mob/init/initialize ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/activate.mcfunction ================================================ # summon new zombie/husk/drowned when spore is grown # @s = spore item # at @s # run from mob/process/spore/advance # check for mob cap execute at @p[gamemode=!spectator] store result score $spore_zombie_count gm4_mu_data if entity @e[type=#gm4_monsters_unbound:zombie_types,tag=gm4_mu_spore_mob,distance=..32] execute if score $spore_zombie_count gm4_mu_data > $mob_limit.spore_zombie gm4_mu_config run kill @s execute if score $spore_zombie_count gm4_mu_data > $mob_limit.spore_zombie gm4_mu_config run return 0 # get spores in stack and their generation execute store result score $spore_count gm4_mu_data run data get entity @s Item.count execute store result score $generation gm4_mu_data run data get entity @s Item.components."minecraft:custom_data".gm4_mu_spore.generation # spawn up to 4 spore zombies execute align xz run summon zombie ~.5 ~ ~.5 {Tags:["gm4_sr_extra_mob","gm4_mu_spore_mob"]} execute if score $spore_count gm4_mu_data matches 2.. align xz run summon zombie ~.51 ~ ~.47 {Tags:["gm4_sr_extra_mob","gm4_mu_spore_mob"]} execute if score $spore_count gm4_mu_data matches 3.. align xz run summon zombie ~.54 ~ ~.52 {Tags:["gm4_sr_extra_mob","gm4_mu_spore_mob"]} execute if score $spore_count gm4_mu_data matches 4.. align xz run summon zombie ~0.47 ~ ~.54 {Tags:["gm4_sr_extra_mob","gm4_mu_spore_mob"]} execute if entity @s[tag=gm4_mu_spore.cherry] run tag @e[type=zombie,tag=gm4_mu_spore_mob,distance=..1] add gm4_mu_spore_zombie.cherry # vfx particle minecraft:block{block_state:"minecraft:flowering_azalea_leaves"} ~ ~1 ~ 0.35 1 0.35 0.1 32 playsound block.grass.break hostile @a ~ ~ ~ 0.6 0.6 # remove spores execute if score $spore_count gm4_mu_data matches ..4 run kill @s execute if score $spore_count gm4_mu_data matches 5.. store result entity @s Item.count byte 1 run scoreboard players remove $spore_count gm4_mu_data 4 # set spore zombie generation execute as @e[tag=gm4_mu_spore_mob,distance=..1] at @s run function gm4_monsters_unbound:mob/process/spore/set_generation ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/advance.mcfunction ================================================ # advance spore growth # @s = spore item # at @s # run from main execute if score @s gm4_mu_data matches 10.. run return run function gm4_monsters_unbound:mob/process/spore/activate scoreboard players add @s gm4_mu_data 1 execute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 1..4 run particle minecraft:block{block_state:"minecraft:flowering_azalea_leaves"} ~ ~ ~ 0.04 0.15 0.04 0.05 5 execute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 5..7 run particle minecraft:block{block_state:"minecraft:flowering_azalea_leaves"} ~ ~ ~ 0.045 0.175 0.045 0.1 8 execute if score @s[tag=!gm4_mu_spore.cherry] gm4_mu_data matches 8.. run particle minecraft:block{block_state:"minecraft:flowering_azalea_leaves"} ~ ~ ~ 0.05 0.2 0.05 0.15 16 execute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 1..4 run particle minecraft:block{block_state:"minecraft:cherry_leaves"} ~ ~ ~ 0.04 0.15 0.04 0.05 5 execute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 5..7 run particle minecraft:block{block_state:"minecraft:cherry_leaves"} ~ ~ ~ 0.045 0.175 0.045 0.1 8 execute if score @s[tag=gm4_mu_spore.cherry] gm4_mu_data matches 8.. run particle minecraft:block{block_state:"minecraft:cherry_leaves"} ~ ~ ~ 0.05 0.2 0.05 0.15 16 playsound block.grass.step hostile @a ~ ~ ~ 2 0.5 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/burn_on_head.mcfunction ================================================ # burn the spore if a spore zombie is on fire # @s = spore zombie # at unspecified # run from main item replace entity @s armor.head with air tag @s remove gm4_mu_spore_zombie tag @s remove gm4_mu_spore_zombie.cherry execute anchored eyes run particle flame ^ ^0.1 ^-0.1 0.1 0.1 0.1 0.15 8 ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/initialise.mcfunction ================================================ # tag spore item as spore # @s = spore item # at unspecified # run from check_item tag @s add gm4_mu_spore data merge entity @s {Age:-32768,PickupDelay:32767,Health:4} execute if items entity @s contents minecraft:cherry_leaves run tag @s add gm4_mu_spore.cherry ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/spore/set_generation.mcfunction ================================================ # set generation of new zombie/husk/drowned # @s = zombie/husk/drowned # at @s # run from mob/process/spore/activate scoreboard players operation @s gm4_mu_generation = $generation gm4_mu_data tag @s remove gm4_mu_spore_mob tag @s add gm4_mu_spore_zombie function gm4_monsters_unbound:mob/init/initiate ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/mob/process/toxic_creeper.mcfunction ================================================ # refresh effects on creeper # @s = toxic creeper # at unspecified # run from slow_clock # run from mob/init/mob_type/creeper effect give @s weakness 33 1 effect give @s blindness 33 0 true effect give @s nausea 33 0 true effect give @s hunger 33 1 true ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/slow_clock.mcfunction ================================================ schedule function gm4_monsters_unbound:slow_clock 30s # toxic creepers execute as @e[type=creeper,tag=gm4_mu_toxic_creeper] run function gm4_monsters_unbound:mob/process/toxic_creeper # cloaked crepers effect give @e[type=creeper,tag=gm4_mu_cloaked_creeper] invisibility 33 0 # remove traps that have not been triggered execute as @e[type=marker,tag=gm4_mu_trap] at @s unless entity @a[gamemode=!spectator,distance=..128] run kill @s ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/function/tick.mcfunction ================================================ schedule function gm4_monsters_unbound:tick 1t # check for items on the ground execute as @e[type=item,tag=!gm4_mu_item_checked,tag=!smithed.strict,tag=!smithed.entity] run function gm4_monsters_unbound:check_item ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/guidebook/monsters_unbound.json ================================================ { "id": "monsters_unbound", "name": "Monsters Unbound", "module_type": "module", "icon": { "id": "minecraft:chainmail_chestplate" }, "criteria": { "enter_underground": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } ] } }, "enter_dripstone_caves": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "minecraft:dripstone_caves" } } ] } }, "enter_burned": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/burned" } ] } }, "enter_flowering": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/flowering" } ] } }, "enter_growth": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/growth" } ] } }, "enter_mountainous": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/mountainous" } ] } }, "enter_warm_ocean": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "minecraft:warm_ocean" } } ] } }, "enter_snowy": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/snowy" } ] } }, "enter_toxic": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/toxic" } ] } }, "kill_elite_blazing": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.blazing\"]}" } } ] } }, "kill_elite_gargantuan": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.gargantuan\"]}" } } ] } }, "kill_elite_glacial": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.glacial\"]}" } } ] } }, "kill_elite_mending": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.mending\"]}" } } ] } }, "kill_elite_pearlescent": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.pearlescent\"]}" } } ] } }, "kill_elite_splitting": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.splitting\"]}" } } ] } }, "kill_elite_volatile": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.volatile\"]}" } } ] } }, "kill_elite_vorpal": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.vorpal\"]}" } } ] } }, "kill_elite_zephyr": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_elite.zephyr\"]}" } } ] } } }, "sections": [ { "name": "biomes", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.monsters_unbound.description.biomes", "fallback": "Mobs spawned in different biomes have special modifiers.\n\nSome areas and biomes spawn different mobs than usual." } ] ] }, { "name": "underground", "enable": [], "requirements": [ [ "enter_underground" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.underground", "fallback": "Mobs spawned underground are generally stronger and can have varying buffs and potion effects." } ] ] }, { "name": "burned", "enable": [], "requirements": [ [ "enter_burned" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.burned", "fallback": "Mobs spawned in a %s biome are weaker but faster.\n\nHusks spawn in large groups.", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.burned", "fallback": "burned", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.desert" }, "\n- ", { "translate": "biome.minecraft.savanna" }, "\n- ", { "translate": "biome.minecraft.savanna_plateau" }, "\n- ", { "translate": "biome.minecraft.windswept_savanna" }, "\n- ", { "translate": "biome.minecraft.badlands" }, "\n- ", { "translate": "biome.minecraft.wooded_badlands" }, "\n- ", { "translate": "biome.minecraft.eroded_badlands" } ] } } ] } ] ] }, { "name": "dripstone_caves", "enable": [], "requirements": [ [ "enter_dripstone_caves" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.dripstone_caves", "fallback": "More Spiders are found in Dripstone Caves, and Skeletons may wield pickaxes.\n\nSome Dripstone may be trapped and drop a mob when walked below." } ] ] }, { "name": "flowering", "enable": [], "requirements": [ [ "enter_flowering" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.flowering", "fallback": "In %s biomes Spore Zombies can be found, these drop a respawning Spore on death. Spores are susceptible to fire.\n\nCreepers are weaker but invisible.", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.flowering", "fallback": "flowering", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.sunflower_plains" }, "\n- ", { "translate": "biome.minecraft.flower_forest" }, "\n- ", { "translate": "biome.minecraft.cherry_grove" }, "\n- ", { "translate": "biome.minecraft.lush_caves" } ] } } ] } ] ] }, { "name": "growth", "enable": [], "requirements": [ [ "enter_growth" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.growth", "fallback": "Mobs spawned in a %s biome are faster.\n\nSkeletons usually use melee weapons.\n\nMore Spiders are found here", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.growth", "fallback": "growth", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.snowy_taiga" }, "\n- ", { "translate": "biome.minecraft.grove" }, "\n- ", { "translate": "biome.minecraft.taiga" }, "\n- ", { "translate": "biome.minecraft.old_growth_pine_taiga" }, "\n- ", { "translate": "biome.minecraft.old_growth_spruce_taiga" }, "\n- ", { "translate": "biome.minecraft.dark_forest" }, "\n- ", { "translate": "biome.minecraft.mangrove_swamp" } ] } } ] } ] ] }, { "name": "mountainous", "enable": [], "requirements": [ [ "enter_mountainous" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.mountainous", "fallback": "Phantoms can spawn in %s biomes.\n\nCreepers have more health.\n\nSpiders are faster", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.mountainous", "fallback": "mountainous", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.snowy_slopes" }, "\n- ", { "translate": "biome.minecraft.jagged_peaks" }, "\n- ", { "translate": "biome.minecraft.frozen_peaks" }, "\n- ", { "translate": "biome.minecraft.windswept_hills" }, "\n- ", { "translate": "biome.minecraft.windswept_gravelly_hills" }, "\n- ", { "translate": "biome.minecraft.windswept_forest" }, "\n- ", { "translate": "biome.minecraft.stony_shore" }, "\n- ", { "translate": "biome.minecraft.cherry_grove" }, "\n- ", { "translate": "biome.minecraft.meadow" }, "\n- ", { "translate": "biome.minecraft.stony_peaks" }, "\n- ", { "translate": "biome.minecraft.windswept_savanna" }, "\n- ", { "translate": "biome.minecraft.eroded_badlands" } ] } } ] } ] ] }, { "name": "snowy", "enable": [], "requirements": [ [ "enter_snowy" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.snowy", "fallback": "Mobs can ambush the player from snow in %s biomes.\n\nMobs can apply slowness.\n\nSpiders can be Gargantuan Elites.", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.snowy", "fallback": "snowy", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.snowy_plains" }, "\n- ", { "translate": "biome.minecraft.ice_spikes" }, "\n- ", { "translate": "biome.minecraft.snowy_taiga" }, "\n- ", { "translate": "biome.minecraft.snowy_beach" }, "\n- ", { "translate": "biome.minecraft.grove" }, "\n- ", { "translate": "biome.minecraft.snowy_slopes" }, "\n- ", { "translate": "biome.minecraft.jagged_peaks" }, "\n- ", { "translate": "biome.minecraft.frozen_peaks" }, "\n- ", { "translate": "biome.minecraft.frozen_river" }, "\n- ", { "translate": "biome.minecraft.frozen_ocean" }, "\n- ", { "translate": "biome.minecraft.deep_frozen_ocean" } ] } } ] } ] ] }, { "name": "toxic", "enable": [], "requirements": [ [ "enter_toxic" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.toxic", "fallback": "Mobs spawned in a %s biome can apply various negative effects.\n\nMore Witches are found here.", "with": [ { "translate": "text.gm4.guidebook.monsters_unbound.toxic", "fallback": "toxic", "color": "blue", "hover_event": { "action": "show_text", "value": [ "- ", { "translate": "biome.minecraft.swamp" }, "\n- ", { "translate": "biome.minecraft.mangrove_swamp" }, "\n- ", { "translate": "biome.minecraft.jungle" }, "\n- ", { "translate": "biome.minecraft.bamboo_jungle" } ] } } ] } ] ] }, { "name": "warm_ocean", "enable": [], "requirements": [ [ "enter_warm_ocean" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.warm_ocean", "fallback": "Drowned spawned in a Warm Ocean are much more powerful and have a larger chance to spawn wielding a Trident." } ] ] }, { "name": "elites", "enable": [], "requirements": [], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elites", "fallback": "Zombies that spawn as babies or as leaders are replaced with a random Elite variant.\n\nSkeletons have a static 5% chance to be an Elite." } ] ] }, { "name": "elite_blazing", "enable": [], "requirements": [ [ "kill_elite_blazing" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_blazing", "fallback": "Blazing Elites are slow and immune to burning. Their attacks deal little damage but have Fire Aspect II or Flame. Occasionally will spawn slow moving homing projectiles that explode on contact." } ] ] }, { "name": "elite_gargantuan", "enable": [], "requirements": [ [ "kill_elite_gargantuan" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_gargantuan", "fallback": "Gargantuan Elites are much bigger and gain stats based on their missing health. Will occasionally perform an AoE stomp attack." } ] ] }, { "name": "elite_glacial", "enable": [], "requirements": [ [ "kill_elite_glacial" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_glacial", "fallback": "Glacial Elites leave a sphere of frozen energy on death. This sphere explodes after 2 seconds freezing any entity inside for 3 seconds." } ] ] }, { "name": "elite_mending", "enable": [], "requirements": [ [ "kill_elite_mending" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_mending", "fallback": "Mending Elites will heal other undead mobs in their line of sight, this will never target other Mending Elites." } ] ] }, { "name": "elite_pearlescent", "enable": [], "requirements": [ [ "kill_elite_pearlescent" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_pearlescent", "fallback": "Pearescent Elites can shoot damaging lasers from their eyes, the laser is blocked by terrain." } ] ] }, { "name": "elite_splitting", "enable": [], "requirements": [ [ "kill_elite_splitting" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_splitting", "fallback": "Splitting Elites split into 6 smaller and weaker versions of itself on death." } ] ] }, { "name": "elite_volatile", "enable": [], "requirements": [ [ "kill_elite_volatile" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_volatile", "fallback": "Volatile Elites create randomly targeted purple beams of energy around them that explode after a delay, dealing heavy magic damage." } ] ] }, { "name": "elite_vorpal", "enable": [], "requirements": [ [ "kill_elite_vorpal" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_vorpal", "fallback": "Vorpal Elites teleport randomly on getting hit. On death a homing skull will track the nearest player and apply Fear, which blinds and slows interactions." } ] ] }, { "name": "elite_zephyr", "enable": [], "requirements": [ [ "kill_elite_zephyr" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.monsters_unbound.description.elite_zephyr", "fallback": "Zephyr Elites can charge a powerful wind-charged attack. Damaging them during the charge time dissipates the charge. Zephyr Zombies will rush the player, Zephyr Skeletons fire a burst of arrows." } ] ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/glacial.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:packed_ice", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_elite_on_death:{name:glacial,id:1}}" }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/elite_headwear/glacial"]}, "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/mending.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:lime_glazed_terracotta", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/elite_headwear/mending"]}, "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/pearlescent.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:pearlescent_froglight", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/elite_headwear/pearlescent"]}, "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/splitting_skeleton.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:spawner", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_elite_on_death:{name:splitting_skeleton,id:4}}" }, { "function": "minecraft:set_components", "components": { "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/splitting_zombie.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:spawner", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_elite_on_death:{name:splitting_zombie,id:3}}" }, { "function": "minecraft:set_components", "components": { "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/volatile.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:purple_glazed_terracotta", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_elite_on_death:{name:volatile,id:5}}" }, { "function": "minecraft:set_components", "components": { "enchantment_glint_override": false, "enchantments": { "blast_protection": 10, "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/elite/vorpal.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:black_wool", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_elite_on_death:{name:vorpal,id:2}}" }, { "function": "minecraft:set_components", "components": { "enchantment_glint_override": false, "enchantments": { "binding_curse": 1 } } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_armor/spore.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:cherry_leaves", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/spore/cherry"]} } } ], "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_spore_zombie.cherry\"]}" } } ] }, { "type": "minecraft:item", "name": "minecraft:azalea_leaves", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/spore/default"]} } } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.66 }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_spore_zombie.cherry\"]}" } } } ] }, { "type": "minecraft:item", "name": "minecraft:flowering_azalea_leaves", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_monsters_unbound:item/spore/flowering"]} } } ], "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_mu_spore_zombie.cherry\"]}" } } } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_mu_spore:{generation:0}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.monsters_unbound.zombie_spore", "fallback": "Zombie Spore" } } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/skeleton_toxic.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": { "custom_color": 8889187, "custom_effects": [ { "id": "minecraft:weakness", "amplifier": 0, "duration": 800, "show_particles": true, "show_icon": true, "ambient": false }, { "id": "minecraft:hunger", "amplifier": 1, "duration": 800, "show_particles": true, "show_icon": true, "ambient": false }, { "id": "minecraft:poison", "amplifier": 0, "duration": 800, "show_particles": true, "show_icon": true, "ambient": false } ] } } }, { "function": "minecraft:set_name", "target": "custom_name", "name": { "translate": "item.minecraft.tipped_arrow.effect.poison", "italic": false } }, { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/stray_snowy.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": { "custom_color": 9154528, "custom_effects": [ { "id": "minecraft:slowness", "amplifier": 2, "duration": 4800, "show_particles": true, "show_icon": true, "ambient": false } ] } } }, { "function": "minecraft:set_name", "target": "custom_name", "name": { "translate": "item.minecraft.tipped_arrow.effect.slowness", "italic": false } }, { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/loot_table/mob/equip_arrow/stray_toxic.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": { "custom_color": 8889187, "custom_effects": [ { "id": "minecraft:weakness", "amplifier": 0, "duration": 800, "show_particles": true, "show_icon": true, "ambient": false }, { "id": "minecraft:poison", "amplifier": 1, "duration": 800, "show_particles": true, "show_icon": true, "ambient": false }, { "id": "minecraft:slowness", "amplifier": 0, "duration": 4800, "show_particles": true, "show_icon": true, "ambient": false } ] } } }, { "function": "minecraft:set_name", "target": "custom_name", "name": { "translate": "item.minecraft.tipped_arrow.effect.poison", "italic": false } }, { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] } ] } ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/burned.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:desert", "minecraft:savanna", "minecraft:savanna_plateau", "minecraft:windswept_savanna", "minecraft:badlands", "minecraft:wooded_badlands", "minecraft:eroded_badlands" ] } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/flowering.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "minecraft:lush_caves" } }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:sunflower_plains", "minecraft:flower_forest", "minecraft:cherry_grove" ] } } ] } ] } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/growth.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:snowy_taiga", "minecraft:grove", "minecraft:taiga", "minecraft:old_growth_pine_taiga", "minecraft:old_growth_spruce_taiga", "minecraft:dark_forest", "minecraft:mangrove_swamp" ] } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/mountainous.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:snowy_slopes", "minecraft:jagged_peaks", "minecraft:frozen_peaks", "minecraft:windswept_hills", "minecraft:windswept_gravelly_hills", "minecraft:windswept_forest", "minecraft:stony_shore", "minecraft:meadow", "minecraft:stony_peaks", "minecraft:windswept_savanna", "minecraft:eroded_badlands", "minecraft:cherry_grove" ] } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/reef.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:water" } } } ] }, { "condition": "minecraft:location_check", "predicate": { "biomes": "minecraft:warm_ocean" } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/snowy.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:snowy_plains", "minecraft:ice_spikes", "minecraft:snowy_taiga", "minecraft:snowy_beach", "minecraft:grove", "minecraft:snowy_slopes", "minecraft:jagged_peaks", "minecraft:frozen_peaks", "minecraft:frozen_river", "minecraft:frozen_ocean", "minecraft:deep_frozen_ocean" ] } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/biome/toxic.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:technical/underground" } }, { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:swamp", "minecraft:mangrove_swamp", "minecraft:jungle", "minecraft:bamboo_jungle" ] } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/chance/spawn_phantom.json ================================================ [ { "condition": "minecraft:random_chance", "chance": 0.075 }, { "condition": "minecraft:reference", "name": "gm4_monsters_unbound:biome/mountainous" }, { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13188, "max": 22812 }, "period": 24000 } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/on_fire.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_on_fire": true } } } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/underground.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:water" } } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "light": { "light": 0 } } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/predicate/technical/valid_tp.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#gm4:no_collision" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "fluid": { "fluids": "#minecraft:lava" } } }, { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:lava" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#gm4:no_collision" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:no_collision" } } } ] ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/block/dripstone.json ================================================ { "values": [ "minecraft:dripstone_block", "minecraft:pointed_dripstone" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/elite_types.json ================================================ { "values": [ "minecraft:bogged", "minecraft:drowned", "minecraft:husk", "minecraft:skeleton", "minecraft:stray", "minecraft:zombie" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/modify.json ================================================ { "values": [ "minecraft:bogged", "minecraft:cave_spider", "minecraft:creeper", "minecraft:drowned", "minecraft:enderman", "minecraft:husk", "minecraft:parched", "minecraft:phantom", "minecraft:piglin", "minecraft:silverfish", "minecraft:skeleton", "minecraft:spider", "minecraft:stray", "minecraft:wither_skeleton", "minecraft:zombie", "minecraft:zombie_villager", "minecraft:zombified_piglin" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/modify_in_air.json ================================================ { "values": [ "minecraft:cave_spider", "minecraft:drowned", "minecraft:phantom", "minecraft:silverfish" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/skeleton_types.json ================================================ { "values": [ "minecraft:bogged", "minecraft:parched", "minecraft:skeleton", "minecraft:stray", "minecraft:wither_skeleton" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_monsters_unbound/tags/entity_type/zombie_types.json ================================================ { "values": [ "minecraft:drowned", "minecraft:husk", "minecraft:zombie", "minecraft:zombie_villager" ] } ================================================ FILE: gm4_monsters_unbound/data/gm4_survival_refightalized/tags/function/init_mob.json ================================================ { "values": [ "gm4_monsters_unbound:mob/init/mob_type" ] } ================================================ FILE: gm4_monsters_unbound/mod.mcdoc ================================================ use ::java::util::text::Text dispatch minecraft:storage[gm4_monsters_unbound:temp] to struct { slowness?: struct { level: int, }, deal?: struct { damage: float, }, set?: struct { speed: float, damage: float, knockback_resistance: float, }, Rotation?: [float] @ 2, Pos?: [double] @ 3, CustomName?: Text, } ================================================ FILE: gm4_monsters_unbound/translations.csv ================================================ key,en_us advancement.gm4.monsters_unbound.elite_kill.title,Elite Hunter advancement.gm4.monsters_unbound.elite_kill.description,Kill any Elite monster advancement.gm4.monsters_unbound.elite_kill_all.title,Elites Hunted advancement.gm4.monsters_unbound.elite_kill_all.description,Kill one of every Elite monster item.gm4.monsters_unbound.zombie_spore,Zombie Spore text.gm4.monsters_unbound.elite_name.glacial,Glacial text.gm4.monsters_unbound.elite_name.slate,Slate text.gm4.monsters_unbound.elite_name.blazing,Blazing text.gm4.monsters_unbound.elite_name.zephyr,Zephyr text.gm4.monsters_unbound.elite_name.gargantuan,Gargantuan text.gm4.monsters_unbound.elite_name.vorpal,Vorpal text.gm4.monsters_unbound.elite_name.splitting,Splitting text.gm4.monsters_unbound.elite_name.split,Split text.gm4.monsters_unbound.elite_name.volatile,Volatile text.gm4.monsters_unbound.elite_name.pearlescent,Pearlescent text.gm4.guidebook.module_desc.monsters_unbound,Mobs gain special effects based on their biome. text.gm4.guidebook.monsters_unbound.description.biomes,Mobs spawned in different biomes have special modifiers.\n\nSome areas and biomes spawn different mobs than usual. text.gm4.guidebook.monsters_unbound.description.underground,Mobs spawned underground are generally stronger and can have varying buffs and potion effects. text.gm4.guidebook.monsters_unbound.burned,burned text.gm4.guidebook.monsters_unbound.description.burned,Mobs spawned in a %s biome are weaker but faster.\n\nHusks spawn in large groups. text.gm4.guidebook.monsters_unbound.description.dripstone_caves,"More Spiders are found in Dripstone Caves, and Skeletons may wield pickaxes.\n\nSome Dripstone may be trapped and drop a mob when walked below." text.gm4.guidebook.monsters_unbound.flowering,flowering text.gm4.guidebook.monsters_unbound.description.flowering,"In %s biomes Spore Zombies can be found, these drop a respawning Spore on death. Spores are susceptible to fire.\n\nCreepers are weaker but invisible." text.gm4.guidebook.monsters_unbound.growth,growth text.gm4.guidebook.monsters_unbound.description.growth,Mobs spawned in a %s biome are faster.\n\nSkeletons usually use melee weapons.\n\nMore Spiders are found here text.gm4.guidebook.monsters_unbound.mountainous,mountainous text.gm4.guidebook.monsters_unbound.description.mountainous,Phantoms can spawn in %s biomes.\n\nCreepers have more health.\n\nSpiders are faster text.gm4.guidebook.monsters_unbound.snowy,snowy text.gm4.guidebook.monsters_unbound.description.snowy,Mobs can ambush the player from snow in %s biomes.\n\nMobs can apply slowness.\n\nSpiders can be Gargantuan Elites. text.gm4.guidebook.monsters_unbound.toxic,toxic text.gm4.guidebook.monsters_unbound.description.toxic,Mobs spawned in a %s biome can apply various negative effects.\n\nMore Witches are found here. text.gm4.guidebook.monsters_unbound.description.warm_ocean,Drowned spawned in a Warm Ocean are much more powerful and have a larger chance to spawn wielding a Trident. text.gm4.guidebook.monsters_unbound.description.elites,Zombies that spawn as babies or as leaders are replaced with a random Elite variant.\n\nSkeletons have a static 5% chance to be an Elite. text.gm4.guidebook.monsters_unbound.description.elite_zephyr,"Zephyr Elites can charge a powerful wind-charged attack. Damaging them during the charge time dissipates the charge. Zephyr Zombies will rush the player, Zephyr Skeletons fire a burst of arrows." text.gm4.guidebook.monsters_unbound.description.elite_blazing,Blazing Elites are slow and immune to burning. Their attacks deal little damage but have Fire Aspect II or Flame. Occasionally will spawn slow moving homing projectiles that explode on contact. text.gm4.guidebook.monsters_unbound.description.elite_gargantuan,Gargantuan Elites are much bigger and gain stats based on their missing health. Will occasionally perform an AoE stomp attack. text.gm4.guidebook.monsters_unbound.description.elite_glacial,Glacial Elites leave a sphere of frozen energy on death. This sphere explodes after 2 seconds freezing any entity inside for 3 seconds. text.gm4.guidebook.monsters_unbound.description.elite_mending,"Mending Elites will heal other undead mobs in their line of sight, this will never target other Mending Elites." text.gm4.guidebook.monsters_unbound.description.elite_pearlescent,"Pearescent Elites can shoot damaging lasers from their eyes, the laser is blocked by terrain." text.gm4.guidebook.monsters_unbound.description.elite_splitting,Splitting Elites split into 6 smaller and weaker versions of itself on death. text.gm4.guidebook.monsters_unbound.description.elite_volatile,"Volatile Elites create randomly targeted purple beams of energy around them that explode after a delay, dealing heavy magic damage." text.gm4.guidebook.monsters_unbound.description.elite_vorpal,"Vorpal Elites teleport randomly on getting hit. On death a homing skull will track the nearest player and apply Fear, which blinds and slows interactions." text.gm4.monsters_unbound.death.pearlescent_elite_laser,"%s was seen by %s" text.gm4.monsters_unbound.death.volatile_elite_meteorite,"%s was struck by a meteorite" text.gm4.monsters_unbound.death.blazing_elite_flare,"%s was blown up by a Blazing Flare" ================================================ FILE: gm4_mysterious_midnights/README.md ================================================ # Mysterious Midnights Full moons gain an element of surprise with random events. ### Features - Every full moon, there is a chance of a random event bing triggered. - When triggered, all players will hear a wolf howl sound. - The base pack has 6 events ranging from skeletons being resurrected when bones are on the floor to skeletons being given tipped arrows ### Expansions Add 6 more event variants using [Midnight Menaces]($dynamicLink:gm4_midnight_menaces)! ================================================ FILE: gm4_mysterious_midnights/beet.yaml ================================================ id: gm4_mysterious_midnights name: Mysterious Midnights version: 1.8.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_forceload meta: gm4: versioning: required: lib_forceload: 1.6.0 schedule_loops: [main] model_data: - item: end_stone reference: item/endermite_egg template: vanilla website: description: Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl... recommended: - gm4_midnight_menaces notes: [] modrinth: project_id: 9skST20d wiki: https://wiki.gm4.co/wiki/Mysterious_Midnights credits: Creator: - Bloo Updated by: - Bloo - BPR Icon Design: - DuckJr ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/event.mcfunction ================================================ # @s = none # at world spawn # called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. # slow clock for falling star spawning scoreboard players add $shower_clock gm4_fstar_decay 1 execute if score $shower_clock gm4_fstar_decay matches 150.. run function gm4_falling_stars:star_shower # hatch endermite eggs execute as @e[type=item,tag=gm4_endermite_star,nbt={OnGround:1b}] at @s run function gm4_falling_stars:hatch_endermite # decay all falling star entities (saftey cap) execute as @e[type=splash_potion,tag=gm4_falling_star] at @s run function gm4_falling_stars:falling_star/decay ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/accumulate_impact_points.mcfunction ================================================ # @s = @e[type=marker,tag=gm4_star_impact_point] # at @s # run from gm4_falling_stars:falling_star/select_spawn_location # spawn impact points. Max 20, each with a chance. scoreboard players add $loop_count gm4_mm_data 1 execute if predicate gm4_falling_stars:spawn_chance run summon marker ~ ~ ~ {CustomName:"gm4_falling_stars_impact_point",Tags:["gm4_falling_stars_impact_point"]} # loop execute unless score $loop_count gm4_mm_data matches 8.. run function gm4_falling_stars:falling_star/accumulate_impact_points ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/decay.mcfunction ================================================ # tracks and decays falling stars. This is a saftey feature to prevent buildup of falling stars # @s = players in the overworld during a falling star night # at @s # run from gm4_falling_stars:event # track age scoreboard players add @s gm4_fstar_decay 1 # remove old falling stars execute if score @s gm4_fstar_decay matches 15.. run kill @e[type=#gm4_falling_stars:falling_star,tag=gm4_falling_star,distance=..2] ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/initilize.mcfunction ================================================ # initializes this falling star # @s = @e[type=marker,tag=gm4_star_impact_point] # at @s positioned ~ 260 ~ # run from gm4_falling_stars:falling_star/spawn # apply motion data modify entity @s Motion set from storage gm4_falling_stars:motion temp.motion # remove tag tag @s remove gm4_new_falling_star ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/select_spawn_location.mcfunction ================================================ # spreads impact points # @s = players in the overworld during a falling star night # at @s # run from gm4_falling_stars:falling_star/start_in_area # spawn impact points function gm4_falling_stars:falling_star/accumulate_impact_points scoreboard players reset $loop_count gm4_mm_data # spread impact points execute store success score $spread_successful gm4_mm_data run spreadplayers ~ ~ 1 64 false @e[type=marker,tag=gm4_falling_stars_impact_point,distance=..4] # kill impact points if spread failed execute if score $spread_successful gm4_mm_data matches 1.. run kill @e[type=marker,tag=gm4_falling_stars_impact_point,distance=..4] # reset fake players scoreboard players reset $spread_successful gm4_mm_data ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/spawn.mcfunction ================================================ # @s = @e[type=marker,tag=gm4_star_impact_point] # at @s positioned ~ 260 ~ # run from gm4_falling_stars:event # summon falling star summon shulker_bullet ~ ~ ~ {Motion:[0.0d,0.0d,0.0d],Tags:["gm4_falling_star","gm4_new_falling_star"],CustomName:{"translate":"entity.gm4.falling_star","fallback":"Falling Star"},Steps:0,Passengers:[{id:"splash_potion",Tags:["gm4_falling_star"],CustomName:"Falling Star",Item:{count:1,id:"splash_potion",components:{"minecraft:potion_contents":{potion:"thick",custom_color:16777215,custom_effects:[{id:"minecraft:levitation",amplifier:0,duration:300}]}}}},{id:"area_effect_cloud",Tags:["gm4_falling_star"],Duration:600,CustomName:"gm4_falling_star_particle",Radius:0.5f,custom_particle:{type:"minecraft:end_rod"}},{id:"item",Age:3600,Tags:["gm4_falling_star","gm4_falling_stars_item"],Item:{count:1,id:"minecraft:end_stone"}}]} # set random motion vector data modify storage gm4_falling_stars:motion temp.motion set value [0.0d,0.0d,0.0d] execute store result storage gm4_falling_stars:motion temp.motion[0] double 0.001 run random value -644..644 execute store result storage gm4_falling_stars:motion temp.motion[2] double 0.001 run random value -644..644 execute as @e[type=shulker_bullet,tag=gm4_new_falling_star,limit=1] run function gm4_falling_stars:falling_star/initilize data remove storage gm4_falling_stars:motion temp # add loot to falling star loot spawn ~ 300 ~ loot gm4_falling_stars:star_type execute positioned ~ 300 ~ run data modify entity @e[type=item,limit=1,tag=gm4_falling_stars_item] Item set from entity @e[type=item,limit=1,distance=..1] Item execute as @e[type=item,limit=1,tag=gm4_falling_stars_item] if items entity @s contents *[custom_data~{gm4_endermite_egg:1b}] run tag @s add gm4_endermite_star tag @e[type=item] remove gm4_falling_stars_item execute positioned ~ 300 ~ run kill @e[type=item,limit=1,distance=..1] # kill marker to avoid buildup kill @s ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/falling_star/start_in_area.mcfunction ================================================ # spawns a falling star shower on a player if the right conditions have been met # @s = players in the overworld during a falling star night # at @s # run from gm4_falling_stars:star_shower # start spawn attempt if there wasn't a spawn attempt by nearby player already and have a random chance to abort execute unless entity @s[tag=gm4_falling_stars_ignore] if predicate gm4_falling_stars:shower_chance run function gm4_falling_stars:falling_star/select_spawn_location # ignore all players nearby (makes sure the amount of falling stars stays constant with varying player count in an area) tag @a[gamemode=!spectator,distance=..128] add gm4_falling_stars_ignore ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/hatch_endermite.mcfunction ================================================ #@s = @e[type=item,tag=gm4_endermite_star,nbt={OnGround:1b}] #at @s #called by event #summon mite summon endermite ~ ~ ~ {PlayerSpawned:1b} #sound and particles particle minecraft:block{block_state:"minecraft:end_stone"} ~ ~ ~ .14 .14 .14 1 20 playsound minecraft:entity.turtle.egg_crack master @a[distance=..8] ~ ~ ~ .4 .4 #remove end_stone kill @s ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_falling_stars",Tags:["gm4_mysterious_midnights_expansion","gm4_falling_stars"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/function/star_shower.mcfunction ================================================ # starts a falling star shower # @s = players in the overworld during a falling star night # at @s # run from gm4_falling_stars:event # try to start falling stars for all players execute as @a[tag=!gm4_falling_stars_ignore,gamemode=!spectator,x=0] at @s run function gm4_falling_stars:falling_star/start_in_area tag @a remove gm4_falling_stars_ignore execute as @e[type=marker,tag=gm4_falling_stars_impact_point,x=0] at @s if entity @a[gamemode=!spectator,distance=..60] positioned ~ 260 ~ run function gm4_falling_stars:falling_star/spawn # reset fake player scoreboard players set $shower_clock gm4_fstar_decay 0 ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/guidebook/falling_stars.json ================================================ { "id": "falling_stars", "name": "Falling Stars", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Falling_Stars", "icon": { "id": "minecraft:end_stone" }, "criteria": { "find_falling_star": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:splash_potion", "nbt": "{Tags:['gm4_falling_star']}" } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "type": "minecraft:area_effect_cloud", "nbt": "{Tags:['gm4_falling_star']}" } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "type": "minecraft:shulker_bullet", "nbt": "{Tags:['gm4_falling_star']}" } } } } ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "find_falling_star" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.falling_stars.description", "fallback": "During a Falling Stars event, gifts will drop from the sky.\n\nDiamonds, iron nuggets, gold nuggets, endermites, end stone, and chorus fruit can be found falling from the sky." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/loot_table/endermite_egg.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:end_stone", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.endermite_egg", "fallback": "Endermite Egg" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.endermite_egg.lore", "fallback": "Oh, it didn't hatch", "color": "dark_gray", "italic": true } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_mysterious_midnights:item/endermite_egg"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_endermite_egg:1b}" } ] } ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/loot_table/star_type.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:diamond" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:gold_nugget" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:iron_nugget" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chorus_fruit" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:end_stone" }, { "type": "minecraft:loot_table", "weight": 2, "value": "gm4_falling_stars:endermite_egg" } ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/predicate/shower_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.8 } ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/predicate/spawn_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.8 } ================================================ FILE: gm4_mysterious_midnights/data/gm4_falling_stars/tags/entity_type/falling_star.json ================================================ { "values": [ "minecraft:area_effect_cloud", "minecraft:item", "minecraft:shulker_bullet", "minecraft:splash_potion" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_harvest_moons/function/dawn_active_check.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event. execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_harvest_moons,tag=gm4_mysterious_midnights_active] run function gm4_harvest_moons:dawn_event ================================================ FILE: gm4_mysterious_midnights/data/gm4_harvest_moons/function/dawn_event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base upon the break of dawn. Only runs once. gamerule random_tick_speed 3 scoreboard players reset started_harvest_moon gm4_mm_data ================================================ FILE: gm4_mysterious_midnights/data/gm4_harvest_moons/function/event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute unless score started_harvest_moon gm4_mm_data matches 1 run gamerule random_tick_speed 60 execute unless score started_harvest_moon gm4_mm_data matches 1 run scoreboard players set started_harvest_moon gm4_mm_data 1 ================================================ FILE: gm4_mysterious_midnights/data/gm4_harvest_moons/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_harvest_moons",Tags:["gm4_mysterious_midnights_expansion","gm4_harvest_moons"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_harvest_moons/guidebook/harvest_moons.json ================================================ { "id": "harvest_moons", "name": "Harvest Moons", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Harvest_Moons", "icon": { "id": "minecraft:wheat" }, "criteria": { "farming_during_harvest_moon": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "started_harvest_moon" }, "score": "gm4_mm_data" }, "range": 1 }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "night_active" }, "score": "gm4_mm_data" }, "range": 1 }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "difficulty" }, "score": "gm4_mm_data" }, "range": { "min": 6 } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:farmland" ] } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "farming_during_harvest_moon" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.harvest_moons.description", "fallback": "During a Harvest Moons event, random tick events, such as crop growth, will be 20 times quicker than normal." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/calculate_difficulty.mcfunction ================================================ # @s = none # at 29999998 1 7134 (forceloaded chunk) # run from gm4_mysterious_midnights:start_midnight # generate random number from 0 to 15 execute store result storage gm4_mysterious_midnights:temp day int 1 run time query day repetition function gm4_mysterious_midnights:roll_difficulty with storage gm4_mysterious_midnights:temp scoreboard players set 16 gm4_mm_data 16 scoreboard players operation difficulty gm4_mm_data %= 16 gm4_mm_data # spawn AEC for random selection (1/3 of nights are not a mysterious midnight) execute if score difficulty gm4_mm_data matches 6.. run playsound event.mob_effect.raid_omen weather @a[x=0] ~ ~100000000000 ~ 0 .5 1 execute if score difficulty gm4_mm_data matches 6.. run playsound block.trial_spawner.ominous_activate weather @a[x=0] ~ ~100000000000 ~ 0 .6 1 execute if score difficulty gm4_mm_data matches 6..10 run function #gm4_mysterious_midnights:setup_common_expansion execute if score difficulty gm4_mm_data matches 11..13 run function #gm4_mysterious_midnights:setup_uncommon_expansion execute if score difficulty gm4_mm_data matches 14.. run function #gm4_mysterious_midnights:setup_rare_expansion # chose one expansion tag @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,limit=1,sort=random] add gm4_mysterious_midnights_active kill @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=!gm4_mysterious_midnights_active] ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/end_pulse.mcfunction ================================================ # @s = none # at world spawn # run from event_clock as long as a mysterious midnight is active # reset flag scoreboard players set night_active gm4_mm_data 0 # notify expansions of night end function #gm4_mysterious_midnights:end_pulse # kill all expansions AECs kill @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion] ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/event_clock.mcfunction ================================================ # @s = none # at world spawn # run from start_midnight run on a loop as long as it a mysterious midnight # call default expansions execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_harvest_moons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_harvest_moons:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_falling_stars,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_falling_stars:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_resurrecting_skeletons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_resurrecting_skeletons:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_resurrecting_zombies,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_resurrecting_zombies:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_tipped_skeletons,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_tipped_skeletons:event execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_nightmare_nights,tag=gm4_mysterious_midnights_active,limit=1] run function gm4_nightmare_nights:event # call other expansions function #gm4_mysterious_midnights:active_night # check if it is day again execute unless predicate gm4_mysterious_midnights:is_full_moon_night run function gm4_mysterious_midnights:end_pulse # reschedule if the night is still active execute if score night_active gm4_mm_data matches 1 run schedule function gm4_mysterious_midnights:event_clock 16t ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/init.mcfunction ================================================ # mysterious midnights base scoreboard objectives add gm4_mm_data dummy # expansions scoreboard objectives add gm4_tipped_type dummy scoreboard objectives add gm4_rezombify dummy scoreboard objectives add gm4_reskelify dummy scoreboard objectives add gm4_fstar_decay dummy execute unless score mysterious_midnights gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Mysterious Midnights"} execute unless score mysterious_midnights gm4_earliest_version < mysterious_midnights gm4_modules run scoreboard players operation mysterious_midnights gm4_earliest_version = mysterious_midnights gm4_modules scoreboard players set mysterious_midnights gm4_modules 1 schedule function gm4_mysterious_midnights:main 1t #$moduleUpdateList ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/main.mcfunction ================================================ execute unless score night_active gm4_mm_data matches 1 if predicate gm4_mysterious_midnights:is_full_moon_night run function gm4_mysterious_midnights:start_midnight schedule function gm4_mysterious_midnights:main 60s ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/roll_difficulty.mcfunction ================================================ # Rolls a new value for the difficulty based on the world seed and the day number. # @s = none # at 29999998 1 7134 (forceloaded chunk) # run from gm4_mysterious_midnights:calculate_difficulty # reset rng to use day count as seed $random reset gm_mysterious_midnights:midnight_difficulty $(day) true true # store random value execute store result score difficulty gm4_mm_data run random value 0..15 gm_mysterious_midnights:midnight_difficulty ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/function/start_midnight.mcfunction ================================================ # @s = none # at world spawn # run from main # set "night-active" flag scoreboard players set night_active gm4_mm_data 1 # calculate difficulty execute positioned 29999998 1 7134 run function gm4_mysterious_midnights:calculate_difficulty # schedule continous clock start schedule function gm4_mysterious_midnights:event_clock 1t ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/guidebook/mysterious_midnights.json ================================================ { "id": "mysterious_midnights", "name": "Mysterious Midnights", "module_type": "base", "icon": { "id": "minecraft:clock" }, "criteria": {}, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.mysterious_midnights.description", "fallback": "Every full moon, there is a high chance that a Mysterious Midnight event will occur.\n\nWhen a Mysterious Midnight event occurs, a howling sound will be heard." } ], [ { "translate": "text.gm4.guidebook.mysterious_midnights.sleeping", "fallback": "Mysterious Midnight events can usually be skipped by sleeping the night away." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/predicate/is_full_moon_night.json ================================================ { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13000, "max": 24000 }, "period": 192000 } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/active_night.json ================================================ { "values":[] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/end_pulse.json ================================================ { "values":[ "gm4_harvest_moons:dawn_active_check", "gm4_nightmare_nights:dawn_active_check" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_common_expansion.json ================================================ { "values":[ "gm4_resurrecting_skeletons:setup", "gm4_resurrecting_zombies:setup" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_rare_expansion.json ================================================ { "values":[ "gm4_falling_stars:setup", "gm4_nightmare_nights:setup" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_mysterious_midnights/tags/function/setup_uncommon_expansion.json ================================================ { "values":[ "gm4_harvest_moons:setup", "gm4_tipped_skeletons:setup" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/function/dawn_active_check.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base upon the break of dawn. Only runs once. Techincal function to prevent inactive expansions from running their dawn event. execute if entity @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion,tag=gm4_nightmare_nights,tag=gm4_mysterious_midnights_active] run function gm4_nightmare_nights:dawn_event ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/function/dawn_event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base upon the break of dawn. Only runs once. worldborder warning distance 5 scoreboard players reset started_nightmare_night gm4_mm_data ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/function/event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. #kick players out of beds effect give @a[nbt=!{SleepTimer:0s}] minecraft:instant_damage 1 0 #initialise nightmare night execute unless score started_nightmare_night gm4_mm_data matches 1 run function gm4_nightmare_nights:initialise ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/function/initialise.mcfunction ================================================ #@s = none #at world spawn #called by event. Only runs once per nightmare night. #red screen tint worldborder warning distance 300000000 #activate all nightmare night expansions execute positioned 29999998 1 7134 run function #gm4_nightmare_nights:nightmare_night_expansion #tag all to be active tag @e[type=area_effect_cloud,tag=gm4_mysterious_midnights_expansion] add gm4_mysterious_midnights_active #initialise is done scoreboard players set started_nightmare_night gm4_mm_data 1 ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_nightmare_nights",Tags:["gm4_mysterious_midnights_expansion","gm4_nightmare_nights"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/guidebook/nightmare_nights.json ================================================ { "id": "nightmare_nights", "name": "Nightmare Nights", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Nightmare_Nights", "icon": { "id": "minecraft:blaze_powder" }, "criteria": { "nightmare_sleep": { "trigger": "minecraft:slept_in_bed", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "started_nightmare_night" }, "score": "gm4_mm_data" }, "range": 1 }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "night_active" }, "score": "gm4_mm_data" }, "range": 1 }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "difficulty" }, "score": "gm4_mm_data" }, "range": { "min": 6 } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "nightmare_sleep" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.nightmare_nights.description", "fallback": "Nightmare Nights cannot be slept away. Attempting to sleep will deal instant damage.\n\nAdditionally, multiple Mysterious Midnights events will occur." } ] ] }, { "name": "events", "enable": [ { "id": "gm4_midnight_menaces", "load": -1 } ], "requirements": [ [ "nightmare_sleep" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.nightmare_nights.events", "fallback": "While a Nightmare Night is active, the following events will occur:\n\n - Resurrecting Skeletons\n - Resurrecting Zombies\n - Tipped Skeletons" } ] ] }, { "name": "events_with_menaces", "enable": [ { "id": "gm4_midnight_menaces", "load": 1 } ], "requirements": [ [ "nightmare_sleep" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.nightmare_nights.events_with_menaces", "fallback": "While a Nightmare Night is active, the following events will occur:\n\n - Resurrecting Skeletons\n - Resurrecting Zombies\n - Tipped Skeletons\n - Enlarging Phantoms\n - Illusioner Nights\n - Menacing Goblins" } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_nightmare_nights/tags/function/nightmare_night_expansion.json ================================================ { "values":[ "gm4_tipped_skeletons:setup", "gm4_resurrecting_skeletons:setup", "gm4_resurrecting_zombies:setup" ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/absorb_bone.mcfunction ================================================ #@s = bone item on the ground #at @s #called by spawn_skeleton #remove 1 from count of bone stack execute store result score count gm4_reskelify run data get entity @s Item.count 0.99 execute store result entity @s Item.count byte 1 run scoreboard players get count gm4_reskelify #Spigot fix execute if score count gm4_reskelify matches 0 run kill @s #reset timer to 0 scoreboard players set @s gm4_reskelify 0 ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=item,x=0] if items entity @s contents minecraft:bone if entity @s[nbt={OnGround:1b}] run function gm4_resurrecting_skeletons:mark_bone execute as @e[type=item,scores={gm4_reskelify=8..}] at @s run function gm4_resurrecting_skeletons:spawn_skeleton ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/mark_bone.mcfunction ================================================ #@s = bone item on the ground #at world spawn #called by event scoreboard players add @s gm4_reskelify 1 execute at @s run particle minecraft:entity_effect{color:[0.33,0.11,0.29,1.0]} ~ ~ ~ 0 0 0 1 0 ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_resurrecting_skeletons",Tags:["gm4_mysterious_midnights_expansion","gm4_resurrecting_skeletons"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/function/spawn_skeleton.mcfunction ================================================ #@s = bone item on the ground #at @s #called by event summon skeleton ~ ~ ~ {DeathLootTable:"gm4:empty",equipment:{},active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}],attributes:[{id:"minecraft:attack_damage",base:10.0}]} playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 1 .1 function gm4_resurrecting_skeletons:absorb_bone ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_skeletons/guidebook/resurrecting_skeletons.json ================================================ { "id": "resurrecting_skeletons", "name": "Resurrecting Skeletons", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Resurrecting_Skeletons", "icon": { "id": "minecraft:bone" }, "criteria": { "fight_resurrected_skeleton": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:skeleton", "nbt": "{DeathLootTable:\"minecraft:empty\",attributes:[{id:\"minecraft:attack_damage\",base:10.0d}]}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_resurrected_skeleton" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.resurrecting_skeletons.description", "fallback": "During a Resurrecting Skeletons event, bones on the floor will resurrect into unarmed skeletons, with a powerful attack." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/absorb_rotten_flesh.mcfunction ================================================ #@s = rotten_flesh item on the ground #at @s #called by spawn_zombie #remove 1 from count of rotten flesh stack execute store result score count gm4_rezombify run data get entity @s Item.count 0.99 execute store result entity @s Item.count byte 1 run scoreboard players get count gm4_rezombify #Spigot fix execute if score count gm4_rezombify matches 0 run kill @s #reset timer to 0 scoreboard players set @s gm4_rezombify 0 ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=item,x=0] if items entity @s contents minecraft:rotten_flesh if entity @s[nbt={OnGround:1b}] run function gm4_resurrecting_zombies:mark_rotten_flesh execute as @e[type=item,scores={gm4_rezombify=8..}] at @s run function gm4_resurrecting_zombies:spawn_zombie ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/mark_rotten_flesh.mcfunction ================================================ #@s = rotten_flesh item on the ground #at world spawn #called by event scoreboard players add @s gm4_rezombify 1 execute at @s run particle minecraft:entity_effect{color:[0.33,0.11,0.29,1.0]} ~ ~ ~ 0 0 0 1 0 ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_resurrecting_zombies",Tags:["gm4_mysterious_midnights_expansion","gm4_resurrecting_zombies"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/function/spawn_zombie.mcfunction ================================================ #@s = rotten_flesh item on the ground #at @s #called by event summon zombie ~ ~ ~ {DeathLootTable:"gm4:empty",equipment:{},active_effects:[{id:'minecraft:nausea',amplifier:1,duration:30}],attributes:[{id:"minecraft:attack_damage",base:10.0}]} playsound block.redstone_torch.burnout hostile @a[distance=..16] ~ ~ ~ 1 .1 function gm4_resurrecting_zombies:absorb_rotten_flesh ================================================ FILE: gm4_mysterious_midnights/data/gm4_resurrecting_zombies/guidebook/resurrecting_zombies.json ================================================ { "id": "resurrecting_zombies", "name": "Resurrecting Zombies", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Resurrecting_Zombies", "icon": { "id": "minecraft:rotten_flesh" }, "criteria": { "fight_resurrected_zombie": { "trigger": "minecraft:player_hurt_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:zombie", "nbt": "{DeathLootTable:\"minecraft:empty\",attributes:[{id:\"minecraft:attack_damage\",base:10.0d}]}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "fight_resurrected_zombie" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.resurrecting_zombies.description", "fallback": "During a Resurrecting Zombies event, rotten flesh on the floor will resurrect into unarmed zombies, with a powerful attack." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/event.mcfunction ================================================ #@s = none #at world spawn #called by mysterious midnights base if this expansion was selected. pulsed every 0.8 seconds throughout the night. execute as @e[type=skeleton,tag=!smithed.entity,tag=!gm4_tipped_skeleton,x=0,nbt={equipment:{mainhand:{id:"minecraft:bow",count:1}},PersistenceRequired:0b}] at @s run function gm4_tipped_skeletons:tipp ================================================ FILE: gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/setup.mcfunction ================================================ #called upon start of a rare mysterious midnight. Used to select this expansion by chance. summon minecraft:area_effect_cloud ~ ~ ~ {CustomName:"gm4_tipped_skeletons",Tags:["gm4_mysterious_midnights_expansion","gm4_tipped_skeletons"],Duration:18000,Radius:0f,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} ================================================ FILE: gm4_mysterious_midnights/data/gm4_tipped_skeletons/function/tipp.mcfunction ================================================ #@s = not tipped skeletons with nbt={equipment:{mainhand:{id:"minecraft:bow",count:1}},PersistenceRequired:0b} #at @s #called by event tag @s add gm4_tipped_skeleton data modify entity @s drop_chances merge value {offhand:0.75f} loot replace entity @s weapon.offhand loot gm4_tipped_skeletons:tipped_type ================================================ FILE: gm4_mysterious_midnights/data/gm4_tipped_skeletons/guidebook/tipped_skeletons.json ================================================ { "id": "tipped_skeletons", "name": "Tipped Skeletons", "module_type": "expansion", "load_check": "mysterious_midnights", "base_module": "mysterious_midnights", "wiki_link": "https://wiki.gm4.co/Mysterious_Midnights/Tipped_Skeletons", "icon": { "id": "minecraft:tipped_arrow", "components": { "minecraft:potion_contents": "minecraft:long_poison" } }, "criteria": { "shot_by_tipped_skeleton": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "source_entity": { "type": "minecraft:skeleton", "nbt": "{Tags:['gm4_tipped_skeleton']}" } } } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "shot_by_tipped_skeleton" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.tipped_skeletons.description", "fallback": "During a Tipped Skeletons event, skeletons will be equipped with tipped arrows.\n\nExtended slowness, extended weakness, extended poison, and strong harming tipped arrows are used." } ] ] } ] } ================================================ FILE: gm4_mysterious_midnights/data/gm4_tipped_skeletons/loot_table/tipped_type.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 1, "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": "minecraft:strong_harming" } }, { "function": "minecraft:set_count", "count": { "min": 7, "max": 11 } } ] }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": "minecraft:long_poison" } }, { "function": "minecraft:set_count", "count": { "min": 9, "max": 12 } } ] }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": "minecraft:long_weakness" } }, { "function": "minecraft:set_count", "count": { "min": 4, "max": 8 } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": "minecraft:long_slowness" } }, { "function": "minecraft:set_count", "count": { "min": 4, "max": 8 } } ] } ] } ] } ================================================ FILE: gm4_mysterious_midnights/mod.mcdoc ================================================ dispatch minecraft:storage[gm4_mysterious_midnights:temp] to struct { day?: int, } dispatch minecraft:storage[gm4_falling_stars:motion] to struct { temp?: struct { motion: [double] @ 3, }, } ================================================ FILE: gm4_mysterious_midnights/translations.csv ================================================ key,en_us entity.gm4.falling_star,Falling Star item.gm4.endermite_egg,Endermite Egg item.gm4.endermite_egg.lore,"Oh, it didn't hatch" text.gm4.guidebook.module_desc.falling_stars,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.falling_stars.description,"During a Falling Stars event, gifts will drop from the sky.\n\nDiamonds, iron nuggets, gold nuggets, endermites, end stone, and chorus fruit can be found falling from the sky." text.gm4.guidebook.module_desc.harvest_moons,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.harvest_moons.description,"During a Harvest Moons event, random tick events, such as crop growth, will be 20 times quicker than normal." text.gm4.guidebook.mysterious_midnights.description,"Every full moon, there is a high chance that a Mysterious Midnight event will occur.\n\nWhen a Mysterious Midnight event occurs, a howling sound will be heard." text.gm4.guidebook.mysterious_midnights.sleeping,Mysterious Midnight events can usually be skipped by sleeping the night away. text.gm4.guidebook.module_desc.nightmare_nights,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.nightmare_nights.description,"Nightmare Nights cannot be slept away. Attempting to sleep will deal instant damage.\n\nAdditionally, multiple Mysterious Midnights events will occur." text.gm4.guidebook.nightmare_nights.events,"While a Nightmare Night is active, the following events will occur:\n\n - Resurrecting Skeletons\n - Resurrecting Zombies\n - Tipped Skeletons" text.gm4.guidebook.nightmare_nights.events_with_menaces,"While a Nightmare Night is active, the following events will occur:\n\n - Resurrecting Skeletons\n - Resurrecting Zombies\n - Tipped Skeletons\n - Enlarging Phantoms\n - Illusioner Nights\n - Menacing Goblins" text.gm4.guidebook.module_desc.resurrecting_skeletons,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.resurrecting_skeletons.description,"During a Resurrecting Skeletons event, bones on the floor will resurrect into unarmed skeletons, with a powerful attack." text.gm4.guidebook.module_desc.resurrecting_zombies,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.resurrecting_zombies.description,"During a Resurrecting Zombies event, rotten flesh on the floor will resurrect into unarmed zombies, with a powerful attack." text.gm4.guidebook.module_desc.tipped_skeletons,"Full moons gain an element of surprise with Mysterious Midnights! You might encounter falling stars, or Skeletons wielding poisonous arrows during full moons! So you better listen for that howl..." text.gm4.guidebook.tipped_skeletons.description,"During a Tipped Skeletons event, skeletons will be equipped with tipped arrows.\n\nExtended slowness, extended weakness, extended poison, and strong harming tipped arrows are used." ================================================ FILE: gm4_note_block_interface/README.md ================================================ # Note Block Interface Note Blocks have always been a bit... odd to use. Figuring out what note its set to involves a cryptic colour scheme of the note particle, and if you miss the note you want, you have to go around the whole range again. This simple data pack displays the current note above a note block, and allows you to go backwards by sneaking. ![Note Block Interface Example](images/note_block_interface_example.webp) ### Features - The current pitch of a note block is displayed above it when struck or tuned by the player. - Enables tuning back down the scale by sneaking while tuning the note block ================================================ FILE: gm4_note_block_interface/beet.yaml ================================================ id: gm4_note_block_interface name: Note Block Interface version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [tick] website: description: Adds a neat interface to improve your musical skills! recommended: [] notes: [] modrinth: project_id: ikXgoCNB smithed: pack_id: gm4_note_block_interface planetminecraft: uid: 4308978 video: https://www.youtube.com/watch?v=Kqrdy-8-sb8 wiki: https://wiki.gm4.co/wiki/Note_Block_Interface credits: Creator: - Scommander Updated by: - Denniss Icon Design: - DuckJr ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/advancement/tune.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:note_block" ] } } } ] } } }, "rewards": { "function": "gm4_note_block_interface:tune" } } ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/init.mcfunction ================================================ scoreboard objectives add gm4_nbi_play minecraft.custom:minecraft.play_noteblock scoreboard objectives add gm4_nbi_tune minecraft.custom:minecraft.tune_noteblock scoreboard objectives add gm4_nbi_ray dummy scoreboard objectives add gm4_nbi_change dummy execute unless score note_block_interface gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Note Block Interface"} execute unless score note_block_interface gm4_earliest_version < note_block_interface gm4_modules run scoreboard players operation note_block_interface gm4_earliest_version = note_block_interface gm4_modules scoreboard players set note_block_interface gm4_modules 1 schedule function gm4_note_block_interface:tick 1t #$moduleUpdateList ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/interface/change.mcfunction ================================================ # change note to decrease instead of increase # @s = player tuning note block while sneaking # at note block # run from gm4_note_block_interface:tune/sneak_loop # lowers the note of the note block execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=0] run setblock ~ ~ ~ note_block[note=23] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=1] run setblock ~ ~ ~ note_block[note=24] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=2] run setblock ~ ~ ~ note_block[note=0] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=3] run setblock ~ ~ ~ note_block[note=1] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=4] run setblock ~ ~ ~ note_block[note=2] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=5] run setblock ~ ~ ~ note_block[note=3] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=6] run setblock ~ ~ ~ note_block[note=4] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=7] run setblock ~ ~ ~ note_block[note=5] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=8] run setblock ~ ~ ~ note_block[note=6] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=9] run setblock ~ ~ ~ note_block[note=7] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=10] run setblock ~ ~ ~ note_block[note=8] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=11] run setblock ~ ~ ~ note_block[note=9] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=12] run setblock ~ ~ ~ note_block[note=10] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=13] run setblock ~ ~ ~ note_block[note=11] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=14] run setblock ~ ~ ~ note_block[note=12] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=15] run setblock ~ ~ ~ note_block[note=13] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=16] run setblock ~ ~ ~ note_block[note=14] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=17] run setblock ~ ~ ~ note_block[note=15] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=18] run setblock ~ ~ ~ note_block[note=16] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=19] run setblock ~ ~ ~ note_block[note=17] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=20] run setblock ~ ~ ~ note_block[note=18] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=21] run setblock ~ ~ ~ note_block[note=19] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=22] run setblock ~ ~ ~ note_block[note=20] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=23] run setblock ~ ~ ~ note_block[note=21] execute unless score @s gm4_nbi_change matches 1.. store success score @s gm4_nbi_change if block ~ ~ ~ note_block[note=24] run setblock ~ ~ ~ note_block[note=22] # resets gm4_nbi_change scoreboard players reset @s gm4_nbi_change # runs function to display the note function gm4_note_block_interface:interface/create ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/interface/create.mcfunction ================================================ # check note and show as floating text # @s = player punching/tuning note block # at note block # run from gm4_note_block_interface:play/loop # run from gm4_note_block_interface:tune/loop # run from gm4_note_block_interface:interface/change # kills old AEC kill @e[distance=..0.5,type=area_effect_cloud,tag=gm4_nbi_display] # summons new AEC with correct note execute if block ~ ~ ~ note_block[note=0] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"F♯"}} execute if block ~ ~ ~ note_block[note=1] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"G"}} execute if block ~ ~ ~ note_block[note=2] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"G♯"}} execute if block ~ ~ ~ note_block[note=3] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"A"}} execute if block ~ ~ ~ note_block[note=4] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"A♯"}} execute if block ~ ~ ~ note_block[note=5] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"B"}} execute if block ~ ~ ~ note_block[note=6] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"C"}} execute if block ~ ~ ~ note_block[note=7] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"C♯"}} execute if block ~ ~ ~ note_block[note=8] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"D"}} execute if block ~ ~ ~ note_block[note=9] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"D♯"}} execute if block ~ ~ ~ note_block[note=10] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"E"}} execute if block ~ ~ ~ note_block[note=11] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"F"}} execute if block ~ ~ ~ note_block[note=12] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"F♯"}} execute if block ~ ~ ~ note_block[note=13] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"G"}} execute if block ~ ~ ~ note_block[note=14] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"G♯"}} execute if block ~ ~ ~ note_block[note=15] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"A"}} execute if block ~ ~ ~ note_block[note=16] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"A♯"}} execute if block ~ ~ ~ note_block[note=17] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"B"}} execute if block ~ ~ ~ note_block[note=18] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"C"}} execute if block ~ ~ ~ note_block[note=19] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"C♯"}} execute if block ~ ~ ~ note_block[note=20] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"D"}} execute if block ~ ~ ~ note_block[note=21] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"D♯"}} execute if block ~ ~ ~ note_block[note=22] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"E"}} execute if block ~ ~ ~ note_block[note=23] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"F"}} execute if block ~ ~ ~ note_block[note=24] run summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Duration:20,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}},Tags:["gm4_nbi_display"],CustomNameVisible:1b,CustomName:{"text":"F♯"}} ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/play/loop.mcfunction ================================================ # ray cast to find note block # @s = player punching note block # at @s anchored eyes positioned ^ ^ ^ # run from gm4_note_block_interface:play/setup # removes 1 from raycast scoreboard players remove @s gm4_nbi_ray 1 # tests for note_block execute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/create # runs the loop again execute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:play/loop ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/play/setup.mcfunction ================================================ # start ray to find note block # @s = player punching note block # at @s anchored eyes positioned ^ ^ ^ # run from gm4_note_block_interface:tick # resets play score scoreboard players reset @s gm4_nbi_play # sets raycast limit scoreboard players set @s gm4_nbi_ray 50 # runs raycast loop function gm4_note_block_interface:play/loop ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/tick.mcfunction ================================================ # tests if the player has played a note block execute as @a[scores={gm4_nbi_play=1..}] at @s anchored eyes positioned ^ ^ ^ run function gm4_note_block_interface:play/setup schedule function gm4_note_block_interface:tick 1t ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/tune/loop.mcfunction ================================================ # ray cast to find note block # @s = player tuning note block # at @s anchored eyes positioned ^ ^ ^ # run from gm4_note_block_interface:tune/setup # removes 1 from raycast scoreboard players remove @s gm4_nbi_ray 1 # tests for note_block execute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/create # runs the loop again execute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:tune/loop ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/tune/setup.mcfunction ================================================ # check if player is sneaking and start ray cast to find note block # @s = player tuning note block # at @s anchored eyes positioned ^ ^ ^ # run from gm4_note_block_interface:tune # resets tune scores scoreboard players reset @s gm4_nbi_tune # sets raycast limit scoreboard players set @s gm4_nbi_ray 50 # runs raycast loop execute unless predicate gm4_note_block_interface:sneaking run function gm4_note_block_interface:tune/loop execute if predicate gm4_note_block_interface:sneaking run function gm4_note_block_interface:tune/sneak_loop ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/tune/sneak_loop.mcfunction ================================================ # ray cast to find note block # @s = player tuning note block # at @s anchored eyes positioned ^ ^ ^ # run from gm4_note_block_interface:tune/setup # removes 1 from raycast scoreboard players remove @s gm4_nbi_ray 1 # tests for note_block execute if block ~ ~ ~ note_block align xyz positioned ~0.5 ~0.6 ~0.5 run function gm4_note_block_interface:interface/change # runs the loop again execute unless block ~ ~ ~ note_block if score @s gm4_nbi_ray matches 1.. positioned ^ ^ ^0.1 run function gm4_note_block_interface:tune/sneak_loop ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/function/tune.mcfunction ================================================ # checks if player tuned the note block # @s = player tuning note block # at @s # run from advancement tune advancement revoke @s only gm4_note_block_interface:tune # tests if the player has tuned a note block execute if entity @s[scores={gm4_nbi_tune=1..}] anchored eyes positioned ^ ^ ^ run function gm4_note_block_interface:tune/setup ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/guidebook/note_block_interface.json ================================================ { "id": "note_block_interface", "name": "Note Block Interface", "module_type": "module", "icon": { "id": "minecraft:note_block" }, "criteria": { "tune_note_block": { "trigger": "minecraft:default_block_use", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": false } } } ], "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:note_block" ] } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "tune_note_block" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.note_block_interface.description", "fallback": "Tuning or playing a note block will show its note above it.\n\nSneaking while tuning will cause the pitch to go down instead of up." } ] ] } ] } ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/predicate/sneaking.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } } ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/test/play_note.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~1 ~1 note_block execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 # fake click a note block scoreboard players add @s gm4_nbi_play 1 await entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/test/tune_down.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~1 ~1 note_block execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 dummy @s sneak true await delay 1t clear @s dummy @s use block ~1 ~1 ~1 await entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside assert block ~1 ~1 ~1 note_block[note=24] ================================================ FILE: gm4_note_block_interface/data/gm4_note_block_interface/test/tune_up.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~1 ~1 note_block execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 dummy @s use block ~1 ~1 ~1 await entity @e[type=area_effect_cloud,tag=gm4_nbi_display] inside assert block ~1 ~1 ~1 note_block[note=1] ================================================ FILE: gm4_note_block_interface/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.note_block_interface,Adds a neat interface to improve your musical skills! text.gm4.guidebook.note_block_interface.description,Tuning or playing a note block will show its note above it.\n\nSneaking while tuning will cause the pitch to go down instead of up. ================================================ FILE: gm4_orb_of_ankou/README.md ================================================ # Orb of Ankou Ever found yourself envious of certain monsters abilities? Orb of Ankou allows you to gain some of those abilities. ### Features - Integrates with the [Metallurgy]($dynamicLink:gm4_metallurgy) Shamir system to allow the player to collect "Soul Essence" from mobs - Adds certain qualities to mobs (such as Aggressive, Agile, Anchoring) and allows their soul to be harvested to collect each essence - Apon collecting enough of an essence type, the player can convert it into a Shard to channel the ability, which are then activated upon a certain condition. - Adds an Orb which allows holding multiple shards (that contain mob based abilities) Read more about all the options on the [Wiki](https://wiki.gm4.co/Orb_of_Ankou). ================================================ FILE: gm4_orb_of_ankou/assets/gm4_orb_of_ankou/optifine/cit/fire_sprite.properties ================================================ type=armor matchItems=golden_helmet texture.gold_layer_1=fire_sprite_layer_1 nbt.CustomModelData=$entity/fire_sprite ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/bat2.properties ================================================ from=minecraft:optifine/mob/bat2_anim.png to=minecraft:optifine/mob/bat2.png x=0 y=0 w=32 h=32 interpolate=false tile.0=0 duration.0=5 tile.1=1 duration.1=5 tile.2=2 duration.2=5 tile.3=3 duration.3=5 tile.4=4 duration.4=5 tile.5=5 duration.5=5 tile.6=6 duration.6=5 tile.7=7 duration.7=5 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/bat2_e.properties ================================================ from=minecraft:optifine/mob/bat2_e_anim.png to=minecraft:optifine/mob/bat2_e.png x=0 y=0 w=32 h=32 interpolate=true tile.0=0 duration.0=15 tile.1=1 duration.1=15 tile.2=2 duration.2=15 tile.3=3 duration.3=15 tile.4=4 duration.4=15 tile.5=5 duration.5=15 tile.6=6 duration.6=15 tile.7=7 duration.7=15 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/endermite2.properties ================================================ from=minecraft:optifine/mob/endermite2_anim.png to=minecraft:optifine/mob/endermite2.png x=0 y=0 w=64 h=32 interpolate=false tile.0=0 duration.0=5 tile.1=1 duration.1=5 tile.2=2 duration.2=5 tile.3=3 duration.3=5 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/endermite2_e.properties ================================================ from=minecraft:optifine/mob/endermite2_e_anim.png to=minecraft:optifine/mob/endermite2_e.png x=0 y=0 w=64 h=32 interpolate=false tile.0=0 duration.0=5 tile.1=1 duration.1=5 tile.2=2 duration.2=5 tile.3=3 duration.3=5 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/phantom2.properties ================================================ from=minecraft:optifine/mob/phantom2_anim.png to=minecraft:optifine/mob/phantom2.png x=0 y=0 w=128 h=128 interpolate=false tile.0=0 duration.0=2 tile.1=1 duration.1=2 tile.2=2 duration.2=2 tile.3=3 duration.3=2 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/silverfish3.properties ================================================ from=minecraft:optifine/mob/silverfish3_anim.png to=minecraft:optifine/mob/silverfish3.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=15 tile.1=1 duration.1=15 tile.2=2 duration.2=15 tile.3=3 duration.3=15 tile.4=4 duration.4=15 tile.5=5 duration.5=15 tile.6=6 duration.6=15 tile.7=7 duration.7=15 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/anim/silverfish3_e.properties ================================================ from=minecraft:optifine/mob/silverfish3_e_anim.png to=minecraft:optifine/mob/silverfish3_e.png x=0 y=0 w=64 h=32 interpolate=false tile.0=0 duration.0=15 tile.1=1 duration.1=15 tile.2=2 duration.2=15 tile.3=3 duration.3=15 tile.4=4 duration.4=15 tile.5=5 duration.5=15 tile.6=6 duration.6=15 tile.7=7 duration.7=15 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/cem/bat.jem ================================================ { "texture": "bat.png", "textureSize": [32, 32], "models": [ { "part": "head", "id": "head", "invertAxis": "xy", "translate": [0, -7, 0], "boxes": [ {"coordinates": [-2, 7, -1, 4, 3, 2], "textureOffset": [0, 7]}, {"coordinates": [-4, 8, 0, 3, 5, 0], "textureOffset": [8, 15]}, {"coordinates": [1, 8, 0, 3, 5, 0], "textureOffset": [1, 15]} ] }, { "part": "body", "id": "body", "invertAxis": "xy", "translate": [0, -7, 0], "boxes": [ {"coordinates": [-1.5, 2, -1, 3, 5, 2], "textureOffset": [0, 0]}, {"coordinates": [-1.5, 5, -2, 3, 4, 3], "textureOffset": [20, 17]}, {"coordinates": [-1.5, 0, -2, 5, 5, 3], "textureOffset": [16, 24]}, {"coordinates": [-1.5, 0, 0, 3, 2, 0], "textureOffset": [16, 16]} ] }, { "part": "left_wing", "id": "left_wing", "invertAxis": "xy", "translate": [1.5, -7, 0], "boxes": [ {"coordinates": [-3.5, 2, 0, 2, 7, 0], "textureOffset": [12, 7]} ] }, { "part": "outer_left_wing", "id": "outer_left_wing", "invertAxis": "xy", "translate": [3.5, -7, 0], "boxes": [ {"coordinates": [-9.5, 1, 0, 6, 8, 0], "textureOffset": [16, 8]} ] }, { "part": "right_wing", "id": "right_wing", "invertAxis": "xy", "translate": [-1.5, -7, 0], "boxes": [ {"coordinates": [1.5, 2, 0, 2, 7, 0], "textureOffset": [12, 0]} ] }, { "part": "outer_right_wing", "id": "outer_right_wing", "invertAxis": "xy", "translate": [-3.5, -7, 0], "boxes": [ {"coordinates": [3.5, 1, 0, 6, 8, 0], "textureOffset": [16, 0]} ] } ] } ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/cem/endermite.jem ================================================ { "textureSize": [64, 32], "models": [ { "part": "body1", "id": "body1", "invertAxis": "xy", "translate": [0, -3, 3.5], "boxes": [ {"coordinates": [-2, 0, -4.5, 4, 3, 2], "textureOffset": [0, 0]}, {"coordinates": [-1.5, 1, -2.5, 3, 5, 3], "textureOffset": [52, 0]} ] }, { "part": "body2", "id": "body2", "invertAxis": "xy", "translate": [0, -4, 0], "boxes": [ {"coordinates": [-3, 0, -2.5, 6, 4, 5], "textureOffset": [0, 5]}, {"coordinates": [-2.5, 5, -3.5, 5, 5, 5], "textureOffset": [44, 22]} ] }, { "part": "body3", "id": "body3", "invertAxis": "xy", "translate": [0, -3, -3], "boxes": [ {"coordinates": [-1.5, 0, 2.5, 3, 3, 1], "textureOffset": [0, 14]} ] }, { "part": "body4", "id": "body4", "invertAxis": "xy", "translate": [0, -2, -4], "boxes": [ {"coordinates": [-0.5, 0, 3.5, 1, 2, 1], "textureOffset": [0, 18]} ] } ] } ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/cem/silverfish.jem ================================================ { "textureSize": [64, 32], "models": [ { "part": "body1", "id": "body1", "invertAxis": "xy", "translate": [0, -2, 3.5], "boxes": [ {"coordinates": [-1.5, 0, -4.5, 3, 2, 2], "textureOffset": [0, 0]} ] }, { "part": "body2", "id": "body2", "invertAxis": "xy", "translate": [0, -3, 1.5], "boxes": [ {"coordinates": [-2, 0, -2.5, 4, 3, 2], "textureOffset": [0, 4]} ] }, { "part": "body3", "id": "body3", "invertAxis": "xy", "translate": [0, -4, -1], "boxes": [ {"coordinates": [-3, 0, -0.5, 6, 4, 3], "textureOffset": [0, 9]} ] }, { "part": "body4", "id": "body4", "invertAxis": "xy", "translate": [0, -3, -4], "boxes": [ {"coordinates": [-1.5, 0, 2.5, 3, 3, 3], "textureOffset": [0, 16]} ] }, { "part": "body5", "id": "body5", "invertAxis": "xy", "translate": [0, -2, -7], "boxes": [ {"coordinates": [-1, 0, 5.5, 2, 2, 3], "textureOffset": [0, 22]} ] }, { "part": "body6", "id": "body6", "invertAxis": "xy", "translate": [0, -1, -9.5], "boxes": [ {"coordinates": [-1, 0, 8.5, 2, 1, 2], "textureOffset": [11, 0]} ] }, { "part": "body7", "id": "body7", "invertAxis": "xy", "translate": [0, -1, -11.5], "boxes": [ {"coordinates": [-0.5, 0, 10.5, 1, 1, 2], "textureOffset": [13, 4]} ] }, { "part": "wing1", "id": "wing1", "invertAxis": "xy", "translate": [0, -8, -1], "boxes": [ {"coordinates": [-5, 0, -0.5, 10, 8, 3], "textureOffset": [20, 0]}, {"coordinates": [-2.5, 0.5, -2.5, 5, 5, 5], "textureOffset": [44, 10]}, {"coordinates": [-3, 0, -3, 6, 6, 6], "textureOffset": [40, 20]} ] }, { "part": "wing2", "id": "wing2", "invertAxis": "xy", "translate": [0, -4, -7], "boxes": [ {"coordinates": [-3, 0, 5.5, 6, 4, 3], "textureOffset": [20, 11]} ] }, { "part": "wing3", "id": "wing3", "invertAxis": "xy", "translate": [0, -5, 1.5], "boxes": [ {"coordinates": [-3, 0, -3, 6, 5, 2], "textureOffset": [20, 18]} ] } ] } ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/mob/bat.properties ================================================ #gm4_orb_of_ankou:congealed_soul_shard skins.2=2 name.2=regex:Congealed Soul Shard\u00A7 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/mob/endermite.properties ================================================ #gm4_orb_of_ankou:severed_soul skins.2=2 name.2=regex:Severed Soul\u00A7 ================================================ FILE: gm4_orb_of_ankou/assets/minecraft/optifine/mob/silverfish.properties ================================================ #gm4_orb_of_ankou:living_orb skins.3=3 name.3=regex:Living Orb\u00A7 ================================================ FILE: gm4_orb_of_ankou/assets/model_data.yaml ================================================ model_data: - item: firework_star reference: item/orb_of_ankou template: generated_overlay - item: [flint, black_dye] template: pneuma broadcast: - reference: pneuma/aggressive - reference: pneuma/agile - reference: pneuma/anchoring - reference: pneuma/bargaining - reference: pneuma/bashing - reference: pneuma/blasting - reference: pneuma/blinding - reference: pneuma/bounding - reference: pneuma/bubbly - reference: pneuma/conjuring - reference: pneuma/dashing - reference: pneuma/depriving - reference: pneuma/draining - reference: pneuma/enduring - reference: pneuma/expeditious - reference: pneuma/feathery - reference: pneuma/gazing - reference: pneuma/gliding - reference: pneuma/hawkeye - reference: pneuma/incombustible - reference: pneuma/lifeless - reference: pneuma/neutralizing - reference: pneuma/phasing - reference: pneuma/pricking - reference: pneuma/retreating - reference: pneuma/rushing - reference: pneuma/scaling - reference: pneuma/sniffing - reference: pneuma/soaring - reference: pneuma/synergetic - reference: pneuma/vanishing - reference: pneuma/venomous - reference: pneuma/volatile - reference: pneuma/withering - reference: pneuma/striding - reference: pneuma/freezing - reference: pneuma/feigning - reference: pneuma/shrieking - reference: pneuma/tranquilizing - reference: pneuma/debilitate - item: swords reference: shamir/corripio template: name: shamir metal: bismuth textures_path: gm4_metallurgy:item/shamir/bismuth - item: golden_helmet reference: entity/fire_sprite template: vanilla - item: black_dye reference: gui/advancement/orb_of_ankou_soul_essence template: name: advancement forward: item/essences/lifeless - item: elytra reference: gui/advancement/orb_of_ankou_soaring_pneuma template: name: advancement forward: item/essences/soaring - item: flint reference: gui/advancement/orb_of_ankou_soul_shard template: name: advancement forward: item/shards/lifeless - item: flint_and_steel reference: gui/advancement/orb_of_ankou_soul_forge template: advancement - item: nether_star reference: gui/advancement/orb_of_ankou_all_pneumas template: advancement - item: firework_star reference: gui/advancement/orb_of_ankou_max_orb template: name: advancement forward: item/orb_of_ankou ================================================ FILE: gm4_orb_of_ankou/assets/translations.csv ================================================ key,en_us advancement.gm4.orb_of_ankou.all_pneumas.description,Few have wielded this much power advancement.gm4.orb_of_ankou.all_pneumas.title,Heavy Artillery advancement.gm4.orb_of_ankou.create_soul_forge.description,Light a Soul Forge advancement.gm4.orb_of_ankou.create_soul_forge.title,A Dangerous Magic advancement.gm4.orb_of_ankou.max_orb_of_ankou.description,Max out an Orb of Ankou advancement.gm4.orb_of_ankou.max_orb_of_ankou.title,We're Full Here... advancement.gm4.orb_of_ankou.obtain_soul_essence.description,Obtain a piece of a mob's soul advancement.gm4.orb_of_ankou.obtain_soul_essence.title,A Small Price to Pay... advancement.gm4.orb_of_ankou.obtain_soul_shard.description,Forge a Soul Shard advancement.gm4.orb_of_ankou.obtain_soul_shard.title,Was it Worth the Sacrifice? advancement.gm4.orb_of_ankou.soaring.description,Fly with the soaring pneuma advancement.gm4.orb_of_ankou.soaring.title,I Believe I Can Fly! entity.gm4.congealed_shard,Congealed Soul Shard\u00A7 entity.gm4.fire_sprite,Fire Sprite\u00A7 entity.gm4.living_orb,Living Orb\u00A7 entity.gm4.possessed_shard,Possessed Soul Shard\u00A7 entity.gm4.severed_soul,Severed Soul\u00A7 entity.gm4.wandering_tear,Wandering Tear\u00A7 entity.gm4.withering_magic,Withering Magic item.gm4.orb_of_ankou,Orb of Ankou item.gm4.shamir.corripio,Corripio Shamir item.gm4.soul_essence,Soul Essence item.gm4.soul_shard,Soul Shard text.gm4.orb_of_ankou.empty,Empty text.gm4.orb_of_ankou.pneumas,Pneumas: text.gm4.pneuma_aggressive,Aggressive text.gm4.pneuma_agile,Agile text.gm4.pneuma_anchoring,Anchoring text.gm4.pneuma_bargaining,Bargaining text.gm4.pneuma_bashing,Bashing text.gm4.pneuma_blasting,Blasting text.gm4.pneuma_blinding,Blinding text.gm4.pneuma_bounding,Bounding text.gm4.pneuma_bubbly,Bubbly text.gm4.pneuma_conjuring,Conjuring text.gm4.pneuma_dashing,Dashing text.gm4.pneuma_depriving,Depriving text.gm4.pneuma_draining,Draining text.gm4.pneuma_enduring,Enduring text.gm4.pneuma_expeditious,Expeditious text.gm4.pneuma_feathery,Feathery text.gm4.pneuma_feigning,Feigning text.gm4.pneuma_freezing,Freezing text.gm4.pneuma_gazing,Gazing text.gm4.pneuma_gliding,Gliding text.gm4.pneuma_hawkeye,Hawkeye text.gm4.pneuma_incombustible,Incombustible text.gm4.pneuma_lifeless,Lifeless text.gm4.pneuma_neutralizing,Neutralizing text.gm4.pneuma_phasing,Phasing text.gm4.pneuma_pricking,Pricking text.gm4.pneuma_retreating,Retreating text.gm4.pneuma_rushing,Rushing text.gm4.pneuma_scaling,Scaling text.gm4.pneuma_shrieking,Shrieking text.gm4.pneuma_sniffing,Sniffing text.gm4.pneuma_soaring,Soaring text.gm4.pneuma_striding,Striding text.gm4.pneuma_synergetic,Synergetic text.gm4.pneuma_tranquilizing,Tranquilizing text.gm4.pneuma_debilitate,Debilitate text.gm4.pneuma_vanishing,Vanishing text.gm4.pneuma_venomous,Venomous text.gm4.pneuma_volatile,Volatile text.gm4.pneuma_withering,Withering text.gm4.guidebook.module_desc.corripio_shamir,"Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man." text.gm4.guidebook.corripio_shamir.description,Corripio extracts soul essence drops from mobs. text.gm4.guidebook.corripio_shamir.usage,The Corripio Shamir is found on Bismuth Bands. It can be placed onto swords.\n\nKilling mobs will cause Soul Essences to drop very rarely. The drop rates are increased with the Looting enchantment. text.gm4.guidebook.module_desc.orb_of_ankou,"Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man." text.gm4.guidebook.orb_of_ankou.description,"Mob powers can be obtained by collecting rare soul essences using the Corripio Shamir.\n\nThirteen essences are required to gain the powers of a mob, called a pneuma." text.gm4.guidebook.orb_of_ankou.soul_forge,"To gain powers of the Soul Essences, a Condensing Ritual must be performed in a Soul Forge.\n\nA Soul Forge can be made in the Nether by forming a 3x3 ring of obsidian then igniting soul fire inside the ring." text.gm4.guidebook.orb_of_ankou.condensing_ritual,"To create a Soul Shard, 13 of the same Soul Essence must be dropped into the forge along with some blaze powder and glowstone dust.\n\nExtinguishing the flame will create a Possesed Soul Shard, which should be killed." text.gm4.guidebook.orb_of_ankou.condensing_ingredients,"The required amount of glowstone dust and blaze powder is between 1 and 64, but differs in each world.\n\nExtra dust or powder will create the Shard, but spawn Fiery Sprites. Too little will cause the recipe to fail." text.gm4.guidebook.orb_of_ankou.shard_usage,"Holding the Shard in the offhand will grant the user with that pneuma's power, while lowering their attack damage 20% as a side-effect.\n\nAn Orb of Ankou can be crafted to negate the attack debuff and hold more pneumas." text.gm4.guidebook.orb_of_ankou.orb_crafting,The Orb of Ankou can be crafted with the following recipe: text.gm4.guidebook.orb_of_ankou.fusing_ritual,"To fuse a Shard into an Orb, light a soul forge and drop the two items in, along with some ghast tears.\n\nWither particles will appear to indicate where wither roses should be placed to be absorbed." text.gm4.guidebook.orb_of_ankou.fusing_ingredients,"The required amount of ghast tears and wither roses is between 3 and 16, but differs in each world.\n\nExtra tears or roses will fuse the Shard, but wandering tears and a withering cloud will appear." text.gm4.guidebook.orb_of_ankou.orb_usage,"Similar to a Soul Shard, the Orb of Ankou functions when it is equipped in the offhand.\n\nAn orb of ankou can hold 4 pneumas, which will work concurrently when in the same orb." text.gm4.guidebook.orb_of_ankou.defensive_pneumas,The following pneumas activate upon taking damage: text.gm4.guidebook.orb_of_ankou.note.aggressive,Grants Strength when damaged text.gm4.guidebook.orb_of_ankou.pneuma_list, - %1$s* text.gm4.guidebook.orb_of_ankou.note.feigning,"Grants Slowness, Resistance, Invisibility, and Regeneration when damaged below half health" text.gm4.guidebook.orb_of_ankou.note.incombustible,Grants Fire Resistance when damaged by fire text.gm4.guidebook.orb_of_ankou.note.lifeless,Negates Poison effect and heals when damaged by Instant Damage effect text.gm4.guidebook.orb_of_ankou.note.neutralizing,Negates Poison effect; Instant Damage effect deals less damage text.gm4.pneuma_picking,Pricking text.gm4.guidebook.orb_of_ankou.note.pricking,75% chance to deal 1-4 damage to the attacker (Thorns V) text.gm4.guidebook.orb_of_ankou.note.retreating,Grants Speed and Weakness when damaged text.gm4.guidebook.orb_of_ankou.note.volatile,Creates explosion if damaged below 1.5 hearts text.gm4.guidebook.orb_of_ankou.offensive_pneumas,The following pneumas activate upon dealing damage: text.gm4.guidebook.orb_of_ankou.note.blasting,Shoots fireballs when shooting a crossbow with blaze powder in the inventory text.gm4.guidebook.orb_of_ankou.note.depriving,Applies Hunger to attacked targets; Applies Weakness to attacked mobs text.gm4.guidebook.orb_of_ankou.note.freezing,Applies Slowness to arrows shot from bows text.gm4.guidebook.orb_of_ankou.note.hawkeye,Doubles the damage of arrows shot from bows; Arrows shot from bows will have Piercing I text.gm4.guidebook.orb_of_ankou.note.tranquilizing,Applies Poison to arrows shot from bows text.gm4.guidebook.orb_of_ankou.note.debilitate,Applies Weakness to arrows shot from bows text.gm4.guidebook.orb_of_ankou.note.venomous,Applies Poison to attacked target text.gm4.guidebook.orb_of_ankou.note.withering,Applies Wither to attacked target text.gm4.guidebook.orb_of_ankou.passive_pneumas,"The following pneumas are passive, activating automatically:" text.gm4.guidebook.orb_of_ankou.note.agile,Prevents fall damage text.gm4.guidebook.orb_of_ankou.note.anchoring,Grants 90% Knockback Resistance text.gm4.guidebook.orb_of_ankou.note.bargaining,Grants Regeneration upon trading with villagers text.gm4.guidebook.orb_of_ankou.note.bashing,"Grants +70% Attack Damage, but -40% Attack Speed" text.gm4.guidebook.orb_of_ankou.note.bubbly,Grants 2 minutes of Water Breathing when submerged text.gm4.guidebook.orb_of_ankou.note.enduring,"Grants +8 Max Health, but -20% Speed" text.gm4.guidebook.orb_of_ankou.note.gliding,Grants Dolphin's Grace when swimming text.gm4.guidebook.orb_of_ankou.note.striding,Temporarily converts lava sources into magma blocks upon stepping on them text.gm4.guidebook.orb_of_ankou.note.synergetic,Grants Strength to tamed wolves and other Synergetic users text.gm4.guidebook.orb_of_ankou.sneak_charge_pneumas,The following pneumas charge while sneaking then activate upon unsneaking: text.gm4.guidebook.orb_of_ankou.note.bounding,Increasingly stronger Jump Boost text.gm4.guidebook.orb_of_ankou.note.conjuring,Increasingly farther Evoker fang attack text.gm4.guidebook.orb_of_ankou.note.dashing,Increasingly farther horizontal dash text.gm4.guidebook.orb_of_ankou.note.draining,Increasingly farther Mining Fatigue AOE text.gm4.guidebook.orb_of_ankou.note.expeditious,Increasingly farther random teleport text.gm4.guidebook.orb_of_ankou.note.rushing,Increasingly faster and longer Speed burst text.gm4.guidebook.orb_of_ankou.note.shrieking,"Sonic boom 15 blocks far, dealing 6 hearts of damage" text.gm4.guidebook.orb_of_ankou.sneak_tap_pneumas,The following pneumas activate while sneaking: text.gm4.guidebook.orb_of_ankou.note.blinding,Blindness AOE for 7 seconds text.gm4.guidebook.orb_of_ankou.note.feathery,Grants Slow Falling for 7 seconds text.gm4.guidebook.orb_of_ankou.note.gazing,Grants Night Vision for 30 seconds text.gm4.guidebook.orb_of_ankou.note.soaring,Sneaking toggles the ability: Look up to ascend and down to descend text.gm4.guidebook.orb_of_ankou.note.vanishing,Grants Invisibility for 90 seconds text.gm4.guidebook.orb_of_ankou.sneak_hold_pneumas,The following pneumas activate while continuously sneaking: text.gm4.guidebook.orb_of_ankou.note.phasing,Allows walking through 1-wide walls text.gm4.guidebook.orb_of_ankou.note.scaling,Allows climbing up walls text.gm4.guidebook.orb_of_ankou.note.sniffing,Sniffs up torchflowers and pitcher pods ================================================ FILE: gm4_orb_of_ankou/beet.yaml ================================================ id: gm4_orb_of_ankou name: Orb of Ankou version: 1.9.X data_pack: load: . resource_pack: load: - . - ../gm4_metallurgy pipeline: - gm4_orb_of_ankou.generate_pneumas - gm4_orb_of_ankou.pneuma_model_template - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module - gm4.plugins.include.lib_player_motion meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 lib_player_motion: 1.1.0 schedule_loops: - main - tick website: description: Harvest mob souls and condense them using forbidden nether magic to obtain mob abilities! Learn how to fly, or simply become turtule-man. recommended: [] notes: [] modrinth: project_id: rRP5afZM wiki: https://wiki.gm4.co/wiki/Orb_of_Ankou credits: Creator: - BPR Icon Design: - BPR ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/all_pneumas.json ================================================ { "display": { "icon": { "id": "nether_star", "components": { "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_all_pneumas"]} } }, "title": { "translate": "advancement.gm4.orb_of_ankou.all_pneumas.title", "fallback": "Heavy Artillery" }, "description": { "translate": "advancement.gm4.orb_of_ankou.all_pneumas.description", "fallback": "Few have wielded this much power", "color": "gray" }, "frame": "challenge" }, "parent": "gm4:soaring_pneuma", "criteria": { "aggressive_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"aggressive\"}]}}" } } ] } }, "agile_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"agile\"}]}}" } } ] } }, "anchoring_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"anchoring\"}]}}" } } ] } }, "bargaining_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"bargaining\"}]}}" } } ] } }, "bashing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"bashing\"}]}}" } } ] } }, "blasting_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"blasting\"}]}}" } } ] } }, "blinding_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"blinding\"}]}}" } } ] } }, "bounding_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"bounding\"}]}}" } } ] } }, "bubbly_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"bubbly\"}]}}" } } ] } }, "conjuring_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"conjuring\"}]}}" } } ] } }, "depriving_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"depriving\"}]}}" } } ] } }, "draining_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"draining\"}]}}" } } ] } }, "enduring_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"enduring\"}]}}" } } ] } }, "expeditious_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"expeditious\"}]}}" } } ] } }, "feathery_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"feathery\"}]}}" } } ] } }, "gazing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"gazing\"}]}}" } } ] } }, "gliding_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"gliding\"}]}}" } } ] } }, "hawkeye_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"hawkeye\"}]}}" } } ] } }, "incombustible_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"incombustible\"}]}}" } } ] } }, "lifeless_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"lifeless\"}]}}" } } ] } }, "neutralizing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"neutralizing\"}]}}" } } ] } }, "phasing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"phasing\"}]}}" } } ] } }, "pricking_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"pricking\"}]}}" } } ] } }, "retreating_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"retreating\"}]}}" } } ] } }, "rushing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"rushing\"}]}}" } } ] } }, "scaling_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"scaling\"}]}}" } } ] } }, "soaring_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"soaring\"}]}}" } } ] } }, "synergetic_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"synergetic\"}]}}" } } ] } }, "vanishing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"vanishing\"}]}}" } } ] } }, "venomous_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"venomous\"}]}}" } } ] } }, "volatile_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"volatile\"}]}}" } } ] } }, "withering_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"withering\"}]}}" } } ] } }, "freezing_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"freezing\"}]}}" } } ] } }, "striding_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"striding\"}]}}" } } ] } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/create_soul_forge.json ================================================ { "display": { "icon": { "id": "flint_and_steel", "components": { "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_forge"]} } }, "title": { "translate": "advancement.gm4.orb_of_ankou.create_soul_forge.title", "fallback": "A Dangerous Magic" }, "description": { "translate": "advancement.gm4.orb_of_ankou.create_soul_forge.description", "fallback": "Light a Soul Forge", "color": "gray" } }, "parent": "gm4:obtain_soul_essence", "criteria": { "create_soul_forge": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/create_soul_shard.json ================================================ { "display": { "icon": { "id": "flint", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_shard"]} } }, "title": { "translate": "advancement.gm4.orb_of_ankou.obtain_soul_shard.title", "fallback": "Was it Worth the Sacrifice?" }, "description": { "translate": "advancement.gm4.orb_of_ankou.obtain_soul_shard.description", "fallback": "Forge a Soul Shard", "color": "gray" } }, "parent": "gm4:create_soul_forge", "criteria": { "soul_shard": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:flint" ], "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"soul_shard\"}}" } } ] } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/max_orb_of_ankou.json ================================================ { "display": { "icon": { "id": "firework_star", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_max_orb"]}, "minecraft:firework_explosion": { "shape": "small_ball", "colors": [ 13092807 ] } } }, "title": { "translate": "advancement.gm4.orb_of_ankou.max_orb_of_ankou.title", "fallback": "We're Full Here..." }, "description": { "translate": "advancement.gm4.orb_of_ankou.max_orb_of_ankou.description", "fallback": "Max out an Orb of Ankou", "color": "gray" } }, "parent": "gm4:create_soul_shard", "criteria": { "max_orb_of_ankou": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/obtain_soul_essence.json ================================================ { "display": { "icon": { "id": "black_dye", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soul_essence"]} } }, "title": { "translate": "advancement.gm4.orb_of_ankou.obtain_soul_essence.title", "fallback": "A Small Price to Pay..." }, "description": { "translate": "advancement.gm4.orb_of_ankou.obtain_soul_essence.description", "fallback": "Obtain a piece of a mob's soul", "color": "gray" } }, "parent": "gm4:metallurgy_cast", "criteria": { "soul_essence": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:black_dye" ], "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"soul_essence\"}}" } } ] } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4/advancement/soaring_pneuma.json ================================================ { "display": { "icon": { "id": "elytra", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:gui/advancement/orb_of_ankou_soaring_pneuma"]} } }, "title": { "translate": "advancement.gm4.orb_of_ankou.soaring.title", "fallback": "I Believe I Can Fly!" }, "description": { "translate": "advancement.gm4.orb_of_ankou.soaring.description", "fallback": "Fly with the soaring pneuma", "color": "gray" }, "frame": "goal" }, "parent": "gm4:create_soul_shard", "criteria": { "soaring_pneuma": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"soaring\"}]}}" } } ] } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_animi_shamir/function/mark_orb_of_ankou.mcfunction ================================================ # Marks Orbs of Ankou as tools for the animi shamir # run from #gm4_animi_shamir:mark_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'animi'}}] if items entity @s contents minecraft:firework_star[custom_data~{gm4_orb_of_ankou:{item:"orb"}}] run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_corripio_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # run from #metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'corripio'}}] if items entity @s contents #gm4_corripio_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_corripio_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # run from metallurgy:casting/summon_band/bismuth via #gm4_metallurgy:summon_band/bismuth loot spawn ~ ~ ~ loot gm4_corripio_shamir:band ================================================ FILE: gm4_orb_of_ankou/data/gm4_corripio_shamir/guidebook/corripio_shamir.json ================================================ { "id": "corripio_shamir", "name": "Corripio Shamir", "module_type": "expansion", "load_check": "orb_of_ankou", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Corripio_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_corripio_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'corripio'}}" } } ] } }, "obtain_corripio_weapon": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'corripio'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.corripio_shamir.description", "fallback": "Corripio extracts soul essence drops from mobs." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_corripio_shamir", "obtain_corripio_weapon" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.corripio_shamir.usage", "fallback": "The Corripio Shamir is found on Bismuth Bands. It can be placed onto swords.\n\nKilling mobs will cause Soul Essences to drop very rarely. The drop rates are increased with the Looting enchantment." } ] ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_corripio_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bismuth_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:shamir/corripio"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'corripio'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.corripio", "fallback": "Corripio Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_corripio_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:swords" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_animi_shamir:mark_orb_of_ankou", "gm4_corripio_shamir:check_item_validity" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_metallurgy/tags/function/summon_band/bismuth.json ================================================ { "values":[ "gm4_corripio_shamir:summon_band" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/check_player/check_inventory.json ================================================ { "criteria": { "change_inventory": { "trigger": "minecraft:inventory_changed" } }, "rewards": { "function": "gm4_orb_of_ankou:update_tags/check_offhand" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/check_player/get_id.json ================================================ { "criteria": { "join": { "trigger": "minecraft:tick" } }, "rewards": { "function": "gm4_orb_of_ankou:update_tags/player_id" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/recipes/orb_of_ankou.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_orb_of_ankou:orb_of_ankou" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:netherite_scrap", "minecraft:nether_star" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_orb_of_ankou:orb_of_ankou" ] } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/damaged.json ================================================ { "criteria": { "damaged": { "trigger": "minecraft:entity_hurt_player" } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/player_damaged" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/fire_damaged.json ================================================ { "criteria": { "fire_damaged": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:is_fire", "expected": true } ] } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/player_on_fire" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/hunger_attack.json ================================================ { "criteria": { "player_attack_with_poision": { "trigger": "minecraft:player_hurt_entity", "conditions": { "damage": { "source_entity": { "equipment": { "offhand": { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"depriving\"}]}}" } } } }, "type": { "tags": [ { "id": "minecraft:is_explosion", "expected": false }, { "id": "minecraft:is_fire", "expected": false }, { "id": "minecraft:is_projectile", "expected": false }, { "id": "minecraft:witch_resistant_to", "expected": false } ] } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/hunger_attack" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_damaged_1.json ================================================ { "criteria": { "harming_1_applied": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:witch_resistant_to", "expected": true } ] }, "dealt": { "max": 6 } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/magic_damaged_1" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_damaged_2.json ================================================ { "criteria": { "harming_1_applied": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:witch_resistant_to", "expected": true } ] }, "dealt": { "min": 6 } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/magic_damaged_2" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/magic_evoker_fang.json ================================================ { "criteria": { "hurt_by_evoker_fang": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:witch_resistant_to", "expected": true } ] }, "source_entity": { "type": "minecraft:evoker" } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/magic_ignore" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/poison_attack.json ================================================ { "criteria": { "player_attack_with_poision": { "trigger": "minecraft:player_hurt_entity", "conditions": { "damage": { "source_entity": { "equipment": { "offhand": { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"venomous\"}]}}" } } } }, "type": { "tags": [ { "id": "minecraft:is_explosion", "expected": false }, { "id": "minecraft:is_fire", "expected": false }, { "id": "minecraft:is_projectile", "expected": false }, { "id": "minecraft:witch_resistant_to", "expected": false } ] } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/poison_attack" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/poison_effect.json ================================================ { "criteria": { "poison_applied": { "trigger": "minecraft:effects_changed", "conditions": { "effects": { "minecraft:poison": { "duration": { "min": 1 } } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/affected_by_poison" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/shoot_crossbow.json ================================================ { "criteria": { "crossbow_shot": { "trigger": "minecraft:shot_crossbow", "conditions": {} } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/shot_crossbow" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/traded.json ================================================ { "criteria": { "trade_with_villager": { "trigger": "minecraft:villager_trade" } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/player_traded" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/wither_attack.json ================================================ { "criteria": { "player_attack_with_wither": { "trigger": "minecraft:player_hurt_entity", "conditions": { "damage": { "source_entity": { "equipment": { "offhand": { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{id:\"withering\"}]}}" } } } }, "type": { "tags": [ { "id": "minecraft:is_explosion", "expected": false }, { "id": "minecraft:is_fire", "expected": false }, { "id": "minecraft:is_projectile", "expected": false }, { "id": "minecraft:witch_resistant_to", "expected": false } ] } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/wither_attack" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/advancement/triggers/wither_effect.json ================================================ { "criteria": { "wither_applied": { "trigger": "minecraft:effects_changed", "conditions": { "effects": { "minecraft:wither": { "duration": { "min": 1 } } } } } }, "rewards": { "function": "gm4_orb_of_ankou:pneumas/advancement_triggers/affected_by_wither" } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/init.mcfunction ================================================ # declare and initialise scoreboards and settings team add gm4_hide_name team modify gm4_hide_name nametagVisibility never # soul forge scoreboard stuff scoreboard objectives add gm4_count dummy scoreboard objectives add gm4_oa_forge dummy scoreboard objectives add gm4_oa_powder dummy scoreboard objectives add gm4_oa_glowstone dummy scoreboard objectives add gm4_oa_tears dummy scoreboard objectives add gm4_oa_roses dummy scoreboard objectives add gm4_oa_essence dummy scoreboard objectives add gm4_oa_fns minecraft.used:minecraft.flint_and_steel function gm4_orb_of_ankou:soul_forge/recipes/initiate_recipe_amounts # pneuma scoreboard stuff scoreboard objectives add gm4_oa_id dummy scoreboard objectives add gm4_pneuma_data dummy scoreboard objectives add gm4_oa_snk_num dummy scoreboard objectives add gm4_oa_marker dummy scoreboard objectives add gm4_oa_feign_t dummy scoreboard objectives add gm4_oa_sniff dummy scoreboard objectives add gm4_oa_jump_stop dummy scoreboard objectives add gm4_health health scoreboard objectives add gm4_oa_sneak minecraft.custom:minecraft.sneak_time scoreboard objectives add gm4_oa_swim minecraft.custom:minecraft.swim_one_cm scoreboard objectives add gm4_oa_bow_hawkeye minecraft.used:minecraft.bow scoreboard objectives add gm4_oa_bow_freezing minecraft.used:minecraft.bow scoreboard objectives add gm4_oa_bow_tranquilizing minecraft.used:minecraft.bow scoreboard objectives add gm4_oa_bow_debilitate minecraft.used:minecraft.bow # start module execute unless score orb_of_ankou gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Orb of Ankou"} execute unless score orb_of_ankou gm4_earliest_version < orb_of_ankou gm4_modules run scoreboard players operation orb_of_ankou gm4_earliest_version = orb_of_ankou gm4_modules scoreboard players set orb_of_ankou gm4_modules 1 schedule function gm4_orb_of_ankou:main 1t schedule function gm4_orb_of_ankou:tick 1t #$moduleUpdateList ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/main.mcfunction ================================================ ## SOUL FORGE ## execute in the_nether run function gm4_orb_of_ankou:nether_main ## PNEUMA STUFF ## # gazing effect give @a[gamemode=!spectator,tag=gm4_pneuma_gazing] night_vision 15 0 true # gliding effect give @a[gamemode=!spectator,tag=gm4_pneuma_gliding,scores={gm4_oa_swim=1..}] dolphins_grace 3 1 true scoreboard players reset @a gm4_oa_swim # soaring execute as @a[tag=gm4_oa_soaring_off_ground,nbt={OnGround:1b}] run function gm4_orb_of_ankou:pneumas/soaring/remove_fall_protection # sniffing scoreboard players remove @a[scores={gm4_oa_sniff=1..}] gm4_oa_sniff 1 # run player commands execute as @a[gamemode=!spectator,tag=gm4_has_pneuma] run function gm4_orb_of_ankou:player # revert invulnerable item scoreboard players add @e[type=item,tag=gm4_oa_invulnerable] gm4_pneuma_data 1 execute as @e[type=item,tag=gm4_oa_invulnerable,scores={gm4_pneuma_data=2..}] run function gm4_orb_of_ankou:pneumas/revert_invulnerable_item schedule function gm4_orb_of_ankou:main 16t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/nether_main.mcfunction ================================================ # runs main functions in the nether # @s = none # located at world spawn, in the nether # run from main # check if player is in the nether execute store result score nether_player gm4_oa_forge if entity @a[gamemode=!spectator,x=0,limit=1] execute unless score nether_player gm4_oa_forge matches 1.. run return 0 # mark soul altars as loaded if a player is nearby execute store result score loaded_forge gm4_oa_forge at @e[type=armor_stand,x=0,tag=gm4_soul_forge] if entity @a[gamemode=!spectator,distance=..8,limit=1] execute unless score loaded_forge gm4_oa_forge matches 1.. run return 0 # destroy soul forge execute as @e[type=armor_stand,x=0,tag=gm4_soul_forge] at @s unless block ~ ~ ~ soul_fire run function gm4_orb_of_ankou:soul_forge/destroy # soul forge visuals execute as @e[type=armor_stand,x=0,tag=gm4_soul_forge] at @s if predicate gm4_orb_of_ankou:has_multiblock run function gm4_orb_of_ankou:soul_forge/process ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/nether_tick.mcfunction ================================================ # runs tick functions in the nether # @s = none # located at world spawn, in the nether # run from tick # creation execute as @a[gamemode=!spectator,x=0,scores={gm4_oa_fns=1..}] at @s run function gm4_orb_of_ankou:soul_forge/used_flint_and_steel # check item before it burns execute if score loaded_forge gm4_oa_forge matches 1.. at @e[type=armor_stand,x=0,tag=gm4_soul_forge] if predicate gm4_orb_of_ankou:has_multiblock align xyz as @e[type=item,tag=!gm4_oa_checked_item,dx=0,dy=0,dz=0] run function gm4_orb_of_ankou:soul_forge/recipes/check_item ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/player.mcfunction ================================================ # @s = all non-spectator players that has a pneuma equipped # run from main # bubbly execute at @s[tag=gm4_pneuma_bubbly] anchored eyes positioned ^ ^ ^ unless predicate gm4_orb_of_ankou:in_water run effect give @s water_breathing 121 0 true # synergetic execute at @s[tag=gm4_pneuma_synergetic] run function gm4_orb_of_ankou:pneumas/synergetic/apply # soaring execute at @s[tag=gm4_oa_soaring_active] run function gm4_orb_of_ankou:pneumas/soaring/apply # disable jump revert scoreboard players remove @a[scores={gm4_oa_jump_stop=1..}] gm4_oa_jump_stop 1 execute as @a[scores={gm4_oa_jump_stop=1}] run attribute @s minecraft:jump_strength modifier remove gm4_orb_of_ankou:prevent_jump ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/affected_by_poison.mcfunction ================================================ # @s = any player who has the poison effect # run from advancement "triggers/poison_effect" advancement revoke @s only gm4_orb_of_ankou:triggers/poison_effect effect clear @s[tag=gm4_pneuma_neutralizing] poison effect clear @s[tag=gm4_pneuma_lifeless] poison ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/affected_by_wither.mcfunction ================================================ # @s = any player who has the wither effect # run from advancement "triggers/wither_effect" advancement revoke @s only gm4_orb_of_ankou:triggers/wither_effect effect clear @s[tag=gm4_pneuma_withering] wither ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/hunger_attack.mcfunction ================================================ # @s = any player who has hit an entity and has the depriving pneuma # run from advancement "trigers/hunger_attack" advancement revoke @s only gm4_orb_of_ankou:triggers/hunger_attack execute positioned ^ ^ ^2 run effect give @a[distance=..2.5,nbt={HurtTime:10s}] hunger 7 0 execute positioned ^ ^ ^2 run effect give @e[type=!player,tag=!smithed.strict,distance=..2.5,nbt={HurtTime:10s}] weakness 7 0 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_damaged_1.mcfunction ================================================ # @s = any player who was hurt by magic that dealt <= 6 health # run from advancement "triggers/magic_damaged_1" advancement revoke @s only gm4_orb_of_ankou:triggers/magic_damaged_1 tag @s add gm4_oa_magic_1 tag @s add gm4_oa_magic_damaged schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_damaged_2.mcfunction ================================================ # @s = any player who was hurt by magic that dealt >= 6 health # run from advancement "triggers/magic_damaged_2" advancement revoke @s only gm4_orb_of_ankou:triggers/magic_damaged_2 tag @s add gm4_oa_magic_2 tag @s add gm4_oa_magic_damaged schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/magic_ignore.mcfunction ================================================ # @s = any player who was hurt by an evoker fang # run from advancement "triggers/magic_evoker_fang" advancement revoke @s only gm4_orb_of_ankou:triggers/magic_evoker_fang tag @s add gm4_oa_magic_ignore tag @s add gm4_oa_magic_damaged schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_damaged.mcfunction ================================================ # @s = any player who has been damaged # run from advancement "triggers/damaged" advancement revoke @s only gm4_orb_of_ankou:triggers/damaged execute if entity @s[tag=gm4_pneuma_retreating] run function gm4_orb_of_ankou:pneumas/retreating effect give @s[tag=gm4_pneuma_aggressive] strength 3 1 true execute if entity @s[tag=gm4_pneuma_volatile] run function gm4_orb_of_ankou:pneumas/volatile execute if entity @s[tag=gm4_pneuma_feigning,scores={gm4_health=..10}] run function gm4_orb_of_ankou:pneumas/feigning/apply ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_on_fire.mcfunction ================================================ # @s = any player who has been damaged by fire # run from advancement "triggers/fire_damaged" advancement revoke @s only gm4_orb_of_ankou:triggers/fire_damaged effect give @s[tag=gm4_pneuma_incombustible] fire_resistance 15 0 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/player_traded.mcfunction ================================================ # @s = any player who has traded with a villager # run from advancement "triggers/traded" advancement revoke @s only gm4_orb_of_ankou:triggers/traded effect give @s[tag=gm4_pneuma_bargaining] minecraft:regeneration 4 1 xp add @s[tag=gm4_pneuma_bargaining] 50 points ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/poison_attack.mcfunction ================================================ # @s = any player who has hit an entity and has the venomous pneuma # run from advancement "trigers/poison_attack" advancement revoke @s only gm4_orb_of_ankou:triggers/poison_attack execute positioned ^ ^ ^2 run effect give @e[distance=..2.5,tag=!smithed.strict,nbt={HurtTime:10s}] poison 7 0 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/shot_crossbow.mcfunction ================================================ # @s = any player who has shot a crossbow # run from advancement "trigers/shoot_crossbow" advancement revoke @s only gm4_orb_of_ankou:triggers/shoot_crossbow execute if entity @s[tag=gm4_pneuma_blasting,nbt={Inventory:[{id:"minecraft:blaze_powder"}]}] if entity @e[type=minecraft:arrow,limit=1,distance=..2] run function gm4_orb_of_ankou:pneumas/blasting ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/advancement_triggers/wither_attack.mcfunction ================================================ # @s = any player who has hit an entity and has the withering pneuma # run from advancement "trigers/wither_attack" advancement revoke @s only gm4_orb_of_ankou:triggers/wither_attack execute positioned ^ ^ ^2 run effect give @e[distance=..2.5,tag=!smithed.strict,nbt={HurtTime:10s}] wither 8 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/blasting.mcfunction ================================================ # @s = player who shot a crossbow with blasting pneuma and blaze powder # run from advancement_triggers/shoot_crossbow # summon fireball at player's location summon minecraft:small_fireball ~ ~1 ~ {Tags:["gm4_oa_fireball"],Motion:[0.0,0.0,0.0]} # copy motion of arrow to fireball data modify entity @e[type=small_fireball,tag=gm4_oa_fireball,distance=..2,limit=1] Motion set from entity @e[type=minecraft:arrow,limit=1,distance=..2] Motion kill @e[type=arrow,distance=..2,limit=1] # clear blaze powder from player clear @s[gamemode=!creative,gamemode=!spectator] minecraft:blaze_powder 1 # make player who shot it the owner of the fireball data modify entity @e[type=small_fireball,tag=gm4_oa_fireball,distance=..2,limit=1] Owner set from entity @s UUID #firecharge sound playsound minecraft:item.firecharge.use player @a[distance=..15] ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/bounding.mcfunction ================================================ # @s = player with bounding pneuma who stopped sneaking # run from pneumas/sneak/stopped effect give @s[scores={gm4_oa_snk_num=10..19}] jump_boost 15 3 true effect give @s[scores={gm4_oa_snk_num=20..39}] jump_boost 15 5 true effect give @s[scores={gm4_oa_snk_num=40..59}] jump_boost 15 7 true effect give @s[scores={gm4_oa_snk_num=60..}] jump_boost 15 9 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/prepare.mcfunction ================================================ # @s = player with conjuring pneuma who stopped sneaking # run from pneumas/sneak/stopped summon armor_stand ~ ~ ~ {Invisible:1b,NoGravity:1b,Marker:1b,Small:1b,CustomName:"Fang Thrower",Tags:["gm4_oa_fang_thrower","gm4_oa_new_fang"],equipment:{feet:{id:"minecraft:stick",count:1}}} data modify entity @e[type=minecraft:armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] equipment.feet.components."minecraft:custom_data".gm4_oa_conjuring set from entity @s UUID tp @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] ~ ~ ~ ~ 0 scoreboard players set @s gm4_pneuma_data 0 scoreboard players set @s[scores={gm4_oa_snk_num=10..19}] gm4_pneuma_data 6 scoreboard players set @s[scores={gm4_oa_snk_num=20..39}] gm4_pneuma_data 9 scoreboard players set @s[scores={gm4_oa_snk_num=40..59}] gm4_pneuma_data 12 scoreboard players set @s[scores={gm4_oa_snk_num=60..}] gm4_pneuma_data 15 scoreboard players operation @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] gm4_pneuma_data = @s gm4_pneuma_data tag @e[type=armor_stand,tag=gm4_oa_new_fang,distance=..0.001,limit=1] remove gm4_oa_new_fang schedule function gm4_orb_of_ankou:pneumas/conjuring/temp_tick 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/summon_fangs.mcfunction ================================================ # @s = fang_thrower armor stand # run from pneumas/conjuring/throw summon evoker_fangs ~ ~ ~ {Tags:[gm4_oa_fang]} data modify entity @e[type=evoker_fangs,tag=gm4_oa_fang,limit=1,distance=..0.1] Owner set from entity @s equipment.feet.components."minecraft:custom_data".gm4_oa_conjuring tag @e[type=evoker_fangs] remove gm4_oa_fang tag @a[distance=..1,gamemode=!creative,gamemode=!spectator] add gm4_oa_magic_ignore tag @a[distance=..1,gamemode=!creative,gamemode=!spectator] add gm4_oa_magic_damaged schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/temp_tick.mcfunction ================================================ # @s = none # run from pneumas/conjuring/prepare execute as @e[type=armor_stand,tag=gm4_oa_fang_thrower,scores={gm4_pneuma_data=1..}] at @s run function gm4_orb_of_ankou:pneumas/conjuring/throw execute if entity @e[type=armor_stand,tag=gm4_oa_fang_thrower,scores={gm4_pneuma_data=1..},limit=1] run schedule function gm4_orb_of_ankou:pneumas/conjuring/temp_tick 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/conjuring/throw.mcfunction ================================================ # @s = fang_thrower armor stand # run from tick tp @s ^ ^ ^1 execute at @s run function gm4_orb_of_ankou:pneumas/conjuring/summon_fangs scoreboard players remove @s gm4_pneuma_data 1 kill @s[scores={gm4_pneuma_data=..0}] ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/dashing/prepare.mcfunction ================================================ # @s = player with dashing pneuma who stopped sneaking # run from pneumas/sneak/stopped execute rotated ~ 0 if block ^ ^0.9 ^.1 #gm4:no_collision if block ^ ^0.5 ^1.1 #gm4:no_collision run summon marker ^ ^0.5 ^1 {CustomName:"Dashing Vector",Tags:["gm4_oa_dash_vector"]} scoreboard players operation $current gm4_oa_id = @s gm4_oa_id # store player pos data modify storage gm4_oa_dashing:temp Pos set from entity @s Pos execute store result score $target_x gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[0] 1000 execute store result score $target_z gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[2] 1000 # store sneak count execute if score @s gm4_oa_snk_num matches 10..19 run scoreboard players set $multiplier gm4_pneuma_data 8 execute if score @s gm4_oa_snk_num matches 20..39 run scoreboard players set $multiplier gm4_pneuma_data 14 execute if score @s gm4_oa_snk_num matches 40..59 run scoreboard players set $multiplier gm4_pneuma_data 18 execute if score @s gm4_oa_snk_num matches 60.. run scoreboard players set $multiplier gm4_pneuma_data 24 # set motion tag @s add gm4_oa_dasher execute as @e[type=marker,tag=gm4_oa_dash_vector,distance=..3,limit=1] run function gm4_orb_of_ankou:pneumas/dashing/set_motion tag @s remove gm4_oa_dasher playsound minecraft:entity.player.small_fall player @a[distance=..8] ~ ~ ~ 0.7 0.6 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/dashing/set_motion.mcfunction ================================================ # @s = dash marker # located at player who started dashing # run from pneumas/dashing/prepare # get vector data modify storage gm4_oa_dashing:temp Pos set from entity @s Pos execute store result score $motion_x gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[0] 1000 execute store result score $motion_z gm4_pneuma_data run data get storage gm4_oa_dashing:temp Pos[2] 1000 scoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data scoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data # additional motion dependent on sneak count scoreboard players operation $motion_x gm4_pneuma_data *= $multiplier gm4_pneuma_data scoreboard players operation $motion_z gm4_pneuma_data *= $multiplier gm4_pneuma_data # set motion scoreboard players operation $x gm4_player_motion.api.launch = $motion_x gm4_pneuma_data scoreboard players set $y gm4_player_motion.api.launch 5200 scoreboard players operation $z gm4_player_motion.api.launch = $motion_z gm4_pneuma_data execute as @a[tag=gm4_oa_dasher,limit=1] run function #gm4_player_motion:launch_xyz ## clean up data remove storage gm4_oa_dashing:temp Pos kill @s ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/draining/apply_effect.mcfunction ================================================ # @s = players affected by draining pneuma # run from pneumas/draining/search effect give @s mining_fatigue 12 2 execute at @s run particle minecraft:elder_guardian ~ ~ ~ 0 0 0 1 1 force @s playsound minecraft:entity.elder_guardian.curse player @s ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/draining/search.mcfunction ================================================ # @s = player with draining pneuma who stopped sneaking # run from pneumas/sneak/stopped execute if score @s gm4_oa_snk_num matches 10..19 as @a[gamemode=!spectator,distance=0.001..16] run function gm4_orb_of_ankou:pneumas/draining/apply_effect execute if score @s gm4_oa_snk_num matches 20..39 as @a[gamemode=!spectator,distance=0.001..32] run function gm4_orb_of_ankou:pneumas/draining/apply_effect execute if score @s gm4_oa_snk_num matches 40..59 as @a[gamemode=!spectator,distance=0.001..48] run function gm4_orb_of_ankou:pneumas/draining/apply_effect execute if score @s gm4_oa_snk_num matches 60.. as @a[gamemode=!spectator,distance=0.001..64] run function gm4_orb_of_ankou:pneumas/draining/apply_effect ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/attempt.mcfunction ================================================ # @s = player with expeditious pneuma who stopped sneaking # run from pneumas/sneak/stopped execute if score @s gm4_oa_snk_num matches ..9 run return fail scoreboard players set expeditious_attempt gm4_pneuma_data 0 function gm4_orb_of_ankou:pneumas/expeditious/randomize ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/get_pos.mcfunction ================================================ # @s = player with expeditious pneuma who stopped sneaking # run from pneumas/expeditious/randomize # check column for safe location scoreboard players set set_y gm4_pneuma_data 0 $execute positioned ~$(x) ~5 ~$(z) run function gm4_orb_of_ankou:pneumas/expeditious/set_ypos # try another column (at most 12 times) if entire column was not safe scoreboard players add expeditious_attempt gm4_pneuma_data 1 execute unless score expeditious_attempt gm4_pneuma_data matches 12.. run function gm4_orb_of_ankou:pneumas/expeditious/randomize ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/randomize.mcfunction ================================================ # @s = player with expeditious pneuma who stopped sneaking # run from pneumas/expeditious/attempt # get sneak-number-based distance execute if score @s gm4_oa_snk_num matches 10..19 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -4..4 execute if score @s gm4_oa_snk_num matches 10..19 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -4..4 execute if score @s gm4_oa_snk_num matches 20..39 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -8..8 execute if score @s gm4_oa_snk_num matches 20..39 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -8..8 execute if score @s gm4_oa_snk_num matches 40..59 store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -12..12 execute if score @s gm4_oa_snk_num matches 40..59 store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -12..12 execute if score @s gm4_oa_snk_num matches 60.. store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -16..16 execute if score @s gm4_oa_snk_num matches 60.. store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -16..16 function gm4_orb_of_ankou:pneumas/expeditious/get_pos with storage gm4_orb_of_ankou:temp pos data remove storage gm4_orb_of_ankou:temp pos ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/set_ypos.mcfunction ================================================ # @s = player with expeditious pneuma who stopped sneaking # located at a random distance from player # run from pneumas/expeditious/tp_aec # tp if block is safe execute if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision run function gm4_orb_of_ankou:pneumas/expeditious/tp_player # check 1 block down scoreboard players add set_y gm4_pneuma_data 1 execute unless score set_y gm4_pneuma_data matches 11.. positioned ~ ~-1 ~ run function gm4_orb_of_ankou:pneumas/expeditious/set_ypos ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/expeditious/tp_player.mcfunction ================================================ # @s = player with expeditious pneuma who stopped sneaking # located at a safe block, random distance from player # run from pneumas/expeditious/set_ypos # prevent reroll scoreboard players set set_y gm4_pneuma_data 11 scoreboard players set expeditious_attempt gm4_pneuma_data 12 # move player execute at @s run playsound minecraft:item.chorus_fruit.teleport player @a[distance=..15] ~ ~ ~ 1 1 execute at @s run particle minecraft:explosion ~ ~.3 ~ .3 .4 .3 2 0 tp @s ~ ~ ~ particle minecraft:portal ~ ~.2 ~ 0 -1 0 3 20 # compatibility with other modules function #gm4_orb_of_ankou:pneumas/expeditious/tp_player ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/feigning/apply.mcfunction ================================================ # @s = player with feigning pneuma who has been damaged and has less than 8 health # run from advancement_triggers/player_damaged # apply effects effect give @s invisibility 10 255 true effect give @s resistance 10 255 true effect give @s slowness 10 255 true effect give @s weakness 10 255 true effect give @s regeneration 10 0 false attribute @s minecraft:jump_strength modifier add gm4_orb_of_ankou:prevent_jump -1024 add_multiplied_total scoreboard players set @s gm4_oa_jump_stop 13 # set data of hostile mobs tag @e[type=#gm4_orb_of_ankou:feigning_affected,distance=..50] add gm4_oa_feigning scoreboard players set @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,distance=..50] gm4_oa_feign_t 0 execute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=0}] run attribute @s minecraft:follow_range modifier add minecraft:375cd73a-ea26-4ec8-b2a3-e999cfa3167e -1024 add_value # push nearby mobs away tag @s add gm4_feigning_player execute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=0},distance=..2] run function gm4_orb_of_ankou:pneumas/feigning/move_away tag @a remove gm4_feigning_player # give mobs their follow range back schedule function gm4_orb_of_ankou:pneumas/temp_tick/feigning_revert 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/feigning/move_away.mcfunction ================================================ # @s = mob that is nearby a feigning player # run from pneumas/feigning/apply # get player pos data modify storage gm4_orb_of_ankou:temp Pos set from entity @a[tag=gm4_feigning_player,limit=1] Pos execute store result score $target_x gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[0] execute store result score $target_y gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[1] execute store result score $target_z gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[2] # get vector data modify storage gm4_orb_of_ankou:temp Pos set from entity @s Pos execute store result score $motion_x gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[0] execute store result score $motion_y gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[1] execute store result score $motion_z gm4_pneuma_data run data get storage gm4_orb_of_ankou:temp Pos[2] scoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data scoreboard players operation $motion_y gm4_pneuma_data -= $target_y gm4_pneuma_data scoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data # set motion execute store result entity @s Motion[0] double 1.0 run scoreboard players get $motion_x gm4_pneuma_data execute store result entity @s Motion[1] double 1.0 run scoreboard players get $motion_y gm4_pneuma_data execute store result entity @s Motion[2] double 1.0 run scoreboard players get $motion_z gm4_pneuma_data # clean up scoreboard players reset $motion_x gm4_pneuma_data scoreboard players reset $motion_y gm4_pneuma_data scoreboard players reset $motion_z gm4_pneuma_data scoreboard players reset $target_x gm4_pneuma_data scoreboard players reset $target_y gm4_pneuma_data scoreboard players reset $target_z gm4_pneuma_data ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/check.mcfunction ================================================ # @s = player who took damage by magic # run from pneumas/temp_tick/magic_damaged execute if entity @s[tag=gm4_has_pneuma,tag=!gm4_oa_magic_ignore,tag=gm4_oa_magic_1] run function gm4_orb_of_ankou:pneumas/magic_damaged/magic_1 execute if entity @s[tag=gm4_has_pneuma,tag=!gm4_oa_magic_ignore,tag=!gm4_oa_magic_1,tag=gm4_oa_magic_2] run function gm4_orb_of_ankou:pneumas/magic_damaged/magic_2 tag @s remove gm4_oa_magic_damaged tag @s remove gm4_oa_magic_1 tag @s remove gm4_oa_magic_2 tag @s remove gm4_oa_magic_ignore ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/magic_1.mcfunction ================================================ # @s = player with a pneuma who was damaged by magic of 6 or less health # run from pneumas/magic_damage/check effect give @s[tag=gm4_pneuma_neutralizing] instant_health 1 0 true effect give @s[tag=gm4_pneuma_lifeless] instant_health 1 1 true effect give @s[tag=gm4_pneuma_lifeless] regeneration 1 1 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/magic_damaged/magic_2.mcfunction ================================================ # @s = player with a pneuma who was damaged by magic of more than 6 health # run from pneumas/magic_damage/check effect give @s[tag=gm4_pneuma_neutralizing] instant_health 1 1 true effect give @s[tag=gm4_pneuma_lifeless] instant_health 1 2 true effect give @s[tag=gm4_pneuma_lifeless] regeneration 1 2 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/phasing/check_traversable.mcfunction ================================================ # @s = sneaking player with phasing pneuma #located 2 blocks in front of the player's feet # run from pneumas/sneak/check execute at @s[y_rotation=-45..44,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~ ~1 #gm4:no_collision if block ~ ~ ~2 #gm4:no_collision positioned ~ ~ ~2 run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=45..134,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~-1 ~ ~ #gm4:no_collision if block ~-2 ~ ~ #gm4:no_collision positioned ~-2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=135..224,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~ ~-1 #gm4:no_collision if block ~ ~ ~-2 #gm4:no_collision positioned ~ ~ ~-2 run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=225..314,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~1 ~ ~ #gm4:no_collision if block ~2 ~ ~ #gm4:no_collision positioned ~2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=-45..44,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~1 ~1 #gm4:no_collision if block ~ ~ ~2 #gm4:no_collision positioned ~ ~ ~2 run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=45..134,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~-1 ~1 ~ #gm4:no_collision if block ~-2 ~ ~ #gm4:no_collision positioned ~-2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=135..224,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~ ~1 ~-1 #gm4:no_collision if block ~ ~ ~-2 #gm4:no_collision positioned ~ ~ ~-2 run function gm4_orb_of_ankou:pneumas/phasing/tp execute at @s[y_rotation=225..314,scores={gm4_oa_snk_num=3..},tag=!gm4_oa_phased] unless block ~1 ~1 ~ #gm4:no_collision if block ~2 ~ ~ #gm4:no_collision positioned ~2 ~ ~ run function gm4_orb_of_ankou:pneumas/phasing/tp tag @s remove gm4_oa_phased ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/phasing/tp.mcfunction ================================================ # @s = sneaking player with phasing pneuma that has space to phase # run from pneumas/phasing/check_traversable scoreboard players reset @s gm4_oa_snk_num playsound minecraft:entity.vex.ambient player @a[distance=..6] ~ ~ ~ 1 .7 execute at @s run particle minecraft:poof ~ ~ ~ 0 0 0 0 10 tp @s ~ ~ ~ particle minecraft:poof ~ ~ ~ 0 0 0 0 10 tag @s add gm4_oa_phased ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/retreating.mcfunction ================================================ # @s = player who took damage and has the retreating pneuma # run from advancement_triggers/player_damaged effect give @s speed 3 2 true effect give @s weakness 3 2 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/revert_invulnerable_item.mcfunction ================================================ # @s = invulnerable item after 32 ticks # run from main tag @s remove gm4_oa_invulnerable data merge entity @s {Invulnerable:0b} ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/rushing.mcfunction ================================================ # @s = player with rushing pneuma who stopped sneaking # run from pneumas/sneak/stopped effect give @s[scores={gm4_oa_snk_num=10..19}] speed 10 0 true effect give @s[scores={gm4_oa_snk_num=20..39}] speed 20 0 true effect give @s[scores={gm4_oa_snk_num=40..59}] speed 10 2 true effect give @s[scores={gm4_oa_snk_num=60..}] speed 20 2 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom.mcfunction ================================================ # @s = entity hit by sonic boom # run from pneumas/shrieking/find_target scoreboard players set $target_found gm4_pneuma_data 1 execute if entity @s[type=player,gamemode=!creative,gamemode=!spectator] run function gm4_orb_of_ankou:pneumas/shrieking/boom_player execute unless entity @s[type=player] run function gm4_orb_of_ankou:pneumas/shrieking/boom_mob ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom_mob.mcfunction ================================================ # @s = mob hit by sonic boom # run from pneumas/shrieking/boom # apply new health execute store result score $health gm4_pneuma_data run data get entity @s Health 100 scoreboard players remove $health gm4_pneuma_data 1200 execute if score $health gm4_pneuma_data matches 1.. run execute store result entity @s Health float .01 run scoreboard players get $health gm4_pneuma_data execute if score $health gm4_pneuma_data matches ..0 run kill @s # knockback mob ## get player pos data modify storage gm4_oa_shrieking:temp Pos set from entity @a[tag=gm4_oa_shrieker,limit=1] Pos execute store result score $target_x gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[0] execute store result score $target_z gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[2] ## get vector data modify storage gm4_oa_shrieking:temp Pos set from entity @s Pos execute store result score $motion_x gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[0] execute store result score $motion_z gm4_pneuma_data run data get storage gm4_oa_shrieking:temp Pos[2] scoreboard players operation $motion_x gm4_pneuma_data -= $target_x gm4_pneuma_data scoreboard players operation $motion_z gm4_pneuma_data -= $target_z gm4_pneuma_data ## set motion execute store result entity @s Motion[0] double 0.2 run scoreboard players get $motion_x gm4_pneuma_data execute store result entity @s Motion[2] double 0.2 run scoreboard players get $motion_z gm4_pneuma_data data modify entity @s Motion[1] set value 0.35d ## clean up data remove storage gm4_oa_shrieking:temp Pos # visuals effect give @s resistance 1 4 true effect give @s[type=#minecraft:undead] instant_health effect give @s[type=!#minecraft:undead] instant_damage ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/boom_player.mcfunction ================================================ # @s = (survival/adventure) player hit by sonic boom # run from pneumas/shrieking/boom tag @s add gm4_oa_magic_ignore tag @s add gm4_oa_magic_damaged schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t execute store result score $player_health gm4_pneuma_data run data get entity @s Health 100 execute if score $player_health gm4_pneuma_data matches ..1200 run function gm4_orb_of_ankou:pneumas/shrieking/player_death effect give @s instant_damage 1 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/find_target.mcfunction ================================================ # @s = sonic_boomer marker # run from tick particle minecraft:sonic_boom ~ ~ ~ 0 0 0 1 1 scoreboard players set $target_found gm4_pneuma_data 0 execute positioned ~-0.5 ~-0.5 ~-0.5 as @e[type=!#gm4:non_living,tag=!gm4_oa_shrieker,dx=0.5,dy=0.5,dz=0.5] run function gm4_orb_of_ankou:pneumas/shrieking/boom scoreboard players add $ray gm4_pneuma_data 1 execute unless score $ray gm4_pneuma_data matches 15.. unless score $target_found gm4_pneuma_data matches 1.. positioned ^ ^ ^1 run function gm4_orb_of_ankou:pneumas/shrieking/find_target ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/player_death.mcfunction ================================================ # @s = player who died from a sonic boom # run from pneumas/shrieking/boom_player execute store result score $show_death_messages gm4_pneuma_data run gamerule show_death_messages gamerule show_death_messages false tellraw @a {"translate":"death.attack.sonic_boom","with":[{"selector":"@s"}]} kill @s execute if score $show_death_messages gm4_pneuma_data matches 1 run gamerule show_death_messages true scoreboard players reset $show_death_messages gm4_pneuma_data ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/shrieking/release.mcfunction ================================================ # @s = player with shrieking pneuma who stopped sneaking after 60 ticks # run from pneumas/sneak/stopped tag @s add gm4_oa_shrieker execute anchored eyes run function gm4_orb_of_ankou:pneumas/shrieking/find_target tag @s remove gm4_oa_shrieker playsound minecraft:entity.warden.sonic_boom player @a[distance=..16] ~ ~ ~ 1.3 scoreboard players reset $target_found gm4_pneuma_data scoreboard players reset $ray gm4_pneuma_data ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/check.mcfunction ================================================ # @s = sneaking player with pneuma # run from tick tag @s add gm4_oa_sneaking scoreboard players add @s gm4_oa_snk_num 1 execute as @s[tag=gm4_sneak_pneuma] at @s run function gm4_orb_of_ankou:pneumas/sneak/sound execute if score @s[tag=gm4_pneuma_shrieking] gm4_oa_snk_num matches 40 at @s run playsound minecraft:entity.warden.sonic_charge player @a[distance=..16] ~ ~ ~ 1.3 effect give @s[tag=gm4_pneuma_vanishing] invisibility 90 0 true execute at @s[tag=gm4_pneuma_blinding] run effect give @a[distance=..6,tag=!gm4_pneuma_blinding] blindness 7 1 false effect give @s[tag=gm4_pneuma_feathery] slow_falling 1 0 true execute at @s[tag=gm4_pneuma_scaling] anchored eyes positioned ^ ^ ^1 align xyz unless block ~ ~ ~ #gm4:no_collision run effect give @s levitation 1 0 true execute if entity @s[tag=gm4_pneuma_phasing] run function gm4_orb_of_ankou:pneumas/phasing/check_traversable execute if entity @s[tag=gm4_pneuma_sniffing] at @s if block ~ ~-1 ~ #minecraft:sniffer_diggable_block run function gm4_orb_of_ankou:pneumas/sniffing execute if entity @s[tag=gm4_pneuma_soaring,tag=!gm4_oa_soaring_toggled] run function gm4_orb_of_ankou:pneumas/soaring/toggle ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/sound.mcfunction ================================================ # @s = sneaking player with pneuma sneak ability # run from pneumas/sneak/check playsound minecraft:block.note_block.cow_bell player @s[scores={gm4_oa_snk_num=10}] ~ ~ ~ 0.7 0.3 playsound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=20}] ~ ~ ~ 0.9 0.6 playsound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=40}] ~ ~ ~ 1.1 0.8 playsound minecraft:block.note_block.cow_bell player @a[scores={gm4_oa_snk_num=60}] ~ ~ ~ 1.3 1.2 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sneak/stopped.mcfunction ================================================ # @s = sneaking player with pneuma that stopped sneaking # run from player execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_bounding] run function gm4_orb_of_ankou:pneumas/bounding execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_rushing] run function gm4_orb_of_ankou:pneumas/rushing execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_conjuring] at @s run function gm4_orb_of_ankou:pneumas/conjuring/prepare execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_draining] at @s run function gm4_orb_of_ankou:pneumas/draining/search execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_expeditious] at @s run function gm4_orb_of_ankou:pneumas/expeditious/attempt execute if score @s gm4_oa_snk_num matches 60.. as @s[tag=gm4_pneuma_shrieking] at @s run function gm4_orb_of_ankou:pneumas/shrieking/release execute if score @s gm4_oa_snk_num matches 10.. as @s[tag=gm4_pneuma_dashing] at @s run function gm4_orb_of_ankou:pneumas/dashing/prepare scoreboard players set @s[scores={gm4_oa_sniff=..-1}] gm4_oa_sniff 0 tag @s remove gm4_oa_sneaking tag @s remove gm4_oa_soaring_toggled scoreboard players reset @s gm4_oa_snk_num tag @s remove gm4_oa_phased ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/sniffing.mcfunction ================================================ # @s = player with sniffing pneuma who is sneaking # run from pneumas/sneak/check execute if score @s gm4_oa_sniff matches 1.. run playsound minecraft:entity.sniffer.searching player @a[distance=..8] ~ ~ ~ 0.2 0.8 execute if score @s gm4_oa_sniff matches ..0 run playsound minecraft:entity.sniffer.searching player @a[distance=..8] ~ ~ ~ 0.4 1.4 execute if score @s gm4_oa_sniff matches ..-90 run playsound minecraft:entity.sniffer.scenting player @a[distance=..8] ~ ~ ~ 0.8 0.6 execute if score @s gm4_oa_sniff matches ..-100 if predicate gm4_orb_of_ankou:sniff_chance run scoreboard players set @s gm4_oa_sniff 601 execute if score @s gm4_oa_sniff matches 601 run loot spawn ~ ~ ~ loot minecraft:gameplay/sniffer_digging execute if score @s gm4_oa_sniff matches 601 run playsound minecraft:block.grass.break player @a[distance=..8] ~ ~ ~ 0.8 1.4 scoreboard players remove @s[scores={gm4_oa_sniff=601}] gm4_oa_sniff 1 execute unless score @s gm4_oa_sniff matches 1.. run scoreboard players remove @s gm4_oa_sniff 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/apply.mcfunction ================================================ # @s = player with soaring pneuma activated # run from main execute if entity @s[tag=!gm4_oa_soaring_idle] run function gm4_orb_of_ankou:pneumas/soaring/idle execute if entity @s[x_rotation=-90..-80] run function gm4_orb_of_ankou:pneumas/soaring/ascend execute if entity @s[x_rotation=80..90] run function gm4_orb_of_ankou:pneumas/soaring/descend effect give @s slow_falling 3 0 true tag @s add gm4_oa_soaring_off_ground particle minecraft:firework ~ ~ ~ .15 -.2 .15 0 5 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/ascend.mcfunction ================================================ # @s = player with soaring pneuma looking up # run from pneumas/soaring/apply tag @s remove gm4_oa_soaring_idle effect give @s levitation 2 3 true ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/descend.mcfunction ================================================ # @s = player with soaring pneuma looking down # run from pneumas/soaring/apply tag @s remove gm4_oa_soaring_idle attribute @s minecraft:gravity modifier remove gm4_orb_of_ankou:soaring_gravity ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/idle.mcfunction ================================================ # @s = player with soaring pneuma looking straight # run from pneumas/soaring/apply effect clear @s levitation tp @s attribute @s minecraft:gravity modifier add gm4_orb_of_ankou:soaring_gravity -0.08 add_value tag @s add gm4_oa_soaring_idle ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/remove_fall_protection.mcfunction ================================================ # @s = player that was previously soaring, and has landed # run from main tag @s remove gm4_oa_soaring_off_ground attribute @s minecraft:fall_damage_multiplier modifier remove gm4_orb_of_ankou:soaring_fall_protection ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/soaring/toggle.mcfunction ================================================ # @s = player with soaring pneuma that sneaked # run from pneumas/sneak/check tag @s[tag=gm4_oa_soaring_active] add gm4_oa_no_soaring tag @s remove gm4_oa_soaring_active tag @s[tag=!gm4_oa_no_soaring] add gm4_oa_soaring_active tag @s remove gm4_oa_no_soaring playsound minecraft:entity.ender_dragon.flap player @s[tag=gm4_oa_soaring_active] ~ ~ ~ 0.4 1.6 playsound minecraft:entity.player.small_fall player @s[tag=!gm4_oa_soaring_active] ~ ~ ~ 0.4 1.6 attribute @s[tag=gm4_oa_soaring_active] minecraft:fall_damage_multiplier modifier add gm4_orb_of_ankou:soaring_fall_protection -1024 add_value attribute @s[tag=!gm4_oa_soaring_active] minecraft:gravity modifier remove gm4_orb_of_ankou:soaring_gravity tag @s add gm4_oa_soaring_toggled ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/striding.mcfunction ================================================ # @s = player with striding pneuma who is above lava # run from pneumas/temp_tick/striding execute align xyz run summon marker ~0.5 ~-1 ~0.5 {Tags:["gm4_oa_striding_block"]} setblock ~ ~-1 ~ magma_block schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding_revert 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/synergetic/apply.mcfunction ================================================ # @s = players with synergetic pneuma # run from main # check if nearby wolves are owned by the player execute as @e[type=wolf,tag=!smithed.entity,distance=..4] if data entity @s Owner run function gm4_orb_of_ankou:pneumas/synergetic/check_wolf effect give @e[type=wolf,distance=..4,scores={gm4_pneuma_data=0}] strength 5 0 scoreboard players reset @e[type=wolf,distance=..4] gm4_pneuma_data # apply strength to other synergetic players effect give @a[gamemode=!spectator,distance=0.1..8,tag=gm4_pneuma_synergetic] strength 5 0 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/synergetic/check_wolf.mcfunction ================================================ # @s = wolves near a player with synergetic pneuma # located at the player with synergetic pneuma # run from pneumas/synergetic/apply data modify storage gm4_orb_of_ankou:synergetic Owner set from entity @s Owner execute store success score @s gm4_pneuma_data run data modify storage gm4_orb_of_ankou:synergetic Owner set from entity @p[distance=..0.1,tag=gm4_pneuma_synergetic] UUID ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/debilitate.mcfunction ================================================ # @s = none # run from update_tags/check_pneuma execute unless entity @a[tag=gm4_pneuma_debilitate,limit=1] run return 0 execute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,scores={gm4_oa_bow_debilitate=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t execute as @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,scores={gm4_oa_bow_debilitate=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow data merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {"minecraft:potion_contents": {custom_effects: [{duration: 600, show_icon: 1b, id: "minecraft:weakness"}]}}}} tag @e[type=arrow] remove gm4_oa_arrow scoreboard players reset @a gm4_oa_bow_debilitate schedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/feigning_revert.mcfunction ================================================ # @s = none # run from pneumas/feigning scoreboard players add @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning] gm4_oa_feign_t 1 execute as @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,scores={gm4_oa_feign_t=2..}] run attribute @s minecraft:follow_range modifier remove minecraft:375cd73a-ea26-4ec8-b2a3-e999cfa3167e tag @e[type=#gm4_orb_of_ankou:feigning_affected,scores={gm4_oa_feign_t=2..}] remove gm4_oa_feigning scoreboard players reset @e[type=#gm4_orb_of_ankou:feigning_affected,scores={gm4_oa_feign_t=2..}] gm4_oa_feign_t execute if entity @e[type=#gm4_orb_of_ankou:feigning_affected,tag=gm4_oa_feigning,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/feigning_revert 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/freezing.mcfunction ================================================ # @s = none # run from update_tags/check_pneuma execute unless entity @a[tag=gm4_pneuma_freezing,limit=1] run return 0 execute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_freezing,scores={gm4_oa_bow_freezing=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t execute as @a[gamemode=!spectator,tag=gm4_pneuma_freezing,scores={gm4_oa_bow_freezing=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow data merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {"minecraft:potion_contents": {custom_effects: [{duration: 600, show_icon: 1b, id: "minecraft:slowness"}]}}}} tag @e[type=arrow] remove gm4_oa_arrow scoreboard players reset @a gm4_oa_bow_freezing schedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/hawkeye.mcfunction ================================================ # @s = none # run from update_tags/check_pneuma execute unless entity @a[tag=gm4_pneuma_hawkeye,limit=1] run return 0 execute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,scores={gm4_oa_bow_hawkeye=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t execute as @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,scores={gm4_oa_bow_hawkeye=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow execute as @e[type=arrow,tag=gm4_oa_arrow,limit=1] store result entity @s damage byte 2 run data get entity @s damage data merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {PierceLevel:1b} tag @e[type=arrow] remove gm4_oa_arrow scoreboard players reset @a gm4_oa_bow_hawkeye schedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/magic_damaged.mcfunction ================================================ # @s = none # run from pneumas/advancement_triggers/magic_damaged_1 and pneumas/advancement_triggers/magic_damaged_2 and pneumas/advancement_triggers/magic_ignore execute as @a[gamemode=!spectator,tag=gm4_oa_magic_damaged] run function gm4_orb_of_ankou:pneumas/magic_damaged/check execute if entity @a[tag=gm4_oa_magic_damaged,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/magic_damaged 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/striding.mcfunction ================================================ # @s = none # run from update_tags/check_pneuma execute as @a[gamemode=!spectator,tag=gm4_pneuma_striding] at @s if block ~ ~-1 ~ lava[level=0] run function gm4_orb_of_ankou:pneumas/striding execute if entity @a[tag=gm4_pneuma_striding,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/striding_revert.mcfunction ================================================ # @s = none # run from pneumas/striding scoreboard players add @e[type=marker,tag=gm4_oa_striding_block] gm4_oa_marker 1 execute at @e[type=marker,tag=gm4_oa_striding_block,scores={gm4_oa_marker=8..}] if block ~ ~ ~ magma_block run setblock ~ ~ ~ lava kill @e[type=marker,tag=gm4_oa_striding_block,scores={gm4_oa_marker=8..}] execute if entity @e[type=marker,tag=gm4_oa_striding_block,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding_revert 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/temp_tick/tranquilizing.mcfunction ================================================ # @s = none # run from update_tags/check_pneuma execute unless entity @a[tag=gm4_pneuma_tranquilizing,limit=1] run return 0 execute unless entity @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,scores={gm4_oa_bow_tranquilizing=1..},limit=1] run return run schedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t execute as @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,scores={gm4_oa_bow_tranquilizing=1..}] at @s anchored eyes positioned ^ ^ ^2 run tag @e[type=arrow,distance=..2.5,limit=1] add gm4_oa_arrow data merge entity @e[type=arrow,tag=gm4_oa_arrow,limit=1] {item: {components: {"minecraft:potion_contents": {custom_effects: [{duration: 100, show_icon: 1b, id: "minecraft:poison"}]}}}} tag @e[type=arrow] remove gm4_oa_arrow scoreboard players reset @a gm4_oa_bow_tranquilizing schedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/pneumas/volatile.mcfunction ================================================ # @s = player with volatile pneuma who has been damaged # run from advancement_triggers/player_damaged execute store result score @s gm4_pneuma_data run data get entity @s Health tag @e[type=item,distance=..5,nbt=!{Invulnerable:1b}] add gm4_oa_invulnerable execute as @e[type=item,distance=..5,tag=gm4_oa_invulnerable] run data merge entity @s {Invulnerable:1b} execute unless entity @a[gamemode=!spectator,distance=..6,predicate=gm4_metallurgy:defuse_active] if score @s[gamemode=!adventure] gm4_pneuma_data matches ..3 run summon creeper ~ ~ ~ {ExplosionRadius:1b,ignited:1b,Fuse:0s,CustomName:"Volatile Player"} ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/create.mcfunction ================================================ # @s = player who used a flint and steel in the nether # located at fire block that player is looking at # run from soul_forge/used_flint_and_steel summon armor_stand ~ ~ ~ {CustomName:"gm4_soul_forge",Tags:["gm4_no_edit","gm4_soul_forge"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,DisabledSlots:2039552,Pose:{Head:[200.0f,0.0f,0.0f]}} playsound minecraft:entity.player.breath block @a[distance=..12] ~ ~0.5 ~ 1 0.5 particle minecraft:campfire_signal_smoke ~ ~0.7 ~ 0 2 0 0.05 10 force particle minecraft:soul ~ ~0.7 ~ 0 2 0 0.05 10 force advancement grant @s only gm4:create_soul_forge ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/destroy.mcfunction ================================================ # @s = soul forge without fire # run from main # store armor items into storage data modify storage gm4_orb_of_ankou:temp equipment set from entity @s equipment # create a soul shard if valid ingredient count execute if score @s gm4_oa_essence matches 13.. if score @s gm4_oa_powder >= required gm4_oa_powder if score @s gm4_oa_glowstone >= required gm4_oa_glowstone run function gm4_orb_of_ankou:soul_forge/outputs/create_shard # fuse soul shard into orb if valid ingredient count execute if entity @s[tag=gm4_oa_has_orb,tag=gm4_oa_has_shard] if score @s gm4_oa_tears >= required gm4_oa_tears if score @s gm4_oa_roses >= required gm4_oa_roses run function gm4_orb_of_ankou:soul_forge/outputs/check_fuse # summon entities for extra ingredients execute if score @s gm4_oa_powder matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_powder_sprite execute if score @s gm4_oa_glowstone matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_glowstone_sprite execute if score @s gm4_oa_tears matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_wandering_tear execute if score @s gm4_oa_roses matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/withering_magic kill @e[type=marker,tag=gm4_oa_wither_rose_catcher,distance=..10] # summon endermites for extra essences stored inside the soul forge execute if score @s gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_essence # if orb and shard weren't fused, summon entities for those extras execute if entity @s[tag=gm4_oa_has_orb] run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_orb execute if entity @s[tag=gm4_oa_has_shard] run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_shard #visuals playsound minecraft:block.fire.extinguish block @a[distance=..12] ~ ~ ~ .5 .3 particle minecraft:cloud ~ ~0.5 ~ 0.3 0.3 0.3 0 20 data remove storage gm4_orb_of_ankou:temp equipment kill @s ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/fire_sprite.mcfunction ================================================ # @s = soul forge to spawn an fire sprite zombie # run from both soul_forge/entities/summon_powder_sprite and soul_forge/entities/summon_glowstone_sprite # spawn zombie summon minecraft:zombie ~ ~0.2 ~ {Fire:1000000,Motion:[0.0,0.6,0.0],Silent:1b,CustomNameVisible:0b,DeathLootTable:"gm4:empty",Health:10.0f,IsBaby:1b,CanBreakDoors:0b,CanPickUpLoot:0b,Tags:["gm4_oa_unset","gm4_oa_ignore","gm4_oa_fire_sprite"],CustomName:{"translate":"entity.gm4.fire_sprite","fallback":"Fire Sprite§"},Team:"gm4_hide_name",equipment:{head:{id:"minecraft:golden_helmet",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_orb_of_ankou:entity/fire_sprite"]},"minecraft:enchantment_glint_override":true}}},drop_chances:{head:0F},active_effects:[{id:"minecraft:invisibility",amplifier:0b,duration:1000000,show_particles:0b}],attributes:[{id:"minecraft:follow_range",base:8},{id:"minecraft:attack_damage",base:1},{id:"minecraft:attack_knockback",base:0},{id:"minecraft:spawn_reinforcements",base:0}]} # randomize motion in x and z execute as @e[type=zombie,tag=gm4_oa_unset,limit=1] run function gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion # visuals playsound minecraft:entity.blaze.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/congealed_shard.mcfunction ================================================ # @s = new congealed shard bat # run from soul_forge/entities/summon_congealed_shard # and from soul_forge/entities/summon_extra_shard $loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/soul_shard/$(id) data merge entity @s {CustomName:{"translate":"entity.gm4.congealed_shard","fallback":"Congealed Soul Shard§"},CustomNameVisible:0b,Team:"gm4_hide_name",Health:2.0f,DeathLootTable:"gm4:empty",PersistenceRequired:1b,Tags:["gm4_oa_congealed_shard","gm4_oa_ignore","gm4_defused_bat"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:'minecraft:fire_resistance',amplifier:0b,duration:1000000,show_particles:0b}]} function gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/get_orb_pneuma.mcfunction ================================================ # @s = new living orb silverfish # run from soul_forge/entities/set_data/loop_orb_pneumas # get shard data from loot table $loot replace entity @s weapon.offhand loot gm4_orb_of_ankou:items/soul_shard/$(id) data modify storage gm4_orb_of_ankou:temp shard set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air # set data of soul shard into orb of ankou data modify storage gm4_orb_of_ankou:temp new_orb.components."minecraft:lore" append from storage gm4_orb_of_ankou:temp shard.components."minecraft:lore"[] data modify storage gm4_orb_of_ankou:temp new_orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas append from storage gm4_orb_of_ankou:temp shard.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[] data modify storage gm4_orb_of_ankou:temp new_orb.components."minecraft:enchantments" merge from storage gm4_orb_of_ankou:temp shard.components."minecraft:enchantments" data modify storage gm4_orb_of_ankou:temp new_orb.components."minecraft:attribute_modifiers" append from storage gm4_orb_of_ankou:temp shard.components."minecraft:attribute_modifiers"[] data remove storage gm4_orb_of_ankou:temp new_orb.components."minecraft:attribute_modifiers"[{id:"gm4_orb_of_ankou:attack_damage"}] ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/living_orb.mcfunction ================================================ # @s = new living orb silverfish # run from soul_forge/entities/summon_extra_orb # and from soul_forge/entities/summon_living_orb # set default data data merge entity @s {CustomName:{"translate":"entity.gm4.living_orb","fallback":"Living Orb§"},CustomNameVisible:0b,Team:"gm4_hide_name",Health:2.0f,DeathLootTable:"gm4:empty",PersistenceRequired:1b,Tags:["gm4_oa_unset","gm4_oa_living_orb","gm4_oa_ignore"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:"minecraft:fire_resistance",amplifier:0b,duration:1000000,show_particles:0b}]} # get pneuma count, return early if empty execute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp current_orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas execute if score pneuma_count gm4_oa_forge matches 0 run return run loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/orb_of_ankou # set up new orb loot replace entity @s weapon.offhand loot gm4_orb_of_ankou:items/orb_of_ankou data modify storage gm4_orb_of_ankou:temp new_orb set from entity @s equipment.offhand item replace entity @s weapon.offhand with minecraft:air data merge storage gm4_orb_of_ankou:temp {new_orb:{components:{"minecraft:lore":[{"translate":"text.gm4.orb_of_ankou.pneumas","fallback":"Pneumas:","italic":false,"color":"light_purple"}],"minecraft:firework_explosion":{shape:"small_ball",colors:[I;]}}}} # get pneuma data from shard loot tables execute store result score restore_pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp current_orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas function gm4_orb_of_ankou:soul_forge/entities/set_data/loop_orb_pneumas data modify entity @s equipment.mainhand set from storage gm4_orb_of_ankou:temp new_orb # clean up data remove storage gm4_orb_of_ankou:temp new_orb data remove storage gm4_orb_of_ankou:temp current_orb ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/loop_orb_pneumas.mcfunction ================================================ # @s = new living orb silverfish # run from soul_forge/entities/set_data/living_orb # get next pneuma function gm4_orb_of_ankou:soul_forge/entities/set_data/get_orb_pneuma with storage gm4_orb_of_ankou:temp current_orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[0] data remove storage gm4_orb_of_ankou:temp current_orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[0] scoreboard players remove restore_pneuma_count gm4_oa_forge 1 execute if score restore_pneuma_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/set_data/loop_orb_pneumas ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/randomize_motion.mcfunction ================================================ # @s = newly spawned entity # run from soul_forge/entities/severed_soul, soul_forge_entities/fire_sprite, soul_forge/entities/congealed_shard, soul_forge/entites/living_orb, and soul_forge/outputs/fuse_pneuma # modify motion execute store result entity @s Motion[0] double 0.01 run random value -25..25 execute store result entity @s Motion[2] double 0.01 run random value -25..25 # mark as modified tag @s remove gm4_oa_unset ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/set_data/severed_soul.mcfunction ================================================ # @s = new severed soul endermite # run from soul_forge/entities/summon_extra_essence # and from soul_forge/entities/summon_failed_essence $loot replace entity @s weapon.mainhand loot gm4_orb_of_ankou:items/soul_essence/$(id) data merge entity @s {CustomName:{"translate":"entity.gm4.severed_soul","fallback":"Severed Soul§"},CustomNameVisible:0b,Team:"gm4_hide_name",Health:2.0f,DeathLootTable:"gm4:empty",PersistenceRequired:1b,Tags:["gm4_oa_unset","gm4_oa_severed_soul","gm4_oa_ignore"],drop_chances:{mainhand:2.0f,offhand:1.0f},Motion:[0.0,0.6,0.0],active_effects:[{id:"minecraft:fire_resistance",amplifier:0b,duration:1000000,show_particles:0b}]} function gm4_orb_of_ankou:soul_forge/entities/set_data/randomize_motion ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_congealed_shard.mcfunction ================================================ # @s = soul shard item in a soul forge that already has an shard # run from both soul_forge/recipes/check_shard and soul_forge/recipes/add_shard # spawn bat execute positioned ~ ~0.2 ~ summon bat run function gm4_orb_of_ankou:soul_forge/entities/set_data/congealed_shard with storage gm4_orb_of_ankou:temp Item.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[-1] # visuals playsound minecraft:entity.bat.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1 # loop scoreboard players remove shard_count gm4_oa_forge 1 execute if score shard_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_essence.mcfunction ================================================ # @s = soul forge without fire with extra essence in storage # run from soul_forge/destroy # summon endermite execute positioned ~ ~0.2 ~ summon endermite run function gm4_orb_of_ankou:soul_forge/entities/set_data/severed_soul with storage gm4_orb_of_ankou:temp equipment.legs.components."minecraft:custom_data".gm4_orb_of_ankou.stored_pneuma # visuals playsound minecraft:entity.endermite.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1 # loop scoreboard players remove @s gm4_oa_essence 1 execute if score @s gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_extra_essence ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_orb.mcfunction ================================================ # @s = soul forge without fire with extra orb in storage # run from soul_forge/destroy # spawn silverfish data modify storage gm4_orb_of_ankou:temp current_orb set from storage gm4_orb_of_ankou:temp equipment.head execute positioned ~ ~0.2 ~ summon silverfish run function gm4_orb_of_ankou:soul_forge/entities/set_data/living_orb # visuals playsound minecraft:entity.silverfish.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_extra_shard.mcfunction ================================================ # @s = soul forge without fire with extra shard in storage # run from soul_forge/destroy # spawn bat execute positioned ~ ~0.2 ~ summon bat run function gm4_orb_of_ankou:soul_forge/entities/set_data/congealed_shard with storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[-1] # visuals playsound minecraft:entity.bat.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_failed_essence.mcfunction ================================================ # @s = soul forge without fire # run from soul_forge/destroy # summon endermite execute positioned ~ ~0.2 ~ summon endermite run function gm4_orb_of_ankou:soul_forge/entities/set_data/severed_soul with storage gm4_orb_of_ankou:temp equipment.feet.components."minecraft:custom_data".gm4_orb_of_ankou.stored_pneuma # loop scoreboard players remove failed_count gm4_oa_essence 1 execute if score failed_count gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_failed_essence ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_glowstone_sprite.mcfunction ================================================ # @s = soul forge without fire with extra glowstone dust in storage # run from soul_forge/destroy # summon zombie function gm4_orb_of_ankou:soul_forge/entities/fire_sprite # loop scoreboard players remove @s gm4_oa_glowstone 1 execute if score @s gm4_oa_glowstone matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_glowstone_sprite ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_living_orb.mcfunction ================================================ # @s = orb of ankou item in a soul forge that already has an orb # run from both soul_forge/recipes/check_orb and soul_forge/recipes/add_orb # spawn silverfish data modify storage gm4_orb_of_ankou:temp current_orb set from storage gm4_orb_of_ankou:temp Item execute positioned ~ ~0.2 ~ summon silverfish run function gm4_orb_of_ankou:soul_forge/entities/set_data/living_orb # visuals playsound minecraft:entity.silverfish.hurt hostile @a[distance=..12] ~ ~ ~ 0.7 1 # loop scoreboard players remove orb_count gm4_oa_forge 1 execute if score orb_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_powder_sprite.mcfunction ================================================ # @s = soul forge without fire with extra blaze powder in storage # run from soul_forge/destroy # summon zombie function gm4_orb_of_ankou:soul_forge/entities/fire_sprite # loop scoreboard players remove @s gm4_oa_powder 1 execute if score @s gm4_oa_powder matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_powder_sprite ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/summon_wandering_tear.mcfunction ================================================ # @s = soul forge without fire with extra ghast tears in storage # run from soul_forge/destroy # spawn vex summon minecraft:vex ~ ~0.2 ~ {Silent:1b,Glowing:1b,CustomNameVisible:0b,life_ticks:1200,DeathLootTable:"gm4:empty",Tags:["gm4_oa_ignore","gm4_oa_wandering_tear"],CustomName:{"translate":"entity.gm4.wandering_tear","fallback":"Wandering Tear§"},Team:"gm4_hide_name",active_effects:[{id:"minecraft:invisibility",amplifier:0b,duration:1000000,show_particles:0b}],attributes:[{id:"minecraft:follow_range",base:48},{id:"minecraft:attack_damage",base:3}]} # visuals playsound minecraft:entity.vex.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2 # loop scoreboard players remove @s gm4_oa_tears 1 execute if score @s gm4_oa_tears matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_wandering_tear ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/entities/withering_magic.mcfunction ================================================ # @s = soul forge to spawn a withering magic cloud # run from both soul_forge/destroy # spawn area_effect_cloud summon minecraft:area_effect_cloud ~ ~0.8 ~ {ReapplicationDelay:200,Radius:4f,RadiusPerTick:-0.001f,Duration:1800,potion_contents:{custom_effects:[{id:"minecraft:wither",amplifier:1b,duration:300}]},CustomName:{"translate":"entity.gm4.withering_magic","fallback":"Withering Magic"}} # visuals playsound minecraft:entity.wither.hurt hostile @a[distance=..12] ~ ~ ~ 0.6 1.2 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/check_fuse.mcfunction ================================================ # @s = soul forge without fire, that has an orb and shard # run from soul_forge/destroy # put orb into storage to compare pneumas data modify storage gm4_orb_of_ankou:temp Orb set from storage gm4_orb_of_ankou:temp equipment.head # count the number of pneumas stored on the orb already execute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas # check if the pneuma is present already in the array scoreboard players set valid_shard gm4_oa_forge 1 execute if score pneuma_count gm4_oa_forge matches 1.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[0] set from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[] execute if score valid_shard gm4_oa_forge matches 1 if score pneuma_count gm4_oa_forge matches 2.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[1] set from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[] execute if score valid_shard gm4_oa_forge matches 1 if score pneuma_count gm4_oa_forge matches 3.. store success score valid_shard gm4_oa_forge run data modify storage gm4_orb_of_ankou:temp Orb.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[2] set from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[] # if all the checks pass, fuse the shard with the orb execute if score valid_shard gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/outputs/fuse_pneuma data remove storage gm4_orb_of_ankou:temp Orb ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/create_shard.mcfunction ================================================ # @s = soul forge without fire, that has enough soul essences # run from soul_forge/destroy # spawn bat execute summon bat run function gm4_orb_of_ankou:soul_forge/outputs/set_shard_loot with storage gm4_orb_of_ankou:temp equipment.legs.components."minecraft:custom_data".gm4_orb_of_ankou.stored_pneuma # loop if extra sets of 13 scoreboard players remove @s gm4_oa_essence 13 scoreboard players operation @s gm4_oa_powder -= required gm4_oa_powder scoreboard players operation @s gm4_oa_glowstone -= required gm4_oa_glowstone execute if score @s gm4_oa_essence matches 13.. if score @s gm4_oa_powder >= required gm4_oa_powder if score @s gm4_oa_glowstone >= required gm4_oa_glowstone run function gm4_orb_of_ankou:soul_forge/outputs/create_shard ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/fuse_pneuma.mcfunction ================================================ # @s = soul forge without fire, that has an orb and shard, unless the orb already has the pneuma # run from soul_forge/outputs/check_fuse # summon item summon item ~ ~0.2 ~ {PickupDelay:40s,Glowing:1b,Item:{id:"minecraft:firework_star",count:1},Tags:["gm4_oa_unset"],Motion:[0.0,0.4,0.0]} # restore data of stored orb data modify storage gm4_orb_of_ankou:temp Item set from storage gm4_orb_of_ankou:temp equipment.head # set data of soul shard into orb of ankou data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:lore"[0] set value {"translate":"text.gm4.orb_of_ankou.pneumas","fallback":"Pneumas:","italic":false,"color":"light_purple"} data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:lore" append from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:lore"[] data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas append from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas[] data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:enchantments" merge from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:enchantments" data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:attribute_modifiers" append from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:attribute_modifiers"[] data remove storage gm4_orb_of_ankou:temp Item.components."minecraft:attribute_modifiers"[{id:"gm4_orb_of_ankou:attack_damage"}] #custom color execute if score pneuma_count gm4_oa_forge matches 0 run data merge storage gm4_orb_of_ankou:temp {Item:{components:{"minecraft:firework_explosion":{shape:"small_ball",colors:[I;]}}}} data modify storage gm4_orb_of_ankou:temp Item.components."minecraft:firework_explosion".colors append from storage gm4_orb_of_ankou:temp equipment.chest.components."minecraft:custom_data".gm4_orb_of_ankou.stored_color[] data modify entity @e[type=item,tag=gm4_oa_unset,limit=1] Item set from storage gm4_orb_of_ankou:temp Item data remove storage gm4_orb_of_ankou:temp Item # play sound and particle playsound minecraft:entity.evoker.prepare_summon block @a[distance=..12] ~ ~ ~ 0.6 1.2 particle minecraft:explosion ~ ~0.8 ~ 0 0 0 0 0 # clear required ghast tears and wither roses scoreboard players operation @s gm4_oa_tears -= required gm4_oa_tears scoreboard players operation @s gm4_oa_roses -= required gm4_oa_roses tag @s remove gm4_oa_has_orb tag @s remove gm4_oa_has_shard tag @e[type=item] remove gm4_oa_unset # grant advancement execute if score pneuma_count gm4_oa_forge matches 3.. run advancement grant @a[distance=..6] only gm4:max_orb_of_ankou ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/outputs/set_shard_loot.mcfunction ================================================ # @s = new soul shard bat # run from soul_forge/outputs/create_shard $loot replace entity @s armor.head loot gm4_orb_of_ankou:items/soul_shard/$(id) data merge entity @s {CustomName:{"translate":"entity.gm4.possessed_shard","fallback":"Possessed Soul Shard§"},CustomNameVisible:0b,Team:"gm4_hide_name",DeathLootTable:"gm4:empty",PersistenceRequired:1b,Health:2.0f,Tags:["gm4_oa_possessed_soul_shard","gm4_oa_ignore","gm4_defused_bat"],active_effects:[{id:'minecraft:fire_resistance',amplifier:0b,duration:1000000,show_particles:0b}],drop_chances:{head:2F}} ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/process.mcfunction ================================================ # @s = soul forge with multiblock # run from main # ambient particles particle minecraft:soul_fire_flame ~ ~0.5 ~ 0.2 1 0.2 0.01 7 particle minecraft:soul ~ ~0.5 ~ 0.3 1 0.3 0.01 3 # colored smoke for ingredients execute if score @s gm4_oa_powder matches 1.. run particle minecraft:dust{color:[0.459,0.200,0.090],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if score @s gm4_oa_glowstone matches 1.. run particle minecraft:dust{color:[0.459,0.431,0.055],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if score @s gm4_oa_tears matches 1.. run particle minecraft:dust{color:[0.384,0.451,0.459],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if score @s gm4_oa_roses matches 1.. run particle minecraft:dust{color:[0.204,0.165,0.259],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if score @s gm4_oa_essence matches 1.. run particle minecraft:dust{color:[0.180,0.169,0.310],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if entity @s[tag=gm4_oa_has_orb] run particle minecraft:dust{color:[0.725,0.729,0.780],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force execute if entity @s[tag=gm4_oa_has_shard] run particle minecraft:dust{color:[0.271,0.149,0.388],scale:2} ~ ~0.2 ~ 0.1 0.8 0.1 0.03 6 force # wither rose consumption execute if entity @s[tag=gm4_oa_has_orb,tag=gm4_oa_has_shard] run function gm4_orb_of_ankou:soul_forge/wither_roses/steps # wither rose particle line execute as @e[type=marker,tag=gm4_oa_wither_particle] at @s run function gm4_orb_of_ankou:soul_forge/wither_roses/particle ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/ray.mcfunction ================================================ # @s = area effect cloud ray used to detect the fire block # run from soul_forge/used_flint_and_steel scoreboard players set $found gm4_count 0 execute store success score $found gm4_count align xyz positioned ~ ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} # move forward scoreboard players add $ray gm4_count 1 tp @s ^ ^ ^0.01 execute if score $ray gm4_count matches 0..500 at @s unless score $found gm4_count matches 1 run function gm4_orb_of_ankou:soul_forge/ray ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/ray_backup.mcfunction ================================================ # @s = area effect cloud ray used to detect the fire block # run from soul_forge/used_flint_and_steel # check blocks around the marker ray scoreboard players set $found gm4_count 0 execute store success score $found gm4_count align xyz positioned ~ ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~1 ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~-1 ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~1 ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~-1 ~ ~ if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~ ~1 if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} execute if score $found gm4_count matches 0 store success score $found gm4_count align xyz positioned ~ ~ ~-1 if block ~ ~ ~ soul_fire unless entity @e[type=armor_stand,tag=gm4_soul_forge,dx=0,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_ray_loc"]} # move forward scoreboard players remove $ray gm4_count 1 tp @s ^ ^ ^0.01 execute if score $ray gm4_count matches 0..500 at @s unless score $found gm4_count matches 1 run function gm4_orb_of_ankou:soul_forge/ray_backup ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_blaze_powder.mcfunction ================================================ # @s = blaze powder item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add item stack count to scoreboard storage execute store result score add gm4_oa_powder run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_powder += add gm4_oa_powder ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_first_soul_essence.mcfunction ================================================ # @s = soul essence item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_soul_essence data modify storage gm4_orb_of_ankou:temp equipment.feet set from storage gm4_orb_of_ankou:temp Item data modify storage gm4_orb_of_ankou:temp equipment.legs set from storage gm4_orb_of_ankou:temp Item ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_ghast_tear.mcfunction ================================================ # @s = ghast tear item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add item stack count to scoreboard storage execute store result score add gm4_oa_tears run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_tears += add gm4_oa_tears ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_glowstone_dust.mcfunction ================================================ # @s = glowstone dust item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add item stack count to scoreboard storage execute store result score add gm4_oa_glowstone run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_glowstone += add gm4_oa_glowstone ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_orb.mcfunction ================================================ # @s = orb of ankou item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_orb tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add single orb to forge storage data modify storage gm4_orb_of_ankou:temp equipment.head set from storage gm4_orb_of_ankou:temp Item data modify storage gm4_orb_of_ankou:temp equipment.head.count set value 1b tag @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] add gm4_oa_has_orb # convert extra orbs to living orbs execute store result score orb_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players remove orb_count gm4_oa_forge 1 execute if score orb_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_shard.mcfunction ================================================ # @s = shard of ankou item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from both soul_forge/recipes/check_shard tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add single shard to forge storage data modify storage gm4_orb_of_ankou:temp equipment.chest set from storage gm4_orb_of_ankou:temp Item data modify storage gm4_orb_of_ankou:temp equipment.chest.count set value 1b tag @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] add gm4_oa_has_shard # convert extra shards to congealed shards execute store result score shard_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players remove shard_count gm4_oa_forge 1 execute if score shard_count gm4_oa_forge matches 1.. run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/add_soul_essence.mcfunction ================================================ # @s = soul essence item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from both soul_forge/recipes/add_first_soul_essence # and soul_forge/recipes/check_soul_essence tag @s add gm4_oa_checked_item playsound minecraft:entity.blaze.ambient block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 0.6 particle minecraft:cloud ~0.5 ~1.5 ~0.5 0.2 1 0.2 0.01 5 # add item stack count to scoreboard storage execute store result score add gm4_oa_essence run data get storage gm4_orb_of_ankou:temp Item.count scoreboard players operation @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_essence += add gm4_oa_essence ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_item.mcfunction ================================================ # @s = item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from tick # tag the armor soul forge tag @e[type=armor_stand,tag=gm4_soul_forge,limit=1,sort=nearest,distance=..1] add gm4_oa_selected_forge data modify storage gm4_orb_of_ankou:temp equipment set from entity @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] equipment # if valid item, add it to the scoreboard storage data modify storage gm4_orb_of_ankou:temp Item set from entity @s Item execute if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:blaze_powder"} run function gm4_orb_of_ankou:soul_forge/recipes/add_blaze_powder execute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:glowstone_dust"} run function gm4_orb_of_ankou:soul_forge/recipes/add_glowstone_dust execute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:ghast_tear"} run function gm4_orb_of_ankou:soul_forge/recipes/add_ghast_tear execute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:black_dye",components:{"minecraft:custom_data":{gm4_orb_of_ankou:{item:"soul_essence"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_soul_essence execute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:flint",components:{"minecraft:custom_data":{gm4_orb_of_ankou:{item:"soul_shard"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_shard execute unless entity @s[tag=gm4_oa_checked_item] if data storage gm4_orb_of_ankou:temp Item{id:"minecraft:firework_star",components:{"minecraft:custom_data":{gm4_orb_of_ankou:{item:"orb"}}}} run function gm4_orb_of_ankou:soul_forge/recipes/check_orb # apply data modify to armor stand data modify entity @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] equipment set from storage gm4_orb_of_ankou:temp equipment tag @e[type=armor_stand,tag=gm4_soul_forge] remove gm4_oa_selected_forge data remove storage gm4_orb_of_ankou:temp equipment # play burn sound and kill item execute unless entity @s[tag=gm4_oa_checked_item] run playsound minecraft:entity.generic.burn block @a[distance=..12] ~0.5 ~0.5 ~0.5 0.2 1.5 kill @s data remove storage gm4_orb_of_ankou:temp Item ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_orb.mcfunction ================================================ # @s = orb of ankou item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item # check if an orb is already stored in the forge execute as @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] store success score has_orb gm4_oa_forge if entity @s[tag=gm4_oa_has_orb] # check pneuma count of orb execute store result score pneuma_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.components."minecraft:custom_data".gm4_orb_of_ankou.pneumas execute if score pneuma_count gm4_oa_forge matches 4.. run scoreboard players set has_orb gm4_oa_forge 1 # store orb if it doesn't have one stored already, summon living orb if an orb is already stored in the forge or the orb already has 4 or more pneumas execute if score has_orb gm4_oa_forge matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_orb execute if score has_orb gm4_oa_forge matches 1 store result score orb_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count execute if score has_orb gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_living_orb ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_shard.mcfunction ================================================ # @s = soul shard item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item # store shard if it doesn't have one stored already, summon congealed shard if an shard is already stored in the forge execute as @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] store success score has_shard gm4_oa_forge if entity @s[tag=gm4_oa_has_shard] execute if score has_shard gm4_oa_forge matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_shard execute if score has_shard gm4_oa_forge matches 1 store result score shard_count gm4_oa_forge run data get storage gm4_orb_of_ankou:temp Item.count execute if score has_shard gm4_oa_forge matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_congealed_shard ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/check_soul_essence.mcfunction ================================================ # @s = soul essence item in a soul forge # located at the position of the soul forge armor stand (align xyz) # run from soul_forge/recipes/check_item # if forge has no stored essences set the essence execute unless score @e[type=armor_stand,tag=gm4_oa_selected_forge,limit=1] gm4_oa_essence matches 1.. run function gm4_orb_of_ankou:soul_forge/recipes/add_first_soul_essence # check if the essence is the same as the one stored in the forge execute store success score invalid_essence gm4_oa_essence run data modify storage gm4_orb_of_ankou:temp equipment.feet.components."minecraft:custom_data".gm4_orb_of_ankou.stored_pneuma set from storage gm4_orb_of_ankou:temp Item.components."minecraft:custom_data".gm4_orb_of_ankou.stored_pneuma data modify storage gm4_orb_of_ankou:temp equipment.feet.components set from storage gm4_orb_of_ankou:temp Item.components data modify storage gm4_orb_of_ankou:temp equipment.legs.count set value 1b # if same essence, add it to the forge storage execute if score invalid_essence gm4_oa_essence matches 0 run function gm4_orb_of_ankou:soul_forge/recipes/add_soul_essence # else summon endermites, number of endermites is equal to the count of items thrown execute if score invalid_essence gm4_oa_essence matches 1 store result score failed_count gm4_oa_essence run data get storage gm4_orb_of_ankou:temp Item.count execute if score invalid_essence gm4_oa_essence matches 1 run function gm4_orb_of_ankou:soul_forge/entities/summon_failed_essence # prepare for another essence to be checked data modify storage gm4_orb_of_ankou:temp equipment.feet set from storage gm4_orb_of_ankou:temp equipment.legs ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/recipes/initiate_recipe_amounts.mcfunction ================================================ # no @s # at world spawn # called by init # initialise fixed values scoreboard players set modulo_1 gm4_oa_forge 64 scoreboard players set modulo_2 gm4_oa_forge 14 scoreboard players set divider gm4_oa_forge 17 # copy seed to scoreboard execute store result score seed gm4_oa_forge run seed # set blaze powder and flowstone dust to a digit of the seed scoreboard players operation required_blaze_powder gm4_oa_forge = seed gm4_oa_forge scoreboard players operation required_blaze_powder gm4_oa_forge /= divider gm4_oa_forge scoreboard players operation required_glowstone_dust gm4_oa_forge = required_blaze_powder gm4_oa_forge scoreboard players operation required_glowstone_dust gm4_oa_forge /= divider gm4_oa_forge scoreboard players operation required_ghast_tears gm4_oa_forge = required_glowstone_dust gm4_oa_forge scoreboard players operation required_ghast_tears gm4_oa_forge /= divider gm4_oa_forge scoreboard players operation required_wither_roses gm4_oa_forge = required_ghast_tears gm4_oa_forge scoreboard players operation required_wither_roses gm4_oa_forge /= divider gm4_oa_forge # scale down blaze powder and glowstone dust to 1-64 (mod64): scoreboard players operation required_blaze_powder gm4_oa_forge %= modulo_1 gm4_oa_forge scoreboard players operation required_glowstone_dust gm4_oa_forge %= modulo_1 gm4_oa_forge scoreboard players add required_blaze_powder gm4_oa_forge 1 scoreboard players add required_glowstone_dust gm4_oa_forge 1 # scale down ghost tears and wither roses to 3-16 (mod14 + 2) scoreboard players operation required_ghast_tears gm4_oa_forge %= modulo_2 gm4_oa_forge scoreboard players operation required_wither_roses gm4_oa_forge %= modulo_2 gm4_oa_forge scoreboard players add required_ghast_tears gm4_oa_forge 3 scoreboard players add required_wither_roses gm4_oa_forge 3 # store required values in individual scoreboards scoreboard players operation required gm4_oa_powder = required_blaze_powder gm4_oa_forge scoreboard players operation required gm4_oa_glowstone = required_glowstone_dust gm4_oa_forge scoreboard players operation required gm4_oa_tears = required_ghast_tears gm4_oa_forge scoreboard players operation required gm4_oa_roses = required_wither_roses gm4_oa_forge ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/used_flint_and_steel.mcfunction ================================================ # @s = player who used a flint and steel in the nether # run from tick summon marker ~ ~ ~ {Tags:["gm4_soul_forge_ray"]} execute anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_soul_forge_ray,limit=1] ^ ^ ^ ~ ~ scoreboard players set $ray gm4_count 0 execute as @e[type=marker,tag=gm4_soul_forge_ray,limit=1] at @s run function gm4_orb_of_ankou:soul_forge/ray execute unless score $found gm4_count matches 1 anchored eyes positioned ^ ^ ^ anchored feet run tp @e[type=marker,tag=gm4_soul_forge_ray,limit=1] ^ ^ ^ ~ ~ execute unless score $found gm4_count matches 1 as @e[type=marker,tag=gm4_soul_forge_ray,limit=1] at @s run function gm4_orb_of_ankou:soul_forge/ray_backup execute at @e[type=marker,tag=gm4_ray_loc,limit=1] if predicate gm4_orb_of_ankou:has_multiblock align xyz positioned ~0.5 ~ ~0.5 unless entity @e[type=armor_stand,tag=gm4_soul_forge,limit=1,distance=..1] run function gm4_orb_of_ankou:soul_forge/create kill @e[type=marker,tag=gm4_soul_forge_ray] kill @e[type=marker,tag=gm4_ray_loc] scoreboard players reset $ray gm4_count scoreboard players reset $found gm4_count ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/consume.mcfunction ================================================ # @s = soul forge with an orb and shard # located at the closest wither rose catcher that is Age:96 # run from soul_forge/wither_roses/steps setblock ~ ~ ~ lily_of_the_valley scoreboard players add @s gm4_oa_roses 1 # playsound playsound minecraft:entity.generic.eat block @a[distance=..12] ~ ~ ~ 0.7 0.75 playsound minecraft:block.grass.break block @a[distance=..12] ~ ~ ~ 0.6 1 playsound minecraft:entity.player.breath block @a[distance=..12] ~ ~ ~ 1 1.3 # particle particle minecraft:cloud ~ ~0.6 ~ 0 0.8 0 0 5 # summon pretty entity line summon marker ~ ~-1 ~ {Tags:["gm4_oa_wither_particle","gm4_unrotated_particle_cloud"],CustomName:"Soul Forge Wither Particle"} teleport @e[type=marker,tag=gm4_unrotated_particle_cloud,limit=1] ~ ~-1 ~ facing entity @s eyes teleport @e[type=marker,tag=gm4_unrotated_particle_cloud,limit=1] ~ ~1 ~ tag @e[type=marker,tag=gm4_unrotated_particle_cloud] remove gm4_unrotated_particle_cloud ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/move_indicator.mcfunction ================================================ # @s = wither_rose_catcher marker at @s # run from soul_forge/wither_roses/summon_indicator # move the to the randomized position $tp ~$(x) ~1 ~$(z) # kill if not in air or on unsupported block execute at @s if block ~ ~ ~ #gm4:no_collision unless block ~ ~-1 ~ #gm4:no_collision unless block ~ ~-1 ~ obsidian run tag @s add gm4_oa_rose_indicator_valid execute if entity @s[tag=!gm4_oa_rose_indicator_valid] run return run kill @s # set data data merge entity @s {CustomName:"gm4_oa_wither_rose_catcher",Tags:["gm4_oa_wither_rose_catcher"]} # play sound to indicate execute at @s run playsound minecraft:entity.wither.ambient block @a ~ ~ ~ 0.6 1.4 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/particle.mcfunction ================================================ # @s = wither decorative particle # run from soul_forge/process teleport ^ ^ ^0.4 particle minecraft:dust{color:[0.071,0.000,0.161],scale:1} ~ ~ ~ 0 0 0 .005 3 particle minecraft:dust{color:[0.475,0.639,0.443],scale:1} ~ ~ ~ 0 0 0 .005 1 execute positioned ~ ~-1 ~ if entity @e[type=armor_stand,tag=gm4_soul_forge,distance=..3] run kill @s scoreboard players add @s gm4_oa_marker 16 kill @s[scores={gm4_oa_marker=200..}] ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/steps.mcfunction ================================================ # @s = soul forge that has an orb and a shard # run from soul_forge/process # slow clock scoreboard players add @s gm4_oa_forge 1 scoreboard players reset @s[scores={gm4_oa_forge=10..}] gm4_oa_forge # every 160 ticks (8 seconds): spawn an indicator, wait 80 ticks (4 seconds) then consume the wither rose at that indicator if possible execute if score @s gm4_oa_forge matches 2 run function gm4_orb_of_ankou:soul_forge/wither_roses/summon_indicator scoreboard players add @e[type=marker,tag=gm4_oa_wither_rose_catcher,distance=..10,limit=1,sort=nearest] gm4_oa_marker 16 execute if score @s gm4_oa_forge matches 8 at @e[type=marker,tag=gm4_oa_wither_rose_catcher,scores={gm4_oa_marker=112..},distance=..10,limit=1,sort=nearest] if block ~ ~ ~ wither_rose run function gm4_orb_of_ankou:soul_forge/wither_roses/consume kill @e[type=marker,tag=gm4_oa_wither_rose_catcher,scores={gm4_oa_marker=112..},distance=..10] # indicator particles execute at @e[type=marker,tag=gm4_oa_wither_rose_catcher] run particle witch ~ ~ ~ 0 .2 0 0 7 normal ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/soul_forge/wither_roses/summon_indicator.mcfunction ================================================ # @s = soul forge with an orb and shard # run from soul_forge/wither_roses/steps #calculate random position execute store result storage gm4_orb_of_ankou:temp pos.x int 1 run random value -6..6 execute store result storage gm4_orb_of_ankou:temp pos.z int 1 run random value -6..6 #move the entity execute summon marker run function gm4_orb_of_ankou:soul_forge/wither_roses/move_indicator with storage gm4_orb_of_ankou:temp pos data remove storage gm4_orb_of_ankou:temp pos ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/tick.mcfunction ================================================ ## SOUL FORGE ## execute if score nether_player gm4_oa_forge matches 1.. in the_nether run function gm4_orb_of_ankou:nether_tick ## PNEUMA STUFF ## # sneaking stuff execute as @a[gamemode=!spectator,tag=gm4_has_pneuma,scores={gm4_oa_sneak=0},tag=gm4_oa_sneaking] run function gm4_orb_of_ankou:pneumas/sneak/stopped execute as @a[gamemode=!spectator,tag=gm4_has_pneuma,scores={gm4_oa_sneak=1..}] run function gm4_orb_of_ankou:pneumas/sneak/check scoreboard players set @a gm4_oa_sneak 0 # reset use tool scoreboards scoreboard players reset @a gm4_oa_fns schedule function gm4_orb_of_ankou:tick 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/check_offhand.mcfunction ================================================ # @s = any player who has changed their inventory # run from advancement "check_player/check_inventory" advancement revoke @s only gm4_orb_of_ankou:check_player/check_inventory execute if entity @s[tag=gm4_has_pneuma] run function gm4_orb_of_ankou:update_tags/remove_tags execute if entity @s[predicate=gm4_orb_of_ankou:has_pneuma] run function gm4_orb_of_ankou:update_tags/check_pneuma execute as @s[tag=!gm4_pneuma_soaring,tag=gm4_oa_soaring_active] at @s run function gm4_orb_of_ankou:pneumas/soaring/toggle ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/check_pneuma.mcfunction ================================================ # @s = any player who has a soul shard or orb of ankou in their offhand # run from update_tags/check_offhand tag @s add gm4_has_pneuma tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/aggressive] add gm4_pneuma_aggressive tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bargaining] add gm4_pneuma_bargaining tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/blasting] add gm4_pneuma_blasting tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/blinding] add gm4_pneuma_blinding tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bounding] add gm4_pneuma_bounding tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/bubbly] add gm4_pneuma_bubbly tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/conjuring] add gm4_pneuma_conjuring tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/dashing] add gm4_pneuma_dashing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/draining] add gm4_pneuma_draining tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/expeditious] add gm4_pneuma_expeditious tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/feathery] add gm4_pneuma_feathery tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/feigning] add gm4_pneuma_feigning tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/freezing] add gm4_pneuma_freezing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/gazing] add gm4_pneuma_gazing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/gliding] add gm4_pneuma_gliding tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/hawkeye] add gm4_pneuma_hawkeye tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/incombustible] add gm4_pneuma_incombustible tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/lifeless] add gm4_pneuma_lifeless tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/neutralizing] add gm4_pneuma_neutralizing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/phasing] add gm4_pneuma_phasing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/retreating] add gm4_pneuma_retreating tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/rushing] add gm4_pneuma_rushing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/scaling] add gm4_pneuma_scaling tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/shrieking] add gm4_pneuma_shrieking tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/sniffing] add gm4_pneuma_sniffing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/soaring] add gm4_pneuma_soaring tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/striding] add gm4_pneuma_striding tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/synergetic] add gm4_pneuma_synergetic tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/tranquilizing] add gm4_pneuma_tranquilizing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/debilitate] add gm4_pneuma_debilitate tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/vanishing] add gm4_pneuma_vanishing tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/volatile] add gm4_pneuma_volatile tag @s[predicate=gm4_orb_of_ankou:pneuma_equipped/withering] add gm4_pneuma_withering tag @s[tag=gm4_pneuma_bounding] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_rushing] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_conjuring] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_expeditious] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_draining] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_shrieking] add gm4_sneak_pneuma tag @s[tag=gm4_pneuma_dashing] add gm4_sneak_pneuma scoreboard players reset @s gm4_oa_bow_hawkeye scoreboard players reset @s gm4_oa_bow_freezing scoreboard players reset @s gm4_oa_bow_tranquilizing scoreboard players reset @s gm4_oa_bow_debilitate # run tick functions execute if entity @a[gamemode=!spectator,tag=gm4_pneuma_hawkeye,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/hawkeye 1t execute if entity @a[gamemode=!spectator,tag=gm4_pneuma_freezing,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/freezing 1t execute if entity @a[gamemode=!spectator,tag=gm4_pneuma_tranquilizing,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/tranquilizing 1t execute if entity @a[gamemode=!spectator,tag=gm4_pneuma_debilitate,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/debilitate 1t execute if entity @a[gamemode=!spectator,tag=gm4_pneuma_striding,limit=1] run schedule function gm4_orb_of_ankou:pneumas/temp_tick/striding 1t ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/player_id.mcfunction ================================================ # gives a player a unique ID # @s = player that joined for the first time # located at @s # run from advancement "check_player/get_id" execute store result score @s gm4_oa_id run scoreboard players add #max gm4_oa_id 1 ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/function/update_tags/remove_tags.mcfunction ================================================ # @s = any player who has changed their inventory and has a pneuma tag # run from update_tags/check_offhand tag @s remove gm4_pneuma_aggressive tag @s remove gm4_pneuma_agile tag @s remove gm4_pneuma_bargaining tag @s remove gm4_pneuma_blasting tag @s remove gm4_pneuma_blinding tag @s remove gm4_pneuma_bounding tag @s remove gm4_pneuma_bubbly tag @s remove gm4_pneuma_conjuring tag @s remove gm4_pneuma_dashing tag @s remove gm4_pneuma_draining tag @s remove gm4_pneuma_expeditious tag @s remove gm4_pneuma_feathery tag @s remove gm4_pneuma_feigning tag @s remove gm4_pneuma_freezing tag @s remove gm4_pneuma_gazing tag @s remove gm4_pneuma_gliding tag @s remove gm4_pneuma_hawkeye tag @s remove gm4_pneuma_incombustible tag @s remove gm4_pneuma_lifeless tag @s remove gm4_pneuma_neutralizing tag @s remove gm4_pneuma_phasing tag @s remove gm4_pneuma_retreating tag @s remove gm4_pneuma_rushing tag @s remove gm4_pneuma_scaling tag @s remove gm4_pneuma_shrieking tag @s remove gm4_pneuma_sniffing tag @s remove gm4_pneuma_soaring tag @s remove gm4_pneuma_striding tag @s remove gm4_pneuma_synergetic tag @s remove gm4_pneuma_tranquilizing tag @s remove gm4_pneuma_debilitate tag @s remove gm4_pneuma_vanishing tag @s remove gm4_pneuma_volatile tag @s remove gm4_pneuma_withering tag @s remove gm4_sneak_pneuma tag @s remove gm4_has_pneuma tag @s remove gm4_oa_soaring_idle tag @s remove gm4_oa_soaring_toggled ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/guidebook/orb_of_ankou.json ================================================ { "id": "orb_of_ankou", "name": "Orb of Ankou", "module_type": "module", "icon": { "id": "minecraft:flint_and_steel" }, "criteria": { "obtain_soul_essence": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:black_dye" ], "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"soul_essence\"}}" } } ] } }, "create_soul_forge": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:create_soul_forge": true } } } } ] } }, "obtain_soul_shard": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:flint" ], "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"soul_shard\"}}" } } ] } }, "obtain_nether_star": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:nether_star" ] } ] } }, "obtain_empty_orb_of_ankou": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:firework_star" ], "components": { "minecraft:firework_explosion": { "shape": "small_ball", "colors": [ 13092807 ] } }, "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"orb\"}}" } } ] } }, "obtain_filled_orb_of_ankou": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:firework_star" ], "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{item:\"orb\",pneumas:[{}]}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.orb_of_ankou.description", "fallback": "Mob powers can be obtained by collecting rare soul essences using the Corripio Shamir.\n\nThirteen essences are required to gain the powers of a mob, called a pneuma." } ] ] }, { "name": "forge_creation", "enable": [], "requirements": [ [ "obtain_soul_essence" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.soul_forge", "fallback": "To gain powers of the Soul Essences, a Condensing Ritual must be performed in a Soul Forge.\n\nA Soul Forge can be made in the Nether by forming a 3x3 ring of obsidian then igniting soul fire inside the ring." } ] ] }, { "name": "shard_creation", "enable": [], "requirements": [ [ "create_soul_forge" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.condensing_ritual", "fallback": "To create a Soul Shard, 13 of the same Soul Essence must be dropped into the forge along with some blaze powder and glowstone dust.\n\nExtinguishing the flame will create a Possesed Soul Shard, which should be killed." } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.condensing_ingredients", "fallback": "The required amount of glowstone dust and blaze powder is between 1 and 64, but differs in each world.\n\nExtra dust or powder will create the Shard, but spawn Fiery Sprites. Too little will cause the recipe to fail." } ] ], "grants": [ "forge_creation" ] }, { "name": "shard_usage", "enable": [], "requirements": [ [ "obtain_soul_shard" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.shard_usage", "fallback": "Holding the Shard in the offhand will grant the user with that pneuma's power, while lowering their attack damage 20% as a side-effect.\n\nAn Orb of Ankou can be crafted to negate the attack debuff and hold more pneumas." } ] ], "grants": [ "shard_creation" ] }, { "name": "orb_crafting", "enable": [], "requirements": [ [ "obtain_nether_star" ], [ "obtain_soul_shard" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.orb_crafting", "fallback": "The Orb of Ankou can be crafted with the following recipe:" }, "\n", { "insert": "recipe", "recipe": "gm4_orb_of_ankou:orb_of_ankou" } ] ], "grants": [ "shard_usage" ] }, { "name": "orb_fusing", "enable": [], "requirements": [ [ "obtain_empty_orb_of_ankou" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.fusing_ritual", "fallback": "To fuse a Shard into an Orb, light a soul forge and drop the two items in, along with some ghast tears.\n\nWither particles will appear to indicate where wither roses should be placed to be absorbed." } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.fusing_ingredients", "fallback": "The required amount of ghast tears and wither roses is between 3 and 16, but differs in each world.\n\nExtra tears or roses will fuse the Shard, but wandering tears and a withering cloud will appear." } ] ], "grants": [ "orb_crafting" ] }, { "name": "orb_usage", "enable": [], "requirements": [ [ "obtain_filled_orb_of_ankou" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.orb_usage", "fallback": "Similar to a Soul Shard, the Orb of Ankou functions when it is equipped in the offhand.\n\nAn orb of ankou can hold 4 pneumas, which will work concurrently when in the same orb." } ] ], "grants": [ "orb_fusing" ] }, { "name": "pneuma_descriptions", "enable": [], "requirements": [ [ "obtain_soul_shard" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.orb_of_ankou.defensive_pneumas", "fallback": "The following pneumas activate upon taking damage:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_aggressive", "fallback": "Aggressive" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.aggressive", "fallback": "Grants Strength when damaged" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_feigning", "fallback": "Feigning" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.feigning", "fallback": "Grants Slowness, Resistance, Invisibility, and Regeneration when damaged below half health" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_incombustible", "fallback": "Incombustible" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.incombustible", "fallback": "Grants Fire Resistance when damaged by fire" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_lifeless", "fallback": "Lifeless" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.lifeless", "fallback": "Negates Poison effect and heals when damaged by Instant Damage effect" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_neutralizing", "fallback": "Neutralizing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.neutralizing", "fallback": "Negates Poison effect; Instant Damage effect deals less damage" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_picking", "fallback": "Pricking" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.pricking", "fallback": "75% chance to deal 1-4 damage to the attacker (Thorns V)" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_retreating", "fallback": "Retreating" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.retreating", "fallback": "Grants Speed and Weakness when damaged" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_volatile", "fallback": "Volatile" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.volatile", "fallback": "Creates explosion if damaged below 1.5 hearts" } ] } } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.offensive_pneumas", "fallback": "The following pneumas activate upon dealing damage:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_blasting", "fallback": "Blasting" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.blasting", "fallback": "Shoots fireballs when shooting a crossbow with blaze powder in the inventory" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_debilitate", "fallback": "Debilitate" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.debilitate", "fallback": "Applies Weakness to arrows shot from bows" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_depriving", "fallback": "Depriving" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.depriving", "fallback": "Applies Hunger to attacked targets; Applies Weakness to attacked mobs" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_freezing", "fallback": "Freezing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.freezing", "fallback": "Applies Slowness to arrows shot from bows" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_hawkeye", "fallback": "Hawkeye" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.hawkeye", "fallback": "Doubles the damage of arrows shot from bows; Arrows shot from bows will have Piercing I" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_tranquilizing", "fallback": "Tranquilizing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.tranquilizing", "fallback": "Applies Poison to arrows shot from bows" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_venomous", "fallback": "Venomous" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.venomous", "fallback": "Applies Poison to attacked target" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_withering", "fallback": "Withering" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.withering", "fallback": "Applies Wither to attacked target" } ] } } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.passive_pneumas", "fallback": "The following pneumas are passive, activating automatically:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_agile", "fallback": "Agile" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.agile", "fallback": "Prevents fall damage" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_anchoring", "fallback": "Anchoring" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.anchoring", "fallback": "Grants 90% Knockback Resistance" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_bargaining", "fallback": "Bargaining" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.bargaining", "fallback": "Grants Regeneration upon trading with villagers" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_bashing", "fallback": "Bashing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.bashing", "fallback": "Grants +70% Attack Damage, but -40% Attack Speed" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_bubbly", "fallback": "Bubbly" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.bubbly", "fallback": "Grants 2 minutes of Water Breathing when submerged" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_enduring", "fallback": "Enduring" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.enduring", "fallback": "Grants +8 Max Health, but -20% Speed" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_gliding", "fallback": "Gliding" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.gliding", "fallback": "Grants Dolphin's Grace when swimming" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_striding", "fallback": "Striding" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.striding", "fallback": "Temporarily converts lava sources into magma blocks upon stepping on them" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_synergetic", "fallback": "Synergetic" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.synergetic", "fallback": "Grants Strength to tamed wolves and other Synergetic users" } ] } } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.sneak_charge_pneumas", "fallback": "The following pneumas charge while sneaking then activate upon unsneaking:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_bounding", "fallback": "Bounding" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.bounding", "fallback": "Increasingly stronger Jump Boost" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_conjuring", "fallback": "Conjuring" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.conjuring", "fallback": "Increasingly farther Evoker fang attack" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_dashing", "fallback": "Dashing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.dashing", "fallback": "Increasingly farther horizontal dash" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_draining", "fallback": "Draining" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.draining", "fallback": "Increasingly farther Mining Fatigue AOE" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_expeditious", "fallback": "Expeditious" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.expeditious", "fallback": "Increasingly farther random teleport" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_rushing", "fallback": "Rushing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.rushing", "fallback": "Increasingly faster and longer Speed burst" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_shrieking", "fallback": "Shrieking" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.shrieking", "fallback": "Sonic boom 15 blocks far, dealing 6 hearts of damage" } ] } } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.sneak_tap_pneumas", "fallback": "The following pneumas activate while sneaking:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_blinding", "fallback": "Blinding" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.blinding", "fallback": "Blindness AOE for 7 seconds" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_feathery", "fallback": "Feathery" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.feathery", "fallback": "Grants Slow Falling for 7 seconds" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_gazing", "fallback": "Gazing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.gazing", "fallback": "Grants Night Vision for 30 seconds" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_soaring", "fallback": "Soaring" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.soaring", "fallback": "Sneaking toggles the ability: Look up to ascend and down to descend" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_vanishing", "fallback": "Vanishing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.vanishing", "fallback": "Grants Invisibility for 90 seconds" } ] } } ], [ { "translate": "text.gm4.guidebook.orb_of_ankou.sneak_hold_pneumas", "fallback": "The following pneumas activate while continuously sneaking:" }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_phasing", "fallback": "Phasing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.phasing", "fallback": "Allows walking through 1-wide walls" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_scaling", "fallback": "Scaling" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.scaling", "fallback": "Allows climbing up walls" } ] } }, "\n", { "translate": "text.gm4.guidebook.orb_of_ankou.pneuma_list", "fallback": " - %1$s*", "with": [ { "translate": "text.gm4.pneuma_sniffing", "fallback": "Sniffing" } ], "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.orb_of_ankou.note.sniffing", "fallback": "Sniffs up torchflowers and pitcher pods" } ] } } ] ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/orb_of_ankou.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:firework_star", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:item/orb_of_ankou"]}, "minecraft:firework_explosion": { "shape": "small_ball", "colors": [ 13092807 ] }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:firework_explosion" ] }, "minecraft:rarity": "rare", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'orb'},smithed:{ignore:{functionality:1b,crafting:1b}}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.orb_of_ankou", "fallback": "Orb of Ankou" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ [ { "translate": "text.gm4.orb_of_ankou.empty", "fallback": "Empty", "color": "gray" } ] ] } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/aggressive.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_aggressive", "fallback": "Aggressive", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/aggressive"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'aggressive'}],stored_color:[10682368],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/agile.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_agile", "fallback": "Agile", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/agile"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:fall_damage_multiplier", "id": "gm4_orb_of_ankou:agile_fall_damage_multiplier", "amount": -1024, "operation": "add_value", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'agile'}],stored_color:[16769574],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/anchoring.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_anchoring", "fallback": "Anchoring", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/anchoring"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:knockback_resistance", "id": "gm4_orb_of_ankou:anchoring_knockback_resistance", "amount": 0.9, "operation": "add_value", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'anchoring'}],stored_color:[1648550],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bargaining.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_bargaining", "fallback": "Bargaining", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/bargaining"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bargaining'}],stored_color:[1090333],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bashing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_bashing", "fallback": "Bashing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/bashing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:attack_speed", "id": "gm4_orb_of_ankou:bashing_attack_speed", "amount": -0.4, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:bashing_attack_damage", "amount": 0.7, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bashing'}],stored_color:[13181000],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/blasting.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_blasting", "fallback": "Blasting", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/blasting"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'blasting'}],stored_color:[16761136],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/blinding.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_blinding", "fallback": "Blinding", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/blinding"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'blinding'}],stored_color:[3809425],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bounding.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_bounding", "fallback": "Bounding", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/bounding"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bounding'}],stored_color:[7921776],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/bubbly.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_bubbly", "fallback": "Bubbly", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/bubbly"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'bubbly'}],stored_color:[5294074],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/conjuring.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_conjuring", "fallback": "Conjuring", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/conjuring"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'conjuring'}],stored_color:[2953835],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/dashing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_dashing", "fallback": "Dashing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/dashing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'dashing'}],stored_color:[14735149],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/debilitate.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_debilitate", "fallback": "Debilitate", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/debilitate"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'debilitate'}],stored_color:[2304605],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/depriving.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_depriving", "fallback": "Depriving", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/depriving"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'depriving'}],stored_color:[13943899],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/draining.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_draining", "fallback": "Draining", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/draining"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'draining'}],stored_color:[6377247],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/enduring.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_enduring", "fallback": "Enduring", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/enduring"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:max_health", "id": "gm4_orb_of_ankou:enduring_max_health", "amount": 8, "operation": "add_value", "slot": "offhand" }, { "attribute": "minecraft:movement_speed", "id": "gm4_orb_of_ankou:enduring_movement_speed", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'enduring'}],stored_color:[5815552],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/expeditious.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_expeditious", "fallback": "Expeditious", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/expeditious"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'expeditious'}],stored_color:[14037247],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/feathery.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_feathery", "fallback": "Feathery", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/feathery"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'feathery'}],stored_color:[14806509],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/feigning.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_feigning", "fallback": "Feigning", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/feigning"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'feigning'}],stored_color:[16406506],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/freezing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_freezing", "fallback": "Freezing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/freezing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'freezing'}],stored_color:[5559779],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/gazing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_gazing", "fallback": "Gazing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/gazing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'gazing'}],stored_color:[6814213],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/gliding.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_gliding", "fallback": "Gliding", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/gliding"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'gliding'}],stored_color:[3108845],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/hawkeye.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_hawkeye", "fallback": "Hawkeye", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/hawkeye"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'hawkeye'}],stored_color:[15548437],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/incombustible.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_incombustible", "fallback": "Incombustible", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/incombustible"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'incombustible'}],stored_color:[15238935],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/lifeless.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_lifeless", "fallback": "Lifeless", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/lifeless"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'lifeless'}],stored_color:[12761127],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/neutralizing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_neutralizing", "fallback": "Neutralizing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/neutralizing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'neutralizing'}],stored_color:[6365875],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/phasing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_phasing", "fallback": "Phasing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/phasing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'phasing'}],stored_color:[11202779],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/pricking.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_pricking", "fallback": "Pricking", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/pricking"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_enchantments", "enchantments": { "minecraft:thorns": 5 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'pricking'}],stored_color:[8375363],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/retreating.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_retreating", "fallback": "Retreating", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/retreating"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'retreating'}],stored_color:[13381501],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/rushing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_rushing", "fallback": "Rushing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/rushing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'rushing'}],stored_color:[14245691],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/scaling.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_scaling", "fallback": "Scaling", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/scaling"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'scaling'}],stored_color:[8587519],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/shrieking.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_shrieking", "fallback": "Shrieking", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/shrieking"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'shrieking'}],stored_color:[831664],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/sniffing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_sniffing", "fallback": "Sniffing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/sniffing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'sniffing'}],stored_color:[5482509],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/soaring.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_soaring", "fallback": "Soaring", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/soaring"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" }, { "attribute": "minecraft:max_health", "id": "gm4_orb_of_ankou:soaring_max_health", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'soaring'}],stored_color:[9295344],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/striding.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_striding", "fallback": "Striding", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/striding"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'striding'}],stored_color:[15223575],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/synergetic.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_synergetic", "fallback": "Synergetic", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/synergetic"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'synergetic'}],stored_color:[15790159],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/tranquilizing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_tranquilizing", "fallback": "Tranquilizing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/tranquilizing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'tranquilizing'}],stored_color:[5465649],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/vanishing.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_vanishing", "fallback": "Vanishing", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/vanishing"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'vanishing'}],stored_color:[8864176],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/venomous.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_venomous", "fallback": "Venomous", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/venomous"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'venomous'}],stored_color:[5424161],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/volatile.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_volatile", "fallback": "Volatile", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/volatile"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:'soul_shard',pneumas:[{id:'volatile'}],stored_color:[2474538],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/loot_table/items/soul_shard/withering.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:flint", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.pneuma_withering", "fallback": "Withering", "italic": false, "color": "blue" } ] }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:pneuma/withering"]}, "minecraft:item_name": { "translate": "item.gm4.soul_shard", "fallback": "Soul Shard" }, "minecraft:rarity": "common", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1 } }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:attack_damage", "id": "gm4_orb_of_ankou:attack_damage", "amount": -0.2, "operation": "add_multiplied_base", "slot": "offhand" } ] }, { "function": "minecraft:set_custom_data", "tag": "{gm4_orb_of_ankou:{item:\"soul_shard\",pneumas:[{id:'withering'}],stored_color:[4067968],smithed:{ignore:{functionality:1b,crafting:1b}}}}" } ] } ] } ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/has_multiblock.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": 0, "offsetZ": 0, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": 0, "offsetZ": 0, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": 0, "offsetZ": 1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": 0, "offsetZ": -1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": 0, "offsetZ": 1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": 0, "offsetZ": -1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": 0, "offsetZ": 1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": 0, "offsetZ": -1, "predicate": { "block": { "blocks": [ "minecraft:obsidian" ] } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#minecraft:soul_fire_base_blocks" } } } } ] } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/has_pneuma.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": "{gm4_orb_of_ankou:{pneumas:[{}]}}" } } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/in_water.json ================================================ { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/matching_id.json ================================================ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_oa_id": { "min": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$current" }, "score": "gm4_oa_id" }, "max": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$current" }, "score": "gm4_oa_id" } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/on_ground.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "stepping_on": { "block": { "blocks": "#gm4:no_collision" } } } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/predicate/sniff_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.05 } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/recipe/orb_of_ankou.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "pattern": [ "NCN", "CSC", "NCN" ], "key": { "N": "minecraft:netherite_scrap", "C": "minecraft:clay_ball", "S": "minecraft:nether_star" }, "result": { "id": "minecraft:firework_star", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_orb_of_ankou:item/orb_of_ankou"]}, "minecraft:firework_explosion": { "shape": "small_ball", "colors": [ 13092807 ] }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:firework_explosion" ] }, "minecraft:rarity": "rare", "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, "minecraft:equippable": { "slot": "offhand" }, "minecraft:max_stack_size": 1, "minecraft:custom_data": "{gm4_orb_of_ankou:{item:'orb'}}", "minecraft:item_name": {"translate":"item.gm4.orb_of_ankou","fallback":"Orb of Ankou"}, "minecraft:lore": [ {"translate":"text.gm4.orb_of_ankou.empty","fallback":"Empty","color":"gray"} ] } } } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/feigning_affected.json ================================================ { "values": [ "#gm4_orb_of_ankou:neutral", "#gm4_orb_of_ankou:hostile" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/hostile.json ================================================ { "values": [ "minecraft:blaze", "minecraft:creeper", "minecraft:drowned", "minecraft:elder_guardian", "minecraft:endermite", "minecraft:evoker", "minecraft:ghast", "minecraft:guardian", "minecraft:hoglin", "minecraft:husk", "minecraft:magma_cube", "minecraft:phantom", "minecraft:piglin_brute", "minecraft:pillager", "minecraft:ravager", "minecraft:shulker", "minecraft:silverfish", "minecraft:skeleton", "minecraft:slime", "minecraft:stray", "minecraft:vex", "minecraft:vindicator", "minecraft:witch", "minecraft:wither", "minecraft:wither_skeleton", "minecraft:zombie_villager", "minecraft:zombie", "minecraft:zoglin" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/entity_type/neutral.json ================================================ { "values": [ "minecraft:bee", "minecraft:cave_spider", "minecraft:enderman", "minecraft:goat", "minecraft:iron_golem", "minecraft:llama", "minecraft:panda", "minecraft:piglin", "minecraft:polar_bear", "minecraft:spider", "minecraft:trader_llama", "minecraft:wolf", "minecraft:zombified_piglin" ] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/function/pneumas/expeditious/tp_player.json ================================================ { "values": [] } ================================================ FILE: gm4_orb_of_ankou/data/gm4_orb_of_ankou/tags/item/pneuma_container.json ================================================ { "values": [ "minecraft:firework_star", "minecraft:flint" ] } ================================================ FILE: gm4_orb_of_ankou/generate_pneumas.py ================================================ from beet import Context, Advancement, Function, LootTable, Predicate import csv from typing import Any SUPPORTED_LOOTING = 10 entities = {} pneumas:list[str] = [] updated_csv = [['-Run beet to update columns 4-9'],[],['.Mob','.Soul Essence','Base','L I','L II','L III','.','K/E (L III)','K/S (L III)']] def beet_default(ctx: Context): """Creates advancements, functions, and loot tables for each mob that the corripio shamir works on.""" read_csv() generate_corripio(ctx) generate_pneuma_predicates(ctx) generate_soul_essence_loot_tables(ctx) def generate_corripio(ctx: Context): entity: Any for entity in entities: # Advancement to detect when a player kills the mob using a corripio shamir ctx.data[f"gm4_corripio_shamir:kill_entity/{entity}"] = Advancement({ "criteria": { "requirement": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": f"minecraft:{entity}" } }, *[{ "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"" + tag + "\"]}" } } } for tag in ["gm4_oa_ignore", "smithed.entity"]], ], "killing_blow": { "source_entity": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'corripio'}}" } } } } } } } }, "rewards": { "function": f"gm4_corripio_shamir:kill_entity/{entity}" } }) # Function to summon the items and revoke the advancement ctx.data[f"gm4_corripio_shamir:kill_entity/{entity}"] = Function([ f"# run from advancement kill_entity/{entity}", f"# @s = player who killed a {entity} using the corripio shamir", "", f"loot spawn ~ ~.3 ~ fish gm4_corripio_shamir:entities/{entity} ~ ~ ~ mainhand", "execute as @e[type=item,distance=..1,nbt={Age:0s,Item:{tag:{gm4_orb_of_ankou:{item:\"soul_essence\"}}}}] run data merge entity @s {PickupDelay:0}", "", f"advancement revoke @s only gm4_corripio_shamir:kill_entity/{entity}", ]) # Loot table to drop the items pools: Any = [] essence: Any = '' for essence in entities[entity]: pool: Any = { "rolls": 1, "entries": [{ "type": "minecraft:loot_table", "value": f"gm4_orb_of_ankou:items/soul_essence/{essence}" }] } pool["conditions"] = [{ "condition": "minecraft:table_bonus", "enchantment": "minecraft:looting", "chances": [] }] base_chance: Any = entities[entity][essence] for i in range(SUPPORTED_LOOTING+1): pool["conditions"][0]["chances"].append(looting_chance(base_chance,i)) pools.append(pool) ctx.data[f"gm4_corripio_shamir:entities/{entity}"] = LootTable({ "type": "minecraft:fishing", "pools": pools }) def generate_pneuma_predicates(ctx: Context): pneuma: Any = "" for pneuma in pneumas: # Predicate to check if a player has a certain pneuma equipped custom_data = "{gm4_orb_of_ankou:{pneumas:[{id:'"+ pneuma + "'}]}}" ctx.data[f"gm4_orb_of_ankou:pneuma_equipped/{pneuma}"] = Predicate({ "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_orb_of_ankou:pneuma_container", "predicates": { "minecraft:custom_data": custom_data } } } } }) def looting_chance(base: float,lvl: int) -> float: return min(1.0,round(base * (1 + (3 * (lvl**3))),6)) def generate_soul_essence_loot_tables(ctx: Context): for pneuma in pneumas: custom_data = "{gm4_orb_of_ankou:{item:'soul_essence',stored_pneuma:{id:'" + pneuma + "'}},smithed:{ignore:{functionality:1b,crafting:1b}}}" ctx.data[f"gm4_orb_of_ankou:items/soul_essence/{pneuma}"] = LootTable({ "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:black_dye", "functions": [ { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": f"text.gm4.pneuma_{pneuma}", "fallback": pneuma.replace("_", " ").title(), "italic": False, "color": "blue" } ] }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.soul_essence", "fallback": "Soul Essence" } }, { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": True, "minecraft:custom_model_data": { "strings": [f"gm4_orb_of_ankou:pneuma/{pneuma}"] }, "minecraft:damage_resistant": { "types": "#minecraft:is_fire" }, } }, { "function": "minecraft:set_custom_data", "tag": custom_data } ] } ] } ] }) def read_csv(): # read csv file with open('gm4_orb_of_ankou/soul_essence.csv', mode ='r') as file: csv_file = csv.reader(file) # skip first 3 rows next(csv_file) next(csv_file) next(csv_file) for row in csv_file: # get info entity = row[0] essence = row[1] base_chance = float(row[2][0:-1])/100 if entity not in entities: entities[entity] = {} entities[entity][essence] = round(base_chance,6) if essence not in pneumas: pneumas.append(essence) # calculate extra info entry = [entity,essence,str(round(base_chance*100,4))+'%',str(round(base_chance*400,3))+'%',str(round(base_chance*2500,3))+'%',str(round(base_chance*8200,2))+'%','',str(round(1/(base_chance*82),1)),str(round(13/(base_chance*82),1))] updated_csv.append(entry) # update calculated info with open('gm4_orb_of_ankou/soul_essence.csv', mode ='w', newline='') as file: csv_file = csv.writer(file) # skip first two rows csv_file.writerows(updated_csv) ================================================ FILE: gm4_orb_of_ankou/mod.mcdoc ================================================ use ::java::world::entity::mob::EntityEquipment use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_orb_of_ankou:temp] to struct { equipment?: EntityEquipment, Item?: ItemStack, Orb?: ItemStack, Drop?: ItemStack, } ================================================ FILE: gm4_orb_of_ankou/pneuma_model_template.py ================================================ from typing import Literal from beet import Model, NamespaceProxy, Context from gm4.plugins.resource_pack import ModelData, TemplateOptions from gm4.utils import MapOption def beet_default(ctx: Context): pass class PneumaTemplate(TemplateOptions): """model template to generate the models for shards and essences""" name: Literal["pneuma"] = "pneuma" def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]): pneuma = config.reference.split("/")[-1] # eg agile, anchoring ect... shard = models_container[f"gm4_orb_of_ankou:item/shards/{pneuma}"] = Model({ "parent": "item/generated", "textures": { "layer0": f"gm4_orb_of_ankou:item/shards/{pneuma}" } }) essence = models_container[f"gm4_orb_of_ankou:item/essences/{pneuma}"] = Model({ "parent": "item/generated", "textures": { "layer0": f"gm4_orb_of_ankou:item/essences/{pneuma}" } }) config.model = MapOption({ "flint": f"gm4_orb_of_ankou:item/shards/{pneuma}", "black_dye": f"gm4_orb_of_ankou:item/essences/{pneuma}" }) return [shard, essence] ================================================ FILE: gm4_orb_of_ankou/soul_essence.csv ================================================ -Run beet to update columns 4-9 .Mob,.Soul Essence,Base,L I,L II,L III,.,K/E (L III),K/S (L III) allay,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 allay,soaring,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9 armadillo,enduring,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 armadillo,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 axolotl,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 axolotl,feigning,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 axolotl,gliding,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 axolotl,synergetic,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 bat,gazing,0.3%,1.2%,7.5%,24.6%,,4.1,52.8 bat,soaring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 bee,soaring,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4 bee,venomous,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 blaze,blasting,0.002%,0.008%,0.05%,0.16%,,609.8,7926.8 blaze,feathery,0.0017%,0.007%,0.043%,0.14%,,717.4,9325.7 blaze,incombustible,0.0019%,0.008%,0.048%,0.16%,,641.8,8344.0 blaze,soaring,0.0013%,0.005%,0.033%,0.11%,,938.1,12195.1 bogged,hawkeye,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 bogged,lifeless,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4 bogged,tranquilizing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 breeze,agile,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 breeze,bounding,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 camel,dashing,0.025%,0.1%,0.625%,2.05%,,48.8,634.1 camel,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 camel_husk,dashing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 camel_husk,lifeless,0.035%,0.14%,0.875%,2.87%,,34.8,453.0 camel_husk,retreating,0.045%,0.18%,1.125%,3.69%,,27.1,352.3 cat,agile,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 cat,gazing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 cat,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 cave_spider,scaling,0.0027%,0.011%,0.068%,0.22%,,451.7,5871.7 cave_spider,venomous,0.0023%,0.009%,0.058%,0.19%,,530.2,6892.9 chicken,feathery,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5 chicken,retreating,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 cod,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 cod,gliding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 cow,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 creeper,volatile,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6 dolphin,bubbly,0.14%,0.56%,3.5%,11.48%,,8.7,113.2 dolphin,gliding,0.12%,0.48%,3.0%,9.84%,,10.2,132.1 donkey,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 drowned,bubbly,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9 drowned,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 elder_guardian,bubbly,1.2%,4.8%,30.0%,98.4%,,1.0,13.2 elder_guardian,draining,1.1%,4.4%,27.5%,90.2%,,1.1,14.4 elder_guardian,enduring,0.97%,3.88%,24.25%,79.54%,,1.3,16.3 elder_guardian,gliding,1.2%,4.8%,30.0%,98.4%,,1.0,13.2 ender_dragon,anchoring,0.6%,2.4%,15.0%,49.2%,,2.0,26.4 ender_dragon,bashing,0.6%,2.4%,15.0%,49.2%,,2.0,26.4 ender_dragon,blasting,0.7%,2.8%,17.5%,57.4%,,1.7,22.6 ender_dragon,enduring,0.5%,2.0%,12.5%,41.0%,,2.4,31.7 ender_dragon,soaring,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 enderman,aggressive,0.006%,0.024%,0.15%,0.49%,,203.3,2642.3 enderman,expeditious,0.0025%,0.01%,0.062%,0.21%,,487.8,6341.5 enderman,gazing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 endermite,synergetic,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 evoker,conjuring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 fox,bounding,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 fox,gazing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 fox,retreating,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 frog,bubbly,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 frog,gliding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 frog,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 ghast,blasting,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 ghast,incombustible,0.025%,0.1%,0.625%,2.05%,,48.8,634.1 ghast,soaring,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5 giant,enduring,0.7%,2.8%,17.5%,57.4%,,1.7,22.6 glow_squid,bubbly,0.17%,0.68%,4.25%,13.94%,,7.2,93.3 glow_squid,gliding,0.15%,0.6%,3.75%,12.3%,,8.1,105.7 goat,aggressive,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 goat,bounding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 goat,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 goat,rushing,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 guardian,bubbly,0.0035%,0.014%,0.088%,0.29%,,348.4,4529.6 guardian,gliding,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6 guardian,pricking,0.002%,0.008%,0.05%,0.16%,,609.8,7926.8 happy_ghast,soaring,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6 hoglin,anchoring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 hoglin,bashing,0.025%,0.1%,0.625%,2.05%,,48.8,634.1 horse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 husk,depriving,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 husk,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1 illusioner,blinding,0.2%,0.8%,5.0%,16.4%,,6.1,79.3 illusioner,vanishing,0.2%,0.8%,5.0%,16.4%,,6.1,79.3 iron_golem,agile,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 iron_golem,anchoring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 iron_golem,bashing,0.007%,0.028%,0.175%,0.57%,,174.2,2264.8 iron_golem,enduring,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 llama,aggressive,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 magma_cube,agile,0.016%,0.064%,0.4%,1.31%,,76.2,990.9 magma_cube,bounding,0.016%,0.064%,0.4%,1.31%,,76.2,990.9 magma_cube,incombustible,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1 mooshroom,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 mule,bounding,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 nautilus,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 nautilus,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 nautilus,dashing,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 ocelot,agile,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 ocelot,gazing,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 panda,aggressive,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 parrot,feathery,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 parrot,soaring,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 parched,hawkeye,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 parched,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1 parched,debilitate,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 phantom,feathery,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 phantom,lifeless,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 phantom,soaring,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 pig,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 piglin,aggressive,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 piglin,rushing,0.018%,0.072%,0.45%,1.48%,,67.8,880.8 piglin,synergetic,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 piglin_brute,enduring,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 piglin_brute,rushing,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 piglin_brute,synergetic,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 pillager,rushing,0.0028%,0.011%,0.07%,0.23%,,435.5,5662.0 polar_bear,aggressive,0.6%,2.4%,15.0%,49.2%,,2.0,26.4 polar_bear,synergetic,0.65%,2.6%,16.25%,53.3%,,1.9,24.4 pufferfish,bubbly,0.065%,0.26%,1.625%,5.33%,,18.8,243.9 pufferfish,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 pufferfish,pricking,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 pufferfish,venomous,0.025%,0.1%,0.625%,2.05%,,48.8,634.1 rabbit,bounding,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 rabbit,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 ravager,anchoring,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 ravager,bashing,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 ravager,enduring,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 salmon,bubbly,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 salmon,gliding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 sheep,retreating,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 shulker,anchoring,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 shulker,enduring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 shulker,expeditious,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 silverfish,phasing,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9 silverfish,synergetic,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 silverfish,vanishing,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 skeleton,hawkeye,0.004%,0.016%,0.1%,0.33%,,304.9,3963.4 skeleton,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 skeleton_horse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 skeleton_horse,lifeless,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 slime,bounding,0.009%,0.036%,0.225%,0.74%,,135.5,1761.5 sniffer,retreating,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 sniffer,sniffing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 snow_golem,aggressive,0.035%,0.14%,0.875%,2.87%,,34.8,453.0 spider,scaling,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6 squid,blinding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 squid,bubbly,0.12%,0.48%,3.0%,9.84%,,10.2,132.1 squid,gliding,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 stray,freezing,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 stray,hawkeye,0.0045%,0.018%,0.112%,0.37%,,271.0,3523.0 stray,lifeless,0.0055%,0.022%,0.137%,0.45%,,221.7,2882.5 strider,incombustible,0.025%,0.1%,0.625%,2.05%,,48.8,634.1 strider,retreating,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 strider,striding,0.017%,0.068%,0.425%,1.39%,,71.7,932.6 tadpole,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 tadpole,gliding,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 trader_llama,aggressive,0.5%,2.0%,12.5%,41.0%,,2.4,31.7 tropical_fish,bubbly,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 tropical_fish,gliding,0.065%,0.26%,1.625%,5.33%,,18.8,243.9 turtle,anchoring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 turtle,bubbly,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 turtle,enduring,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 turtle,gliding,0.08%,0.32%,2.0%,6.56%,,15.2,198.2 vex,phasing,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1 vex,soaring,0.003%,0.012%,0.075%,0.25%,,406.5,5284.6 villager,bargaining,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 vindicator,rushing,0.008%,0.032%,0.2%,0.66%,,152.4,1981.7 wandering_trader,bargaining,0.83%,3.32%,20.75%,68.06%,,1.5,19.1 wandering_trader,vanishing,0.56%,2.24%,14.0%,45.92%,,2.2,28.3 warden,anchoring,0.5%,2.0%,12.5%,41.0%,,2.4,31.7 warden,bashing,0.45%,1.8%,11.25%,36.9%,,2.7,35.2 warden,enduring,0.4%,1.6%,10.0%,32.8%,,3.0,39.6 warden,incombustible,0.35%,1.4%,8.75%,28.7%,,3.5,45.3 warden,shrieking,0.2%,0.8%,5.0%,16.4%,,6.1,79.3 witch,neutralizing,0.015%,0.06%,0.375%,1.23%,,81.3,1056.9 wither,enduring,0.045%,0.18%,1.125%,3.69%,,27.1,352.3 wither,lifeless,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 wither,soaring,0.02%,0.08%,0.5%,1.64%,,61.0,792.7 wither,withering,0.3%,1.2%,7.5%,24.6%,,4.1,52.8 wither_skeleton,lifeless,0.012%,0.048%,0.3%,0.98%,,101.6,1321.1 wither_skeleton,rushing,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 wither_skeleton,withering,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 wolf,aggressive,0.07%,0.28%,1.75%,5.74%,,17.4,226.5 wolf,synergetic,0.1%,0.4%,2.5%,8.2%,,12.2,158.5 zoglin,aggressive,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 zoglin,anchoring,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 zoglin,bashing,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 zoglin,incombustible,0.04%,0.16%,1.0%,3.28%,,30.5,396.3 zoglin,lifeless,0.06%,0.24%,1.5%,4.92%,,20.3,264.2 zombie,lifeless,0.005%,0.02%,0.125%,0.41%,,243.9,3170.7 zombie_nautilus,bubbly,0.21%,0.84%,5.25%,17.22%,,5.8,75.5 zombie_nautilus,gliding,0.18%,0.72%,4.5%,14.76%,,6.8,88.1 zombie_nautilus,dashing,0.09%,0.36%,2.25%,7.38%,,13.6,176.2 zombie_nautilus,lifeless,0.15%,0.6%,3.75%,12.3%,,8.1,105.7 zombie_horse,bounding,0.05%,0.2%,1.25%,4.1%,,24.4,317.1 zombie_horse,lifeless,0.03%,0.12%,0.75%,2.46%,,40.7,528.5 zombie_villager,lifeless,0.01%,0.04%,0.25%,0.82%,,122.0,1585.4 zombified_piglin,aggressive,0.006%,0.024%,0.15%,0.49%,,203.3,2642.3 zombified_piglin,incombustible,0.0048%,0.019%,0.12%,0.39%,,254.1,3302.8 zombified_piglin,lifeless,0.0055%,0.022%,0.137%,0.45%,,221.7,2882.5 zombified_piglin,rushing,0.0037%,0.015%,0.093%,0.3%,,329.6,4284.8 ================================================ FILE: gm4_particles_pack/README.md ================================================ # Particles Pack Fill your world with beautiful particles by attaching them to armour stands. ### Features - Requires the base [Better Armour Stands]($dynamicLink:gm4_better_armour_stands) data pack - Allows a variety of particles such as bubble, cloud and drip - When a particle is applied, the armour stand will become invisible - Holding a book and quill with "visible" written will highlight nearby invisible stands. Read more about all the options on the [Wiki](https://wiki.gm4.co/Better_Armour_Stands/Particles_Pack). ================================================ FILE: gm4_particles_pack/beet.yaml ================================================ id: gm4_particles_pack name: Particles Pack version: 1.8.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] required: gm4_better_armour_stands: 2.6.0 website: description: Fireflies to flames, add some pezazz to your projects! Allows you to turn Armour Stands into particle sources that you control! recommended: - gm4_poses_pack notes: [] modrinth: project_id: hqLgWYiS video: https://www.youtube.com/watch?v=ZBqmGpAXqmw&t=238s wiki: https://wiki.gm4.co/wiki/Particles_Pack credits: Creator: - Sparks Updated by: - Misode - kindabland Icon Design: - DuckJr ================================================ FILE: gm4_particles_pack/data/gm4_better_armour_stands/tags/function/apply_book.json ================================================ { "values": [ "gm4_particles_pack:apply_book" ] } ================================================ FILE: gm4_particles_pack/data/gm4_better_armour_stands/tags/function/default.json ================================================ { "values": [ "gm4_particles_pack:default" ] } ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/function/apply_book.mcfunction ================================================ # @s = armor_stand to be modified # at @s # run from gm4_better_armour_stands:book/process execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"heart"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 1 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"flame"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 2 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"barrier"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 3 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"fireflies"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 4 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"growing"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 7 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"drip"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 8 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"winter"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 9 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"blossom"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 10 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"autumn"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 11 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"spring"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 12 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"ash"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 13 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"lava"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 14 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"fiesta"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 15 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"ender"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 16 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"enchant"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 17 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"note"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 18 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"cloud"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 100 execute if data storage gm4_better_armour_stands:temp {pages:[{raw:"bubbles"}]} store success score $valid_code gm4_bas_data run scoreboard players set @s gm4_particle 101 execute if score @s gm4_particle matches 100.. run kill @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud,distance=..1,limit=1,sort=nearest] execute if score @s gm4_particle matches 100 run summon area_effect_cloud ~ ~ ~ {Duration:-1,Radius:1,RadiusOnUse:0,custom_particle:{type:"minecraft:cloud"},Tags:["gm4_particles_pack_cloud"]} execute if score @s gm4_particle matches 101 run summon area_effect_cloud ~ ~ ~ {Duration:-1,Radius:1,RadiusOnUse:0,custom_particle:{type:"minecraft:bubble"},Tags:["gm4_particles_pack_cloud"]} data merge entity @s[scores={gm4_particle=1..}] {Invisible:1b,NoGravity:1b} ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/function/default.mcfunction ================================================ # @s = armor_stand # at @s # run from gm4_better_armour_stands:default/check execute if score @s gm4_particle matches 100.. run kill @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud,distance=..1,limit=1,sort=nearest] scoreboard players reset @s gm4_particle ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/function/init.mcfunction ================================================ scoreboard objectives add gm4_particle dummy execute unless score particles_pack gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Particles Pack"} execute unless score particles_pack gm4_earliest_version < particles_pack gm4_modules run scoreboard players operation particles_pack gm4_earliest_version = particles_pack gm4_modules scoreboard players set particles_pack gm4_modules 1 schedule function gm4_particles_pack:main 1t #$moduleUpdateList ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/function/main.mcfunction ================================================ execute as @e[type=armor_stand,scores={gm4_particle=1..}] at @s run function gm4_particles_pack:particle execute as @e[type=area_effect_cloud,tag=gm4_particles_pack_cloud] at @s unless entity @e[type=armor_stand,scores={gm4_particle=100..},distance=..1] run kill @s schedule function gm4_particles_pack:main 16t ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/function/particle.mcfunction ================================================ # @s = armor_stand with a particle score # at @s # run from main execute if score @s gm4_particle matches 1 run particle minecraft:heart ~ ~.2 ~ .2 0 .2 0 1 execute if score @s gm4_particle matches 2 run particle minecraft:flame ~ ~.15 ~ 0 0 0 0 1 force execute if score @s gm4_particle matches 3 run particle minecraft:block_marker{block_state:"minecraft:barrier"} ~ ~.5 ~ 0 0 0 0 1 execute if score @s gm4_particle matches 4 run particle minecraft:end_rod ~ ~ ~ 10 10 10 0 8 force execute if score @s gm4_particle matches 7 run particle minecraft:happy_villager ~ ~.3 ~ 2 .2 2 0 1 execute if score @s gm4_particle matches 8 run particle minecraft:dripping_water ~ ~1 ~ 0.04 0 0.04 1 1 execute if score @s gm4_particle matches 9 run particle minecraft:falling_dust{block_state:"minecraft:snow"} ~ ~4 ~ 2 1 2 0 5 execute if score @s gm4_particle matches 10 run particle minecraft:cherry_leaves ~ ~4 ~ 2 1 2 0 3 execute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.788,0.369,0.047,1.00]} ~ ~4 ~ 2 1 2 0 1 execute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.980,0.753,0.000,1.00]} ~ ~4 ~ 2 1 2 0 1 execute if score @s gm4_particle matches 11 run particle minecraft:tinted_leaves{color:[0.722,0.145,0.027,1.00]} ~ ~4 ~ 2 1 2 0 1 execute if score @s gm4_particle matches 12 run particle minecraft:falling_dust{block_state:"minecraft:lime_wool"} ~ ~4 ~ 2 1 2 0 5 execute if score @s gm4_particle matches 13 run particle minecraft:falling_dust{block_state:"minecraft:black_wool"} ~ ~4 ~ 2 1 2 0 5 execute if score @s gm4_particle matches 14 run particle minecraft:lava ~ ~ ~ 2 0 2 0 5 execute if score @s gm4_particle matches 15 run particle minecraft:totem_of_undying ~ ~4 ~ 2 1 2 0 5 execute if score @s gm4_particle matches 16 run particle minecraft:portal ~ ~ ~ 0 0 0 1 5 execute if score @s gm4_particle matches 17 run particle minecraft:enchant ~ ~ ~ 0 0 0 1 5 execute if score @s gm4_particle matches 18 run particle minecraft:note ~ ~.5 ~ .2 .2 .2 1 1 ================================================ FILE: gm4_particles_pack/data/gm4_particles_pack/guidebook/particles_pack.json ================================================ { "id": "particles_pack", "name": "Particles Pack", "module_type": "expansion", "base_module": "better_armour_stands", "icon": { "id": "minecraft:armor_stand" }, "criteria": { "modify_armor_stand": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:better_armour_stands": true } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "modify_armor_stand" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.particles_pack.description", "fallback": "The following codes will turn the armour stand into an invisible particle emitter:" }, { "text": "\n\n- " }, { "text": "autumn", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "autumn" } }, { "text": "\n- " }, { "text": "blossom", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "blossom" } }, { "text": "\n- " }, { "text": "spring", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "spring" } }, { "text": "\n- " }, { "text": "winter", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "winter" } }, { "text": "\n- " }, { "text": "barrier", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "barrier" } } ], [ { "text": "\n- " }, { "text": "bubbles", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "bubbles" } }, { "text": "\n- " }, { "text": "cloud", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "cloud" } }, { "text": "\n- " }, { "text": "drip", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "drip" } }, { "text": "\n- " }, { "text": "enchant", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "enchant" } }, { "text": "\n- " }, { "text": "ender", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "ender" } }, { "text": "\n- " }, { "text": "fiesta", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "fiesta" } }, { "text": "\n- " }, { "text": "fireflies", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "fireflies" } }, { "text": "\n- " }, { "text": "flame", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "flame" } }, { "text": "\n- " }, { "text": "growing", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "growing" } }, { "text": "\n- " }, { "text": "heart", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "heart" } } ], [ { "text": "\n- " }, { "text": "lava", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "lava" } }, { "text": "\n- " }, { "text": "note", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "note" } }, { "text": "\n- " }, { "text": "ash", "hover_event": { "action": "show_text", "value": [ { "translate": "text.gm4.guidebook.better_armour_stands.copy_code", "fallback": "Click to copy", "color": "dark_gray", "italic": true } ] }, "click_event": { "action": "copy_to_clipboard", "value": "ash" } } ] ] } ] } ================================================ FILE: gm4_particles_pack/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.particles_pack,"Fireflies to flames, add some pezazz to your projects! Allows you to turn Armour Stands into particle sources that you control!" text.gm4.guidebook.particles_pack.description,The following codes will turn the armour stand into an invisible particle emitter: ================================================ FILE: gm4_percurro_shamir/README.md ================================================ # Percurro Shamir Get a better hit on your target by being teleported behind it! ### Features - All attacking items (Swords/Axes/Trident/Mace) can have the Shamir applied - When attacking a target the player is teleported 6 blocks behind the target and the target is made to face the player - Builds on Gamemode 4's comprehensive extension to enchantments, [Metallurgy]($dynamicLink:gm4_metallurgy) ================================================ FILE: gm4_percurro_shamir/assets/translations.csv ================================================ key,en_us item.gm4.shamir.percurro,Percurro Shamir text.gm4.guidebook.module_desc.percurro_shamir,Adds the 'Percurro' Shamir to Metallurgy! Weapons with Percurro let you teleport past your enemies in the blink of an eye! text.gm4.guidebook.percurro_shamir.description,Percurro teleports the user behind their target when attacking. text.gm4.guidebook.percurro_shamir.usage,"The Percurro Shamir is found on Curie's Bismium Bands. It can be placed onto swords, axes, and tridents.\n\nAttacking a mob teleports the user up to 6 blocks behind the target, turning to face the target." ================================================ FILE: gm4_percurro_shamir/beet.yaml ================================================ id: gm4_percurro_shamir name: Percurro Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 model_data: - item: weapons reference: shamir/percurro template: name: shamir metal: curies_bismium textures_path: gm4_metallurgy:item/shamir/curies_bismium website: description: Adds the 'Percurro' Shamir to Metallurgy! Weapons with Percurro let you teleport past your enemies in the blink of an eye! recommended: [] notes: [] modrinth: project_id: MrSTch8u wiki: https://wiki.gm4.co/wiki/Metallurgy/Percurro_Shamir credits: Creator: - Bloo Icon Design: - BPR ================================================ FILE: gm4_percurro_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_percurro_shamir:check_item_validity" ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_metallurgy/tags/function/summon_band/curies_bismium.json ================================================ { "values":[ "gm4_percurro_shamir:summon_band" ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/advancement/use.json ================================================ { "rewards": { "function": "gm4_percurro_shamir:search_destination" }, "criteria": { "hit_entity": { "trigger": "minecraft:player_hurt_entity", "conditions": { "damage": { "source_entity": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'percurro'}}" } } } } } } } } } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'percurro'}}] if items entity @s contents #gm4_percurro_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_0.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_1 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_1.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_2 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_2.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_3 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_3.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_4 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_4.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-5 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n1 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n1.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n2 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n2.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination positioned ~ ~-1 ~ run function gm4_percurro_shamir:check_teleport_destination/y_n3 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/check_teleport_destination/y_n3.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from teleport # check 1x8x1 cube around target execute if block ~ ~ ~ #gm4_percurro_shamir:valid_destination run function gm4_percurro_shamir:teleport execute unless block ~ ~ ~ #gm4_percurro_shamir:valid_destination run playsound minecraft:item.shield.break player @s ~ ~ ~ 0.4 0.4 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/init.mcfunction ================================================ execute unless score percurro_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Percurro Shamir"} execute unless score percurro_shamir gm4_earliest_version < percurro_shamir gm4_modules run scoreboard players operation percurro_shamir gm4_earliest_version = percurro_shamir gm4_modules scoreboard players set percurro_shamir gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/search_destination.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at @s # run from advancement gm4_percurro_shamir:use # place temporary departion marker summon minecraft:area_effect_cloud ~ ~ ~ {Tags:["gm4_percurro_depart"],Duration:1,custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} # search for valid destination and teleport execute positioned ^ ^ ^6 run function gm4_percurro_shamir:check_teleport_destination/y_0 # visuals particle minecraft:campfire_cosy_smoke ~ ~ ~ .1 1 .1 0.03 20 # revoke advancement advancement revoke @s only gm4_percurro_shamir:use ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/curies_bismium loot spawn ~ ~ ~ loot gm4_percurro_shamir:band ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/function/teleport.mcfunction ================================================ # @s = player hitting a mob with a percurro shamir # at ^ ^ ^4 # run from any one of the functions in check_teleport_destination/ # teleport to target coordinate tp @s ~ ~ ~ # adjust facing execute at @s facing entity @e[type=area_effect_cloud,tag=gm4_percurro_depart,limit=1] eyes run tp @s ~ ~ ~ ~ ~ # remove marker area_effect_cloud kill @e[type=area_effect_cloud,tag=gm4_percurro_depart] # visuals and sounds particle minecraft:campfire_cosy_smoke ~ ~ ~ .1 1 .1 0.03 3 playsound minecraft:entity.illusioner.cast_spell master @s ~ ~ ~ 1 1.2 playsound minecraft:entity.illusioner.cast_spell master @a[distance=0.01..6] ~ ~ ~ 1 1 ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/guidebook/percurro_shamir.json ================================================ { "id": "percurro_shamir", "name": "Percurro Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_percurro_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'percurro'}}" } } ] } }, "obtain_percurro_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'percurro'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.percurro_shamir.description", "fallback": "Percurro teleports the user behind their target when attacking." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_percurro_shamir", "obtain_percurro_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.percurro_shamir.usage", "fallback": "The Percurro Shamir is found on Curie's Bismium Bands. It can be placed onto swords, axes, and tridents.\n\nAttacking a mob teleports the user up to 6 blocks behind the target, turning to face the target." } ] ] } ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:curies_bismium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_percurro_shamir:shamir/percurro"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'percurro'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.percurro", "fallback": "Percurro Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/tags/block/valid_destination.json ================================================ { "values": [ "#gm4:no_collision", "#minecraft:fence_gates", "#minecraft:fences", "#minecraft:leaves", "#minecraft:trapdoors", "#minecraft:walls", "minecraft:brewing_stand", "minecraft:cobweb", "minecraft:comparator", "minecraft:end_rod", "minecraft:iron_bars", "minecraft:repeater", "minecraft:snow" ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:axes", "#minecraft:swords", "minecraft:mace", "minecraft:trident" ] } ================================================ FILE: gm4_percurro_shamir/data/gm4_percurro_shamir/test/attack_player.mcfunction ================================================ # @template gm4:test_platform_large # @dummy ~1.5 ~1 ~1.5 # @optional execute positioned ~3.5 ~1 ~2.5 run dummy PercurroVictim spawn execute at @s run tp @s ~ ~ ~ facing entity PercurroVictim item replace entity @s weapon.mainhand with iron_sword[custom_data={gm4_metallurgy:{has_shamir:1b,active_shamir:"percurro"}}] await delay 3s dummy @s attack PercurroVictim await delay 1t execute positioned ~6 ~1 ~3 run assert entity @s[dx=1,dy=1,dz=1] assert entity @s[y_rotation=110..120,x_rotation=-10..10] ================================================ FILE: gm4_phantom_scarecrows/README.md ================================================ # Phantom Scarecrows Do you regret that phantoms were added to the game but don't want to change any gamerules? This modular data pack lets you create phantom scarecrows that shoot homing fireqorkd projectiles at nearby phantoms to protect your base! Phantom Scarecrow firing missile ### Features - Equipping a skull of an undead mob (Skeleton, Zombie or Wither Skeleton) to an armour stand along with a chestplate enchanted with a curse (Vanishing or Binding) will transform the armour stand into a Phantom Scarecrow. - When a phantom flies within 25 blocks of the scarecrow, a homing firework will be fired towards the targeted phantom that will kill it in one shot. - Adds one new custom advancement for getting struck by a homing phantom missile. ================================================ FILE: gm4_phantom_scarecrows/assets/translations.csv ================================================ key,en_us advancement.gm4.phantom_scarecrows.title,Not so smart defenses advancement.gm4.phantom_scarecrows.description,Get hit by a Phantom Scarecrow text.gm4.guidebook.module_desc.phantom_scarecrows,Set up Scarecrows that shoot homing rockets at Phantoms! text.gm4.guidebook.phantom_scarecrows.creation,Placing a skull or zombie head on an armour stand and equipping it with a cursed chestplate will transform it into a phantom scarecrow. text.gm4.guidebook.phantom_scarecrows.usage,"Phantom scarecrows will shoot fireworks at phantoms above them.\n\nPhantoms shot by these projectiles will instantly die, but if the firework projectile hits a block, it will explode." ================================================ FILE: gm4_phantom_scarecrows/beet.yaml ================================================ id: gm4_phantom_scarecrows name: Phantom Scarecrows version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick model_data: - item: firework_rocket reference: gui/advancement/phantom_scarecrows template: advancement website: description: Set up Scarecrows that shoot homing rockets at Phantoms! recommended: [] notes: [] modrinth: project_id: OQYrrgEP wiki: https://wiki.gm4.co/wiki/Phantom_Scarecrows credits: Creator: - Bloo Inspired by: - Chopper2112 Icon Design: - DuckJr ================================================ FILE: gm4_phantom_scarecrows/data/gm4/advancement/phantom_scarecrows.json ================================================ { "display": { "icon": { "id": "minecraft:firework_rocket", "components": { "minecraft:custom_model_data": {"strings":["gm4_phantom_scarecrows:gui/advancement/phantom_scarecrows"]} } }, "title": { "translate": "advancement.gm4.phantom_scarecrows.title", "fallback": "Not so smart defenses" }, "description": { "translate": "advancement.gm4.phantom_scarecrows.description", "fallback": "Get hit by a Phantom Scarecrow", "color": "gray" }, "hidden": true }, "parent": "gm4:root", "criteria": { "phantom_scarecrows_hurt": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/aim.mcfunction ================================================ # @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] # at @s # ran from pulse_check #homing execute anchored eyes facing entity @e[type=minecraft:phantom,tag=!smithed.entity,limit=1,sort=nearest] eyes run tp @s ~ ~ ~ ~ ~ execute at @s run function gm4_phantom_scarecrows:propulsion ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/create.mcfunction ================================================ # @s = armor stand with cursed chestplate # at world spawn # ran from creation_checks #initialise scoreboard and add tags tag @s add gm4_phantom_scarecrow tag @s add gm4_no_edit tag @s add smithed.entity scoreboard players add @s gm4_ps_time 0 scoreboard players set @s gm4_entity_version 1 #lock slots data merge entity @s {Invisible:0b,Invulnerable:0b,DisabledSlots:2039583,ShowArms:1b,Pose:{LeftArm:[346f,0f,274f],RightArm:[350f,0f,85f]}} ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/explode.mcfunction ================================================ # @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] with phantom within 0.5 blocks # at @s # ran from propulsion #generate random color execute store result score color gm4_ps_time run random value 0..2 #explosion execute if score color gm4_ps_time matches 0 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:"minecraft:firework_rocket",count:1,components:{"minecraft:fireworks":{explosions:[{shape:"small_ball",has_twinkle:1b,has_trail:0b,colors:[7211016],fade_colors:[3671815]}]}}}} execute if score color gm4_ps_time matches 1 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:"minecraft:firework_rocket",count:1,components:{"minecraft:fireworks":{explosions:[{shape:"small_ball",has_twinkle:1b,has_trail:0b,colors:[4018687],fade_colors:[7382527]}]}}}} execute if score color gm4_ps_time matches 2 run summon minecraft:firework_rocket ~ ~ ~ {Silent:1b,LifeTime:0,FireworksItem:{id:"minecraft:firework_rocket",count:1,components:{"minecraft:fireworks":{explosions:[{shape:"small_ball",has_twinkle:1b,has_trail:0b,colors:[16773153],fade_colors:[15531886]}]}}}} #advancement advancement grant @a[distance=..3,gamemode=!spectator] only gm4:phantom_scarecrows kill @e[type=phantom,distance=..0.5,limit=1,sort=nearest] #kill other rockets within explosion radius kill @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket,distance=..3] kill @s ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/init.mcfunction ================================================ scoreboard objectives add gm4_ps_time dummy scoreboard objectives add gm4_entity_version dummy execute unless score phantom_scarecrows gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Phantom Scarecrows"} execute unless score phantom_scarecrows gm4_earliest_version < phantom_scarecrows gm4_modules run scoreboard players operation phantom_scarecrows gm4_earliest_version = phantom_scarecrows gm4_modules scoreboard players set phantom_scarecrows gm4_modules 1 schedule function gm4_phantom_scarecrows:main 1t schedule function gm4_phantom_scarecrows:tick 1t #$moduleUpdateList ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/main.mcfunction ================================================ #creation execute as @e[type=armor_stand,tag=!smithed.entity,tag=!gm4_phantom_scarecrow] if items entity @s armor.chest *[enchantments~[{enchantments:"#minecraft:curse"}]] if items entity @s armor.head #gm4_phantom_scarecrows:skulls run function gm4_phantom_scarecrows:create #launch cooldown scoreboard players add @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=..4}] gm4_ps_time 1 execute as @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=5..}] at @s positioned ~ ~20 ~ if entity @e[type=phantom,distance=..25] positioned ~ ~-18.5 ~ run function gm4_phantom_scarecrows:shoot schedule function gm4_phantom_scarecrows:main 16t ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/propulsion.mcfunction ================================================ # @s = @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] # at @s (updated after rotation) # ran from aim #move rocket forwards tp ^ ^ ^.8 particle firework ~ ~ ~ 0 0 0 0 1 force execute at @s unless block ~ ~ ~ #gm4:no_collision run function gm4_phantom_scarecrows:explode execute at @s if entity @e[type=phantom,tag=!smithed.entity,distance=..0.5] run function gm4_phantom_scarecrows:explode ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/shoot.mcfunction ================================================ # @s = @e[type=armor_stand,tag=gm4_phantom_scarecrow,scores={gm4_ps_time=5..}] # at @s # ran from main summon area_effect_cloud ~ ~ ~ {Radius:0.0f,Tags:["gm4_phantom_scarecrow_rocket"],Duration:50,custom_particle:{type:"minecraft:block",block_state:{Name:"minecraft:air"}}} playsound minecraft:entity.firework_rocket.launch block @a ~ ~ ~ 2 1 scoreboard players set @s gm4_ps_time 0 ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/function/tick.mcfunction ================================================ #controll rockets if any exist execute as @e[type=area_effect_cloud,tag=gm4_phantom_scarecrow_rocket] at @s run function gm4_phantom_scarecrows:aim schedule function gm4_phantom_scarecrows:tick 1t ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/guidebook/phantom_scarecrows.json ================================================ { "id": "phantom_scarecrows", "name": "Phantom Scarecrows", "module_type": "module", "icon": { "id": "minecraft:skeleton_skull" }, "criteria": { "obtain_skull": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:skeleton_skull", "minecraft:zombie_head", "minecraft:wither_skeleton_skull" ] } ] } }, "find_phantom_scarecrow": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "looking_at": { "type": "minecraft:armor_stand", "nbt": "{Tags:[\"gm4_phantom_scarecrow\"]}" } } } } ] } } }, "sections": [ { "name": "creation", "enable": [], "requirements": [ [ "obtain_skull" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.phantom_scarecrows.creation", "fallback": "Placing a skull or zombie head on an armour stand and equipping it with a cursed chestplate will transform it into a phantom scarecrow." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "find_phantom_scarecrow" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.phantom_scarecrows.usage", "fallback": "Phantom scarecrows will shoot fireworks at phantoms above them.\n\nPhantoms shot by these projectiles will instantly die, but if the firework projectile hits a block, it will explode." } ] ], "grants": [ "creation" ] } ] } ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/tags/item/skulls.json ================================================ { "values": [ "minecraft:wither_skeleton_skull", "minecraft:skeleton_skull", "minecraft:zombie_head" ] } ================================================ FILE: gm4_phantom_scarecrows/data/gm4_phantom_scarecrows/test/kill_phantom.mcfunction ================================================ # @template gm4:test_platform_large # @timeout 150 summon armor_stand ~4.5 ~1 ~2.5 execute positioned ~4.5 ~1 ~2.5 run item replace entity @e[type=armor_stand,dx=0] armor.chest with minecraft:iron_chestplate[enchantments={binding_curse:1}] execute positioned ~4.5 ~1 ~2.5 run item replace entity @e[type=armor_stand,dx=0] armor.head with minecraft:wither_skeleton_skull await delay 1s assert entity @e[type=armor_stand,tag=gm4_phantom_scarecrow] inside summon phantom ~6.5 ~2.5 ~1.5 {Tags:[gm4_test_phantom]} await not entity @e[type=phantom,tag=gm4_test_phantom,distance=..20] ================================================ FILE: gm4_pig_tractors/README.md ================================================ # Pig Tractors Pig are great at eating food, so they should be great at farming. ### Features - Pigs when driven over fully grown crops will harvest and replant them with available seeds - Holding a hoe will till the soil below the pig. - Tilling soil using a pig has a chance to pull up items such as mushrooms or golden apples. ================================================ FILE: gm4_pig_tractors/assets/translations.csv ================================================ key,en_us advancement.gm4.pig_tractors.title,Oink Tractors advancement.gm4.pig_tractors.description,Till some ground by holding a hoe on a Pig Tractor! text.gm4.guidebook.module_desc.pig_tractors,"Ride pigs through fields to quickly harvest and plant crops! Who knows, maybe you will even dig up some useful things in the process." text.gm4.guidebook.pig_tractors.tilling,"Riding a pig while holding a hoe will till grass, dirt, or coarse dirt below the pig, with a chance to drop some loot." text.gm4.guidebook.pig_tractors.harvesting,"Driving over crops with a Pig Tractor will harvest them.\n\nIf the farmer has seeds or crops in their inventory, the crops will be automatically replanted." text.gm4.guidebook.pig_tractors.planting_on_empty,"Driving over empty farmland will plant any crops in the farmer's inventory, prioritizing crops in hand." ================================================ FILE: gm4_pig_tractors/beet.yaml ================================================ id: gm4_pig_tractors name: Pig Tractors version: 1.9.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: website: description: Ride pigs through fields to quickly harvest and plant crops! Who knows, maybe you will even dig up some useful things in the process. recommended: [] notes: [] modrinth: project_id: 8lN3MtcQ model_data: - item: saddle reference: gui/advancement/pig_tractors template: advancement video: https://www.youtube.com/watch?v=7i0WFHUfBXs wiki: https://wiki.gm4.co/wiki/Pig_Tractors credits: Creator: - Bloo Icon Design: - Hozz ================================================ FILE: gm4_pig_tractors/data/gm4/advancement/pig_tractors.json ================================================ { "display": { "icon": { "id": "saddle", "components": { "minecraft:custom_model_data": {"strings":["gm4_pig_tractors:gui/advancement/pig_tractors"]} } }, "title": { "translate": "advancement.gm4.pig_tractors.title", "fallback": "Oink Tractors" }, "description": { "translate": "advancement.gm4.pig_tractors.description", "fallback": "Till some ground by holding a hoe on a Pig Tractor!", "color": "gray" } }, "parent": "gm4:root", "criteria": { "ride_pig_tractor": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/air.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_pig_tractors:hoes" } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_pig_tractors:hoes" } } } } ] }, { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_air" } ] } } }, "rewards": { "function": "gm4_pig_tractors:till/select_position" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/beetroots.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:enter_block", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_farmland" } ], "block": "minecraft:beetroots", "state": { "age": "3" } } } }, "rewards": { "function": "gm4_pig_tractors:harvest/beetroots" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/carrots.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:enter_block", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_farmland" } ], "block": "minecraft:carrots", "state": { "age": "7" } } } }, "rewards": { "function": "gm4_pig_tractors:harvest/carrots" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/empty_farmland.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_farmland" } ] } } }, "rewards": { "function": "gm4_pig_tractors:harvest/empty_farmland" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/potatoes.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:enter_block", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_farmland" } ], "block": "minecraft:potatoes", "state": { "age": "7" } } } }, "rewards": { "function": "gm4_pig_tractors:harvest/potatoes" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/advancement/block_detection/wheat.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:enter_block", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/vehicle/pig/in_farmland" } ], "block": "minecraft:wheat", "state": { "age": "7" } } } }, "rewards": { "function": "gm4_pig_tractors:harvest/wheat" } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/beetroots.mcfunction ================================================ # Confirms the block type and selects it for harvesting # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/beetroots # revoke advancement revoke @s only gm4_pig_tractors:block_detection/beetroots # check for targeted block execute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:beetroots[age=3] run function gm4_pig_tractors:harvest/block/beetroots ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/beetroots.mcfunction ================================================ # Harvests beetroot and tries to replant it # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/beetroots # destroy crop setblock ~ ~ ~ air destroy # item magnet function gm4_pig_tractors:utility/item_magnet # try to replant beetroot if the player isn't holding a seed scoreboard players set $planted_successfully gm4_pig_tractors 0 execute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds # plant other crop if beetroot seed planting failed execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/carrots.mcfunction ================================================ # Harvests carrots and tries to replant it # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/carrots # destroy crop setblock ~ ~ ~ air destroy # item magnet function gm4_pig_tractors:utility/item_magnet # try to replant carrot if the player isn't holding a seed scoreboard players set $planted_successfully gm4_pig_tractors 0 execute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/carrot # plant other crop if carrot planting failed execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/potatoes.mcfunction ================================================ # Harvests potato and tries to replant it # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/potatoes # destroy crop setblock ~ ~ ~ air destroy # item magnet function gm4_pig_tractors:utility/item_magnet # try to replant potato if the player isn't holding a seed scoreboard players set $planted_successfully gm4_pig_tractors 0 execute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/potato # plant other crop if potato planting failed execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/block/wheat.mcfunction ================================================ # Harvests wheat and tries to replant it # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/wheat # destroy crop setblock ~ ~ ~ air destroy # item magnet function gm4_pig_tractors:utility/item_magnet # try to replant wheat seeds if the player isn't holding a seed scoreboard players set $planted_successfully gm4_pig_tractors 0 execute unless predicate gm4_pig_tractors:player/equipment/holding_seeds run function gm4_pig_tractors:plant/item/wheat_seeds # plant other crop if wheat seed planting failed execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/carrots.mcfunction ================================================ # Confirms the block type and selects it for harvesting # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/carrots # revoke advancement revoke @s only gm4_pig_tractors:block_detection/carrots # check for targeted block execute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:carrots[age=7] run function gm4_pig_tractors:harvest/block/carrots ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/empty_farmland.mcfunction ================================================ # Confirms the block type and selects it for harvesting # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/empty_farmland # revoke advancement revoke @s only gm4_pig_tractors:block_detection/empty_farmland # place fresh crop execute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ #gm4_pig_tractors:replaceable run function gm4_pig_tractors:plant/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/potatoes.mcfunction ================================================ # Confirms the block type and selects it for harvesting # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/potatoes # revoke advancement revoke @s only gm4_pig_tractors:block_detection/potatoes # check for targeted block execute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:potatoes[age=7] run function gm4_pig_tractors:harvest/block/potatoes ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/harvest/wheat.mcfunction ================================================ # Confirms the block type and selects it for harvesting # @s = player on a pig tractor on farmland # at @s # run from advancement gm4_pig_tractors:block_detection/wheat # revoke advancement revoke @s only gm4_pig_tractors:block_detection/wheat # check for targeted block execute align xyz positioned ~0.5 ~ ~0.5 if block ~ ~ ~ minecraft:wheat[age=7] run function gm4_pig_tractors:harvest/block/wheat ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/init.mcfunction ================================================ execute unless score pig_tractors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Pig Tractors"} execute unless score pig_tractors gm4_earliest_version < pig_tractors gm4_modules run scoreboard players operation pig_tractors gm4_earliest_version = pig_tractors gm4_modules scoreboard players set pig_tractors gm4_modules 1 scoreboard objectives add gm4_pig_tractors dummy #$moduleUpdateList ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/beetroots.mcfunction ================================================ # places a beetroot plant # @s = player requesting beetroot planting # at item planting location # run from gm4_pig_tractors:plant/item/beetroot_seeds # place block setblock ~ ~ ~ beetroots destroy # sound playsound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/carrots.mcfunction ================================================ # places a carrot plant # @s = player requesting carrot planting # at item planting location # run from gm4_pig_tractors:plant/item/carrot # place block setblock ~ ~ ~ carrots destroy # sound playsound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/potatoes.mcfunction ================================================ # places a potato plant # @s = player requesting potato planting # at item planting location # run from gm4_pig_tractors:plant/item/potato # place block setblock ~ ~ ~ potatoes destroy # sound playsound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/block/wheat.mcfunction ================================================ # places a wheat plant # @s = player requesting wheat planting # at item planting location # run from gm4_pig_tractors:plant/item/wheat_seeds # place block setblock ~ ~ ~ wheat destroy # sound playsound minecraft:block.grass.place block @a[distance=..9] ~ ~ ~ 0.6 0.6 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/beetroot_seeds.mcfunction ================================================ # uses beetroot from the players inventory and plants it # @s = player requesting beetroot planting # at item planting location # run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/ # sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise # remove seed from player execute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s beetroot_seeds 1 execute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s beetroot_seeds 0 # plant if player had seed execute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/beetroots ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/carrot.mcfunction ================================================ # uses carrot from the players inventory and plants it # @s = player requesting carrot planting # at item planting location # run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/ # sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise # remove seed from player execute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s carrot 1 execute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s carrot 0 # plant if player had seed execute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/carrots ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/potato.mcfunction ================================================ # uses potato from the players inventory and plants it # @s = player requesting potato planting # at item planting location # run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/ # sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise # remove seed from player execute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s potato 1 execute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s potato 0 # plant if player had seed execute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/potatoes ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/item/wheat_seeds.mcfunction ================================================ # uses wheat from the players inventory and plants it # @s = player requesting wheat planting # at item planting location # run from gm4_pig_tractors:plant/use_mainhand_seeds and gm4_pig_tractors:plant/use_offhand_seeds and gm4_pig_tractors:plant/use_predefined_order and gm4_pig_tractors:harvest/block/ # sets fake player flag $planted_successfully in gm4_pig_tractors to 1 if planting was successful, to 0 otherwise # remove seed from player execute if entity @s[gamemode=!creative] store success score $planted_successfully gm4_pig_tractors run clear @s wheat_seeds 1 execute if entity @s[gamemode=creative] store success score $planted_successfully gm4_pig_tractors run clear @s wheat_seeds 0 # plant if player had seed execute if score $planted_successfully gm4_pig_tractors matches 1 run function gm4_pig_tractors:plant/block/wheat ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/select_type.mcfunction ================================================ # Decides which seed to use upon replanting # @s = player on a pig tractor # at planting location of seed # run from functions in gm4_pig_tractors:till/blocks/ # fake player for if-else scoreboard players set $pulled_seeds gm4_pig_tractors 0 # check if player is holding seeds in mainhand execute if predicate gm4_pig_tractors:player/equipment/mainhand/seeds run function gm4_pig_tractors:plant/use_mainhand_seeds # check if player is holding seeds in offhand execute if score $pulled_seeds gm4_pig_tractors matches 0 if predicate gm4_pig_tractors:player/equipment/offhand/seeds run function gm4_pig_tractors:plant/use_offhand_seeds # otherwise, use predefined order execute if score $pulled_seeds gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/use_predefined_order ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_mainhand_seeds.mcfunction ================================================ # reads item id from mainhand and plants seeds depending on type # @s = player on pig tractor queued for replanting # at location of seeds to be planted # run from gm4_pig_tractors:plant/select_type # test type execute if predicate gm4_pig_tractors:player/equipment/mainhand/beetroot_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds execute if predicate gm4_pig_tractors:player/equipment/mainhand/carrot run function gm4_pig_tractors:plant/item/carrot execute if predicate gm4_pig_tractors:player/equipment/mainhand/potato run function gm4_pig_tractors:plant/item/potato execute if predicate gm4_pig_tractors:player/equipment/mainhand/wheat_seeds run function gm4_pig_tractors:plant/item/wheat_seeds # set fake player scoreboard players set $pulled_seeds gm4_pig_tractors 1 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_offhand_seeds.mcfunction ================================================ # reads item id from offhand and plants seeds depending on type # @s = player on pig tractor queued for replanting # at location of seeds to be planted # run from gm4_pig_tractors:plant/select_type # test type execute if predicate gm4_pig_tractors:player/equipment/offhand/beetroot_seeds run function gm4_pig_tractors:plant/item/beetroot_seeds execute if predicate gm4_pig_tractors:player/equipment/offhand/carrot run function gm4_pig_tractors:plant/item/carrot execute if predicate gm4_pig_tractors:player/equipment/offhand/potato run function gm4_pig_tractors:plant/item/potato execute if predicate gm4_pig_tractors:player/equipment/offhand/wheat_seeds run function gm4_pig_tractors:plant/item/wheat_seeds # set fake player scoreboard players set $pulled_seeds gm4_pig_tractors 1 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/plant/use_predefined_order.mcfunction ================================================ # tries to use seed from the inventory using a alphabetical order # @s = player on pig tractor queued for replanting # at location of seeds to be planted # run from gm4_pig_tractors:plant/select_type function gm4_pig_tractors:plant/item/beetroot_seeds execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/carrot execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/potato execute if score $planted_successfully gm4_pig_tractors matches 0 run function gm4_pig_tractors:plant/item/wheat_seeds ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/coarse_dirt.mcfunction ================================================ # Applies a tilling action to coarse_dirt # @s = player on a pig tractor # at block being tilled # run from gm4_pig_tractors:till/select_type # place new block setblock ~ ~ ~ farmland[moisture=7] replace # chance to spawn additional loot loot spawn ~ ~1 ~ loot gm4_pig_tractors:till/coarse_dirt # item magnet function gm4_pig_tractors:utility/item_magnet # sound playsound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/dirt.mcfunction ================================================ # Applies a tilling action to dirt # @s = player on a pig tractor # at block being tilled # run from gm4_pig_tractors:till/select_type # place new block setblock ~ ~ ~ farmland[moisture=7] replace # chance to spawn additional loot loot spawn ~ ~1 ~ loot gm4_pig_tractors:till/dirt # item magnet function gm4_pig_tractors:utility/item_magnet # sound playsound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/till/block/grass_block.mcfunction ================================================ # Applies a tilling action to grass_block # @s = player on a pig tractor # at block being tilled # run from gm4_pig_tractors:till/select_type # place new block setblock ~ ~ ~ farmland[moisture=7] replace # chance to spawn additional loot loot spawn ~ ~1 ~ loot gm4_pig_tractors:till/grass_block # item magnet function gm4_pig_tractors:utility/item_magnet # sound playsound minecraft:item.hoe.till player @s ~ ~ ~ 0.8 1 ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/till/select_position.mcfunction ================================================ # Selects a block to be tilled and tills it # @s = player on a pig tractor in a replaceable block # at @s # run from advancement gm4_pig_tractors:block_detection/air # revoke advancement revoke @s only gm4_pig_tractors:block_detection/air # check for targeted block execute align xyz positioned ~0.5 ~-1 ~0.5 if block ~ ~ ~ #gm4_pig_tractors:tillable if block ~ ~1 ~ #gm4_pig_tractors:replaceable run function gm4_pig_tractors:till/select_type ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/till/select_type.mcfunction ================================================ # Decides what to do when tilling a block # @s = player on a pig tractor # at block below the pig, aligned to block center in xz and block bottom in z # run from gm4_pig_tractors:till/select_position # destroy top block (this is a replaceable block, by function call) setblock ~ ~1 ~ air destroy # dirt execute if block ~ ~ ~ dirt run function gm4_pig_tractors:till/block/dirt # grass execute if block ~ ~ ~ grass_block run function gm4_pig_tractors:till/block/grass_block # coarse dirt execute if block ~ ~ ~ coarse_dirt run function gm4_pig_tractors:till/block/coarse_dirt # award advancement advancement grant @s only gm4:pig_tractors ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/function/utility/item_magnet.mcfunction ================================================ # Teleports nearby items to the player # @s = player on a pig tractor that has just harvested somthing # at @s # run from functions in gm4_pig_tractors:harvest/block/ and gm4_pig_tractors:till/block/ # search items tag @e[type=item,distance=..3] add gm4_pig_tractors_item # decrease pickup delay execute as @e[type=item,tag=gm4_pig_tractors_item] run data modify entity @s PickupDelay set value 0 # teleport items tp @e[type=item,tag=gm4_pig_tractors_item] @s # detag tag @e[type=item] remove gm4_pig_tractors_item ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/guidebook/pig_tractors.json ================================================ { "id": "pig_tractors", "name": "Pig Tractors", "module_type": "module", "icon": { "id": "minecraft:iron_hoe" }, "criteria": { "ride_pig": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:pig" } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:pig", "nbt": "{NoAI:1b}" } } } } ] } }, "till_soil": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:pig_tractors": true } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "ride_pig" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.pig_tractors.tilling", "fallback": "Riding a pig while holding a hoe will till grass, dirt, or coarse dirt below the pig, with a chance to drop some loot." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "till_soil" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.pig_tractors.harvesting", "fallback": "Driving over crops with a Pig Tractor will harvest them.\n\nIf the farmer has seeds or crops in their inventory, the crops will be automatically replanted." } ], [ { "translate": "text.gm4.guidebook.pig_tractors.planting_on_empty", "fallback": "Driving over empty farmland will plant any crops in the farmer's inventory, prioritizing crops in hand." } ] ], "grants": [ "description" ] } ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/coarse_dirt.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 50, "name": "minecraft:bone" }, { "type": "minecraft:item", "weight": 200, "name": "minecraft:clay_ball", "functions": [ { "function": "minecraft:set_count", "count": 1 }, { "function": "minecraft:set_count", "count": { "type": "minecraft:binomial", "n": 3, "p": 0.87 }, "add": true } ] }, { "type": "minecraft:item", "weight": 300, "name": "minecraft:gravel" }, { "type": "minecraft:empty", "weight": 3000 } ] } ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/dirt.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 110, "name": "minecraft:bone" }, { "type": "minecraft:item", "weight": 110, "name": "minecraft:red_mushroom" }, { "type": "minecraft:item", "weight": 180, "name": "minecraft:brown_mushroom" }, { "type": "minecraft:empty", "weight": 3000 } ] } ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/loot_table/till/grass_block.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 4, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:golden_carrot" }, { "type": "minecraft:item", "weight": 12, "name": "minecraft:beetroot" }, { "type": "minecraft:item", "weight": 12, "name": "minecraft:carrot" }, { "type": "minecraft:item", "weight": 12, "name": "minecraft:poisonous_potato" }, { "type": "minecraft:item", "weight": 12, "name": "minecraft:potato" }, { "type": "minecraft:item", "weight": 50, "name": "minecraft:bone" }, { "type": "minecraft:item", "weight": 50, "name": "minecraft:red_mushroom" }, { "type": "minecraft:item", "weight": 260, "name": "minecraft:brown_mushroom" }, { "type": "minecraft:empty", "weight": 3000 } ] } ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/holding_seeds.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/equipment/mainhand/seeds" }, { "condition": "minecraft:reference", "name": "gm4_pig_tractors:player/equipment/offhand/seeds" } ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/beetroot_seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:beetroot_seeds" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/carrot.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:carrot" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/potato.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:potato" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_pig_tractors:seeds" } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/mainhand/wheat_seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:wheat_seeds" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/beetroot_seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:beetroot_seeds" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/carrot.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:carrot" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/potato.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:potato" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "#gm4_pig_tractors:seeds" } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/equipment/offhand/wheat_seeds.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:wheat_seeds" ] } } } } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/vehicle/pig/in_air.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:pig", "location": { "block": { "blocks": "#gm4_pig_tractors:replaceable" } } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "nbt": "{Tags:[\"smithed.entity\"]}" } } } } ] ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/predicate/player/vehicle/pig/in_farmland.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:pig", "location": { "block": { "blocks": [ "minecraft:farmland" ] } } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "nbt": "{Tags:[\"smithed.entity\"]}" } } } } ] ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/tags/block/replaceable.json ================================================ { "values": [ "#minecraft:air", "#gm4:foliage" ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/tags/block/tillable.json ================================================ { "values": [ "minecraft:coarse_dirt", "minecraft:dirt", "minecraft:grass_block" ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/tags/item/hoes.json ================================================ { "values": [ "minecraft:diamond_hoe", "minecraft:golden_hoe", "minecraft:iron_hoe", "minecraft:netherite_hoe", "minecraft:stone_hoe", "minecraft:wooden_hoe" ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/tags/item/seeds.json ================================================ { "values": [ "minecraft:beetroot_seeds", "minecraft:carrot", "minecraft:potato", "minecraft:wheat_seeds" ] } ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/test/harvest_carrots.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~ ~1 farmland setblock ~1 ~1 ~1 carrots[age=7] summon pig ~1.5 ~1 ~1.5 {equipment:{saddle:{id:"minecraft:saddle"}}} dummy @s use entity @e[type=pig,distance=..4,limit=1] await block ~1 ~1 ~1 carrots[age=0] assert items entity @s container.* minecraft:carrot ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/test/plant_carrots.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~ ~1 farmland summon pig ~1.5 ~1 ~1.5 {equipment:{saddle:{id:"minecraft:saddle"}}} dummy @s use entity @e[type=pig,distance=..4,limit=1] give @s carrot await not items entity @s container.* minecraft:carrot assert block ~1 ~1 ~1 carrots[age=0] ================================================ FILE: gm4_pig_tractors/data/gm4_pig_tractors/test/till_soil.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 setblock ~1 ~ ~1 grass_block summon pig ~1.5 ~1 ~1.5 item replace entity @s weapon.mainhand with saddle dummy @s use entity @e[type=pig,distance=..4,limit=1] dummy @s use entity @e[type=pig,distance=..4,limit=1] item replace entity @s weapon.offhand with iron_hoe await block ~1 ~ ~1 farmland ================================================ FILE: gm4_podzol_rooting_soil/README.md ================================================ # Podzol Rooting Soil Allow your saplings to... plant themselves! ### Features - Any sapling now will auto-plant when on Podzol for a while - The time taken for a sapling to be rooted in soil is random and affected by random tick speed - Can be used to improve tree farm automation ================================================ FILE: gm4_podzol_rooting_soil/beet.yaml ================================================ id: gm4_podzol_rooting_soil name: Podzol Rooting Soil version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: schedule_loops: [main] website: description: Allows saplings to self-plant when on Podzol. The perfect choice for auto-treefarms! recommended: [] notes: [] modrinth: project_id: keFbZ5iO wiki: https://wiki.gm4.co/wiki/Podzol_Rooting_Soil credits: Creator: - Bloo Updated by: - Misode Icon Design: - BPR ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/init.mcfunction ================================================ # init scoreboard objectives add gm4_podzol_data dummy scoreboard players set #100 gm4_podzol_data 100 scoreboard players set #200 gm4_podzol_data 200 # base execute unless score podzol_rooting_soil gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Podzol Rooting Soil"} execute unless score podzol_rooting_soil gm4_earliest_version < podzol_rooting_soil gm4_modules run scoreboard players operation podzol_rooting_soil gm4_earliest_version = podzol_rooting_soil gm4_modules scoreboard players set podzol_rooting_soil gm4_modules 1 schedule function gm4_podzol_rooting_soil:main 10t #$moduleUpdateList ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/main.mcfunction ================================================ # function loops on a 20-second (400t or 0.05Hz) cycle schedule function gm4_podzol_rooting_soil:main 400t # query random tick speed execute store result score random_tick_speed gm4_podzol_data run gamerule random_tick_speed # prepare lööp scoreboard players add last_uuid gm4_podzol_data 11 scoreboard players operation last_uuid gm4_podzol_data %= #200 gm4_podzol_data # get sapling items execute as @e[type=item,predicate=gm4_podzol_rooting_soil:plantable_on_ground] at @s run function gm4_podzol_rooting_soil:process_item ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/place_block.mcfunction ================================================ # macro function with $(id) being the item/block id of the sapling # run from plant $setblock ~ ~ ~ $(id) destroy ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/plant.mcfunction ================================================ # @s = sapling item on podzol and within air-like block that has passed the randomizer # at @s # called from gm4_podzol_rooting_soil:process_item # place sapling block function gm4_podzol_rooting_soil:place_block with entity @s Item # plant custom sapling execute if items entity @s contents *[custom_data~{gm4_podzol_rooting_soil:{}}] run function #gm4_podzol_rooting_soil:plant_custom_sapling # sounds and visuals execute align xyz positioned ~.5 ~.5 ~.5 run particle minecraft:happy_villager ~ ~ ~ .3 .3 .3 1 10 normal playsound minecraft:block.chorus_flower.grow block @a[distance=..6] ~ ~ ~ 0.2 0.8 # remove sapling item item modify entity @s contents {function:"minecraft:set_count",count:-1,add:true} ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/function/process_item.mcfunction ================================================ # @s = sapling item # at world spawn # called from gm4_podzol_rooting_soil:main # get own uuid into scoreboard and scale into range execute store result score current_uuid gm4_podzol_data run data get entity @s UUID[0] scoreboard players operation current_uuid gm4_podzol_data %= #100 gm4_podzol_data # copy into target and shift by random_tick_speed scoreboard players operation compared_value gm4_podzol_data = current_uuid gm4_podzol_data scoreboard players operation compared_value gm4_podzol_data *= random_tick_speed gm4_podzol_data # compare execute if score compared_value gm4_podzol_data >= last_uuid gm4_podzol_data at @s if block ~ ~-1 ~ minecraft:podzol if block ~ ~ ~ #gm4_podzol_rooting_soil:sapling_replaceable run function gm4_podzol_rooting_soil:plant # force plant if about to despawn and if the previous randomizer test failed execute store result score age gm4_podzol_data run data get entity @s Age execute unless score compared_value gm4_podzol_data >= last_uuid gm4_podzol_data if score age gm4_podzol_data matches 5399.. at @s if block ~ ~-1 ~ minecraft:podzol if block ~ ~ ~ #gm4_podzol_rooting_soil:sapling_replaceable run function gm4_podzol_rooting_soil:plant # clean up scoreboard players operation last_uuid gm4_podzol_data += current_uuid gm4_podzol_data scoreboard players operation last_uuid gm4_podzol_data %= #200 gm4_podzol_data scoreboard players reset compared_value gm4_podzol_data scoreboard players reset current_uuid gm4_podzol_data scoreboard players reset age gm4_podzol_data ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/guidebook/podzol_rooting_soil.json ================================================ { "id": "podzol_rooting_soil", "name": "Podzol Rooting Soil", "module_type": "module", "icon": { "id": "minecraft:spruce_sapling" }, "criteria": { "obtain_sapling": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:saplings" } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_sapling" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.podzol_rooting_soil.description", "fallback": "Saplings dropped on podzol will replant themselves over time." } ] ] } ] } ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/predicate/plantable_on_ground.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_on_ground": true }, "slots": { "contents": { "items": "#gm4_podzol_rooting_soil:plantable" } } } } ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/block/sapling_replaceable.json ================================================ { "values": [ "#gm4:replaceable", "#gm4:foliage" ] } ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/function/plant_custom_sapling.json ================================================ { "values":[] } ================================================ FILE: gm4_podzol_rooting_soil/data/gm4_podzol_rooting_soil/tags/item/plantable.json ================================================ { "values": [ "minecraft:acacia_sapling", "minecraft:birch_sapling", "minecraft:cherry_sapling", "minecraft:dark_oak_sapling", "minecraft:jungle_sapling", "minecraft:mangrove_propagule", "minecraft:oak_sapling", "minecraft:pale_oak_sapling", "minecraft:spruce_sapling" ] } ================================================ FILE: gm4_podzol_rooting_soil/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.podzol_rooting_soil,Allows saplings to self-plant when on Podzol. The perfect choice for auto-treefarms! text.gm4.guidebook.podzol_rooting_soil.description,Saplings dropped on podzol will replant themselves over time. ================================================ FILE: gm4_potion_liquids/README.md ================================================ # Potion Liquids Allows you store compactly store your potions in a Liquid Tank. ### Features - Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack - Allows potions in a Liquid Tank and interactions from using the tank - An unextended potion will fill 1/3 a bucket. An extended potion will fill 1 bucket. - Allows the "Milking" of Shulkers for floating and Witches for a variety of potions Read the [Wiki](https://wiki.gm4.co/Liquid_Tanks/Potion_Liquids) for more interactions. ================================================ FILE: gm4_potion_liquids/beet.yaml ================================================ id: gm4_potion_liquids name: Potion Liquids version: 1.10.X data_pack: load: . require: - bolt pipeline: - gm4_liquid_tanks.override_formatting - gm4_liquid_tanks.bolt_liquid_wrappers - gm4.plugins.extend.module - gm4.plugins.include.lib_brewing meta: bolt: entrypoint: - gm4_potion_liquids:main gm4: versioning: required: gm4_liquid_tanks: 3.1.0 lib_brewing: 1.5.0 model_data: - item: potion reference: gui/advancement/potion_liquids template: advancement website: description: Adds the ability to store potions in Liquid Tanks! You can also use a potion by walking beneath a potion-filled Liquid Tank. recommended: [] notes: [] modrinth: project_id: Z08l0oKH video: https://www.youtube.com/watch?v=qa9lcbii1BE wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Potion_Liquids credits: Creator: - SpecialBuilder32 Updated by: - SpecialBuilder32 Textures by: - Vilder50 Icon Design: - DuckJr ================================================ FILE: gm4_potion_liquids/data/gm4/advancement/potion_liquids.json ================================================ { "display": { "icon": { "id": "potion", "components": { "minecraft:custom_model_data": {"strings":["gm4_potion_liquids:gui/advancement/potion_liquids"]}, "minecraft:potion_contents": { "custom_color": 13631487 } } }, "title": { "translate": "advancement.gm4.potion_liquids.title", "fallback": "Fizzy Lifting Drink" }, "description": { "translate": "advancement.gm4.potion_liquids.description", "fallback": "Come on in, the air's fine", "color": "gray" } }, "parent": "gm4:liquid_tanks_create", "criteria": { "consume_floating_potion": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_potion_liquids:{potion:'floating'}}" } } } } } } ================================================ FILE: gm4_potion_liquids/data/gm4_brewing/tags/function/insert/lingering.json ================================================ { "values": [ "gm4_potion_liquids:brewing_stand/lingering" ] } ================================================ FILE: gm4_potion_liquids/data/gm4_brewing/tags/function/insert/splash.json ================================================ { "values": [ "gm4_potion_liquids:brewing_stand/splash" ] } ================================================ FILE: gm4_potion_liquids/data/gm4_liquid_tanks/tags/function/util_above.json ================================================ { "values":[ "gm4_potion_liquids:util_above" ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/brewing_stand/lingering.mcfunction ================================================ # @s = brewing stand marker with a custom splash potion to be converted to a lingering potion # run from #gm4_brewing:insert/lingering loot spawn ~ ~ ~ loot gm4_potion_liquids:technical/brewing_stand/lingering ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/brewing_stand/splash.mcfunction ================================================ # @s = brewing stand marker with a custom potion to be converted to a splash potion # run from #gm4_brewing:insert/splash loot spawn ~ ~ ~ loot gm4_potion_liquids:technical/brewing_stand/splash ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/init.mcfunction ================================================ execute unless score potion_liquids gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Potion Liquids"} execute unless score potion_liquids gm4_earliest_version < potion_liquids gm4_modules run scoreboard players operation potion_liquids gm4_earliest_version = potion_liquids gm4_modules scoreboard players set potion_liquids gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/util/random_witch_init.mcfunction ================================================ #@s = liquid tank to be initialized to random potion #run from potion_liquids:util/witch execute store result score $random_witch_init gm4_lt_util run random value 0..3 execute if score $random_witch_init gm4_lt_util matches 0 run function gm4_potion_liquids:liquid_init/regeneration execute if score $random_witch_init gm4_lt_util matches 1 run function gm4_potion_liquids:liquid_init/swiftness execute if score $random_witch_init gm4_lt_util matches 2 run function gm4_potion_liquids:liquid_init/fire_resistance execute if score $random_witch_init gm4_lt_util matches 3 run function gm4_potion_liquids:liquid_init/harming ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/util/shulker.mcfunction ================================================ #@s = shulker above liquid tank #run from potion_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_potion_liquids:liquid_init/floating #add potion to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_floating,distance=..8] if score @s gm4_lt_value matches ..299 run scoreboard players add @s gm4_lt_value 1 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/util/witch.mcfunction ================================================ #@s = witch above liquid tank #run from potion_liquids:util_above scoreboard players add @s gm4_lt_util 1 #init empty tanks to random potion execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_empty,distance=..8] if score @s gm4_lt_value matches 0 at @s run function gm4_potion_liquids:util/random_witch_init #add potion to tank execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_regeneration,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1 execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_swiftness,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1 execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_fire_resistance,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1 execute if score @s gm4_lt_util matches 1 as @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,tag=gm4_lt_harming,distance=..8] if score @s gm4_lt_value matches ..29 run scoreboard players add @s gm4_lt_value 1 #reset score after 5 mins execute if score @s gm4_lt_util matches 375.. run scoreboard players reset @s gm4_lt_util ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/function/util_above.mcfunction ================================================ # @s = tank with entity above it positioned ~ ~1 ~ # run from liquid_tanks:process via #gm4_liquid_tanks:util_above tag @s add gm4_processing_tank # shulker execute as @e[dx=0,type=shulker,tag=!smithed.entity] run function gm4_potion_liquids:util/shulker # witch execute as @e[dx=0,type=witch,tag=!smithed.entity] run function gm4_potion_liquids:util/witch tag @s remove gm4_processing_tank ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/guidebook/potion_liquids.json ================================================ { "id": "potion_liquids", "name": "Potion Liquids", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:potion", "components": { "minecraft:potion_contents": "minecraft:swiftness" } }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } }, "obtain_potion": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:potion" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_liquid_tank" ], [ "obtain_potion" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.potion_liquids.description", "fallback": "Potions can be stored in liquid tanks; extended potions count as a three potions.\n\nPotions can be taken out by putting a bottle in the tank, but tanks will not output extended potions." } ], [ { "translate": "text.gm4.guidebook.potion_liquids.mob_effects_and_shulkers", "fallback": "Mobs under a potion tank will gain the potion effect from that tank.\n\nShulkers on an empty or levitation potion tank will fill it with Levitation potion liquid." } ], [ { "translate": "text.gm4.guidebook.potion_liquids.witches", "fallback": "Witches on an empty tank will fill it with Regeneration, Fire Resistance, Speed, or Instant Damage potion liquid.\n\nThey will also fill pre-existing potion tanks with those four potions." } ] ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/loot_table/floating_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "potion", "functions": [ { "function": "set_components", "components": { "minecraft:potion_contents": { "custom_color": 13631487, "custom_effects": [ { "id": "minecraft:levitation", "amplifier": 2, "duration": 900 } ] } } }, { "function": "set_custom_data", "tag": "{gm4_potion_liquids:{potion:'floating'}}" }, { "function": "set_name", "target": "custom_name", "name": { "translate": "item.gm4.floating_potion", "fallback": "Potion of Floating", "italic": false } } ] } ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/loot_table/lingering_floating_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "lingering_potion", "functions": [ { "function": "set_components", "components": { "minecraft:potion_contents": { "custom_color": 13631487, "custom_effects": [ { "id": "minecraft:levitation", "amplifier": 2, "duration": 225 } ] }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "set_custom_data", "tag": "{gm4_potion_liquids:{potion:'floating'}}" }, { "function": "set_name", "target": "custom_name", "name": { "translate": "item.gm4.lingering_floating_potion", "fallback": "Lingering Potion of Floating", "italic": false } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.levitation" }, { "translate": "potion.potency.2" } ] }, "0:11" ], "color": "red", "italic": false } ] ] } ] } ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/loot_table/splash_floating_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "splash_potion", "functions": [ { "function": "set_components", "components": { "minecraft:potion_contents": { "custom_color": 13631487, "custom_effects": [ { "id": "minecraft:levitation", "amplifier": 2, "duration": 900 } ] } } }, { "function": "set_custom_data", "tag": "{gm4_potion_liquids:{potion:'floating'}}" }, { "function": "set_name", "target": "custom_name", "name": { "translate": "item.gm4.splash_floating_potion", "fallback": "Splash Potion of Floating", "italic": false } } ] } ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/loot_table/technical/brewing_stand/lingering.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_potion_liquids:lingering_floating_potion", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_potion_liquids:{potion:'floating'}}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/loot_table/technical/brewing_stand/splash.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_potion_liquids:splash_floating_potion", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{gm4_potion_liquids:{potion:'floating'}}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: gm4_potion_liquids/data/gm4_potion_liquids/modules/main.bolt ================================================ from gm4_liquid_tanks:liquid_wrappers import Liquid from functools import partial from gm4.plugins.player_heads import Skin import numpy as np from PIL import Image, ImageChops, ImageColor potion_liquid = Liquid(capacity=300) base_potion = potion_liquid.standard_unit('glass_bottle', 1, f_name="base_potion") potion_liquid.standard_unit('glass_bottle', 3, f_name="long_potion") # register standard unit long_potion = partial(potion_liquid.item_drain, output='glass_bottle', value=3) # long potions cannot be filled from beet import JsonFile effect_colors = JsonFile(source_path="gm4_potion_liquids/effect_colors.json").data class_defs = {} untinted_skin = Skin(source_path="gm4_potion_liquids/untint_skin.png") from csv import DictReader with open("gm4_potion_liquids/potion_definitions.csv", "r") as csvfile: potion_def_reader = DictReader(csvfile) for row in potion_def_reader: if row["potion_id"] in ("water"): continue # skip this potion type class_key = (row["effect_id"], row["effect_amplifier"]) if row["effect_id"]=="": # effect-less potions each get their own tank type class_key = (row["potion_id"]) # setup new liquid type if necessary and add to the dict if class_key not in class_defs: # @potion_liquid # we execute the class decorator later after setting up all the bolt stuff class PotionLiquidClass: id = row["potion_id"].removeprefix("long_") name = row["potion_id"].removeprefix("long_").replace("_"," ").title()+" Potion" _generators = [] if row["potion_id"].startswith("strong"): PotionLiquidClass.skin = "liquids/"+row["potion_id"].removeprefix("strong_") potion_liquid.struc = PotionLiquidClass # programatically going around the decorators is odd, # so we manually set this here so the handler # knows the right classdef to put mcfunction into potion_liquid.init() class_defs[class_key] = PotionLiquidClass this_potion_class = class_defs[class_key] potion_liquid.struc = this_potion_class # add this potion to the liquid type if row["potion_id"].startswith("long"): this_potion_unit = long_potion else: this_potion_unit = base_potion this_potion_unit(f"minecraft:potion[potion_contents={{potion:\"{row['potion_id']}\"}}]") # add this potion's util_below feature if not row["potion_id"].startswith("long") and not row["effect_id"]=="": def dispense_potion(row): effects = row["effect_id"].split("+") amplifiers = map(int, row["effect_amplifier"].split("+")) inline_predicate = { "condition":"minecraft:entity_properties", "entity":"this", "predicate":{ "effects":{} # { e:{} for e in effects } # dict comprehension not supported by bolt } } for e in effects: inline_predicate["predicate"]["effects"][e] = {} m, s = row["effect_duration"].split(":") duration = max(int(m)*60 + round(float(s)), 1) execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] unless predicate inline_predicate run function f"gm4_potion_liquids:util/dispense/{row["potion_id"]}": for e, a in zip(effects, amplifiers): effect give @s e duration (a-1) scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 potion_liquid.util_below(partial(dispense_potion, row)) # create this potion's skin texture if needed skin_id = this_potion_class.id.removeprefix("strong_").removeprefix("long_") if skin_id not in ctx.data["gm4_potion_liquids"][Skin].generate_tree()["liquids"]: # compute the potion color for any mixed potions (a weighted average of their colors) tint_colors = np.empty(shape=(3,0)) for effect_id in row["effect_id"].split("+"): rgb = np.array(ImageColor.getrgb(effect_colors[effect_id][0])).reshape((-1,1)) tint_colors = np.append(tint_colors, rgb, axis=1) tint_weights = list(map(int, row["effect_amplifier"].split("+"))) tint_color = tuple(map(int, np.average(tint_colors, weights=tint_weights, axis=1))) # print('#%02x%02x%02x' % tint_color) tint_image = Image.new("RGBA", untinted_skin.image.size, tint_color) ctx.data[f"gm4_potion_liquids:liquids/{skin_id}"] = Skin(ImageChops.multiply(tint_image, untinted_skin.image)) # apply the liquid tanks decorator wrapper for liquid_class in class_defs.values(): potion_liquid(liquid_class) # Potions added by this module potion_liquid.struc = Liquid # return decorator to normal operation @potion_liquid class FloatingPotion: id = "floating" name = "Floating Potion" potion_liquid.init() @base_potion("minecraft:potion[custom_data~{gm4_potion_liquids:{potion:'floating'}}]") def floating_potion(): loot replace entity 344d47-4-4-4-f04ce104d weapon.mainhand loot gm4_potion_liquids:floating_potion @potion_liquid.util_below def dispense_float_potion(): execute as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] unless predicate { "condition":"minecraft:entity_properties", "entity":"this", "predicate":{"effects":{"levitation":{}}} } run function gm4_potion_liquids:util/dispense/floating: effect give @s levitation 45 2 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank,distance=..8] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_potion_liquids/effect_colors.json ================================================ { "": ["#385DC6", 3694022], "absorption": ["#2552A5", 2445989], "bad_omen": ["#0B6138", 745784], "blindness": ["#1F1F23", 2039587], "conduit_power": ["#1DC2D1", 1950417], "darkness": ["#292721", 2696993], "dolphins_grace": ["#88A3BE", 8954814], "fire_resistance": ["#FF9900", 16750848], "glowing": ["#94A061", 9740385], "haste": ["#D9C043", 14270531], "health_boost": ["#F87D23", 16284963], "hero_of_the_village": ["#44FF44", 4521796], "hunger": ["#587653", 5797459], "infested": ["#8C9B8C", 9214860], "instant_damage": ["#A9656A", 11101546], "instant_health": ["#F82423", 16262179], "invisibility": ["#F6F6F6", 16185078], "jump_boost": ["#FDFF84", 16646020], "levitation": ["#CEFFFF", 13565951], "luck": ["#59C106", 5882118], "mining_fatigue": ["#4A4217", 4866583], "nausea": ["#551D4A", 5578058], "night_vision": ["#C2FF66", 12779366], "oozing": ["#99FFA3", 10092451], "poison": ["#87A363" ,8889187], "raid_omen": ["#DE4058", 14565464], "regeneration": ["#CD5CAB", 13458603], "resistance": ["#9146F0", 9520880], "saturation": ["#F82423", 16262179], "slow_falling": ["#F3CFB9", 15978425], "slowness": ["#8BAFE0", 9154528], "speed": ["#33EBFF", 3402751], "strength": ["#FFC700", 16762624], "trial_omen": ["#16A6A6", 1484454], "unluck": ["#C0A44D", 12624973], "water_breathing": ["#98DAC0", 10017472], "weakness": ["#484D48", 4738376], "weaving": ["#78695A", 7891290], "wind_charged": ["#BDC9FF", 12438015], "wither": ["#736156", 7561558] } ================================================ FILE: gm4_potion_liquids/potion_definitions.csv ================================================ potion_id,"effect_id","effect_amplifier","effect_duration" awkward,,1, fire_resistance,fire_resistance,1,3:00 harming,instant_damage,1,0:00 healing,instant_health,1,0:00 infested,infested,1,3:00 invisibility,invisibility,1,3:00 leaping,jump_boost,1,3:00 long_fire_resistance,fire_resistance,1,8:00 long_invisibility,invisibility,1,8:00 long_leaping,jump_boost,1,8:00 long_night_vision,night_vision,1,8:00 long_poison,poison,1,1:30 long_regeneration,regeneration,1,1:30 long_slow_falling,slow_falling,1,4:00 long_slowness,slowness,1,4:00 long_strength,strength,1,8:00 long_swiftness,speed,1,8:00 long_turtle_master,slowness+resistance,4+3,0:40 long_water_breathing,water_breathing,1,8:00 long_weakness,weakness,1,4:00 luck,luck,1,5:00 mundane,,1, night_vision,night_vision,1,3:00 oozing,oozing,1,3:00 poison,poison,1,0:45 regeneration,regeneration,1,0:45 slow_falling,slow_falling,1,1:30 slowness,slowness,1,1:30 strength,strength,1,3:00 strong_harming,instant_damage,2,0:00 strong_healing,instant_health,2,0:00 strong_leaping,jump_boost,2,1:30 strong_poison,poison,2,0:21.6 strong_regeneration,regeneration,2,0:22.5 strong_slowness,slowness,4,0:20 strong_strength,strength,2,1:30 strong_swiftness,speed,2,1:30 strong_turtle_master,slowness+resistance,5+4,0:20 swiftness,speed,1,3:00 thick,,1, turtle_master,slowness+resistance,4+3,0:20 water,,1, water_breathing,water_breathing,1,3:00 weakness,weakness,1,1:30 weaving,weaving,1,3:00 wind_charged,wind_charged,1,3:00 ================================================ FILE: gm4_potion_liquids/translations.csv ================================================ key,en_us advancement.gm4.potion_liquids.description,"Come on in, the air's fine" advancement.gm4.potion_liquids.title,Fizzy Lifting Drink container.gm4.liquid_tank.fire_resistance,Fire Resistance Potion Tank container.gm4.liquid_tank.floating,Floating Potion Tank container.gm4.liquid_tank.harming,Harming Potion Tank container.gm4.liquid_tank.healing,Healing Potion Tank container.gm4.liquid_tank.invisibility,Invisibility Potion Tank container.gm4.liquid_tank.leaping,Leaping Potion Tank container.gm4.liquid_tank.luck,Luck Potion Tank container.gm4.liquid_tank.night_vision,Night Vision Potion Tank container.gm4.liquid_tank.poison,Poison Potion Tank container.gm4.liquid_tank.regeneration,Regeneration Potion Tank container.gm4.liquid_tank.slow_falling,Slow Falling Potion Tank container.gm4.liquid_tank.slowness,Slowness Potion Tank container.gm4.liquid_tank.strength,Strength Potion Tank container.gm4.liquid_tank.strong_harming,Strong Harming Potion Tank container.gm4.liquid_tank.strong_healing,Strong Healing Potion Tank container.gm4.liquid_tank.strong_leaping,Strong Leaping Potion Tank container.gm4.liquid_tank.strong_turtle_master,Strong Turtle Master Potion Tank container.gm4.liquid_tank.strong_poison,Strong Poison Potion Tank container.gm4.liquid_tank.strong_regeneration,Strong Regeneration Potion Tank container.gm4.liquid_tank.strong_slowness,Strong Slowness Potion Tank container.gm4.liquid_tank.strong_strength,Strong Strength Potion Tank container.gm4.liquid_tank.strong_swiftness,Strong Swiftness Potion Tank container.gm4.liquid_tank.swiftness,Swiftness Potion Tank container.gm4.liquid_tank.turtle_master,Turtle Master Potion Tank container.gm4.liquid_tank.water_breathing,Water Breathing Potion Tank container.gm4.liquid_tank.weakness,Weakness Potion Tank item.gm4.floating_potion,Potion of Floating item.gm4.lingering_floating_potion,Lingering Potion of Floating item.gm4.splash_floating_potion,Splash Potion of Floating text.gm4.guidebook.module_desc.potion_liquids,Adds the ability to store potions in Liquid Tanks! You can also use a potion by walking beneath a potion-filled Liquid Tank. text.gm4.guidebook.potion_liquids.description,"Potions can be stored in liquid tanks; extended potions count as a three potions.\n\nPotions can be taken out by putting a bottle in the tank, but tanks will not output extended potions." text.gm4.guidebook.potion_liquids.mob_effects_and_shulkers,Mobs under a potion tank will gain the potion effect from that tank.\n\nShulkers on an empty or levitation potion tank will fill it with Levitation potion liquid. text.gm4.guidebook.potion_liquids.witches,"Witches on an empty tank will fill it with Regeneration, Fire Resistance, Speed, or Instant Damage potion liquid.\n\nThey will also fill pre-existing potion tanks with those four potions." container.gm4.liquid_tank.awkward,Awkward Potion Tank container.gm4.liquid_tank.infested,Infested Potion Tank container.gm4.liquid_tank.mundane,Mundane Potion Tank container.gm4.liquid_tank.oozing,Oozing Potion Tank container.gm4.liquid_tank.thick,Thick Potion Tank container.gm4.liquid_tank.weaving,Weaving Potion Tank container.gm4.liquid_tank.wind_charged,Wind Charged Potion Tank ================================================ FILE: gm4_reeling_rods/README.md ================================================ # Reeling Rods Reel in more than just fish with these rods. Yoink the chest from the chest boat, deal some damage, and more! A player using Reeling on a Chest Minecart, a Sheep, and an Enderman ### Features - All fishing rods have extra abilities when hooking Paintings, Item Frames, Leash Knots, Shulkers and End Crystals. Hooking any entity will also dismount them from their vehicle. Adds 2 fishing rod enchantments, Reeling and Barbed. - Reeling revolves around stealing from entities. Pull the chest from chest boats and so much more! - Barbed turns a fishing rod into a lethal weapon. With 5 levels, it applies a scratching damage to the hooked mob and then bleeding damage. ================================================ FILE: gm4_reeling_rods/beet.yaml ================================================ id: gm4_reeling_rods name: Reeling Rods version: 1.1.X data_pack: load: . pipeline: - generate_files - gm4.plugins.extend.module - gm4.plugins.include.lib_hooked_entity require: - bolt meta: gm4: versioning: required: lib_hooked_entity: 1.0.0 website: description: Steal Villager's wares, scratch up your foes! Fishing rods have never been more useful! recommended: - gm4_end_fishing - gm4_live_catch notes: [] search_keywords: - barbed - fishing - enchantment modrinth: project_id: MWPuloVL smithed: pack_id: gm4_reeling_rods planetminecraft: uid: 6733043 wiki: https://wiki.gm4.co/wiki/Reeling_Rods credits: Creators: - runcows - Bloo Icon Design: - runcows ================================================ FILE: gm4_reeling_rods/data/gm4_hooked_entity/tags/function/on_hooked_entity.json ================================================ { "values": [ "gm4_reeling_rods:hooked_entity/select_type" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_hooked_entity/tags/function/pre_hook_on_player.json ================================================ { "values": [ "gm4_reeling_rods:get_player_data" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/enchantment/barbed.json ================================================ { "description": { "translate": "gm4.reeling_rods.enchantment.barbed", "fallback": "Barbed" }, "exclusive_set": "gm4_reeling_rods:reeling", "supported_items": "minecraft:fishing_rod", "primary_items": "minecraft:fishing_rod", "weight": 1, "max_level": 5, "min_cost": { "base": 1, "per_level_above_first": 10 }, "max_cost": { "base": 51, "per_level_above_first": 10 }, "anvil_cost": 1, "slots": [ "any" ], "effects": {} } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/enchantment/reeling.json ================================================ { "description": { "translate": "gm4.reeling_rods.enchantment.reeling", "fallback": "Reeling" }, "exclusive_set": "gm4_reeling_rods:barbed", "supported_items": "minecraft:fishing_rod", "primary_items": "minecraft:fishing_rod", "weight": 1, "max_level": 1, "min_cost": { "base": 20, "per_level_above_first": 0 }, "max_cost": { "base": 70, "per_level_above_first": 0 }, "anvil_cost": 8, "slots": [ "any" ], "effects": {} } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/apply.mcfunction ================================================ # Applies the barbed damage to the hooked entity # @s = hooked entity # at bobber position # with {damage} # run from hooked_entity/select_type # immediate damage (amount scales with enchantment level) execute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule show_death_messages gamerule show_death_messages false $damage @s $(damage) cactus by @p[tag=gm4_hooked_entity.player] playsound minecraft:entity.player.attack.crit player @a[distance=..16] ~ ~ ~ 1 1.82 # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim execute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_scratch_death # if the victim is still alive, schedule bleeding damage execute at @s if entity @e[tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/schedule_bleeding # reset scores, gamerule and tag tag @s remove gm4_reeling_rods.victim execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule show_death_messages true scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/bleed.mcfunction ================================================ # updates the bleeding timer # @s = entity recently hit by a barbed fishing rod # at @s # run from barbed/find_affected # advance timer scoreboard players add @s gm4_reeling_rods.barbed_damage_timer 1 # clear if timer exceeds 3s execute if score @s gm4_reeling_rods.barbed_damage_timer matches 61.. run return run function gm4_reeling_rods:barbed/clear # return unless phase of timer is 0 scoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer = @s gm4_reeling_rods.barbed_damage_timer scoreboard players operation $phase gm4_reeling_rods.barbed_damage_timer %= @s gm4_reeling_rods.barbed_damage_period execute unless score $phase gm4_reeling_rods.barbed_damage_timer matches 0 run return fail # find attacker # | tags attacker with gm4_reeling_rods.barbed_attacker # | sets $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 execute summon snowball run function gm4_reeling_rods:barbed/find_attacker # prepare to handle player death execute store result score $show_death_messages gm4_reeling_rods.barbed_damage_timer run gamerule show_death_messages gamerule show_death_messages false # apply damage # | if the attacker was found, attribute it to the attacker, if not do not attribute it to anyone # | use cactus damage type as it has no knockback and respects armor # | print custom death message to obscure cactus death message execute if score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus by @p[tag=gm4_reeling_rods.barbed_attacker] execute unless score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 matches 1.. run damage @s 2 cactus playsound minecraft:block.pointed_dripstone.drip_lava neutral @a[distance=..6] ~ ~ ~ 1 1.8 execute anchored eyes run particle damage_indicator ^ ^ ^ .2 .2 .2 0 3 execute anchored eyes run particle damage_indicator ^ ^ ^1 .5 .5 .5 0 8 normal @s # handle death (@e only selects entities which are alive) # | this is of importance for entities which display death messages or re-spawn tag @s add gm4_reeling_rods.victim execute if entity @s[type=#gm4_reeling_rods:support_death_message] at @s unless entity @e[type=#gm4_reeling_rods:support_death_message,tag=gm4_reeling_rods.victim,distance=0,limit=1] run function gm4_reeling_rods:barbed/on_bleeding_death tag @s remove gm4_reeling_rods.victim execute if score $show_death_messages gm4_reeling_rods.barbed_damage_timer matches 1 run gamerule show_death_messages true scoreboard players reset $show_death_messages gm4_reeling_rods.barbed_damage_timer ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/clear.mcfunction ================================================ # stops bleeding damage # @s = entity recently hit by a barbed fishing rod # at @s # run from barbed/bleed, barbed/on_bleeding_death, and barbed/on_scratch_death scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid0 scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid1 scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid2 scoreboard players reset @s gm4_reeling_rods.barbed_attacker_uuid3 scoreboard players reset @s gm4_reeling_rods.barbed_damage_period scoreboard players reset @s gm4_reeling_rods.barbed_damage_timer ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_affected.mcfunction ================================================ # initiates bleeding damage on affected entities, de-schedules if no more entities are affected # @s = undefined # at undefined # scheduled from barbed/schedule_bleeding and self # apply barbed damage execute as @e[scores={gm4_reeling_rods.barbed_damage_timer=0..}] at @s run function gm4_reeling_rods:barbed/bleed # reschedule if there are still barbed entities execute if entity @e[scores={gm4_reeling_rods.barbed_damage_timer=0..},limit=1] run schedule function gm4_reeling_rods:barbed/find_affected 1t replace ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/find_attacker.mcfunction ================================================ # locates the attacker, as commands do not accept int-array formatted strings in macros # @s = temporary snowball # at location of snowball # run from barbed/bleed # build uuid array data modify storage gm4_reeling_rods:temp barbed_attacker_uuid set value [I;0,0,0,0] execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[0] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid0 execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[1] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid1 execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[2] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid2 execute store result storage gm4_reeling_rods:temp barbed_attacker_uuid[3] int 1 run scoreboard players get @s gm4_reeling_rods.barbed_attacker_uuid3 # move uuid to snowball data modify entity @s Owner set from storage gm4_reeling_rods:temp barbed_attacker_uuid # tag owner scoreboard players set $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 0 execute on origin store success score $found_attacker gm4_reeling_rods.barbed_attacker_uuid0 run tag @s add gm4_reeling_rods.barbed_attacker # remove snowball kill @s ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_bleeding_death.mcfunction ================================================ # handles entities bleeding to death # @s = entity who died by bleeding to death from barbed damage # at @s # run from barbed/bleed # death message execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] execute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.bleeding","fallback":"%s succumbed to their injuries",with:[{"selector":"@s"}]}] execute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner # reset barbed state function gm4_reeling_rods:barbed/clear ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/on_scratch_death.mcfunction ================================================ # handles entities scratched to death # @s = entity who died by immediate damage from a barbed rod # at @s # run from barbed/apply # death message execute if entity @s[type=player] run tellraw @a ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_hooked_entity.player]"}]}] execute unless entity @s[type=player] on owner run tag @s add gm4_reeling_rods.owner execute unless entity @s[type=player] run tellraw @p[tag=gm4_reeling_rods.owner] ["",{"translate":"text.gm4.reeling_rods.death.scratch","fallback":"%s was scratched to death by %s",with:[{"selector":"@s"},{"selector":"@p[tag=gm4_hooked_entity.player]"}]}] execute unless entity @s[type=player] on owner run tag @s remove gm4_reeling_rods.owner # reset barbed state function gm4_reeling_rods:barbed/clear ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/barbed/schedule_bleeding.mcfunction ================================================ # schedules bleeding damage for the entity that was just hit by barbed # @s = entity just hit by barbed that has not died from the immediate damage # at bobber position # run from barbed/apply # store attacker uuid and period data modify storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid set from entity @a[limit=1,tag=gm4_hooked_entity.player] UUID execute store result score @s gm4_reeling_rods.barbed_attacker_uuid0 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[0] execute store result score @s gm4_reeling_rods.barbed_attacker_uuid1 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[1] execute store result score @s gm4_reeling_rods.barbed_attacker_uuid2 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[2] execute store result score @s gm4_reeling_rods.barbed_attacker_uuid3 run data get storage gm4_reeling_rods:temp enchanted.barbed.attacker_uuid[3] execute store result score @s gm4_reeling_rods.barbed_damage_period run data get storage gm4_reeling_rods:temp enchanted.barbed.period # initiate timer scoreboard players set @s gm4_reeling_rods.barbed_damage_timer 0 schedule function gm4_reeling_rods:barbed/find_affected 1t replace ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/get_execution_pos.mcfunction ================================================ # stores position of a newly summoned marker and kills it # @s = new marker # at @s # run from get_motion_to_player and reeling/enderman/action data modify storage gm4_reeling_rods:temp position set from entity @s Pos kill @s ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/get_lookup.mcfunction ================================================ # Adds a value from the lookup table to Y motion # with {lookup_key} # run from get_motion_to_player $scoreboard players operation $motionY gm4_reeling_rods.math += $$(lookup_key) gm4_reeling_rods.lookup ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/get_motion_to_player.mcfunction ================================================ # Gets motion vector to launch entity to player. X and Z motion is 10% the block distance between the player and current position. Y motion uses the sum of the squares of position deltas as a lookup table key, the value of which is added to the Y position delta to get the Y motion. # @s = entity with items to be yoinked # at bobber in @s (most of the time) # run from pull_items data modify storage gm4_reeling_rods:temp item_data.Motion set value [0d,0d,0d] # Store current position execute summon marker run function gm4_reeling_rods:get_execution_pos # | position stored in storage gm4_reeling_rods:temp position execute store result score $currentX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[0] 1 execute store result score $currentY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 1 execute store result score $currentZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[2] 1 # Player postion is stored in $motionX... ect from player/find_hooked_entity # Get distance from current position to player scoreboard players operation $motionX gm4_reeling_rods.math -= $currentX gm4_reeling_rods.math scoreboard players operation $motionY gm4_reeling_rods.math -= $currentY gm4_reeling_rods.math scoreboard players operation $motionZ gm4_reeling_rods.math -= $currentZ gm4_reeling_rods.math # store Motion, y to be edited after execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.1 run scoreboard players get $motionX gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.1 run scoreboard players get $motionY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.1 run scoreboard players get $motionZ gm4_reeling_rods.math # Square the distances on each axis scoreboard players operation $motionX gm4_reeling_rods.math *= $motionX gm4_reeling_rods.math scoreboard players operation $motionY gm4_reeling_rods.math *= $motionY gm4_reeling_rods.math scoreboard players operation $motionZ gm4_reeling_rods.math *= $motionZ gm4_reeling_rods.math # Add the squares scoreboard players operation $lookup_key gm4_reeling_rods.math = $motionX gm4_reeling_rods.math scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp lookup_key int 1 \ run scoreboard players operation $lookup_key gm4_reeling_rods.math += $motionZ gm4_reeling_rods.math # Get Y motion, scaled up to match the squared values of before execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp item_data.Motion[1] 100 # Add looked up value to motionY above function gm4_reeling_rods:get_lookup with storage gm4_reeling_rods:temp # Store the Completed motionY execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.01 run scoreboard players get $motionY gm4_reeling_rods.math ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/get_player_data.mcfunction ================================================ # Gets data for later logic # @s = player who fished # at @s # run from #gm4_hooked_entity:pre_hook_on_player execute store success score $adventure gm4_reeling_rods.math if entity @s[gamemode=adventure] data remove storage gm4_reeling_rods:temp enchanted execute if predicate gm4_reeling_rods:holding_reeling_rod run data modify storage gm4_reeling_rods:temp enchanted.reeling set value 1 execute if predicate gm4_reeling_rods:holding_barbed_rod/level_1 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 31,damage:3} execute if predicate gm4_reeling_rods:holding_barbed_rod/level_2 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 26,damage:6} execute if predicate gm4_reeling_rods:holding_barbed_rod/level_3 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 21,damage:9} execute if predicate gm4_reeling_rods:holding_barbed_rod/level_4 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 16,damage:12} execute if predicate gm4_reeling_rods:holding_barbed_rod/level_5 run data modify storage gm4_reeling_rods:temp enchanted.barbed set value {period: 11,damage:15} data modify storage gm4_reeling_rods:temp player_data.Pos set from entity @s Pos execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[0] 1 execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[1] 1 execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp player_data.Pos[2] 1 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/end_crystal.mcfunction ================================================ # Action for hooked end_crystal # @s = end_crystal # at bobber in @s # run from hooked_entity/select_type damage @s 1 minecraft:player_attack by @p[tag=gm4_hooked_entity.player] ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/is_passenger.mcfunction ================================================ # checks if @s is a passenger # @s = entity to check # at @s # run from hooked_entity/select_type return run execute on vehicle if entity @s ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/item_frame.mcfunction ================================================ # Action for hooked item frame or glow item frame # @s = item frame or glow item frame # at bobber in @s # with {type} # run from hooked_entity/select_type # fail if fixed execute if data entity @s {Fixed:1b} run return fail $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(type)",count:1} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s Item execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items execute unless data entity @s Item run return run kill @s data remove entity @s Item $execute if data storage gm4_reeling_rods:temp {item_data:{Item:{id:"$(type)"}}} \ run return run playsound minecraft:entity.item_frame.break neutral @a[distance=..16] ~ ~ ~ playsound minecraft:entity.item_frame.remove_item neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/action.mcfunction ================================================ # Action for hooked leash knot # @s = leash knot # at bobber in @s # run from hooked_entity/select_type tag @s add gm4_reeling_rods.leash_knot # distance=..12 is leash distance execute at @s as @e[type=#gm4_reeling_rods:leashable,distance=..12] \ if function gm4_reeling_rods:hooked_entity/leash_knot/leaded_by_knot \ run function gm4_reeling_rods:hooked_entity/leash_knot/change_leader kill @s execute at @p[tag=gm4_reeling_rods.player] run playsound minecraft:item.lead.tied neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/change_leader.mcfunction ================================================ # Changes a leashed entities leader from a leash knot to a tagged player # @s = entity leaded to leash knot # at leash knot # run from hooked_entity/leash_knot/action data remove entity @s leash data modify entity @s leash.UUID set from entity @p[tag=gm4_hooked_entity.player] UUID ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/leash_knot/leaded_by_knot.mcfunction ================================================ # Checks if an entity is leashed by the knot in question # @s = a leashable entity # at owner # run from hooked_entity/leash_knot/action return run execute on leasher if entity @s[tag=gm4_reeling_rods.leash_knot] ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/painting.mcfunction ================================================ # Action for hooked painting # @s = painting # at bobber in @s # run from hooked_entity/select_type data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:painting",count:1} execute at @s align xz positioned ~0.5 ~ ~0.5 run function gm4_reeling_rods:pull_items kill @s playsound minecraft:entity.painting.break neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/select_type.mcfunction ================================================ # Dispatch function for logic on hooked entity # @s = hooked entity # at bobber in entity # run from #gm4_hooked_entity:on_hooked_entity # fails execute if score $adventure gm4_reeling_rods.math matches 1 run return fail execute if entity @s[type=#gm4_reeling_rods:ignore] run return fail execute if entity @s[tag=smithed.entity] run return fail execute if data entity @s {Invulnerable:1b} run return fail # apply barbed damage execute if data storage gm4_reeling_rods:temp enchanted.barbed if data entity @s Health unless entity @s[type=player,gamemode=creative] \ run function gm4_reeling_rods:barbed/apply with storage gm4_reeling_rods:temp enchanted.barbed execute if data storage gm4_reeling_rods:temp enchanted.barbed if entity @s[type=minecraft:tnt_minecart] \ run return run data modify entity @s fuse set value 0s raw # non-dismountable entities for entity in ctx.meta['non_dismountable_entities']: if entity['needs_reeling'].as_bool(): execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function'] else: execute if entity @s[type=entity['id']] run return run function entity['function'] raw # dismounting logic execute if function gm4_reeling_rods:hooked_entity/is_passenger run return run ride @s dismount raw # dismountable entities for entity in ctx.meta['dismountable_entities']: if entity['needs_reeling'].as_bool(): execute if entity @s[type=entity['id']] run return run execute if data storage gm4_reeling_rods:temp enchanted.reeling run function entity['function'] else: execute if entity @s[type=entity['id']] run return run function entity['function'] ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/hooked_entity/shulker.mcfunction ================================================ # Action for hooked shulker # @s = shulker # at bobber in @s # run from hooked_entity/select_type execute at @s facing entity @a[tag=gm4_hooked_entity.player,distance=..33,limit=1] eyes if block ^ ^ ^1 #gm4:replaceable run tp @s ^ ^ ^1 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/init.mcfunction ================================================ execute unless score reeling_rods gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Reeling Rods"} execute unless score reeling_rods gm4_earliest_version < reeling_rods gm4_modules run scoreboard players operation reeling_rods gm4_earliest_version = reeling_rods gm4_modules scoreboard players set reeling_rods gm4_modules 1 scoreboard objectives add gm4_reeling_rods.math dummy scoreboard objectives add gm4_reeling_rods.lookup dummy scoreboard objectives add gm4_reeling_rods.barbed_damage_timer dummy scoreboard objectives add gm4_reeling_rods.barbed_damage_period dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid0 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid1 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid2 dummy scoreboard objectives add gm4_reeling_rods.barbed_attacker_uuid3 dummy # set_lookup_table is generated in generate_files.py function gm4_reeling_rods:set_lookup_table ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/pull_items.mcfunction ================================================ # Separates an entity that needs it # @s = entity with items to be yoinked # at bobber in @s (most of the time) # run from hooked_entity/* & reeling/* & reeling/*/action & reeling/stealable/steal_slot/* function gm4_reeling_rods:get_motion_to_player function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp execute unless data entity @s Items[] run return 0 # Entities with Items tag data modify storage gm4_reeling_rods:temp motion_vector set from storage gm4_reeling_rods:temp item_data.Motion function gm4_reeling_rods:reeling/empty_container_entity ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/bee.mcfunction ================================================ # Action for reeled bee # @s = bee # at bobber in @s # run from hooked_entity/select_type # fail if no nectar execute unless data entity @s {HasNectar:1b} run return fail # Steal data modify storage gm4_reeling_rods:temp item_data set value {} data modify entity @s HasNectar set value 0b data modify entity @s angry_at set from entity @p[tag=gm4_hooked_entity.player] UUID execute store result score $anger_end_time gm4_reeling_rods.math run time query gametime scoreboard players add $anger_end_time gm4_reeling_rods.math 300 execute store result entity @s anger_end_time long 1 run scoreboard players get $anger_end_time gm4_reeling_rods.math data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:honeycomb",count:1} function gm4_reeling_rods:pull_items playsound entity.bee.hurt neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/action.mcfunction ================================================ # Action for reeled chest_boat # @s = chest_boat type # at bobber in @s # with {boat_type} # run from hooked_entity/select_type # steal data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} data modify storage gm4_reeling_rods:temp entity_data set from entity @s execute positioned ~ ~0.3 ~ run function gm4_reeling_rods:pull_items # replace with boat data remove storage gm4_reeling_rods:temp entity_data.UUID data remove storage gm4_reeling_rods:temp entity_data.Passengers $data modify storage gm4_reeling_rods:temp entity_type set value "$(boat_type)" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp execute at @s on passengers run function gm4_reeling_rods:reeling/chest_boat/passenger_transfer tp @s ~ -1000 ~ playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chest_boat/passenger_transfer.mcfunction ================================================ # transfer old passenger to new boat # @s = passengers of chest boat type # at old chest boat type # run from reeling/chest_boat/action ride @s dismount ride @s mount @e[type=#minecraft:boat,distance=..0.00001,limit=1] ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/chested_horse.mcfunction ================================================ # Action for reeled #gm4_reeling_rods:chested_horse # @s = #gm4_reeling_rods:chested_horse # at bobber in @s # run from hooked_entity/select_type # chest, then saddle execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \ run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/empty_container_entity.mcfunction ================================================ # Loops through Items[] and creates an item entity for each item, setting a slightly random motion # @s = entity with an Items[] tag # at @s # run from pull_items # Assumptions # | storage gm4_reeling_rods:temp motion_vector is a Motion[] vector that reaches player # | in storage gm4_reeling_rods:temp entity_data is an Items[] array of item data objects # pull item data to be processed data modify storage gm4_reeling_rods:temp item_data.Item set from storage gm4_reeling_rods:temp entity_data.Items[0] # randomize motion slightly.... execute store result score $motionX gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[0] 100 execute store result score $motionY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[1] 100 execute store result score $motionZ gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp motion_vector[2] 100 execute store result score $randomX gm4_reeling_rods.math run random value -10..10 execute store result score $randomY gm4_reeling_rods.math run random value 0..10 execute store result score $randomZ gm4_reeling_rods.math run random value -10..10 execute store result storage gm4_reeling_rods:temp item_data.Motion[0] double 0.006 run \ scoreboard players operation $motionX gm4_reeling_rods.math += $randomX gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[1] double 0.006 run \ scoreboard players operation $motionY gm4_reeling_rods.math += $randomY gm4_reeling_rods.math execute store result storage gm4_reeling_rods:temp item_data.Motion[2] double 0.006 run \ scoreboard players operation $motionZ gm4_reeling_rods.math += $randomZ gm4_reeling_rods.math # scale 0.01 for same magnitude as main item, currently 0.006 to be slower # summon item with data function gm4_reeling_rods:summon_item with storage gm4_reeling_rods:temp # remove processed item data remove storage gm4_reeling_rods:temp entity_data.Items[0] # run again if needed execute if data storage gm4_reeling_rods:temp entity_data.Items[] run function gm4_reeling_rods:reeling/empty_container_entity ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/action.mcfunction ================================================ # Action for reeled enderman # @s = enderman # at bobber in @s # run from hooked_entity/select_type # fail if no held block execute unless data entity @s carriedBlockState run return fail ## determine summon location # | bobber sits at 80% up the hitbox, we want 30% up from the feet for the held block, which is also 50% of the hitbox height down from the bobber # | this works out to taking 62.5% of the height from feet to bobber, and going down from the bobber that far # | we can achieve this by dividing a 100x scaled up difference of feet and bobber height by 16 # bobber height execute summon marker run function gm4_reeling_rods:get_execution_pos # | position stored in storage gm4_reeling_rods:temp position execute store result score $bobberY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100 # feet height execute at @s summon marker run function gm4_reeling_rods:get_execution_pos # | position stored in storage gm4_reeling_rods:temp position execute store result score $feetY gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp position[1] 100 scoreboard players operation $bobberY gm4_reeling_rods.math -= $feetY gm4_reeling_rods.math scoreboard players set #16 gm4_reeling_rods.math 16 execute store result storage gm4_reeling_rods:temp displacement float 0.1 \ run scoreboard players operation $bobberY gm4_reeling_rods.math /= #16 gm4_reeling_rods.math # use this as a macro for the falling block displacement function gm4_reeling_rods:reeling/enderman/falling_block with storage gm4_reeling_rods:temp ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/enderman/falling_block.mcfunction ================================================ # Steal falling block of the enderman's held block # @s = enderman # at bobber in @s # with {displacement} # run from reeling/enderman/action data modify storage gm4_reeling_rods:temp entity_data set value {} $execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:get_motion_to_player # | motion vector stored in gm4_reeling_rods:temp item_data.Motion data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:falling_block" data modify storage gm4_reeling_rods:temp entity_data.Motion set from storage gm4_reeling_rods:temp item_data.Motion data modify storage gm4_reeling_rods:temp entity_data.BlockState set from entity @s carriedBlockState data remove entity @s carriedBlockState $execute positioned ~ ~-$(displacement) ~ run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/llama.mcfunction ================================================ # Action for reeled llama or trader llama # @s = llama or trader llama # at bobber in @s # run from hooked_entity/select_type # chest, then carpet execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/chested_horse \ run function gm4_reeling_rods:reeling/stealable/steal_slot/body ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/minecart.mcfunction ================================================ # Action for reeled *_minecart # @s = *_minecart # at bobber in @s # with {block} # run from hooked_entity/select_type # fail if passengers execute if data entity @s Passengers run return fail # steal data modify storage gm4_reeling_rods:temp item_data set value {} $data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"$(block)",count:1} data modify storage gm4_reeling_rods:temp entity_data set from entity @s function gm4_reeling_rods:pull_items # replace with minecart data remove storage gm4_reeling_rods:temp entity_data.UUID data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:minecart" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp tp @s ~ -1000 ~ playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/mooshroom.mcfunction ================================================ # Action for reeled mooshroom # @s = mooshroom # at bobber in @s # run from hooked_entity/select_type # fails execute unless data entity @s {Age:0} run return fail execute if data entity @s Passengers run return fail # steal data modify storage gm4_reeling_rods:temp item_data set value {} execute if data entity @s {Type:"red"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:red_mushroom" execute if data entity @s {Type:"brown"} run data modify storage gm4_reeling_rods:temp item_data.Item.id set value "minecraft:brown_mushroom" data modify storage gm4_reeling_rods:temp item_data.Item.count set value 5 function gm4_reeling_rods:pull_items # replace with cow data modify storage gm4_reeling_rods:temp entity_data set from entity @s data remove storage gm4_reeling_rods:temp entity_data.UUID data modify storage gm4_reeling_rods:temp entity_type set value "minecraft:cow" execute at @s run function gm4_reeling_rods:reeling/summon_entity with storage gm4_reeling_rods:temp tp @s ~ -1000 ~ playsound entity.mooshroom.shear neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/sheep.mcfunction ================================================ # Action for reeled sheep # @s = sheep # at bobber in @s # run from hooked_entity/select_type # fail if sheared execute if data entity @s {Sheared:1} run return fail # steal data modify entity @s Sheared set value true data modify storage gm4_reeling_rods:temp item_data set value {} execute if data entity @s {Color:0b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:white_wool",count:1} execute if data entity @s {Color:1b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:orange_wool",count:1} execute if data entity @s {Color:2b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:magenta_wool",count:1} execute if data entity @s {Color:3b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:light_blue_wool",count:1} execute if data entity @s {Color:4b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:yellow_wool",count:1} execute if data entity @s {Color:5b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:lime_wool",count:1} execute if data entity @s {Color:6b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:pink_wool",count:1} execute if data entity @s {Color:7b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:gray_wool",count:1} execute if data entity @s {Color:8b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:light_gray_wool",count:1} execute if data entity @s {Color:9b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:cyan_wool",count:1} execute if data entity @s {Color:10b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:purple_wool",count:1} execute if data entity @s {Color:11b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:blue_wool",count:1} execute if data entity @s {Color:12b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:brown_wool",count:1} execute if data entity @s {Color:13b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:green_wool",count:1} execute if data entity @s {Color:14b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:red_wool",count:1} execute if data entity @s {Color:15b} run data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:black_wool",count:1} function gm4_reeling_rods:pull_items playsound minecraft:entity.sheep.shear neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/snow_golem.mcfunction ================================================ # Action for reeled snow_golem # @s = snow_golem # at bobber in @s # run from hooked_entity/select_type # fail if no Pumpkin execute unless data entity @s {Pumpkin:1b} run return fail # steal data modify storage gm4_reeling_rods:temp item_data set value {} data modify entity @s Pumpkin set value 0b data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:carved_pumpkin",count:1} function gm4_reeling_rods:pull_items playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/break_slot/mainhand.mcfunction ================================================ # Break Mainhand Slot # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_slot/mainhand item replace entity @s weapon.mainhand with minecraft:air playsound minecraft:entity.item.break neutral @a[distance=..16] ~ ~ ~ return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/check_drop_chance.mcfunction ================================================ # checks drop chance against random # run from reeling/stealable/steal_slot/* execute store result score $rand gm4_reeling_rods.math run random value 1..1000 execute if score $rand gm4_reeling_rods.math <= $drop_chance gm4_reeling_rods.math run return 1 return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_1.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_2.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_3.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_4.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_5.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/order/equipment_6.mcfunction ================================================ # Checks slots to steal # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/steal_equipment # 6 execute if items entity @s armor.feet * unless items entity @s armor.feet *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/feet # 1 execute if items entity @s weapon.mainhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand # 3 execute if items entity @s armor.head * unless items entity @s armor.head *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/head # 5 execute if items entity @s armor.legs * unless items entity @s armor.legs *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/legs # 2 execute if items entity @s weapon.offhand * \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand # 4 execute if items entity @s armor.chest * unless items entity @s armor.chest *[minecraft:enchantments={"minecraft:binding_curse":1}] \ run return run function gm4_reeling_rods:reeling/stealable/steal_slot/chest return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_body_and_saddle.mcfunction ================================================ # Action for reeled #gm4_reeling_rods:steal_body_and_saddle # @s = #gm4_reeling_rods:steal_body_and_saddle # at bobber in @s # run from hooked_entity/select_type # body, then saddle execute unless function gm4_reeling_rods:reeling/stealable/steal_slot/body \ run function gm4_reeling_rods:reeling/stealable/steal_slot/saddle ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_equipment.mcfunction ================================================ # Pick an order to check equipment slots for stealing # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from hooked_entity/select_type & reeling/villager/action execute store result score $order gm4_reeling_rods.math run random value 1..6 execute if score $order gm4_reeling_rods.math matches 1 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_1 execute if score $order gm4_reeling_rods.math matches 2 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_2 execute if score $order gm4_reeling_rods.math matches 3 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_3 execute if score $order gm4_reeling_rods.math matches 4 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_4 execute if score $order gm4_reeling_rods.math matches 5 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_5 execute if score $order gm4_reeling_rods.math matches 6 run return run function gm4_reeling_rods:reeling/stealable/order/equipment_6 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_hand.mcfunction ================================================ # Pick an order to check hand slots for stealing # @s = #gm4_reeling_rods:steal_hand # at bobber in @s # run from hooked_entity/select_type execute store result score $mainhand_first gm4_reeling_rods.math run random value 0..1 execute if score $mainhand_first gm4_reeling_rods.math matches 1 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand execute if items entity @s weapon.offhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/offhand execute if score $mainhand_first gm4_reeling_rods.math matches 0 if items entity @s weapon.mainhand * run return run function gm4_reeling_rods:reeling/stealable/steal_slot/mainhand return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/body.mcfunction ================================================ # Steal Body # @s = wolf, llama or horse # at bobber in @s # run from hooked_entity/select_type & reeling/llama & reeling/stealable/steal_body_and_saddle # fails execute unless data entity @s equipment.body run return fail execute if data entity @s {drop_chances:{body:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.body function gm4_reeling_rods:pull_items item replace entity @s armor.body with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 8 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chest.mcfunction ================================================ # Steal Chest # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/equipment_* # fail if 0% drop chance execute if data entity @s {drop_chances:{chest:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.chest data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s armor.chest with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 4 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/chested_horse.mcfunction ================================================ # Steal Chested Horse chest and items inside # @s = #gm4_reeling_rods:chested_horse or llama / trader llama # at bobber in @s # run from reeling/llama & reeling/chested_horse # fail if not chested horse execute unless data entity @s {ChestedHorse:1b} run return fail # steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set value {id:"minecraft:chest",count:1} data modify storage gm4_reeling_rods:temp entity_data set from entity @s function gm4_reeling_rods:pull_items data modify entity @s ChestedHorse set value 0b playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 9 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/feet.mcfunction ================================================ # Steal Feet # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/equipment_* # fail if 0% drop chance execute if data entity @s {drop_chances:{feet:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.feet data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s armor.feet with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 6 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/head.mcfunction ================================================ # Steal Head # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/equipment_* # fail if 0% drop chance execute if data entity @s {drop_chances:{head:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.head data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s armor.head with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 3 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/legs.mcfunction ================================================ # Steal Legs # @s = #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/equipment_* # fail if 0% drop chance execute if data entity @s {drop_chances:{legs:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.legs data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s armor.legs with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 5 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/mainhand.mcfunction ================================================ # Steal Mainhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/* and reeling/stealable/steal_hand ## drop chance fail conditions # to use default drop chances, we'd use 85 here as 8.5%, but we're setting it to 11.5% to match looting 3 chances scoreboard players set $drop_chance gm4_reeling_rods.math 115 execute if data entity @s drop_chances.mainhand store result score $drop_chance gm4_reeling_rods.math run data get entity @s drop_chances.mainhand 1000 # villager and vex should ignore 0% drop chance on mainhand, otherwise fail if 0% execute if entity @s[type=!vex,type=!villager] if score $drop_chance gm4_reeling_rods.math matches 0 run return run function gm4_reeling_rods:reeling/stealable/zero_chance # drowned holding trident needs to roll chance execute if entity @s[type=drowned] if items entity @s weapon.mainhand trident \ unless function gm4_reeling_rods:reeling/stealable/check_drop_chance \ run return run function gm4_reeling_rods:reeling/stealable/break_slot/mainhand ## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} # need SelectedItem to work with players since players don't use equipment.mainhand data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s SelectedItem data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.mainhand data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s weapon.mainhand with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 1 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/offhand.mcfunction ================================================ # Steal Offhand # @s = #gm4_reeling_rods:steal_hand or #gm4_reeling_rods:steal_equipment # at bobber in @s # run from reeling/stealable/order/* and reeling/stealable/steal_hand # fail if 0% drop chance execute if data entity @s {drop_chances:{offhand:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance ## steal slot data modify storage gm4_reeling_rods:temp item_data.Item set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.offhand data modify storage gm4_reeling_rods:temp item_data.PickupDelay set value 10s function gm4_reeling_rods:pull_items item replace entity @s weapon.offhand with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 2 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/steal_slot/saddle.mcfunction ================================================ # Steal Saddle # @s = #gm4_reeling_rods:steal_saddle # at bobber in @s # run from hooked_entity/select_type and reeling/stealable/steal_body_and_saddle # fails execute unless data entity @s equipment.saddle run return fail execute if data entity @s {drop_chances:{saddle:0.0f}} run return run function gm4_reeling_rods:reeling/stealable/zero_chance # steal slot data modify storage gm4_reeling_rods:temp item_data set value {} data modify storage gm4_reeling_rods:temp item_data.Item set from entity @s equipment.saddle function gm4_reeling_rods:pull_items item replace entity @s saddle with minecraft:air playsound minecraft:entity.item.pickup neutral @a[distance=..16] ~ ~ ~ return 7 ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/stealable/zero_chance.mcfunction ================================================ # slot has a 0% drop chance, play sound and fail # at @s # run from reeling/stealable/steal_slot/* playsound minecraft:item.spyglass.stop_using neutral @a[distance=16] ~ ~ ~ return fail ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/summon_entity.mcfunction ================================================ # Summons a generic entity with data # @s = entity that was hooked # at @s (unless run from enderman) # with {entity_type, entity_data} # run from reeling/chest_boat/action and reeling/{minecart|mooshroom} and reeling/enderman/falling_block $summon $(entity_type) ~ ~ ~ $(entity_data) ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/action.mcfunction ================================================ # Action for reeled villager # @s = villager # at bobber in @s # run from hooked_entity/select_type # store mainhand data for a potential trade steal data modify storage gm4_reeling_rods:temp entity_data set value {} data modify storage gm4_reeling_rods:temp entity_data.mainhand set from entity @s equipment.mainhand # try to steal execute store result score $slot gm4_reeling_rods.math run function gm4_reeling_rods:reeling/stealable/steal_equipment # if not mainhand, return execute unless score $slot gm4_reeling_rods.math matches 1 run return fail ## mainhand stolen (TRADED ITEM) # find trade and sell it out function gm4_reeling_rods:reeling/villager/sell_out with storage gm4_reeling_rods:temp entity_data # add 20 "major_negative" gossip of the player to the villager data modify storage gm4_reeling_rods:temp entity_data.gossip.Target set from entity @p[tag=gm4_hooked_entity.player] UUID function gm4_reeling_rods:reeling/villager/add_gossip with storage gm4_reeling_rods:temp entity_data.gossip # feedback particle minecraft:angry_villager ~ ~ ~ 0.3 0.3 0.3 20 3 playsound minecraft:entity.villager.hurt neutral @a[distance=..16] ~ ~ ~ ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/add_gossip.mcfunction ================================================ # adds a "major_negaive" gossip of the player to the villager # @s = villager # at bobber in @s # with {Target} # run from reeling/villager/action $execute store success score $success gm4_reeling_rods.math run \ data modify storage gm4_reeling_rods:temp entity_data.gossip merge from entity @s Gossips[{Type:"major_negative",Target:$(Target)}] execute unless score $success gm4_reeling_rods.math matches 1 run data modify storage gm4_reeling_rods:temp entity_data.gossip merge value {Type:"major_negative",Value:0} execute store result score $gossip_value gm4_reeling_rods.math run data get storage gm4_reeling_rods:temp entity_data.gossip.Value execute unless score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players set $gossip_value gm4_reeling_rods.math 100 execute if score $gossip_value gm4_reeling_rods.math matches ..80 run scoreboard players add $gossip_value gm4_reeling_rods.math 20 execute store result storage gm4_reeling_rods:temp entity_data.gossip.Value int 1 run scoreboard players get $gossip_value gm4_reeling_rods.math data modify entity @s Gossips append from storage gm4_reeling_rods:temp entity_data.gossip ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/reeling/villager/sell_out.mcfunction ================================================ # sells out a trade # @s = villager # at bobber in @s # with {mainhand} # run from reeling/villager/action # for some reason on the first item after a restock?? it fails to set uses, but succeeds after that? This double set doesn't fix that though # | needs more investigation $data modify entity @s Offers.Recipes[{sell:$(mainhand)}] merge value {uses:0} $data modify entity @s Offers.Recipes[{sell:$(mainhand)}].uses set from entity @s Offers.Recipes[{sell:$(mainhand)}].maxUses ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/function/summon_item.mcfunction ================================================ # Summons item with data # @s = entity with items to be yoinked # at bobber in @s (most of the time) # run from pull_items & reeling/empty_container_entity $summon minecraft:item ~ ~ ~ $(item_data) ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/guidebook/reeling_rods.json ================================================ { "id": "reeling_rods", "name": "Reeling Rods", "module_type": "module", "icon": { "id": "minecraft:fishing_rod" }, "criteria": { "obtain_fishing_rod": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:fishing_rod" } ] } }, "obtain_reeling_rod": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:fishing_rod", "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:reeling" } ] } } ] } }, "obtain_barbed_rod": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:fishing_rod", "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed" } ] } } ] } }, "obtain_reeling_book": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:enchanted_book", "predicates": { "minecraft:stored_enchantments": [ { "enchantments": "gm4_reeling_rods:reeling" } ] } } ] } }, "obtain_barbed_book": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:enchanted_book", "predicates": { "minecraft:stored_enchantments": [ { "enchantments": "gm4_reeling_rods:barbed" } ] } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_fishing_rod" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.reeling_rods.description", "fallback": "Fishing rods can be useful tools for (accidental) home re-decoration: Paintings and Item Frames can be ripped of walls, whilst leashes and Shulkers are moved around with ease." } ] ] }, { "name": "reeling", "enable": [], "requirements": [ [ "obtain_reeling_rod", "obtain_reeling_book" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.reeling_rods.reeling", "fallback": "When enchanted with Reeling, a fishing rod becomes a sneaky tool for disassembly and thievery. Take a Villager's wares or un-boat a chest boat chest." } ] ] }, { "name": "barbed", "enable": [], "requirements": [ [ "obtain_barbed_rod", "obtain_barbed_book" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.reeling_rods.barbed", "fallback": "Barbed turns a fishing rod into a lethal weapon. Throw your bobber at foes to scratch them up! Higher levels cause more damage over time." } ] ] } ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_1.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed", "levels": 1 } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_2.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed", "levels": 2 } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_3.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed", "levels": 3 } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_4.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed", "levels": 4 } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_barbed_rod/level_5.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:barbed", "levels": 5 } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/predicate/holding_reeling_rod.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "weapon.*": { "predicates": { "minecraft:enchantments": [ { "enchantments": "gm4_reeling_rods:reeling" } ] } } } } } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/chested_horse.json ================================================ { "values": [ "minecraft:donkey", "minecraft:mule" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/ignore.json ================================================ { "values": [ "minecraft:breeze_wind_charge", "minecraft:command_block_minecart", "minecraft:falling_block", "minecraft:fireball", "minecraft:item", "minecraft:shulker_bullet", "minecraft:spawner_minecart", "minecraft:tnt", "minecraft:wind_charge" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/leashable.json ================================================ { "values": [ "#minecraft:boat", "#gm4:chest_boats", "#gm4_reeling_rods:llamas", "#gm4_reeling_rods:steal_saddle", "minecraft:allay", "minecraft:armadillo", "minecraft:axolotl", "minecraft:bee", "minecraft:camel", "minecraft:camel_husk", "minecraft:cat", "minecraft:chicken", "minecraft:copper_golem", "minecraft:cow", "minecraft:dolphin", "minecraft:donkey", "minecraft:fox", "minecraft:frog", "minecraft:glow_squid", "minecraft:goat", "minecraft:happy_ghast", "minecraft:hoglin", "minecraft:horse", "minecraft:iron_golem", "minecraft:mooshroom", "minecraft:mule", "minecraft:nautilus", "minecraft:ocelot", "minecraft:parrot", "minecraft:polar_bear", "minecraft:rabbit", "minecraft:sheep", "minecraft:sniffer", "minecraft:snow_golem", "minecraft:squid", "minecraft:wolf", "minecraft:zoglin", "minecraft:zombie_nautilus" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/llamas.json ================================================ { "values": [ "minecraft:llama", "minecraft:trader_llama" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body.json ================================================ { "values": [ "minecraft:happy_ghast", "minecraft:wolf" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_body_and_saddle.json ================================================ { "values": [ "minecraft:horse", "minecraft:nautilus", "minecraft:zombie_horse", "minecraft:zombie_nautilus" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_equipment.json ================================================ { "values": [ "minecraft:armor_stand", "minecraft:bogged", "minecraft:drowned", "minecraft:husk", "minecraft:mannequin", "minecraft:parched", "minecraft:piglin", "minecraft:piglin_brute", "minecraft:player", "minecraft:skeleton", "minecraft:stray", "minecraft:wither_skeleton", "minecraft:zombie", "minecraft:zombie_villager", "minecraft:zombified_piglin" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_hand.json ================================================ { "values": [ "minecraft:allay", "minecraft:copper_golem", "minecraft:fox", "minecraft:illusioner", "minecraft:panda", "minecraft:pillager", "minecraft:vex", "minecraft:vindicator", "minecraft:wandering_trader", "minecraft:witch" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/steal_saddle.json ================================================ { "values": [ "minecraft:camel", "minecraft:camel_husk", "minecraft:pig", "minecraft:skeleton_horse", "minecraft:strider", "minecraft:zombie_horse" ] } ================================================ FILE: gm4_reeling_rods/data/gm4_reeling_rods/tags/entity_type/support_death_message.json ================================================ { "values": [ "minecraft:cat", "minecraft:parrot", "minecraft:player", "minecraft:wolf" ] } ================================================ FILE: gm4_reeling_rods/data/minecraft/tags/enchantment/non_treasure.json ================================================ { "values": [ "gm4_reeling_rods:reeling", "gm4_reeling_rods:barbed" ] } ================================================ FILE: gm4_reeling_rods/entities.csv ================================================ id,needs_reeling,can_dismount,function #gm4_reeling_rods:chested_horse,TRUE,TRUE,"gm4_reeling_rods:reeling/chested_horse" #gm4_reeling_rods:llamas,TRUE,TRUE,"gm4_reeling_rods:reeling/llama" #gm4_reeling_rods:steal_body,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/body" #gm4_reeling_rods:steal_body_and_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_body_and_saddle" #gm4_reeling_rods:steal_equipment,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_equipment" #gm4_reeling_rods:steal_hand,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_hand" #gm4_reeling_rods:steal_saddle,TRUE,TRUE,"gm4_reeling_rods:reeling/stealable/steal_slot/saddle" minecraft:bee,TRUE,TRUE,"gm4_reeling_rods:reeling/bee" minecraft:enderman,TRUE,TRUE,"gm4_reeling_rods:reeling/enderman/action" minecraft:mooshroom,TRUE,TRUE,"gm4_reeling_rods:reeling/mooshroom" minecraft:sheep,TRUE,TRUE,"gm4_reeling_rods:reeling/sheep" minecraft:snow_golem,TRUE,TRUE,"gm4_reeling_rods:reeling/snow_golem" minecraft:villager,TRUE,TRUE,"gm4_reeling_rods:reeling/villager/action" minecraft:chest_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:chest'}" minecraft:furnace_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:furnace'}" minecraft:hopper_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:hopper'}" minecraft:tnt_minecart,TRUE,FALSE,"gm4_reeling_rods:reeling/minecart {block:'minecraft:tnt'}" minecraft:acacia_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:acacia_boat'}" minecraft:bamboo_chest_raft,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:bamboo_raft'}" minecraft:birch_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:birch_boat'}" minecraft:cherry_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:cherry_boat'}" minecraft:dark_oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:dark_oak_boat'}" minecraft:jungle_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:jungle_boat'}" minecraft:mangrove_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:mangrove_boat'}" minecraft:oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:oak_boat'}" minecraft:pale_oak_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:pale_oak_boat'}" minecraft:spruce_chest_boat,TRUE,FALSE,"gm4_reeling_rods:reeling/chest_boat/action {boat_type:'minecraft:spruce_boat'}" minecraft:shulker,FALSE,TRUE,"gm4_reeling_rods:hooked_entity/shulker" minecraft:end_crystal,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/end_crystal" minecraft:glow_item_frame,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:glow_item_frame'}" minecraft:item_frame,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/item_frame {type:'minecraft:item_frame'}" minecraft:leash_knot,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/leash_knot/action" minecraft:painting,FALSE,FALSE,"gm4_reeling_rods:hooked_entity/painting" ================================================ FILE: gm4_reeling_rods/generate_files.py ================================================ from beet import Context, Function import math from pathlib import Path from gm4.utils import CSV, CSVRow from itertools import product def beet_default(ctx: Context): """ - generates set_lookup_table.mcfunction - reads csv to ctx.meta for hooked_entity/select_type.mcfunction """ create_lookup_file(ctx) entity_list = CSV.from_file(Path('gm4_reeling_rods','entities.csv')) dismountable_entities: list[CSVRow] = [] non_dismountable_entities: list[CSVRow] = [] for entity_type in entity_list: if entity_type['can_dismount'].as_bool(): dismountable_entities.append(entity_type) continue non_dismountable_entities.append(entity_type) ctx.meta['dismountable_entities'] = dismountable_entities ctx.meta['non_dismountable_entities'] = non_dismountable_entities def create_lookup_file(ctx: Context): ctx.data["gm4_reeling_rods:set_lookup_table"] = Function( [ f"scoreboard players set ${key} gm4_reeling_rods.lookup {value}" for key, value in { (x**2 + y**2 + z**2): int( 100 * (0.08 * math.sqrt(math.sqrt(x**2 + y**2 + z**2))) ) for x, y, z in product(range(0, 34), range(0, 34), range(0, 34)) }.items() if math.sqrt(key) <= 33 ] ) ================================================ FILE: gm4_reeling_rods/mod.mcdoc ================================================ use ::java::util::BlockState use ::java::world::item::ItemStack use ::java::world::entity::AnyEntity use ::java::world::entity::mob::breedable::villager::ReputationPart dispatch minecraft:storage[gm4_reeling_rods:temp] to struct { bit_data?: struct { bit_score: string, bit: string, UUID?: #[uuid] int[] @ 4, }, position?: [double] @ 3, item_data?: struct { Item?: (ItemStack | struct {}), Motion?: [double] @ 3, PickupDelay?: short, }, lookup_key?: int, motion_vector?: [double] @ 3, barbed_attacker_uuid?: #[uuid] int[] @ 4, enchanted?: struct { barbed?: struct { attacker_uuid?: #[uuid] int[] @ 4, period?: int, damage?: int, }, reeling?: int, }, player_data?: struct { Pos: [double] @ 3, }, entity_data?: struct { Items?: [ItemStack], UUID?: #[uuid] int[] @ 4, Passengers?: [AnyEntity], Motion?: [double] @ 3, BlockState?: BlockState, mainhand?: ItemStack, gossip?: struct { Target?: #[uuid] int[] @ 4, Type?: ReputationPart, Value?: int, }, }, entity_type?: #[id="entity_type"] string, displacement?: float, } dispatch minecraft:storage[gm4_reeling_rods:players] to struct { [string]: struct { [#[match_regex="bit_\\d+"] string]: string, }, } ================================================ FILE: gm4_reeling_rods/translations.csv ================================================ key,en_us gm4.reeling_rods.enchantment.reeling,"Reeling" gm4.reeling_rods.enchantment.barbed,"Barbed" text.gm4.reeling_rods.death.bleeding,"%s succumbed to their injuries" text.gm4.reeling_rods.death.scratch,"%s was scratched to death by %s" text.gm4.guidebook.module_desc.reeling_rods,"Steal Villager's wares, scratch up your foes! Fishing rods have never been more useful!" text.gm4.guidebook.reeling_rods.description,"Fishing rods can be useful tools for (accidental) home re-decoration: Paintings and Item Frames can be ripped of walls, whilst leashes and Shulkers are moved around with ease." text.gm4.guidebook.reeling_rods.reeling,"When enchanted with Reeling, a fishing rod becomes a sneaky tool for disassembly and thievery. Take a Villager's wares or un-boat a chest boat chest." text.gm4.guidebook.reeling_rods.barbed,"Barbed turns a fishing rod into a lethal weapon. Throw your bobber at foes to scratch them up! Higher levels cause more damage over time." ================================================ FILE: gm4_rope_ladders/README.md ================================================ # Rope Ladders Ever wanted to place unsupported ladders? This modular data pack allows you to extend the possibilities of your building by allowing ladders to be extended downward, even floating in the air. A rope ladder hanging in a chasm ### Features - Players can extend ladders downward by using a ladder item on one end of a pillar of ladders. - When the player breaks a hanging ladder it will break all the ladders below. - If the top of a ladder is broken, then the entire stack will be "pulled up" for easy item collection. ================================================ FILE: gm4_rope_ladders/beet.yaml ================================================ id: gm4_rope_ladders name: Rope Ladders version: 1.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick model_data: - item: ladder reference: gui/advancement/rope_ladders template: advancement website: description: Climbing downward has never been easier! recommended: [] notes: [] modrinth: project_id: wN3RC3Zr smithed: pack_id: gm4_rope_ladders wiki: https://wiki.gm4.co/wiki/Rope_Ladders credits: Creator: - Modulorium Updated By: - runcows Icon Design: - BPR ================================================ FILE: gm4_rope_ladders/data/gm4/advancement/rope_ladders.json ================================================ { "display": { "icon": { "id": "ladder", "components": { "minecraft:custom_model_data": {"strings":["gm4_rope_ladders:gui/advancement/rope_ladders"]} } }, "title": { "translate": "advancement.gm4.rope_ladders.title", "fallback": "How's It Hanging?" }, "description": { "translate": "advancement.gm4.rope_ladders.description", "fallback": "Place a Rope Ladder", "color": "gray" } }, "parent": "gm4:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/advancement/id_init.json ================================================ { "criteria": { "no_score": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_rol_id": {} } } } ] } } }, "rewards": { "function": "gm4_rope_ladders:player/set_id" } } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/advancement/right_click_detection.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:player_interacted_with_entity", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_rope_ladders:holding_ladder" }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "gamemode": [ "survival", "creative" ] } } } ], "entity": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type": "minecraft:interaction" } }, { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_rol_id": {} } } ] } } }, "rewards": { "function": "gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection" } } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/init.mcfunction ================================================ execute unless score rope_ladders gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Rope Ladders"} execute unless score rope_ladders gm4_earliest_version < rope_ladders gm4_modules run scoreboard players operation rope_ladders gm4_earliest_version = rope_ladders gm4_modules scoreboard players set rope_ladders gm4_modules 1 scoreboard objectives add gm4_rol_data dummy scoreboard objectives add gm4_rol_break_ladder minecraft.mined:minecraft.ladder scoreboard objectives add gm4_rol_id dummy schedule function gm4_rope_ladders:main 10t schedule function gm4_rope_ladders:tick 11t #$moduleUpdateList ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/main.mcfunction ================================================ schedule function gm4_rope_ladders:main 16t # execute as player execute as @a at @s run function gm4_rope_ladders:player/as ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/break_ladder.mcfunction ================================================ # breaks the ladder because it is floating # @s = ladder item that was broken by player # at location of a ladder # run from gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop # set scoreboard scoreboard players add $ladder_broken gm4_rol_data 1 # audio playsound minecraft:block.scaffolding.fall ambient @a[distance=..15] ~ ~ ~ 1 .5 # break ladder and drop item fill ~ ~ ~ ~ ~ ~ air replace ladder[waterlogged=false] fill ~ ~ ~ ~ ~ ~ water replace ladder[waterlogged=true] loot spawn ~ ~ ~ loot minecraft:blocks/ladder ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/scan_column/init.mcfunction ================================================ # begins a scan downward breaking floating ladders as it goes # @s = ladder item that was broken by player # align xyz positioned ~.5 ~-1 ~.5 # run from gm4_rope_ladders:player/broke_ladder # set ladder drop mode execute unless block ~ ~2 ~ ladder run scoreboard players set $rope_drop_mode gm4_rol_data 1 execute if block ~ ~2 ~ ladder run scoreboard players set $rope_drop_mode gm4_rol_data 2 # set ladder direction scoreboard players set $rope_drop_direction gm4_rol_data 0 execute if block ~ ~ ~ ladder[facing=south] run scoreboard players set $rope_drop_direction gm4_rol_data 1 execute if block ~ ~ ~ ladder[facing=north] run scoreboard players set $rope_drop_direction gm4_rol_data 2 execute if block ~ ~ ~ ladder[facing=east] run scoreboard players set $rope_drop_direction gm4_rol_data 3 execute if block ~ ~ ~ ladder[facing=west] run scoreboard players set $rope_drop_direction gm4_rol_data 4 # check for valid ladder placement location scoreboard players set $loop gm4_rol_data 0 execute anchored eyes run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop # teleport all ladder items to top execute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 1 if block ~ ~2 ~-1 #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~ ~2 ~-1 execute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 2 if block ~ ~2 ~1 #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~ ~2 ~1 execute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 3 if block ~-1 ~2 ~ #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~-1 ~2 ~ execute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 4 if block ~1 ~2 ~ #gm4:replaceable run tp @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] ~1 ~2 ~ execute if score $rope_drop_mode gm4_rol_data matches 1 if score $rope_drop_direction gm4_rol_data matches 1..4 as @e[type=item,distance=..64,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s}] run data modify entity @s Motion set value [] ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/break_floating_ladders/scan_column/loop.mcfunction ================================================ # scans downward breaking floating ladders as it goes # @s = ladder item that was broken by player # align xyz positioned ~.5 ~-1 ~.5, moving downward # run from gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/init # reset scoreboard scoreboard players set $ladder_broken gm4_rol_data 0 # detect if ladder can be broken execute if block ~ ~ ~ ladder[facing=east] unless block ~-1 ~ ~ #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder execute if block ~ ~ ~ ladder[facing=west] unless block ~1 ~ ~ #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder execute if block ~ ~ ~ ladder[facing=south] unless block ~ ~ ~-1 #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder execute if block ~ ~ ~ ladder[facing=north] unless block ~ ~ ~1 #gm4:full_collision run function gm4_rope_ladders:mechanics/break_floating_ladders/break_ladder # loop scoreboard players add $loop gm4_rol_data 1 execute if score $loop gm4_rol_data matches 0..511 unless score $ladder_broken gm4_rol_data matches 0 if block ~ ~-1 ~ ladder positioned ~ ~-1 ~ run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/loop ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/find_ladder.mcfunction ================================================ # @s = interacted rcd # at player that interacts with a rcd interaction while holding ladder # run from function: gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection # fail if different gametime execute store result score $gametime gm4_rol_data run time query gametime execute store result score $check_gametime gm4_rol_data run data get entity @s interaction.timestamp 1 data remove entity @s interaction execute unless score $gametime gm4_rol_data = $check_gametime gm4_rol_data run return fail # continue execute at @s align xyz positioned ~.5 ~ ~.5 run function gm4_rope_ladders:mechanics/ladder_placement/scan_column ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/interact_right_click_detection.mcfunction ================================================ # @s = player that interacts with a rcd interaction while holding ladder # at @s # run from advancement: gm4_rope_ladders:right_click_detection # revoke advancement advancement revoke @s only gm4_rope_ladders:right_click_detection # reset scoreboard players set $ladder_placed gm4_rol_data 0 scoreboard players set $loop gm4_rol_data 0 # find ladder block execute as @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..8] if data entity @s interaction run function gm4_rope_ladders:mechanics/ladder_placement/find_ladder # successful place execute if score $ladder_placed gm4_rol_data matches 1 run function gm4_rope_ladders:mechanics/ladder_placement/successful_place ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/place_ladder.mcfunction ================================================ # places a ladder when the scan finds a valid location # @s = interacted rcd # at location of valid spot for ladder placement # run from function: gm4_rope_ladders:mechanics/ladder_placement/scan_column # set scorebaord scoreboard players set $ladder_placed gm4_rol_data 1 # break block execute unless block ~ ~ ~ #gm4:water run setblock ~ ~ ~ air destroy execute if block ~ ~ ~ #gm4:water run setblock ~ ~ ~ water destroy # place ladder execute unless block ~ ~ ~ #gm4:water run clone ~ ~1 ~ ~ ~1 ~ ~ ~ ~ execute if block ~ ~ ~ #gm4:water run function gm4_rope_ladders:mechanics/ladder_placement/place_water_ladder ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/place_water_ladder.mcfunction ================================================ # places a ladder when the scan finds a valid location (in water) # @s = interacted rcd # at location of valid spot for ladder placement (in water) # run from function: gm4_rope_ladders:mechanics/ladder_placement/place_ladder # place water ladder execute if block ~ ~1 ~ ladder[facing=south] run setblock ~ ~ ~ ladder[facing=south,waterlogged=true] execute if block ~ ~1 ~ ladder[facing=north] run setblock ~ ~ ~ ladder[facing=north,waterlogged=true] execute if block ~ ~1 ~ ladder[facing=east] run setblock ~ ~ ~ ladder[facing=east,waterlogged=true] execute if block ~ ~1 ~ ladder[facing=west] run setblock ~ ~ ~ ladder[facing=west,waterlogged=true] ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/scan_column.mcfunction ================================================ # scans downward until it finds a valid location to place a ladder # @s = interacted rcd # at location of ladder block, moving downward # run from function: gm4_rope_ladders:mechanics/ladder_placement/find_ladder and self # detect if ladder placement is valid execute if block ~ ~ ~ #gm4:replaceable run return run function gm4_rope_ladders:mechanics/ladder_placement/place_ladder # loop scoreboard players add $loop gm4_rol_data 1 execute if score $loop gm4_rol_data matches 0..511 if block ~ ~-1 ~ #gm4_rope_ladders:ladder_scan positioned ~ ~-1 ~ run function gm4_rope_ladders:mechanics/ladder_placement/scan_column ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/ladder_placement/successful_place.mcfunction ================================================ # effects after a sucessful place # @s = player that interacts with a rcd interaction while holding ladder # at @s # run from function: gm4_rope_ladders:mechanics/ladder_placement/interact_right_click_detection # sound playsound minecraft:block.ladder.place ambient @a[distance=..15] ~ ~ ~ # remove 1 ladder from players hand execute store success score $mainhand gm4_rol_data if items entity @s weapon.mainhand ladder execute if score $mainhand gm4_rol_data matches 1 run item modify entity @s[gamemode=!creative] weapon.mainhand {"function": "minecraft:set_count","count": -1,"add": true} execute if score $mainhand gm4_rol_data matches 1 run swing @s mainhand execute if score $mainhand gm4_rol_data matches 0 run item modify entity @s[gamemode=!creative] weapon.offhand {"function": "minecraft:set_count","count": -1,"add": true} execute if score $mainhand gm4_rol_data matches 0 run swing @s offhand # grant advancement advancement grant @s only gm4:rope_ladders ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/detect_ladder_raycast/found.mcfunction ================================================ # executes at the nearest ladder block in front of the player # @s = player holding ladder # at position of ladder block, align xyz positioned ~.5 ~ ~.5 # run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray # store player id scoreboard players operation $player gm4_rol_id = @s gm4_rol_id # visuals execute if block ~ ~ ~ ladder[facing=south] positioned ~ ~ ~-0.35 run function gm4_rope_ladders:mechanics/right_click_detection/display_particles execute if block ~ ~ ~ ladder[facing=north] positioned ~ ~ ~0.35 run function gm4_rope_ladders:mechanics/right_click_detection/display_particles execute if block ~ ~ ~ ladder[facing=west] positioned ~0.35 ~ ~ run function gm4_rope_ladders:mechanics/right_click_detection/display_particles execute if block ~ ~ ~ ladder[facing=east] positioned ~-0.35 ~ ~ run function gm4_rope_ladders:mechanics/right_click_detection/display_particles # spawn rcd execute if block ~ ~ ~ ladder[facing=south] positioned ~ ~ ~-0.39 positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd execute if block ~ ~ ~ ladder[facing=north] positioned ~ ~ ~0.39 positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd execute if block ~ ~ ~ ladder[facing=west] positioned ~0.39 ~ ~ positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd execute if block ~ ~ ~ ladder[facing=east] positioned ~-0.39 ~ ~ positioned ~ ~-0.05 ~ unless entity @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=..0.1] positioned ~ ~0.05 ~ summon interaction run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/detect_ladder_raycast/ray.mcfunction ================================================ # raycasts from the players head that moves forward until it finds a ladder block # @s = player holding ladder # at @s anchored eyes, moving forward # run from function: gm4_rope_ladders/data/gm4_rope_ladders/function/player/holding_ladder # detect if player sees ladder execute if block ~ ~ ~ ladder align xyz positioned ~.5 ~ ~.5 if block ~ ~-1 ~ #gm4:replaceable run return run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found execute if block ~ ~ ~ ladder align xyz positioned ~.5 ~ ~.5 unless block ~ ~1 ~ ladder run return run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found # loop scoreboard players add $ray gm4_rol_data 1 execute if score $ray gm4_rol_data matches 0..30 positioned ^ ^ ^.1 run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/display_particles.mcfunction ================================================ # displays particles based on the rotation of the ladder block # @s = player holding ladder # at position of ladder block, align xyz positioned ~.5 ~ ~.5 (varies based on rotation) # run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found # visuals particle wax_on ~ ~0.2 ~ 0 0 0 .01 3 particle wax_on ~ ~0.5 ~ 0 0 0 .01 3 particle wax_on ~ ~0.8 ~ 0 0 0 .01 3 ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/create_rcd.mcfunction ================================================ # sets up an interaction that handles right click detection # @s = new interaction # at position of ladder block, align xyz positioned ~.5 ~ ~.5 (varies based on rotation) # run from function: gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/found # init data merge entity @s {width:0.2f,height:1.05f,Tags:["gm4_rol_rcd_ladder","smithed.entity","smithed.strict"]} scoreboard players operation @s gm4_rol_id = $player gm4_rol_id # start loop function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/loop.mcfunction ================================================ # loops as long as a rcd interaction exists # @s = unspecified # at unspecified # run from function: gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/create_rcd and self # reset scoreboard scoreboard players remove $rcd_found gm4_rol_data 1 # execute as rcd execute as @e[type=interaction,tag=gm4_rol_rcd_ladder] at @s run function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/process # loop execute if score $rcd_found gm4_rol_data matches -9.. run schedule function gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop 10t ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/mechanics/right_click_detection/rcd_manager/process.mcfunction ================================================ # processes the rcd interaction so that it is despawned when unneeded # @s = gm4_rol_rcd_ladder interaction # at @s # run from function: gm4_rope_ladders:mechanics/right_click_detection/rcd_manager/loop # kill rcd if uneeded execute unless entity @a[tag=gm4_rol_holding_ladder,distance=..5,limit=1] run return run kill @s execute unless block ~ ~ ~ ladder run return run kill @s execute if block ~ ~-1 ~ ladder unless block ~ ~1 ~ #minecraft:air run return run kill @s # kill if multiple interaction with the same id, which therefore belong to the same player scoreboard players set $duplicate_exists gm4_rol_data 0 scoreboard players operation $check_id gm4_rol_id = @s gm4_rol_id execute as @e[type=interaction,tag=gm4_rol_rcd_ladder,distance=0.1..16] if score @s gm4_rol_id = $check_id gm4_rol_id run scoreboard players set $duplicate_exists gm4_rol_data 1 execute if score $duplicate_exists gm4_rol_data matches 1 run return run kill @s # keep alive scoreboard players set $rcd_found gm4_rol_data 1 ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/player/as.mcfunction ================================================ # @s = player # at @s # run from function: gm4_rope_ladders:main # tag tag @s remove gm4_rol_holding_ladder # check if player is holding rope ladder execute if entity @s[gamemode=!adventure] if predicate gm4_rope_ladders:holding_ladder run function gm4_rope_ladders:player/holding_ladder ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/player/broke_ladder.mcfunction ================================================ # @s = player that broke a ladder # at @s # run from gm4_rope_ladders:tick # reset scoreboard scoreboard players reset @s gm4_rol_break_ladder # execute as the broken ladder item execute if entity @s[gamemode=!creative,gamemode=!spectator] as @e[type=item,distance=..7,limit=1,predicate=gm4_rope_ladders:is_ladder_item,nbt={Age:0s},sort=nearest] at @s if block ~ ~ ~ #gm4:replaceable if block ~ ~-1 ~ ladder align xyz positioned ~.5 ~-1 ~.5 run function gm4_rope_ladders:mechanics/break_floating_ladders/scan_column/init ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/player/holding_ladder.mcfunction ================================================ # @s = player holding ladder # at @s # run from function: gm4_rope_ladders:player/as # tag tag @s add gm4_rol_holding_ladder # check for ladder scoreboard players set $ray gm4_rol_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_rope_ladders:mechanics/right_click_detection/detect_ladder_raycast/ray ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/player/set_id.mcfunction ================================================ # @s = player # at @s # run from advancement: gm4_rope_ladders:id_init # revoke to handle username changes advancement revoke @s only gm4_rope_ladders:id_init execute store result score @s gm4_rol_id run scoreboard players add $next gm4_rol_id 1 ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/function/tick.mcfunction ================================================ schedule function gm4_rope_ladders:tick 1t # check if player broke ladder execute as @a if score @s gm4_rol_break_ladder matches 1.. at @s run function gm4_rope_ladders:player/broke_ladder ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/guidebook/rope_ladders.json ================================================ { "id": "rope_ladders", "name": "Rope Ladders", "module_type": "module", "icon": { "id": "minecraft:ladder" }, "criteria": { "place_ladder": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:ladder" ] } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.rope_ladders.description", "fallback": "Ladders can be placed on other ladders to extend the ladder downward." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "place_ladder" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.rope_ladders.extend_downwards", "fallback": "Looking at a ladder while holding ladders will cause particles to appear. Placing ladders on this particle will extend the ladder downwards.\n\nRope ladders will break if there are no other ladders above them." } ], [ { "translate": "text.gm4.guidebook.rope_ladders.breaking", "fallback": "Breaking a ladder at the top of a rope ladder will break all other rope ladders below, causing the items to appear at the top of the ladder that was broken." } ] ] } ] } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/predicate/holding_ladder.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:ladder" ] } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:ladder" ] } } } } ] } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/predicate/is_ladder_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:ladder" } } } } ================================================ FILE: gm4_rope_ladders/data/gm4_rope_ladders/tags/block/ladder_scan.json ================================================ { "values": [ "#gm4:replaceable", "minecraft:ladder" ] } ================================================ FILE: gm4_rope_ladders/translations.csv ================================================ key,en_us advancement.gm4.rope_ladders.title,How's It Hanging? advancement.gm4.rope_ladders.description,Place a Rope Ladder text.gm4.guidebook.module_desc.rope_ladders,Climbing downward has never been easier! text.gm4.guidebook.rope_ladders.description,Ladders can be placed on other ladders to extend the ladder downward. text.gm4.guidebook.rope_ladders.extend_downwards,Looking at a ladder while holding ladders will cause particles to appear. Placing ladders on this particle will extend the ladder downwards.\n\nRope ladders will break if there are no other ladders above them. text.gm4.guidebook.rope_ladders.breaking,"Breaking a ladder at the top of a rope ladder will break all other rope ladders below, causing the items to appear at the top of the ladder that was broken." ================================================ FILE: gm4_scuba_gear/README.md ================================================ # SCUBA Gear Ease ocean exploration with craftable scuba gear! ### Features - Adds the Wetsuit and Flippers which aids players in underwater movement. - When wearing Flippers on land, players are given a slowness debuff. - Adds the SCUBA Tank which adds 4 minutes of submerged air time. - Adds the SCUBA Helmet which hastens underwater mining. ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/equipment/scuba.json ================================================ { "layers": { "humanoid": [ { "texture": "gm4_scuba_gear:scuba" }, { "dyeable": { "color_when_undyed": 2321353 }, "texture": "gm4_scuba_gear:scuba_overlay" } ], "humanoid_leggings": [ { "texture": "gm4_scuba_gear:scuba" }, { "dyeable": { "color_when_undyed": 2321353 }, "texture": "gm4_scuba_gear:scuba_overlay" } ] } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/items/flippers.json ================================================ { "model": { "type": "minecraft:model", "model": "gm4_scuba_gear:item/flippers", "tints": [ { "type": "minecraft:dye", "default": -14455863 } ] } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/items/scuba_helmet.json ================================================ { "model": { "type": "minecraft:model", "model": "gm4_scuba_gear:item/scuba_helmet" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/items/scuba_tank.json ================================================ { "model": { "type": "minecraft:model", "model": "gm4_scuba_gear:item/scuba_tank" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/items/wetsuit.json ================================================ { "model": { "type": "minecraft:model", "model": "gm4_scuba_gear:item/wetsuit", "tints": [ { "type": "minecraft:dye", "default": -14455863 } ] } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/models/item/flippers.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_scuba_gear:item/flippers", "layer1": "gm4_scuba_gear:item/flippers_overlay" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/models/item/scuba_helmet.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_scuba_gear:item/scuba_helmet" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/models/item/scuba_tank.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_scuba_gear:item/scuba_tank" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/models/item/wetsuit.json ================================================ { "parent": "minecraft:item/generated", "textures": { "layer0": "gm4_scuba_gear:item/wetsuit", "layer1": "gm4_scuba_gear:item/wetsuit_overlay" } } ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/optifine/cit/flippers.properties ================================================ type=armor matchItems=leather_boots texture.leather_layer_1=flippers_layer_1 texture.leather_layer_1_overlay=flippers_layer_1_overlay nbt.CustomModelData=$item/flippers ================================================ FILE: gm4_scuba_gear/assets/gm4_scuba_gear/optifine/cit/scuba_tank.properties ================================================ type=armor matchItems=golden_chestplate texture.gold_layer_1=scuba_tank_layer_1 nbt.CustomModelData=$item/scuba_tank ================================================ FILE: gm4_scuba_gear/assets/translations.csv ================================================ key,en_us item.gm4.flippers,Flippers item.gm4.scuba_helmet,SCUBA Helmet item.gm4.scuba_tank,SCUBA Tank item.gm4.wetsuit,Wetsuit advancement.gm4.scuba_gear.title,Things Are Going Swimmingly! advancement.gm4.scuba_gear.description,Suit up with a full set of SCUBA gear text.gm4.guidebook.module_desc.scuba_gear,Ease ocean exploration with craftable scuba gear! text.gm4.guidebook.scuba_gear.description,SCUBA Gear can be crafted to aid in ocean travel.\n\nCopper and dried kelp are main components for each piece. text.gm4.guidebook.scuba_gear.crafting_flippers,Flippers can be crafted with the following recipe: text.gm4.guidebook.scuba_gear.crafting_scuba_helmet,The SCUBA Helmet can be crafted with the following recipe: text.gm4.guidebook.scuba_gear.crafting_scuba_tank,The SCUBA Tank can be crafted with the following recipe: text.gm4.guidebook.scuba_gear.crafting_wetsuit,The Wetsuit can be crafted with the following recipe: text.gm4.guidebook.scuba_gear.usage_flippers,"Flippers allow the user to swim much faster, but land traversal is greatly slowed." text.gm4.guidebook.scuba_gear.usage_wetsuit,"The Wetsuit allows the user to swim up or down much faster, and maintains their current depth." text.gm4.guidebook.scuba_gear.usage_scuba_tank,Wearing the scuba tank adds 4 minutes of underwater breathing time. text.gm4.guidebook.scuba_gear.usage_scuba_helmet,Wearing the scuba helmet increases underwater mining speed by 6 times. item.modifiers.gm4.scuba_gear.in_water,"When in Water:" item.modifiers.gm4.scuba_gear.on_land,"When on Land:" item.modifiers.gm4.scuba_gear.neutral_buoyancy,"Neutral Buoyancy" item.modifiers.gm4.scuba_gear.vertical_swimming_speed,"Vertical Swimming Speed" ================================================ FILE: gm4_scuba_gear/beet.yaml ================================================ id: gm4_scuba_gear name: SCUBA Gear version: 2.1.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Ease ocean exploration with craftable scuba gear! recommended: - gm4_sunken_treasure notes: - This data pack requires you to use the Gamemode 4 resource pack! Restart the server/world after adding this data pack! modrinth: project_id: 6AVYWZgD wiki: https://wiki.gm4.co/wiki/SCUBA_Gear credits: Creator: - BPR Updated by: - TheEpyonProject Textures by: - BPR Icon Design: - DuckJr ================================================ FILE: gm4_scuba_gear/data/gm4/advancement/scuba_gear.json ================================================ { "display": { "icon": { "id": "minecraft:leather_helmet", "components": { "minecraft:item_model": "gm4_scuba_gear:scuba_helmet" } }, "title": { "translate": "advancement.gm4.scuba_gear.title", "fallback": "Things Are Going Swimmingly!" }, "description": { "translate": "advancement.gm4.scuba_gear.description", "fallback": "Suit up with a full set of SCUBA gear", "color": "gray" } }, "parent": "gm4:root", "criteria": { "all_gear_equipped": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_scuba_gear:all_gear_equipped" } ] } } } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/flippers.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "conditions": { "recipe": "gm4_scuba_gear:flippers" }, "trigger": "minecraft:recipe_unlocked" }, "in_deep_water": { "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_scuba_gear:in_deep_water" } ] }, "trigger": "minecraft:location" } }, "requirements": [ [ "has_the_recipe", "in_deep_water" ] ], "rewards": { "recipes": [ "gm4_scuba_gear:flippers" ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/scuba_helmet.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "conditions": { "recipe": "gm4_scuba_gear:scuba_helmet" }, "trigger": "minecraft:recipe_unlocked" }, "in_deep_water": { "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_scuba_gear:in_deep_water" } ] }, "trigger": "minecraft:location" } }, "requirements": [ [ "has_the_recipe", "in_deep_water" ] ], "rewards": { "recipes": [ "gm4_scuba_gear:scuba_helmet" ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/scuba_tank.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "conditions": { "recipe": "gm4_scuba_gear:scuba_tank" }, "trigger": "minecraft:recipe_unlocked" }, "in_deep_water": { "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_scuba_gear:in_deep_water" } ] }, "trigger": "minecraft:location" } }, "requirements": [ [ "has_the_recipe", "in_deep_water" ] ], "rewards": { "recipes": [ "gm4_scuba_gear:scuba_tank" ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/advancement/recipes/wetsuit.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "conditions": { "recipe": "gm4_scuba_gear:wetsuit" }, "trigger": "minecraft:recipe_unlocked" }, "in_deep_water": { "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_scuba_gear:in_deep_water" } ] }, "trigger": "minecraft:location" } }, "requirements": [ [ "has_the_recipe", "in_deep_water" ] ], "rewards": { "recipes": [ "gm4_scuba_gear:wetsuit" ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/enchantment/flippers.json ================================================ { "description": "", "supported_items": "minecraft:leather_boots", "weight": 1, "max_level": 1, "min_cost": { "base": 0, "per_level_above_first": 0 }, "max_cost": { "base": 0, "per_level_above_first": 0 }, "anvil_cost": 0, "slots": [ "feet" ], "effects": { "minecraft:location_changed": [ { "requirements": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "fluid": { "fluids": "#minecraft:water" } } } }, "effect": { "type": "minecraft:attribute", "attribute": "minecraft:movement_speed", "id": "gm4_scuba_gear:flippers/on_land", "amount": 0.25, "operation": "add_multiplied_base" } }, { "requirements": { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "fluid": { "fluids": "#minecraft:water" } } } } }, "effect": { "type": "minecraft:attribute", "attribute": "minecraft:movement_speed", "id": "gm4_scuba_gear:flippers/on_land", "amount": -0.25, "operation": "add_multiplied_base" } } ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/enchantment/wetsuit.json ================================================ { "description": "", "supported_items": "minecraft:leather_leggings", "weight": 1, "max_level": 1, "min_cost": { "base": 0, "per_level_above_first": 0 }, "max_cost": { "base": 0, "per_level_above_first": 0 }, "anvil_cost": 0, "slots": [ "legs" ], "effects": { "minecraft:tick": [ { "requirements": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } }, { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_sg_buoyancy": { "min": -1, "max": 1 } } } ] } ], "effect": { "type": "minecraft:run_function", "function": "gm4_scuba_gear:wetsuit_buoyancy/clear" } }, { "requirements": [ { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "input": { "jump": false, "sneak": false } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "input": { "jump": true, "sneak": true } } } } ] }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_sg_buoyancy": 0 } } } ], "effect": { "type": "minecraft:run_function", "function": "gm4_scuba_gear:wetsuit_buoyancy/neutral" } }, { "requirements": [ { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_sg_buoyancy": -1 } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "input": { "jump": false, "sneak": true } } } } ], "effect": { "type": "minecraft:run_function", "function": "gm4_scuba_gear:wetsuit_buoyancy/negative" } }, { "requirements": [ { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_sg_buoyancy": 1 } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "minecraft:player", "input": { "jump": true, "sneak": false } } } } ], "effect": { "type": "minecraft:run_function", "function": "gm4_scuba_gear:wetsuit_buoyancy/positive" } } ] } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/function/init.mcfunction ================================================ scoreboard objectives add gm4_sg_buoyancy dummy execute unless score scuba_gear gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Scuba Gear"} execute unless score scuba_gear gm4_earliest_version < scuba_gear gm4_modules run scoreboard players operation scuba_gear gm4_earliest_version = scuba_gear gm4_modules scoreboard players set scuba_gear gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/clear.mcfunction ================================================ # removes wetsuit attributes when out of water # @s = player wearing wetsuit # located at @s # run from enchant, gm4_scuba_gear:enchantment/wetsuit item modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/clear scoreboard players reset @s gm4_sg_buoyancy ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/negative.mcfunction ================================================ # increases player gravity when actively sinking # @s = player wearing wetsuit, sneak input # located at @s, in water # run from enchant, gm4_scuba_gear:enchantment/wetsuit item modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/negative scoreboard players set @s gm4_sg_buoyancy -1 ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/neutral.mcfunction ================================================ # negates player gravity to maintain vertical position # @s = player wearing wetsuit, not sneak or jump input # located at @s, in water # run from enchant, gm4_scuba_gear:enchantment/wetsuit item modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/neutral scoreboard players set @s gm4_sg_buoyancy 0 ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/function/wetsuit_buoyancy/positive.mcfunction ================================================ # decreases player gravity when actively ascending # @s = player wearing wetsuit, jump input # located at @s, in water # run from enchant, gm4_scuba_gear:enchantment/wetsuit item modify entity @s armor.legs gm4_scuba_gear:wetsuit_buoyancy/positive scoreboard players set @s gm4_sg_buoyancy 1 ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/guidebook/scuba_gear.json ================================================ { "id": "scuba_gear", "name": "SCUBA Gear", "module_type": "module", "icon": { "id": "minecraft:horn_coral" }, "criteria": { "obtain_copper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:copper_ingot" ] } ] } }, "obtain_dried_kelp": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:dried_kelp" ] } ] } }, "obtain_scuba_helmet": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"helmet\"}}" } } ] } }, "obtain_scuba_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_chestplate" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"tank\"}}" } } ] } }, "obtain_wetsuit": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_leggings" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"wetsuit\"}}" } } ] } }, "obtain_flippers": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"flippers\"}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.scuba_gear.description", "fallback": "SCUBA Gear can be crafted to aid in ocean travel.\n\nCopper and dried kelp are main components for each piece." } ] ] }, { "name": "crafting_flippers", "enable": [], "requirements": [ [ "obtain_dried_kelp" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.crafting_flippers", "fallback": "Flippers can be crafted with the following recipe:" }, "\n", { "insert": "recipe", "recipe": "gm4_scuba_gear:flippers" } ] ] }, { "name": "crafting_wetsuit", "enable": [], "requirements": [ [ "obtain_dried_kelp" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.crafting_wetsuit", "fallback": "The Wetsuit can be crafted with the following recipe:" }, "\n", { "insert": "recipe", "recipe": "gm4_scuba_gear:wetsuit" } ] ] }, { "name": "crafting_scuba_helmet", "enable": [], "requirements": [ [ "obtain_copper" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.crafting_scuba_helmet", "fallback": "The SCUBA Helmet can be crafted with the following recipe:" }, "\n", { "insert": "recipe", "recipe": "gm4_scuba_gear:scuba_helmet" } ] ] }, { "name": "crafting_scuba_tank", "enable": [], "requirements": [ [ "obtain_copper" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.crafting_scuba_tank", "fallback": "The SCUBA Tank can be crafted with the following recipe:" }, "\n", { "insert": "recipe", "recipe": "gm4_scuba_gear:scuba_tank" } ] ] }, { "name": "usage_flippers", "enable": [], "requirements": [ [ "obtain_flippers" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.usage_flippers", "fallback": "Flippers allow the user to swim much faster, but land traversal is greatly slowed." } ] ] }, { "name": "usage_wetsuit", "enable": [], "requirements": [ [ "obtain_wetsuit" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.usage_wetsuit", "fallback": "The Wetsuit allows the user to swim up or down much faster, and maintains their current depth." } ] ] }, { "name": "usage_scuba_tank", "enable": [], "requirements": [ [ "obtain_scuba_tank" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.usage_scuba_tank", "fallback": "Wearing the scuba tank adds 4 minutes of underwater breathing time." } ] ] }, { "name": "usage_scuba_helmet", "enable": [], "requirements": [ [ "obtain_scuba_helmet" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.scuba_gear.usage_scuba_helmet", "fallback": "Wearing the scuba helmet increases underwater mining speed by 6 times." } ] ] } ] } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/clear.json ================================================ { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:gravity", "id": "gm4_scuba_gear:wetsuit_buoyancy", "amount": 0, "operation": "add_value", "slot": "legs" } ], "replace": false } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/negative.json ================================================ { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:gravity", "id": "gm4_scuba_gear:wetsuit_buoyancy", "amount": -1.2, "operation": "add_multiplied_total", "slot": "legs" } ], "replace": false } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/neutral.json ================================================ { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:gravity", "id": "gm4_scuba_gear:wetsuit_buoyancy", "amount": -1, "operation": "add_multiplied_total", "slot": "legs" } ], "replace": false } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/item_modifier/wetsuit_buoyancy/positive.json ================================================ { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:gravity", "id": "gm4_scuba_gear:wetsuit_buoyancy", "amount": 1.2, "operation": "add_multiplied_total", "slot": "legs" } ], "replace": false } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/flippers.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_boots", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:item_name": { "translate": "item.gm4.flippers", "fallback": "Flippers" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "id": "minecraft:generic.armor", "amount": 1, "operation": "add_value", "slot": "feet" }, { "type": "minecraft:water_movement_efficiency", "id": "gm4_scuba_gear:flippers/water_movement_efficiency", "amount": 1, "operation": "add_value", "slot": "feet" } ], "minecraft:custom_data": { "gm4_scuba_gear": { "item": "flippers" } }, "minecraft:item_model": "gm4_scuba_gear:flippers", "minecraft:enchantable": { "value": 8 }, "minecraft:enchantments": { "gm4_scuba_gear:flippers": 1 }, "minecraft:enchantment_glint_override": false, "minecraft:equippable": { "slot": "feet", "asset_id": "gm4_scuba_gear:scuba" }, "minecraft:max_damage": 156, "minecraft:lore": [ { "translate": "item.modifiers.gm4.scuba_gear.on_land", "fallback": "When on Land:", "color": "gray", "italic": false }, { "translate": "attribute.modifier.take.1", "with": [ "25", { "translate": "attribute.name.generic.movement_speed", "fallback": "Speed" } ], "color": "red", "italic": false } ] } } ] } ] } ] } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/scuba_helmet.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_helmet", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:item_name": { "translate": "item.gm4.scuba_helmet", "fallback": "SCUBA Helmet" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "id": "minecraft:armor.helmet", "slot": "head", "amount": 3, "operation": "add_value" }, { "type": "minecraft:submerged_mining_speed", "id": "gm4_scuba_gear:scuba_helmet/submerged_mining_speed", "slot": "head", "amount": 5, "operation": "add_multiplied_total" } ], "minecraft:custom_data": { "gm4_scuba_gear": { "item": "helmet" } }, "!minecraft:enchantable": {}, "minecraft:equippable": { "slot": "head", "asset_id": "gm4_scuba_gear:scuba", "camera_overlay": "gm4_scuba_gear:misc/scuba_helmet" }, "minecraft:max_damage": 132, "minecraft:max_stack_size": 1, "minecraft:item_model": "gm4_scuba_gear:scuba_helmet", "minecraft:rarity": "common" } } ] } ] } ] } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/scuba_tank.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_chestplate", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:item_name": { "translate": "item.gm4.scuba_tank", "fallback": "SCUBA Tank" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "slot": "chest", "id": "gm4_scuba_gear:tank_armor", "amount": 4, "operation": "add_value" }, { "type": "minecraft:oxygen_bonus", "id": "gm4_scuba_gear:tank/oxygen_bonus", "amount": 16, "operation": "add_value", "slot": "chest" } ], "minecraft:custom_data": { "gm4_scuba_gear": { "item": "tank" } }, "minecraft:item_model": "gm4_scuba_gear:scuba_tank", "!minecraft:enchantable": {}, "minecraft:equippable": { "slot": "chest", "asset_id": "gm4_scuba_gear:scuba" }, "minecraft:max_damage": 192, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] } } } ] } ] } ] } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/loot_table/items/wetsuit.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_leggings", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:item_name": { "translate": "item.gm4.wetsuit", "fallback": "Wetsuit" }, "minecraft:custom_data": { "gm4_scuba_gear": { "item": "wetsuit" } }, "minecraft:item_model": "gm4_scuba_gear:wetsuit", "minecraft:equippable": { "slot": "legs", "asset_id": "gm4_scuba_gear:scuba", "equip_sound": "minecraft:intentionally_empty" }, "minecraft:enchantments": { "gm4_scuba_gear:wetsuit": 1 }, "minecraft:enchantment_glint_override": false, "minecraft:max_damage": 180, "!minecraft:enchantable": {}, "minecraft:lore": [ { "translate": "item.modifiers.gm4.scuba_gear.in_water", "fallback": "When in Water:", "color": "gray", "italic": false }, { "translate": "item.modifiers.gm4.scuba_gear.neutral_buoyancy", "fallback": "Neutral Buoyancy", "color": "blue", "italic": false }, { "translate": "attribute.modifier.plus.1", "with": [ "20", { "translate": "item.modifiers.gm4.scuba_gear.vertical_swimming_speed", "fallback": "Vertical Swimming Speed" } ], "color": "blue", "italic": false } ] } } ] } ] } ] } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/predicate/all_gear_equipped.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"helmet\"}}" } }, "chest": { "items": [ "minecraft:leather_chestplate" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"tank\"}}" } }, "legs": { "items": [ "minecraft:leather_chestplate" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"wetsuit\"}}" } }, "feet": { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"flippers\"}}" } } } } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/predicate/flippers_equipped.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "items": [ "minecraft:leather_boots" ], "predicates": { "minecraft:custom_data": "{gm4_scuba_gear:{item:\"flippers\"}}" } } } } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/predicate/in_deep_water.json ================================================ [ { "condition": "minecraft:location_check", "offsetY": 0, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 2, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 3, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 4, "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/predicate/in_water.json ================================================ { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/recipe/flippers.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ "C C", "K K" ], "key": { "C": [ "minecraft:copper_ingot" ], "K": [ "minecraft:dried_kelp" ] }, "result": { "id": "minecraft:leather_boots", "components": { "minecraft:item_name": { "translate": "item.gm4.flippers", "fallback": "Flippers" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "id": "minecraft:generic.armor", "amount": 1, "operation": "add_value", "slot": "feet" }, { "type": "minecraft:water_movement_efficiency", "id": "gm4_scuba_gear:flippers/water_movement_efficiency", "amount": 1, "operation": "add_value", "slot": "feet" } ], "minecraft:item_model": "gm4_scuba_gear:flippers", "minecraft:custom_data": { "gm4_scuba_gear": { "item": "flippers" } }, "minecraft:dyed_color": 2367281, "minecraft:enchantable": { "value": 8 }, "minecraft:enchantments": { "gm4_scuba_gear:flippers": 1 }, "minecraft:enchantment_glint_override": false, "minecraft:equippable": { "slot": "feet", "asset_id": "gm4_scuba_gear:scuba" }, "minecraft:max_damage": 156, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] }, "minecraft:lore": [ { "translate": "item.modifiers.gm4.scuba_gear.on_land", "fallback": "When on Land:", "color": "gray", "italic": false }, { "translate": "attribute.modifier.take.1", "with": [ "25", { "translate": "attribute.name.generic.movement_speed", "fallback": "Speed" } ], "color": "red", "italic": false } ] }, "count": 1 } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/recipe/scuba_helmet.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ "CCC", "CGC" ], "key": { "C": [ "minecraft:copper_ingot" ], "G": [ "minecraft:glass" ] }, "result": { "id": "minecraft:leather_helmet", "components": { "minecraft:item_name": { "translate": "item.gm4.scuba_helmet", "fallback": "SCUBA Helmet" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "id": "minecraft:armor.helmet", "amount": 3, "operation": "add_value", "slot": "head" }, { "type": "minecraft:submerged_mining_speed", "id": "gm4_scuba_gear:scuba_helmet/submerged_mining_speed", "amount": 5, "operation": "add_multiplied_total", "slot": "head" } ], "minecraft:custom_data": { "gm4_scuba_gear": { "item": "helmet" } }, "minecraft:item_model": "gm4_scuba_gear:scuba_helmet", "!minecraft:enchantable": {}, "minecraft:equippable": { "slot": "head", "asset_id": "gm4_scuba_gear:scuba", "camera_overlay": "gm4_scuba_gear:misc/scuba_helmet" }, "minecraft:max_damage": 132, "minecraft:max_stack_size": 1, "minecraft:rarity": "common" }, "count": 1 } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/recipe/scuba_tank.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ "C C", "PCP", "CCC" ], "key": { "C": [ "minecraft:copper_ingot" ], "P": [ "minecraft:decorated_pot" ] }, "result": { "id": "minecraft:leather_chestplate", "components": { "minecraft:item_name": { "translate": "item.gm4.scuba_tank", "fallback": "SCUBA Tank" }, "minecraft:attribute_modifiers": [ { "type": "minecraft:armor", "id": "gm4_scuba_gear:tank/armor", "amount": 4, "operation": "add_value", "slot": "chest" }, { "type": "minecraft:oxygen_bonus", "id": "gm4_scuba_gear:tank/oxygen_bonus", "amount": 16, "operation": "add_value", "slot": "chest" } ], "minecraft:custom_data": { "gm4_scuba_gear": { "item": "tank" } }, "minecraft:item_model": "gm4_scuba_gear:scuba_tank", "!minecraft:enchantable": {}, "minecraft:equippable": { "slot": "chest", "asset_id": "gm4_scuba_gear:scuba" }, "minecraft:max_damage": 192, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] } }, "count": 1 } } ================================================ FILE: gm4_scuba_gear/data/gm4_scuba_gear/recipe/wetsuit.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ "KCK", "K K", "K K" ], "key": { "C": [ "minecraft:copper_ingot" ], "K": [ "minecraft:dried_kelp" ] }, "result": { "id": "minecraft:leather_leggings", "components": { "minecraft:item_name": { "translate": "item.gm4.wetsuit", "fallback": "Wetsuit" }, "minecraft:max_damage": 180, "!minecraft:enchantable": {}, "minecraft:dyed_color": 2367281, "minecraft:custom_data": { "gm4_scuba_gear": { "item": "wetsuit" } }, "minecraft:item_model": "gm4_scuba_gear:wetsuit", "minecraft:enchantments": { "gm4_scuba_gear:wetsuit": 1 }, "minecraft:enchantment_glint_override": false, "minecraft:equippable": { "slot": "legs", "asset_id": "gm4_scuba_gear:scuba", "equip_sound": "minecraft:intentionally_empty" }, "minecraft:rarity": "common", "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] }, "minecraft:lore": [ { "translate": "item.modifiers.gm4.scuba_gear.in_water", "fallback": "When in Water:", "color": "gray", "italic": false }, { "translate": "item.modifiers.gm4.scuba_gear.neutral_buoyancy", "fallback": "Neutral Buoyancy", "color": "blue", "italic": false }, { "translate": "attribute.modifier.plus.1", "with": [ "20", { "translate": "item.modifiers.gm4.scuba_gear.vertical_swimming_speed", "fallback": "Vertical Swimming Speed" } ], "color": "blue", "italic": false } ] }, "count": 1 } } ================================================ FILE: gm4_scuba_gear/data/minecraft/tags/enchantment/curse.json ================================================ { "replace": false, "values": [ {"id": "gm4_scuba_gear:wetsuit", "required": false}, {"id": "gm4_scuba_gear:flippers", "required": false} ] } ================================================ FILE: gm4_shapeless_portals/README.md ================================================ # Shapeless Portals Rectangles are boring, so use this data pack and make your Nether Portals any shape your heart desires! There is 1 portal among us ### Features - Light portals of any shape with Flint and Steel or Fire Charges. - Portals can use Crying Obsidian. ================================================ FILE: gm4_shapeless_portals/beet.yaml ================================================ id: gm4_shapeless_portals name: Shapeless Portals version: 1.4.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [] website: description: Say goodbye to your boring old rectangular portals! recommended: [] notes: [] modrinth: project_id: eq7hf4YU smithed: pack_id: gm4_shapeless_portals wiki: https://wiki.gm4.co/wiki/Shapeless_Portals credits: Creator: - Djones Icon Design: - Hozz ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/advancement/light_portal.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_shapeless_portals" }, "score": "load.status" }, "range": 1 }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:overworld" } }, { "condition": "minecraft:location_check", "predicate": { "dimension": "minecraft:the_nether" } } ] } ], "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:flint_and_steel", "minecraft:fire_charge" ] } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } } ] } } }, "rewards": { "function": "gm4_shapeless_portals:portal_lit" } } ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/init.mcfunction ================================================ execute unless score shapeless_portals gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Shapeless Portals"} execute unless score shapeless_portals gm4_earliest_version < shapeless_portals gm4_modules run scoreboard players operation shapeless_portals gm4_earliest_version = shapeless_portals gm4_modules scoreboard players set shapeless_portals gm4_modules 1 scoreboard objectives add gm4_sp_data dummy execute unless score $max_portal_size gm4_sp_data matches 0.. run scoreboard players set $max_portal_size gm4_sp_data 441 #$moduleUpdateList ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/portal_found.mcfunction ================================================ # check a found possible portal frame # @s = player lighting the portal # at fire where portal was lit # run from raycast # stop raycast scoreboard players set $raycast_limit gm4_sp_data 0 # create marker for origin of portal kill @e[type=marker,tag=gm4_sp_portal] summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_origin"]} setblock ~ ~ ~ air # try to fill x-axis portal scoreboard players set $portal_blocks gm4_sp_data 0 scoreboard players set $portal_build gm4_sp_data 0 execute as @e[type=marker,tag=gm4_sp_portal_origin] at @s if predicate gm4_shapeless_portals:portal_validity_x run function gm4_shapeless_portals:x/flood_fill execute if score $portal_blocks gm4_sp_data matches 1.. if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data run function gm4_shapeless_portals:x/build # try to fill z-axis portal kill @e[type=marker,tag=gm4_sp_portal,tag=!gm4_sp_portal_origin] scoreboard players set $portal_blocks gm4_sp_data 0 execute if score $portal_build gm4_sp_data matches 0 as @e[type=marker,tag=gm4_sp_portal_origin] at @s if predicate gm4_shapeless_portals:portal_validity_z run function gm4_shapeless_portals:z/flood_fill execute if score $portal_blocks gm4_sp_data matches 1.. if score $portal_build gm4_sp_data matches 0 if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data run function gm4_shapeless_portals:z/build # if no portal can be made return fire execute if score $portal_build gm4_sp_data matches 0 at @e[type=marker,tag=gm4_sp_portal_origin] run setblock ~ ~ ~ fire kill @e[type=marker,tag=gm4_sp_portal] ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/portal_lit.mcfunction ================================================ # start raycast to find portal location # @s = player that lit the portal # at @s advancement revoke @s only gm4_shapeless_portals:light_portal scoreboard players set $raycast_limit gm4_sp_data 12 execute anchored eyes positioned ^ ^ ^0.5 run function gm4_shapeless_portals:raycast ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/raycast.mcfunction ================================================ # raycast to find fire block in portal frame # @s = player that lit the portal # at @s, raycasting forward # run from portal_lit # run from here scoreboard players remove $raycast_limit gm4_sp_data 1 execute if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~1 ~ ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~-1 ~ ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~ ~1 if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~ ~-1 if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~1 ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ~ ~-1 ~ if block ~ ~ ~ fire if block ~ ~-1 ~ #gm4_shapeless_portals:portal_block run function gm4_shapeless_portals:portal_found execute if score $raycast_limit gm4_sp_data matches 1.. positioned ^ ^ ^0.5 run function gm4_shapeless_portals:raycast ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/build.mcfunction ================================================ # fill in the portal frame # @s = portal frame marker # at each portal block # run from portal_found execute at @e[type=marker,tag=gm4_sp_portal] run setblock ~ ~ ~ nether_portal[axis=x] scoreboard players set $portal_build gm4_sp_data 1 ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/check_location.mcfunction ================================================ # check if new location is valid for a portal frame # @s = new portal frame marker # at potential new portal block # run from x/flood_fill tag @s remove gm4_sp_portal_check execute unless predicate gm4_shapeless_portals:portal_validity_x run scoreboard players set $portal_blocks gm4_sp_data 9999 ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/x/flood_fill.mcfunction ================================================ # fill new blocks in portal frame # @s = portal frame marker # at potential new portal block # run from portal_found # run from here scoreboard players add $portal_blocks gm4_sp_data 1 tag @s remove gm4_sp_portal_new # floodfill possible portal area execute positioned ~1 ~ ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~-1 ~ ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} # check if new filled areas are valid for portals execute as @e[type=marker,tag=gm4_sp_portal_check] at @s run function gm4_shapeless_portals:x/check_location # continue to fill until portal block cap is reached execute if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data as @e[type=marker,tag=gm4_sp_portal_new,limit=1] at @s run function gm4_shapeless_portals:x/flood_fill ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/build.mcfunction ================================================ # fill in the portal frame # @s = portal frame marker # at each portal block # run from portal_found execute at @e[type=marker,tag=gm4_sp_portal] run setblock ~ ~ ~ nether_portal[axis=z] scoreboard players set $portal_build gm4_sp_data 1 ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/check_location.mcfunction ================================================ # check if new location is valid for a portal frame # @s = new portal frame marker # at potential new portal block # run from z/flood_fill tag @s remove gm4_sp_portal_check execute unless predicate gm4_shapeless_portals:portal_validity_z run scoreboard players set $portal_blocks gm4_sp_data 9999 ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/function/z/flood_fill.mcfunction ================================================ # fill new blocks in portal frame # @s = portal frame marker # at potential new portal block # run from portal_found # run from here scoreboard players add $portal_blocks gm4_sp_data 1 tag @s remove gm4_sp_portal_new # floodfill possible portal area execute positioned ~ ~ ~1 if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~ ~ ~-1 if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} execute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:air unless entity @e[type=marker,tag=gm4_sp_portal,distance=..0.5,limit=1] run summon marker ~ ~ ~ {Tags:["gm4_sp_portal","gm4_sp_portal_new","gm4_sp_portal_check"]} # check if new filled areas are valid for portals execute as @e[type=marker,tag=gm4_sp_portal_check] at @s run function gm4_shapeless_portals:z/check_location # continue to fill until portal block cap is reached execute if score $portal_blocks gm4_sp_data <= $max_portal_size gm4_sp_data as @e[type=marker,tag=gm4_sp_portal_new,limit=1] at @s run function gm4_shapeless_portals:z/flood_fill ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/guidebook/shapeless_portals.json ================================================ { "id": "shapeless_portals", "name": "Shapeless Portals", "module_type": "module", "icon": { "id": "minecraft:crying_obsidian" }, "criteria": { "light_portal": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:flint_and_steel", "minecraft:fire_charge" ] } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "light_portal" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.shapeless_portals.description", "fallback": "Portals can be of all shapes and sizes as long as it is an enclosed loop of obsidian.\n\nCrying obsidian also works to create a portal." } ] ] } ] } ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/predicate/portal_validity_x.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetX": 1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetX": 1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetX": -1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetX": -1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] } ] ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/predicate/portal_validity_z.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetZ": 1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetZ": -1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#gm4_shapeless_portals:portal_block" } } }, { "condition": "minecraft:location_check", "offsetY": -1, "predicate": { "block": { "blocks": "#minecraft:air" } } } ] } ] ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/tags/block/portal_block.json ================================================ { "values": [ "minecraft:crying_obsidian", "minecraft:obsidian" ] } ================================================ FILE: gm4_shapeless_portals/data/gm4_shapeless_portals/test/create_1x2_portal.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 # @optional fill ~ ~ ~1 ~2 ~3 ~1 obsidian fill ~1 ~1 ~1 ~1 ~2 ~1 air execute at @s run tp @s ~ ~ ~ facing ~ ~-2 ~1 item replace entity @s weapon.mainhand with flint_and_steel dummy @s use block ~1 ~ ~1 up await block ~1 ~1 ~1 nether_portal assert block ~1 ~2 ~1 nether_portal ================================================ FILE: gm4_shapeless_portals/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.shapeless_portals,Say goodbye to your boring old rectangular portals! text.gm4.guidebook.shapeless_portals.description,Portals can be of all shapes and sizes as long as it is an enclosed loop of obsidian.\n\nCrying obsidian also works to create a portal. ================================================ FILE: gm4_shroomites/README.md ================================================ # Shroomites Mycelium has always been a bit weird, which explains why it has always been locked up on an island. ### Features - Mooshrooms now have a chance of spawning a Shroomite shroom - This can then spread mycelium and create more spores - Spores move very slowly, so take several minecraft days to spread and infect blocks ================================================ FILE: gm4_shroomites/beet.yaml ================================================ id: gm4_shroomites name: Shroomites version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - slow_clock website: description: Ever wondered why all the Mooshrooms are locked up on islands? This Module makes Mooshrooms spread mycelium and mushrooms wherever they go. recommended: [] notes: [] modrinth: project_id: 7Rcai2W4 wiki: https://wiki.gm4.co/wiki/Shroomites credits: Creators: - Sparks - SpecialBuilder32 - Bloo Icon Design: - DuckJr model_data: - item: red_mushroom reference: gui/advancement/shroomites template: advancement ================================================ FILE: gm4_shroomites/data/gm4/advancement/shroomites.json ================================================ { "display": { "icon": { "id": "minecraft:red_mushroom", "components": { "minecraft:custom_model_data": { "floats": [ 3240001 ] } } }, "title": "Things are grim indeed...", "description": "Oh no, did I forget about those mushrooms?", "frame": "challenge", "hidden": true }, "parent": "gm4:root", "criteria": { "requirement": { "trigger": "minecraft:impossible", "conditions": {} } } } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/fast_clock.mcfunction ================================================ # manages spore movements and a slow clock # @s = none # at world spawn # run from gm4_shroomites:main # reset clock counter scoreboard players set $fast_clock gm4_shroom_data 0 # handle spores scoreboard players set $global_spore_count gm4_shroom_data 0 execute as @e[type=marker,tag=gm4_shroomite_spore] at @s run function gm4_shroomites:spore/track_age # manage slow clock scoreboard players add $slow_clock gm4_shroom_data 1 # trigger shroom placement and spore spawning execute if score $slow_clock gm4_shroom_data matches 4.. run function gm4_shroomites:slow_clock ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/init.mcfunction ================================================ # objectives scoreboard objectives add gm4_shroom_data dummy scoreboard objectives add gm4_entity_version dummy # fixed values scoreboard players set #spore_max_age gm4_shroom_data 12 scoreboard players set #spore_placement_cooldown gm4_shroom_data 8 scoreboard players set #shroom_placement_cooldown gm4_shroom_data 64 scoreboard players set #fertilization_cost gm4_shroom_data 2 scoreboard players set #conversion_cost gm4_shroom_data 16 execute unless score #global_spore_cap gm4_shroom_data matches -2147483648..2147483647 run scoreboard players set #global_spore_cap gm4_shroom_data 2048 execute unless score #global_shroom_cap gm4_shroom_data matches -2147483648..2147483647 run scoreboard players set #global_shroom_cap gm4_shroom_data 1024 execute unless score shroomites gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Shroomites"} execute unless score shroomites gm4_earliest_version < shroomites gm4_modules run scoreboard players operation shroomites gm4_earliest_version = shroomites gm4_modules scoreboard players set shroomites gm4_modules 1 schedule function gm4_shroomites:main 1t schedule function gm4_shroomites:slow_clock 32t #$moduleUpdateList ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/main.mcfunction ================================================ # manages a scoreboard clock system to tie the module in with the random tick speed gamerule # manage clock speed execute store result score $random_tick_speed gm4_shroom_data run gamerule random_tick_speed scoreboard players operation $fast_clock gm4_shroom_data += $random_tick_speed gm4_shroom_data # trigger spore movement execute if score $fast_clock gm4_shroom_data matches 6.. run function gm4_shroomites:fast_clock # reschedule schedule function gm4_shroomites:main 16t ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/analyze_color.mcfunction ================================================ # analyzes the color of a mooshroom and tgs it # @s = @e[type=mooshroom] that hasn't been analyzed # at @s # run from gm4_shroomites:mooshroom/shed_shroom # analyze color execute store success score $success gm4_shroom_data if data entity @s {Type:"brown"} run tag @s add gm4_brown_shroomite execute unless score $success gm4_shroom_data matches 1.. run tag @s add gm4_red_shroomite scoreboard players reset $success gm4_shroom_data # remember that this mooshroom has been analyzed tag @s add gm4_shroomite_analyzed ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/convert/brown.mcfunction ================================================ # converts an existing cow into a brown mooshroom # @s = cow to be converted # at @s (after move) # run from gm4_shroomites:spore/move/postmovement # turn cow into a brown mooshroom summon mooshroom ~ ~ ~ {Type:"brown",Tags:["gm4_new_shroomite_mooshroom"]} teleport @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] @s data modify entity @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] {} merge from entity @s {} execute as @e[type=mooshroom,limit=1,distance=0] run function gm4_shroomites:mooshroom/initialize/brown # particles and sound particle minecraft:mycelium ~ ~.8 ~ .4 .4 .4 0 50 playsound minecraft:block.chorus_flower.grow hostile @a[distance=..10] ~ ~ ~ 0.625 particle minecraft:block{block_state:"minecraft:brown_mushroom_block"} ~ ~1 ~ .3 .3 .3 20 20 # add to age scoreboard players operation @s gm4_shroom_data += #conversion_cost gm4_shroom_data # kill cow tp @s ~ -4096 ~ ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/convert/red.mcfunction ================================================ # converts an existing cow into a red mooshroom # @s = cow to be converted # at @s (after move) # run from gm4_shroomites:spore/move/postmovement # turn cow into a red mooshroom summon mooshroom ~ ~ ~ {Type:"red",Tags:["gm4_new_shroomite_mooshroom"]} teleport @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] @s data modify entity @e[type=mooshroom,tag=gm4_new_shroomite_mooshroom,limit=1,distance=0] {} merge from entity @s {} execute as @e[type=mooshroom,limit=1,distance=0] run function gm4_shroomites:mooshroom/initialize/red # particles and sound particle minecraft:mycelium ~ ~.8 ~ .4 .4 .4 0 50 playsound minecraft:block.chorus_flower.grow hostile @a[distance=..10] ~ ~ ~ 0.625 particle minecraft:block{block_state:"minecraft:red_mushroom_block"} ~ ~1 ~ .3 .3 .3 20 20 # add to age scoreboard players operation @s gm4_shroom_data += #conversion_cost gm4_shroom_data # kill cow tp @s ~ -4096 ~ ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/initialize/brown.mcfunction ================================================ # initializes a freshly converted cow # @s = freshly spawned mooshroom # at @s (after move) # run from gm4_shroomites:mooshroom/convert/brown tag @s remove gm4_new_shroomite_mooshroom tag @s add gm4_brown_shroomite tag @s add gm4_shroomite_analyzed ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/initialize/red.mcfunction ================================================ # initializes a freshly converted cow # @s = freshly spawned mooshroom # at @s (after move) # run from gm4_shroomites:mooshroom/convert/red tag @s remove gm4_new_shroomite_mooshroom tag @s add gm4_red_shroomite tag @s add gm4_shroomite_analyzed ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/process.mcfunction ================================================ # runs actions on and as mooshrooms # @s = @e[type=mooshroom] # at @s # run from gm4_shroomites:slow_clock # chance to spawn shroom unless this mooshroom is on cooldown from previous spawn and unless the global cap was reached execute unless score @s gm4_shroom_data matches 1.. if score $global_shroom_count gm4_shroom_data < #global_shroom_cap gm4_shroom_data if predicate gm4_shroomites:mooshroom/shroom_spawn_chance if block ~ ~-1 ~ #gm4_shroomites:spore_convertable if block ~ ~ ~ #gm4_shroomites:shroom_replacable unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..4.5] run function gm4_shroomites:mooshroom/shed_shroom execute if score @s gm4_shroom_data matches 1.. run scoreboard players remove @s gm4_shroom_data 1 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/mooshroom/shed_shroom.mcfunction ================================================ # plants a mushroom after checking the color of this mooshroom # @s = @e[type=mooshroom] that are ready to plant a shroomite_shroom # at @s # run from gm4_shroomites:mooshroom/process # analyze mooshroom color execute unless entity @s[tag=gm4_shroomite_analyzed] run function gm4_shroomites:mooshroom/analyze_color # plant shroom function gm4_shroomites:shroom/create ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/shroom/check_structure.mcfunction ================================================ # makes sure mushroom structure is still present before processing this shroom # @s = @e[type=marker,tag=gm4_shroomite_shroom] # at @s # run from gm4_shroomites:slow_clock # check that this is still inside a red_mushroom execute if entity @s[tag=gm4_brown_shroomite] unless block ~ ~ ~ brown_mushroom run kill @s execute if entity @s[tag=gm4_red_shroomite] unless block ~ ~ ~ red_mushroom run kill @s # process this shroom execute if block ~ ~ ~ #gm4_shroomites:mushrooms run function gm4_shroomites:shroom/process ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/shroom/create.mcfunction ================================================ # places a new sporing shroom at the location this function is run at # @s = either a spore at the end of its life or a mooshroom # at @s # run from gm4_shroomites:spore/die and gm4_shroomites:mooshroom/process # place shroom depending on which mooshroom or spore flavor placed this shroom, default to red execute if entity @s[tag=gm4_brown_shroomite] run function gm4_shroomites:shroom/place/brown execute unless score $success gm4_shroom_data matches 1.. run function gm4_shroomites:shroom/place/red scoreboard players reset $success gm4_shroom_data # add cooldown in case this was planted by a mooshroom scoreboard players operation @s gm4_shroom_data += #shroom_placement_cooldown gm4_shroom_data # sounds playsound minecraft:block.chorus_flower.grow hostile @a[distance=..8] ~ ~ ~ 0.2 0.8 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/shroom/place/brown.mcfunction ================================================ # physically places a new brown_mushroom and places the corrosponding entity # @s = either a spore at the end of its life or a brown mooshroom # at @s # run from gm4_shroomites:shroom/create # place mushroom block unless there is already a mushroom block in this location execute unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ brown_mushroom destroy # place marker entity unless there is already a shroomite_shroom in this location. Do not place a marker if the global shroom cap was reached. execute align xyz positioned ~.5 ~.5 ~.5 unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] run summon marker ~ ~ ~ {Tags:["gm4_shroomite_shroom","gm4_brown_shroomite","smithed.entity","smithed.strict","smithed.block"],CustomName:"gm4_shroomite_shroom"} execute align xyz positioned ~.5 ~.5 ~.5 run scoreboard players set @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] gm4_entity_version 1 # particles particle minecraft:block{block_state:"minecraft:brown_mushroom"} ~ ~ ~ 0.1 0.1 0.1 1 10 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/shroom/place/red.mcfunction ================================================ # physically places a new red_mushroom and places the corrosponding entity # @s = either a spore at the end of its life or a red mooshroom # at @s # run from gm4_shroomites:shroom/create # place mushroom block unless there is already a mushroom block in this location execute unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ red_mushroom destroy # place marker entity unless there is already a shroomite_shroom in this location. Do not place a marker if the global shroom cap was reached. execute align xyz positioned ~.5 ~.5 ~.5 unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] run summon marker ~ ~ ~ {Tags:["gm4_shroomite_shroom","gm4_red_shroomite","smithed.entity","smithed.strict","smithed.block"],CustomName:"gm4_shroomite_shroom"} execute align xyz positioned ~.5 ~.5 ~.5 run scoreboard players set @e[type=marker,tag=gm4_shroomite_shroom,distance=..0.1] gm4_entity_version 1 # particles particle minecraft:block{block_state:"minecraft:red_mushroom"} ~ ~ ~ 0.1 0.1 0.1 1 10 # set fake player flag scoreboard players set $success gm4_shroom_data 1 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/shroom/process.mcfunction ================================================ # runs actions on and as sporing shrooms # @s = @e[type=marker,tag=gm4_shroomite_shroom] # at @s # run from gm4_shroomites:shroom/check_structure # count total shrooms scoreboard players add $global_shroom_count gm4_shroom_data 1 # chance to spawn spore unless this shroom is on cooldown from previous spawn execute unless score @s gm4_shroom_data matches 1.. if predicate gm4_shroomites:shroom/spore_spawn_chance run function gm4_shroomites:spore/spawn execute if score @s gm4_shroom_data matches 1.. run scoreboard players remove @s gm4_shroom_data 1 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/slow_clock.mcfunction ================================================ # manages shroom placement and shroom behavior # @s = none # at world spawn # run from gm4_shroomites:fast_clock # reset clock counter scoreboard players set $slow_clock gm4_shroom_data 0 # handle shrooms scoreboard players set $global_shroom_count gm4_shroom_data 0 execute as @e[type=marker,tag=gm4_shroomite_shroom] at @s run function gm4_shroomites:shroom/check_structure # handle mooshrooms placing shrooms execute as @e[type=mooshroom,tag=!smithed.entity] at @s run function gm4_shroomites:mooshroom/process # grant advancement if shroomite cap has been reached execute if score $global_shroom_count gm4_shroom_data >= #global_shroom_cap gm4_shroom_data run advancement grant @a only gm4:shroomites ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/die.mcfunction ================================================ # kills the selected spore. Tries to plant a new shroomite_shroom if possible # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:spore/track_age # try to place new sporing shroom if there is mycelium below, unless the global cap has been reached execute if score $global_shroom_count gm4_shroom_data < #global_shroom_cap gm4_shroom_data if block ~ ~-1 ~ mycelium if block ~ ~ ~ #gm4_shroomites:shroom_replacable unless entity @e[type=marker,tag=gm4_shroomite_shroom,distance=..4.5] run function gm4_shroomites:shroom/create # kill spore kill @s ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/fertilize.mcfunction ================================================ # turns a block below this spore into mycelium and uses up some of the age of this spore # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:spore/move/postmovement # place mycelium setblock ~ ~-1 ~ mycelium replace execute if block ~ ~ ~ #gm4:foliage unless block ~ ~ ~ #gm4_shroomites:mushrooms run setblock ~ ~ ~ air destroy # add to age scoreboard players operation @s gm4_shroom_data += #fertilization_cost gm4_shroom_data # particles and sounds particle minecraft:block{block_state:"minecraft:mycelium"} ~ ~ ~ 0.12 0 0.12 1 2 playsound minecraft:block.chorus_flower.grow hostile @a[distance=..16] ~ ~ ~ 0.1 0 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/initialize.mcfunction ================================================ # sets up the marker used for spore entities # @s = shroomite_shroom ready to spawn a spore if the global spore cap has not yet been reached # at @s # run from gm4_shroomites:spore/spawn # place correct marker depending on spore color execute store success score $success gm4_shroom_data if entity @s[tag=gm4_brown_shroomite] run summon marker ~ ~ ~ {Tags:["gm4_shroomite_spore","gm4_brown_shroomite"],CustomName:"gm4_shroomite_spore"} execute unless score $success gm4_shroom_data matches 1.. run summon marker ~ ~ ~ {Tags:["gm4_shroomite_spore","gm4_red_shroomite"],CustomName:"gm4_shroomite_spore"} scoreboard players reset $success gm4_shroom_data ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/move/horizontal.mcfunction ================================================ # moves a spore one step horizontally # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:spore/move/vertical # select valid directions summon marker ~1 ~ ~ {Tags:["gm4_shroomite_path"],CustomName:"gm4_shroomite_path"} summon marker ~-1 ~ ~ {Tags:["gm4_shroomite_path"],CustomName:"gm4_shroomite_path"} summon marker ~ ~ ~1 {Tags:["gm4_shroomite_path"],CustomName:"gm4_shroomite_path"} summon marker ~ ~ ~-1 {Tags:["gm4_shroomite_path"],CustomName:"gm4_shroomite_path"} execute as @e[type=marker,tag=gm4_shroomite_path] at @s if block ~ ~ ~ #gm4:full_collision run function gm4_shroomites:spore/move/step_up # move in random valid direction teleport @s @e[type=marker,tag=gm4_shroomite_path,sort=random,limit=1,distance=..1.5] kill @e[type=marker,tag=gm4_shroomite_path,distance=..1.5] # environmental effects execute at @s run function gm4_shroomites:spore/move/postmovement ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/move/postmovement.mcfunction ================================================ # applies environmental effects after the spore has moved # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s (after move) # run from gm4_shroomites:spore/move/horizontal # subtract from age and convert dirt below to mycelium execute unless block ~ ~-1 ~ mycelium if block ~ ~-1 ~ #gm4_shroomites:spore_convertable run function gm4_shroomites:spore/fertilize # subtract from age and convert neraby cows to mooshrooms execute if entity @s[tag=gm4_brown_shroomite] as @e[type=cow,distance=..1,nbt=!{NoAI:1b}] at @s run function gm4_shroomites:mooshroom/convert/brown execute if entity @s[tag=gm4_red_shroomite] as @e[type=cow,distance=..1,nbt=!{NoAI:1b}] at @s run function gm4_shroomites:mooshroom/convert/red ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/move/step_up.mcfunction ================================================ # moves a shroomite_path up by 1 if necessary. # @s = @e[type=marker,tag=gm4_shroomite_path] # at @s # run from gm4_shroomites:spore/move/horizontal # check if there is space above execute unless block ~ ~1 ~ #gm4:full_collision run tp @s ~ ~1 ~ execute if block ~ ~1 ~ #gm4:full_collision run kill @s ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/move/vertical.mcfunction ================================================ # moves a spore one step # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:spore/process # move down if spore is above a block without collision, move horizontally otherwise execute unless block ~ ~-1 ~ #gm4:full_collision if predicate gm4_shroomites:spore/descent_chance store success score $success gm4_shroom_data run tp @s ~ ~-1 ~ execute unless score $success gm4_shroom_data matches 1.. run function gm4_shroomites:spore/move/horizontal scoreboard players reset $success gm4_shroom_data ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/process.mcfunction ================================================ # runs actions on and as spores # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:spore/track_age # count total spores scoreboard players add $global_spore_count gm4_shroom_data 1 # move execute if predicate gm4_shroomites:spore/move_chance run function gm4_shroomites:spore/move/vertical # particles and sounds particle minecraft:mycelium ~ ~ ~ 0.22 0.1 0.22 1 16 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/spawn.mcfunction ================================================ # spawns a spore at the location this function is run at # @s = shroomite_shroom ready to spawn a spore # at @s # run from gm4_shroomites:shroom/process # spawn spore unless the global spore cap has been reached execute if score $global_spore_count gm4_shroom_data < #global_spore_cap gm4_shroom_data run function gm4_shroomites:spore/initialize # set this shroom on cooldown scoreboard players operation @s gm4_shroom_data += #spore_placement_cooldown gm4_shroom_data # particles and sounds playsound minecraft:block.chorus_flower.grow hostile @a[distance=..16] ~ ~ ~ 0.2 0 particle minecraft:mycelium ~ ~-0.35 ~ 0.2 0.07 0.2 1 96 ================================================ FILE: gm4_shroomites/data/gm4_shroomites/function/spore/track_age.mcfunction ================================================ # runs validates that this spore has not died already # @s = @e[type=marker,tag=gm4_shroomite_spore] # at @s # run from gm4_shroomites:main # kill spores that are inside a non-traversable block execute if block ~ ~ ~ #gm4_shroomites:spore_opaque run kill @s # manage age and process actions on spore if age doesn't exceed #spore_max_age scoreboard players add @s gm4_shroom_data 1 execute if score @s gm4_shroom_data > #spore_max_age gm4_shroom_data run function gm4_shroomites:spore/die execute unless score @s gm4_shroom_data > #spore_max_age gm4_shroom_data run function gm4_shroomites:spore/process ================================================ FILE: gm4_shroomites/data/gm4_shroomites/guidebook/shroomites.json ================================================ { "id": "shroomites", "name": "Shroomites", "module_type": "module", "icon": { "id": "minecraft:mycelium" }, "criteria": { "step_on_mycelium": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "stepping_on": { "block": { "blocks": [ "minecraft:mycelium" ] } } } } ] } }, "stand_in_blocker": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4_shroomites:spore_opaque" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "step_on_mycelium" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.shroomites.description", "fallback": "Mooshrooms have a rare chance to spawn a shroomite mushroom.\n\nA shroomite will spawn spores that spread mycelium to nearby dirt, and convert cows to mooshrooms." } ] ] }, { "name": "spreading", "enable": [], "requirements": [ [ "stand_in_blocker" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.shroomites.spreading", "fallback": "Spores will float in the air and can produce new shroomites.\n\nBlocks with collision, water, lava, cobwebs, powdered snow, and sunflowers can block shroomite spores from spreading." } ] ], "prerequisites": [ "description" ] } ] } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/predicate/mooshroom/shroom_spawn_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.24 } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/predicate/shroom/spore_spawn_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.33 } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/predicate/spore/descent_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.66 } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/predicate/spore/move_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.8 } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/tags/block/mushrooms.json ================================================ { "values": [ "minecraft:red_mushroom", "minecraft:brown_mushroom" ] } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/tags/block/shroom_replacable.json ================================================ { "values": [ "#minecraft:air", "#gm4:foliage" ] } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/tags/block/spore_convertable.json ================================================ { "values": [ "#minecraft:substrate_overworld", "minecraft:farmland" ] } ================================================ FILE: gm4_shroomites/data/gm4_shroomites/tags/block/spore_opaque.json ================================================ { "values": [ "#gm4:full_collision", "#gm4:water", "minecraft:cobweb", "minecraft:lava", "minecraft:powder_snow", "minecraft:sunflower" ] } ================================================ FILE: gm4_shroomites/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.shroomites,Ever wondered why all the Mooshrooms are locked up on islands? This Module makes Mooshrooms spread mycelium and mushrooms wherever they go. text.gm4.guidebook.shroomites.description,"Mooshrooms have a rare chance to spawn a shroomite mushroom.\n\nA shroomite will spawn spores that spread mycelium to nearby dirt, and convert cows to mooshrooms." text.gm4.guidebook.shroomites.spreading,"Spores will float in the air and can produce new shroomites.\n\nBlocks with collision, water, lava, cobwebs, powdered snow, and sunflowers can block shroomite spores from spreading." ================================================ FILE: gm4_smelteries/README.md ================================================ # Smelteries Build a multi-block structure to double the output of your ores! Creating a Smeltery, block by block. ### Features - Adds a 3x2x3 multi-block structure made of iron blocks, glass, a furnace and a cauldron - Doubles Iron, Gold, Copper, Sand and Chorus Fruit - Smelteries have a 1 in 90 chance of filling the Cauldron with Lava ================================================ FILE: gm4_smelteries/assets/gm4_smelteries/models/block/ore_display.json ================================================ { "elements": [ { "from": [4, 12, 4], "to": [12, 19, 12], "faces": { "north": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "north"}, "east": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "east"}, "south": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 0, 16, 14], "texture": "#side", "cullface": "west"}, "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [0, 0, 16, 16], "texture": "#top", "cullface": "down"} } } ] } ================================================ FILE: gm4_smelteries/assets/model_data.yaml ================================================ model_data: - item: player_head reference: item/smeltery model: block/smeltery_unlit - item: iron_block template: block broadcast: - reference: block/smeltery_unlit textures: top: block/smeltery_top front: block/smeltery_front side: block/smeltery_side bottom: block/smeltery_bottom - reference: block/smeltery_lit textures: top: block/smeltery_top front: block/smeltery_front_lit side: block/smeltery_side bottom: block/smeltery_bottom transforms: - name: item_display origin: [0.5, 1, 0.5] scale: [0.438, 0.438, 0.438] translation: [0, 0.1, 0] - item: chorus_flower template: smelteries:ore_display reference: block/ore_display/chorus_fruit - item: copper_ore template: smelteries:ore_display reference: block/ore_display/copper_ore - item: deepslate_copper_ore template: smelteries:ore_display reference: block/ore_display/deepslate_copper_ore - item: deepslate_gold_ore template: smelteries:ore_display reference: block/ore_display/deepslate_gold_ore - item: deepslate_iron_ore template: smelteries:ore_display reference: block/ore_display/deepslate_iron_ore - item: gold_ore template: smelteries:ore_display reference: block/ore_display/gold_ore - item: iron_ore template: smelteries:ore_display reference: block/ore_display/iron_ore - item: nether_gold_ore template: smelteries:ore_display reference: block/ore_display/nether_gold_ore - item: raw_copper_block template: smelteries:ore_display reference: block/ore_display/raw_copper - item: raw_gold_block template: smelteries:ore_display reference: block/ore_display/raw_gold - item: raw_iron_block template: smelteries:ore_display reference: block/ore_display/raw_iron - item: red_sand template: smelteries:ore_display reference: block/ore_display/red_sand - item: sand template: smelteries:ore_display reference: block/ore_display/sand - item: furnace reference: gui/advancement/smelteries template: name: advancement forward: block/smeltery_unlit ================================================ FILE: gm4_smelteries/assets/translations.csv ================================================ key,en_us block.gm4.smeltery,Smeltery container.gm4.smeltery,Smeltery advancement.gm4.smelteries.title,Serious Smelter advancement.gm4.smelteries.description,Construct a Smeltery text.gm4.guidebook.module_desc.smelteries,Build a Smeltery and double your ore output with this multi-block structure. text.gm4.guidebook.smelteries.description,"Smelteries can refine certain furnace recipes.\n\nMetal ores, sand, and chorus fruit can be doubled with Smelteries." text.gm4.guidebook.smelteries.crafting,A Smeltery can be crafted in a crafting table: text.gm4.guidebook.smelteries.multi_block,"The smeltery requires a multi-block structure to work.\n\nBehind the smeltery must be a cauldron. The rest of the 3x3 grid must be filled with iron blocks, then another layer of iron blocks above the first." text.gm4.guidebook.smelteries.doubling,"Once the multi-block is set up, the smeltery will produce double the normal result.\n\nSmelting metal ores, raw metals, sand, red sand, or chorus fruit will result in doubled outputs." text.gm4.guidebook.smelteries.lava,"When something is smelted in the smeltery there is a chance that the cauldron behind it will fill with lava.\n\nWith a continuous smelting process, it's possible to keep a smeltery fueled with the extra lava." ================================================ FILE: gm4_smelteries/beet.yaml ================================================ id: gm4_smelteries name: Smelteries version: 1.9.X data_pack: load: . resource_pack: load: . pipeline: - gm4_smelteries.ore_display - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: [main] gui_fonts: - translation: gui.gm4.smeltery container: furnace texture: gui/container/smeltery website: description: Build a Smeltery and double your ore output with this multi-block structure. recommended: [] notes: [] modrinth: project_id: AHj8RSHk wiki: https://wiki.gm4.co/wiki/smelteries credits: Creator: - Bloo Updated By: - dvitski - Kroppeb - Misode - SpecialBuilder32 - BPR - runcows Textures By: - Kyrius Icon Design: - Hozz ================================================ FILE: gm4_smelteries/data/gm4/advancement/smelteries.json ================================================ { "display": { "icon": { "id": "furnace", "components": { "minecraft:custom_model_data": {"strings":["gm4_smelteries:gui/advancement/smelteries"]} } }, "title": { "translate": "advancement.gm4.smelteries.title", "fallback": "Serious Smelter" }, "description": { "translate": "advancement.gm4.smelteries.description", "fallback": "Construct a Smeltery", "color": "gray" } }, "parent": "gm4:root", "criteria": { "obtain_smeltery": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"smeltery\"}}" } } ] } } } } ================================================ FILE: gm4_smelteries/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_smelteries:machine/verify_destroy" ] } ================================================ FILE: gm4_smelteries/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_smelteries:machine/verify_place_down" ] } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/advancement/recipes/smeltery.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_smelteries:smeltery" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:furnace" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_smelteries:smeltery" ] } } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/furnace_lit.mcfunction ================================================ # run smeltery in lit state # @s = smeltery marker # at @s # run from process execute unless entity @s[tag=gm4_smeltery_lit] run item replace entity @e[type=item_display,tag=gm4_smeltery_display,distance=..0.1,limit=1] contents with iron_block[custom_model_data={strings:["gm4_smelteries:block/smeltery_lit"]}] tag @s add gm4_smeltery_lit particle large_smoke ~ ~ ~ 0 0.3 0 0 5 normal @a execute if block ^ ^1 ^-1 #minecraft:air if block ^ ^ ^-1 #gm4_smelteries:valid_cauldron if block ^1 ^ ^ iron_block if block ^1 ^ ^-1 iron_block if block ^1 ^ ^-2 iron_block if block ^ ^ ^-2 iron_block if block ^-1 ^ ^ iron_block if block ^-1 ^ ^-1 iron_block if block ^-1 ^ ^-2 iron_block if block ^1 ^1 ^ iron_block if block ^1 ^1 ^-1 iron_block if block ^1 ^1 ^-2 iron_block if block ^ ^1 ^-2 iron_block if block ^-1 ^1 ^ iron_block if block ^-1 ^1 ^-1 iron_block if block ^-1 ^1 ^-2 iron_block run function gm4_smelteries:smelt/check_cook_time ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/furnace_unlit.mcfunction ================================================ # set smeltery to unlit state # @s = smeltery marker # at @s # run from process item replace entity @e[type=item_display,tag=gm4_smeltery_display,distance=..0.1,limit=1] contents with iron_block[custom_model_data={strings:["gm4_smelteries:block/smeltery_unlit"]}] item replace entity @e[type=item_display,tag=gm4_smeltery_cauldron,distance=..0.1,limit=1] contents with air tag @s remove gm4_smeltery_lit ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/init.mcfunction ================================================ scoreboard objectives add gm4_smelt_data dummy execute unless score smelteries gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Smelteries"} execute unless score smelteries gm4_earliest_version < smelteries gm4_modules run scoreboard players operation smelteries gm4_earliest_version = smelteries gm4_modules scoreboard players set smelteries gm4_modules 1 schedule function gm4_smelteries:main 1t #$moduleUpdateList ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/machine/create.mcfunction ================================================ # places the smeltery down # @s = player who placed the smeltery # located at the center of the placed block # run from gm4_smelteries:machine/verify_place_down # place block depending on rotation execute if score $single_rotation gm4_machine_data matches 1 run data modify storage gm4_smelteries:placement temp set value {facing:"south",rotation:[0.0f,0.0f]} execute if score $single_rotation gm4_machine_data matches 2 run data modify storage gm4_smelteries:placement temp set value {facing:"west",rotation:[90.0f,0.0f]} execute if score $single_rotation gm4_machine_data matches 3 run data modify storage gm4_smelteries:placement temp set value {facing:"north",rotation:[180.0f,0.0f]} execute if score $single_rotation gm4_machine_data matches 4 run data modify storage gm4_smelteries:placement temp set value {facing:"east",rotation:[-90.0f,0.0f]} function gm4_smelteries:machine/place_rotated with storage gm4_smelteries:placement temp data remove storage gm4_smelteries:placement temp # mark block as placed playsound block.anvil.use block @a[distance=..4] ~ ~ ~ 1 0.8 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..3] remove gm4_new_machine ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/machine/destroy.mcfunction ================================================ # destroys the smeltery # @s = smeltery marker # located at @s # run from gm4_smelteries:machine/verify_destroy # legacy cleanup - TODO: remove this when we stop supporting the upgrade path execute positioned ~ ~-0.3 ~ run kill @e[type=armor_stand,tag=gm4_smeltery_stand,limit=1,distance=..0.01] scoreboard players operation $current gm4_smelt_id = @s gm4_smelt_id execute positioned ^ ^-1.5 ^-1 as @e[type=armor_stand,tag=gm4_smeltery_cauldron,distance=..0.01] if score @s gm4_smelt_id = $current gm4_smelt_id run kill @s # kill entities related to machine block kill @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] kill @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:furnace",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_smelteries:items/smeltery ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/machine/place_rotated.mcfunction ================================================ # places the smeltery down based on rotation # @s = player who placed the smeltery # located at the center of the placed block, rotated same cardinal direction as @s # with {facing, rotation} # run from gm4_smelteries:machine/create # place furnace $setblock ~ ~ ~ furnace[facing=$(facing)] data merge block ~ ~ ~ {CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.smeltery","fallback":"Smeltery"},[{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.smeltery","fallback":"Smeltery","font":"gm4:half_invert"},{"translate":"container.gm4.smeltery","fallback":"Smeltery","font":"gm4:offscreen"},{"translate":"gui.gm4.smeltery","fallback":"","font":"gm4:container_gui","color":"white"},{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.smeltery","fallback":"Smeltery","font":"gm4:half_invert"},{"translate":"container.gm4.smeltery","fallback":"Smeltery","font":"gm4:default","color":"#404040"}]]}} # summon cauldron display $summon item_display ~ ~ ~ {\ CustomName:"gm4_smeltery_cauldron",\ Tags:["gm4_no_edit","gm4_smeltery_cauldron","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:$(rotation),\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.1875f,-1.0f],scale:[0.625,0.625,0.625]}\ } # summon display and marker entity $summon item_display ~ ~ ~ {\ CustomName:"gm4_smeltery_display",\ Tags:["gm4_no_edit","gm4_smeltery_display","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item:{id:"minecraft:iron_block",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_smelteries:block/smeltery_unlit"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:$(rotation),\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.601f,0f],scale:[0.438,0.438,0.438]}\ } $summon marker ~ ~ ~ {Tags:["gm4_smeltery","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_smeltery",Rotation:$(rotation)} ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_smeltery] run function gm4_smelteries:machine/destroy ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"smeltery"} run function gm4_smelteries:machine/create ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/main.mcfunction ================================================ # upgrade path, needs run before process function gm4_smelteries:upgrade_paths/1.9 # process machine execute as @e[type=marker,tag=gm4_smeltery] at @s run function gm4_smelteries:process schedule function gm4_smelteries:main 16t ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/process.mcfunction ================================================ # smeltery processes # @s = smeltery # at @s # run from main # update smeltery state execute if block ~ ~ ~ furnace[lit=true] run function gm4_smelteries:furnace_lit execute unless block ~ ~ ~ furnace[lit=true] if entity @s[tag=gm4_smeltery_lit] run function gm4_smelteries:furnace_unlit ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/check_cook_time.mcfunction ================================================ # check furnace and store cooktime # @s = smeltery marker # at @s # run from furnace_lit scoreboard players set $cook_time gm4_smelt_data -1 execute store result score $cook_time gm4_smelt_data run data get block ~ ~ ~ cooking_time_spent # display ore tag @s add gm4_smeltery_processing execute if score $cook_time gm4_smelt_data matches 0.. as @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] run function gm4_smelteries:smelt/smelting tag @s remove gm4_smeltery_processing ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/check_finish_smelt.mcfunction ================================================ # @s = none # run from smelt/prep_finish_smelt execute as @e[type=marker,tag=gm4_smeltery_smelting] at @s if block ~ ~ ~ furnace{cooking_time_spent:199s} run function gm4_smelteries:smelt/finish_smelt execute if entity @e[type=marker,tag=gm4_smeltery_smelting,limit=1] run schedule function gm4_smelteries:smelt/check_finish_smelt 1t ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/finish_smelt.mcfunction ================================================ # complete the smelting process # @s = smeltery marker that finished smelting # located at @s # run from smelt/check_finish_smelt tag @s remove gm4_smeltery_smelting tag @s add gm4_smeltery_smelted execute if block ~ ~-1 ~ hopper{TransferCooldown:1} run data modify block ~ ~-1 ~ TransferCooldown set value 2 execute if block ~ ~-1 ~ hopper{TransferCooldown:0} run data modify block ~ ~-1 ~ TransferCooldown set value 2 execute positioned ~ ~-1 ~ as @e[type=hopper_minecart,distance=..1] run tag @s add gm4_smelteries_disabled execute as @e[type=hopper_minecart,tag=gm4_smelteries_disabled,distance=..3] run data merge entity @s {Enabled:0b} schedule function gm4_smelteries:smelt/modify_output 1t # lava cauldron execute if block ^ ^ ^-1 cauldron if predicate gm4_smelteries:lava_cauldron_chance run setblock ^ ^ ^-1 lava_cauldron ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/increase_output.mcfunction ================================================ # increases the smeltery output by 1 # @s = smeltery marker that finished smelting # located at a smeltery that finished smelting # run from smelt/modify_output execute store result score $output gm4_smelt_data run data get block ~ ~ ~ Items[{Slot:2b}].count execute store result block ~ ~ ~ Items[{Slot:2b}].count byte 1 if score $output gm4_smelt_data matches ..63 run scoreboard players add $output gm4_smelt_data 1 particle large_smoke ~ ~ ~ 0.1 0 0.1 0.05 5 normal @a playsound block.redstone_torch.burnout block @a[distance=..8] ~ ~ ~ 0.8 2 playsound block.lava.ambient block @a[distance=..8] ~ ~ ~ 0.6 2 # clean up tag @s remove gm4_smeltery_smelted execute as @e[type=hopper_minecart,tag=gm4_smelteries_disabled,distance=..3] run data merge entity @s {Enabled:1b} tag @e[type=hopper_minecart,distance=..3] remove gm4_smelteries_disabled ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/modify_output.mcfunction ================================================ # @s = none # run from smelt/finish_smelt execute as @e[type=marker,tag=gm4_smeltery_smelted] at @s run function gm4_smelteries:smelt/increase_output ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/prep_finish_smelt.mcfunction ================================================ # set up marker for smelting # @s = smeltery cauldron linked to a furnace that's smelting items # located at the smeltery block (furnace) # run from smelt/smelting tag @e[type=marker,tag=gm4_smeltery_processing,limit=1,distance=..2] add gm4_smeltery_smelting function gm4_smelteries:smelt/check_finish_smelt ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/smelt/smelting.mcfunction ================================================ # check for doublable ores # @s = smeltery cauldron linked to a furnace that's smelting items # located at the smeltery block (furnace) # run from smelt/check_cook_time # check if the currently smeling item can be doubled item replace entity @s contents with air execute unless items block ~ ~ ~ container.0 #gm4_smelteries:can_double run return run tag @e[type=marker,tag=gm4_smeltery_processing,limit=1,distance=..2] remove gm4_smeltery_smelting # update the cauldron block display execute if items block ~ ~ ~ container.0 minecraft:gold_ore run item replace entity @s contents with minecraft:gold_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/gold_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:nether_gold_ore run item replace entity @s contents with minecraft:nether_gold_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/nether_gold_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:deepslate_gold_ore run item replace entity @s contents with minecraft:deepslate_gold_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/deepslate_gold_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:raw_gold run item replace entity @s contents with minecraft:raw_gold_block[custom_model_data={"strings":["gm4_smelteries:block/ore_display/raw_gold"]}] execute if items block ~ ~ ~ container.0 minecraft:iron_ore run item replace entity @s contents with minecraft:iron_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/iron_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:deepslate_iron_ore run item replace entity @s contents with minecraft:deepslate_iron_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/deepslate_iron_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:raw_iron run item replace entity @s contents with minecraft:raw_iron_block[custom_model_data={"strings":["gm4_smelteries:block/ore_display/raw_iron"]}] execute if items block ~ ~ ~ container.0 minecraft:copper_ore run item replace entity @s contents with minecraft:copper_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/copper_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:deepslate_copper_ore run item replace entity @s contents with minecraft:deepslate_copper_ore[custom_model_data={"strings":["gm4_smelteries:block/ore_display/deepslate_copper_ore"]}] execute if items block ~ ~ ~ container.0 minecraft:raw_copper run item replace entity @s contents with minecraft:raw_copper_block[custom_model_data={"strings":["gm4_smelteries:block/ore_display/raw_copper"]}] execute if items block ~ ~ ~ container.0 minecraft:sand run item replace entity @s contents with minecraft:sand[custom_model_data={"strings":["gm4_smelteries:block/ore_display/sand"]}] execute if items block ~ ~ ~ container.0 minecraft:red_sand run item replace entity @s contents with minecraft:red_sand[custom_model_data={"strings":["gm4_smelteries:block/ore_display/red_sand"]}] execute if items block ~ ~ ~ container.0 minecraft:chorus_fruit run item replace entity @s contents with minecraft:chorus_flower[custom_model_data={"strings":["gm4_smelteries:block/ore_display/chorus_fruit"]}] # check if the furnace is close to finish smelting execute if score $cook_time gm4_smelt_data matches 184..199 run function gm4_smelteries:smelt/prep_finish_smelt ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9/cauldron_item_display.mcfunction ================================================ # @s = gm4_smeltery_cauldron armor stand # at center of smeltery # run from upgrade_paths/1.9 # create item display summon item_display ~ ~ ~ {\ CustomName:"gm4_smeltery_cauldron",\ Tags:["gm4_no_edit","gm4_smeltery_cauldron","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item_display:head,\ brightness:{sky:15,block:15},\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.1875f,-1.0f],scale:[0.625,0.625,0.625]}\ } # copy data from armor stand execute rotated as @s run rotate @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] ~ ~ item replace entity @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] contents from entity @s armor.head # increment entity version scoreboard players set @e[type=item_display,tag=gm4_smeltery_cauldron,limit=1,distance=..0.01] gm4_entity_version 2 kill @s ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9/smeltery_item_display.mcfunction ================================================ # @s = gm4_smeltery_stand armor stand # at center of smeltery # run from upgrade_paths/1.9 # create item display summon item_display ~ ~ ~ {\ CustomName:"gm4_smeltery_display",\ Tags:["gm4_no_edit","gm4_smeltery_display","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item:{id:"minecraft:iron_block",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_smelteries:block/smeltery_unlit"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.601f,0f],scale:[0.438,0.438,0.438]}\ } # copy data from armor stand execute rotated as @s run rotate @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] ~ ~ item replace entity @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] contents from entity @s armor.head # increment entity version (this function handles the marker as well) scoreboard players set @e[type=item_display,tag=gm4_smeltery_display,limit=1,distance=..0.01] gm4_entity_version 2 scoreboard players set @e[type=marker,tag=gm4_smeltery,limit=1,distance=..0.01] gm4_entity_version 2 kill @s ================================================ FILE: gm4_smelteries/data/gm4_smelteries/function/upgrade_paths/1.9.mcfunction ================================================ # run from main and via upgrade paths util execute as @e[type=minecraft:armor_stand,tag=gm4_smeltery_stand] at @s positioned ~ ~0.3 ~ \ run function gm4_smelteries:upgrade_paths/1.9/smeltery_item_display execute as @e[type=minecraft:armor_stand,tag=gm4_smeltery_cauldron] at @s positioned ^ ^1.5 ^1 \ run function gm4_smelteries:upgrade_paths/1.9/cauldron_item_display ================================================ FILE: gm4_smelteries/data/gm4_smelteries/guidebook/smelteries.json ================================================ { "id": "smelteries", "name": "Smelteries", "module_type": "module", "icon": { "id": "minecraft:furnace" }, "criteria": { "obtain_furnace": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:furnace" ] } ] } }, "obtain_iron_ingot": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:iron_ingot" ] } ] } }, "open_smeltery": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:furnace" ], "nbt": "{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\"},{\"text\":\" \",\"extra\":[{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.smeltery\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.smeltery\",\"fallback\":\"Smeltery\",\"font\":\"gm4:default\",\"color\":\"#404040\"}],\"font\":\"gm4:half_invert\"}]}}" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.smelteries.description", "fallback": "Smelteries can refine certain furnace recipes.\n\nMetal ores, sand, and chorus fruit can be doubled with Smelteries." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_furnace" ], [ "obtain_iron_ingot" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.smelteries.crafting", "fallback": "A Smeltery can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_smelteries:smeltery" } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "open_smeltery" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.smelteries.multi_block", "fallback": "The smeltery requires a multi-block structure to work.\n\nBehind the smeltery must be a cauldron. The rest of the 3x3 grid must be filled with iron blocks, then another layer of iron blocks above the first." } ], [ { "translate": "text.gm4.guidebook.smelteries.doubling", "fallback": "Once the multi-block is set up, the smeltery will produce double the normal result.\n\nSmelting metal ores, raw metals, sand, red sand, or chorus fruit will result in doubled outputs." } ], [ { "translate": "text.gm4.guidebook.smelteries.lava", "fallback": "When something is smelted in the smeltery there is a chance that the cauldron behind it will fill with lava.\n\nWith a continuous smelting process, it's possible to keep a smeltery fueled with the extra lava." } ] ], "grants": [ "description" ] } ] } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/loot_table/items/smeltery.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_smelteries:item/smeltery"]}, "minecraft:profile": "$smeltery" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'smeltery'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.smeltery", "fallback": "Smeltery", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/predicate/lava_cauldron_chance.json ================================================ { "condition": "random_chance", "chance": 0.011 } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/recipe/smeltery.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "CCC", "CFC", "IcI" ], "key": { "C": "minecraft:cobblestone", "F": "minecraft:furnace", "I": "minecraft:iron_ingot", "c": "minecraft:comparator" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_smelteries:item/smeltery"]}, "minecraft:profile": "$smeltery", "minecraft:custom_data": "{gm4_machines:{id:'smeltery'}}", "minecraft:custom_name": {"translate":"block.gm4.smeltery","fallback":"Smeltery","color":"white","italic":false} } } } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/tags/block/valid_cauldron.json ================================================ { "values": [ "minecraft:cauldron", "minecraft:lava_cauldron" ] } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/tags/item/can_double.json ================================================ { "values": [ "minecraft:gold_ore", "minecraft:nether_gold_ore", "minecraft:deepslate_gold_ore", "minecraft:raw_gold", "minecraft:iron_ore", "minecraft:deepslate_iron_ore", "minecraft:raw_iron", "minecraft:copper_ore", "minecraft:deepslate_copper_ore", "minecraft:raw_copper", "minecraft:sand", "minecraft:red_sand", "minecraft:chorus_fruit" ] } ================================================ FILE: gm4_smelteries/data/gm4_smelteries/test/construct_and_use.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 # @timeout 300 # @skyaccess loot give @s loot gm4_smelteries:items/smeltery dummy @s jump await delay 5t dummy @s use block ~1 ~ ~ up await block ~1 ~1 ~ furnace setblock ~1 ~1 ~1 cauldron fill ~ ~1 ~ ~2 ~2 ~2 iron_block replace air fill ~1 ~1 ~ ~1 ~2 ~1 air replace iron_block await entity @e[tag=gm4_smeltery] inside item replace block ~1 ~1 ~ container.0 with raw_iron item replace block ~1 ~1 ~ container.1 with coal await items block ~1 ~1 ~ container.2 minecraft:iron_ingot[count=2] ================================================ FILE: gm4_smelteries/ore_display.py ================================================ from typing import Literal from beet import NamespaceProxy, Model, Context from gm4.plugins.resource_pack import TemplateOptions, ModelData, ItemDisplayModel, ensure_single_model_config, ContainerGuiOptions, CenteredContainerGui class OreDisplayTemplate(TemplateOptions): """setup a model template for the smeltable ores displayed by smeltries""" name: Literal["smelteries:ore_display"] = "smelteries:ore_display" texture_map = ["top", "side"] default_transforms = [ ItemDisplayModel( origin=[0.5, 0.5, 0.5], scale=[0.624, 0.624, 0.624], translation=[0, 0.19, 0] ) ] def create_models(self, config: ModelData, models_container: NamespaceProxy[Model]): model_name = ensure_single_model_config(self.name, config) reference = config.reference.split('/')[-1] m = models_container[model_name] = Model({ "parent": "gm4_smelteries:block/ore_display", "textures":{ "top": f"gm4_smelteries:block/ore_display/{reference}_top", "side": f"gm4_smelteries:block/ore_display/{reference}_side", "particle": f"gm4_smelteries:block/ore_display/{reference}_side", } }) return [m] class FurnaceContainerGui(CenteredContainerGui, ContainerGuiOptions): container: Literal["furnace"] = "furnace" # type: ignore ; Inheriting CenteredContainerGui overwrites a Literal "_centered" -> "furnace" def beet_default(ctx: Context): pass ================================================ FILE: gm4_soul_glass/README.md ================================================ # Soul Glass Beacons need a bit more corruption. This data pack reverses their effects ### Features - Crafted by smelting Soul Sand in a Furnace - Applies an inverted effect when placed on-top of a Beacon - Beacon power can be disabled by either moving the glass block or turning off the beacon - For example: Speed becomes Slowness, Haste becomes Mining Fatigue Read more info about inverted effects on the [Wiki](https://wiki.gm4.co/Soul_Glass). ================================================ FILE: gm4_soul_glass/assets/translations.csv ================================================ key,en_us item.gm4.soul_glass,Soul Glass advancement.gm4.soul_glass.title,Corruption at its Finest advancement.gm4.soul_glass.description,Corrupt the effects of a beacon text.gm4.guidebook.module_desc.soul_glass,"Reverse the effects of beacons with corrupting glass! But be careful, a poison Beacon may sound great at first, but is incredibly painful in pratice." text.gm4.guidebook.soul_glass.description,"Soul Sand can be smelted in a furnace to get Soul Glass.\n\nWhen placed directly over a beacon, soul glass will corrupt the effects." text.gm4.guidebook.soul_glass.usage,If soul glass is moved from its original location it will lose its properties.\n\nThe exception is moving it with a sticky piston up to one block away. text.gm4.guidebook.soul_glass.corrupted_effects,Corrupted Effects: ================================================ FILE: gm4_soul_glass/beet.yaml ================================================ id: gm4_soul_glass name: Soul Glass version: 1.7.X require: - bolt data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: - main - beacon_clock model_data: - item: brown_stained_glass reference: item/soul_glass template: vanilla - item: brown_stained_glass reference: gui/advancement/soul_glass template: advancement website: description: Reverse the effects of beacons with corrupting glass! But be careful, a poison Beacon may sound great at first, but is incredibly painful in pratice. recommended: [] notes: - On versions <1.21, Blast Furnaces may need to be broken and replaced to be able to craft Soul Glass when the module is first installed. modrinth: project_id: Hi8fkYoI wiki: https://wiki.gm4.co/wiki/Soul_Glass credits: Creators: - BPR - Denniss - Lue Icon Design: - Sparks ================================================ FILE: gm4_soul_glass/data/gm4/advancement/soul_glass.json ================================================ { "display": { "icon": { "id": "brown_stained_glass", "components": { "minecraft:custom_model_data": {"strings":["gm4_soul_glass:gui/advancement/soul_glass"]} } }, "title": { "translate": "advancement.gm4.soul_glass.title", "fallback": "Corruption at its Finest" }, "description": { "translate": "advancement.gm4.soul_glass.description", "fallback": "Corrupt the effects of a beacon", "color": "gray" } }, "parent": "gm4:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_soul_glass/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_soul_glass:machine/verify_destroy" ] } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/advancement/place_soul_glass.json ================================================ { "criteria": { "place_furnace": { "trigger": "minecraft:placed_block", "conditions": { "player": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "spectator" ] } } } } ], "location": [ { "condition": "minecraft:block_state_property", "block": "minecraft:brown_stained_glass" }, { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": "{gm4_soul_glass:1b}" } } } ] } } }, "rewards": { "function": "gm4_soul_glass:place_soul_glass" } } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/advancement/recipes/soul_glass.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_soul_glass:soul_glass" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:soul_sand" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_soul_glass:soul_glass" ] } } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/beacon_clock.mcfunction ================================================ # @s = none # run from beacon_clock (on it's own clock) execute as @e[type=marker,tag=gm4_soul_glass] at @s run function gm4_soul_glass:process execute as @e[type=marker,tag=gm4_soul_glass] at @s if block ~ ~-1 ~ beacon if predicate gm4_soul_glass:has_beam positioned ~-50 ~-51 ~-50 if entity @a[dx=100,dy=356,dz=100,limit=1] at @s run function gm4_soul_glass:effect/check schedule function gm4_soul_glass:beacon_clock 80t ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/check.mcfunction ================================================ # @s = gm4_soul_glass marker # run from beacon_clock execute if data block ~ ~-1 ~ primary_effect run function gm4_soul_glass:effect/update_effects execute store result score @s gm4_sg_levels run data get block ~ ~-1 ~ Levels execute if score @s gm4_sg_levels matches 1 positioned ~-20 ~-21 ~-20 run function gm4_soul_glass:effect/level_1 execute if score @s gm4_sg_levels matches 2 positioned ~-30 ~-31 ~-30 run function gm4_soul_glass:effect/level_2 execute if score @s gm4_sg_levels matches 3 positioned ~-40 ~-41 ~-40 run function gm4_soul_glass:effect/level_3 execute if score @s gm4_sg_levels matches 4 if score @s gm4_sg_primary = @s gm4_sg_secondary positioned ~-50 ~-51 ~-50 run function gm4_soul_glass:effect/level_4_strong execute if score @s gm4_sg_levels matches 4 unless score @s gm4_sg_primary = @s gm4_sg_secondary positioned ~-50 ~-51 ~-50 run function gm4_soul_glass:effect/level_4 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/level_1.mcfunction ================================================ # @s = gm4_soul_glass marker with level 1 beacon below it # run from effect/check execute if score @s gm4_sg_primary matches 1 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:slowness 11 0 execute if score @s gm4_sg_primary matches 3 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:mining_fatigue 11 0 execute if score @s gm4_sg_primary matches 5 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:weakness 11 0 execute if score @s gm4_sg_primary matches 8 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:slow_falling 11 0 execute if score @s gm4_sg_primary matches 11 run effect give @a[dx=40,dy=296,dz=40,gamemode=!spectator] minecraft:glowing 11 0 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/level_2.mcfunction ================================================ # @s = gm4_soul_glass marker with level 2 beacon below it # run from effect/check execute if score @s gm4_sg_primary matches 1 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:slowness 13 0 execute if score @s gm4_sg_primary matches 3 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:mining_fatigue 13 0 execute if score @s gm4_sg_primary matches 5 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:weakness 13 0 execute if score @s gm4_sg_primary matches 8 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:slow_falling 13 0 execute if score @s gm4_sg_primary matches 11 run effect give @a[dx=60,dy=316,dz=60,gamemode=!spectator] minecraft:glowing 13 0 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/level_3.mcfunction ================================================ # @s = gm4_soul_glass marker with level 3 beacon below it # run from effect/check execute if score @s gm4_sg_primary matches 1 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:slowness 15 0 execute if score @s gm4_sg_primary matches 3 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:mining_fatigue 15 0 execute if score @s gm4_sg_primary matches 5 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:weakness 15 0 execute if score @s gm4_sg_primary matches 8 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:slow_falling 15 0 execute if score @s gm4_sg_primary matches 11 run effect give @a[dx=80,dy=336,dz=80,gamemode=!spectator] minecraft:glowing 15 0 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/level_4.mcfunction ================================================ # @s = gm4_soul_glass marker with level 4 beacon below it # run from effect/check execute if score @s gm4_sg_primary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 0 execute if score @s gm4_sg_primary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 0 execute if score @s gm4_sg_primary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 0 execute if score @s gm4_sg_primary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 0 execute if score @s gm4_sg_primary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 0 execute if score @s gm4_sg_secondary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 0 execute if score @s gm4_sg_secondary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 0 execute if score @s gm4_sg_secondary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 0 execute if score @s gm4_sg_secondary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 0 execute if score @s gm4_sg_secondary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 0 execute if score @s gm4_sg_secondary matches 10 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:poison 17 0 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/level_4_strong.mcfunction ================================================ # @s = gm4_soul_glass marker with strong level 4 beacon below it # run from effect/check execute if score @s gm4_sg_primary matches 1 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slowness 17 1 execute if score @s gm4_sg_primary matches 3 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:mining_fatigue 17 1 execute if score @s gm4_sg_primary matches 5 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:weakness 17 1 execute if score @s gm4_sg_primary matches 8 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:slow_falling 17 1 execute if score @s gm4_sg_primary matches 11 run effect give @a[dx=100,dy=356,dz=100,gamemode=!spectator] minecraft:glowing 17 1 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/obtain_numeric_primary_id.mcfunction ================================================ # Converts a string effect id to a matching numeric id, as scoreboard lookups are cheaper and this conversion only has to be done once when soul glass is first placed on a beacon # @s = gm4_soul_glass marker # at @s # run from effect/update_effects # convert id execute if data storage gm4_soul_glass:temp {effect:"minecraft:speed"} run scoreboard players set @s gm4_sg_primary 1 execute if data storage gm4_soul_glass:temp {effect:"minecraft:haste"} run scoreboard players set @s gm4_sg_primary 3 execute if data storage gm4_soul_glass:temp {effect:"minecraft:strength"} run scoreboard players set @s gm4_sg_primary 5 execute if data storage gm4_soul_glass:temp {effect:"minecraft:jump_boost"} run scoreboard players set @s gm4_sg_primary 8 execute if data storage gm4_soul_glass:temp {effect:"minecraft:resistance"} run scoreboard players set @s gm4_sg_primary 11 # clean up storage data remove storage gm4_soul_glass:temp effect ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/obtain_numeric_secondary_id.mcfunction ================================================ # Converts a string effect id to a matching numeric id, as scoreboard lookups are cheaper and this conversion only has to be done once when soul glass is first placed on a beacon # @s = gm4_soul_glass marker # at @s # run from effect/update_effects # convert id execute if data storage gm4_soul_glass:temp {effect:"minecraft:speed"} run scoreboard players set @s gm4_sg_secondary 1 execute if data storage gm4_soul_glass:temp {effect:"minecraft:haste"} run scoreboard players set @s gm4_sg_secondary 3 execute if data storage gm4_soul_glass:temp {effect:"minecraft:strength"} run scoreboard players set @s gm4_sg_secondary 5 execute if data storage gm4_soul_glass:temp {effect:"minecraft:jump_boost"} run scoreboard players set @s gm4_sg_secondary 8 execute if data storage gm4_soul_glass:temp {effect:"minecraft:resistance"} run scoreboard players set @s gm4_sg_secondary 11 execute if data storage gm4_soul_glass:temp {effect:"minecraft:regeneration"} run scoreboard players set @s gm4_sg_secondary 10 # clean up storage data remove storage gm4_soul_glass:temp effect ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/revert_effects.mcfunction ================================================ # @s = gm4_soul_glass marker # run from effect/check execute store result block ~ ~-1 ~ primary_effect int 1 run scoreboard players get @s gm4_sg_primary execute store result block ~ ~-1 ~ secondary_effect int 1 run scoreboard players get @s gm4_sg_secondary scoreboard players reset @s gm4_sg_primary scoreboard players reset @s gm4_sg_secondary playsound minecraft:block.beacon.power_select block @a[distance=..10] particle minecraft:totem_of_undying ~ ~-1 ~ 0.5 0.5 0.5 .1 40 force ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/effect/update_effects.mcfunction ================================================ # @s = gm4_soul_glass marker # run from effect/check data modify storage gm4_soul_glass:temp effect set from block ~ ~-1 ~ primary_effect function gm4_soul_glass:effect/obtain_numeric_primary_id data modify storage gm4_soul_glass:temp effect set from block ~ ~-1 ~ secondary_effect execute if data storage gm4_soul_glass:temp effect run function gm4_soul_glass:effect/obtain_numeric_secondary_id data remove block ~ ~-1 ~ primary_effect data remove block ~ ~-1 ~ secondary_effect playsound minecraft:entity.wither.spawn block @a[distance=..10] ~ ~ ~ .5 1.3 particle minecraft:witch ~ ~-1 ~ 0.5 0.5 0.5 0 40 force advancement grant @a[distance=..4] only gm4:soul_glass ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/init.mcfunction ================================================ scoreboard objectives add gm4_sg_cook_time dummy scoreboard objectives add gm4_count dummy scoreboard objectives add gm4_sg_primary dummy scoreboard objectives add gm4_sg_secondary dummy scoreboard objectives add gm4_sg_levels dummy execute unless score soul_glass gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Soul Glass"} execute unless score soul_glass gm4_earliest_version < soul_glass gm4_modules run scoreboard players operation soul_glass gm4_earliest_version = soul_glass gm4_modules scoreboard players set soul_glass gm4_modules 1 schedule function gm4_soul_glass:main 1t schedule function gm4_soul_glass:beacon_clock 1t #$moduleUpdateList ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/init_soul_glass_marker.mcfunction ================================================ # @s = new marker # at @s # run from ray data merge entity @s {CustomName:"gm4_soul_glass",Tags:["gm4_soul_glass","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict"]} scoreboard players set @s gm4_entity_version 1 ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/machine/destroy.mcfunction ================================================ # destroys the soul glass # @s = gm4_soul_glass marker # located at @s # run from gm4_soul_glass:machine/verify_destroy # restore beacon effect execute if score @s gm4_sg_primary matches 1 run data modify block ~ ~-1 ~ primary_effect set value "minecraft:speed" execute if score @s gm4_sg_primary matches 3 run data modify block ~ ~-1 ~ primary_effect set value "minecraft:haste" execute if score @s gm4_sg_primary matches 5 run data modify block ~ ~-1 ~ primary_effect set value "minecraft:strength" execute if score @s gm4_sg_primary matches 8 run data modify block ~ ~-1 ~ primary_effect set value "minecraft:jump_boost" execute if score @s gm4_sg_primary matches 11 run data modify block ~ ~-1 ~ primary_effect set value "minecraft:resistance" execute if score @s gm4_sg_secondary matches 1 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:speed" execute if score @s gm4_sg_secondary matches 3 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:haste" execute if score @s gm4_sg_secondary matches 5 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:strength" execute if score @s gm4_sg_secondary matches 8 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:jump_boost" execute if score @s gm4_sg_secondary matches 10 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:regeneration" execute if score @s gm4_sg_secondary matches 11 run data modify block ~ ~-1 ~ secondary_effect set value "minecraft:resistance" # kill entities related to machine block execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:brown_stained_glass",count:1}},nbt=!{Item:{components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_soul_glass:items/soul_glass ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_soul_glass] unless block ~ ~ ~ moving_piston run function gm4_soul_glass:machine/destroy ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/main.mcfunction ================================================ schedule function gm4_soul_glass:main 16t # process soul glass execute as @e[type=marker,tag=gm4_soul_glass] at @s run function gm4_soul_glass:process # Kill old blast furnace markers, remove this later kill @e[type=marker,tag=gm4_sg_furnace] ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/place_soul_glass.mcfunction ================================================ # @s = player that just placed a soul glass # at @s # run from advancement place_soul_glass advancement revoke @s only gm4_soul_glass:place_soul_glass execute store result score gm4_ray_counter gm4_count run attribute @s minecraft:block_interaction_range get 100 execute anchored eyes positioned ^ ^ ^ run function gm4_soul_glass:ray ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/process.mcfunction ================================================ # @s = gm4_soul_glass marker # run from main and beacon_clock execute if score @s gm4_sg_primary matches 1.. unless block ~ ~ ~ brown_stained_glass if block ~ ~-1 ~ beacon run function gm4_soul_glass:effect/revert_effects particle minecraft:smoke ~ ~ ~ 0.3 0.3 0.3 0 15 normal ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/function/ray.mcfunction ================================================ # @s = player who placed soul glass # at @s anchored eyes, then marched forward 0.01 over and over # run from place_soul_glass and self execute if block ~ ~ ~ brown_stained_glass \ align xyz positioned ~0.5 ~0.5 ~0.5 unless entity @e[type=marker,distance=..0.1,tag=gm4_soul_glass,limit=1] \ summon marker run return run function gm4_soul_glass:init_soul_glass_marker # loop scoreboard players remove gm4_ray_counter gm4_count 1 execute if score gm4_ray_counter gm4_count matches 0.. positioned ^ ^ ^0.01 run function gm4_soul_glass:ray ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/guidebook/soul_glass.json ================================================ { "id": "soul_glass", "name": "Soul Glass", "module_type": "module", "icon": { "id": "minecraft:brown_stained_glass", "components": { "minecraft:enchantment_glint_override": true } }, "criteria": { "obtain_soul_sand": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:soul_sand" ] } ] } }, "obtain_soul_glass": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:brown_stained_glass" ], "predicates": { "minecraft:custom_data": "{gm4_soul_glass:1b}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_soul_sand" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.soul_glass.description", "fallback": "Soul Sand can be smelted in a furnace to get Soul Glass.\n\nWhen placed directly over a beacon, soul glass will corrupt the effects." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_soul_glass" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.soul_glass.usage", "fallback": "If soul glass is moved from its original location it will lose its properties.\n\nThe exception is moving it with a sticky piston up to one block away." } ], [ { "translate": "text.gm4.guidebook.soul_glass.corrupted_effects", "fallback": "Corrupted Effects:" }, "\n\n", { "translate": "effect.minecraft.speed" }, "\n - ", { "translate": "effect.minecraft.slowness" }, "\n", { "translate": "effect.minecraft.haste" }, "\n - ", { "translate": "effect.minecraft.mining_fatigue" }, "\n", { "translate": "effect.minecraft.resistance" }, "\n - ", { "translate": "effect.minecraft.glowing" }, "\n", { "translate": "effect.minecraft.jump_boost" }, "\n - ", { "translate": "effect.minecraft.slow_falling" } ], [ "\n", { "translate": "effect.minecraft.strength" }, "\n - ", { "translate": "effect.minecraft.weakness" }, "\n", { "translate": "effect.minecraft.regeneration" }, "\n - ", { "translate": "effect.minecraft.poison" } ] ], "grants": [ "description" ] } ] } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/loot_table/items/soul_glass.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:brown_stained_glass", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_soul_glass:item/soul_glass"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_soul_glass:1b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.soul_glass", "fallback": "Soul Glass" } } ] } ] } ] } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/predicate/has_beam.json ================================================ block_checks = [] for y in range(1, 4064): block_checks.append({ "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetY": y, "predicate": { "light": { "light": { "min": 0, "max": 15 } } } } }, { "condition": "minecraft:location_check", "offsetY": y, "predicate": { "block": { "blocks": "#gm4_soul_glass:beacon_passable" } } }, { "condition": "minecraft:location_check", "offsetY": y, "predicate": { "block": { "state": { "extended": "true" }, "blocks": "#gm4_soul_glass:piston" } } }, { "condition": "minecraft:location_check", "offsetY": y, "predicate": { "block": { "state": { "type": "bottom" }, "blocks": "#minecraft:slabs" } } }, { "condition": "minecraft:location_check", "offsetY": y, "predicate": { "block": { "state": { "type": "top" }, "blocks": "#minecraft:slabs" } } } ] }) { "condition": "minecraft:all_of", "terms": block_checks } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/recipe/soul_glass.json ================================================ { "type": "minecraft:smelting", "ingredient": "minecraft:soul_sand", "result": { "id": "minecraft:brown_stained_glass", "components": { "minecraft:custom_model_data": {"strings":["gm4_soul_glass:item/soul_glass"]}, "minecraft:custom_data": "{gm4_soul_glass:1b}", "minecraft:enchantment_glint_override": true, "minecraft:item_name": {"translate":"item.gm4.soul_glass","fallback":"Soul Glass"} } }, "experience": 1.0, "cookingtime": 800 } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/tags/block/beacon_passable.json ================================================ { "values": [ "#minecraft:air", "#gm4:no_collision", "#minecraft:anvil", "#minecraft:banners", "#minecraft:beds", "#minecraft:wool_carpets", "#minecraft:cauldrons", "#minecraft:doors", "#minecraft:fence_gates", "#minecraft:fences", "#minecraft:flower_pots", "#minecraft:leaves", "#minecraft:portals", "#minecraft:shulker_boxes", "#minecraft:stairs", "#minecraft:trapdoors", "#minecraft:walls", "minecraft:bamboo_sapling", "minecraft:bamboo", "minecraft:barrier", "minecraft:beacon", "minecraft:bedrock", "minecraft:bell", "minecraft:black_stained_glass_pane", "minecraft:black_stained_glass", "minecraft:blue_stained_glass_pane", "minecraft:blue_stained_glass", "minecraft:brewing_stand", "minecraft:brown_stained_glass_pane", "minecraft:brown_stained_glass", "minecraft:bubble_column", "minecraft:cactus", "minecraft:cake", "minecraft:campfire", "minecraft:chest", "minecraft:chorus_flower", "minecraft:chorus_plant", "minecraft:cobweb", "minecraft:cocoa", "minecraft:comparator", "minecraft:conduit", "minecraft:creeper_head", "minecraft:creeper_wall_head", "minecraft:cyan_stained_glass_pane", "minecraft:cyan_stained_glass", "minecraft:daylight_detector", "minecraft:dragon_egg", "minecraft:dragon_head", "minecraft:dragon_wall_head", { "id": "minecraft:dried_ghast", "required": false }, "minecraft:enchanting_table", "minecraft:end_portal_frame", "minecraft:end_rod", "minecraft:ender_chest", "minecraft:farmland", "minecraft:frosted_ice", "minecraft:glass_pane", "minecraft:glass", "minecraft:dirt_path", "minecraft:gray_stained_glass_pane", "minecraft:gray_stained_glass", "minecraft:green_stained_glass_pane", "minecraft:green_stained_glass", "minecraft:grindstone", "minecraft:honey_block", "minecraft:hopper", "minecraft:ice", "minecraft:iron_bars", "minecraft:ladder", "minecraft:lantern", "minecraft:lectern", "minecraft:light_blue_stained_glass_pane", "minecraft:light_blue_stained_glass", "minecraft:light_gray_stained_glass_pane", "minecraft:light_gray_stained_glass", "minecraft:lily_pad", "minecraft:lime_stained_glass_pane", "minecraft:lime_stained_glass", "minecraft:magenta_stained_glass_pane", "minecraft:magenta_stained_glass", "minecraft:moss_carpet", "minecraft:moving_piston", "minecraft:orange_stained_glass_pane", "minecraft:orange_stained_glass", "minecraft:pink_stained_glass_pane", "minecraft:pink_stained_glass", "minecraft:piston_head", "minecraft:player_head", "minecraft:player_wall_head", "minecraft:purple_stained_glass_pane", "minecraft:purple_stained_glass", "minecraft:red_stained_glass_pane", "minecraft:red_stained_glass", "minecraft:repeater", "minecraft:scaffolding", "minecraft:sea_pickle", "minecraft:skeleton_skull", "minecraft:skeleton_wall_skull", "minecraft:slime_block", "minecraft:snow", "minecraft:spawner", "minecraft:stonecutter", "minecraft:sweet_berry_bush", "minecraft:trapped_chest", "minecraft:tripwire_hook", "minecraft:tripwire", "minecraft:turtle_egg", "minecraft:white_stained_glass_pane", "minecraft:white_stained_glass", "minecraft:wither_skeleton_skull", "minecraft:wither_skeleton_wall_skull", "minecraft:yellow_stained_glass_pane", "minecraft:yellow_stained_glass", "minecraft:zombie_head", "minecraft:zombie_wall_head" ] } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/tags/block/piston.json ================================================ { "values": [ "minecraft:piston", "minecraft:sticky_piston" ] } ================================================ FILE: gm4_soul_glass/data/gm4_soul_glass/test/smelt_soul_glass.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1.5 ~1 ~0.5 # @timeout 900 item replace entity @s weapon.mainhand with furnace execute at @s run tp @s ~ ~ ~ facing ~ ~-1 ~1 dummy @s use block ~1 ~ ~1 up assert block ~1 ~1 ~1 furnace item replace block ~1 ~1 ~1 container.0 with soul_sand item replace block ~1 ~1 ~1 container.1 with coal await items block ~1 ~1 ~1 container.2 minecraft:brown_stained_glass[custom_data~{gm4_soul_glass:1b}] ================================================ FILE: gm4_spawner_minecarts/README.md ================================================ # Spawner Minecarts Pick up Spawners and move them wherever you want with Minecarts. ### Features - Any spawner can be pushed into a Minecart buy pushing it with a piston - Spawner Minecarts have a reduced spawn rate for each nearby spawner minecart ================================================ FILE: gm4_spawner_minecarts/assets/translations.csv ================================================ key,en_us advancement.gm4.spawner_minecarts.title,Don't Go Breaking My Cart advancement.gm4.spawner_minecarts.description,Capture a Monster Spawner text.gm4.guidebook.module_desc.spawner_minecarts,Pick up Spawners and move them wherever you want with Minecarts. text.gm4.guidebook.spawner_minecarts.description,Spawners can be picked up with Minecarts.\n\nOnce a spawner is in a minecart it cannot be ejected and has reduced spawn rates for all carts within a 9x8x9 area around the spawner. text.gm4.guidebook.spawner_minecarts.pick_up,"To capture a spawner, place a minecart under it, then a downwards piston above the spawner, and finally a redstone block above the piston." ================================================ FILE: gm4_spawner_minecarts/beet.yaml ================================================ id: gm4_spawner_minecarts name: Spawner Minecarts version: 3.1.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: spawner reference: gui/advancement/spawner_minecarts template: advancement website: description: Pick up Spawners and move them wherever you want with Minecarts. recommended: [] notes: [] modrinth: project_id: j4qeIaSW wiki: https://wiki.gm4.co/wiki/Spawner_Minecarts credits: Creators: - Sparks - Bloo - SpecialBuilder32 Icon Design: - Sparks ================================================ FILE: gm4_spawner_minecarts/data/gm4/advancement/spawner_minecarts.json ================================================ { "display": { "icon": { "id": "spawner", "components": { "minecraft:custom_model_data": {"strings":["gm4_spawner_minecarts:gui/advancement/spawner_minecarts"]} } }, "title": { "translate": "advancement.gm4.spawner_minecarts.title", "fallback": "Don't Go Breaking My Cart" }, "description": { "translate": "advancement.gm4.spawner_minecarts.description", "fallback": "Capture a Monster Spawner", "color": "gray" } }, "parent": "gm4:root", "criteria": { "capture_spawner_cart": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/capture_spawner.mcfunction ================================================ # try to pick up spawner with minecart # @s = minecarts under spawners # at @s # run from main # get spawner data data modify storage gm4_spawner_minecarts:temp spawner set from block ~ ~1 ~ # check if this spawner is blacklisted execute if data storage gm4_spawner_minecarts:temp spawner.SpawnPotentials[{data:{entity:{data:{gm4_spawner_minecrarts:{ban_pickup:1}}}}}] run return run function gm4_spawner_minecarts:capture_spawner/fail_pickup execute if data storage gm4_spawner_minecarts:temp spawner.SpawnData[{data:{entity:{data:{gm4_spawner_minecrarts:{ban_pickup:1}}}}}] run return run function gm4_spawner_minecarts:capture_spawner/fail_pickup # pick up spawner summon spawner_minecart ~ ~ ~ {Tags:["gm4_spawner_minecart","gm4_spawner_minecart.new"],MaxNearbyEntities:6,RequiredPlayerRange:16,SpawnCount:4,SpawnData:{entity:{id:"minecraft:pig"}},MaxSpawnDelay:600s,Delay:-1,SpawnRange:4s,MinSpawnDelay:100s,SpawnPotentials:[],Invulnerable:1b} setblock ~ ~1 ~ air destroy data modify entity @e[tag=gm4_spawner_minecart.new,limit=1,distance=..1] {} merge from storage gm4_spawner_minecarts:temp spawner tag @e[tag=gm4_spawner_minecart.new,limit=1,distance=..1] remove gm4_spawner_minecart.new advancement grant @a[distance=..5,gamemode=!spectator] only gm4:spawner_minecarts kill @s ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/init.mcfunction ================================================ execute unless score spawner_minecarts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Spawner Minecarts"} execute unless score spawner_minecarts gm4_earliest_version < spawner_minecarts gm4_modules run scoreboard players operation spawner_minecarts gm4_earliest_version = spawner_minecarts gm4_modules scoreboard players set spawner_minecarts gm4_modules 1 scoreboard objectives add gm4_spawner_minecarts_data dummy schedule function gm4_spawner_minecarts:main 1t #$moduleUpdateList ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/main.mcfunction ================================================ schedule function gm4_spawner_minecarts:main 16t # check for minecarts under spawners execute as @e[type=minecart,tag=!smithed.entity] at @s if block ~ ~1 ~ spawner align xyz positioned ~0.5 ~1.5 ~0.5 unless entity @e[tag=smithed.block,distance=..0.5,limit=1] at @s if block ~ ~2 ~ #gm4_spawner_minecarts:piston[facing=down] if block ~ ~3 ~ redstone_block run function gm4_spawner_minecarts:capture_spawner #process all spawner minecarts execute as @e[type=spawner_minecart,tag=gm4_spawner_minecart] at @s run function gm4_spawner_minecarts:process ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/function/process.mcfunction ================================================ # process spawner minecarts # @s = spawner minecart # at @s # run from main # check nearby spawner minecarts, each gives a +25% chance to not reduce delay execute positioned ~-4.5 ~-4 ~-4.5 store result score $nearby_carts gm4_spawner_minecarts_data if entity @e[type=spawner_minecart,tag=gm4_spawner_minecart,dx=8,dy=7,dz=8] scoreboard players remove $nearby_carts gm4_spawner_minecarts_data 1 execute unless predicate {condition:"random_chance",chance:{type:"score",score:"gm4_spawner_minecarts_data",target:{type:"fixed",name:"$nearby_carts"},scale:0.25}} run return fail execute store result score $delay gm4_spawner_minecarts_data run data get entity @s Delay execute store result entity @s Delay int 1 run scoreboard players add $delay gm4_spawner_minecarts_data 16 particle angry_villager ~ ~ ~ 0.4 0.4 0.4 0 1 ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/guidebook/spawner_minecarts.json ================================================ { "id": "spawner_minecarts", "name": "Spawner Minecarts", "module_type": "module", "icon": { "id": "minecraft:spawner" }, "criteria": { "obtain_piston": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:piston" ] } ] } }, "obtain_minecart": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:minecart" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.spawner_minecarts.description", "fallback": "Spawners can be picked up with Minecarts.\n\nOnce a spawner is in a minecart it cannot be ejected and has reduced spawn rates for all carts within a 9x8x9 area around the spawner." } ] ] }, { "name": "pick_up", "enable": [], "requirements": [ [ "obtain_piston" ], [ "obtain_minecart" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.spawner_minecarts.pick_up", "fallback": "To capture a spawner, place a minecart under it, then a downwards piston above the spawner, and finally a redstone block above the piston." } ] ] } ] } ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/tags/block/piston.json ================================================ { "values": [ "minecraft:piston", "minecraft:sticky_piston" ] } ================================================ FILE: gm4_spawner_minecarts/data/gm4_spawner_minecarts/test/capture_spawner.mcfunction ================================================ # @template gm4:test_platform setblock ~1 ~1 ~1 rail summon minecart ~1.5 ~1 ~1.5 setblock ~1 ~2 ~1 spawner{SpawnData:{entity:{id:"minecraft:zombie"}}} setblock ~1 ~3 ~1 piston[facing=down] setblock ~1 ~4 ~1 redstone_block await entity @e[type=spawner_minecart,tag=gm4_spawner_minecart,nbt={SpawnData:{entity:{id:"minecraft:zombie"}}}] inside ================================================ FILE: gm4_speed_paths/README.md ================================================ # Speed Paths Connect your places with paths and get a speed buff for doing so! Two players running, one going faster due to a speed boost from the path. ### Features - When walking on a path, the player is given a 20% speed boost - Speed from the path stacks with other sources ================================================ FILE: gm4_speed_paths/beet.yaml ================================================ id: gm4_speed_paths name: Speed Paths version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] website: description: Gives you a speed effect when you walk on path blocks. recommended: [] notes: [] modrinth: project_id: vRH8BKZ7 video: https://www.youtube.com/watch?v=99VFSW1ORzU wiki: https://wiki.gm4.co/wiki/Speed_Paths credits: Creator: - 15Redstones Updated by: - Misode - TheEpyonProject Icon Design: - Sparks ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/add_speed.mcfunction ================================================ # applies the Speed Paths attribute and gm4_on_path tag # @s = player upon stepping on a speed path # at @s # run from main tag @s add gm4_on_path scoreboard players set @s gm4_speed_paths 5 attribute @s minecraft:movement_speed modifier add minecraft:dc33007e-5da4-4fad-a850-9c5a058c22ba 0.2 add_multiplied_base ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/check_path.mcfunction ================================================ # checks if the player is still on a speed path # @s = player, with gm4_on_path tag # at @s # run from main execute if entity @s[scores={gm4_speed_paths=1..}] unless block ~ ~-0.9 ~ minecraft:dirt_path run scoreboard players remove @s gm4_speed_paths 1 execute if block ~ ~-0.9 ~ minecraft:dirt_path run scoreboard players set @s gm4_speed_paths 5 execute at @s[scores={gm4_speed_paths=..0}] run function gm4_speed_paths:apply_effects/remove_speed ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/function/apply_effects/remove_speed.mcfunction ================================================ # removes the Speed Path attribute speed and on_path tag # @s = player, 2 after no longer being on a speed path # at @s # run from apply_effects/check_path attribute @s minecraft:movement_speed modifier remove minecraft:dc33007e-5da4-4fad-a850-9c5a058c22ba tag @s remove gm4_on_path ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/function/init.mcfunction ================================================ execute unless score speed_paths gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Speed Paths"} execute unless score speed_paths gm4_earliest_version < speed_paths gm4_modules run scoreboard players operation speed_paths gm4_earliest_version = speed_paths gm4_modules scoreboard players set speed_paths gm4_modules 1 scoreboard objectives add gm4_speed_paths dummy schedule function gm4_speed_paths:main 1t #$moduleUpdateList ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/function/main.mcfunction ================================================ execute as @a[tag=!gm4_on_path] at @s if block ~ ~-0.9 ~ minecraft:dirt_path run function gm4_speed_paths:apply_effects/add_speed execute as @a[tag=gm4_on_path] at @s run function gm4_speed_paths:apply_effects/check_path schedule function gm4_speed_paths:main 8t ================================================ FILE: gm4_speed_paths/data/gm4_speed_paths/guidebook/speed_paths.json ================================================ { "id": "speed_paths", "name": "Speed Paths", "module_type": "module", "icon": { "id": "minecraft:dirt_path" }, "criteria": { "stand_in_path": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "block": { "blocks": [ "minecraft:dirt_path" ] } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "stand_in_path" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.speed_paths.description", "fallback": "Dirt paths increase movement speed by 20%.\n\nThis will stack with other speed effects such as that from beacons and potions." } ] ] } ] } ================================================ FILE: gm4_speed_paths/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.speed_paths,Gives you a speed effect when you walk on path blocks. text.gm4.guidebook.speed_paths.description,Dirt paths increase movement speed by 20%.\n\nThis will stack with other speed effects such as that from beacons and potions. ================================================ FILE: gm4_standard_crafting/README.md ================================================ # Standard Crafting A recipe pack that adds some handy additional recipes to the crafting table. Player crafting basic recipes in a Custom Crafter ### Features - Adds a basic set of recipes to the crafting table A full list of recipes can be read on the [Wiki](https://wiki.gm4.co/Standard_Crafting). ================================================ FILE: gm4_standard_crafting/beet.yaml ================================================ id: gm4_standard_crafting name: Standard Crafting version: 2.0.X data_pack: load: . pipeline: - generate_recipes - gm4.plugins.extend.module meta: gm4: website: description: A crafting recipe pack that adds some nifty new recipes to the game. recommended: [] notes: [] modrinth: project_id: KIxK9MA7 video: https://www.youtube.com/watch?v=_GekIoefncg wiki: https://wiki.gm4.co/wiki/Standard_Crafting credits: Creator: - Sparks Updated by: - Bloo - runcows Icon Design: - Sparks ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/amethyst_shard.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:amethyst_shard" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:amethyst_block" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:amethyst_shard" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/bamboo_block_chest.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:bamboo_block_chest" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bamboo_block", "minecraft:stripped_bamboo_block" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:bamboo_block_chest" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/bone_block.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:bone_block" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bone" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:bone_block" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/brown_dye.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:brown_dye" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:orange_dye", "minecraft:black_dye" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:brown_dye" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/cherry_leaves.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:cherry_leaves" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:pink_petals" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:cherry_leaves" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/cobweb.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:cobweb" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:string" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:cobweb" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/copper_chain.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:copper_chain" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:copper_ingot" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:copper_chain" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/diamond_horse_armor.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:golden_horse_armor" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:gold_ingot" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:golden_horse_armor" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/dispenser.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:dispenser" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:dropper" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:dispenser" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/enchanted_golden_apple.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:enchanted_golden_apple" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:gold_block" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:enchanted_golden_apple" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/golden_horse_armor.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:diamond_horse_armor" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:diamond" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:diamond_horse_armor" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/gravel.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:gravel" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:flint" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:gravel" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/green_dye.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:green_dye" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:blue_dye", "minecraft:yellow_dye" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:green_dye" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/honeycomb.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:honeycomb" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:honeycomb_block" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:honeycomb" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/iron_chain.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:iron_chain" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:iron_ingot" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:iron_chain" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/iron_horse_armor.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:iron_horse_armor" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:iron_ingot" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:iron_horse_armor" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/log_chest.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:log_chest" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:logs" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:log_chest" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/pink_petals.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:pink_petals" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:cherry_leaves" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:pink_petals" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/pointed_dripstone.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:pointed_dripstone" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:dripstone_block" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:pointed_dripstone" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/quartz.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:quartz" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:quartz_block" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:quartz" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/red_sand_conversion.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:red_sand_conversion" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:iron_nugget" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:red_sand_conversion" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/red_sand_from_sandstone.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:red_sand_from_sandstone" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:red_sandstone", "minecraft:chiseled_red_sandstone", "minecraft:cut_red_sandstone", "minecraft:smooth_red_sandstone" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:red_sand_from_sandstone" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/sand.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:sand" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:sandstone", "minecraft:chiseled_sandstone", "minecraft:cut_sandstone", "minecraft:smooth_sandstone" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:sand" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/advancement/recipes/string.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_standard_crafting:string" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:wool" } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_standard_crafting:string" ] } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/function/init.mcfunction ================================================ execute unless score standard_crafting gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Standard Crafting"} execute unless score standard_crafting gm4_earliest_version < standard_crafting gm4_modules run scoreboard players operation standard_crafting gm4_earliest_version = standard_crafting gm4_modules scoreboard players set standard_crafting gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/guidebook/standard_crafting.json ================================================ { "id": "standard_crafting", "name": "Standard Crafting", "module_type": "module", "icon": { "id": "minecraft:crafting_table" }, "criteria": { "obtain_gravel": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:gravel" ] } ] } }, "obtain_sand": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:sand" ] } ] } }, "obtain_red_sand": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:red_sand", "minecraft:iron_nugget" ] } ] } }, "obtain_amethyst": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:amethyst_block", "minecraft:amethyst_shard" ] } ] } }, "obtain_dripstone": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:dripstone_block", "minecraft:pointed_dripstone" ] } ] } }, "obtain_quartz": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:quartz_block", "minecraft:quartz" ] } ] } }, "obtain_cobweb": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:cobweb", "minecraft:string" ] } ] } }, "obtain_wool": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:wool" } ] } }, "ride_horse": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:horse" } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:horse", "nbt": "{NoAI:1b}" } } } } ] } }, "obtain_gold_block": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:enchanted_golden_apple", "minecraft:gold_block" ] } ] } }, "obtain_honeycomb_block": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:honeycomb_block" ] } ] } }, "obtain_dropper": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:dropper" ] } ] } }, "obtain_bone": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bone" ] } ] } }, "obtain_log": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:logs" } ] } }, "obtain_bamboo_block": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:bamboo_block", "minecraft:stripped_bamboo_block" ] } ] } }, "obtain_cherry_leaves": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:cherry_leaves" ] } ] } }, "obtain_pink_petals": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:pink_petals" ] } ] } }, "obtain_iron_ingot": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:iron_ingot" ] } ] } }, "obtain_copper_ingot": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:copper_ingot" ] } ] } }, "obtain_brown_dye_ingredients": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:orange_dye", "minecraft:black_dye" ] } ] } }, "obtain_green_dye_ingredients": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:blue_dye", "minecraft:yellow_dye" ] } ] } } }, "sections": [ { "name": "default_recipes", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.standard_crafting.recipes", "fallback": "The following recipes have been added to the crafting table." } ], [ { "translate": "text.gm4.guidebook.standard_crafting.stair_decraft", "fallback": "Stairs can be reverted to their base block" }, "\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:stairs_decraft/oak_stairs" } ], [ { "translate": "text.gm4.guidebook.standard_crafting.slab_decraft", "fallback": "Slabs can be reverted to their base block" }, "\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:slab_decraft/stone_slab" } ] ] }, { "name": "gravel_recipe", "enable": [], "requirements": [ [ "obtain_gravel" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:gravel" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "sand_recipe", "enable": [], "requirements": [ [ "obtain_sand" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.standard_crafting.sandstone_decraft", "fallback": "Any sandstone can be converted into sand" }, "\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:sand" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "red_sand_recipe", "enable": [], "requirements": [ [ "obtain_red_sand" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.standard_crafting.red_sandstone_decraft", "fallback": "Any red sandstone can be converted into red sand" }, "\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:red_sand_from_sandstone" } ], [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:red_sand_conversion" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "amethyst_recipe", "enable": [], "requirements": [ [ "obtain_amethyst" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:amethyst_shard" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "dripstone_recipe", "enable": [], "requirements": [ [ "obtain_dripstone" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:pointed_dripstone" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "quartz_recipe", "enable": [], "requirements": [ [ "obtain_quartz" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:quartz" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "string_recipe", "enable": [], "requirements": [ [ "obtain_wool" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.standard_crafting.string_craft", "fallback": "Any wool can be ripped into string" }, "\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:string" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "cobweb_recipe", "enable": [], "requirements": [ [ "obtain_cobweb" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:cobweb" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "horse_armor_recipe", "enable": [], "requirements": [ [ "ride_horse" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.standard_crafting.horse_armor", "fallback": "Diamond, iron, copper, and golden armor can be crafted" }, "\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:diamond_horse_armor" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "enchanted_golden_apple_recipe", "enable": [], "requirements": [ [ "obtain_gold_block" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:enchanted_golden_apple" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "honeycomb_recipe", "enable": [], "requirements": [ [ "obtain_honeycomb_block" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:honeycomb" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "dispenser_recipe", "enable": [], "requirements": [ [ "obtain_dropper" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:dispenser" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "bone_block_recipe", "enable": [], "requirements": [ [ "obtain_bone" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:bone_block" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "log_chest_recipe", "enable": [], "requirements": [ [ "obtain_log" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:log_chest" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "bamboo_block_chest_recipe", "enable": [], "requirements": [ [ "obtain_bamboo_block" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:bamboo_block_chest" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "pink_petals_recipe", "enable": [], "requirements": [ [ "obtain_cherry_leaves" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:pink_petals" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "cherry_leaves_recipe", "enable": [], "requirements": [ [ "obtain_pink_petals" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:cherry_leaves" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "iron_chain_recipe", "enable": [], "requirements": [ [ "obtain_iron_ingot" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:iron_chain" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "copper_chain_recipe", "enable": [], "requirements": [ [ "obtain_copper_ingot" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:copper_chain" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "brown_dye_recipe", "enable": [], "requirements": [ [ "obtain_brown_dye_ingredients" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:brown_dye" } ] ], "prerequisites": [ "default_recipes" ] }, { "name": "green_dye_recipe", "enable": [], "requirements": [ [ "obtain_green_dye_ingredients" ] ], "pages": [ [ "\n\n\n", { "insert": "recipe", "recipe": "gm4_standard_crafting:green_dye" } ] ], "prerequisites": [ "default_recipes" ] } ] } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/amethyst_shard.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "misc", "ingredients": [ "minecraft:amethyst_block" ], "result": { "id": "minecraft:amethyst_shard", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/bamboo_block_chest.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "group": "chest", "key": { "#": [ "minecraft:bamboo_block", "minecraft:stripped_bamboo_block" ] }, "pattern": [ "###", "# #", "###" ], "result": { "id": "minecraft:chest", "count": 2 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/bone_block.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "building", "group": "bone_block", "ingredients": [ "minecraft:bone", "minecraft:bone", "minecraft:bone" ], "result": { "id": "minecraft:bone_block" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/brown_dye.json ================================================ { "type": "minecraft:crafting_shapeless", "group": "brown_dye", "ingredients": [ "minecraft:orange_dye", "minecraft:black_dye" ], "result": { "id": "minecraft:brown_dye", "count": 2 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/cherry_leaves.json ================================================ { "type": "minecraft:crafting_shaped", "category": "building", "pattern": [ "PP", "PP" ], "key": { "P": "minecraft:pink_petals" }, "result": { "id": "minecraft:cherry_leaves", "count": 1 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/cobweb.json ================================================ { "type": "minecraft:crafting_shaped", "category": "building", "pattern": [ "SSS", "SBS", "SSS" ], "key": { "S": "minecraft:string", "B": "minecraft:slime_ball" }, "result": { "id": "minecraft:cobweb" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/copper_chain.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "group": "copper_chain", "key": { "I": "minecraft:copper_block", "N": "minecraft:copper_ingot" }, "pattern": [ "N", "I", "N" ], "result": { "id": "minecraft:copper_chain", "count": 9 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/diamond_horse_armor.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ " D", "DLD", "D D" ], "key": { "D": "minecraft:diamond", "L": "minecraft:leather" }, "result": { "id": "minecraft:diamond_horse_armor" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/dispenser.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "group": "dispenser", "key": { "S": "minecraft:string", "#": "minecraft:dropper", "/": "minecraft:stick" }, "pattern": [ " /S", "/#S", " /S" ], "result": { "id": "minecraft:dispenser", "count": 1 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/enchanted_golden_apple.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "pattern": [ "GGG", "GAG", "GGG" ], "key": { "G": "minecraft:gold_block", "A": "minecraft:apple" }, "result": { "id": "minecraft:enchanted_golden_apple" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/golden_horse_armor.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ " G", "GLG", "G G" ], "key": { "G": "minecraft:gold_ingot", "L": "minecraft:leather" }, "result": { "id": "minecraft:golden_horse_armor" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/gravel.json ================================================ { "type": "minecraft:crafting_shaped", "category": "building", "pattern": [ "FF", "FF" ], "key": { "F": "minecraft:flint" }, "result": { "id": "minecraft:gravel", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/green_dye.json ================================================ { "type": "minecraft:crafting_shapeless", "ingredients": [ "minecraft:yellow_dye", "minecraft:blue_dye" ], "result": { "id": "minecraft:green_dye", "count": 2 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/honeycomb.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "misc", "ingredients": [ "minecraft:honeycomb_block" ], "result": { "id": "minecraft:honeycomb", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/iron_chain.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "group": "iron_chain", "key": { "I": "minecraft:iron_block", "N": "minecraft:iron_ingot" }, "pattern": [ "N", "I", "N" ], "result": { "id": "minecraft:iron_chain", "count": 9 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/iron_horse_armor.json ================================================ { "type": "minecraft:crafting_shaped", "category": "equipment", "pattern": [ " I", "ILI", "I I" ], "key": { "I": "minecraft:iron_ingot", "L": "minecraft:leather" }, "result": { "id": "minecraft:iron_horse_armor" } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/log_chest.json ================================================ { "type": "minecraft:crafting_shaped", "category": "misc", "group": "chest", "key": { "#": "#minecraft:logs" }, "pattern": [ "###", "# #", "###" ], "result": { "id": "minecraft:chest", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/pink_petals.json ================================================ { "type": "minecraft:crafting_shapeless", "ingredients": [ "minecraft:cherry_leaves" ], "result": { "id": "minecraft:pink_petals", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/pointed_dripstone.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "misc", "ingredients": [ "minecraft:dripstone_block" ], "result": { "id": "minecraft:pointed_dripstone", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/quartz.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "misc", "ingredients": [ "minecraft:quartz_block" ], "result": { "id": "minecraft:quartz", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/red_sand_conversion.json ================================================ { "type": "minecraft:crafting_shaped", "category": "building", "group": "red_sand", "pattern": [ "SSS", "SIS", "SSS" ], "key": { "S": "minecraft:sand", "I": "minecraft:iron_nugget" }, "result": { "id": "minecraft:red_sand", "count": 8 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/red_sand_from_sandstone.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "building", "group": "red_sand", "ingredients": [ [ "minecraft:red_sandstone", "minecraft:chiseled_red_sandstone", "minecraft:cut_red_sandstone", "minecraft:smooth_red_sandstone" ] ], "result": { "id": "minecraft:red_sand", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/sand.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "building", "ingredients": [ [ "minecraft:sandstone", "minecraft:chiseled_sandstone", "minecraft:cut_sandstone", "minecraft:smooth_sandstone" ] ], "result": { "id": "minecraft:sand", "count": 4 } } ================================================ FILE: gm4_standard_crafting/data/gm4_standard_crafting/recipe/string.json ================================================ { "type": "minecraft:crafting_shapeless", "category": "misc", "ingredients": [ "#minecraft:wool" ], "result": { "id": "minecraft:string", "count": 3 } } ================================================ FILE: gm4_standard_crafting/generate_recipes.py ================================================ from beet import Context, Recipe, Advancement from beet.contrib.vanilla import Vanilla import logging logger = logging.getLogger(__name__) def beet_default(ctx: Context): """ - generates recipes for stair and slab decrafting - groups recipes that have existing vanilla recipes """ vanilla = ctx.inject(Vanilla) vanilla.minecraft_version = '26.1' item_tags = vanilla.mount("data/minecraft/tags/item").data.item_tags recipes = vanilla.mount("data/minecraft/recipe").data.recipes def group_recipe(output: str) -> str: output = output.removeprefix('minecraft:') # remove prefix output_recipe = recipes.get("minecraft:" + output) if output_recipe is None: # no recipe return output elif "group" in output_recipe.data: # recipe with group return output_recipe.data["group"] else: # recipe but no group, add it group: str = output output_recipe.data["group"] = group output_recipe.data["__smithed__"] = { "rules": [ { "type": "replace", "target": "group", "source": { "type": "reference", "path": "group" } } ] } ctx.data["minecraft:" + output] = Recipe(output_recipe.data) return group def recursive_apply(items: list[str], dir: str, shape: list[str], output_count: int): for item in items: if "#" in item: recursive_apply(item_tags[item.lstrip("#")].data["values"], dir, shape, output_count) continue # get full block id from the vanilla stair recipe recipe = recipes.get(item) if not recipe: logger.debug(f"No vanilla recipe found for {item}, skipping") continue input: str | list[str] = recipe.data["key"]["#"] if isinstance(input, list): output = input[0] else: output = input recipe_path = f"gm4_standard_crafting:{dir}/{item.removeprefix('minecraft:')}" group = group_recipe(output) ctx.data[recipe_path] = Recipe({ "type": "minecraft:crafting_shaped", "category": "building", "group": group, "pattern": shape, "key": { "#": item }, "result": { "id": output, "count": output_count } }) ctx.data[f"gm4_standard_crafting:recipes/{dir}/{item.removeprefix('minecraft:')}"] = Advancement({ "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": recipe_path } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ item ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials" ] ], "rewards": { "recipes": [ recipe_path ] } }) stairs: list[str] = item_tags["minecraft:stairs"].data['values'] recursive_apply(stairs, "stairs_decraft", ["##", "##"], 3) slabs: list[str] = item_tags["minecraft:slabs"].data['values'] recursive_apply(slabs, "slab_decraft", ["##","##"], 2) for recipe in [ "dispenser", "bone_block", "chest", "iron_chain", "copper_chain", "brown_dye" ]: group_recipe(recipe) ================================================ FILE: gm4_standard_crafting/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.standard_crafting,A crafting recipe pack that adds some nifty new recipes to the game. text.gm4.guidebook.shapeless,Recipe is shapeless text.gm4.guidebook.standard_crafting.recipes,The following recipes have been added to the crafting table. text.gm4.guidebook.standard_crafting.stair_decraft,Stairs can be reverted to their base block text.gm4.guidebook.standard_crafting.slab_decraft,Slabs can be reverted to their base block text.gm4.guidebook.standard_crafting.sandstone_decraft,Any sandstone can be converted into sand text.gm4.guidebook.standard_crafting.red_sandstone_decraft,Any red sandstone can be converted into red sand text.gm4.guidebook.standard_crafting.string_craft,Any wool can be ripped into string text.gm4.guidebook.standard_crafting.horse_armor,"Diamond, iron, copper, and golden armor can be crafted" ================================================ FILE: gm4_sunken_treasure/README.md ================================================ # Sunken Treasure Digging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters. ### Features - Chances of getting treasure increase per level of Fortune - Treasure drops range from Bones to Treasure Chests - A chance to get a Message in a Bottle also exists... with some hidden story amongst them all. A full list of drops can be read on the [Wiki](https://wiki.gm4.co/Sunken_Treasure). ================================================ FILE: gm4_sunken_treasure/assets/gm4_sunken_treasure/optifine/cit/waders.properties ================================================ type=armor matchItems=golden_boots texture.gold_layer_1=waders_layer_1 nbt.CustomModelData=$item/waders ================================================ FILE: gm4_sunken_treasure/assets/translations.csv ================================================ key,en_us advancement.gm4.sunken_treasure.description,Find all Dearest Audrey messages in a bottle advancement.gm4.sunken_treasure.title,All My Audreys block.gm4.treasure_chest,Treasure Chest block.gm4.shipwreck_treasure_chest,Shipwreck Treasure Chest block.gm4.shipwreck_supply_chest,Shipwreck Supply Chest item.gm4.message_in_a_bottle,Message in a Bottle item.gm4.waders,Waders text.gm4.dearest_audrey.1,I drank all my beer text.gm4.dearest_audrey.10.1,What's your text.gm4.dearest_audrey.10.2,phone number; bottled messages text.gm4.dearest_audrey.10.3,are hard to make! text.gm4.dearest_audrey.11.1,I find myself stranded text.gm4.dearest_audrey.11.2,on a barren island. text.gm4.dearest_audrey.11.3,"An enderdragon took me here," text.gm4.dearest_audrey.11.4,please rescue me. text.gm4.dearest_audrey.12,Put the money in the bag. text.gm4.dearest_audrey.13.1,The compass you sent me text.gm4.dearest_audrey.13.2,"seems to only point in the direction of our love," text.gm4.dearest_audrey.13.3,but that seems to have vanished long ago. text.gm4.dearest_audrey.13.4,"Please, get help, even if it's the last thing you do." text.gm4.dearest_audrey.14.1,I fear this may text.gm4.dearest_audrey.14.2,be my last attempt at finding help. text.gm4.dearest_audrey.14.3,I just want you to know... I always... loved... text.gm4.dearest_audrey.14.4,your sister. text.gm4.dearest_audrey.15.1,I've been here for 3 months text.gm4.dearest_audrey.15.2,"and after several attempts to find food," text.gm4.dearest_audrey.15.3,"shelter, or even enough water... I'm giving up." text.gm4.dearest_audrey.15.4,"Tell my family I love them, but most importantly," text.gm4.dearest_audrey.15.5,"Audrey, I love you." text.gm4.dearest_audrey.16.1,I know exactly who text.gm4.dearest_audrey.16.2,you are - play along. I don't have any text.gm4.dearest_audrey.16.3,money. I burned it all trying to make a text.gm4.dearest_audrey.16.4,fire. But I can tell you I've developed text.gm4.dearest_audrey.16.5,a very particular set of skills. Skills text.gm4.dearest_audrey.16.6,that'll make Bear Grylls quake in his boots. text.gm4.dearest_audrey.17.1,I'm in the sink sand. text.gm4.dearest_audrey.17.2,"If you find my head, hang it on the" text.gm4.dearest_audrey.17.3,wall of fame. text.gm4.dearest_audrey.18.1,Each day that passes text.gm4.dearest_audrey.18.2,"is immensely terrible, painful and sad." text.gm4.dearest_audrey.18.3,Getting away from you just didn't text.gm4.dearest_audrey.18.4,improve anything. text.gm4.dearest_audrey.19.1,I write this on paper text.gm4.dearest_audrey.19.2,made from native plants and ink text.gm4.dearest_audrey.19.3,from a squid I wrangled. I like it here. text.gm4.dearest_audrey.19.4,I found a dungeon. I'm setting up a mob text.gm4.dearest_audrey.19.5,grinder and never coming home. text.gm4.dearest_audrey.2.1,My boat was text.gm4.dearest_audrey.2.2,sunk by a lily-pad and now I'm text.gm4.dearest_audrey.2.3,stuck on this island. text.gm4.dearest_audrey.20.1,punching wood text.gm4.dearest_audrey.20.2,for logs doesn't work in real life. text.gm4.dearest_audrey.3.1,I don't know how to spell text.gm4.dearest_audrey.3.2,"your name, nor do I know you, but I" text.gm4.dearest_audrey.3.3,"do know that I love you, I feel like I" text.gm4.dearest_audrey.3.4,have a mutual connection. After text.gm4.dearest_audrey.3.5,you ordered the pizza with cheezy text.gm4.dearest_audrey.3.6,crust and pinapple I just lost it. Oh text.gm4.dearest_audrey.3.7,no Clair you got shot... I mean Audrey. text.gm4.dearest_audrey.3.8,I don't mind that you're chunky text.gm4.dearest_audrey.4.1,when I listen text.gm4.dearest_audrey.4.2,"to the ocean, all I hear is your" text.gm4.dearest_audrey.4.3,snoring and I can't sleep. Please text.gm4.dearest_audrey.4.4,"silence your snoring... please, I" text.gm4.dearest_audrey.4.5,need sleep. text.gm4.dearest_audrey.5.1,How's your text.gm4.dearest_audrey.5.2,"day going? I'm good, BUT I'VE" text.gm4.dearest_audrey.5.3,BEEN STRANDED FOR 20 YEARS! text.gm4.dearest_audrey.5.4,Thanks for your response. text.gm4.dearest_audrey.6.1,I'm stranded text.gm4.dearest_audrey.6.2,"in the middle of nowhere," text.gm4.dearest_audrey.6.3,surrounded by things that text.gm4.dearest_audrey.6.4,aren't cubic. text.gm4.dearest_audrey.7.1,I mean Hannah... text.gm4.dearest_audrey.7.2,"wait, no... is it Denise? ...Anyway," text.gm4.dearest_audrey.7.3,I love you. text.gm4.dearest_audrey.8.1,I seem to have text.gm4.dearest_audrey.8.2,"run out of clean water, if you could" text.gm4.dearest_audrey.8.3,return this bottle with something to text.gm4.dearest_audrey.8.4,drink that would be wonderful. text.gm4.dearest_audrey.9.1,I have no text.gm4.dearest_audrey.9.2,internet so I am sending you text.gm4.dearest_audrey.9.3,a bottle. text.gm4.dearest_audrey.prefix,"Dearest Audrey, " text.gm4.guidebook.module_desc.sunken_treasure,"Digging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters." text.gm4.guidebook.sunken_treasure.description,Mining sand or gravel deep underwater with a Fortune shovel has a chance of dropping treasure.\n\nMining in different biomes can result in different drops. text.gm4.guidebook.sunken_treasure.details,"Treasure can only be found if submerged in water at least 4 blocks deep.\n\nGravel and sand contain different loot, but both contain rare treasure chests." ================================================ FILE: gm4_sunken_treasure/beet.yaml ================================================ id: gm4_sunken_treasure name: Sunken Treasure version: 1.8.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [tick] model_data: - item: glass_bottle reference: item/message_in_a_bottle template: generated - item: golden_boots reference: item/waders template: generated - item: chest template: vanilla broadcast: - reference: item/shipwreck_supply - reference: item/shipwreck_treasure - reference: item/treasure_chest - item: glass_bottle reference: gui/advancement/sunken_treasure template: name: advancement forward: item/message_in_a_bottle website: description: Digging sand underwater with a fortune tool can uncover buried treasures, or a nasty surprise! Who knows, maybe you'll even find some old love letters. recommended: - gm4_resource_pack - gm4_scuba_gear notes: [] modrinth: project_id: drjgVlzU video: https://www.youtube.com/watch?v=VV7ZIyIzKV0 wiki: https://wiki.gm4.co/wiki/Sunken_Treasure credits: Creators: - Wumpacraft - Sparks Updated by: - BPR - Lue Icon Design: - Hozz ================================================ FILE: gm4_sunken_treasure/data/gm4/advancement/sunken_treasure.json ================================================ { "display": { "icon": { "id": "glass_bottle", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:gui/advancement/sunken_treasure"]} } }, "title": { "translate": "advancement.gm4.sunken_treasure.title", "fallback": "All My Audreys" }, "description": { "translate": "advancement.gm4.sunken_treasure.description", "fallback": "Find all Dearest Audrey messages in a bottle", "color": "gray" } }, "parent": "gm4:root", "criteria": { "my_audrey_1": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:1b}" } } ] } }, "my_audrey_2": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:2b}" } } ] } }, "my_audrey_3": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:3b}" } } ] } }, "my_audrey_4": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:4b}" } } ] } }, "my_audrey_5": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:5b}" } } ] } }, "my_audrey_6": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:6b}" } } ] } }, "my_audrey_7": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:7b}" } } ] } }, "my_audrey_8": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:8b}" } } ] } }, "my_audrey_9": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:9b}" } } ] } }, "my_audrey_10": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:10b}" } } ] } }, "my_audrey_11": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:11b}" } } ] } }, "my_audrey_12": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:12b}" } } ] } }, "my_audrey_13": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:13b}" } } ] } }, "my_audrey_14": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:14b}" } } ] } }, "my_audrey_15": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:15b}" } } ] } }, "my_audrey_16": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:16b}" } } ] } }, "my_audrey_17": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:17b}" } } ] } }, "my_audrey_18": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:18b}" } } ] } }, "my_audrey_19": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:19b}" } } ] } }, "my_audrey_20": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_audrey:20b}" } } ] } } } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/check_gravel.mcfunction ================================================ # @s = player that has mined gravel while underwater # located at @s # run from tick execute at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_gravel_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_gravel execute at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_flint_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_flint ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/init.mcfunction ================================================ scoreboard objectives add gm4_st_sand minecraft.mined:minecraft.sand scoreboard objectives add gm4_st_gravel minecraft.mined:minecraft.gravel scoreboard objectives add gm4_st_random dummy execute unless score sunken_treasure gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Sunken Treasure"} execute unless score sunken_treasure gm4_earliest_version < sunken_treasure gm4_modules run scoreboard players operation sunken_treasure gm4_earliest_version = sunken_treasure gm4_modules scoreboard players set sunken_treasure gm4_modules 1 schedule function gm4_sunken_treasure:tick 1t #$moduleUpdateList ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/spawn_entity.mcfunction ================================================ # @s = item to spawn an entity # run from treasure_flint # and from treasure_gravel # and from treasure sand data modify storage gm4_sunken_treasure:temp spawn set from entity @s Item.components."minecraft:custom_data".gm4_sunken_treasure.spawn execute if data storage gm4_sunken_treasure:temp spawn{id:"minecraft:glow_squid"} run summon glow_squid execute if data storage gm4_sunken_treasure:temp spawn{id:"minecraft:squid"} run summon squid execute if data storage gm4_sunken_treasure:temp spawn{id:"minecraft:guardian"} run summon guardian execute if data storage gm4_sunken_treasure:temp spawn{id:"minecraft:tropical_fish"} run summon tropical_fish data remove storage gm4_sunken_treasure:temp spawn kill @s ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/tick.mcfunction ================================================ execute as @a[scores={gm4_st_sand=1..}] at @s if predicate gm4_sunken_treasure:in_deep_water anchored eyes positioned ^ ^ ^2 at @e[type=minecraft:item,limit=1,distance=..2.5,predicate=gm4_sunken_treasure:is_sand_item,nbt={Age:0s}] run function gm4_sunken_treasure:treasure_sand execute as @a[scores={gm4_st_gravel=1..}] at @s if predicate gm4_sunken_treasure:in_deep_water anchored eyes positioned ^ ^ ^2 run function gm4_sunken_treasure:check_gravel scoreboard players reset @a gm4_st_sand scoreboard players reset @a gm4_st_gravel schedule function gm4_sunken_treasure:tick 1t ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_flint.mcfunction ================================================ # @s = player that has mined gravel while underwater # located at position of flint item # run from check_gravel execute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/gravel_treasure ~ ~ ~ mainhand execute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity # kill flint if loot was spawned execute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_flint_item,nbt={Age:0s}] scoreboard players reset $result gm4_st_random ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_gravel.mcfunction ================================================ # @s = player that has mined gravel while underwater # located at position of gravel item # run from check_gravel execute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/gravel_treasure ~ ~ ~ mainhand execute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity # kill gravel if loot was spawned execute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_gravel_item,nbt={Age:0s}] scoreboard players reset $result gm4_st_random ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/function/treasure_sand.mcfunction ================================================ # @s = player that has mined sand while underwater # located at position of sand item # run from tick execute store result score $result gm4_st_random run loot spawn ~ ~ ~ fish gm4_sunken_treasure:gameplay/sand_treasure ~ ~ ~ mainhand execute as @e[type=item,limit=1,dx=0,predicate=gm4_sunken_treasure:is_spawn_entity_item,nbt={Age:0s}] at @s run function gm4_sunken_treasure:spawn_entity # kill sand if loot was spawned execute if score $result gm4_st_random matches 1.. run kill @e[type=minecraft:item,limit=1,distance=0,predicate=gm4_sunken_treasure:is_sand_item,nbt={Age:0s}] scoreboard players reset $result gm4_st_random ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/guidebook/sunken_treasure.json ================================================ { "id": "sunken_treasure", "name": "Sunken Treasure", "module_type": "module", "icon": { "id": "minecraft:golden_shovel" }, "criteria": { "obtain_fortune_shovel": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:shovels", "enchantments": [ { "enchantments": "minecraft:fortune" } ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.sunken_treasure.description", "fallback": "Mining sand or gravel deep underwater with a Fortune shovel has a chance of dropping treasure.\n\nMining in different biomes can result in different drops." } ] ] }, { "name": "details", "enable": [], "requirements": [ [ "obtain_fortune_shovel" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.sunken_treasure.details", "fallback": "Treasure can only be found if submerged in water at least 4 blocks deep.\n\nGravel and sand contain different loot, but both contain rare treasure chests." } ] ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/chests/treasure_chest.json ================================================ { "type": "minecraft:chest", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:heart_of_the_sea", "weight": 10 }, { "type": "item", "name": "minecraft:wet_sponge", "weight": 50, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:trident", "weight": 1, "functions": [ { "function": "set_damage", "damage": { "min": 0, "max": 0.01 } } ] } ] }, { "rolls": { "min": 0, "max": 2 }, "entries": [ { "type": "item", "name": "minecraft:emerald", "weight": 20, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:diamond", "weight": 10, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:nautilus_shell", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] } ] }, { "rolls": { "min": 1, "max": 3 }, "entries": [ { "type": "item", "name": "minecraft:tube_coral", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:tube_coral_fan", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:tube_coral_block", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:brain_coral", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:brain_coral_fan", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:brain_coral_block", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:bubble_coral", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:bubble_coral_fan", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:bubble_coral_block", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:fire_coral", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:fire_coral_fan", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:fire_coral_block", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "item", "name": "minecraft:horn_coral", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:horn_coral_fan", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] }, { "type": "item", "name": "minecraft:horn_coral_block", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] }, { "rolls": { "min": 4, "max": 8 }, "entries": [ { "type": "item", "name": "minecraft:sand", "weight": 15, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "item", "name": "minecraft:gravel", "weight": 20, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:clay_ball", "weight": 15, "functions": [ { "function": "minecraft:set_count", "count": { "min": 5, "max": 9 } } ] } ] }, { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "item", "name": "minecraft:gunpowder", "weight": 10, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 5 } } ] }, { "type": "item", "name": "minecraft:lapis_lazuli", "weight": 10, "functions": [ { "function": "minecraft:set_count", "count": { "min": 4, "max": 12 } } ] }, { "type": "item", "name": "minecraft:gold_nugget", "weight": 10, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:iron_nugget", "weight": 10, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "item", "name": "minecraft:rotten_flesh", "weight": 5, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "item", "name": "minecraft:bone", "weight": 5, "functions": [ { "function": "set_count", "count": { "min": 1, "max": 5 } } ] } ] }, { "rolls": { "min": 0, "max": 1 }, "entries": [ { "type": "item", "name": "minecraft:book", "weight": 2, "functions": [ { "function": "minecraft:enchant_randomly" } ] }, { "type": "item", "name": "minecraft:iron_shovel", "weight": 1, "functions": [ { "function": "minecraft:enchant_randomly" }, { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.5 } } ] }, { "type": "item", "name": "minecraft:fishing_rod", "weight": 1, "functions": [ { "function": "minecraft:enchant_randomly" }, { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.4 } } ] } ] }, { "rolls": 2, "entries": [ { "type": "item", "name": "minecraft:cod", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 5 } } ] }, { "type": "item", "name": "minecraft:salmon", "weight": 5, "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 5 } } ] }, { "type": "item", "name": "minecraft:tropical_fish", "weight": 1, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "item", "name": "minecraft:pufferfish", "weight": 3, "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/gravel_treasure.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/gravel" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.15, 0.45, 0.9 ] }, { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_ocean" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/gravel" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.1167, 0.35, 0.7 ] }, { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_river" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/gravel" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.0833, 0.25, 0.5 ] }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_ocean" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_river" } } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/sand_treasure.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/sand" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.1167, 0.35, 0.7 ] }, { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_ocean" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/sand" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.0833, 0.25, 0.5 ] }, { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_river" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_sunken_treasure:gameplay/treasure_loot/sand" } ], "conditions": [ { "condition": "minecraft:table_bonus", "enchantment": "minecraft:fortune", "chances": [ 0, 0.05, 0.15, 0.3 ] }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_ocean" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_river" } } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/audrey_bottle.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:1b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.1", "fallback": "I drank all my beer" } ], "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:2b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.2.1", "fallback": "My boat was" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.2.2", "fallback": "sunk by a lily-pad and now I'm", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.2.3", "fallback": "stuck on this island.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:3b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.3.1", "fallback": "I don't know how to spell" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.2", "fallback": "your name, nor do I know you, but I", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.3", "fallback": "do know that I love you, I feel like I", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.4", "fallback": "have a mutual connection. After", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.5", "fallback": "you ordered the pizza with cheezy", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.6", "fallback": "crust and pinapple I just lost it. Oh", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.7", "fallback": "no Clair you got shot... I mean Audrey.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.3.8", "fallback": "I don't mind that you're chunky", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:4b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.4.1", "fallback": "when I listen" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.4.2", "fallback": "to the ocean, all I hear is your", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.4.3", "fallback": "snoring and I can't sleep. Please", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.4.4", "fallback": "silence your snoring... please, I", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.4.5", "fallback": "need sleep.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:5b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.5.1", "fallback": "How's your" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.5.2", "fallback": "day going? I'm good, BUT I'VE", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.5.3", "fallback": "BEEN STRANDED FOR 20 YEARS!", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.5.4", "fallback": "Thanks for your response.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:6b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.6.1", "fallback": "I'm stranded" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.6.2", "fallback": "in the middle of nowhere,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.6.3", "fallback": "surrounded by things that", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.6.4", "fallback": "aren't cubic.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:7b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.7.1", "fallback": "I mean Hannah..." } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.7.2", "fallback": "wait, no... is it Denise? ...Anyway,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.7.3", "fallback": "I love you.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:8b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.8.1", "fallback": "I seem to have" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.8.2", "fallback": "run out of clean water, if you could", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.8.3", "fallback": "return this bottle with something to", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.8.4", "fallback": "drink that would be wonderful.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:9b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.9.1", "fallback": "I have no" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.9.2", "fallback": "internet so I am sending you", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.9.3", "fallback": "a bottle.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:10b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.10.1", "fallback": "What's your" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.10.2", "fallback": "phone number; bottled messages", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.10.3", "fallback": "are hard to make!", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:11b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.11.1", "fallback": "I find myself stranded" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.11.2", "fallback": "on a barren island.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.11.3", "fallback": "An enderdragon took me here,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.11.4", "fallback": "please rescue me.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:12b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.12", "fallback": "Put the money in the bag." } ], "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:13b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.13.1", "fallback": "The compass you sent me" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.13.2", "fallback": "seems to only point in the direction of our love,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.13.3", "fallback": "but that seems to have vanished long ago.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.13.4", "fallback": "Please, get help, even if it's the last thing you do.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:14b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.14.1", "fallback": "I fear this may" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.14.2", "fallback": "be my last attempt at finding help.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.14.3", "fallback": "I just want you to know... I always... loved...", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.14.4", "fallback": "your sister.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:15b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.15.1", "fallback": "I've been here for 3 months" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.15.2", "fallback": "and after several attempts to find food,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.15.3", "fallback": "shelter, or even enough water... I'm giving up.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.15.4", "fallback": "Tell my family I love them, but most importantly,", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.15.5", "fallback": "Audrey, I love you.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:16b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.16.1", "fallback": "I know exactly who" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.16.2", "fallback": "you are - play along. I don't have any", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.16.3", "fallback": "money. I burned it all trying to make a", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.16.4", "fallback": "fire. But I can tell you I've developed", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.16.5", "fallback": "a very particular set of skills. Skills", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.16.6", "fallback": "that'll make Bear Grylls quake in his boots.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:17b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.17.1", "fallback": "I'm in the sink sand." } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.17.2", "fallback": "If you find my head, hang it on the", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.17.3", "fallback": "wall of fame.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:18b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.18.1", "fallback": "Each day that passes" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.18.2", "fallback": "is immensely terrible, painful and sad.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.18.3", "fallback": "Getting away from you just didn't", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.18.4", "fallback": "improve anything.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:19b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.19.1", "fallback": "I write this on paper" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.19.2", "fallback": "made from native plants and ink", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.19.3", "fallback": "from a squid I wrangled. I like it here.", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.19.4", "fallback": "I found a dungeon. I'm setting up a mob", "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.19.5", "fallback": "grinder and never coming home.", "color": "gray", "italic": false } ] } ] }, { "type": "minecraft:item", "name": "minecraft:glass_bottle", "weight": 1, "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/message_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_audrey:20b}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.message_in_a_bottle", "fallback": "Message in a Bottle" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "text.gm4.dearest_audrey.prefix", "fallback": "Dearest Audrey, ", "extra": [ { "translate": "text.gm4.dearest_audrey.20.1", "fallback": "punching wood" } ], "color": "gray", "italic": false }, { "translate": "text.gm4.dearest_audrey.20.2", "fallback": "for logs doesn't work in real life.", "color": "gray", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/gravel.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 40, "name": "minecraft:kelp" }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:seagrass" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:gold_nugget", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:iron_nugget", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:nautilus_shell" }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:bone" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:prismarine_crystals" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:prismarine_shard" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:golden_boots", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0.2, "max": 0.8 } }, { "function": "minecraft:set_enchantments", "enchantments": { "minecraft:depth_strider": 1 } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.waders", "fallback": "Waders" } }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/waders"]} } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:leather_boots", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.1 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:wet_sponge" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:experience_bottle" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:fishing_rod", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bow", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:iron_shovel", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:golden_shovel", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:spyglass" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_ingot" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:gold_ingot" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:copper_ingot" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/shipwreck_supply"]}, "minecraft:container_loot": { "loot_table": "minecraft:chests/shipwreck_supply" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.shipwreck_supply_chest", "fallback": "Shipwreck Supply Chest" } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/shipwreck_treasure"]}, "minecraft:container_loot": { "loot_table": "minecraft:chests/shipwreck_treasure" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.shipwreck_treasure_chest", "fallback": "Shipwreck Treasure Chest" } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/treasure_chest"]}, "minecraft:container_loot": { "loot_table": "gm4_sunken_treasure:chests/treasure_chest" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.treasure_chest", "fallback": "Treasure Chest" } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:prismarine_shard", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:guardian'}}}" } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:glow_ink_sac", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:glow_squid'}}}" } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "max": 30 } } } } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:ink_sac", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:squid'}}}" } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 31 } } } } ] }, { "type": "minecraft:loot_table", "weight": 40, "value": "gm4_sunken_treasure:gameplay/treasure_loot/audrey_bottle" }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:clay_ball", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:gunpowder" }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:bone_meal" }, { "type": "minecraft:item", "weight": 30, "name": "minecraft:mossy_cobblestone" }, { "type": "minecraft:loot_table", "weight": 4, "value": "gm4_scuba_gear:items/scuba_helmet", "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_scuba_gear" }, "score": "load.status" }, "range": { "min": 1 } } ] }, { "type": "minecraft:loot_table", "weight": 3, "value": "gm4_scuba_gear:items/scuba_tank", "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_scuba_gear" }, "score": "load.status" }, "range": { "min": 1 } } ] } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/loot_table/gameplay/treasure_loot/sand.json ================================================ { "type": "minecraft:fishing", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 40, "name": "minecraft:kelp" }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:seagrass" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:sea_pickle" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:gold_nugget", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:iron_nugget", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:nautilus_shell" }, { "type": "minecraft:item", "weight": 60, "name": "minecraft:bone" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:prismarine_crystals" }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:prismarine_shard" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:golden_boots", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0.2, "max": 0.8 } }, { "function": "minecraft:set_enchantments", "enchantments": { "minecraft:depth_strider": 1 } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.waders", "fallback": "Waders" } }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/waders"]} } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:leather_boots", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.1 } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:turtle_scute" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:wet_sponge" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:experience_bottle" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:fishing_rod", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bow", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:iron_shovel", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:golden_shovel", "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:spyglass" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_ingot" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:gold_ingot" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:copper_ingot" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/shipwreck_supply"]}, "minecraft:container_loot": { "loot_table": "minecraft:chests/shipwreck_supply" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.shipwreck_supply_chest", "fallback": "Shipwreck Supply Chest" } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/shipwreck_treasure"]}, "minecraft:container_loot": { "loot_table": "minecraft:chests/shipwreck_treasure" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.shipwreck_treasure_chest", "fallback": "Shipwreck Treasure Chest" } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:chest", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_sunken_treasure:item/treasure_chest"]}, "minecraft:container_loot": { "loot_table": "gm4_sunken_treasure:chests/treasure_chest" } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "block.gm4.treasure_chest", "fallback": "Treasure Chest" } } ] }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:prismarine_shard", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:guardian'}}}" } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:glow_ink_sac", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:glow_squid'}}}" } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "max": 30 } } } } ] }, { "type": "minecraft:item", "weight": 40, "name": "minecraft:ink_sac", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:squid'}}}" } ], "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 31 } } } } ] }, { "type": "minecraft:item", "weight": 20, "name": "minecraft:tropical_fish", "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_sunken_treasure:{spawn:{id:'minecraft:tropical_fish'}}}" } ], "conditions": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_lukewarm_ocean" }, { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] } ] }, { "type": "minecraft:loot_table", "weight": 40, "value": "gm4_sunken_treasure:gameplay/treasure_loot/audrey_bottle" }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:tube_coral", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:tube_coral_block", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:tube_coral_fan", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:brain_coral", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:brain_coral_block", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:brain_coral_fan", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:bubble_coral", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:bubble_coral_block", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:bubble_coral_fan", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:fire_coral", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:fire_coral_block", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:fire_coral_fan", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:horn_coral", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:horn_coral_block", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:item", "weight": 15, "name": "minecraft:horn_coral_fan", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_sunken_treasure:in_warm_ocean" } ] }, { "type": "minecraft:loot_table", "weight": 4, "value": "gm4_scuba_gear:items/scuba_helmet", "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_scuba_gear" }, "score": "load.status" }, "range": { "min": 1 } } ] }, { "type": "minecraft:loot_table", "weight": 3, "value": "gm4_scuba_gear:items/scuba_tank", "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "gm4_scuba_gear" }, "score": "load.status" }, "range": { "min": 1 } } ] } ] } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_deep_water.json ================================================ [ { "condition": "minecraft:location_check", "offsetY": 0, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 2, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 3, "predicate": { "fluid": { "fluids": "#minecraft:water" } } }, { "condition": "minecraft:location_check", "offsetY": 4, "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_lukewarm_ocean.json ================================================ { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:deep_lukewarm_ocean", "minecraft:lukewarm_ocean" ] } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_ocean.json ================================================ { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:cold_ocean", "minecraft:deep_cold_ocean", "minecraft:deep_frozen_ocean", "minecraft:deep_lukewarm_ocean", "minecraft:deep_ocean", "minecraft:frozen_ocean", "minecraft:lukewarm_ocean", "minecraft:ocean", "minecraft:warm_ocean" ] } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_river.json ================================================ { "condition": "minecraft:location_check", "predicate": { "biomes": [ "minecraft:frozen_river", "minecraft:river" ] } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/in_warm_ocean.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "minecraft:warm_ocean" } } ] } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_flint_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:flint" } } } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_gravel_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:gravel" } } } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_sand_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "items": "minecraft:sand" } } } } ================================================ FILE: gm4_sunken_treasure/data/gm4_sunken_treasure/predicate/is_spawn_entity_item.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_sunken_treasure:{spawn:{}}}" } } } } } ================================================ FILE: gm4_sunken_treasure/mod.mcdoc ================================================ dispatch minecraft:storage[gm4_sunken_treasure:temp] to struct { spawn?: SunkenTreasureSpawn, } dispatch mcdoc:custom_data[gm4_sunken_treasure] to struct { spawn?: SunkenTreasureSpawn, } struct SunkenTreasureSpawn { id: #[id="entity_type"] string, } dispatch mcdoc:custom_data[gm4_audrey] to byte ================================================ FILE: gm4_survival_refightalized/README.md ================================================ # Survival Refightalized A reworked survival experience with more varied mobs and new armor and shield mechanics. New shield mechanics ### Features: - Armor acts like a second health bar instead of reducing incoming damage. - Shields are disabled after being hit, adds the possibility to "parry" an attack. - Mobs scale with spawn location, being stronger lower down in the world. - Phantoms take damage if they try to fly into water, as they deserve. A full detailed list of all mechanics can be found at the [Wiki](https://wiki.gm4.co/Survival_Refightalized). ================================================ FILE: gm4_survival_refightalized/beet.yaml ================================================ id: gm4_survival_refightalized name: Survival Refightalized version: 1.2.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_forceload - gm4.plugins.include.lib_lore meta: gm4: versioning: required: lib_forceload: 1.6.0 lib_lore: 1.4.0 schedule_loops: - tick - main - slow_clock website: description: A reworked survival experience with more varied mobs and new armor and shield mechanics. recommended: - gm4_monsters_unbound wiki: https://wiki.gm4.co/wiki/Survival_Refightalized credits: Creator: - Djones Icon Design: - Hozz ================================================ FILE: gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_armor_damage.json ================================================ { "display": { "icon": { "id": "minecraft:leather_chestplate" }, "title": { "translate": "advancement.gm4.survival_refightalized.armor_damage.title", "fallback": "Armor Up!" }, "description": { "translate": "advancement.gm4.survival_refightalized.armor_damage.description", "fallback": "Discover that Armor works a bit differently now", "color": "gray" }, "frame": "task" }, "parent": "gm4:root", "criteria": { "full_set": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_parry.json ================================================ { "display": { "icon": { "id": "minecraft:shield" }, "title": { "translate": "advancement.gm4.survival_refightalized.parry.title", "fallback": "Not Today" }, "description": { "translate": "advancement.gm4.survival_refightalized.parry.description", "fallback": "Parry with a Shield by blocking just before an attack", "color": "gray" }, "frame": "task" }, "parent": "gm4:survival_refightalized_armor_damage", "criteria": { "full_set": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_survival_refightalized/data/gm4/advancement/survival_refightalized_parry_lethal_damage.json ================================================ { "display": { "icon": { "id": "minecraft:shield", "components": { "minecraft:enchantment_glint_override": true } }, "title": { "translate": "advancement.gm4.survival_refightalized.parry_lethal_damage.title", "fallback": "Not Today, Either" }, "description": { "translate": "advancement.gm4.survival_refightalized.parry_lethal_damage.description", "fallback": "Block lethal damage with a Shield Parry", "color": "gray" }, "frame": "challenge", "hidden": true }, "parent": "gm4:survival_refightalized_parry", "criteria": { "full_set": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/damaged.json ================================================ { "criteria": { "combat_damage": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "gm4_survival_refightalized:combat", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "armor_piercing": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "gm4_survival_refightalized:armor_piercing", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "armor_piercing_mob": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "source_entity": { "nbt": "{Tags:[\"gm4_sr_stat.armor_pierce_attack\"]}" } } } } }, "breaching": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "source_entity": { "equipment": { "mainhand": { "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:breach" } ] } } } }, "type": { "tags": [ { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "bypasses_enchantments": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:bypasses_enchantments", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "bypasses_shield": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:bypasses_shield", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "is_fire": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:is_fire", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "is_explosion": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:is_explosion", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "is_fall": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:is_fall", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "is_projectile": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "minecraft:is_projectile", "expected": true }, { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "witch": { "trigger": "minecraft:effects_changed", "conditions": { "effects": { "minecraft:poison": {} }, "source": { "type": "minecraft:witch" } } }, "cave_spider": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "source_entity": { "type": "minecraft:cave_spider" }, "type": { "tags": [ { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } }, "catch_other": { "trigger": "minecraft:entity_hurt_player", "conditions": { "damage": { "type": { "tags": [ { "id": "gm4_survival_refightalized:ignore", "expected": false } ] } } } } }, "requirements": [ [ "combat_damage", "armor_piercing", "armor_piercing_mob", "breaching", "bypasses_enchantments", "bypasses_shield", "is_fire", "is_fall", "is_explosion", "is_projectile", "witch", "cave_spider", "catch_other" ] ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/kill_mob.json ================================================ { "criteria": { "hostile": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "#gm4:hostile" } } }, "neutral_hostile": { "trigger": "minecraft:player_killed_entity", "conditions": { "entity": { "type": "#gm4:neutral_hostile" } } } }, "requirements": [ [ "hostile", "neutral_hostile" ] ], "rewards": { "function": "gm4_survival_refightalized:player/killed_mob" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/reach_tier/diamond_netherite.json ================================================ { "criteria": { "diamond_helmet": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:diamond_helmet" } ] } }, "diamond_chestplate": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:diamond_chestplate" } ] } }, "diamond_leggings": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:diamond_leggings" } ] } }, "diamond_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:diamond_boots" } ] } }, "netherite_helmet": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:netherite_helmet" } ] } }, "netherite_chestplate": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:netherite_chestplate" } ] } }, "netherite_leggings": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:netherite_leggings" } ] } }, "netherite_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:netherite_boots" } ] } } }, "requirements": [ [ "diamond_helmet", "diamond_chestplate", "diamond_leggings", "diamond_boots", "netherite_helmet", "netherite_chestplate", "netherite_leggings", "netherite_boots" ] ], "rewards": { "function": "gm4_survival_refightalized:player/reach_tier/diamond_netherite" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/reach_tier/iron_golden.json ================================================ { "criteria": { "iron_helmet": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:iron_helmet" } ] } }, "iron_chestplate": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:iron_chestplate" } ] } }, "iron_leggings": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:iron_leggings" } ] } }, "iron_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:iron_boots" } ] } }, "golden_helmet": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:golden_helmet" } ] } }, "golden_chestplate": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:golden_chestplate" } ] } }, "golden_leggings": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:golden_leggings" } ] } }, "golden_boots": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:golden_boots" } ] } } }, "requirements": [ [ "iron_helmet", "iron_chestplate", "iron_leggings", "iron_boots", "golden_helmet", "golden_chestplate", "golden_leggings", "golden_boots" ] ], "rewards": { "function": "gm4_survival_refightalized:player/reach_tier/iron_golden" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/using_custom_shield.json ================================================ { "criteria": { "custom_shield": { "trigger": "minecraft:using_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": { "gm4_survival_refightalized": { "shield": {} } } } } } } }, "rewards": { "function": "gm4_survival_refightalized:player/damage/shield/using" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/advancement/using_vanilla_shield.json ================================================ { "criteria": { "mainhand": { "trigger": "minecraft:using_item", "conditions": { "player": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "shield" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": { "gm4_survival_refightalized": {} } } } } } } } ] } ], "item": { "items": "shield" } } }, "offhand": { "trigger": "minecraft:using_item", "conditions": { "player": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "shield" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "predicates": { "minecraft:custom_data": { "gm4_survival_refightalized": {} } } } } } } } ] } ], "item": { "items": "shield" } } } }, "requirements": [ [ "mainhand", "offhand" ] ], "rewards": { "function": "gm4_survival_refightalized:player/damage/shield/update_vanilla_shield" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/enchantment/trident_damage_reduction.json ================================================ { "anvil_cost": 0, "description": "gm4.survival_refightalized.trident_damage_reduction", "effects": { "minecraft:damage": [ { "effect": { "type": "minecraft:add", "value": { "type": "minecraft:linear", "base": -1, "per_level_above_first": -1 } } } ] }, "max_cost": { "base": 0, "per_level_above_first": 0 }, "max_level": 5, "min_cost": { "base": 0, "per_level_above_first": 0 }, "slots": [ "mainhand" ], "supported_items": "trident", "weight": 1 } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/check_arrow.mcfunction ================================================ # check shot arrows # @s = arrow # at unspecified # run from tick # tag item as checked and try to process tag @s add gm4_sr_arrow_checked scoreboard players set $trident_damage_change gm4_sr_data 0 execute store result score $arrow_damage gm4_sr_data run data get entity @s damage 10 tag @s add gm4_sr_current_arrow execute on origin if entity @s[type=#gm4_survival_refightalized:can_fire_arrows] run function gm4_survival_refightalized:mob/process/arrow/run tag @s remove gm4_sr_current_arrow # if it's a trident use enchantments instead execute if entity @s[type=trident] run return run execute store result entity @s item.components."minecraft:enchantments"."gm4_survival_refightalized:trident_damage_reduction" int -1 run scoreboard players get $trident_damage_change gm4_sr_data # store result on arrow scoreboard players operation $arrow_damage gm4_sr_data += $arrow_damage_change gm4_sr_data execute store result entity @s damage double 0.1 run scoreboard players get $arrow_damage gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/debug/dont_run/dev.mcfunction ================================================ # show stats of the closest modified mob # @s = modified mob # at player with gm4_sr_dev.mob_stats tag # run from player/player_submain execute store result score $dev.difficulty gm4_sr_data run scoreboard players get @s gm4_sr_mob.difficulty execute store result score $dev.health_max gm4_sr_data run attribute @s minecraft:max_health get 1 execute store result score $dev.health_curr gm4_sr_data run data get entity @s Health execute store result score $worlddiff gm4_sr_data run difficulty execute if score $worlddiff gm4_sr_data matches 1 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 77 execute if score $worlddiff gm4_sr_data matches 2 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 100 execute if score $worlddiff gm4_sr_data matches 3 store result score $dev.damage gm4_sr_data run attribute @s minecraft:attack_damage get 150 scoreboard players operation $dev.damage_10 gm4_sr_data = $dev.damage gm4_sr_data scoreboard players operation $dev.damage_10 gm4_sr_data /= #100 gm4_sr_data scoreboard players operation $dev.damage_1 gm4_sr_data = $dev.damage gm4_sr_data scoreboard players operation $dev.damage_1 gm4_sr_data %= #100 gm4_sr_data execute store result score $dev.speed gm4_sr_data run attribute @s minecraft:movement_speed get 100 execute at @s run particle firework ~ ~1 ~ 0.2 0.5 0.2 0 3 force @p[tag=gm4_sr_dev.mob_stats] title @p[tag=gm4_sr_dev.mob_stats] actionbar [{"text":"Diff: ","color":"gray"},{"score":{"name":"$dev.difficulty","objective":"gm4_sr_data"},"color":"white"},{"text":" Health: ","color":"gray"},{"score":{"name":"$dev.health_curr","objective":"gm4_sr_data"},"color":"white"},{"text":"/","color":"white"},{"score":{"name":"$dev.health_max","objective":"gm4_sr_data"},"color":"white"},{"text":" Damage: "},{"score":{"name":"$dev.damage_10","objective":"gm4_sr_data"},"color":"white"},{"text":".","color":"white"},{"score":{"name":"$dev.damage_1","objective":"gm4_sr_data"},"color":"white"},{"text":" Speed: "},{"score":{"name":"$dev.speed","objective":"gm4_sr_data"},"color":"white"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/init.mcfunction ================================================ execute unless score survival_refightalized gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Survival Refightalized"} execute unless score survival_refightalized gm4_earliest_version < survival_refightalized gm4_modules run scoreboard players operation survival_refightalized gm4_earliest_version = survival_refightalized gm4_modules scoreboard players set survival_refightalized gm4_modules 1 # scoreboards scoreboard objectives add gm4_sr_data dummy scoreboard objectives add gm4_sr_config dummy scoreboard objectives add gm4_sr_mob.difficulty dummy scoreboard objectives add gm4_sr_mob.damage_cap dummy scoreboard objectives add gm4_sr_health.restoration dummy scoreboard objectives add gm4_sr_health.regeneration_timer dummy scoreboard objectives add gm4_sr_health.absorption_reduction_timer dummy scoreboard objectives add gm4_sr_stat.current_health dummy scoreboard objectives add gm4_sr_stat.max_health dummy scoreboard objectives add gm4_sr_stat.health_percentage dummy scoreboard objectives add gm4_sr_stat.current_absorption dummy scoreboard objectives add gm4_sr_stat.max_absorption dummy scoreboard objectives add gm4_sr_stat.armor_recharge_change dummy scoreboard objectives add gm4_sr_stat.regeneration_rate_change dummy scoreboard objectives add gm4_sr_stat.hunger food scoreboard objectives add gm4_sr_stat.damage_taken custom:damage_taken scoreboard objectives add gm4_sr_stat.damage_absorbed custom:damage_absorbed scoreboard objectives add gm4_sr_stat.damage_resisted custom:damage_resisted scoreboard objectives add gm4_sr_stat.damage_blocked custom:damage_blocked_by_shield scoreboard objectives add gm4_sr_stat.armor armor scoreboard objectives add gm4_sr_stat.deaths deathCount scoreboard objectives add gm4_sr_armor.tier dummy scoreboard objectives add gm4_sr_armor.reduction dummy scoreboard objectives add gm4_sr_armor.reduction_timer dummy scoreboard objectives add gm4_sr_armor.hit_cooldown dummy scoreboard objectives add gm4_sr_arrow.fire_delay dummy scoreboard objectives add gm4_sr_arrow.fire_delay_left dummy scoreboard objectives add gm4_sr_arrow.damage_change dummy scoreboard objectives add gm4_sr_shield.spam_detection dummy scoreboard objectives add gm4_sr_shield.use_ticks dummy scoreboard objectives add gm4_sr_shield.timer dummy # configs execute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $natural_regen gm4_sr_config 1 execute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $combat_regen_timer gm4_sr_config 1250 execute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $rapid_regen_timer gm4_sr_config 250 execute unless score $config_version gm4_sr_config matches 2.. run scoreboard players set $armor_recharge_timer gm4_sr_config 500 scoreboard players set $config_version gm4_sr_data 2 # swap natural regeneration to module's system execute unless score $natural_regen_disabled gm4_sr_data matches 1 run gamerule natural_health_regeneration false execute unless score $natural_regen_disabled gm4_sr_data matches 1 run data modify storage gm4:log queue append value {type:"text",message:{"text":"[INFO] Survival Refightalized changed gamerule natural_health_regeneration to false"}} scoreboard players set $natural_regen_disabled gm4_sr_data 1 execute store result score $naturalregeneration gm4_sr_data run gamerule natural_health_regeneration execute if score $natural_regen gm4_sr_config matches 1 if score $naturalregeneration gm4_sr_data matches 1 run data modify storage gm4:log queue append value {type:"text",message:[{"text":"[WARN]","color":"red"},{"text":" Survival Refightalized requires minecraft:natural_health_regeneration to be false, but it is true. ","color":"white"},{"text":"click here to fix","color":"red","click_event":{"action":"suggest_command","command":"/gamerule natural_health_regeneration false"}}]} # constants scoreboard players set #-128 gm4_sr_data -128 scoreboard players set #0 gm4_sr_data 0 scoreboard players set #1 gm4_sr_data 1 scoreboard players set #2 gm4_sr_data 2 scoreboard players set #5 gm4_sr_data 5 scoreboard players set #8 gm4_sr_data 8 scoreboard players set #10 gm4_sr_data 10 scoreboard players set #60 gm4_sr_data 60 scoreboard players set #80 gm4_sr_data 80 scoreboard players set #100 gm4_sr_data 100 scoreboard players set #1024 gm4_sr_data 1024 # start clocks schedule function gm4_survival_refightalized:tick 1t schedule function gm4_survival_refightalized:main 2t schedule function gm4_survival_refightalized:slow_clock 3t ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/main.mcfunction ================================================ schedule function gm4_survival_refightalized:main 16t # Inititate newly spawned mobs, as long as they are in the modify entity tag list execute as @e[type=#gm4_survival_refightalized:modify,tag=!smithed.entity,tag=!gm4_sr_processed,nbt=!{PersistenceRequired:1b}] at @s run function gm4_survival_refightalized:mob/init/check_mob schedule function gm4_survival_refightalized:mob/init/stat/check_damage_cap_schedule 1t # phantoms drown under water execute as @e[type=phantom,tag=!smithed.entity] at @s if block ~ ~ ~ #gm4:water run damage @s 2 drown # restore armor here as well as in player submain to make it happen every 8 ticks execute as @a[gamemode=!spectator,tag=gm4_sr_armor.reduction,scores={gm4_sr_armor.reduction_timer=..0}] run function gm4_survival_refightalized:player/armor/recharge # tick down skeleton arrow fire delay execute as @e[type=#gm4_survival_refightalized:can_fire_arrows,scores={gm4_sr_arrow.fire_delay_left=1..}] run function gm4_survival_refightalized:mob/process/arrow/clock_fire_delay # schedule player submain 8 ticks from now schedule function gm4_survival_refightalized:player_submain 8t ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/calc_difficulty_else.mcfunction ================================================ # calc base difficulty for this mob and any spawns that originate from it # @s = mobs that can be buffed # at @s # run from mob/init/check_mob # use world difficulty to set base difficulty 10/25/50 execute store result score $worlddiff gm4_sr_data run difficulty execute if score $worlddiff gm4_sr_data matches 3 run scoreboard players set $difficulty_base gm4_sr_data 50 execute if score $worlddiff gm4_sr_data matches 2 run scoreboard players set $difficulty_base gm4_sr_data 25 execute unless score $worlddiff gm4_sr_data matches 2..3 run scoreboard players set $difficulty_base gm4_sr_data 10 # add at random 20-80 execute store result score $random_add gm4_sr_data run random value 20..80 scoreboard players operation $difficulty_base gm4_sr_data += $random_add gm4_sr_data # the rest of this function will also run for any additional spawns function gm4_survival_refightalized:mob/init/initiate ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/calc_difficulty_overworld.mcfunction ================================================ # calc base difficulty for this mob and any spawns that originate from it # @s = mobs that can be buffed # at @s # run from mob/init/check_mob # use world difficulty to set base difficulty 5/10/20 execute store result score $worlddiff gm4_sr_data run difficulty execute if score $worlddiff gm4_sr_data matches 3 run scoreboard players set $difficulty_base gm4_sr_data 20 execute if score $worlddiff gm4_sr_data matches 2 run scoreboard players set $difficulty_base gm4_sr_data 10 execute unless score $worlddiff gm4_sr_data matches 2..3 run scoreboard players set $difficulty_base gm4_sr_data 5 # not underground + raining +10 execute if predicate gm4_survival_refightalized:technical/raining run scoreboard players add $difficulty_base gm4_sr_data 10 # not underground + thundering (will also add the raining modifier) +15 execute if predicate gm4_survival_refightalized:technical/thundering run scoreboard players add $difficulty_base gm4_sr_data 15 # not underground + nighttime +0-20 based on moon phase (0 at new moon, 20 at full moon) scoreboard players operation $moon_diff_add gm4_sr_data = $moon gm4_sr_data scoreboard players operation $moon_diff_add gm4_sr_data *= #5 gm4_sr_data execute unless predicate gm4_survival_refightalized:mob/underground if predicate gm4_survival_refightalized:technical/night_time run scoreboard players operation $difficulty_base gm4_sr_data += $moon_diff_add gm4_sr_data # get depth the mob spawned at based on motion_blocking_no_leaves, subtract 16 to shift curve execute positioned over motion_blocking_no_leaves summon marker run function gm4_survival_refightalized:mob/init/get_world_surface execute store result score $mob_depth gm4_sr_data run data get entity @s Pos[1] scoreboard players operation $mob_depth gm4_sr_data -= $world_surface gm4_sr_data scoreboard players remove $mob_depth gm4_sr_data 16 scoreboard players operation $mob_depth gm4_sr_data > #-128 gm4_sr_data scoreboard players operation $mob_depth gm4_sr_data < #0 gm4_sr_data # underground quadratic increase +0-80 based on mob depth scoreboard players operation $mob_depth gm4_sr_data *= $mob_depth gm4_sr_data scoreboard players operation $mob_depth gm4_sr_data *= #5 gm4_sr_data scoreboard players operation $mob_depth gm4_sr_data /= #1024 gm4_sr_data execute if predicate gm4_survival_refightalized:mob/underground if score $mob_depth gm4_sr_data matches 1.. run scoreboard players operation $difficulty_base gm4_sr_data += $mob_depth gm4_sr_data # the rest of this function will also run for any additional spawns function gm4_survival_refightalized:mob/init/initiate ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/check_mob.mcfunction ================================================ # initiate newly spawned mobs (mobs without any tags) # @s = mobs that can be buffed # at @s # run from main # pre-mark mob as processed if it spawned in the air (from a spawner), these do not get health changes or armor # mobs in the modify_in_air list are ignored here execute if block ~ ~-0.01 ~ #gm4:no_collision run tag @s[type=!#gm4_survival_refightalized:modify_in_air] add gm4_sr_from_spawner # if the mob is riding another mob *do* modify them scoreboard players set $mounted gm4_sr_data 0 execute if entity @s[tag=gm4_sr_from_spawner] on vehicle run scoreboard players set $mounted gm4_sr_data 1 execute if score $mounted gm4_sr_data matches 1 run tag @s remove gm4_sr_from_spawner # initiate depending on dimension execute if dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_overworld execute unless dimension minecraft:overworld run function gm4_survival_refightalized:mob/init/calc_difficulty_else ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/get_world_surface.mcfunction ================================================ # get y level of world surface (motion blocking no leaves) # @s = marker # at @s # run from mob/init/calc_difficulty_overworld execute store result score $world_surface gm4_sr_data run data get entity @s Pos[1] kill @s ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/initiate.mcfunction ================================================ # initiate newly spawned mobs (mobs without any tags) # @s = mobs that can be buffed # at @s # run from mob/init/calc_difficulty_else # run from mob/init/calc_difficulty_overworld # run from here # get the highest armor tier from closest player scoreboard players operation $armor_tier gm4_sr_data = @p gm4_sr_armor.tier # get difficulty data in score scoreboard players operation $difficulty gm4_sr_data = $difficulty_base gm4_sr_data execute store result score $difficulty_mult gm4_sr_data run random value -35..35 execute store result score $difficulty_flat gm4_sr_data run random value -15..15 # function tag so other modules can modify the difficulty function #gm4_survival_refightalized:init_difficulty # apply a random difficulty_mult to nudge difficulty around scoreboard players operation $difficulty_add gm4_sr_data = $difficulty gm4_sr_data scoreboard players operation $difficulty_add gm4_sr_data *= $difficulty_mult gm4_sr_data scoreboard players operation $difficulty_add gm4_sr_data /= #100 gm4_sr_data scoreboard players operation $difficulty gm4_sr_data += $difficulty_add gm4_sr_data # apply a random difficulty_flat to nudge difficulty around scoreboard players operation $difficulty gm4_sr_data += $difficulty_flat gm4_sr_data # make sure difficulty is between 0 - 100 scoreboard players operation $difficulty gm4_sr_data > #0 gm4_sr_data scoreboard players operation $difficulty gm4_sr_data < #100 gm4_sr_data # store difficulty on mob scoreboard players operation @s gm4_sr_mob.difficulty = $difficulty gm4_sr_data # reset scoreboard scoreboard players reset $mob_extras gm4_sr_data # initialize different mobs function gm4_survival_refightalized:mob/init/mob_type # allow expansions to alter mobs function #gm4_survival_refightalized:init_mob # remove the damage bonus from hard difficulty if needed # ( Hard normally adds a x1.5 damage multiplier, this counteracts that so mobs can be better tuned ) execute if score $worlddiff gm4_sr_data matches 3 run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.hard_difficulty_offset -0.333334 add_multiplied_total # set modifiers execute unless score $removed_mob gm4_sr_data matches 1 run function gm4_survival_refightalized:mob/init/stat/prep scoreboard players reset $removed_mob gm4_sr_data # heal to max health effect give @s[type=#minecraft:undead] instant_damage 1 20 true effect give @s[type=!#minecraft:undead] instant_health 1 20 true # mark mob as initiated tag @s add gm4_sr_processed # process any spawned mobs execute if score $mob_extras gm4_sr_data matches 1.. unless entity @s[tag=gm4_sr_extra_mob] as @e[type=#gm4_survival_refightalized:modify,tag=gm4_sr_extra_mob] at @s run function gm4_survival_refightalized:mob/init/initiate tag @s remove gm4_sr_extra_mob ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/cave_spider.mcfunction ================================================ # calculate modifiers for newly spawned cave spider # @s = cave spider # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 4 - 16 # damage: 1.5 - 3 # speed: 90 - 135% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -8 add_value attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 12 scoreboard players set $mob_damage gm4_sr_data 15 scoreboard players set $mob_speed gm4_sr_data 45 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/creeper.mcfunction ================================================ # calculate modifiers for newly spawned creeper # @s = creeper # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 12 - 28 # damage: explosion # speed: 90 - 130% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -8 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_value # max stat buffs scoreboard players set $mob_health gm4_sr_data 16 scoreboard players set $mob_damage gm4_sr_data 0 scoreboard players set $mob_speed gm4_sr_data 40 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/enderman.mcfunction ================================================ # calculate modifiers for newly spawned enderman # @s = enderman # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 40 - 55 # damage: 5 - 9 # speed: 90 - 125% # base stat nerf attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -2 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 15 scoreboard players set $mob_damage gm4_sr_data 40 scoreboard players set $mob_speed gm4_sr_data 35 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/phantom.mcfunction ================================================ # calculate modifiers for newly spawned phantom # @s = phantom # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 4 - 16 # damage: 1.5 - 4 # speed: 100% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -16 add_value attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value # max stat buffs scoreboard players set $mob_health gm4_sr_data 12 scoreboard players set $mob_damage gm4_sr_data 35 scoreboard players set $mob_speed gm4_sr_data 0 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/piglin.mcfunction ================================================ # calculate modifiers for newly spawned piglin # @s = piglin # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 16 - 32 # damage: 5 - 7 (melee), 2 - 4 (unarmed) # speed: 80 - 125% # base stat nerf attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -3 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 16 scoreboard players set $mob_damage gm4_sr_data 20 scoreboard players set $mob_speed gm4_sr_data 45 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 80 tag @s add gm4_sr_check_damage_cap # set armor execute if entity @s[tag=gm4_sr_from_spawner] run return 0 scoreboard players set $override_equipment gm4_sr_data 0 function #gm4_survival_refightalized:equip/piglin execute if score $override_equipment gm4_sr_data matches 1 run return 1 loot replace entity @s armor.feet loot gm4_survival_refightalized:mob/piglin/feet loot replace entity @s armor.legs loot gm4_survival_refightalized:mob/piglin/legs loot replace entity @s armor.chest loot gm4_survival_refightalized:mob/piglin/chest loot replace entity @s armor.head loot gm4_survival_refightalized:mob/piglin/head ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/piglin_brute.mcfunction ================================================ # calculate modifiers for newly spawned piglin brute # @s = piglin brute # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 30 - 50 # damage: 6 - 8 (melee), 3 - 5 (unarmed) # speed: 75 - 105% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -20 add_value attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -4 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.25 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 20 scoreboard players set $mob_damage gm4_sr_data 20 scoreboard players set $mob_speed gm4_sr_data 30 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 90 tag @s add gm4_sr_check_damage_cap ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/silverfish.mcfunction ================================================ # calculate modifiers for newly spawned silverfish # @s = silverfish # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 1 - 6 # damage: 1 - 2.5 # speed: 80 - 120% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -7 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_total # max stat buffs scoreboard players set $mob_health gm4_sr_data 5 scoreboard players set $mob_damage gm4_sr_data 15 scoreboard players set $mob_speed gm4_sr_data 40 # size changes (not if from spawner) execute if entity @s[tag=gm4_sr_from_spawner] run return 0 execute store result score $size_change gm4_sr_data run random value 1..100 # normal (+20% speed) execute if score $size_change gm4_sr_data matches ..50 run attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.random_scale 0.2 add_multiplied_total # medium (+0.25 scale) execute if score $size_change gm4_sr_data matches 51..75 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.25 add_value # large (+0.5 scale, +2 health) execute if score $size_change gm4_sr_data matches 76..90 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.5 add_value execute if score $size_change gm4_sr_data matches 76..90 run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.random_scale 2 add_value # giant (+0.75 scale, +4 health, +1 damage) execute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:scale modifier add gm4_survival_refightalized:stat_change.random_scale 0.75 add_value execute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.random_scale 4 add_value execute if score $size_change gm4_sr_data matches 90..100 run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.random_scale 1 add_value ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/skeleton.mcfunction ================================================ # calculate modifiers for newly spawned skeleton / stray / bogged # @s = skeleton / stray / bogged # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 9 - 22 # damage: 2 - 6.5 (cap 7) # speed: 75 - 105% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -11 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.25 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 13 scoreboard players set $mob_damage gm4_sr_data 45 scoreboard players set $mob_speed gm4_sr_data 30 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 70 tag @s add gm4_sr_check_damage_cap # arrow damage - only set if it was not preset at spawning execute unless score @s gm4_sr_arrow.damage_change matches -2147483648..2147483647 store result score @s gm4_sr_arrow.damage_change run random value -4..4 execute unless score @s gm4_sr_arrow.fire_delay matches -2147483648..2147483647 store result score @s gm4_sr_arrow.fire_delay run random value 2..4 # set weapon execute if entity @s[tag=gm4_sr_from_spawner] run return 0 loot replace entity @s[tag=!gm4_sr_melee_skeleton] weapon.mainhand loot gm4_survival_refightalized:mob/skeleton/weapon # set armor scoreboard players set $override_equipment gm4_sr_data 0 function #gm4_survival_refightalized:equip/skeleton execute if score $override_equipment gm4_sr_data matches 1 run return 1 loot replace entity @s armor.feet loot gm4_survival_refightalized:mob/generic/feet loot replace entity @s armor.legs loot gm4_survival_refightalized:mob/generic/legs loot replace entity @s armor.chest loot gm4_survival_refightalized:mob/generic/chest loot replace entity @s armor.head loot gm4_survival_refightalized:mob/generic/head ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/spider.mcfunction ================================================ # calculate modifiers for newly spawned spider # @s = spider # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 12 - 30 # damage: 2 - 5.5 # speed: 95 - 145% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -4 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.05 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 18 scoreboard players set $mob_damage gm4_sr_data 35 scoreboard players set $mob_speed gm4_sr_data 50 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/wither_skeleton.mcfunction ================================================ # calculate modifiers for newly spawned wither skeleton # @s = wither skeleton # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 22 - 36 # damage: 7.5 - 8.5 (armed), 1.5 - 2.5 (unarmed) # speed: 95 - 120% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_buff 2 add_value attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -0.5 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.05 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 14 scoreboard players set $mob_damage gm4_sr_data 10 scoreboard players set $mob_speed gm4_sr_data 25 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 95 tag @s add gm4_sr_check_damage_cap # knockback resistance attribute @s minecraft:knockback_resistance modifier add gm4_survival_refightalized:stat_change.kb_resist 0.666 add_value # shoot arrows slower and weaker scoreboard players set @s gm4_sr_arrow.fire_delay 4 execute store result score @s gm4_sr_arrow.damage_change run random value -6..0 # set weapon execute if entity @s[tag=gm4_sr_from_spawner] run return 0 loot replace entity @s weapon.mainhand loot gm4_survival_refightalized:mob/wither_skeleton/weapon # withering arrow if a bow is held execute if items entity @s weapon.mainhand bow run loot replace entity @s weapon.offhand loot gm4_survival_refightalized:mob/wither_skeleton/arrow # set armor scoreboard players set $override_equipment gm4_sr_data 0 function #gm4_survival_refightalized:equip/wither_skeleton execute if score $override_equipment gm4_sr_data matches 1 run return 1 loot replace entity @s armor.feet loot gm4_survival_refightalized:mob/wither_skeleton/feet loot replace entity @s armor.legs loot gm4_survival_refightalized:mob/wither_skeleton/legs loot replace entity @s armor.chest loot gm4_survival_refightalized:mob/wither_skeleton/chest loot replace entity @s armor.head loot gm4_survival_refightalized:mob/wither_skeleton/head ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/zombie.mcfunction ================================================ # calculate modifiers for newly spawned zombie / zombie villager / husk / drowned # @s = zombie / zombie villager / husk / drowned # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 18 - 36 # damage: 3 - 6.5 (cap 8) | trident: 4.5 - 9.0 # speed: 80 - 125% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -2 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.2 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 18 scoreboard players set $mob_damage gm4_sr_data 35 scoreboard players set $mob_speed gm4_sr_data 45 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 80 tag @s add gm4_sr_check_damage_cap # add fire delay and damage variance to drowned for tridents execute unless score @s[type=drowned] gm4_sr_arrow.damage_change matches -2147483648..2147483647 store result score @s gm4_sr_arrow.damage_change run random value -5..-2 execute unless score @s[type=drowned] gm4_sr_arrow.fire_delay matches -2147483648..2147483647 store result score @s gm4_sr_arrow.fire_delay run random value 3..5 # remove leader bonus from zombies execute if data entity @s attributes[{id:"minecraft:max_health"}].modifiers[{id:"minecraft:leader_zombie_bonus"}] run attribute @s minecraft:max_health modifier remove minecraft:leader_zombie_bonus # remove baby zombies except chicken jockeys (will be turned into Elites with Monsters Unbound) scoreboard players set $was_baby gm4_sr_data 0 execute if predicate {condition:"all_of",terms:[{condition:"entity_properties",entity:"this",predicate:{flags:{is_baby:1b}}},{condition:"inverted",term:{condition:"entity_properties",entity:"this",predicate:{vehicle:{}}}}]} store success score $was_baby gm4_sr_data run data modify entity @s IsBaby set value 0b execute if score $was_baby gm4_sr_data matches 1 run tag @s add gm4_sr_was_baby # set armor execute if entity @s[tag=gm4_sr_from_spawner] run return 0 scoreboard players set $override_equipment gm4_sr_data 0 function #gm4_survival_refightalized:equip/zombie execute if score $override_equipment gm4_sr_data matches 1 run return 1 loot replace entity @s armor.feet loot gm4_survival_refightalized:mob/generic/feet loot replace entity @s armor.legs loot gm4_survival_refightalized:mob/generic/legs loot replace entity @s armor.chest loot gm4_survival_refightalized:mob/generic/chest loot replace entity @s armor.head loot gm4_survival_refightalized:mob/generic/head ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type/zombified_piglin.mcfunction ================================================ # calculate modifiers for newly spawned zombified piglin # @s = zombified piglin # at @s # run from mob/init/mob_type ## Stat Block (normal/hard diff) # health: 14 - 24 # damage: 5.5 - 7 (armed), 2.5 - 4 (unarmed) # speed: 90 - 140% # base stat nerf attribute @s[tag=!gm4_sr_from_spawner] minecraft:max_health modifier add gm4_survival_refightalized:stat_change.base_nerf -6 add_value attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.base_nerf -2.5 add_value attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.base_nerf -0.1 add_multiplied_base # max stat buffs scoreboard players set $mob_health gm4_sr_data 22 scoreboard players set $mob_damage gm4_sr_data 15 scoreboard players set $mob_speed gm4_sr_data 50 # max damage mob is allowed to deal in one hit (to deal with weapons) scoreboard players set @s gm4_sr_mob.damage_cap 60 tag @s add gm4_sr_check_damage_cap # remove zombie leader bonus execute if data entity @s attributes[{id:"minecraft:max_health"}].modifiers[{id:"minecraft:leader_zombie_bonus"}] run attribute @s minecraft:max_health modifier remove minecraft:leader_zombie_bonus ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/mob_type.mcfunction ================================================ # check what mob is being processed # @s = mobs that can be buffed # at @s # run from mob/init/initiate # these are reset to 0, otherwise if the spawn function fails it can cause a crash due constantly increasing scores scoreboard players set $mob_health gm4_sr_data 0 scoreboard players set $mob_damage gm4_sr_data 0 scoreboard players set $mob_speed gm4_sr_data 0 # zombie, zombie_villager, husk, drowned execute if entity @s[type=#gm4_survival_refightalized:zombie_types] run return run function gm4_survival_refightalized:mob/init/mob_type/zombie # skeleton, bogged, stray execute if entity @s[type=#gm4_survival_refightalized:skeleton_types,type=!wither_skeleton] run return run function gm4_survival_refightalized:mob/init/mob_type/skeleton execute if entity @s[type=spider] run return run function gm4_survival_refightalized:mob/init/mob_type/spider execute if entity @s[type=creeper] run return run function gm4_survival_refightalized:mob/init/mob_type/creeper execute if entity @s[type=cave_spider] run return run function gm4_survival_refightalized:mob/init/mob_type/spider execute if entity @s[type=enderman] run return run function gm4_survival_refightalized:mob/init/mob_type/enderman execute if entity @s[type=wither_skeleton] run return run function gm4_survival_refightalized:mob/init/mob_type/wither_skeleton execute if entity @s[type=phantom] run return run function gm4_survival_refightalized:mob/init/mob_type/phantom execute if entity @s[type=piglin] run return run function gm4_survival_refightalized:mob/init/mob_type/piglin execute if entity @s[type=piglin_brute] run return run function gm4_survival_refightalized:mob/init/mob_type/piglin_brute execute if entity @s[type=zombified_piglin] run return run function gm4_survival_refightalized:mob/init/mob_type/zombified_piglin execute if entity @s[type=silverfish] run return run function gm4_survival_refightalized:mob/init/mob_type/silverfish ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/check_damage_cap.mcfunction ================================================ # cap damage mobs can do # @s = mob with gm4_sr_check_damage_cap tag # at unspecified # run from mob/init/modifier/check_damage_cap_schedule tag @s remove gm4_sr_check_damage_cap # check if damage did not exceed the cap, otherwise reduce to get back to it execute if score $worlddiff gm4_sr_data matches ..2 store result score $mob_total_damage gm4_sr_data run attribute @s minecraft:attack_damage get 10 execute if score $worlddiff gm4_sr_data matches 3 store result score $mob_total_damage gm4_sr_data run attribute @s minecraft:attack_damage get 15 execute store result storage gm4_survival_refightalized:temp picked_stat.damage_capped float 0.1 run scoreboard players operation @s gm4_sr_mob.damage_cap -= $mob_total_damage gm4_sr_data execute if score @s gm4_sr_mob.damage_cap matches ..-1 run function gm4_survival_refightalized:mob/init/stat/eval_damage_cap with storage gm4_survival_refightalized:temp picked_stat data remove storage gm4_survival_refightalized:temp picked_stat ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/check_damage_cap_schedule.mcfunction ================================================ # schedule damage cap check 1t later to allow mainhand changes to apply # @s = unspecified # at unspecified # schedule from main execute as @e[tag=gm4_sr_check_damage_cap] run function gm4_survival_refightalized:mob/init/stat/check_damage_cap ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/eval.mcfunction ================================================ # evaluate stats # @s = mobs that can be buffed # at @s # run from mob/init/modifier/stat/prep $execute if score $mob_health gm4_sr_data matches 1.. run attribute @s minecraft:max_health modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(health) add_value $execute if score $mob_damage gm4_sr_data matches 1.. run attribute @s minecraft:attack_damage modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(damage) add_value $execute if score $mob_speed gm4_sr_data matches 1.. run attribute @s minecraft:movement_speed modifier add gm4_survival_refightalized:stat_change.difficulty_buff $(speed) add_multiplied_base ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/eval_damage_cap.mcfunction ================================================ # cap damage to this mobs cap # @s = mob with gm4_sr_check_damage_cap tag # at unspecified # run from mob/init/modifier/check_damage_cap $attribute @s attack_damage modifier add gm4_survival_refightalized:stat_change.damage_cap_reduction $(damage_capped) add_value tag @s add gm4_sr_mob.damage_capped ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/init/stat/prep.mcfunction ================================================ # randomize mob stats # @s = mobs that can be buffed # at @s # run from mob/init/initiate # remove bonus health if enderman spawned in end execute if entity @s[type=enderman] if dimension the_end run scoreboard players set $mob_health gm4_sr_data 0 # remove bonus damage if melee weapon is held execute if predicate gm4_survival_refightalized:mob/has_weapon run scoreboard players set $mob_damage gm4_sr_data 0 # randomise stats - set values based on: # HEALTH = 0.5*score + BINOMDIST(n=0.5*score,p=0.5) execute if score $mob_health gm4_sr_data matches 1.. store result score $mob_health gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/health # DAMAGE = 0.15*score + RANDOM(0 - 0.35*score) + BINOMDIST(n=0.5*score,p=0.5) execute if score $mob_damage gm4_sr_data matches 1.. store result score $mob_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/damage # SPEED = RANDOM(0 - 0.5*score) + BINOMDIST(n=0.5*score,p=0.5) execute if score $mob_speed gm4_sr_data matches 1.. store result score $mob_speed gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:randomize_stats/speed execute positioned ~ -4064 ~ run kill @e[type=item,distance=..1] # store modifiers modified by difficulty execute if score $difficulty gm4_sr_data matches 101.. run say problem difficuly execute store result storage gm4_survival_refightalized:temp picked_stat.health float 0.01 run scoreboard players operation $mob_health gm4_sr_data *= $difficulty gm4_sr_data execute store result storage gm4_survival_refightalized:temp picked_stat.damage float 0.001 run scoreboard players operation $mob_damage gm4_sr_data *= $difficulty gm4_sr_data execute store result storage gm4_survival_refightalized:temp picked_stat.speed float 0.0001 run scoreboard players operation $mob_speed gm4_sr_data *= $difficulty gm4_sr_data # evaluate stats and add modifiers to mob function gm4_survival_refightalized:mob/init/stat/eval with storage gm4_survival_refightalized:temp picked_stat data remove storage gm4_survival_refightalized:temp picked_stat ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/process/arrow/clock_fire_delay.mcfunction ================================================ # tick down arrow fire delay # @s = entity that shot an arrow # at unspecified # run from main scoreboard players remove @s gm4_sr_arrow.fire_delay_left 1 attribute @s[scores={gm4_sr_arrow.fire_delay_left=0}] minecraft:follow_range modifier remove gm4_survival_refightalized:arrow_fire_delay ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/mob/process/arrow/run.mcfunction ================================================ # modify shot arrows # @s = arrow origin # at unspecified # run from check_arrow # if origin is a player run function tag for expansions execute if entity @s[type=player] run return run function #gm4_survival_refightalized:player_fired_arrow # | Non-players: # add damage to arrow scoreboard players operation $arrow_damage_change gm4_sr_data = @s gm4_sr_arrow.damage_change scoreboard players operation $trident_damage_change gm4_sr_data = @s gm4_sr_arrow.damage_change # add fire delay # ( A modifier that removes all follow_range is added to stop the entity from firing more arrows) scoreboard players operation @s gm4_sr_arrow.fire_delay_left = @s gm4_sr_arrow.fire_delay attribute @s[scores={gm4_sr_arrow.fire_delay_left=1..}] minecraft:follow_range modifier add gm4_survival_refightalized:arrow_fire_delay -1 add_multiplied_total ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/absorption/eval_reduction.mcfunction ================================================ # reduce absorption hearts on player based on their score # @s = damaged player # at @s # run from player/damage/calculate_damage $attribute @s max_absorption modifier add gm4_sr_absorption_reduced -$(absorption_reduction) add_value # restore absorption cap after 4 ticks to let it remove the health properly scoreboard players set @s gm4_sr_health.absorption_reduction_timer 3 schedule function gm4_survival_refightalized:player/absorption/restore_clock 1t scoreboard players reset $damage_absorption gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/absorption/restore_clock.mcfunction ================================================ # restore absorption hearts cap # @s = unspecified # at unspecified # schedule from player/absorption/eval_reduction # schedule from here execute as @a[scores={gm4_sr_health.absorption_reduction_timer=1}] run attribute @s minecraft:max_absorption modifier remove gm4_sr_absorption_reduced scoreboard players remove @a[scores={gm4_sr_health.absorption_reduction_timer=1..}] gm4_sr_health.absorption_reduction_timer 1 execute if entity @a[scores={gm4_sr_health.absorption_reduction_timer=1..}] run schedule function gm4_survival_refightalized:player/absorption/restore_clock 1t ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/break.mcfunction ================================================ # armor is reduced to 0 # @s = damaged player # at @s # run from player/damage/calculate_damage playsound minecraft:entity.armor_stand.break player @a[distance=..8] ~ ~ ~ 1 0 1 playsound minecraft:entity.armor_stand.break player @s ~ ~ ~ 1 0.75 1 function gm4_survival_refightalized:player/resistance/remove function #gm4_survival_refightalized:armor_break # set damage taken to the amount of armor remaining so it gets removed scoreboard players operation $total_armor_damage gm4_sr_data = $player_armor gm4_sr_data scoreboard players operation $damage_armor gm4_sr_data < $player_armor gm4_sr_data # reduce damage by players max armor scoreboard players operation $armor_break_damage_reduction gm4_sr_data = @s gm4_sr_armor.reduction scoreboard players operation $armor_break_damage_reduction gm4_sr_data += $player_armor gm4_sr_data scoreboard players operation $damage_total gm4_sr_data -= $armor_break_damage_reduction gm4_sr_data scoreboard players operation $damage_total gm4_sr_data > $player_armor gm4_sr_data tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Armor Break: ","color":"gray"},{"text":"-","color":"white"},{"score":{"name":"$armor_break_damage_reduction","objective":"gm4_sr_data"},"color":"white"},{"text":" = ","color":"gray"},{"score":{"name":"$damage_total","objective":"gm4_sr_data"},"color":"white"}] # increase the armor recharge cooldown scoreboard players operation $set gm4_sr_armor.reduction_timer += $armor_recharge_timer gm4_sr_config ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/check.mcfunction ================================================ # apply durability damage on armor item # @s = damaged player # at @s # run from player/damage/run # get item data item replace block 29999998 1 7134 container.0 from entity @s armor.head item replace block 29999998 1 7134 container.1 from entity @s armor.chest item replace block 29999998 1 7134 container.2 from entity @s armor.legs item replace block 29999998 1 7134 container.3 from entity @s armor.feet data modify storage gm4_survival_refightalized:temp Items set from block 29999998 1 7134 Items execute if items block 29999998 1 7134 container.0 * run function gm4_survival_refightalized:player/armor/durability/head/run execute if items block 29999998 1 7134 container.1 * run function gm4_survival_refightalized:player/armor/durability/chest/run execute if items block 29999998 1 7134 container.2 * run function gm4_survival_refightalized:player/armor/durability/legs/run execute if items block 29999998 1 7134 container.3 * run function gm4_survival_refightalized:player/armor/durability/feet/run # stopsounds stopsound @s player item.armor.equip_chain stopsound @s player item.armor.equip_diamond stopsound @s player item.armor.equip_generic stopsound @s player item.armor.equip_gold stopsound @s player item.armor.equip_iron stopsound @s player item.armor.equip_leather stopsound @s player item.armor.equip_netherite stopsound @s player item.armor.equip_turtle # cleanup data remove block 29999998 1 7134 Items data remove storage gm4_survival_refightalized:temp Items ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/break.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/chest/run playsound minecraft:entity.item.break player @s ~ ~ ~ 1 1 item replace entity @s armor.chest with air ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/eval.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/chest/run $item modify entity @s armor.chest {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/find_durability.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/chest/run execute if items block 29999998 1 7134 container.1 leather_chestplate run return 80 execute if items block 29999998 1 7134 container.1 golden_chestplate run return 112 execute if items block 29999998 1 7134 container.1 copper_chestplate run return 176 execute if items block 29999998 1 7134 container.1 chainmail_chestplate run return 240 execute if items block 29999998 1 7134 container.1 iron_chestplate run return 240 execute if items block 29999998 1 7134 container.1 diamond_chestplate run return 528 execute if items block 29999998 1 7134 container.1 netherite_chestplate run return 592 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/chest/run.mcfunction ================================================ # apply durability damage on armor item # @s = damaged player # at @s # run from player/armor/durability/check # if unbreakable don't run execute if data storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:unbreakable" run return 0 # calculate incoming damage based on unbreaking execute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $unbreaking_level gm4_sr_data 1 scoreboard players set $damage_chance gm4_sr_data 100 scoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data scoreboard players set $damage_opportunities gm4_sr_data 1 execute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage execute positioned ~ -4064 ~ run kill @e[type=item,distance=..1] # if no damage is going to be applied cancel function execute unless score $incoming_damage gm4_sr_data matches 1.. run return 0 # find the total durability of this item execute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:max_damage" execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:custom_data".gm4_augmented_armor.durability execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/chest/find_durability execute if score $total_durability gm4_sr_data matches 0 run return 0 # add incoming damage to the current damage execute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:damage" scoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data execute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/chest/break # apply to armor execute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data function gm4_survival_refightalized:player/armor/durability/chest/eval with storage gm4_survival_refightalized:temp set # cleanup data remove storage gm4_survival_refightalized:temp set scoreboard players reset $total_durability gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/break.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/feet/run playsound minecraft:entity.item.break player @s ~ ~ ~ 1 1 item replace entity @s armor.feet with air ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/eval.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/feet/run $item modify entity @s armor.feet {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/find_durability.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/feet/run execute if items block 29999998 1 7134 container.3 leather_boots run return 65 execute if items block 29999998 1 7134 container.3 golden_boots run return 91 execute if items block 29999998 1 7134 container.3 copper_boots run return 143 execute if items block 29999998 1 7134 container.3 chainmail_boots run return 195 execute if items block 29999998 1 7134 container.3 iron_boots run return 195 execute if items block 29999998 1 7134 container.3 diamond_boots run return 429 execute if items block 29999998 1 7134 container.3 netherite_boots run return 481 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/feet/run.mcfunction ================================================ # apply durability damage on armor item # @s = damaged player # at @s # run from player/armor/durability/check # if unbreakable don't run execute if data storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:unbreakable" run return 0 # calculate incoming damage based on unbreaking execute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $unbreaking_level gm4_sr_data 1 scoreboard players set $damage_chance gm4_sr_data 100 scoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data scoreboard players set $damage_opportunities gm4_sr_data 1 execute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage execute positioned ~ -4064 ~ run kill @e[type=item,distance=..1] # if no damage is going to be applied cancel function execute unless score $incoming_damage gm4_sr_data matches 1.. run return 0 # find the total durability of this item execute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:max_damage" execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:custom_data".gm4_augmented_armor.durability execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/feet/find_durability execute if score $total_durability gm4_sr_data matches 0 run return 0 # add incoming damage to the current damage execute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:damage" scoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data execute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/feet/break # apply to armor execute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data function gm4_survival_refightalized:player/armor/durability/feet/eval with storage gm4_survival_refightalized:temp set # cleanup data remove storage gm4_survival_refightalized:temp set scoreboard players reset $total_durability gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/break.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/head/run playsound minecraft:entity.item.break player @s ~ ~ ~ 1 1 item replace entity @s armor.head with air ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/eval.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/head/run $item modify entity @s armor.head {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/find_durability.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/head/run execute if items block 29999998 1 7134 container.0 leather_helmet run return 55 execute if items block 29999998 1 7134 container.0 golden_helmet run return 77 execute if items block 29999998 1 7134 container.0 copper_helmet run return 121 execute if items block 29999998 1 7134 container.0 chainmail_helmet run return 165 execute if items block 29999998 1 7134 container.0 iron_helmet run return 165 execute if items block 29999998 1 7134 container.0 diamond_helmet run return 363 execute if items block 29999998 1 7134 container.0 netherite_helmet run return 407 execute if items block 29999998 1 7134 container.0 turtle_helmet run return 275 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/head/run.mcfunction ================================================ # apply durability damage on armor item # @s = damaged player # at @s # run from player/armor/durability/check # if unbreakable don't run execute if data storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:unbreakable" run return 0 # calculate incoming damage based on unbreaking execute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $unbreaking_level gm4_sr_data 1 scoreboard players set $damage_chance gm4_sr_data 100 scoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data scoreboard players set $damage_opportunities gm4_sr_data 1 execute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage execute positioned ~ -4064 ~ run kill @e[type=item,distance=..1] # if no damage is going to be applied cancel function execute unless score $incoming_damage gm4_sr_data matches 1.. run return 0 # find the total durability of this item execute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:max_damage" execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:custom_data".gm4_augmented_armor.durability execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/head/find_durability execute if score $total_durability gm4_sr_data matches 0 run return 0 # add incoming damage to the current damage execute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:damage" scoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data execute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/head/break # apply to armor execute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data function gm4_survival_refightalized:player/armor/durability/head/eval with storage gm4_survival_refightalized:temp set # cleanup data remove storage gm4_survival_refightalized:temp set scoreboard players reset $total_durability gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/break.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/legs/run playsound minecraft:entity.item.break player @s ~ ~ ~ 1 1 item replace entity @s armor.legs with air ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/eval.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/legs/run $item modify entity @s armor.legs {function:"minecraft:set_components",components:{"minecraft:damage":$(damage)}} ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/find_durability.mcfunction ================================================ # set damage on armor item # @s = player wearing the item # at unspecified # run from player/armor/durability/legs/run execute if items block 29999998 1 7134 container.2 leather_leggings run return 75 execute if items block 29999998 1 7134 container.2 golden_leggings run return 105 execute if items block 29999998 1 7134 container.2 copper_leggings run return 165 execute if items block 29999998 1 7134 container.2 chainmail_leggings run return 225 execute if items block 29999998 1 7134 container.2 iron_leggings run return 225 execute if items block 29999998 1 7134 container.2 diamond_leggings run return 495 execute if items block 29999998 1 7134 container.2 netherite_leggings run return 555 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/durability/legs/run.mcfunction ================================================ # apply durability damage on armor item # @s = damaged player # at @s # run from player/armor/durability/check # if unbreakable don't run execute if data storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:unbreakable" run return 0 # calculate incoming damage based on unbreaking execute store result score $unbreaking_level gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:unbreaking" scoreboard players add $unbreaking_level gm4_sr_data 1 scoreboard players set $damage_chance gm4_sr_data 100 scoreboard players operation $damage_chance gm4_sr_data /= $unbreaking_level gm4_sr_data scoreboard players set $damage_opportunities gm4_sr_data 1 execute store result score $incoming_damage gm4_sr_data run loot spawn ~ -4064 ~ loot gm4_survival_refightalized:technical/roll_damage execute positioned ~ -4064 ~ run kill @e[type=item,distance=..1] # if no damage is going to be applied cancel function execute unless score $incoming_damage gm4_sr_data matches 1.. run return 0 # find the total durability of this item execute store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:max_damage" execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:custom_data".gm4_augmented_armor.durability execute if score $total_durability gm4_sr_data matches 0 store result score $total_durability gm4_sr_data run function gm4_survival_refightalized:player/armor/durability/legs/find_durability execute if score $total_durability gm4_sr_data matches 0 run return 0 # add incoming damage to the current damage execute store result score $current_damage gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:damage" scoreboard players operation $current_damage gm4_sr_data += $incoming_damage gm4_sr_data execute if score $current_damage gm4_sr_data > $total_durability gm4_sr_data run return run function gm4_survival_refightalized:player/armor/durability/legs/break # apply to armor execute store result storage gm4_survival_refightalized:temp set.damage int 1 run scoreboard players get $current_damage gm4_sr_data function gm4_survival_refightalized:player/armor/durability/legs/eval with storage gm4_survival_refightalized:temp set # cleanup data remove storage gm4_survival_refightalized:temp set scoreboard players reset $total_durability gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/eval_reduction.mcfunction ================================================ # reduce armor on player based on their score # @s = damaged player # at @s # run from player/armor/recharge # run from player/damage/calculate_damage attribute @s minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced $attribute @s armor modifier add gm4_survival_refightalized:armor_reduced -$(armor_reduction) add_value tag @s add gm4_sr_armor.reduction ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/recharge.mcfunction ================================================ # regain armor for this player # @s = player with reduced armor # at unspecified # run from player/armor/timer scoreboard players remove @s[scores={gm4_sr_armor.reduction=1..}] gm4_sr_armor.reduction 10 scoreboard players operation @s gm4_sr_armor.reduction > #0 gm4_sr_data # if no armor reduction is left don't apply armor attribute @s[scores={gm4_sr_armor.reduction=..0}] minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced execute if entity @s[scores={gm4_sr_armor.reduction=..0}] run return run tag @s remove gm4_sr_armor.reduction execute store result storage gm4_survival_refightalized:temp set.armor_reduction float 0.1 run scoreboard players get @s gm4_sr_armor.reduction function gm4_survival_refightalized:player/armor/eval_reduction with storage gm4_survival_refightalized:temp set data remove storage gm4_survival_refightalized:temp set # reapply resistance effect give @s resistance 2 255 true ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/armor/timer.mcfunction ================================================ # process players that have their armor reduced # @s = player # at unspecified # run from player/player_submain # gm4_sr_stat.armor_recharge_change is normally 0, but can be changed by expansions scoreboard players set @s gm4_sr_stat.armor_recharge_change 0 function #gm4_survival_refightalized:armor_recharge_timer scoreboard players set $armor_recharge gm4_sr_data 100 scoreboard players operation $armor_recharge gm4_sr_data += @s gm4_sr_stat.armor_recharge_change scoreboard players operation $armor_recharge gm4_sr_data > #0 gm4_sr_data scoreboard players operation @s[scores={gm4_sr_armor.reduction_timer=1..}] gm4_sr_armor.reduction_timer -= $armor_recharge gm4_sr_data execute unless score @s gm4_sr_armor.reduction_timer matches 1.. run function gm4_survival_refightalized:player/armor/recharge ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_breach_enchantment.mcfunction ================================================ # calculate breach extra damage to armor # @s = damaged player # at @s # run from player/damage/calculate_damage # get breach level x15 execute on attacker store result score $breach_level gm4_sr_data run data get entity @s equipment.mainhand.components."minecraft:enchantments"."minecraft:breach" 15 # get extra damage (this is calculated from post-mitigation damage) scoreboard players operation $extra_armor_damage gm4_sr_data = $damage_armor gm4_sr_data scoreboard players operation $extra_armor_damage gm4_sr_data *= $breach_level gm4_sr_data scoreboard players operation $extra_armor_damage gm4_sr_data /= #100 gm4_sr_data scoreboard players operation $total_armor_damage gm4_sr_data += $extra_armor_damage gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_damage.mcfunction ================================================ # devide damage between armor, absorption and health # @s = damaged player # at @s # run from player/damage/run # make sure at least 1 damage is dealt scoreboard players operation $damage_total gm4_sr_data > #1 gm4_sr_data # | Armor scoreboard players operation $damage_armor gm4_sr_data += $damage_total gm4_sr_data # if damage pierces armor no effect execute unless entity @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] run scoreboard players set $damage_armor gm4_sr_data 0 # breach adds 15% more damage per level scoreboard players operation $total_armor_damage gm4_sr_data = $damage_armor gm4_sr_data execute if entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run function gm4_survival_refightalized:player/damage/calculate_breach_enchantment # if armor is reduced to below 1 play sound and remove resistance effect on player execute store result score $player_armor gm4_sr_data run attribute @s minecraft:armor get 10 scoreboard players operation $armor_check gm4_sr_data = $player_armor gm4_sr_data scoreboard players operation $armor_check gm4_sr_data -= $total_armor_damage gm4_sr_data execute if score $armor_check gm4_sr_data matches ..9 run function gm4_survival_refightalized:player/armor/break tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Real Damage Taken (x10): ","color":"gray"},{"score":{"name":"$damage_total","objective":"gm4_sr_data"},"color":"white"}] # apply armor reduction to player armor scoreboard players operation @s gm4_sr_armor.reduction += $total_armor_damage gm4_sr_data execute store result storage gm4_survival_refightalized:temp set.armor_reduction float 0.1 run scoreboard players get @s gm4_sr_armor.reduction # any leftover damage is applied to the players absorption and health scoreboard players operation $damage_left gm4_sr_data = $damage_total gm4_sr_data scoreboard players operation $damage_left gm4_sr_data -= $damage_armor gm4_sr_data # | Absorption # get scores scoreboard players operation $current_absorption_hearts gm4_sr_data = @s gm4_sr_stat.current_absorption scoreboard players operation $current_absorption_max gm4_sr_data = @s gm4_sr_stat.max_absorption # apply leftover damge to absorption first scoreboard players operation $damage_absorption gm4_sr_data += $damage_left gm4_sr_data scoreboard players operation $damage_absorption gm4_sr_data < $current_absorption_hearts gm4_sr_data scoreboard players operation $current_absorption_hearts gm4_sr_data -= $damage_absorption gm4_sr_data # set storage to the amount of reduction of max absorption needed to get to the new absorption total execute store result storage gm4_survival_refightalized:temp set.absorption_reduction float 0.1 run scoreboard players operation $current_absorption_max gm4_sr_data -= $current_absorption_hearts gm4_sr_data # | Health scoreboard players operation $damage_left gm4_sr_data -= $damage_absorption gm4_sr_data scoreboard players operation $damage_health gm4_sr_data += $damage_left gm4_sr_data # | Damage the player # armor execute if score $damage_armor gm4_sr_data matches 1.. unless entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Armor: ","color":"gray"},{"score":{"name":"$total_armor_damage","objective":"gm4_sr_data"},"color":"white"}] execute if score $damage_armor gm4_sr_data matches 1.. if entity @s[advancements={gm4_survival_refightalized:damaged={breaching=true}}] run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Armor: ","color":"gray"},{"score":{"name":"$total_armor_damage","objective":"gm4_sr_data"},"color":"white"},{"text":" | Breach Enchantment: ","color":"gray"},{"text":"+","color":"white"},{"score":{"name":"$extra_armor_damage","objective":"gm4_sr_data"},"color":"white"},{"text":" (","color":"dark_gray"},{"score":{"name":"$breach_level","objective":"gm4_sr_data"},"color":"dark_gray"},{"text":"%)","color":"dark_gray"}] execute if score $damage_armor gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/armor/eval_reduction with storage gm4_survival_refightalized:temp set # absorption hearts execute if score $damage_absorption gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Absorption: ","color":"gray"},{"score":{"name":"$damage_absorption","objective":"gm4_sr_data"},"color":"white"}] execute if score $damage_absorption gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/absorption/eval_reduction with storage gm4_survival_refightalized:temp set # red hearts execute if score $damage_health gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Health: ","color":"gray"},{"score":{"name":"$damage_health","objective":"gm4_sr_data"},"color":"white"}] execute if score $damage_health gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/health/reduce/activate # advancement execute if score $damage_armor gm4_sr_data matches 1.. run advancement grant @s only gm4:survival_refightalized_armor_damage ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/calculate_reduction.mcfunction ================================================ # calculate damage reduction based on different factors - if armor is worn # @s = damaged player # at @s # run from player/damage/run # add a 10 tick delay before damage can be calculated again execute if score @s gm4_sr_armor.hit_cooldown matches 1.. run return run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Recent damage invulnerability","color":"white"} scoreboard players set @s gm4_sr_armor.hit_cooldown 10 # grab active effects to check for resistance later - can be skipped if this was already done for cave spider / witch poison reduction execute unless data storage gm4_survival_refightalized:temp active_effects run data modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects # don't run if this resistance level is not due to armor (as the player will already have taken the damage) # this should generally not run, and is mostly here as a fail-safe execute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].amplifier execute unless score $resistance_level gm4_sr_data matches -1 run return run scoreboard players reset @s gm4_sr_stat.damage_resisted # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Base Damage Taken (x10): ","color":"gray"},{"score":{"name":"@s","objective":"gm4_sr_stat.damage_resisted"},"color":"white"}] # transfer damage resistance to damage to health score scoreboard players operation $damage_total gm4_sr_data = @s gm4_sr_stat.damage_resisted # first check the resistance level besides from this module # if this results in 100% damage reduction skip the rest of this function scoreboard players set $resistance_damage_reduction gm4_sr_data 0 execute if data storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].hidden_effect.duration store result score $resistance_damage_reduction gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].hidden_effect.amplifier 20 execute if score $resistance_damage_reduction gm4_sr_data matches 1.. run scoreboard players add $resistance_damage_reduction gm4_sr_data 20 execute if score $resistance_damage_reduction gm4_sr_data matches 100.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{text:"Blocked by Resistance",color:"gray"}] execute if score $resistance_damage_reduction gm4_sr_data matches 100.. run scoreboard players set $damage_total gm4_sr_data 0 execute unless score $resistance_damage_reduction gm4_sr_data matches 0..99 run return run data remove storage gm4_survival_refightalized:temp active_effects # | Reduce damage taken based on # /!\ order for these is important! # 1. armor toughness (only if player still has armor) execute store result score $armor_toughness gm4_sr_data run attribute @s minecraft:armor_toughness get execute if score $armor_toughness gm4_sr_data matches 1.. if score @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] gm4_sr_stat.armor matches 1.. run function gm4_survival_refightalized:player/damage/reduction/armor_toughness # 2. enchantments execute if entity @s[advancements={gm4_survival_refightalized:damaged={bypasses_enchantments=false}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/run # 3. resistance effect (uses highest level besides the one used for this module) scoreboard players operation $resistance_damage_reduction_percentage gm4_sr_data = $resistance_damage_reduction gm4_sr_data scoreboard players operation $resistance_damage_reduction gm4_sr_data *= $damage_total gm4_sr_data scoreboard players operation $resistance_damage_reduction gm4_sr_data /= #100 gm4_sr_data scoreboard players operation $damage_total gm4_sr_data -= $resistance_damage_reduction gm4_sr_data execute if score $resistance_damage_reduction gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Resistance: ","color":"gray"},{"text":"-","color":"white"},{"score":{"name":"$resistance_damage_reduction","objective":"gm4_sr_data"},"color":"white"},{"text":" = "},{"score":{"name":"$damage_total","objective":"gm4_sr_data"},"color":"white"},{"text":" (","color":"dark_gray"},{"score":{"name":"$resistance_damage_reduction_percentage","objective":"gm4_sr_data"},"color":"dark_gray"},{"text":"%)","color":"dark_gray"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/cave_spider_poison_reduction.mcfunction ================================================ # reduce poison duration from cave spider attacks # @s = damaged player # at @s # run from player/damage/run # dont run on easy, no poison applied execute store result score $worlddiff gm4_sr_data run difficulty execute if score $worlddiff gm4_sr_data matches 1 run return 0 # get effect data data modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects execute store result score $poison.amplifier gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:poison"}].amplifier execute store result score $poison.duration gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:poison"}].duration # dont run if there is a stronger poison running execute unless score $poison.amplifier gm4_sr_data matches 0 run return 0 execute unless score $poison.duration gm4_sr_data matches 299 unless score $poison.duration gm4_sr_data matches 139 run return 0 # reapply weaker poison, 1 damage for normal, 2 damage for hard effect clear @s poison execute if score $worlddiff gm4_sr_data matches 2 run effect give @s poison 2 0 execute if score $worlddiff gm4_sr_data matches 3 run effect give @s poison 4 0 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/armor_toughness.mcfunction ================================================ # reduce damage with armor toughness # @s = damaged player # at @s # run from player/damage/calculate_reduction # Formula: # Damage reduction percentage = (6 * armor_toughness + 2 * armor_toughness * damage) / (damage + 5 * armor_toughness) scoreboard players operation $armor_toughness.times_5 gm4_sr_data = $armor_toughness gm4_sr_data scoreboard players operation $armor_toughness.times_5 gm4_sr_data *= #5 gm4_sr_data # dividend = 6 * armor_toughness + 2 * armor_toughness * damage scoreboard players operation $armor_toughness.dividend gm4_sr_data += $armor_toughness.times_5 gm4_sr_data scoreboard players operation $armor_toughness.dividend gm4_sr_data *= $armor_toughness gm4_sr_data scoreboard players operation $armor_toughness.dividend2 gm4_sr_data = $damage_total gm4_sr_data scoreboard players operation $armor_toughness.dividend2 gm4_sr_data *= $armor_toughness gm4_sr_data scoreboard players operation $armor_toughness.dividend2 gm4_sr_data *= #2 gm4_sr_data scoreboard players operation $armor_toughness.dividend gm4_sr_data += $armor_toughness.dividend2 gm4_sr_data # divisor = damage + 5 * armor_toughness scoreboard players operation $armor_toughness.divisor gm4_sr_data = $damage_total gm4_sr_data scoreboard players operation $armor_toughness.divisor gm4_sr_data += $armor_toughness.times_5 gm4_sr_data # dividend / divisor (this rounds down!), can max reduce damage by 2x armor_toughness scoreboard players operation $armor_toughness.dividend gm4_sr_data /= $armor_toughness.divisor gm4_sr_data scoreboard players operation $armor_toughness.max_reduction gm4_sr_data = $armor_toughness gm4_sr_data scoreboard players operation $armor_toughness.max_reduction gm4_sr_data *= #2 gm4_sr_data scoreboard players operation $armor_toughness.dividend gm4_sr_data < $armor_toughness.max_reduction gm4_sr_data # get damage reduction scoreboard players operation $armor_toughness_effect gm4_sr_data = $damage_total gm4_sr_data scoreboard players operation $armor_toughness_effect gm4_sr_data *= $armor_toughness.dividend gm4_sr_data scoreboard players operation $armor_toughness_effect gm4_sr_data /= #100 gm4_sr_data # reduce damage taken scoreboard players operation $damage_total gm4_sr_data -= $armor_toughness_effect gm4_sr_data # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Armor Toughness: ","color":"gray"},{"text":"-","color":"white"},{"score":{"name":"$armor_toughness_effect","objective":"gm4_sr_data"},"color":"white"},{"text":" = ","color":"gray"},{"score":{"name":"$damage_total","objective":"gm4_sr_data"},"color":"white"},{"text":" (","color":"dark_gray"},{"score":{"name":"$armor_toughness.dividend","objective":"gm4_sr_data"},"color":"dark_gray"},{"text":"%)","color":"dark_gray"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/blast_protection.mcfunction ================================================ # reduce damage with blast protection # @s = damaged player # at @s # run from player/damage/reduction/enchantments/ruun execute store result score $enchant.blast_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:blast_protection" 4 execute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:blast_protection" 4 scoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data execute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:blast_protection" 4 scoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data execute store result score $enchant.blast_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:blast_protection" 4 scoreboard players operation $enchant.blast_protection gm4_sr_data += $enchant.blast_protection.add gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.blast_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Enchantments:","color":"gray"} scoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.blast_protection gm4_sr_data execute if score $enchant.blast_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Blast Protection: ","color":"gray"},{"score":{"name":"$enchant.blast_protection","objective":"gm4_sr_data"},"color":"white"},{"text":"%","color":"white"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/feather_falling.mcfunction ================================================ # reduce damage with feather falling # @s = damaged player # at @s # run from player/damage/reduction/enchantments/ruun execute store result score $enchant.feather_falling gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:feather_falling" 12 execute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:feather_falling" 12 scoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data execute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:feather_falling" 12 scoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data execute store result score $enchant.feather_falling.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:feather_falling" 12 scoreboard players operation $enchant.feather_falling gm4_sr_data += $enchant.feather_falling.add gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.feather_falling gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Enchantments:","color":"gray"} scoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.feather_falling gm4_sr_data execute if score $enchant.feather_falling gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Feather Falling: ","color":"gray"},{"score":{"name":"$enchant.feather_falling","objective":"gm4_sr_data"},"color":"white"},{"text":"%","color":"white"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/fire_protection.mcfunction ================================================ # reduce damage with fire protection # @s = damaged player # at @s # run from player/damage/reduction/enchantments/ruun execute store result score $enchant.fire_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:fire_protection" 4 execute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:fire_protection" 4 scoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data execute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:fire_protection" 4 scoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data execute store result score $enchant.fire_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:fire_protection" 4 scoreboard players operation $enchant.fire_protection gm4_sr_data += $enchant.fire_protection.add gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.fire_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Enchantments:","color":"gray"} scoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.fire_protection gm4_sr_data execute if score $enchant.fire_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Fire Protection: ","color":"gray"},{"score":{"name":"$enchant.fire_protection","objective":"gm4_sr_data"},"color":"white"},{"text":"%","color":"white"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/projectile_protection.mcfunction ================================================ # reduce damage with projectile protection # @s = damaged player # at @s # run from player/damage/reduction/enchantments/ruun execute store result score $enchant.projectile_protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:projectile_protection" 4 execute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:projectile_protection" 4 scoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data execute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:projectile_protection" 4 scoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data execute store result score $enchant.projectile_protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:projectile_protection" 4 scoreboard players operation $enchant.projectile_protection gm4_sr_data += $enchant.projectile_protection.add gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.projectile_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Enchantments:","color":"gray"} scoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.projectile_protection gm4_sr_data execute if score $enchant.projectile_protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Projectile Protection: ","color":"gray"},{"score":{"name":"$enchant.projectile_protection","objective":"gm4_sr_data"},"color":"white"},{"text":"%","color":"white"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/reduction/enchantments/run.mcfunction ================================================ # reduce damage with enchantments # @s = damaged player # at @s # run from player/damage/calculate_reduction # get required data item replace block 29999998 1 7134 container.0 from entity @s armor.head item replace block 29999998 1 7134 container.1 from entity @s armor.chest item replace block 29999998 1 7134 container.2 from entity @s armor.legs item replace block 29999998 1 7134 container.3 from entity @s armor.feet data modify storage gm4_survival_refightalized:temp Items set from block 29999998 1 7134 Items data remove block 29999998 1 7134 Items # /?\ enchantments have been nerfed! Protection values are: # 1% per level of Protection # 4% per level of Fire / Blast / Projectile Protection scoreboard players set $enchant.damage_reduction gm4_sr_data 0 # generic protection enchantment execute store result score $enchant.protection gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:0b}].components."minecraft:enchantments"."minecraft:protection" 2 execute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:1b}].components."minecraft:enchantments"."minecraft:protection" 2 scoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data execute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:2b}].components."minecraft:enchantments"."minecraft:protection" 2 scoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data execute store result score $enchant.protection.add gm4_sr_data run data get storage gm4_survival_refightalized:temp Items[{Slot:3b}].components."minecraft:enchantments"."minecraft:protection" 2 scoreboard players operation $enchant.protection gm4_sr_data += $enchant.protection.add gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 0 if score $enchant.protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Enchantments:","color":"gray"} scoreboard players operation $enchant.damage_reduction gm4_sr_data += $enchant.protection gm4_sr_data execute if score $enchant.protection gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" > Protection: ","color":"gray"},{"score":{"name":"$enchant.protection","objective":"gm4_sr_data"},"color":"white"},{"text":"%","color":"white"}] # check if specific protection enchants would apply scoreboard players set $enchant.fire_protection gm4_sr_data 0 scoreboard players set $enchant.blast_protection gm4_sr_data 0 scoreboard players set $enchant.projectile_protection gm4_sr_data 0 scoreboard players set $enchant.feather_falling gm4_sr_data 0 execute if entity @s[advancements={gm4_survival_refightalized:damaged={is_fire=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/fire_protection execute if entity @s[advancements={gm4_survival_refightalized:damaged={is_explosion=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/blast_protection execute if entity @s[advancements={gm4_survival_refightalized:damaged={is_projectile=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/projectile_protection execute if entity @s[advancements={gm4_survival_refightalized:damaged={is_fall=true}}] run function gm4_survival_refightalized:player/damage/reduction/enchantments/feather_falling # total enchantment damage reduction is capped at 80% scoreboard players operation $enchant.damage_reduction gm4_sr_data < #80 gm4_sr_data scoreboard players operation $enchant.damage_reduction_percentage gm4_sr_data = $enchant.damage_reduction gm4_sr_data scoreboard players operation $enchant.damage_reduction gm4_sr_data *= $damage_total gm4_sr_data scoreboard players operation $enchant.damage_reduction gm4_sr_data /= #100 gm4_sr_data scoreboard players operation $damage_total gm4_sr_data -= $enchant.damage_reduction gm4_sr_data execute if score $enchant.damage_reduction gm4_sr_data matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":" >> Total: ","color":"gray"},{"text":"-","color":"white"},{"score":{"name":"$enchant.damage_reduction","objective":"gm4_sr_data"},"color":"white"},{"text":" = ","color":"gray"},{"score":{"name":"$damage_total","objective":"gm4_sr_data"},"color":"white"},{"text":" (","color":"dark_gray"},{"score":{"name":"$enchant.damage_reduction_percentage","objective":"gm4_sr_data"},"color":"dark_gray"},{"text":"%)","color":"dark_gray"}] # cleanup data remove storage gm4_survival_refightalized:temp Items ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/run.mcfunction ================================================ # run when player gets damaged # @s = damaged player # at @s # run from tick # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"-- Damage Log --"} # prep scores function gm4_survival_refightalized:player/health/calculate_hp scoreboard players set $damage_armor gm4_sr_data 0 scoreboard players set $damage_absorption gm4_sr_data 0 scoreboard players set $damage_health gm4_sr_data 0 scoreboard players set $damage_total gm4_sr_data 0 ### TEMP - paper fix - damage resist score gets multiplied by 51.2, so we need to revert that or the player instantly dies ### this currently breaks if a player takes a multiple of 51.2 damage, but that should be rare enough scoreboard players set #512 gm4_sr_data 512 execute if score $on_paper gm4_sr_data matches 1 run tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Paper Bug - divided damage by 51.2","color":"red","italic":true} execute if score $on_paper gm4_sr_data matches 1 run scoreboard players operation @s gm4_sr_stat.damage_resisted *= #10 gm4_sr_data execute if score $on_paper gm4_sr_data matches 1 run scoreboard players operation @s gm4_sr_stat.damage_resisted /= #512 gm4_sr_data # disable shield if damage was blocked, don't run the rest of this function execute unless score @s[scores={gm4_sr_shield.timer=1..2,gm4_sr_shield.use_ticks=1..},advancements={gm4_survival_refightalized:damaged={bypasses_shield=false}}] gm4_sr_stat.damage_taken matches 1.. unless score @s gm4_sr_stat.damage_absorbed matches 1.. run return run function gm4_survival_refightalized:player/damage/shield/blocked_damage # cave spider / witch poison reduction execute if entity @s[advancements={gm4_survival_refightalized:damaged={cave_spider=true}}] run function gm4_survival_refightalized:player/damage/cave_spider_poison_reduction execute if entity @s[advancements={gm4_survival_refightalized:damaged={witch=true}}] run function gm4_survival_refightalized:player/damage/witch_poison_reduction # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log,advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] {"text":"Non-Combat Damage","color":"dark_gray","italic":true} # calculate damage if player has armor execute if score @s gm4_sr_stat.armor matches 1.. run function gm4_survival_refightalized:player/damage/calculate_reduction execute unless score @s gm4_sr_stat.armor matches 1.. run tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"No Armor - Damage (x10): ","color":"gray"},{"score":{"name":"@s","objective":"gm4_sr_stat.damage_taken"},"color":"white"}] # set combat regeneration timers, allow to be altered by function call, use rapid_regen if damage was non-combat scoreboard players operation $set gm4_sr_armor.reduction_timer = $armor_recharge_timer gm4_sr_config scoreboard players operation $set gm4_sr_health.regeneration_timer = $combat_regen_timer gm4_sr_config execute if entity @s[advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] run scoreboard players operation $set gm4_sr_health.regeneration_timer = $rapid_regen_timer gm4_sr_config # function call # called after damage is calculated but before it is applied (unless there was no armor, then it is applied by the game) function #gm4_survival_refightalized:damage_taken # divide the damage taken between armor, absorption and health execute if score $damage_total gm4_sr_data matches 1.. run function gm4_survival_refightalized:player/damage/calculate_damage # apply armor recharge timer, /5 if damage was non-combat, 0 if damage did not apply to armor execute if entity @s[advancements={gm4_survival_refightalized:damaged={combat_damage=false}}] run scoreboard players operation $set gm4_sr_armor.reduction_timer /= #5 gm4_sr_data execute if score $damage_armor gm4_sr_data matches 1.. run scoreboard players operation @s gm4_sr_armor.reduction_timer > $set gm4_sr_armor.reduction_timer # apply durability damage to armor unless it was armor piercing damage execute if entity @s[advancements={gm4_survival_refightalized:damaged={armor_piercing=false,armor_piercing_mob=false}}] run function gm4_survival_refightalized:player/armor/durability/check # apply health regeneration timer, 0 if damage did not apply to health execute if score $damage_health gm4_sr_data matches 1.. run scoreboard players operation @s gm4_sr_health.regeneration_timer > $set gm4_sr_health.regeneration_timer scoreboard players operation @s[scores={gm4_sr_stat.damage_taken=1..}] gm4_sr_health.regeneration_timer > $set gm4_sr_health.regeneration_timer # cleanup scoreboard players reset @s gm4_sr_stat.damage_taken scoreboard players reset @s gm4_sr_stat.damage_absorbed scoreboard players reset @s gm4_sr_stat.damage_resisted scoreboard players reset @s gm4_sr_stat.damage_blocked advancement revoke @s only gm4_survival_refightalized:damaged data remove storage gm4_survival_refightalized:temp active_effects data remove storage gm4_survival_refightalized:temp set ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/blocked_damage.mcfunction ================================================ # disable shield if it blocked damage # @s = damaged player # at @s # run from player/damage/run # revoke advancement as it's not needed for shield blocking advancement revoke @s only gm4_survival_refightalized:damaged # get shield data scoreboard players set $mainhand_shield gm4_sr_data 0 execute if items entity @s weapon.mainhand *[custom_data~{gm4_survival_refightalized:{shield:{}}}] store success score $mainhand_shield gm4_sr_data run item replace block 29999998 1 7134 container.0 from entity @s weapon.mainhand execute if score $mainhand_shield gm4_sr_data matches 0 run item replace block 29999998 1 7134 container.0 from entity @s weapon.offhand data modify storage gm4_survival_refightalized:temp Item set from block 29999998 1 7134 Items[0] data remove block 29999998 1 7134 Items # non-player attacker is weak for 1 second so they don't immediatly hit again execute on attacker run effect give @s[type=!player] weakness 1 9 true # parry attack (shield won't get disabled) execute store result score $parry_ticks gm4_sr_data run data get storage gm4_survival_refightalized:temp Item.components."minecraft:custom_data".gm4_survival_refightalized.shield.parry_ticks execute if score @s gm4_sr_shield.use_ticks <= $parry_ticks gm4_sr_data unless score @s gm4_sr_shield.spam_detection matches 10.. run return run function gm4_survival_refightalized:player/damage/shield/parry # disable shield tag @s add gm4_sr_target execute at @s anchored eyes positioned ^ ^ ^1 summon armor_stand run function gm4_survival_refightalized:player/damage/shield/disable tag @s remove gm4_sr_target # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Damage blocked by shield","color":"dark_gray"} # cleanup scoreboard players reset @s gm4_sr_stat.damage_resisted scoreboard players reset @s gm4_sr_stat.damage_blocked advancement revoke @s only gm4_survival_refightalized:damaged ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/disable.mcfunction ================================================ # damage the player from an axe to disable their shield # @s = armor stand # at @s # run from player/damage/shield/blocked_damage item replace entity @s weapon.mainhand with iron_axe[weapon={disable_blocking_for_seconds:2}] damage @p[tag=gm4_sr_target] 0.01 mob_attack by @s kill @s ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/parry.mcfunction ================================================ # shield parry # @s = damaged player # at @s # run from player/damage/shield/blocked_damage tag @s add gm4_sr_attack_parried # advancements advancement grant @s only gm4:survival_refightalized_parry execute store result score $lethal_damage gm4_sr_data run attribute @s minecraft:armor get 10 scoreboard players operation $lethal_damage gm4_sr_data += @s gm4_sr_stat.current_health scoreboard players operation $lethal_damage gm4_sr_data += @s gm4_sr_stat.current_absorption execute if score @s gm4_sr_stat.damage_resisted >= $lethal_damage gm4_sr_data run advancement grant @s only gm4:survival_refightalized_parry_lethal_damage # parry sounds playsound entity.arrow.hit_player player @s ~ ~ ~ 0.25 0.5 playsound item.shield.block player @a ~ ~ ~ 1 1.25 # reset spam detection scoreboard players set @s gm4_sr_shield.spam_detection 0 # stop attacker for a bit tag @s add gm4_sr_parrier execute store result storage gm4_survival_refightalized:temp parry.damage float 1 run attribute @s attack_damage get 1 execute on attacker run function gm4_survival_refightalized:player/damage/shield/parry_effect with storage gm4_survival_refightalized:temp parry data remove storage gm4_survival_refightalized:temp parry tag @s remove gm4_sr_parrier # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] {"text":"Parry","color":"dark_gray"} # cleanup scoreboard players reset @s gm4_sr_stat.damage_resisted scoreboard players reset @s gm4_sr_stat.damage_blocked advancement revoke @s only gm4_survival_refightalized:damaged ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/parry_effect.mcfunction ================================================ # shield parry effects # @s = entity that was parried # at @s # run from player/damage/shield/parry # weakness is already applied from the blocking action stopsound @s player minecraft:entity.player.hurt effect give @s[distance=..3] nausea 2 0 effect give @s[distance=..3,type=!player] slowness 1 9 true effect give @s[distance=..3] slowness 2 0 true $damage @s[distance=..3] $(damage) player_attack by @p[tag=gm4_sr_parrier] particle minecraft:sweep_attack ~ ~1 ~ 0 0 0 0 1 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/remove_using.mcfunction ================================================ # remove shield using status from player that stopped using a shield # @s = player # at unspecified # run from tick attribute @s minecraft:knockback_resistance modifier remove gm4_survival_refightalized:using_shield scoreboard players add @s gm4_sr_shield.use_ticks 999 tag @s remove gm4_sr_attack_parried ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/update_vanilla_shield.mcfunction ================================================ # update vanilla shields # @s = player using a shield # at @s # run from advancement using_vanilla_shield # in order for shields to work with the module we add custom_data gm4_survival_refightalized:{shield:{}}, optionally with parry_ticks # parry_ticks indicates the ticks after the shield is raised that the attack must be blocked for the attack to be considered a parry # the vanilla blocks_attacks is also copied into the item, with the exception that block_delay_seconds is set to 0.0 # offhand execute if entity @s[advancements={gm4_survival_refightalized:using_vanilla_shield={offhand=true}}] run item modify entity @s weapon.offhand {function:"set_components",components:{\ "custom_data":\ {"gm4_survival_refightalized":{\ "shield":{\ "parry_ticks":5\ }}},\ "minecraft:blocks_attacks": {\ "block_delay_seconds": 0.0,\ "disable_cooldown_scale": 1,\ "block_sound": "minecraft:item.shield.block",\ "bypassed_by": "#minecraft:bypasses_shield",\ "disabled_sound": "minecraft:item.shield.break",\ "item_damage": {\ "base": 1.0,\ "factor": 1.0,\ "threshold": 3.0\ }}}} # mainhand execute if entity @s[advancements={gm4_survival_refightalized:using_vanilla_shield={mainhand=true}}] run item modify entity @s weapon.mainhand {function:"set_components",components:{\ "custom_data":\ {"gm4_survival_refightalized":{\ "shield":{\ "parry_ticks":5\ }}},\ "minecraft:blocks_attacks": {\ "block_delay_seconds": 0.0,\ "disable_cooldown_scale": 1,\ "block_sound": "minecraft:item.shield.block",\ "bypassed_by": "#minecraft:bypasses_shield",\ "disabled_sound": "minecraft:item.shield.break",\ "item_damage": {\ "base": 1.0,\ "factor": 1.0,\ "threshold": 3.0\ }}}} # revoke advancement advancement revoke @s only gm4_survival_refightalized:using_vanilla_shield ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/shield/using.mcfunction ================================================ # run while using a shield # @s = player using a shield # at @s advancement revoke @s only gm4_survival_refightalized:using_custom_shield # add to spam detection so you can't just spam click your shield to parry execute unless score @s gm4_sr_shield.timer matches 1.. unless score @s gm4_sr_shield.spam_detection matches 30.. run scoreboard players add @s gm4_sr_shield.spam_detection 6 # track how many ticks shield is being held in gm4_sr_shield.use_ticks execute unless score @s gm4_sr_shield.timer matches 1.. run scoreboard players set @s gm4_sr_shield.use_ticks 0 scoreboard players add @s gm4_sr_shield.use_ticks 1 scoreboard players set @s gm4_sr_shield.timer 2 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/damage/witch_poison_reduction.mcfunction ================================================ # reduce poison duration from witch potions # @s = damaged player # at @s # run from player/damage/run # get effect data data modify storage gm4_survival_refightalized:temp active_effects set from entity @s active_effects execute store result score $poison.amplifier gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:poison"}].amplifier execute store result score $poison.duration gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:poison"}].duration # dont run if there is a stronger poison running execute unless score $poison.amplifier gm4_sr_data matches 0 run return 0 execute unless score $poison.duration gm4_sr_data matches ..900 run return 0 # reapply shorter poison by dividing duration by 3 (60 as it is in ticks), at least 2 seconds effect clear @s poison scoreboard players operation $poison.duration gm4_sr_data /= #60 gm4_sr_data execute if score $poison.duration gm4_sr_data matches 15.. run return run effect give @s poison 15 0 execute if score $poison.duration gm4_sr_data matches 14 run return run effect give @s poison 14 0 execute if score $poison.duration gm4_sr_data matches 13 run return run effect give @s poison 13 0 execute if score $poison.duration gm4_sr_data matches 12 run return run effect give @s poison 12 0 execute if score $poison.duration gm4_sr_data matches 11 run return run effect give @s poison 11 0 execute if score $poison.duration gm4_sr_data matches 10 run return run effect give @s poison 10 0 execute if score $poison.duration gm4_sr_data matches 9 run return run effect give @s poison 9 0 execute if score $poison.duration gm4_sr_data matches 8 run return run effect give @s poison 8 0 execute if score $poison.duration gm4_sr_data matches 7 run return run effect give @s poison 7 0 execute if score $poison.duration gm4_sr_data matches 6 run return run effect give @s poison 6 0 execute if score $poison.duration gm4_sr_data matches 5 run return run effect give @s poison 5 0 execute if score $poison.duration gm4_sr_data matches 4 run return run effect give @s poison 4 0 execute if score $poison.duration gm4_sr_data matches 3 run return run effect give @s poison 3 0 execute if score $poison.duration gm4_sr_data matches ..2 run effect give @s poison 2 0 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/death.mcfunction ================================================ # process players that died # @s = player # at player that died # run from player/player_submain # reset scores scoreboard players set @s gm4_sr_stat.deaths 0 scoreboard players set @s gm4_sr_armor.reduction 0 scoreboard players set @s gm4_sr_armor.reduction_timer 0 scoreboard players set @s gm4_sr_health.restoration 0 # remove armor reduction so player respawns with full armor in case of KeepInventory attribute @s minecraft:armor modifier remove gm4_survival_refightalized:armor_reduced ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/calculate_hp.mcfunction ================================================ # calculate the red health of player calling this function and store in scoreboards # @s = player to calculate health from # at unspecified # run from player/health/detect_sleep # run from player/health/regen_combat_health # run from player/health/regen_fast_health # run from player/health/heal/heal_calc # run from player/health/reduce/activate # called from expansion modules to get player health stats # get max health x10 execute store result score @s gm4_sr_stat.max_health run attribute @s minecraft:max_health get 10 # calculate current health x10 (only red hearts) # add healstore as that will be added to health this tick and should be counted execute store result score @s gm4_sr_stat.current_health run data get entity @s Health 10 scoreboard players operation @s gm4_sr_stat.current_health += @s gm4_sr_health.restoration # calculate percentage of max health # this uses the rounded values displayed to the player scoreboard players operation @s gm4_sr_stat.health_percentage = @s gm4_sr_stat.current_health scoreboard players operation @s gm4_sr_stat.health_percentage *= #100 gm4_sr_data scoreboard players operation @s gm4_sr_stat.health_percentage /= @s gm4_sr_stat.max_health # calculate absorption health same as red hearts execute store result score @s gm4_sr_stat.max_absorption run attribute @s minecraft:max_absorption get 10 execute store result score @s gm4_sr_stat.current_absorption run data get entity @s AbsorptionAmount 10 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/activate.mcfunction ================================================ # code taken from sweethearts # @s = player to heal # at unspecified # run from player_submain # calculate health function gm4_survival_refightalized:player/health/calculate_hp # calculate max health to get player to new health # we can use stat.current_health as that already has the restoration added to it scoreboard players operation $remove_health gm4_sr_data = @s gm4_sr_stat.max_health scoreboard players operation $remove_health gm4_sr_data -= @s gm4_sr_stat.current_health execute store result storage gm4_survival_refightalized:temp heal_player.remove_health float 0.1 run scoreboard players get $remove_health gm4_sr_data execute unless score $remove_health gm4_sr_data matches 0 run function gm4_survival_refightalized:player/health/heal/eval with storage gm4_survival_refightalized:temp heal_player data remove storage gm4_survival_refightalized:temp heal_player # prepare reverting tag @s add gm4_sr_healed schedule function gm4_survival_refightalized:player/health/heal/context 1t # heal player effect give @s minecraft:instant_health 1 10 true # cleanup scoreboard players reset @s gm4_sr_health.restoration ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/context.mcfunction ================================================ # code taken from sweethearts # @s = unspecified # at unspecified # scheduled from player/health/heal/activate execute as @a[tag=gm4_sr_healed] run function gm4_survival_refightalized:player/health/heal/revert ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/eval.mcfunction ================================================ # reduce max health of player to their new health # @s = player to heal # at unspecified # run from player/health/heal/activate $attribute @s minecraft:max_health modifier add gm4_survival_refightalized:remove_health.healing -$(remove_health) add_value ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/heal/revert.mcfunction ================================================ # code taken from sweethearts # @s = player to revert max health # at unspecified # run from player/health/heal/context attribute @s minecraft:max_health modifier remove gm4_survival_refightalized:remove_health.healing tag @s remove gm4_sr_healed ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/activate.mcfunction ================================================ # code taken from sweethearts # @s = player to damage # at unspecified # run from player/damage/calculate_damage # calc hp and remove the healstore to get the actual current health function gm4_survival_refightalized:player/health/calculate_hp scoreboard players operation @s gm4_sr_stat.current_health -= @s gm4_sr_health.restoration # calculate max health to get player to new health scoreboard players operation $remove_health gm4_sr_data = @s gm4_sr_stat.max_health scoreboard players operation $remove_health gm4_sr_data -= @s gm4_sr_stat.current_health scoreboard players operation $remove_health gm4_sr_data += $damage_health gm4_sr_data # if player dies from this damage execute if score $remove_health gm4_sr_data >= @s gm4_sr_stat.max_health run return run function gm4_survival_refightalized:player/health/reduce/death execute store result storage gm4_survival_refightalized damage_player.remove_health float 0.1 run scoreboard players get $remove_health gm4_sr_data execute unless score $remove_health gm4_sr_data matches 0 run function gm4_survival_refightalized:player/health/reduce/eval with storage gm4_survival_refightalized damage_player data remove storage gm4_survival_refightalized damage_player # heal player to set their health effect give @s minecraft:instant_health 1 10 true # prepare reverting tag @s add gm4_sr_damaged schedule function gm4_survival_refightalized:player/health/reduce/context 2t ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/context.mcfunction ================================================ # code taken from sweethearts # @s = unspecified # at unspecified # schedule from player/health/reduce/activate execute as @a[tag=gm4_sr_damaged] run function gm4_survival_refightalized:player/health/reduce/revert ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/death.mcfunction ================================================ # kill the player if they get reduced to 0 health # @s = player to damage # at unspecified # run from player/health/reduce/activate # check if player is holding item with death_protection component execute if items entity @s weapon.* *[death_protection] run return run function gm4_survival_refightalized:player/health/reduce/death_protection tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Custom Death Message:","color":"gray"}] # kill player with custom death message execute store result score $showDeathMessages gm4_sr_data run gamerule show_death_messages gamerule show_death_messages false kill @s execute if score $showDeathMessages gm4_sr_data matches 1 run tellraw @a ["",{"selector":"@s"},{"translate":"text.gm4.survival_refightalized.death","fallback":" ran out of health"}] execute if score $showDeathMessages gm4_sr_data matches 1 run gamerule show_death_messages true ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/death_protection.mcfunction ================================================ # preventing death with death_protection item # @s = player to damage # at unspecified # run from player/health/reduce/death # if player has resistance from module remove said resistance execute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].amplifier execute if score $resistance_level gm4_sr_data matches -1 run function gm4_survival_refightalized:player/resistance/remove # damage player to trigger death_protection item damage @s 99999999999999 generic # dev damage log tellraw @s[tag=gm4_sr_dev.damage_log] [{"text":"Triggered death_protection item","color":"gray"}] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/eval.mcfunction ================================================ # reduce max health of player to their new health # @s = player to heal # at unspecified # run from player/health/reduce/activate $attribute @s minecraft:max_health modifier add gm4_survival_refightalized:remove_health.damaging -$(remove_health) add_value ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/reduce/revert.mcfunction ================================================ # code taken from sweethearts # @s = player to revert max health # at unspecified # run from player/health/reduce/context # revert max health attribute @s minecraft:max_health modifier remove gm4_survival_refightalized:remove_health.damaging tag @s remove gm4_sr_damaged ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/regeneration/combat_health.mcfunction ================================================ # check if player can get some healing # @s = player to regenerate # at unspecified # run from player/health/regeneration/timer function gm4_survival_refightalized:player/health/calculate_hp execute unless score @s gm4_sr_stat.current_health < @s gm4_sr_stat.max_health run return 0 # base restore 10 (half a heart), call function tag for expansions scoreboard players add @s gm4_sr_health.restoration 10 scoreboard players operation @s gm4_sr_health.regeneration_timer = $rapid_regen_timer gm4_sr_config function #gm4_survival_refightalized:health_regeneration ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/health/regeneration/timer.mcfunction ================================================ # process the player's regen timer # @s = player # at unspecified # run from player_submain # gm4_sr_stat.regeneration_rate_change is normally 0, but can be changed by expansions scoreboard players set @s gm4_sr_stat.regeneration_rate_change 0 function #gm4_survival_refightalized:health_regeneration_timer scoreboard players set $regeneration_timer gm4_sr_data 100 scoreboard players operation $regeneration_timer gm4_sr_data += @s gm4_sr_stat.regeneration_rate_change scoreboard players operation $regeneration_timer gm4_sr_data > #0 gm4_sr_data scoreboard players operation @s[scores={gm4_sr_health.regeneration_timer=1..}] gm4_sr_health.regeneration_timer -= $regeneration_timer gm4_sr_data execute unless score @s gm4_sr_health.regeneration_timer matches 1.. unless score @s gm4_sr_stat.hunger matches ..6 run function gm4_survival_refightalized:player/health/regeneration/combat_health ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/killed_mob.mcfunction ================================================ advancement revoke @s only gm4_survival_refightalized:kill_mob # lower regen timer scoreboard players operation @s gm4_sr_health.regeneration_timer < $rapid_regen_timer gm4_sr_config ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/reach_tier/diamond_netherite.mcfunction ================================================ # improve the gear mobs can use # @s = player with diamond / netherite gear # at unspecified # run from advancement reach_tier/diamond_netherite scoreboard players operation @s gm4_sr_armor.tier > #2 gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/reach_tier/iron_golden.mcfunction ================================================ # improve the gear mobs can use # @s = player with iron / golden gear # at unspecified # run from advancement reach_tier/iron_golden scoreboard players operation @s gm4_sr_armor.tier > #1 gm4_sr_data ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/resistance/reapply_loop.mcfunction ================================================ # reapply resistance effects that the player had besides the one from this module # @s = damaged player # at @s # run from player/resistance/remove # run from here # reapply $execute unless score $duration gm4_sr_data matches 0..19 run effect give @s resistance $(duration_set) $(amplifier) $(show_icon) # check if this should keep looping execute unless data storage gm4_survival_refightalized:temp reapply_resistance.hidden_effect run return 0 data modify storage gm4_survival_refightalized:temp reapply_resistance set from storage gm4_survival_refightalized:temp reapply_resistance.hidden_effect execute store result score $show_particles gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.show_icon execute if score $show_particles gm4_sr_data matches 0 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value "true" execute if score $show_particles gm4_sr_data matches 1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value "false" execute store result score $duration gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.duration execute if score $duration gm4_sr_data matches 20.. store result storage gm4_survival_refightalized:temp reapply_resistance.duration_set int 0.05 run scoreboard players get $duration gm4_sr_data execute if score $duration gm4_sr_data matches -1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.duration_set set value "infinite" function gm4_survival_refightalized:player/resistance/reapply_loop with storage gm4_survival_refightalized:temp reapply_resistance ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player/resistance/remove.mcfunction ================================================ # remove resistance from armor if armor is broken # @s = damaged player # at @s # run from player/damage/armor/break # run from player/ # check if player actually has resistance that should be removed execute store result score $resistance_level gm4_sr_data run data get storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].amplifier execute unless score $resistance_level gm4_sr_data matches -1 run return 0 # clear resistance to remove the immunite from armor effect clear @s resistance # check if the player had additional resistance levels execute unless data storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].hidden_effect run return 0 # reapply the resistance levels that should stay data modify storage gm4_survival_refightalized:temp reapply_resistance set from storage gm4_survival_refightalized:temp active_effects[{id:"minecraft:resistance"}].hidden_effect execute store result score $show_particles gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.show_icon execute if score $show_particles gm4_sr_data matches 0 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value "true" execute if score $show_particles gm4_sr_data matches 1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.show_icon set value "false" execute store result score $duration gm4_sr_data run data get storage gm4_survival_refightalized:temp reapply_resistance.duration execute if score $duration gm4_sr_data matches 20.. store result storage gm4_survival_refightalized:temp reapply_resistance.duration_set int 0.05 run scoreboard players get $duration gm4_sr_data execute if score $duration gm4_sr_data matches -1 run data modify storage gm4_survival_refightalized:temp reapply_resistance.duration_set set value "infinite" function gm4_survival_refightalized:player/resistance/reapply_loop with storage gm4_survival_refightalized:temp reapply_resistance ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/player_submain.mcfunction ================================================ # process anything player related # @s = unspecified # at unspecified # scheduled from main (8t) ## /!\ # This function is NOT run as the player because the order of some of these functions is important # DEV: trigger for players with `gm4_sr_dev.mob_stats` tag execute as @a[tag=gm4_sr_dev.mob_stats] at @s as @n[type=#gm4_survival_refightalized:modify] run function gm4_survival_refightalized:debug/dont_run/dev # process players that died execute as @a[scores={gm4_sr_stat.deaths=1..}] run function gm4_survival_refightalized:player/death # armor recharge timer execute as @a[gamemode=!spectator,tag=gm4_sr_armor.reduction] run function gm4_survival_refightalized:player/armor/timer # health regen timer execute unless score $natural_regen gm4_sr_config matches -1 store result score $natural_regen gm4_sr_config run gamerule natural_health_regeneration execute if score $natural_regen gm4_sr_config matches 0 as @a[gamemode=!spectator] run function gm4_survival_refightalized:player/health/regeneration/timer # if player has armor use new damage calculation effect give @a[gamemode=!spectator,scores={gm4_sr_stat.armor=1..}] resistance 2 255 true # heal players if they have stored health execute as @a[gamemode=!spectator,scores={gm4_sr_health.restoration=1..}] run function gm4_survival_refightalized:player/health/heal/activate ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/slow_clock.mcfunction ================================================ schedule function gm4_survival_refightalized:slow_clock 30s # get moon cycle (0 = new moon, 4 = full moon) execute store result score $moon gm4_sr_data run time query day repetition scoreboard players operation $moon gm4_sr_data %= #8 gm4_sr_data scoreboard players set $8 gm4_sr_data 8 execute if score $moon gm4_sr_data matches ..3 store result score $moon gm4_sr_data run scoreboard players operation $8 gm4_sr_data -= $moon gm4_sr_data scoreboard players remove $moon gm4_sr_data 4 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/function/tick.mcfunction ================================================ schedule function gm4_survival_refightalized:tick 1t # check for player damage execute as @a[advancements={gm4_survival_refightalized:damaged=true}] at @s run function gm4_survival_refightalized:player/damage/run # check for projectiles execute as @e[type=#gm4_survival_refightalized:arrow,tag=!gm4_sr_arrow_checked,tag=!smithed.strict,tag=!smithed.entity] run function gm4_survival_refightalized:check_arrow # shield parry execute as @a[scores={gm4_sr_shield.timer=1}] run function gm4_survival_refightalized:player/damage/shield/remove_using scoreboard players remove @a[scores={gm4_sr_shield.timer=1..}] gm4_sr_shield.timer 1 scoreboard players remove @a[scores={gm4_sr_shield.spam_detection=1..}] gm4_sr_shield.spam_detection 1 scoreboard players remove @a[scores={gm4_sr_armor.hit_cooldown=1..}] gm4_sr_armor.hit_cooldown 1 ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/guidebook/survival_refightalized.json ================================================ { "id": "survival_refightalized", "name": "Survival Refightalized", "module_type": "module", "icon": { "id": "minecraft:leather_chestplate" }, "criteria": { "equip_armor": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "items": "#gm4_survival_refightalized:armor" } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "legs": { "items": "#gm4_survival_refightalized:armor" } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "chest": { "items": "#gm4_survival_refightalized:armor" } } } }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "items": "#gm4_survival_refightalized:armor" } } } } ] } ] } }, "obtain_shield": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [], "items": [ { "items": "minecraft:shield" } ] } }, "kill_hostile": { "trigger": "minecraft:player_hurt_entity", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "minecraft:adventure/kill_a_mob": true } } } } ] } } }, "sections": [ { "name": "health", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.survival_refightalized.description.health", "fallback": "Damage taken is split in combat and non-combat damage.\nCombat damage regenerates every 60 seconds, while non-combat damage regenerates rapidly when out of combat." } ] ] }, { "name": "armor", "enable": [], "requirements": [ [ "equip_armor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.survival_refightalized.description.armor", "fallback": "Armor no longer reduces damage taken, instead serving as a second health bar. Armor recharges rapidly shortly after it takes damage.\nProtection enchantments have reduced effectiveness." } ] ] }, { "name": "shield", "enable": [], "requirements": [ [ "obtain_shield" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.survival_refightalized.description.shield", "fallback": "Shields will go on cooldown after blocking any damage.\n\nBlocking damage within 0.25s of holding the Shield performs a Parry, releasing the Shield within that 0.25s will not disable it." } ] ] }, { "name": "mobs", "enable": [], "requirements": [ [ "kill_hostile" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.survival_refightalized.description.mobs", "fallback": "Mobs are stronger based on their environment, such as being outside during a thunderstorm or full moon, or being deep underground.\nSome mobs are altered, such as Skeletons firing slower, and Phantoms drowning." } ] ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/chest.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "minecraft:diamond_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/diamond" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 2 } } ] }, { "type": "minecraft:item", "name": "golden_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/golden" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "iron_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "chainmail_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:item", "name": "copper_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/copper" } ] }, { "type": "minecraft:item", "name": "leather_chestplate" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_chance" }, "score": "gm4_sr_data", "scale": 0.05 } } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/feet.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "diamond_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/diamond" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 2 } } ] }, { "type": "minecraft:item", "name": "golden_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/golden" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "iron_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "chainmail_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:item", "name": "copper_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/copper" } ] }, { "type": "minecraft:item", "name": "leather_boots" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_chance" }, "score": "gm4_sr_data", "scale": 0.05 } } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/head.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "turtle_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/turtle_helmet" } ] }, { "type": "minecraft:item", "name": "diamond_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/diamond" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 2 } } ] }, { "type": "minecraft:item", "name": "golden_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/golden" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "iron_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "chainmail_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:item", "name": "copper_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/copper" } ] }, { "type": "minecraft:item", "name": "leather_helmet" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_chance" }, "score": "gm4_sr_data", "scale": 0.05 } } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/generic/legs.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "diamond_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/diamond" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 2 } } ] }, { "type": "minecraft:item", "name": "golden_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/golden" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "iron_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" }, { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_tier" }, "score": "gm4_sr_data" }, "range": { "min": 1 } } ] }, { "type": "minecraft:item", "name": "chainmail_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:item", "name": "copper_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/copper" } ] }, { "type": "minecraft:item", "name": "leather_leggings" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$armor_chance" }, "score": "gm4_sr_data", "scale": 0.05 } } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/chest.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "golden_chestplate", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/feet.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "golden_boots", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/head.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "golden_helmet", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/piglin/legs.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "golden_leggings", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/skeleton/weapon.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:bow", "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 0, "max": 20 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.15 } ] } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/arrow.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": { "custom_color": 7561558, "custom_effects": [ { "id": "minecraft:wither", "amplifier": 0, "duration": 1600, "show_particles": true, "show_icon": true, "ambient": false } ] } } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.survival_refightalized.lore.wither_arrow", "fallback": "Arrow of Wither" } }, { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/chest.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "iron_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" } ] }, { "type": "minecraft:item", "name": "chainmail_chestplate", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:loot_table", "value": "gm4:empty" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.666 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/feet.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "iron_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" } ] }, { "type": "minecraft:item", "name": "chainmail_boots", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:loot_table", "value": "gm4:empty" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.666 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/head.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "iron_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" } ] }, { "type": "minecraft:item", "name": "chainmail_helmet", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:loot_table", "value": "gm4:empty" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.666 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/legs.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "iron_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/iron" } ] }, { "type": "minecraft:item", "name": "chainmail_leggings", "conditions": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/material_check/chainmail" } ] }, { "type": "minecraft:loot_table", "value": "gm4:empty" } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.666 } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/mob/wither_skeleton/weapon.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "name": "minecraft:bow", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.4 } ] }, { "type": "minecraft:item", "name": "stone_sword" } ] } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/damage.json ================================================ { "pools": [ { "rolls": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_damage" }, "score": "gm4_sr_data", "scale": 0.15 }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] }, { "rolls": { "min": 1, "max": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_damage" }, "score": "gm4_sr_data", "scale": 0.35 } }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] }, { "rolls": { "type": "minecraft:binomial", "n": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_damage" }, "score": "gm4_sr_data", "scale": 0.5 }, "p": 0.5 }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/health.json ================================================ { "pools": [ { "rolls": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_health" }, "score": "gm4_sr_data", "scale": 0.5 }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] }, { "rolls": { "type": "minecraft:binomial", "n": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_health" }, "score": "gm4_sr_data", "scale": 0.5 }, "p": 0.5 }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/randomize_stats/speed.json ================================================ { "pools": [ { "rolls": { "min": 1, "max": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_speed" }, "score": "gm4_sr_data", "scale": 0.5 } }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] }, { "rolls": { "type": "minecraft:binomial", "n": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$mob_speed" }, "score": "gm4_sr_data", "scale": 0.5 }, "p": 0.5 }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/loot_table/technical/roll_damage.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": { "type": "minecraft:binomial", "n": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$damage_opportunities" }, "score": "gm4_sr_data" }, "p": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$damage_chance" }, "score": "gm4_sr_data", "scale": 0.01 } }, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone" } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/has_weapon.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "#gm4_survival_refightalized:weapon" } } } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/chainmail.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.45 } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/copper.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.25 } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/diamond.json ================================================ [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$difficulty" }, "score": "gm4_sr_data" }, "range": { "min": 25 } }, { "condition": "minecraft:random_chance", "chance": 0.0075 } ] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/golden.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "biomes": "#minecraft:is_badlands" } }, { "condition": "minecraft:random_chance", "chance": 0.30 } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "biomes": "#minecraft:is_badlands" } } }, { "condition": "minecraft:random_chance", "chance": 0.15 } ] } ] } ] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/iron.json ================================================ [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/underground" }, { "condition": "minecraft:random_chance", "chance": 0.55 } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/underground" } }, { "condition": "minecraft:random_chance", "chance": 0.35 } ] } ] } ] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/material_check/turtle_helmet.json ================================================ [ { "condition": "minecraft:random_chance", "chance": 0.75 }, { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/mob/underground.json ================================================ [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#gm4:water" } } } }, { "condition": "minecraft:location_check", "offsetY": 1, "predicate": { "light": { "light": 0 } } } ] ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/holding_vanilla_shield.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": "shield" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "predicates": { "minecraft:custom_data": { "gm4_survival_refightalized": {} } } } } } } } ] }, { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": "shield" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "predicates": { "minecraft:custom_data": { "gm4_survival_refightalized": {} } } } } } } } ] } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/in_witch_hut.json ================================================ { "condition": "minecraft:location_check", "predicate": { "structures": "minecraft:swamp_hut" } } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/night_time.json ================================================ { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13188, "max": 23031 }, "period": 24000 } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/raining.json ================================================ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:weather_check", "raining": true }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/underground" } } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/predicate/technical/thundering.json ================================================ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:weather_check", "thundering": true }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_survival_refightalized:mob/underground" } } ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/armor_piercing.json ================================================ { "values": [ "minecraft:cramming", "minecraft:dragon_breath", "minecraft:drown", "minecraft:ender_pearl", "minecraft:fall", "minecraft:fly_into_wall", "minecraft:freeze", "minecraft:generic", "minecraft:generic_kill", "minecraft:in_wall", "minecraft:indirect_magic", "minecraft:magic", "minecraft:on_fire", "minecraft:out_of_world", "minecraft:outside_border", "minecraft:sonic_boom", "minecraft:stalagmite", "minecraft:starve", "minecraft:wither" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/combat.json ================================================ { "values": [ "minecraft:arrow", "minecraft:bad_respawn_point", "minecraft:dragon_breath", "minecraft:falling_anvil", "minecraft:falling_block", "minecraft:falling_stalactite", "minecraft:explosion", "minecraft:hot_floor", "minecraft:in_fire", "minecraft:fireball", "minecraft:lava", "minecraft:magic", "minecraft:fireworks", "minecraft:indirect_magic", "minecraft:lightning_bolt", "minecraft:mob_attack_no_aggro", "minecraft:out_of_world", "minecraft:mob_attack", "minecraft:mob_projectile", "minecraft:player_attack", "minecraft:player_explosion", "minecraft:sonic_boom", "minecraft:sting", "minecraft:thorns", "minecraft:thrown", "minecraft:trident", "minecraft:unattributed_fireball", "minecraft:wither", "minecraft:wither_skull" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/damage_type/ignore.json ================================================ { "values": [ "#minecraft:bypasses_invulnerability", "#minecraft:bypasses_resistance" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/arrow.json ================================================ { "values": [ "minecraft:arrow", "minecraft:spectral_arrow", "minecraft:trident" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/can_fire_arrows.json ================================================ { "values": [ "#gm4_survival_refightalized:skeleton_types", "minecraft:drowned", "minecraft:player" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/modify.json ================================================ { "values": [ "minecraft:bogged", "minecraft:cave_spider", "minecraft:creeper", "minecraft:drowned", "minecraft:enderman", "minecraft:husk", "minecraft:parched", "minecraft:phantom", "minecraft:piglin", "minecraft:piglin_brute", "minecraft:silverfish", "minecraft:skeleton", "minecraft:spider", "minecraft:stray", "minecraft:wither_skeleton", "minecraft:zombie", "minecraft:zombie_villager", "minecraft:zombified_piglin" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/modify_in_air.json ================================================ { "values": [ "minecraft:cave_spider", "minecraft:drowned", "minecraft:phantom", "minecraft:silverfish" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/skeleton_types.json ================================================ { "values": [ "minecraft:bogged", "minecraft:parched", "minecraft:skeleton", "minecraft:stray", "minecraft:wither_skeleton" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/entity_type/zombie_types.json ================================================ { "values": [ "minecraft:drowned", "minecraft:husk", "minecraft:zombie", "minecraft:zombie_villager" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/armor_break.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/armor_recharge_timer.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/damage_taken.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/piglin.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/skeleton.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/wither_skeleton.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/equip/zombie.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/health_regeneration.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/health_regeneration_timer.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/init_difficulty.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/init_mob.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/function/player_fired_arrow.json ================================================ { "values": [] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/item/armor.json ================================================ { "values": [ "chainmail_boots", "chainmail_chestplate", "chainmail_helmet", "chainmail_leggings", "copper_boots", "copper_chestplate", "copper_helmet", "copper_leggings", "diamond_boots", "diamond_chestplate", "diamond_helmet", "diamond_leggings", "golden_boots", "golden_chestplate", "golden_helmet", "golden_leggings", "iron_boots", "iron_chestplate", "iron_helmet", "iron_leggings", "leather_boots", "leather_chestplate", "leather_helmet", "leather_leggings", "netherite_boots", "netherite_chestplate", "netherite_helmet", "netherite_leggings", "player_head", "turtle_helmet" ] } ================================================ FILE: gm4_survival_refightalized/data/gm4_survival_refightalized/tags/item/weapon.json ================================================ { "values": [ "copper_axe", "copper_pickaxe", "copper_shovel", "copper_sword", "diamond_axe", "diamond_pickaxe", "diamond_shovel", "diamond_sword", "golden_axe", "golden_pickaxe", "golden_shovel", "golden_sword", "iron_axe", "iron_pickaxe", "iron_shovel", "iron_sword", "netherite_axe", "netherite_pickaxe", "netherite_shovel", "netherite_sword", "stone_axe", "stone_pickaxe", "stone_shovel", "stone_sword", "wooden_axe", "wooden_pickaxe", "wooden_shovel", "wooden_sword" ] } ================================================ FILE: gm4_survival_refightalized/data/minecraft/enchantment/blast_protection.json ================================================ { "description": { "translate": "enchantment.minecraft.blast_protection" }, "exclusive_set": "#minecraft:exclusive_set/armor", "supported_items": "#minecraft:enchantable/armor", "weight": 2, "max_level": 4, "min_cost": { "base": 5, "per_level_above_first": 8 }, "max_cost": { "base": 13, "per_level_above_first": 8 }, "anvil_cost": 4, "slots": [ "armor" ], "effects": { "minecraft:attributes": [ { "id": "minecraft:enchantment.blast_protection", "attribute": "minecraft:explosion_knockback_resistance", "amount": { "type": "minecraft:linear", "base": 0.15, "per_level_above_first": 0.15 }, "operation": "add_value" } ], "minecraft:damage_protection": [ { "effect": { "type": "minecraft:add", "value": { "type": "minecraft:linear", "base": 1, "per_level_above_first": 1 } }, "requirements": { "condition": "minecraft:damage_source_properties", "predicate": { "tags": [ { "id": "minecraft:is_explosion", "expected": true }, { "id": "minecraft:bypasses_invulnerability", "expected": false } ] } } } ] } } ================================================ FILE: gm4_survival_refightalized/data/minecraft/enchantment/fire_protection.json ================================================ { "description": { "translate": "enchantment.minecraft.fire_protection" }, "exclusive_set": "#minecraft:exclusive_set/armor", "supported_items": "#minecraft:enchantable/armor", "weight": 5, "max_level": 4, "min_cost": { "base": 10, "per_level_above_first": 8 }, "max_cost": { "base": 18, "per_level_above_first": 8 }, "anvil_cost": 2, "slots": [ "armor" ], "effects": { "minecraft:attributes": [ { "id": "minecraft:enchantment.fire_protection", "attribute": "minecraft:burning_time", "amount": { "type": "minecraft:linear", "base": -0.15, "per_level_above_first": -0.15 }, "operation": "add_multiplied_base" } ], "minecraft:damage_protection": [ { "effect": { "type": "minecraft:add", "value": { "type": "minecraft:linear", "base": 1, "per_level_above_first": 1 } }, "requirements": { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:damage_source_properties", "predicate": { "tags": [ { "id": "minecraft:is_fire", "expected": true }, { "id": "minecraft:bypasses_invulnerability", "expected": false } ] } } ] } } ] } } ================================================ FILE: gm4_survival_refightalized/data/minecraft/enchantment/projectile_protection.json ================================================ { "description": { "translate": "enchantment.minecraft.projectile_protection" }, "exclusive_set": "#minecraft:exclusive_set/armor", "supported_items": "#minecraft:enchantable/armor", "weight": 5, "max_level": 4, "min_cost": { "base": 3, "per_level_above_first": 6 }, "max_cost": { "base": 9, "per_level_above_first": 6 }, "anvil_cost": 2, "slots": [ "armor" ], "effects": { "minecraft:damage_protection": [ { "effect": { "type": "minecraft:add", "value": { "type": "minecraft:linear", "base": 1, "per_level_above_first": 1 } }, "requirements": { "condition": "minecraft:damage_source_properties", "predicate": { "tags": [ { "id": "minecraft:is_projectile", "expected": true }, { "id": "minecraft:bypasses_invulnerability", "expected": false } ] } } } ] } } ================================================ FILE: gm4_survival_refightalized/data/minecraft/enchantment/protection.json ================================================ { "description": { "translate": "enchantment.minecraft.protection" }, "exclusive_set": "#minecraft:exclusive_set/armor", "supported_items": "#minecraft:enchantable/armor", "weight": 10, "max_level": 4, "min_cost": { "base": 1, "per_level_above_first": 11 }, "max_cost": { "base": 12, "per_level_above_first": 11 }, "anvil_cost": 1, "slots": [ "armor" ], "effects": { "minecraft:damage_protection": [ { "effect": { "type": "minecraft:add", "value": { "type": "minecraft:linear", "base": 0.5, "per_level_above_first": 0.5 } }, "requirements": { "condition": "minecraft:damage_source_properties", "predicate": { "tags": [ { "id": "minecraft:bypasses_invulnerability", "expected": false } ] } } } ] } } ================================================ FILE: gm4_survival_refightalized/data/minecraft/tags/damage_type/bypasses_armor.json ================================================ { "replace": false, "values": [ "minecraft:arrow", "minecraft:bad_respawn_point", "minecraft:cactus", "minecraft:campfire", "minecraft:cramming", "minecraft:dragon_breath", "minecraft:drown", "minecraft:dry_out", "minecraft:explosion", "minecraft:fall", "minecraft:falling_anvil", "minecraft:falling_block", "minecraft:falling_stalactite", "minecraft:fireball", "minecraft:fireworks", "minecraft:fireworks", "minecraft:fly_into_wall", "minecraft:freeze", "minecraft:generic", "minecraft:generic_kill", "minecraft:hot_floor", "minecraft:in_fire", "minecraft:in_wall", "minecraft:indirect_magic", "minecraft:lava", "minecraft:lightning_bolt", "minecraft:magic", "minecraft:mob_attack", "minecraft:mob_attack_no_aggro", "minecraft:mob_projectile", "minecraft:on_fire", "minecraft:out_of_world", "minecraft:outside_border", "minecraft:player_attack", "minecraft:player_explosion", "minecraft:sonic_boom", "minecraft:spit", "minecraft:stalagmite", "minecraft:starve", "minecraft:sting", "minecraft:sweet_berry_bush", "minecraft:thorns", "minecraft:thrown", "minecraft:trident", "minecraft:unattributed_fireball", "minecraft:wind_charge", "minecraft:wither", "minecraft:wither_skull" ] } ================================================ FILE: gm4_survival_refightalized/data/minecraft/tags/damage_type/bypasses_shield.json ================================================ { "replace": true, "values": [ "minecraft:cramming", "minecraft:dragon_breath", "minecraft:drown", "minecraft:ender_pearl", "minecraft:fall", "minecraft:fly_into_wall", "minecraft:freeze", "minecraft:generic", "minecraft:generic_kill", "minecraft:in_wall", "minecraft:indirect_magic", "minecraft:magic", "minecraft:on_fire", "minecraft:out_of_world", "minecraft:outside_border", "minecraft:sonic_boom", "minecraft:stalagmite", "minecraft:starve", "minecraft:wither", "minecraft:cactus", "minecraft:campfire", "minecraft:dry_out", "minecraft:falling_anvil", "minecraft:falling_stalactite", "minecraft:hot_floor", "minecraft:in_fire", "minecraft:lava", "minecraft:lightning_bolt", "minecraft:sweet_berry_bush" ] } ================================================ FILE: gm4_survival_refightalized/mod.mcdoc ================================================ use ::java::util::slot::SlottedItem use ::java::util::effect::MobEffectInstance dispatch minecraft:storage[gm4_survival_refightalized:temp] to struct { picked_stat?: struct { damage_capped?: float, health?: float, damage?: float, speed?: float, }, set?: struct { armor_reduction?: float, damage?: int, absorption_reduction?: float, }, parry?: struct { damage?: float, }, heal_player?: struct { remove_health?: float, }, reapply_resistance?: struct { ...MobEffectInstance, show_icon: (boolean | "true" | "false"), duration_set: (int | "infinite"), }, Items?: [SlottedItem], Item?: SlottedItem, active_effects: [MobEffectInstance], } ================================================ FILE: gm4_survival_refightalized/translations.csv ================================================ key,en_us advancement.gm4.survival_refightalized.armor_damage.title,Armor Up! advancement.gm4.survival_refightalized.armor_damage.description,Discover that Armor works a bit differently now advancement.gm4.survival_refightalized.parry.title,Not Today advancement.gm4.survival_refightalized.parry.description,Parry with a Shield by blocking just before an attack advancement.gm4.survival_refightalized.parry_lethal_damage.title,"Not Today, Either" advancement.gm4.survival_refightalized.parry_lethal_damage.description,Block lethal damage with a Shield Parry item.gm4.survival_refightalized.lore.wither_arrow,Arrow of Wither text.gm4.survival_refightalized.death, ran out of health text.gm4.guidebook.module_desc.survival_refightalized,A reworked survival experience with more varied mobs and new armor and shield mechanics. text.gm4.guidebook.survival_refightalized.description.health,"Damage taken is split in combat and non-combat damage.\nCombat damage regenerates every 60 seconds, while non-combat damage regenerates rapidly when out of combat." text.gm4.guidebook.survival_refightalized.description.mobs,"Mobs are stronger based on their environment, such as being outside during a thunderstorm or full moon, or being deep underground.\nSome mobs are altered, such as Skeletons firing slower, and Phantoms drowning." text.gm4.guidebook.survival_refightalized.description.armor,"Armor no longer reduces damage taken, instead serving as a second health bar. Armor recharges rapidly shortly after it takes damage.\nProtection enchantments have reduced effectiveness." text.gm4.guidebook.survival_refightalized.description.shield,"Shields will go on cooldown after blocking any damage.\n\nBlocking damage within 0.25s of holding the Shield performs a Parry, releasing the Shield within that 0.25s will not disable it." ================================================ FILE: gm4_sweethearts/README.md ================================================ # Sweethearts Use the power of Flowers to share your health to friends who may be a bit low. ### Features - Gather any Flower (except a Wither Rose) and sneak next to another player - If they are lower on health than you, they will receive some of your hearts ================================================ FILE: gm4_sweethearts/assets/translations.csv ================================================ key,en_us advancement.gm4.sweethearts.title,Selfless advancement.gm4.sweethearts.description,Give your last heart to another text.gm4.guidebook.module_desc.sweethearts,Transfer your health to another player using flowers. text.gm4.guidebook.sweethearts.description,Sneaking while holding a small flower will transfer health to a nearby ally in need.\n\nAll small flowers work. ================================================ FILE: gm4_sweethearts/beet.yaml ================================================ id: gm4_sweethearts name: Sweethearts version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: poppy reference: gui/advancement/sweethearts template: advancement website: description: Transfer your health to another player using flowers. recommended: [] notes: [] modrinth: project_id: z33oiJCd planetminecraft: uid: 5484554 video: https://www.youtube.com/watch?v=mcopNZzY2dA wiki: https://wiki.gm4.co/wiki/Sweethearts credits: Creator: - The8BitMonkey Updated by: - BPR - Djones Icon Design: - DuckJr ================================================ FILE: gm4_sweethearts/data/gm4/advancement/sweethearts.json ================================================ { "display": { "icon": { "id": "poppy", "components": { "minecraft:custom_model_data": {"strings":["gm4_sweethearts:gui/advancement/sweethearts"]} } }, "title": { "translate": "advancement.gm4.sweethearts.title", "fallback": "Selfless" }, "description": { "translate": "advancement.gm4.sweethearts.description", "fallback": "Give your last heart to another", "color": "gray" } }, "parent": "gm4:root", "criteria": { "sweethearts": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/delayed_revert.mcfunction ================================================ # @s = none # at undefined # scheduled from transfer_recipient execute as @a[tag=gm4_sh_revert_health] run function gm4_sweethearts:revert_health ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/get_health.mcfunction ================================================ # @s = players near sneaking player holding flower (including player holding flower) # at player holding flower # run from transferring # get max health of player execute store result score @s gm4_sh_data run attribute @s minecraft:max_health get # get current player health # health is stored as float, but displayed rounded up as integer (half hearts) # these commands copy that by multiplying by 10, adding 9 and dividing by 10 again # this can cause players to give/get more than 0.5f health execute store result score @s gm4_sh_health run data get entity @s Health 10 scoreboard players add @s gm4_sh_health 9 scoreboard players operation @s gm4_sh_health /= #10 gm4_sh_health ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/init.mcfunction ================================================ scoreboard objectives add gm4_sh_health dummy scoreboard objectives add gm4_sh_data dummy scoreboard players set #10 gm4_sh_health 10 execute unless score sweethearts gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Sweethearts"} execute unless score sweethearts gm4_earliest_version < sweethearts gm4_modules run scoreboard players operation sweethearts gm4_earliest_version = sweethearts gm4_modules scoreboard players set sweethearts gm4_modules 1 schedule function gm4_sweethearts:main 1t #$moduleUpdateList ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/kill_donor.mcfunction ================================================ # @s = sneaking player donating health # at @s # run from transfer_donor advancement grant @s only gm4:sweethearts execute if score $deathmessage gm4_sh_data matches 1 run tellraw @a [{"text":"","color":"white"},{"selector":"@s"},{"text":" was shot through the heart and "},{"selector":"@p[tag=gm4_sh_recipient]"},{"text":" was to blame"}] ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/main.mcfunction ================================================ # @s = none # at undefined # scheduled from init and self execute as @a[gamemode=!creative,gamemode=!spectator,predicate=gm4_sweethearts:valid_donor] at @s run function gm4_sweethearts:transferring schedule function gm4_sweethearts:main 16t ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/revert_health.mcfunction ================================================ # @s = player that received health, tagged with gm4_sh_revert_health # at undefined # run from delayed_revert # revert max health attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_512 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_256 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_128 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_64 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_32 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_16 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_8 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_4 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_2 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_remove_1 attribute @s minecraft:max_health modifier remove gm4_sweethearts:health_add_1 tag @s remove gm4_sh_revert_health ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/transfer_donor.mcfunction ================================================ # @s = sneaking player donating health # at @s # run from transfer_recipient # turn off death messages for potential death execute store result score $deathmessage gm4_sh_data run gamerule show_death_messages gamerule show_death_messages false # damage player damage @s 1 magic by @s # handle death (@e only selects entities which are alive) execute at @s unless entity @e[type=player,tag=gm4_sh_donor,distance=0,limit=1] run function gm4_sweethearts:kill_donor # re-enable death messages execute if score $deathmessage gm4_sh_data matches 1 run gamerule show_death_messages true scoreboard players reset $deathmessage gm4_sh_data # visuals particle damage_indicator ~ ~2 ~ 0 0 0 .255 5 playsound minecraft:entity.player.hurt player @a[distance=..8] ~ ~ ~ 1 1 ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/transfer_recipient.mcfunction ================================================ # @s = player near a sneaking player holding flower # at @s # run from transferring # tag player, for selection in death message of donor tag @s add gm4_sh_recipient # run donor transfer execute as @p[tag=gm4_sh_donor,distance=..3] at @s run function gm4_sweethearts:transfer_donor # calculate amount of max_health to remove to get to current health execute store result score $remove_health gm4_sh_data run attribute @s minecraft:max_health get scoreboard players operation $remove_health gm4_sh_data -= @s gm4_sh_health # lower player's max health to their current health execute if score $remove_health gm4_sh_data matches 512.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_512 -512 add_value execute if score $remove_health gm4_sh_data matches 512.. run scoreboard players remove $remove_health gm4_sh_data 512 execute if score $remove_health gm4_sh_data matches 256.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_256 -256 add_value execute if score $remove_health gm4_sh_data matches 256.. run scoreboard players remove $remove_health gm4_sh_data 256 execute if score $remove_health gm4_sh_data matches 128.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_128 -128 add_value execute if score $remove_health gm4_sh_data matches 128.. run scoreboard players remove $remove_health gm4_sh_data 128 execute if score $remove_health gm4_sh_data matches 64.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_64 -64 add_value execute if score $remove_health gm4_sh_data matches 64.. run scoreboard players remove $remove_health gm4_sh_data 64 execute if score $remove_health gm4_sh_data matches 32.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_32 -32 add_value execute if score $remove_health gm4_sh_data matches 32.. run scoreboard players remove $remove_health gm4_sh_data 32 execute if score $remove_health gm4_sh_data matches 16.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_16 -16 add_value execute if score $remove_health gm4_sh_data matches 16.. run scoreboard players remove $remove_health gm4_sh_data 16 execute if score $remove_health gm4_sh_data matches 8.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_8 -8 add_value execute if score $remove_health gm4_sh_data matches 8.. run scoreboard players remove $remove_health gm4_sh_data 8 execute if score $remove_health gm4_sh_data matches 4.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_4 -4 add_value execute if score $remove_health gm4_sh_data matches 4.. run scoreboard players remove $remove_health gm4_sh_data 4 execute if score $remove_health gm4_sh_data matches 2.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_2 -2 add_value execute if score $remove_health gm4_sh_data matches 2.. run scoreboard players remove $remove_health gm4_sh_data 2 execute if score $remove_health gm4_sh_data matches 1.. run attribute @s minecraft:max_health modifier add gm4_sweethearts:health_remove_1 -1 add_value execute if score $remove_health gm4_sh_data matches 1.. run scoreboard players remove $remove_health gm4_sh_data 1 # heal player attribute @s minecraft:max_health modifier add gm4_sweethearts:health_add_1 1 add_value effect give @s minecraft:instant_health 1 0 true # revert max health tag @s add gm4_sh_revert_health schedule function gm4_sweethearts:delayed_revert 1t # visuals particle heart ~ ~2 ~ 0.2 0.2 0.2 1 2 tag @s remove gm4_sh_recipient ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/function/transferring.mcfunction ================================================ # @s = sneaking player holding flower # at @s # run from main tag @s add gm4_sh_donor # get max and current health of players execute as @a[gamemode=!creative,gamemode=!spectator,distance=..3] run function gm4_sweethearts:get_health # transfer health to nearest player execute as @p[gamemode=!creative,gamemode=!spectator,tag=!gm4_sh_donor,distance=..3,predicate=!gm4_sweethearts:valid_donor] if score @s gm4_sh_health < @s gm4_sh_data at @s run function gm4_sweethearts:transfer_recipient tag @s remove gm4_sh_donor ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/guidebook/sweethearts.json ================================================ { "id": "sweethearts", "name": "Sweethearts", "module_type": "module", "icon": { "id": "minecraft:poppy" }, "criteria": { "obtain_flower": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#minecraft:small_flowers" } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_flower" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.sweethearts.description", "fallback": "Sneaking while holding a small flower will transfer health to a nearby ally in need.\n\nAll small flowers work." } ] ] } ] } ================================================ FILE: gm4_sweethearts/data/gm4_sweethearts/predicate/valid_donor.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true }, "slots": { "weapon.*": { "items": "#minecraft:small_flowers" } } } } ================================================ FILE: gm4_teleportation_anchors/README.md ================================================ # Teleportation Anchors Suppress and control chorus-based teleportation within a radius of an anchor! ### Features - Allows the jamming of most types of teleportation (Enderman, Shulker, eating Chorus Fruit) - Teleportation when blocked can be redirected to an anchor if connected to the jammer's multi-block structure A full list of blocked teleportation can be read on the [Wiki](https://gm4.co/modules/teleportation-anchors). ================================================ FILE: gm4_teleportation_anchors/assets/gm4_teleportation_anchors/models/block/teleportation_jammer.json ================================================ { "textures": { "eye_top": "gm4_teleportation_anchors:block/eye_top", "eye_side1": "gm4_teleportation_anchors:block/eye_side1", "eye_side2": "gm4_teleportation_anchors:block/eye_side2", "eye_side3": "gm4_teleportation_anchors:block/eye_side3", "eye_side4": "gm4_teleportation_anchors:block/eye_side4", "top": "gm4_teleportation_anchors:block/teleportation_jammer_top", "particle": "gm4_teleportation_anchors:block/teleportation_jammer_side", "side": "gm4_teleportation_anchors:block/teleportation_jammer_side", "bottom": "minecraft:block/furnace_top" }, "elements": [ { "from": [ 0, 0, 0 ], "to": [ 16, 16, 16 ], "faces": { "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, "up": { "uv": [ 0, 0, 16, 16 ], "rotation": 180, "texture": "#top" }, "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" } } }, { "from": [ 5, 16, 5 ], "to": [ 11, 21, 11 ], "rotation": { "angle": 0, "axis": "y", "origin": [ 7, 18, 7 ] }, "faces": { "north": { "uv": [ 0, 0, 12, 10 ], "texture": "#eye_side1" }, "east": { "uv": [ 0, 0, 12, 10 ], "texture": "#eye_side4" }, "south": { "uv": [ 0, 0, 12, 10 ], "texture": "#eye_side3" }, "west": { "uv": [ 0, 0, 12, 10 ], "texture": "#eye_side2" }, "up": { "uv": [ 12, 0, 0, 12 ], "texture": "#eye_top" } } } ], "display": { "thirdperson_righthand": { "rotation": [ 75, 45, 0 ], "translation": [ 0, 2.5, 0 ], "scale": [ 0.375, 0.375, 0.375 ] }, "firstperson_righthand": { "rotation": [ 0, 45, 0 ], "scale": [ 0.4, 0.4, 0.4 ] }, "firstperson_lefthand": { "rotation": [ 0, 225, 0 ], "scale": [ 0.4, 0.4, 0.4 ] }, "ground": { "translation": [ 0, 3, 0 ], "scale": [ 0.25, 0.25, 0.25 ] }, "gui": { "rotation": [ 30, 225, 0 ], "scale": [ 0.625, 0.625, 0.625 ] }, "head": { "translation": [ 0, -18.32, 0 ], "scale": [ 2.288, 2.288, 2.288 ] }, "fixed": { "scale": [ 0.5, 0.5, 0.5 ] } } } ================================================ FILE: gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side1.png.mcmeta ================================================ { "animation": { "frametime": 2, "frames": [ 0, { "index": 1, "time": 10 }, { "index": 0, "time": 8 }, { "index": 1, "time": 8 }, 0, 12, 11, { "index": 10, "time": 32 }, 11, 12, 1, 2, 3, { "index": 4, "time": 30 }, 5, 6, { "index": 7, "time": 30 }, 8, 9, 10, 11, 12 ] } } ================================================ FILE: gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side2.png.mcmeta ================================================ { "animation": { "frametime": 2, "frames": [ { "index": 10, "time": 30 }, 9, 8, { "index": 7, "time": 32 }, 8, 9, 10, 11, 12, { "index": 0, "time": 8 }, { "index": 1, "time": 10 }, { "index": 0, "time": 10 }, 1, 2, 3, { "index": 4, "time": 30 }, 5, 6, 7, 8, 9 ] } } ================================================ FILE: gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side3.png.mcmeta ================================================ { "animation": { "frametime": 2, "frames": [ { "index": 7, "time": 30 }, 6, 5, { "index": 4, "time": 32 }, 5, 6, 7, 8, 9, { "index": 10, "time": 30 }, 11, 12, 0, { "index": 1, "time": 12 }, { "index": 0, "time": 14 }, 1, 2, 3, 4, 5, 6 ] } } ================================================ FILE: gm4_teleportation_anchors/assets/gm4_teleportation_anchors/textures/block/eye_side4.png.mcmeta ================================================ { "animation": { "frametime": 2, "frames": [ { "index": 4, "time": 30 }, 3, 2, { "index": 1, "time": 14 }, { "index": 0, "time": 16 }, 1, 2, 3, 4, 5, 6, { "index": 7, "time": 30 }, 8, 9, { "index": 10, "time": 30 }, 11, 12, 1, 2, 3 ] } } ================================================ FILE: gm4_teleportation_anchors/assets/translations.csv ================================================ key,en_us block.gm4.teleportation_jammer,Teleportation Jammer block.gm4.teleportation_anchor,Teleportation Anchor container.gm4.teleportation_jammer,Teleportation Jammer advancement.gm4.teleportation_anchors_anchor.title,"Pinpoint Location" advancement.gm4.teleportation_anchors_anchor.description,"Make a teleportation anchor to remove the randomness of chorus" advancement.gm4.teleportation_anchors_jammer.title,"Make Some Noise" advancement.gm4.teleportation_anchors_jammer.description,"Create a device to stop chorus in its tracks" text.gm4.guidebook.module_desc.teleportation_anchors,Suppress and control chorus-based teleportation! text.gm4.guidebook.teleportation_jammer.description,Teleportation Jammers and Anchors can be used to supress and control chorus-based teleportation.\n\nThey can be crafted in a crafting table. text.gm4.guidebook.teleportation_anchors.crafting_jammer,A Teleportation Jammer can be crafted in a crafting table: text.gm4.guidebook.teleportation_anchors.jamming,"A Teleportation Jammer is used to suppress chorus based teleportation.\n\nThis includes endermen, shulkers, chorus fruit, end gateways, and other random teleportation that doesn't require line-of-sight." text.gm4.guidebook.teleportation_anchors.jammer_effects,"When entities are jammed, any act of teleportation will cause them to jump back to their original location.\n\nWhen endermen are jammed, they are also prevented from picking up blocks." text.gm4.guidebook.teleportation_anchors.jammer_power,"In order for a TP Jammer to work, it needs to broadcast a signal through an end rod placed on top of it.\n\nChorus fruit must be placed inside the jammer as fuel. Five fruit is enough for two days." text.gm4.guidebook.teleportation_anchors.jammer_range,"Similar to a beacon, a pyramid of purpur blocks can be build to extend the range of a jammer.\n\nThe range can be either 4, 16, 32, or 64 blocks in radius, acheived by 0-3 layers of a pyramid." text.gm4.guidebook.teleportation_anchors.crafting_anchor,A Teleportation Jammer can be used to craft an Anchor: text.gm4.guidebook.teleportation_anchors.anchor_usage,"A Teleportation Anchor is used to control chorus based teleportation.\n\nIf a Jammer is connected to an anchor, teleporters will be teleported to the anchor instead of being jammed to their original location." text.gm4.guidebook.teleportation_anchors.pupur_wires,A Jammer can be connected to an Anchor using purpur pillars.\n\nThe pillars need to go from the bottom of a TP Jammer and eventually lead into a TP Anchor. text.gm4.guidebook.teleportation_anchors.pupur_wires_1,"If a purpur pillar points into a T-Junction, it will prioritize moving in the North, West, or Down direction.\n\nThese wires can be at most 64 blocks long." text.gm4.guidebook.teleportation_anchors.chorus_fruit_cooldown,"If a user eats chorus fruit, they can also be teleported to an anchor, but must wait some time before doing so again.\n\nIf they try to teleport during this cooldown, they will just be jammed." ================================================ FILE: gm4_teleportation_anchors/beet.yaml ================================================ id: gm4_teleportation_anchors name: Teleportation Anchors version: 1.7.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: - main - tick model_data: - item: player_head reference: item/teleportation_anchor model: block/teleportation_anchor - item: end_portal_frame reference: block/teleportation_anchor template: legacy_machine_block textures: top: block/teleportation_anchor_top side: block/teleportation_anchor_side front: block/teleportation_anchor_side bottom: block/teleportation_anchor_bottom - item: player_head reference: item/teleportation_jammer model: block/teleportation_jammer - item: purpur_pillar reference: block/teleportation_jammer template: custom - item: end_rod reference: gui/advancement/teleportation_jammer template: name: advancement forward: block/teleportation_jammer - item: lodestone reference: gui/advancement/teleportation_anchor template: name: advancement forward: block/teleportation_anchor gui_fonts: - translation: gui.gm4.teleportation_jammer container: dropper texture: gui/container/teleportation_jammer website: description: Suppress and control chorus-based teleportation! recommended: - gm4_orb_of_ankou - gm4_zauber_cauldrons notes: [] modrinth: project_id: CQkaELVA wiki: https://wiki.gm4.co/wiki/Teleportation_Anchors credits: Creator: - BPR Updated By: - runcows Icon Design: - Hozz ================================================ FILE: gm4_teleportation_anchors/data/gm4/advancement/teleportation_anchors_anchor.json ================================================ { "display": { "icon": { "id": "minecraft:lodestone", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:gui/advancement/teleportation_anchor"]} } }, "title": { "translate": "advancement.gm4.teleportation_anchors_anchor.title", "fallback": "Pinpoint Location" }, "description": { "translate": "advancement.gm4.teleportation_anchors_anchor.description", "fallback": "Make a teleportation anchor to remove the randomness of chorus", "color": "gray" } }, "parent": "gm4:teleportation_anchors_jammer", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4/advancement/teleportation_anchors_jammer.json ================================================ { "display": { "icon": { "id": "minecraft:end_rod", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:gui/advancement/teleportation_jammer"]} } }, "title": { "translate": "advancement.gm4.teleportation_anchors_jammer.title", "fallback": "Make Some Noise" }, "description": { "translate": "advancement.gm4.teleportation_anchors_jammer.description", "fallback": "Create a device to stop chorus in its tracks", "color": "gray" } }, "parent": "gm4:root", "criteria": { "impossible": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [ "gm4_teleportation_anchors:machine/verify_destroy" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [ "gm4_teleportation_anchors:machine/verify_place_down" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_orb_of_ankou/tags/function/pneumas/expeditious/tp_player.json ================================================ { "values": [ "gm4_teleportation_anchors:player/resolve_used_chorus" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/consume_chorus.json ================================================ { "criteria": { "consume chorus": { "trigger": "minecraft:consume_item", "conditions": { "item": { "items": [ "minecraft:chorus_fruit" ] } } } }, "rewards": { "function": "gm4_teleportation_anchors:player/used_chorus" } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/enter_end_gateway.json ================================================ { "criteria": { "entered_end_gateway": { "trigger": "minecraft:enter_block", "conditions": { "block": "minecraft:end_gateway" } } }, "rewards": { "function": "gm4_teleportation_anchors:player/enter_end_gateway" } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/join.json ================================================ { "criteria": { "first_join": { "trigger": "minecraft:tick" } }, "rewards": { "function": "gm4_teleportation_anchors:player/set_id" } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/recipes/teleportation_anchor.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_teleportation_anchors:teleportation_anchor" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:end_stone_bricks", "minecraft:lodestone", "minecraft:ender_eye" ] } ] } }, "has_jammer": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_machines:{id:'teleportation_jammer'}}" } } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials", "has_jammer" ] ], "rewards": { "recipes": [ "gm4_teleportation_anchors:teleportation_anchor" ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/advancement/recipes/teleportation_jammer.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_teleportation_anchors:teleportation_jammer" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:purpur_block", "minecraft:purpur_pillar", "minecraft:lodestone", "minecraft:ender_eye", "minecraft:end_crystal" ] } ] } }, "has_anchor": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "minecraft:player_head", "predicates": { "minecraft:custom_data": "{gm4_machines:{id:'teleportation_anchor'}}" } } ] } } }, "requirements": [ [ "has_the_recipe", "has_materials", "has_anchor" ] ], "rewards": { "recipes": [ "gm4_teleportation_anchors:teleportation_jammer" ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/link.mcfunction ================================================ # @s = Anchor Finder marker that has found an anchor # run from blocks/anchor/scan tp @s ^ ^ ^-1 scoreboard players operation @s gm4_ta_jam_id = @e[type=marker,tag=gm4_ta_selected_jammer,limit=1] gm4_ta_jam_id tag @s add gm4_ta_found_anchor ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/process.mcfunction ================================================ # @s = teleportation anchor # run from main particle minecraft:portal ~ ~0.65 ~ 0 -0.2 0 0.2 20 particle minecraft:end_rod ~ ~0.8 ~ 0.1 -0.3 0.1 0.01 1 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/rotate.mcfunction ================================================ # @s = marker to find a teleportation anchor that hit a junction # run from blocks/anchor/scan execute if block ~ ~ ~ purpur_pillar[axis=y] if block ~ ~1 ~ purpur_pillar run data merge entity @s {Rotation:[0f,-90f]} execute if block ~ ~ ~ purpur_pillar[axis=y] if block ~ ~-1 ~ purpur_pillar run data merge entity @s {Rotation:[0f,90f]} execute if block ~ ~ ~ purpur_pillar[axis=x] if block ~1 ~ ~ purpur_pillar run data merge entity @s {Rotation:[-90f,0f]} execute if block ~ ~ ~ purpur_pillar[axis=x] if block ~-1 ~ ~ purpur_pillar run data merge entity @s {Rotation:[90f,0f]} execute if block ~ ~ ~ purpur_pillar[axis=z] if block ~ ~ ~1 purpur_pillar run data merge entity @s {Rotation:[0f,0f]} execute if block ~ ~ ~ purpur_pillar[axis=z] if block ~ ~ ~-1 purpur_pillar run data merge entity @s {Rotation:[180f,0f]} ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/scan.mcfunction ================================================ # @s = marker to find a teleportation anchor # run from find_anchor tp @s ^ ^ ^1 execute unless block ~ ~ ~ purpur_pillar unless block ~ ~ ~ lodestone run tag @s add gm4_ta_kill kill @s[tag=gm4_ta_kill] execute if block ~ ~ ~ lodestone align xyz positioned ~0.5 ~0.5 ~0.5 if entity @e[type=marker,tag=gm4_teleportation_anchor,distance=..0.1] at @s run function gm4_teleportation_anchors:blocks/anchor/link # rotate if at a junction execute at @s[tag=!gm4_ta_found_anchor] unless blocks ~ ~ ~ ~ ~ ~ ^ ^ ^-1 all run function gm4_teleportation_anchors:blocks/anchor/rotate scoreboard players add scan_count gm4_ta_data 1 execute unless entity @s[tag=gm4_ta_kill] unless score scan_count gm4_ta_data matches 128.. at @s[tag=!gm4_ta_found_anchor] run function gm4_teleportation_anchors:blocks/anchor/scan ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/anchor/search.mcfunction ================================================ # @s = teleportation jammer that just jammed an entity # run from both player/jam_player and mob/move_mob summon marker ~ ~-1 ~ {CustomName:"gm4_ta_anchor_finder",Rotation:[0f,90f],Tags:["gm4_ta_anchor_finder"]} scoreboard players reset scan_count gm4_ta_data tag @s add gm4_ta_selected_jammer execute as @e[type=marker,tag=gm4_ta_anchor_finder,limit=1,distance=..1.1] at @s run function gm4_teleportation_anchors:blocks/anchor/scan tag @s remove gm4_ta_selected_jammer tag @e[type=marker] remove gm4_ta_anchor_finder ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/active.mcfunction ================================================ # @s = teleportation jammer with fuel # run from blocks/jammer/check_fuel # check if purpur pillar "wire" is attached execute if block ~ ~-1 ~ purpur_pillar[axis=y] run tag @s add gm4_ta_wired # tag nearby entities based on pyramid level tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..4,nbt=!{NoAI:1b}] add gm4_ta_new_jammed execute if predicate gm4_teleportation_anchors:has_pyramid_1 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..16,nbt=!{NoAI:1b}] add gm4_ta_new_jammed execute if predicate gm4_teleportation_anchors:has_pyramid_2 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..64,nbt=!{NoAI:1b}] add gm4_ta_new_jammed execute if predicate gm4_teleportation_anchors:has_pyramid_3 run tag @e[type=!#gm4:non_living,type=!armor_stand,distance=..128,nbt=!{NoAI:1b}] add gm4_ta_new_jammed # track which jammed affected which entity and set decay score scoreboard players set @e[tag=gm4_ta_new_jammed,distance=..129] gm4_ta_jam_time 3 tag @e[tag=gm4_ta_new_jammed,distance=..129] add gm4_ta_jammed # ZC compatibility execute as @e[tag=gm4_ta_new_jammed,distance=..129] unless score @s gm4_zc_no_explode matches 3.. run scoreboard players set @s gm4_zc_no_explode 3 tag @e[distance=..129] remove gm4_ta_new_jammed particle minecraft:reverse_portal ~ ~0.5 ~ 0.01 0.7 0.01 0.01 30 force ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/check_fuel.mcfunction ================================================ # @s = teleportation jammer with antenna and at least one layer of pyramid # run from blocks/process_jammer scoreboard players remove @s[scores={gm4_ta_fuel=1..}] gm4_ta_fuel 1 execute unless score @s gm4_ta_fuel matches 1.. if data block ~ ~ ~ Items[{id:"minecraft:chorus_fruit"}] run function gm4_teleportation_anchors:blocks/jammer/load_fuel execute if score @s gm4_ta_fuel matches 1.. run function gm4_teleportation_anchors:blocks/jammer/active ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/load_fuel.mcfunction ================================================ # @s = teleportation jammer without fuel # run from blocks/process_jammer # refuel 8 minutes of the jammer scoreboard players add @s gm4_ta_fuel 600 # remove 1 chorus fruit from the dropper data modify storage gm4_teleportation_anchors:data Items[] set from block ~ ~ ~ Items[{id:"minecraft:chorus_fruit"}] execute store result storage gm4_teleportation_anchors:data Items[0].count byte 1 run data get storage gm4_teleportation_anchors:data Items[0].count 0.99 execute store result score count gm4_et_data run data get storage gm4_teleportation_anchors:data Items[0].count data modify block ~ ~ ~ Items append from storage gm4_teleportation_anchors:data Items[0] ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/blocks/jammer/process.mcfunction ================================================ # @s = teleportation jammer # run from main tag @s remove gm4_ta_wired execute if block ~ ~1 ~ end_rod[facing=up] run function gm4_teleportation_anchors:blocks/jammer/check_fuel # store which TP Jammer is closest to the jammed mob execute as @e[tag=gm4_ta_jammed] at @s run scoreboard players operation @s gm4_ta_jam_id = @e[type=marker,tag=gm4_teleportation_jammer,distance=..129,limit=1,sort=nearest] gm4_ta_jam_id ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/init.mcfunction ================================================ scoreboard objectives add gm4_ta_data dummy scoreboard objectives add gm4_ta_id dummy scoreboard objectives add gm4_ta_fuel dummy scoreboard objectives add gm4_ta_jam_time dummy scoreboard objectives add gm4_ta_cooldown dummy scoreboard objectives add gm4_ta_ignore dummy scoreboard objectives add gm4_ta_jam_id dummy scoreboard objectives add gm4_ta_pos_x dummy scoreboard objectives add gm4_ta_pos_y dummy scoreboard objectives add gm4_ta_pos_z dummy execute unless score gm4_teleportation_anchors gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Teleportation Anchors"} execute unless score gm4_teleportation_anchors gm4_earliest_version < gm4_teleportation_anchors gm4_modules run scoreboard players operation gm4_teleportation_anchors gm4_earliest_version = gm4_teleportation_anchors gm4_modules scoreboard players set gm4_teleportation_anchors gm4_modules 1 schedule function gm4_teleportation_anchors:main 1t schedule function gm4_teleportation_anchors:tick 1t #$moduleUpdateList ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/create_anchor.mcfunction ================================================ # places the teleportation_anchor down # @s = player who placed the teleportation_anchor # located at the center of the placed block # run from gm4_teleportation_anchors:machine/verify_place_down # place lodestone setblock ~ ~ ~ lodestone # summon display and marker entity summon minecraft:item_display ~ ~ ~ {\ CustomName:"gm4_teleportation_anchor_display",\ Tags:["gm4_no_edit","gm4_teleportation_anchor_display","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item:{id:"end_portal_frame",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_teleportation_anchors:block/teleportation_anchor"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } summon marker ~ ~ ~ {Tags:["gm4_teleportation_anchor","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_teleportation_anchor",Rotation:[0.0f,0.0f]} # mark block as placed playsound minecraft:block.end_portal.spawn block @a[distance=..8] ~ ~ ~ 0.3 1.8 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/create_jammer.mcfunction ================================================ # places the teleportation_jammer down # @s = player who placed the teleportation_jammer # located at the center of the placed block # run from gm4_teleportation_anchors:machine/verify_place_down # place dropper setblock ~ ~ ~ dropper[facing=up]{CustomName:{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.teleportation_jammer","fallback":"Teleportation Jammer"},[{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.teleportation_jammer","fallback":"Teleportation Jammer","font":"gm4:half_invert"},{"translate":"container.gm4.teleportation_jammer","fallback":"Teleportation Jammer","font":"gm4:offscreen"},{"translate":"gui.gm4.teleportation_jammer","fallback":"","font":"gm4:container_gui","color":"white"},{"text":" ","font":"gm4:half_invert"},{"translate":"container.gm4.teleportation_jammer","fallback":"Teleportation Jammer","font":"gm4:half_invert"},{"translate":"container.gm4.teleportation_jammer","fallback":"Teleportation Jammer","font":"gm4:default","color":"#404040"}]]}} # summon display and marker entity summon minecraft:item_display ~ ~ ~ {\ CustomName:"gm4_teleportation_jammer_display",\ Tags:["gm4_no_edit","gm4_teleportation_jammer_display","gm4_machine_display","smithed.entity","smithed.strict","gm4_new_machine"],\ item:{id:"purpur_pillar",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_teleportation_anchors:block/teleportation_jammer"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } summon marker ~ ~ ~ {Tags:["gm4_teleportation_jammer","gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","gm4_new_machine"],CustomName:"gm4_teleportation_jammer",Rotation:[0.0f,0.0f]} # set id execute store result score @e[type=marker,tag=gm4_new_machine,limit=1,distance=..0.01] gm4_ta_jam_id run data get entity @e[type=marker,tag=gm4_new_machine,limit=1,distance=..0.01] UUID[3] # mark block as placed playsound minecraft:block.chorus_flower.death block @a[distance=..8] ~ ~ ~ 100 1.3 playsound minecraft:block.beacon.power_select block @a[distance=..8] ~ ~ ~ 0.3 0.3 scoreboard players set $placed_block gm4_machine_data 1 scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 2 tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/destroy_anchor.mcfunction ================================================ # destroys the teleportation_anchor # @s = teleportation_anchor marker # located at @s # run from gm4_teleportation_anchors:machine/verify_destroy # legacy armor stand clean up - TODO: remove this when we stop supporting the upgrade path execute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_teleportation_anchor_stand,limit=1,distance=..0.01] # kill entities related to machine block kill @e[type=item_display,tag=gm4_teleportation_anchor_display,limit=1,distance=..0.01] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:lodestone",count:1}},nbt=!{Item:{components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle minecraft:block{block_state:"minecraft:end_portal_frame"} ~ ~0.6 ~ .1 .25 .1 .05 30 normal @a execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_teleportation_anchors:items/teleportation_anchor ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/destroy_jammer.mcfunction ================================================ # destroys the teleportation_jammer # @s = teleportation_jammer marker # located at @s # run from gm4_teleportation_anchors:machine/verify_destroy # legacy armor stand cleanup - TODO: remove this when we stop supporting the upgrade path execute positioned ~ ~-0.4 ~ run kill @e[type=armor_stand,tag=gm4_teleportation_jammer_stand,limit=1,distance=..0.01] # kill entities related to machine block kill @e[type=item_display,tag=gm4_teleportation_jammer_display,limit=1,distance=..0.01] execute store result score $dropped_item gm4_machine_data run kill @e[type=item,distance=..1,nbt={Age:0s,Item:{id:"minecraft:dropper",count:1,components:{}}},limit=1,sort=nearest] kill @s # drop item (unless broken in creative mode) particle minecraft:block{block_state:"minecraft:purpur_block"} ~ ~0.6 ~ .1 .25 .1 .05 30 normal @a execute if score $dropped_item gm4_machine_data matches 1 run loot spawn ~ ~ ~ loot gm4_teleportation_anchors:items/teleportation_jammer ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/verify_destroy.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_teleportation_jammer] run function gm4_teleportation_anchors:machine/destroy_jammer execute if entity @s[tag=gm4_teleportation_anchor] run function gm4_teleportation_anchors:machine/destroy_anchor ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/machine/verify_place_down.mcfunction ================================================ # verifies that the placed down machine was from this module # @s = player who placed down the machine # located at the machine block marker (at the center of the placed down block) # run from #gm4_machines:place_down execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"teleportation_jammer"} run function gm4_teleportation_anchors:machine/create_jammer execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"teleportation_anchor"} run function gm4_teleportation_anchors:machine/create_anchor ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/main.mcfunction ================================================ schedule function gm4_teleportation_anchors:main 16t # jam mobs every 8 ticks function gm4_teleportation_anchors:mob/jam_mob schedule function gm4_teleportation_anchors:mob/jam_mob 8t # teleportation jammers ## decrease buffer score scoreboard players remove @e[scores={gm4_ta_jam_time=1..}] gm4_ta_jam_time 1 ## unjam entities scoreboard players reset @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] gm4_ta_pos_x scoreboard players reset @e[type=shulker,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] gm4_ta_pos_x execute as @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] run data remove entity @s carriedBlockState tag @e[tag=gm4_ta_jammed,scores={gm4_ta_jam_time=..0}] remove gm4_ta_jammed ## kill blocker armor stands (used to prevent jammed players from breaking/using blocks) execute as @e[type=armor_stand,tag=gm4_ta_blocker] at @s unless entity @a[limit=1,distance=..0.1,tag=gm4_ta_teleported_player] run kill @s ## teleportation jammer processes execute as @e[type=marker,tag=gm4_teleportation_jammer] at @s run function gm4_teleportation_anchors:blocks/jammer/process # teleportation anchors execute as @e[type=marker,tag=gm4_teleportation_anchor] at @s run function gm4_teleportation_anchors:blocks/anchor/process ## deal with jammed player execute at @a[scores={gm4_ta_cooldown=1..}] run particle minecraft:block{block_state:"minecraft:chorus_plant"} ~ ~0.5 ~ 0 0 0 0 3 force scoreboard players remove @a[scores={gm4_ta_cooldown=1..}] gm4_ta_cooldown 1 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/anchor_tp.mcfunction ================================================ # @s = enderman or shulker to be moved to a tp anchor # located 1 block above the teleportation anchor # run from move_mob tp @s ~ ~-0.45 ~ function gm4_teleportation_anchors:mob/track_movement/initialize_pos tag @s add gm4_ta_anchor_tp execute if entity @s[type=enderman] run playsound minecraft:entity.enderman.teleport block @a[distance=..8] ~ ~ ~ 1 0.3 execute if entity @s[type=shulker] run playsound minecraft:entity.shulker.teleport block @a[distance=..8] ~ ~ ~ 1 0.3 execute if entity @s[type=enderman] run particle minecraft:portal ~ ~0.5 ~ 0.2 1.6 0.2 0.01 150 execute if entity @s[type=shulker] run particle minecraft:portal ~ ~0.5 ~ 0.2 0 0.2 0.01 50 particle minecraft:explosion ~ ~0.5 ~ 0 0 0 0 0 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/check_movement_type.mcfunction ================================================ # @s = endermen and shulkers near a teleporation jammer # run from mob/jam_mob # check if entity is in a minecart or boat tag @s[predicate=gm4_teleportation_anchors:in_vehicle] add gm4_ta_ignore execute unless entity @s[tag=gm4_ta_ignore] run function gm4_teleportation_anchors:mob/check_pos scoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_x scoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_y scoreboard players reset @s[tag=gm4_ta_ignore] gm4_ta_pos_z tag @s remove gm4_ta_ignore ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/check_pos.mcfunction ================================================ # @s = endermen and shulkers near a teleporation jammer # run from mob/check_movement_type execute unless score @s gm4_ta_pos_x = @s gm4_ta_pos_x run function gm4_teleportation_anchors:mob/track_movement/initialize_pos function gm4_teleportation_anchors:mob/track_movement/check_dx execute unless entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/check_dz execute unless entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/check_dy execute if entity @s[type=enderman,tag=!gm4_ta_teleported,tag=!gm4_ta_falling] run function gm4_teleportation_anchors:mob/track_movement/check_d execute if entity @s[tag=gm4_ta_teleported] run function gm4_teleportation_anchors:mob/move_mob execute if entity @s[tag=!gm4_ta_teleported] run function gm4_teleportation_anchors:mob/track_movement/update_pos tag @s remove gm4_ta_teleported tag @s remove gm4_ta_falling ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/enter_end_gateway.mcfunction ================================================ # @s = mob (not player, shulker, or enderman) that just went through an end gateway # run from tick tag @s add gm4_ta_gateway function gm4_teleportation_anchors:player/jam_player ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/jam_mob.mcfunction ================================================ # @s = none # run from main scoreboard players remove @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=1..}] gm4_ta_ignore 1 execute as @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=1..}] run tag @s add gm4_ta_ignore execute as @e[type=#gm4_teleportation_anchors:teleporters,scores={gm4_ta_ignore=-1}] run tag @s add gm4_ta_ignore execute as @e[type=#gm4_teleportation_anchors:teleporters,tag=gm4_ta_jammed] at @s run function gm4_teleportation_anchors:mob/check_movement_type ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/move_mob.mcfunction ================================================ # jammed enderman or shulker that teleported # run from mob/check_pos execute store result entity @s Pos[0] double 0.01 run scoreboard players get @s gm4_ta_pos_x execute store result entity @s Pos[1] double 0.01 run scoreboard players get @s gm4_ta_pos_y execute store result entity @s Pos[2] double 0.01 run scoreboard players get @s gm4_ta_pos_z scoreboard players set @s[type=enderman] gm4_ta_jam_time 3 # teleportation anchors tag @s add gm4_ta_new_tp execute at @s as @e[type=marker,tag=gm4_ta_wired,distance=..129] if score @s gm4_ta_jam_id = @e[limit=1,tag=gm4_ta_new_tp] gm4_ta_jam_id at @s run function gm4_teleportation_anchors:blocks/anchor/search execute at @s as @e[type=marker,tag=gm4_ta_found_anchor] if score @s gm4_ta_jam_id = @e[limit=1,tag=gm4_ta_new_tp] gm4_ta_jam_id run tag @s add gm4_ta_anchor_loc execute at @e[type=marker,tag=gm4_ta_anchor_loc,limit=1] positioned ~ ~1 ~ run function gm4_teleportation_anchors:mob/anchor_tp kill @e[type=marker,tag=gm4_ta_anchor_loc] tag @s remove gm4_ta_new_tp # visuals execute at @s[tag=!gm4_ta_anchor_tp] run function gm4_teleportation_anchors:mob/visuals_jam tag @s remove gm4_ta_anchor_tp ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_d.mcfunction ================================================ # @s = endermen near a teleporation jammer # run from mob/check_pos # check total distance away from initial position summon marker ~ ~ ~ {Tags:["gm4_ta_pos_tracker"]} execute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[0] double 0.01 run scoreboard players get @s gm4_ta_pos_x execute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[1] double 0.01 run scoreboard players get @s gm4_ta_pos_y execute store result entity @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] Pos[2] double 0.01 run scoreboard players get @s gm4_ta_pos_z execute at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[distance=5.8..] add gm4_ta_teleported execute if entity @s[tag=gm4_ta_teleported] at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[type=enderman,distance=5.8..7.2,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported execute if entity @s[tag=gm4_ta_teleported] at @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] run tag @s[type=enderman,distance=5.8..10.1,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported kill @e[type=marker,tag=gm4_ta_pos_tracker,limit=1] ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dx.mcfunction ================================================ # @s = endermen and shulkers near a teleporation jammer # run from mob/check_pos # get current x-coord execute store result score current gm4_ta_pos_x run data get entity @s Pos[0] 100 # compare current x-coord to previous x-coord scoreboard players operation difference gm4_ta_pos_x = current gm4_ta_pos_x scoreboard players operation difference gm4_ta_pos_x -= @s gm4_ta_pos_x # take absolute value of difference scoreboard players set -1 gm4_ta_pos_x -1 execute if score difference gm4_ta_pos_x matches ..0 run scoreboard players operation difference gm4_ta_pos_x *= -1 gm4_ta_pos_x # mark entity as teleported if they moved too far execute if entity @s[type=enderman] if score difference gm4_ta_pos_x matches 360.. run tag @s add gm4_ta_teleported execute if score difference gm4_ta_pos_x matches 360..510 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported execute if score difference gm4_ta_pos_x matches 360..690 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported execute if entity @s[type=shulker] if score difference gm4_ta_pos_x matches 90.. run tag @s add gm4_ta_teleported ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dy.mcfunction ================================================ # @s = endermen and shulkers near a teleporation jammer # run from mob/check_pos # get current y-coord execute store result score current gm4_ta_pos_y run data get entity @s Pos[1] 100 # compare current y-coord to previous y-coord scoreboard players operation difference gm4_ta_pos_y = current gm4_ta_pos_y scoreboard players operation difference gm4_ta_pos_y -= @s gm4_ta_pos_y # take absolute value of difference scoreboard players set -1 gm4_ta_pos_y -1 execute if score difference gm4_ta_pos_y matches ..0 run scoreboard players operation difference gm4_ta_pos_y *= -1 gm4_ta_pos_y # mark shulker if they moved too far execute if entity @s[type=shulker] if score difference gm4_ta_pos_y matches 90.. run tag @s add gm4_ta_teleported # mark endermen if they moved too far and is not falling execute if entity @s[type=enderman] if score difference gm4_ta_pos_y matches 410.. run function gm4_teleportation_anchors:mob/track_movement/check_enderman_falling ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_dz.mcfunction ================================================ # @s = endermen and shulkers near a teleporation jammer # run from mob/check_pos # get current z-coord execute store result score current gm4_ta_pos_z run data get entity @s Pos[2] 100 # compare current z-coord to previous z-coord scoreboard players operation difference gm4_ta_pos_z = current gm4_ta_pos_z scoreboard players operation difference gm4_ta_pos_z -= @s gm4_ta_pos_z # take absolute value of difference scoreboard players set -1 gm4_ta_pos_z -1 execute if score difference gm4_ta_pos_z matches ..0 run scoreboard players operation difference gm4_ta_pos_z *= -1 gm4_ta_pos_z # mark entity as teleported if they moved too far execute if entity @s[type=enderman] if score difference gm4_ta_pos_z matches 360.. run tag @s add gm4_ta_teleported execute if score difference gm4_ta_pos_z matches 360..510 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_1] remove gm4_ta_teleported execute if score difference gm4_ta_pos_z matches 360..690 run tag @s[type=enderman,predicate=gm4_teleportation_anchors:has_speed_2] remove gm4_ta_teleported execute if entity @s[type=shulker] if score difference gm4_ta_pos_z matches 90.. run tag @s add gm4_ta_teleported ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/check_enderman_falling.mcfunction ================================================ # @s = endermen near a teleporation jammer # run from mob/track_movement/check_dy execute store result score fall gm4_ta_pos_y run data get entity @s fall_distance 100 execute if score fall gm4_ta_pos_y matches 0..90 run tag @s add gm4_ta_teleported execute if score fall gm4_ta_pos_y matches 91.. run tag @s add gm4_ta_falling execute if entity @s[type=enderman,tag=gm4_ta_teleported,predicate=gm4_teleportation_anchors:has_speed_1] if score difference gm4_ta_pos_x matches 410..510 run tag @s remove gm4_ta_teleported execute if entity @s[type=enderman,tag=gm4_ta_teleported,predicate=gm4_teleportation_anchors:has_speed_2] if score difference gm4_ta_pos_x matches 410..690 run tag @s remove gm4_ta_teleported ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/initialize_pos.mcfunction ================================================ # endermen and shulker who has been jammed for the first time # run from mob/check_pos execute store result score @s gm4_ta_pos_x run data get entity @s Pos[0] 100 execute store result score @s gm4_ta_pos_y run data get entity @s Pos[1] 100 execute store result score @s gm4_ta_pos_z run data get entity @s Pos[2] 100 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/track_movement/update_pos.mcfunction ================================================ # jammed enderman or shulker that did not teleport # run from mob/check_pos scoreboard players operation @s gm4_ta_pos_x = current gm4_ta_pos_x scoreboard players operation @s gm4_ta_pos_y = current gm4_ta_pos_y scoreboard players operation @s gm4_ta_pos_z = current gm4_ta_pos_z ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/mob/visuals_jam.mcfunction ================================================ # @s = mob that was prevented from teleporting # run from mob/move_mob execute if entity @s[type=enderman] run particle minecraft:angry_villager ~ ~2.3 ~ 0.3 0.2 0.3 1 5 execute if entity @s[type=shulker] run particle minecraft:angry_villager ~ ~0.8 ~ 0.3 0.2 0.3 1 5 particle minecraft:block{block_state:"minecraft:chorus_plant"} ~ ~0.5 ~ 0 0 0 0 20 force playsound minecraft:block.chorus_flower.death hostile @a[distance=..8] ~ ~ ~ 10 1.3 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/enter_end_gateway.mcfunction ================================================ # @s = player who just entered an end gateway # run from advancement "enter_end_gateway" advancement revoke @s only gm4_teleportation_anchors:enter_end_gateway # spawn end gateway markers execute positioned ~.3 ~256 ~.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~.3 ~256 ~-.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~-.3 if block ~ ~-256 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~ ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~.3 ~256 ~.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~.3 ~256 ~-.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~-.3 if block ~ ~-255 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~.3 ~256 ~.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~.3 ~256 ~-.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} execute positioned ~-.3 ~256 ~-.3 if block ~ ~-254.25 ~ minecraft:end_gateway align xyz unless entity @e[type=marker,tag=gm4_ta_end_gateway,dx=0] run summon marker ~0.5 ~1 ~0.5 {CustomName:"End Gateway",Tags:["gm4_ta_end_gateway"]} tag @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] add gm4_ta_gateway execute if entity @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] run function gm4_teleportation_anchors:player/jam_player ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/jam_player.mcfunction ================================================ # @s = jammed player who just ate chorus fruit # run from player/used_chorus tag @s add gm4_ta_teleported_player tag @s add gm4_ta_store_pos summon marker ~ ~ ~ {CustomName:"gm4_ta_player_pos",Tags:["gm4_ta_player_pos","gm4_ta_new_player_pos"]} execute if entity @s[type=!player] store result score @s gm4_ta_id run data get entity @s UUID[3] scoreboard players operation @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] gm4_ta_jam_id = @s gm4_ta_jam_id scoreboard players operation @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] gm4_ta_id = @s gm4_ta_id # if player was in an end gateway, move the marker to 1 block in pos x execute if entity @s[tag=gm4_ta_gateway] run tp @e[type=marker,distance=..0.01,tag=gm4_ta_new_player_pos,limit=1] ^ ^ ^-1 # clean up tag @s remove gm4_ta_gateway tag @e[type=marker,tag=gm4_ta_player_pos,distance=..0.01] remove gm4_ta_new_player_pos # start 20hz clock to check for movement schedule function gm4_teleportation_anchors:player/temp_tick 1t ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/move_player.mcfunction ================================================ # @s = player who used chorus and has justed moved after teleporting # run from player/track_movement # find the marker that belongs to the player (match IDs) execute if entity @s[type=player] as @e[type=marker,tag=gm4_ta_player_pos] if score @s gm4_ta_id = @p[distance=..0.001,tag=gm4_ta_teleported_player] gm4_ta_id run tag @s add gm4_ta_selected_marker execute unless entity @s[type=player] as @e[type=marker,tag=gm4_ta_player_pos] if score @s gm4_ta_id = @e[distance=..0.001,tag=gm4_ta_teleported_player,limit=1] gm4_ta_id run tag @s add gm4_ta_selected_marker # if the marker is linked to a wired TP Jammer, then move the marker execute unless score @s gm4_ta_cooldown matches 1.. at @e[type=marker,tag=gm4_ta_selected_marker,limit=1] as @e[type=marker,tag=gm4_ta_wired,distance=..129] if score @s gm4_ta_jam_id = @e[tag=gm4_ta_selected_marker,limit=1,distance=..0.0001] gm4_ta_jam_id at @s run function gm4_teleportation_anchors:blocks/anchor/search execute if score @e[type=marker,tag=gm4_ta_found_anchor,limit=1] gm4_ta_jam_id = @e[type=marker,tag=gm4_ta_selected_marker,limit=1] gm4_ta_jam_id at @e[type=marker,tag=gm4_ta_found_anchor,limit=1] run tp @e[type=marker,tag=gm4_ta_selected_marker,limit=1] ~ ~1 ~ execute if entity @e[type=marker,tag=gm4_ta_found_anchor,limit=1] run tag @s add gm4_ta_anchor_tp scoreboard players set @s[type=player,tag=gm4_ta_anchor_tp] gm4_ta_cooldown 12 # teleport player to the marker execute at @e[type=marker,tag=gm4_ta_selected_marker,limit=1] run tp @s ~ ~ ~ execute at @s[tag=gm4_ta_anchor_tp] run function gm4_teleportation_anchors:player/visuals_anchor execute at @s[tag=!gm4_ta_anchor_tp] run function gm4_teleportation_anchors:player/visuals_jam # clean up tags and scores tag @s remove gm4_ta_teleported_player tag @s remove gm4_ta_anchor_tp tag @s remove gm4_ta_track_movement tag @s remove gm4_ta_has_moved scoreboard players reset @s gm4_ta_pos_x scoreboard players reset @s gm4_ta_pos_y scoreboard players reset @s gm4_ta_pos_z scoreboard players reset @s[type=!player] gm4_ta_id kill @e[type=marker,tag=gm4_ta_selected_marker] kill @e[type=marker,tag=gm4_ta_found_anchor] ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/resolve_used_chorus.mcfunction ================================================ # check load.status # @s = player who ate chorus fruit # located at @s # run from #gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport execute if score gm4_teleportation_anchors load.status matches 1.. run function gm4_teleportation_anchors:player/used_chorus ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/set_id.mcfunction ================================================ # @s = player who joined for the first time # run from advancement gm4_teleportation_anchors:join execute store result score @s gm4_ta_id run data get entity @s UUID[3] ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/store_position.mcfunction ================================================ # @s = player who just used chorus, after they've teleported with the chorus # run from temp_tick execute store result score @s gm4_ta_pos_x run data get entity @s Pos[0] 100 execute store result score @s gm4_ta_pos_y run data get entity @s Pos[1] 100 execute store result score @s gm4_ta_pos_z run data get entity @s Pos[2] 100 tag @s remove gm4_ta_store_pos tag @s add gm4_ta_track_movement execute if entity @s[type=player] run summon armor_stand ~ ~ ~ {Invisible:1b,NoGravity:1b,Silent:1b,Invulnerable:1b,PortalCooldown:2147483647,Tags:["gm4_ta_blocker"]} ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/temp_tick.mcfunction ================================================ # @s = none # located at world spawn # run from player/jam_player execute as @e[tag=gm4_ta_track_movement] run function gm4_teleportation_anchors:player/track_movement execute as @e[tag=gm4_ta_store_pos] at @s run function gm4_teleportation_anchors:player/store_position # keep ticking if there are players with the tag execute if entity @e[tag=gm4_ta_teleported_player] run schedule function gm4_teleportation_anchors:player/temp_tick 1t ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/track_movement.mcfunction ================================================ # @s = player who used chorus and has yet to move after teleporting # run from temp_tick effect give @s minecraft:blindness 2 255 true tag @s[type=!player] add gm4_ta_has_moved execute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_x run data get entity @s Pos[0] 100 execute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_x = @s gm4_ta_pos_x run tag @s add gm4_ta_has_moved execute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_y run data get entity @s Pos[1] 100 execute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_y = @s gm4_ta_pos_y run tag @s add gm4_ta_has_moved execute unless entity @s[tag=gm4_ta_has_moved] store result score current gm4_ta_pos_z run data get entity @s Pos[2] 100 execute unless entity @s[tag=gm4_ta_has_moved] unless score current gm4_ta_pos_z = @s gm4_ta_pos_z run tag @s add gm4_ta_has_moved execute if entity @s[tag=gm4_ta_has_moved] at @s run function gm4_teleportation_anchors:player/move_player ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/used_chorus.mcfunction ================================================ # @s = player who ate chorus fruit # run from advancement "consume_chorus" and any module that supports jamming (e.g. Wormholes, Expeditious) advancement revoke @s only gm4_teleportation_anchors:consume_chorus execute if entity @s[tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player] run function gm4_teleportation_anchors:player/jam_player ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/visuals_anchor.mcfunction ================================================ # @s = player that teleported to an anchor # run from player/move_player playsound minecraft:item.chorus_fruit.teleport block @a[distance=..8] ~ ~ ~ 1 0.3 particle minecraft:portal ~ ~0.5 ~ 0.2 0.6 0.2 0.01 100 particle minecraft:explosion ~ ~ ~ 0 0 0 0 0 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/player/visuals_jam.mcfunction ================================================ # @s = player that was jammed # run from player/move_player execute positioned ~ ~1.3 ~ run particle minecraft:angry_villager ^ ^ ^0.7 0.4 0.4 0.4 1 5 force particle minecraft:block{block_state:"minecraft:chorus_plant"} ~ ~0.5 ~ 0 0 0 0 20 force playsound minecraft:block.chorus_flower.death player @a[distance=..8] ~ ~ ~ 100 1.3 ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/tick.mcfunction ================================================ execute at @e[type=marker,tag=gm4_ta_end_gateway] positioned ~-.55 ~-256.55 ~-.55 align xyz as @e[type=!#gm4_teleportation_anchors:affected,tag=gm4_ta_jammed,tag=!gm4_ta_teleported_player,dx=2.1,dy=2.1,dz=2.1] at @s run function gm4_teleportation_anchors:mob/enter_end_gateway execute as @e[type=enderman,tag=gm4_ta_jammed,scores={gm4_ta_jam_time=1..}] unless data entity @s carriedBlockState run data merge entity @s {carriedBlockState:{Name:"tall_seagrass",Properties:{half:"upper"}}} schedule function gm4_teleportation_anchors:tick 1t ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7/create_item_display_anchor.mcfunction ================================================ # @s = gm4_teleportation_anchor_stand armor stand # at center of block # run from upgrade_paths/1.7 summon minecraft:item_display ~ ~ ~ {\ CustomName:"gm4_teleportation_anchor_display",\ Tags:["gm4_no_edit","gm4_teleportation_anchor_display","gm4_machine_display","smithed.entity","smithed.strict"],\ item:{id:"end_portal_frame",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_teleportation_anchors:block/teleportation_anchor"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } # entity version scoreboard players set @e[type=item_display,tag=gm4_teleportation_anchor_display,distance=..0.01,limit=1] gm4_entity_version 2 scoreboard players set @e[type=marker,tag=gm4_teleportation_anchor,distance=..0.01,limit=1] gm4_entity_version 2 kill @s ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7/create_item_display_jammer.mcfunction ================================================ # @s = gm4_teleportation_jammer_stand armor stand # at center of block # run from upgrade_paths/1.7 summon minecraft:item_display ~ ~ ~ {\ CustomName:"gm4_teleportation_jammer_display",\ Tags:["gm4_no_edit","gm4_teleportation_jammer_display","gm4_machine_display","smithed.entity","smithed.strict"],\ item:{id:"purpur_pillar",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_teleportation_anchors:block/teleportation_jammer"]}}},\ item_display:head,\ brightness:{sky:15,block:15},\ Rotation:[0.0f,0.0f],\ transformation:{left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f],translation:[0f,0.501f,0f],scale:[0.438,0.438,0.438]}\ } # entity version scoreboard players set @e[type=item_display,tag=gm4_teleportation_jammer_display,distance=..0.01,limit=1] gm4_entity_version 2 scoreboard players set @e[type=marker,tag=gm4_teleportation_jammer,distance=..0.01,limit=1] gm4_entity_version 2 kill @s ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/function/upgrade_paths/1.7.mcfunction ================================================ # @s = player # at @s # run via upgrade paths util execute as @e[type=minecraft:armor_stand,tag=gm4_teleportation_anchor_stand] at @s positioned ~ ~0.4 ~ \ run function gm4_teleportation_anchors:upgrade_paths/1.7/create_item_display_anchor execute as @e[type=minecraft:armor_stand,tag=gm4_teleportation_jammer_stand] at @s positioned ~ ~0.4 ~ \ run function gm4_teleportation_anchors:upgrade_paths/1.7/create_item_display_jammer ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/guidebook/teleportation_anchors.json ================================================ { "id": "teleportation_anchors", "name": "Teleportation Anchors", "module_type": "module", "icon": { "id": "minecraft:furnace" }, "criteria": { "obtain_chorus": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:chorus_fruit", "minecraft:popped_chorus_fruit", "minecraft:purpur_block" ] } ] } }, "obtain_teleportation_jammer": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:'teleportation_jammer'}}" } } ] } }, "obtain_teleportation_anchor": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:'teleportation_anchor'}}" } } ] } }, "open_teleportation_jammer": { "trigger": "minecraft:default_block_use", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:dropper" ], "nbt": "{CustomName:{\"translate\":\"gm4.second\",\"fallback\":\"%1$s\",\"with\":[{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\"},{\"text\":\" \",\"extra\":[{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:offscreen\"},{\"translate\":\"gui.gm4.teleportation_jammer\",\"fallback\":\"\",\"font\":\"gm4:container_gui\",\"color\":\"white\"},{\"text\":\" \",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:half_invert\"},{\"translate\":\"container.gm4.teleportation_jammer\",\"fallback\":\"Teleportation Jammer\",\"font\":\"gm4:default\",\"color\":\"#404040\"}],\"font\":\"gm4:half_invert\"}]}}" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.teleportation_jammer.description", "fallback": "Teleportation Jammers and Anchors can be used to supress and control chorus-based teleportation.\n\nThey can be crafted in a crafting table." } ] ] }, { "name": "crafting_jammer", "enable": [], "requirements": [ [ "obtain_chorus" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.teleportation_anchors.crafting_jammer", "fallback": "A Teleportation Jammer can be crafted in a crafting table:" }, "\n", { "insert": "recipe", "recipe": "gm4_teleportation_anchors:teleportation_jammer" } ] ] }, { "name": "usage_jammer", "enable": [], "requirements": [ [ "obtain_teleportation_jammer", "open_teleportation_jammer" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.teleportation_anchors.jamming", "fallback": "A Teleportation Jammer is used to suppress chorus based teleportation.\n\nThis includes endermen, shulkers, chorus fruit, end gateways, and other random teleportation that doesn't require line-of-sight." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.jammer_effects", "fallback": "When entities are jammed, any act of teleportation will cause them to jump back to their original location.\n\nWhen endermen are jammed, they are also prevented from picking up blocks." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.jammer_power", "fallback": "In order for a TP Jammer to work, it needs to broadcast a signal through an end rod placed on top of it.\n\nChorus fruit must be placed inside the jammer as fuel. Five fruit is enough for two days." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.jammer_range", "fallback": "Similar to a beacon, a pyramid of purpur blocks can be build to extend the range of a jammer.\n\nThe range can be either 4, 16, 32, or 64 blocks in radius, acheived by 0-3 layers of a pyramid." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.crafting_anchor", "fallback": "A Teleportation Jammer can be used to craft an Anchor:" }, "\n", { "insert": "recipe", "recipe": "gm4_teleportation_anchors:teleportation_anchor" } ] ], "grants": [ "description" ] }, { "name": "usage_anchor", "enable": [], "requirements": [ [ "obtain_teleportation_anchor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.teleportation_anchors.anchor_usage", "fallback": "A Teleportation Anchor is used to control chorus based teleportation.\n\nIf a Jammer is connected to an anchor, teleporters will be teleported to the anchor instead of being jammed to their original location." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.pupur_wires", "fallback": "A Jammer can be connected to an Anchor using purpur pillars.\n\nThe pillars need to go from the bottom of a TP Jammer and eventually lead into a TP Anchor." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.pupur_wires_1", "fallback": "If a purpur pillar points into a T-Junction, it will prioritize moving in the North, West, or Down direction.\n\nThese wires can be at most 64 blocks long." } ], [ { "translate": "text.gm4.guidebook.teleportation_anchors.chorus_fruit_cooldown", "fallback": "If a user eats chorus fruit, they can also be teleported to an anchor, but must wait some time before doing so again.\n\nIf they try to teleport during this cooldown, they will just be jammed." } ] ], "grants": [ "description" ] } ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/loot_table/items/teleportation_anchor.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:item/teleportation_anchor"]}, "minecraft:profile": "$teleportation_anchor" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'teleportation_anchor'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.teleportation_anchor", "fallback": "Teleportation Anchor", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/loot_table/items/teleportation_jammer.json ================================================ { "type": "block", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:player_head", "functions": [ { "function": "set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:item/teleportation_jammer"]}, "minecraft:profile": "$teleportation_jammer" } }, { "function": "set_custom_data", "tag": "{gm4_machines:{id:'teleportation_jammer'}}" }, { "function": "set_name", "name": [ { "translate": "block.gm4.teleportation_jammer", "fallback": "Teleportation Jammer", "color": "white", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_1.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -1, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -1, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -1, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -1, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": 1, "offsetZ": 0, "predicate": { "block": { "blocks": [ "minecraft:end_rod" ], "state": { "facing": "up" } } } } } ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_2.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_teleportation_anchors:has_pyramid_1" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -2, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -2, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -2, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -2, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -2, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -2, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -2, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -2, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -2, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -2, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -2, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -2, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -2, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -2, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -2, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -2, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -2, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -2, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -2, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -2, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -2, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -2, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -2, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -2, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -2, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } } ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_3.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_teleportation_anchors:has_pyramid_2" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -3, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } } ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_pyramid_4.json ================================================ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_teleportation_anchors:has_pyramid_3" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -3, "offsetY": -4, "offsetZ": -3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 1, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": -1, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -1, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 2, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": -2, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -2, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 3, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 3, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": 4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": 4, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "offsetX": -4, "offsetY": -4, "offsetZ": -4, "predicate": { "block": { "blocks": "#gm4_teleportation_anchors:jammer_base_blocks" } } } } ] } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_speed_1.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "effects": { "minecraft:speed": { "amplifier": 0 } } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/has_speed_2.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "effects": { "minecraft:speed": { "amplifier": 1 } } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/predicate/in_vehicle.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": {} } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/recipe/teleportation_anchor.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ "EPE", "OLO", "CCC" ], "key": { "E": "minecraft:end_stone_bricks", "P": "minecraft:ender_pearl", "O": "minecraft:crying_obsidian", "L": "minecraft:lodestone", "C": "minecraft:chiseled_stone_bricks" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:item/teleportation_anchor"]}, "minecraft:profile": "$teleportation_anchor", "minecraft:custom_data": "{gm4_machines:{id:'teleportation_anchor'}}", "minecraft:custom_name": {"translate":"block.gm4.teleportation_anchor","fallback":"Teleportation Anchor","color":"white","italic":false} } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/recipe/teleportation_jammer.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "pattern": [ " P ", "OEO", "CeC" ], "key": { "P": [ "minecraft:purpur_block", "minecraft:purpur_pillar" ], "O": "minecraft:crying_obsidian", "E": "minecraft:ender_eye", "C": "minecraft:cobblestone", "e": "minecraft:end_crystal" }, "result": { "id": "minecraft:player_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_teleportation_anchors:item/teleportation_jammer"]}, "minecraft:profile": "$teleportation_jammer", "minecraft:custom_data": "{gm4_machines:{id:'teleportation_jammer'}}", "minecraft:custom_name": {"translate":"block.gm4.teleportation_jammer","fallback":"Teleportation Jammer","color":"white","italic":false} } } } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/block/jammer_base_blocks.json ================================================ { "values": [ "minecraft:purpur_block", "minecraft:purpur_pillar" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/entity_type/affected.json ================================================ { "values": [ "#gm4_teleportation_anchors:teleporters", "minecraft:player" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_teleportation_anchors/tags/entity_type/teleporters.json ================================================ { "values": [ "minecraft:enderman", "minecraft:shulker" ] } ================================================ FILE: gm4_teleportation_anchors/data/gm4_zauber_cauldrons/tags/function/player/wormhole_targeting/prepare_teleport.json ================================================ { "values": [ "gm4_teleportation_anchors:player/resolve_used_chorus" ] } ================================================ FILE: gm4_teleportation_anchors/mod.mcdoc ================================================ use ::java::util::slot::SlottedItem dispatch minecraft:storage[gm4_teleportation_anchors:data] to struct { Items?: [SlottedItem] } ================================================ FILE: gm4_tower_structures/README.md ================================================ # Tower Structures A custom terrain expansion pack that adds new tower structures to the world. ### Features - Towers can spawn in Desert, Ocean, Badlands and Snowy biomes - Each tower can have a variety of spawners and loot, they are close to vanilla spawn rates - The quality of loot in towers depends on the height of the tower ================================================ FILE: gm4_tower_structures/beet.yaml ================================================ id: gm4_tower_structures name: Tower Structures version: 3.6.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.pfb_orbis - gm4.plugins.prefabs.module_asset_rename meta: gm4: prefabs: - gm4_orbis model_data: - item: bow reference: item/pirate_bow template: vanilla - item: leather_helmet reference: item/pirate_hat template: vanilla - item: stone_sword reference: item/pirate_sword template: vanilla - item: turtle_helmet reference: item/pirate_turtle_helmet template: vanilla website: description: A custom terrain expansion pack that adds new tower structures to the world. recommended: - gm4_dangerous_dungeons - gm4_cooler_caves notes: [] modrinth: project_id: FvGL10DQ wiki: https://wiki.gm4.co/wiki/Orbis/Tower_Structures credits: Creator: - Sparks Updated by: - Misode Icon Design: - DuckJr ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/function/init.mcfunction ================================================ execute unless score tower_structures gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Tower Structures"} execute unless score tower_structures gm4_earliest_version < tower_structures gm4_modules run scoreboard players operation tower_structures gm4_earliest_version = tower_structures gm4_modules scoreboard players set tower_structures gm4_modules 1 team add gm4_hide_name team modify gm4_hide_name nametagVisibility never #$moduleUpdateList ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/guidebook/tower_structures.json ================================================ { "id": "tower_structures", "name": "Tower Structures", "module_type": "module", "icon": { "id": "minecraft:ladder" }, "criteria": { "enter_badlands_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:badlands" } } } ] } }, "enter_default_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:default" } } } ] } }, "enter_desert_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:desert" } } } ] } }, "enter_snowy_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:snowy" } } } ] } }, "enter_large_ship": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:ocean/large_ship" } } } ] } }, "enter_medium_ship": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:ocean/medium_ship" } } } ] } }, "enter_raft": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:ocean/raft" } } } ] } }, "enter_small_ship": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:ocean/small_ship" } } } ] } }, "enter_segmented_cold_frozen_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:segmented/cold_frozen" } } } ] } }, "enter_segmented_frozen_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:segmented/frozen" } } } ] } }, "enter_segmented_hot_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:segmented/hot" } } } ] } }, "enter_segmented_hot_warm_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:segmented/hot_warm" } } } ] } }, "enter_segmented_warm_cold_tower": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "location": { "structures": "gm4_tower_structures:segmented/warm_cold" } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "enter_badlands_tower", "enter_default_tower", "enter_desert_tower", "enter_snowy_tower", "enter_large_ship", "enter_medium_ship", "enter_raft", "enter_small_ship", "enter_segmented_cold_frozen_tower", "enter_segmented_frozen_tower", "enter_segmented_hot_tower", "enter_segmented_hot_warm_tower", "enter_segmented_warm_cold_tower" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.tower_structures.description", "fallback": "Towers can be found on the surface.\n\nThese towers contain rare loot and special spawners." } ], [ { "translate": "text.gm4.guidebook.tower_structures.description.types", "fallback": "Stone towers can be found in most biomes.\n\nThe Badlands, Desert, and Snowy biomes have special towers that match the terrain.\n\nOcean dungeons and ships can be found at sea." } ] ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/chests/ship.json ================================================ { "pools": [ { "rolls": 2, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:gold_nugget", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:gold_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 12 } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:gold_block", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] }, { "rolls": 2, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:kelp", "functions": [ { "function": "minecraft:set_count", "count": { "type": "minecraft:binomial", "n": 8, "p": 0.2 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:nautilus_shell", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:turtle_egg", "functions": [ { "function": "minecraft:set_count", "count": 1 } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_orbis:chests/tower" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:spyglass", "functions": [ { "function": "minecraft:set_count", "count": { "min": 0, "max": 1 } } ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/bow_pirate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:entities/skeleton" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_hat", "functions": [ { "function": "minecraft:set_damage", "damage": 0 } ] }, { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_bow" } ], "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 1 } } ], "conditions": [ { "condition": "minecraft:killed_by_player" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:looting", "chances": [ 0.085, 0.095, 0.105, 0.115 ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/sword_pirate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:entities/skeleton" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_hat" }, { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_sword" } ], "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 1 } } ], "conditions": [ { "condition": "minecraft:killed_by_player" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:looting", "chances": [ 0.085, 0.095, 0.105, 0.115 ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/turtle_bow_pirate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:entities/skeleton" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_hat" }, { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_bow" } ], "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 1 } } ], "conditions": [ { "condition": "minecraft:killed_by_player" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:looting", "chances": [ 0.085, 0.095, 0.105, 0.115 ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/entities/turtle_sword_pirate.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:entities/skeleton" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_hat" }, { "type": "minecraft:loot_table", "value": "gm4_tower_structures:items/pirate_sword" } ], "functions": [ { "function": "minecraft:set_damage", "damage": { "min": 0, "max": 1 } } ], "conditions": [ { "condition": "minecraft:killed_by_player" }, { "condition": "minecraft:table_bonus", "enchantment": "minecraft:looting", "chances": [ 0.085, 0.095, 0.105, 0.115 ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_bow.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:bow", "functions": [ { "function": "minecraft:set_count", "count": 1 }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_tower_structures:item/pirate_bow"]} } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.tower_structures.pirate_bow", "fallback": "Pirate Bow" } } ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_hat.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:leather_helmet", "functions": [ { "function": "minecraft:set_count", "count": 1 }, { "function": "minecraft:set_components", "components": { "minecraft:dyed_color": 4013373, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:dyed_color" ] }, "minecraft:custom_model_data": {"strings":["gm4_tower_structures:item/pirate_hat"]} } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.tower_structures.pirate_hat", "fallback": "Pirate Hat" } } ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_sword.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:stone_sword", "functions": [ { "function": "minecraft:set_count", "count": 1 }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_tower_structures:item/pirate_sword"]} } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.tower_structures.pirate_sword", "fallback": "Pirate Sword" } } ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/loot_table/items/pirate_turtle_helmet.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:turtle_helmet", "functions": [ { "function": "minecraft:set_count", "count": 1 }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_tower_structures:item/pirate_turtle_helmet"]} } }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.tower_structures.pirate_turtle_helmet", "fallback": "Pirate Turtle Helmet" } } ] } ] } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_default_spawnable.json ================================================ { "values": [ "#is_forest", "#is_jungle", "#is_taiga", "windswept_hills", "windswept_gravelly_hills", "plains", "sunflower_plains", "mushroom_fields", "meadow", "stony_peaks", "savanna_plateau", "windswept_savanna" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_desert.json ================================================ { "values": [ "desert" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/is_snowy.json ================================================ { "values": [ "minecraft:snowy_plains", "minecraft:ice_spikes", "minecraft:snowy_taiga", "minecraft:snowy_beach", "minecraft:grove", "minecraft:snowy_slopes", "minecraft:jagged_peaks", "minecraft:frozen_peaks" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_cold_frozen.json ================================================ { "values": [ "#is_mountain", "taiga", "old_growth_spruce_taiga", "old_growth_pine_taiga" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_frozen.json ================================================ { "values": [ "frozen_peaks", "snowy_plains", "snowy_taiga", "ice_spikes" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_hot.json ================================================ { "values": [ "desert", "#is_badlands" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_hot_warm.json ================================================ { "values": [ "#is_jungle", "#is_savanna" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/tags/worldgen/biome/segmented/is_warm_cold.json ================================================ { "values": [ "#is_forest", "plains", "sunflower_plains" ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/badlands.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_badlands", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/badlands", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/default.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:is_default_spawnable", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/default", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": true } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/desert.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:is_desert", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/desert", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/large_ship.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_tower_structures:tower/ocean/large_ship", "size": 2, "start_height": { "absolute": -3 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/medium_ship.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_tower_structures:tower/ocean/medium_ship", "size": 2, "start_height": { "absolute": -2 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/raft.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_tower_structures:tower/ocean/raft", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/ocean/small_ship.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#minecraft:is_ocean", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "none", "start_pool": "gm4_tower_structures:tower/ocean/small_ship", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/cold_frozen.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:segmented/is_cold_frozen", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/segmented/cold_frozen", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/frozen.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:segmented/is_frozen", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/segmented/frozen", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/hot.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:segmented/is_hot", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/segmented/hot", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 116, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/hot_warm.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:segmented/is_hot_warm", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/segmented/hot_warm", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/segmented/warm_cold.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:segmented/is_warm_cold", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/segmented/warm_cold", "size": 7, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure/snowy.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_tower_structures:is_snowy", "step": "surface_structures", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_tower_structures:tower/snowy", "size": 2, "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "max_distance_from_center": 1, "use_expansion_hack": false } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure_set/ships.json ================================================ { "structures": [ { "structure": "gm4_tower_structures:ocean/large_ship", "weight": 9 }, { "structure": "gm4_tower_structures:ocean/medium_ship", "weight": 9 }, { "structure": "gm4_tower_structures:ocean/small_ship", "weight": 10 }, { "structure": "gm4_tower_structures:ocean/raft", "weight": 10 } ], "placement": { "type": "minecraft:random_spread", "salt": 1800186508, "spacing": 17, "separation": 5 } } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/structure_set/towers.json ================================================ { "structures": [ { "structure": "gm4_tower_structures:badlands", "weight": 6 }, { "structure": "gm4_tower_structures:default", "weight": 6 }, { "structure": "gm4_tower_structures:desert", "weight": 6 }, { "structure": "gm4_tower_structures:snowy", "weight": 6 }, { "structure": "gm4_tower_structures:segmented/cold_frozen", "weight": 10 }, { "structure": "gm4_tower_structures:segmented/frozen", "weight": 10 }, { "structure": "gm4_tower_structures:segmented/hot_warm", "weight": 10 }, { "structure": "gm4_tower_structures:segmented/hot", "weight": 10 }, { "structure": "gm4_tower_structures:segmented/warm_cold", "weight": 10 } ], "placement": { "type": "minecraft:random_spread", "salt": 1948932716, "spacing": 30, "separation": 12, "frequency": 0.8 } } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/cold_frozen/middle.json ================================================ { "name": "gm4_tower_structures:segment/cold_frozen/middle", "fallback": "minecraft:empty", "elements": [ { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/middle/frozen/1", "processors": "minecraft:empty" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/middle/frozen/2", "processors": "minecraft:empty" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/middle/cold/1", "processors": "minecraft:empty" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/middle/cold/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/cold_frozen/top.json ================================================ { "name": "gm4_tower_structures:segment/cold_frozen/top", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/top/2", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/top/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/frozen/middle.json ================================================ { "name": "gm4_tower_structures:segment/frozen/middle", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/middle/frozen/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/middle/frozen/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/frozen/top.json ================================================ { "name": "gm4_tower_structures:segment/frozen/top", "fallback": "minecraft:empty", "elements": [ { "weight": 4, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/top/1", "processors": "minecraft:empty" } }, { "weight": 4, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/top/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot/middle.json ================================================ { "name": "gm4_tower_structures:segment/hot/middle", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/middle/hot/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/middle/hot/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot/top.json ================================================ { "name": "gm4_tower_structures:segment/hot/top", "fallback": "minecraft:empty", "elements": [ { "weight": 4, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/top/1", "processors": "minecraft:empty" } }, { "weight": 4, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/top/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot_warm/middle.json ================================================ { "name": "gm4_tower_structures:segment/hot_warm/middle", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/middle/warm/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/middle/warm/2", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/middle/hot/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/middle/hot/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/hot_warm/top.json ================================================ { "name": "gm4_tower_structures:segment/hot_warm/top", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/top/2", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/top/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/warm_cold/middle.json ================================================ { "name": "gm4_tower_structures:segment/warm_cold/middle", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/middle/cold/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/middle/cold/2", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/middle/warm/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/middle/warm/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/segment/warm_cold/top.json ================================================ { "name": "gm4_tower_structures:segment/warm_cold/top", "fallback": "minecraft:empty", "elements": [ { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/top/2", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/top/1", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/top/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/spawner/ship.json ================================================ { "name": "gm4_orbis:spawner/default", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/drowned_up" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/drowned_side" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/drowned_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_bow_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_bow_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_bow_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_sword_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_sword_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_tower_structures:spawner/ship/skeleton_sword_down" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/large_ship/features.json ================================================ { "name": "gm4_tower_structures:subpart/large_ship/features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/features/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/features/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/features/3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/features/4", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/large_ship/sail.json ================================================ { "name": "gm4_tower_structures:subpart/large_ship/sail", "fallback": "minecraft:empty", "elements": [ { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/black", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/brown", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/cyan", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/green", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/light_blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/light_grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/lime", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/magenta", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/orange", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/pink", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/purple", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/red", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/white", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/sail/yellow", "processors": "minecraft:empty" }, "weight": 1 } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/medium_ship/features.json ================================================ { "name": "gm4_tower_structures:subpart/medium_ship/features", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/features/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/features/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/features/3", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/features/4", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/medium_ship/sail.json ================================================ { "name": "gm4_tower_structures:subpart/medium_ship/sail", "fallback": "minecraft:empty", "elements": [ { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/black", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/brown", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/cyan", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/green", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/light_blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/light_grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/lime", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/magenta", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/orange", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/pink", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/purple", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/red", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/white", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/sail/yellow", "processors": "minecraft:empty" }, "weight": 1 } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/raft_sail.json ================================================ { "name": "gm4_tower_structures:subpart/raft_sail", "fallback": "minecraft:empty", "elements": [ { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/black", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/brown", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/cyan", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/green", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/light_blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/light_grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/lime", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/magenta", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/orange", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/pink", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/purple", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/red", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/white", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/sail/yellow", "processors": "minecraft:empty" }, "weight": 1 } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/subpart/small_ship_sail.json ================================================ { "name": "gm4_tower_structures:subpart/small_ship_sail", "fallback": "minecraft:empty", "elements": [ { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/black", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/brown", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/cyan", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/green", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/light_blue", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/light_grey", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/lime", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/magenta", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/orange", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/pink", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/purple", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/red", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/white", "processors": "minecraft:empty" }, "weight": 1 }, { "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/sail/yellow", "processors": "minecraft:empty" }, "weight": 1 } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/badlands.json ================================================ { "name": "gm4_tower_structures:badlands", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/badlands/acacia", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/badlands/basic", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:terracotta", "probability": 0.25 }, "output_state": { "Name": "minecraft:orange_terracotta" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:terracotta", "probability": 0.333 }, "output_state": { "Name": "minecraft:red_terracotta" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/badlands/sandy", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/badlands/tall", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_red_sandstone", "probability": 0.1 }, "output_state": { "Name": "minecraft:smooth_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_red_sandstone", "probability": 0.04 }, "output_state": { "Name": "minecraft:chiseled_red_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_red_sandstone", "probability": 0.9 }, "output_state": { "Name": "minecraft:red_sandstone" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/acacia", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/default.json ================================================ { "name": "gm4_tower_structures:default", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/basic", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone", "probability": 0.08 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone", "probability": 0.16 }, "output_state": { "Name": "minecraft:cobblestone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone", "probability": 0.22 }, "output_state": { "Name": "minecraft:andesite" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone", "probability": 0.12 }, "output_state": { "Name": "minecraft:polished_andesite" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/cobblestone1", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/cobblestone2", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/diorite", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/granite", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/small", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/small2", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/tall", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.2 }, "output_state": { "Name": "minecraft:cracked_stone_bricks" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:stone_bricks", "probability": 0.07 }, "output_state": { "Name": "minecraft:polished_andesite" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobblestone", "probability": 0.04 }, "output_state": { "Name": "minecraft:stone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobblestone", "probability": 0.15 }, "output_state": { "Name": "minecraft:gravel" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cobblestone", "probability": 0.87 }, "output_state": { "Name": "minecraft:andesite" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/diorite_dark", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/default/spruce", "processors": "empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/acacia", "processors": "empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/desert.json ================================================ { "name": "gm4_tower_structures:default", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/desert/basic", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:smooth_sandstone", "probability": 0.25 }, "output_state": { "Name": "minecraft:sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:smooth_sandstone", "probability": 0.10 }, "output_state": { "Name": "minecraft:cut_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:smooth_sandstone", "probability": 0.10 }, "output_state": { "Name": "minecraft:chiseled_sandstone" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/desert/sandstone", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/desert/tall", "processors": { "processors": [ { "processor_type": "minecraft:rule", "rules": [ { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_sandstone", "probability": 0.2 }, "output_state": { "Name": "minecraft:smooth_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_sandstone", "probability": 0.07 }, "output_state": { "Name": "minecraft:chiseled_sandstone" } }, { "location_predicate": { "predicate_type": "minecraft:always_true" }, "input_predicate": { "predicate_type": "minecraft:random_block_match", "block": "minecraft:cut_sandstone", "probability": 0.8 }, "output_state": { "Name": "minecraft:sandstone" } } ] } ] } } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/large_ship.json ================================================ { "name": "gm4_tower_structures:tower/ocean/large_ship", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/large_ship/base", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/medium_ship.json ================================================ { "name": "gm4_tower_structures:tower/ocean/medium_ship", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/medium_ship/base", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/raft.json ================================================ { "name": "gm4_tower_structures:tower/ocean/raft", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/raft/base", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/ocean/small_ship.json ================================================ { "name": "gm4_tower_structures:tower/ocean/small_ship", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/ocean/small_ship/base", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/cold_frozen.json ================================================ { "name": "gm4_tower_structures:segmented/cold", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/base/frozen/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/base/frozen/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/base/cold/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/base/cold/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/frozen.json ================================================ { "name": "gm4_tower_structures:segmented/hot", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/base/frozen/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/frozen/base/frozen/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/hot.json ================================================ { "name": "gm4_tower_structures:segmented/hot", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/base/hot/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/base/hot/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/hot_warm.json ================================================ { "name": "gm4_tower_structures:segmented/hot", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/base/warm/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/hot/base/warm/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/base/hot/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/base/hot/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/segmented/warm_cold.json ================================================ { "name": "gm4_tower_structures:segmented/warm", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/base/cold/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/warm/base/cold/2", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/base/warm/1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:segmented/cold/base/warm/2", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/data/gm4_tower_structures/worldgen/template_pool/tower/snowy.json ================================================ { "name": "gm4_tower_structures:snowy", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/snowy/basic", "processors": { "processors": [ { "processor_type": "rule", "rules": [ { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:ice", "probability": 0.2 }, "output_state": { "Name": "minecraft:packed_ice" } }, { "location_predicate": { "predicate_type": "always_true" }, "input_predicate": { "predicate_type": "random_block_match", "block": "minecraft:ice", "probability": 0.8 }, "output_state": { "Name": "minecraft:snow_block" } } ] } ] } } }, { "weight": 1, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "location": "gm4_tower_structures:tower/snowy/boxy", "processors": "minecraft:empty" } } ] } ================================================ FILE: gm4_tower_structures/translations.csv ================================================ key,en_us item.gm4.tower_structures.pirate_sword,Pirate Sword item.gm4.tower_structures.pirate_turtle_helmet,Pirate Turtle Helmet item.gm4.tower_structures.pirate_hat,Pirate Hat item.gm4.tower_structures.pirate_bow,Pirate Bow text.gm4.guidebook.module_desc.tower_structures,A custom terrain expansion pack that adds new tower structures to the world. text.gm4.guidebook.tower_structures.description,Towers can be found on the surface.\n\nThese towers contain rare loot and special spawners. text.gm4.guidebook.tower_structures.description.types,"Stone towers can be found in most biomes.\n\nThe Badlands, Desert, and Snowy biomes have special towers that match the terrain.\n\nOcean dungeons and ships can be found at sea." ================================================ FILE: gm4_towering_trees/README.md ================================================ # Towering Trees Adds mega and small tree variants to any sapling that is missing one! ![Mega Oak Tree](images/towering_trees.png) ### Features - Adds mega and small tree variants to any vanilla sapling that is missing one. - Grow a mega mangrove tree and admire it! Or chop it down, your choice! - Works with natural growth or bonemeal, no special interaction required, just plant a 2x2 of saplings! ================================================ FILE: gm4_towering_trees/assets/translations.csv ================================================ key,en_us,de_de,en_ws text.gm4.guidebook.towering_trees.description,"Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\n\nDark Oak and Pale Oak have small variants." text.gm4.guidebook.module_desc.towering_trees,"Adds mega and small tree variants to any sapling that is missing one!" ================================================ FILE: gm4_towering_trees/beet.yaml ================================================ id: gm4_towering_trees name: Towering Trees version: 1.1.X data_pack: load: . pipeline: - gm4_towering_trees.generate - gm4.plugins.extend.module - gm4.plugins.include.lib_trees meta: gm4: versioning: required: lib_trees: 1.5.0 website: description: Adds mega and small tree variants to any sapling that is missing one! recommended: - gm4_metallurgy wiki: https://wiki.gm4.co/wiki/Towering_Trees credits: Creator: - Djones - Kyrius Tree Structures: - BPR - rednls - Dinoguin_Jess - Lune6 ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/advancement/place_sapling.json ================================================ { "criteria": { "place_sapling": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": "#gm4_towering_trees:supported_sapling" } } ] } } }, "rewards": { "function": "gm4_towering_trees:place_sapling" } } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/check_for_mega_tree.mcfunction ================================================ # check what orientation this big tree has (if it is a big tree) # @s = sapling marker # located at @s # run from generate_tree # SE = 1 execute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~1 ~1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 1 # NE = 2 execute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~-1 ~1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 2 # SW = 3 execute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~1 ~-1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 3 # NW = 4 execute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~-1 ~-1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 4 return 0 ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/clear_sapling.mcfunction ================================================ # removes this sapling so features can be placed # @s = sapling marker # at @s # run from generate_mega_tree # run from generate_small_tree execute if block ~ ~ ~ mangrove_propagule[waterlogged=true] run tag @s add gm4_mangrove_tree_sapling.waterlogged execute unless entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run fill ~ ~ ~ ~ ~ ~ air replace #gm4_towering_trees:supported_sapling execute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ water ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_mega_tree.mcfunction ================================================ # generates the tree - mega # @s = sapling marker # located at @s (offset to be at the negative corner of the 2x2) # run from generate_tree # towering execute if entity @s[tag=gm4_oak_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/oak/pick_variant execute if entity @s[tag=gm4_acacia_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/acacia/pick_variant execute if entity @s[tag=gm4_cherry_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/cherry/pick_variant execute if entity @s[tag=gm4_mangrove_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/mangrove/pick_variant execute if entity @s[tag=gm4_birch_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/birch/pick_variant # vanilla - needs to remove the saplings first so they can be placed execute align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:clear_sapling execute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:pale_oak_bonemeal execute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:dark_oak # replace sapling if placement failed execute if score $tree_placed gm4_towering_trees_data matches 0 align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:replace_sapling ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_small_tree.mcfunction ================================================ # generates the tree - small # @s = sapling marker # located at @s # run from generate_tree # remove sapling to clear the space function gm4_towering_trees:clear_sapling # vanilla execute if entity @s[tag=gm4_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:oak execute if entity @s[tag=gm4_acacia_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:acacia execute if entity @s[tag=gm4_cherry_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:cherry execute if entity @s[tag=gm4_mangrove_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:mangrove execute if entity @s[tag=gm4_birch_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:birch # towering execute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/pale_oak/pick_variant execute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/dark_oak/pick_variant # replace sapling if placement failed execute if score $tree_placed gm4_towering_trees_data matches 0 run function gm4_towering_trees:replace_sapling ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree.mcfunction ================================================ # generates the tree # @s = sapling marker # located at @s # run from gm4_towering_trees:verify/generate_tree scoreboard players set $tree_placed gm4_towering_trees_data 0 # check if this is a big tree execute store result score $big_tree gm4_towering_trees_data run function gm4_towering_trees:check_for_mega_tree # generate mega tree positionionally based on which sapling grew execute if score $big_tree gm4_towering_trees_data matches 1 run function gm4_towering_trees:generate_mega_tree execute if score $big_tree gm4_towering_trees_data matches 2 positioned ~ ~ ~-1 run function gm4_towering_trees:generate_mega_tree execute if score $big_tree gm4_towering_trees_data matches 3 positioned ~-1 ~ ~ run function gm4_towering_trees:generate_mega_tree execute if score $big_tree gm4_towering_trees_data matches 4 positioned ~-1 ~ ~-1 run function gm4_towering_trees:generate_mega_tree # small trees execute if score $big_tree gm4_towering_trees_data matches 0 run function gm4_towering_trees:generate_small_tree # remove the saplings execute if score $tree_placed gm4_towering_trees_data matches 1 run kill @e[type=marker,tag=gm4_towering_trees_sapling.target,limit=4,distance=..3] ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/extra.mcfunction ================================================ # extra function for mangrove trees # @s = sapling marker # located at @s # run from generate_tree_type/mangrove/place_tree # remove the saplings, this doesn't always happen for mangrove trees fill ~ ~ ~ ~1 ~ ~1 air replace mangrove_propagule[waterlogged=false] fill ~ ~ ~ ~1 ~ ~1 water replace mangrove_propagule[waterlogged=true] # place the roots after 1 tick to allow markers to load in schedule function gm4_towering_trees:generate_tree_type/mangrove/roots/schedule 1t ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop.mcfunction ================================================ # build mangrove tree roots # @s = mangrove tree root marker # at @s positioned ^ ^-y ^z, randomly offset # run from generate_tree_type/mangrove/roots/start # run from here # if block cannot be replaced with root or max length was reached return execute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail scoreboard players remove $max_length gm4_towering_trees_data 1 execute unless score $max_length gm4_towering_trees_data matches 1.. run return fail # fill with muddy / waterlogged / normal roots fill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud fill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water execute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots # random carpets execute if predicate {condition:"random_chance",chance:0.5} run fill ~ ~1 ~ ~ ~1 ~ moss_carpet replace #air # small chance to skew to ground from now on execute if predicate {condition:"random_chance",chance:0.02} run tag @s add gm4_towering_trees.mangrove_root_skewed # pick direction execute if predicate {condition:"random_chance",chance:0.8} positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop execute if score $max_distance_from_tree gm4_towering_trees_data matches 0 positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop # if skewed to ground start a loop down if the root is going forward scoreboard players set $max_skew_length gm4_towering_trees_data 5 execute if entity @s[tag=gm4_towering_trees.mangrove_root_skewed] positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground scoreboard players remove $max_distance_from_tree gm4_towering_trees_data 1 execute positioned ^ ^ ^1 run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop_to_ground.mcfunction ================================================ # build mangrove tree roots # @s = mangrove tree root marker # at @s positioned ^ ^-y ^z, randomly offset, then positioned ~ ~-n ~ # run from generate_tree_type/mangrove/roots/loop # run from here # if block cannot be replaced with root return execute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail scoreboard players remove $max_skew_length gm4_towering_trees_data 1 execute unless score $max_skew_length gm4_towering_trees_data matches 1.. run return fail # fill with (muddy) roots fill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud fill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water execute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots # go down to ground execute positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/schedule.mcfunction ================================================ # look for mangrove tree root markers # @s = unspecified # at unspecified # run from generate_tree_type/mangrove/extra execute as @e[type=marker,tag=gm4_towering_trees.mangrove_root] at @s run function gm4_towering_trees:generate_tree_type/mangrove/roots/start ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/start.mcfunction ================================================ # build mangrove tree roots # @s = mangrove tree root marker # at @s # run from generate_tree_type/mangrove/roots/schedule scoreboard players set $max_distance_from_tree gm4_towering_trees_data 7 scoreboard players set $max_length gm4_towering_trees_data 16 function gm4_towering_trees:generate_tree_type/mangrove/roots/loop kill @s ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/init.mcfunction ================================================ execute unless score towering_trees gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Towering Trees"} execute unless score towering_trees gm4_earliest_version < towering_trees gm4_modules run scoreboard players operation towering_trees gm4_earliest_version = towering_trees gm4_modules scoreboard players set towering_trees gm4_modules 1 # to tree or not to tree # scoreboards and constants scoreboard objectives add gm4_towering_trees_data dummy #$moduleUpdateList ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/initialize_sapling.mcfunction ================================================ # initializes the vanilla tree's marker # @s = player who placed down the vanilla tree sapling # located at the center of the placed sapling # run from verify/initialize_sapling # summon marker # spruce and jungle are not included as they already have both variants of tree execute if block ~ ~ ~ oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ birch_sapling run summon marker ~ ~ ~ {CustomName:"gm4_birch_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_birch_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ acacia_sapling run summon marker ~ ~ ~ {CustomName:"gm4_acacia_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_acacia_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ dark_oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_dark_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_dark_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ cherry_sapling run summon marker ~ ~ ~ {CustomName:"gm4_cherry_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_cherry_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ pale_oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_pale_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_pale_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} execute if block ~ ~ ~ mangrove_propagule run summon marker ~ ~ ~ {CustomName:"gm4_mangrove_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_mangrove_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} # set stage requirement (higher = longer to grow) scoreboard players set @e[type=marker,tag=gm4_towering_trees_sapling,distance=..0.1] gm4_sap_growth 2 ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/place_sapling.mcfunction ================================================ # Initiates the search for the placed sapling # @s = player that just placed a custom sapling # at @s advancement revoke @s only gm4_towering_trees:place_sapling # have to engage lib_trees from here since this module works with vanilla saplings function #gm4_trees:place_sapling ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/replace_sapling.mcfunction ================================================ # replaces this sapling if the tree could not be placed # @s = sapling marker # at @s # run from generate_mega_tree # run from generate_small_tree execute if entity @s[tag=gm4_oak_tree_sapling] run setblock ~ ~ ~ oak_sapling[stage=0] execute if entity @s[tag=gm4_acacia_tree_sapling] run setblock ~ ~ ~ acacia_sapling[stage=0] execute if entity @s[tag=gm4_cherry_tree_sapling] run setblock ~ ~ ~ cherry_sapling[stage=0] execute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=true] execute if entity @s[tag=!gm4_mangrove_tree_sapling.waterlogged,tag=gm4_mangrove_tree_sapling] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=false] execute if entity @s[tag=gm4_birch_tree_sapling] run setblock ~ ~ ~ birch_sapling[stage=0] execute if entity @s[tag=gm4_pale_oak_tree_sapling] run setblock ~ ~ ~ pale_oak_sapling[stage=0] execute if entity @s[tag=gm4_dark_oak_tree_sapling] run setblock ~ ~ ~ dark_oak_sapling[stage=0] ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/verify/generate_tree.mcfunction ================================================ # verifies that the sapling type is from this module # @s = gm4_tree_sapling marker # located at @s # run from gm4_trees:advance_stage via #gm4_trees:generate_tree execute if entity @s[tag=gm4_towering_trees_sapling] run function gm4_towering_trees:generate_tree ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/function/verify/initialize_sapling.mcfunction ================================================ # verifies that the sapling type is from this module # @s = player who just placed down a custom sapling # located at the center sapling block # run from gm4_trees:sapling/summon marker via #gm4_trees:initialize_sapling # this module runs on vanilla saplings, so we want to check for no specific type execute unless data storage gm4_trees:temp sapling{} align xyz unless entity @e[tag=smithed.block,dx=0,dy=0,dz=0,limit=1] positioned ~.5 ~.5 ~.5 run function gm4_towering_trees:initialize_sapling ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/guidebook/towering_trees.json ================================================ { "id": "towering_trees", "name": "Towering Trees", "module_type": "module", "icon": { "id": "minecraft:oak_sapling" }, "criteria": { "obtain_sapling": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": "#gm4_towering_trees:supported_sapling" } ] } } }, "sections": [ { "name": "towering_trees", "enable": [], "requirements": [ [ "obtain_sapling" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.towering_trees.description", "fallback": "Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\n\nDark Oak and Pale Oak have small variants." } ] ] } ] } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/tags/block/mangrove_root_replaceable.json ================================================ { "values": [ "#minecraft:air", "#minecraft:mangrove_roots_can_grow_through", "#minecraft:replaceable_by_trees" ] } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/tags/block/supported_sapling.json ================================================ { "values": [ "acacia_sapling", "birch_sapling", "cherry_sapling", "dark_oak_sapling", "mangrove_propagule", "oak_sapling", "pale_oak_sapling" ] } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/tags/block/tree_placeable.json ================================================ { "values": [ "#minecraft:air", "#minecraft:logs", "#minecraft:replaceable_by_trees", "#gm4_towering_trees:supported_sapling" ] } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/tags/item/supported_sapling.json ================================================ { "values": [ "oak_sapling", "birch_sapling", "acacia_sapling", "dark_oak_sapling", "cherry_sapling", "pale_oak_sapling", "mangrove_propagule" ] } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/leaf_litter.json ================================================ { "type": "minecraft:tree", "config": { "decorators": [ { "type": "minecraft:place_on_ground", "block_state_provider": { "type": "minecraft:weighted_state_provider", "entries": [ { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "3" } }, "weight": 1 } ] }, "height": 3, "radius": 7, "tries": 150 }, { "type": "minecraft:place_on_ground", "block_state_provider": { "type": "minecraft:weighted_state_provider", "entries": [ { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "north", "segment_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "east", "segment_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "south", "segment_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:leaf_litter", "Properties": { "facing": "west", "segment_amount": "4" } }, "weight": 1 } ] }, "height": 3, "radius": 3, "tries": 300 } ], "dirt_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } }, "foliage_placer": { "type": "minecraft:bush_foliage_placer", "height": 0, "offset": 0, "radius": 0 }, "foliage_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } }, "force_dirt": false, "ignore_vines": true, "minimum_size": { "type": "minecraft:two_layers_feature_size", "limit": 0, "lower_size": 0, "upper_size": 0 }, "trunk_placer": { "type": "minecraft:dark_oak_trunk_placer", "base_height": 0, "height_rand_a": 0, "height_rand_b": 0 }, "trunk_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } } } } ================================================ FILE: gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/pink_petals.json ================================================ { "type": "minecraft:tree", "config": { "decorators": [ { "type": "minecraft:place_on_ground", "block_state_provider": { "type": "minecraft:weighted_state_provider", "entries": [ { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "3" } }, "weight": 1 } ] }, "height": 3, "radius": 7, "tries": 150 }, { "type": "minecraft:place_on_ground", "block_state_provider": { "type": "minecraft:weighted_state_provider", "entries": [ { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "1" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "2" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "3" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "north", "flower_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "east", "flower_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "south", "flower_amount": "4" } }, "weight": 1 }, { "data": { "Name": "minecraft:pink_petals", "Properties": { "facing": "west", "flower_amount": "4" } }, "weight": 1 } ] }, "height": 3, "radius": 3, "tries": 300 } ], "dirt_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } }, "foliage_placer": { "type": "minecraft:bush_foliage_placer", "height": 0, "offset": 0, "radius": 0 }, "foliage_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } }, "force_dirt": false, "ignore_vines": true, "minimum_size": { "type": "minecraft:two_layers_feature_size", "limit": 0, "lower_size": 0, "upper_size": 0 }, "trunk_placer": { "type": "minecraft:dark_oak_trunk_placer", "base_height": 0, "height_rand_a": 0, "height_rand_b": 0 }, "trunk_provider": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:air" } } } } ================================================ FILE: gm4_towering_trees/data/gm4_trees/tags/functions/generate_tree.json ================================================ { "values": [ "gm4_towering_trees:verify/generate_tree" ] } ================================================ FILE: gm4_towering_trees/data/gm4_trees/tags/functions/initialize_sapling.json ================================================ { "values": [ "gm4_towering_trees:verify/initialize_sapling" ] } ================================================ FILE: gm4_towering_trees/generate.py ================================================ from pathlib import Path from typing import Any from gm4.utils import CSV # type: ignore import json from beet import Context, subproject # type: ignore def read_json(path: Path) -> CSV: """ Reads in a json file and returns a python object representing the json. """ with open(path, mode='r') as file: json_file = json.load(file) return json_file def beet_default(ctx: Context): # read raw data tree_data: CSV = CSV.from_file(Path('gm4_towering_trees', 'tree_data.csv')) generate_tree_files(ctx, tree_data) def generate_tree_files(ctx: Context, tree_data: CSV): """ Generates tree placement functions based on parameters. """ variant_randomizer: dict[str,Any] = {} for tree in tree_data: size_x: int = tree['size_x'].as_integer() size_y: int = tree['size_y'].as_integer() size_z: int = tree['size_z'].as_integer() base_x_offset: int = tree['base_x_offset'].as_integer() * -1 base_z_offset: int = tree['base_z_offset'].as_integer() * -1 branch_height: int = tree['branch_start_height'].as_integer() - 1 is_mega: int = tree["is_mega"].as_integer() tree_type = tree['type'] type_variant = tree['variant'] variant_entry = variant_randomizer.setdefault( tree_type, {"count": 0, "variants": [], "ground_replacement": "execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~1 ~-1 ~1 dirt replace grass_block"} ) variant_entry["count"] += 1 variant_entry["variants"].append(type_variant) if tree_type == "mangrove": variant_entry["ground_replacement"] = "# mangrove trees do not replace the ground since they are placed in the air" if is_mega == 0: variant_entry["ground_replacement"] = "execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~ ~-1 ~ dirt replace grass_block" subproject_config = { "data_pack": { "load": [ { f"data/gm4_towering_trees/function/generate_tree_type/{tree['type']}/{tree['variant']}.mcfunction": "templates/place_tree.mcfunction", } ], "render": { "functions": "*" } }, "meta": { "type": tree_type, "variant": type_variant, "branch_height": branch_height, "is_mega": is_mega, "check_1_height": size_y - 1, "check_1_count": size_y * (is_mega + 1)**2, "check_2_x": size_x - 1, "check_2_height": size_y - branch_height - 1, "check_2_z": size_z - 1, "check_2_count": size_x * (size_y - branch_height) * size_z, "feature": tree['feature'], "x_offset": base_x_offset, "z_offset": base_z_offset, "x_offset_180": base_x_offset * -1 + is_mega, "z_offset_180": base_z_offset * -1 + is_mega, "x_offset_c90": base_z_offset * -1 + is_mega, "z_offset_c90": base_x_offset, "x_offset_cc90": base_z_offset, "z_offset_cc90": base_x_offset * -1 + is_mega } } ctx.require(subproject(subproject_config)) for type, data in variant_randomizer.items(): functions: str = "" index = 0 for variant in data["variants"]: index += 1 functions += f"execute if score $tree_variant gm4_towering_trees_data matches {index} run function gm4_towering_trees:generate_tree_type/{type}/{variant}\n" subproject_config = { "data_pack": { "load": [ { f"data/gm4_towering_trees/function/generate_tree_type/{type}/pick_variant.mcfunction": "templates/pick_variant.mcfunction", } ], "render": { "functions": "*" } }, "meta": { "variant_count": data["count"], "functions": functions, "ground_replacement": data["ground_replacement"] } } ctx.require(subproject(subproject_config)) ================================================ FILE: gm4_towering_trees/templates/pick_variant.mcfunction ================================================ # generates the tree - mega {{type}} # @s = sapling marker # located at @s (offset to be at the negative corner of the 2x2) # run from generate_mega_tree execute store result score $tree_variant gm4_towering_trees_data run random value 1..{{variant_count}} {{functions}} {{ground_replacement}} ================================================ FILE: gm4_towering_trees/templates/place_tree.mcfunction ================================================ # generates the tree - mega {{type}} # @s = sapling marker # located at @s (offset to be at the negative corner of the 2x2) # run from generate_tree_type/{{type}}/pick_variant # check trunk execute store result score $blocks_moved gm4_towering_trees_data positioned ~ ~ ~ run clone ~ ~ ~ ~{{is_mega}} ~{{check_1_height}} ~{{is_mega}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move execute unless score $blocks_moved gm4_towering_trees_data matches {{check_1_count}} run return fail # check box 2 execute store result score $blocks_moved gm4_towering_trees_data positioned ~{{base_x_offset}} ~{{branch_height}} ~{{base_z_offset}} run clone ~ ~ ~ ~{{check_2_x}} ~{{check_2_height}} ~{{check_2_z}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move execute unless score $blocks_moved gm4_towering_trees_data matches {{check_2_count}} run return fail # optional feature {{feature}} # place tree execute store result score $tree_rotation gm4_towering_trees_data run random value 1..4 execute if score $tree_rotation gm4_towering_trees_data matches 1 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset}} ~ ~{{z_offset}} execute if score $tree_rotation gm4_towering_trees_data matches 2 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_180}} ~ ~{{z_offset_180}} 180 execute if score $tree_rotation gm4_towering_trees_data matches 3 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_c90}} ~ ~{{z_offset_c90}} clockwise_90 execute if score $tree_rotation gm4_towering_trees_data matches 4 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_cc90}} ~ ~{{z_offset_cc90}} counterclockwise_90 # mark as placed scoreboard players set $tree_placed gm4_towering_trees_data 1 ================================================ FILE: gm4_towering_trees/tree_data.csv ================================================ type,variant,size_x,size_y,size_z,base_x_offset,base_z_offset,branch_start_height,feature,is_mega oak,a,19,14,18,8,9,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true oak,b,14,15,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true oak,c,18,15,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true oak,d,18,16,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true oak,e,14,13,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true acacia,a,16,21,14,7,6,15,#,true acacia,b,12,18,13,5,6,14,#,true acacia,c,13,22,16,6,6,17,#,true acacia,d,15,21,13,6,6,17,#,true acacia,e,13,23,14,7,6,19,#,true birch,a,10,30,10,4,4,12,#,true birch,b,10,28,10,4,4,8,#,true birch,c,10,33,10,4,4,13,#,true birch,d,10,32,10,4,4,12,#,true birch,e,10,30,10,4,4,10,#,true birch,f,10,28,10,4,4,10,#,true cherry,a,24,15,17,12,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true cherry,b,27,17,17,14,8,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true cherry,c,24,17,16,15,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true cherry,d,29,19,17,12,8,4,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true mangrove,a,16,33,14,5,8,16,function gm4_towering_trees:generate_tree_type/mangrove/extra,true mangrove,b,17,29,14,7,6,13,function gm4_towering_trees:generate_tree_type/mangrove/extra,true mangrove,c,17,30,15,5,6,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true mangrove,d,17,28,14,8,5,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true pale_oak,a,7,6,7,3,4,4,#,false pale_oak,b,7,7,7,3,3,5,#,false pale_oak,c,8,8,7,4,4,5,#,false pale_oak,d,8,9,7,4,3,7,#,false pale_oak,e,8,10,7,4,3,7,#,false pale_oak,f,7,7,7,4,3,5,#,false pale_oak,g,7,7,7,4,3,5,#,false pale_oak,h,7,8,8,4,4,6,#,false pale_oak,i,8,9,8,4,4,7,#,false pale_oak,j,7,10,8,3,3,8,#,false dark_oak,a,7,6,7,3,4,4,#,false dark_oak,b,7,7,7,3,3,5,#,false dark_oak,c,8,8,7,4,4,5,#,false dark_oak,d,8,9,7,4,3,7,#,false dark_oak,e,8,10,7,4,3,7,#,false dark_oak,f,7,7,7,4,3,5,#,false dark_oak,g,7,7,7,4,3,5,#,false dark_oak,h,7,8,8,4,4,6,#,false dark_oak,i,8,9,8,4,4,7,#,false dark_oak,j,7,10,8,3,3,8,#,false ================================================ FILE: gm4_tunnel_bores/README.md ================================================ ================================================ FILE: gm4_tunnel_bores/assets/translations.csv ================================================ key,en_us item.gm4.minecart.bore,Minecart with Piston advancement.gm4.tunnel_bores.title,"Isn't It ""Groundbreaking""?" advancement.gm4.tunnel_bores.description,Obtain a Minecart with Piston text.gm4.guidebook.module_desc.tunnel_bores,"Ever wondered how mineshafts came to be? This is it! Tunnel Bores allow you to easily dig 3\u2a093 tunnels, and even lay rails behind themselves." text.gm4.guidebook.tunnel_bores.description,"Tunnel Bores can be crafted to aid in excavation. Piston Minecarts will break blocks and place rails, moving forward.\n\nThey can be crafted in a crafting table." text.gm4.guidebook.tunnel_bores.crafting,Tunnel bores can be crafted as follows: text.gm4.guidebook.tunnel_bores.start_up,"Piston Minecarts are upgraded furnace minecarts and require coal as fuel. To start the bore, use a piece of coal on the bore.\n\nPiston Minecarts will mine piston-movable blocks in a 3x3 area centered at the block above it." text.gm4.guidebook.tunnel_bores.supply,These tunnel bores can place rails on solid blocks in front of it.\n\nChest Minecarts can be attached to supply the Piston Minecart with rails and coal. text.gm4.guidebook.tunnel_bores.mining,"Tunnel bores will continuously mine blocks when it hits a breakable block, but will always try to mine and refuel when on a powered activator rail.\n\nThis makes it possible to keep a stationary bore." ================================================ FILE: gm4_tunnel_bores/beet.yaml ================================================ id: gm4_tunnel_bores name: Tunnel Bores version: 1.7.X data_pack: load: . resource_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_machines meta: gm4: versioning: required: lib_machines: 1.5.0 schedule_loops: [pulse_check] model_data: - item: furnace_minecart reference: item/piston_minecart template: generated - item: piston reference: gui/advancement/tunnel_bores template: name: advancement forward: item/piston_minecart website: description: Ever wondered how mineshafts came to be? This is it! Tunnel Bores allow you to easily dig 3⨉3 tunnels, and even lay rails behind themselves. recommended: - gm4_ziprails - gm4_vertical_rails notes: [] modrinth: project_id: L32wQVcn wiki: https://wiki.gm4.co/wiki/Tunnel_Bores credits: Creator: - Bloo Updated by: - Bloo - BPR Icon Design: - Hozz ================================================ FILE: gm4_tunnel_bores/data/gm4/advancement/tunnel_bores.json ================================================ { "display": { "icon": { "id": "piston", "components": { "minecraft:custom_model_data": {"strings":["gm4_tunnel_bores:gui/advancement/tunnel_bores"]} } }, "title": { "translate": "advancement.gm4.tunnel_bores.title", "fallback": "Isn't It \"Groundbreaking\"?" }, "description": { "translate": "advancement.gm4.tunnel_bores.description", "fallback": "Obtain a Minecart with Piston", "color": "gray" } }, "parent": "gm4:root", "criteria": { "obtain_tunnel_bore": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:furnace_minecart" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"tunnel_bore\"}}" } } ] } } } } ================================================ FILE: gm4_tunnel_bores/data/gm4_machines/tags/function/destroy_cart.json ================================================ { "values": [ "gm4_tunnel_bores:machine/verify_destroy_cart" ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_machines/tags/function/place_cart.json ================================================ { "values": [ "gm4_tunnel_bores:machine/verify_place_cart" ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/advancement/recipes/piston_minecart.json ================================================ { "parent": "minecraft:recipes/root", "criteria": { "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_tunnel_bores:piston_minecart" } }, "has_the_minecart_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { "recipe": "gm4_tunnel_bores:piston_minecart_from_furnace_minecart" } }, "has_materials": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:furnace", "minecraft:minecart", "minecraft:furnace_minecart", "minecraft:piston" ] } ] } } }, "requirements": [ [ "has_the_recipe", "has_the_minecart_recipe", "has_materials" ] ], "rewards": { "recipes": [ "gm4_tunnel_bores:piston_minecart", "gm4_tunnel_bores:piston_minecart_from_furnace_minecart" ] } } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/activator_rail/force_mine.mcfunction ================================================ # @s = tunnel bores on powered activator rail # at world spawn # called by gm4_tunnel_bores:bore/check_cart_environment # force try refuel function gm4_tunnel_bores:bore/item_consumption/fuel/check_fuel_level # perform mining operation execute at @s align xyz positioned ~.5 ~.5 ~.5 run function gm4_tunnel_bores:bore/mine/break_block ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/check_cart_environment.mcfunction ================================================ # @s = tunnel bores on top of #minecraft:rails # at @s # called by gm4_tunnel_bores:bore/tunnel_bore_5hz # check for rails ahead of the cart and initiate rail placement. Use at @s to adjust position to updated rotation execute if block ^ ^ ^1 #gm4_tunnel_bores:rail_replacable as @e[type=area_effect_cloud,tag=gm4_bore_storage,distance=..0.5,limit=1,sort=nearest] run function gm4_tunnel_bores:bore/item_consumption/rail/handle_rail # stop cart if rail placement failed execute if score placed_rail gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/mine/stop_cart # force mine execute if entity @s[tag=!gm4_tunnel_bore_on_cooldown] if block ~ ~ ~ minecraft:activator_rail[powered=true] run function gm4_tunnel_bores:bore/activator_rail/force_mine # reset fake player scoreboard players reset placed_rail gm4_bore_rail ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/clear_rotation.mcfunction ================================================ # @s = tunnel bores that left their tracks # at world spawn # called by gm4_tunnel_bores:update_direction data merge entity @s {DisplayState:{Properties:{facing:"up"}}} tag @s remove gm4_tunnel_bore_south tag @s remove gm4_tunnel_bore_north tag @s remove gm4_tunnel_bore_east tag @s remove gm4_tunnel_bore_west ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/restore_previous_direction.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:bore/direction/store_push_east_west and gm4_tunnel_bores:bore/direction/store_push_north_south # check cart fuel level execute store result score Fuel gm4_bore_fuel run data get entity @s Fuel # restore direction if cart still has fuel execute if score Fuel gm4_bore_fuel matches 1.. run scoreboard players operation @s gm4_bore_data = previous_direction gm4_bore_data ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/store_push_east_west.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:bore/direction/update_direction # get force values execute store result score PushX gm4_bore_data run data get entity @s PushX 10 # check force direction (+/-) and store to scoreboard execute if score PushX gm4_bore_data matches 9.. run scoreboard players set @s gm4_bore_data -90 execute if score PushX gm4_bore_data matches ..-9 run scoreboard players set @s gm4_bore_data 90 # keep previous direction, if code couldn't decide on new one and the previous direction alligns with rail beneath execute if score @s gm4_bore_data matches -1 unless score previous_direction gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/restore_previous_direction ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/store_push_north_south.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:bore/direction/update_direction # get force values execute store result score PushZ gm4_bore_data run data get entity @s PushZ 10 # check force direction (+/-) and store to scoreboard execute if score PushZ gm4_bore_data matches 9.. run scoreboard players set @s gm4_bore_data 0 execute if score PushZ gm4_bore_data matches ..-9 run scoreboard players set @s gm4_bore_data 180 # keep previous direction, if code couldn't decide on new one and the previous direction alligns with rail beneath execute if score @s gm4_bore_data matches -1 unless score previous_direction gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/restore_previous_direction ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_direction.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:bore/tunnel_bore_5hz # store previous direction for use in gm4_tunnel_bores:bore/direction/store_push_east_west and gm4_tunnel_bores:bore/direction/store_push_north_south scoreboard players operation previous_direction gm4_bore_data = @s gm4_bore_data # clear tunnel bore orientation tags and visuals if not on valid rails execute at @s if score @s gm4_bore_data matches -1 unless entity @s[tag=!gm4_tunnel_bore_south,tag=!gm4_tunnel_bore_west,tag=!gm4_tunnel_bore_east,tag=!gm4_tunnel_bore_north] run function gm4_tunnel_bores:bore/direction/clear_rotation # set direction to -1. This will stay if cart is not on a valid rail scoreboard players set @s gm4_bore_data -1 # check rail facing to determine orientation execute at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] run function gm4_tunnel_bores:bore/direction/store_push_east_west execute at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] run function gm4_tunnel_bores:bore/direction/store_push_north_south # update rotation vector execute unless score @s gm4_bore_data matches -1 run function gm4_tunnel_bores:bore/direction/update_rotation ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:update_direction execute if entity @s[tag=!gm4_tunnel_bore_south] if score @s gm4_bore_data matches 0 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_south execute if entity @s[tag=!gm4_tunnel_bore_west] if score @s gm4_bore_data matches 90 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_west execute if entity @s[tag=!gm4_tunnel_bore_east] if score @s gm4_bore_data matches -90 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_east execute if entity @s[tag=!gm4_tunnel_bore_north] if score @s gm4_bore_data matches 180 at @s run function gm4_tunnel_bores:bore/direction/update_rotation_north execute if score @s gm4_bore_data matches 0 at @s run tp @s ~ ~ ~ 0 ~ execute if score @s gm4_bore_data matches 90 at @s run tp @s ~ ~ ~ 90 ~ execute if score @s gm4_bore_data matches -90 at @s run tp @s ~ ~ ~ -90 ~ execute if score @s gm4_bore_data matches 180 at @s run tp @s ~ ~ ~ 180 ~ ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_east.mcfunction ================================================ # @s = tunnel bores on tracks facing east # at world spawn # called by gm4_tunnel_bores:update_rotation data merge entity @s {DisplayState:{Properties:{facing:"south"}}} tag @s add gm4_tunnel_bore_east tag @s remove gm4_tunnel_bore_west tag @s remove gm4_tunnel_bore_south tag @s remove gm4_tunnel_bore_north ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_north.mcfunction ================================================ # @s = tunnel bores on tracks facing north # at world spawn # called by gm4_tunnel_bores:update_rotation data merge entity @s {DisplayState:{Properties:{facing:"north"}}} tag @s add gm4_tunnel_bore_north tag @s remove gm4_tunnel_bore_east tag @s remove gm4_tunnel_bore_west tag @s remove gm4_tunnel_bore_south ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_south.mcfunction ================================================ # @s = tunnel bores on tracks facing south # at world spawn # called by gm4_tunnel_bores:update_rotation data merge entity @s {DisplayState:{Properties:{facing:"south"}}} tag @s add gm4_tunnel_bore_south tag @s remove gm4_tunnel_bore_east tag @s remove gm4_tunnel_bore_west tag @s remove gm4_tunnel_bore_north ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/direction/update_rotation_west.mcfunction ================================================ # @s = tunnel bores on tracks facing west # at world spawn # called by gm4_tunnel_bores:update_rotation data merge entity @s {DisplayState:{Properties:{facing:"north"}}} tag @s add gm4_tunnel_bore_west tag @s remove gm4_tunnel_bore_east tag @s remove gm4_tunnel_bore_south tag @s remove gm4_tunnel_bore_north ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/check_fuel_level.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:bore/mine/auto_mine on a 2.9 min slow clock and by gm4_tunnel_bores:bore/activator_rail/force_mine when a cart is on an activator rail # get fuel level from nbt if this wasn't done in gm4_tunnel_bores:bore/direction/restore_previous_direction execute unless score Fuel gm4_bore_fuel matches 1.. store result score Fuel gm4_bore_fuel run data get entity @s Fuel # look for coal and charcoal execute if score Fuel gm4_bore_fuel matches 1..3600 run function gm4_tunnel_bores:bore/item_consumption/fuel/search_fuel # clear fuel score scoreboard players reset Fuel gm4_bore_fuel ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_charcoal.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/fuel/load_charcoal # use one charcoal item execute store result storage gm4_tunnel_bores:bore_container Items[0].count byte 1 run data get storage gm4_tunnel_bores:bore_container Items[0].count 0.99 # return items into supply cart data modify entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items append from storage gm4_tunnel_bores:bore_container Items[0] # add fuel to bore execute store result entity @s Fuel short 1 run scoreboard players operation Fuel gm4_bore_fuel += #3600 gm4_bore_fuel # clean up storage data remove storage gm4_tunnel_bores:bore_container Items ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_coal.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/fuel/load_coal # use one coal item execute store result storage gm4_tunnel_bores:bore_container Items[0].count byte 1 run data get storage gm4_tunnel_bores:bore_container Items[0].count 0.99 # return items into supply cart data modify entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items append from storage gm4_tunnel_bores:bore_container Items[0] # add fuel to bore execute store result entity @s Fuel short 1 run scoreboard players operation Fuel gm4_bore_fuel += #3600 gm4_bore_fuel # clean up storage data remove storage gm4_tunnel_bores:bore_container Items ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/found_supply_cart.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/fuel/search_fuel # check and try to fuel using charcoal function gm4_tunnel_bores:bore/item_consumption/fuel/load_charcoal # if still out of fuel, look for coal execute if score Fuel gm4_bore_fuel matches 1..3600 run function gm4_tunnel_bores:bore/item_consumption/fuel/load_coal # revoke tag tag @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] remove gm4_bore_supply_minecart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/load_charcoal.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart # copy the last stone slot to a temp array execute store success score found_charcoal gm4_bore_fuel run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:"minecraft:charcoal"}] # refuel if charcoal was found execute if score found_charcoal gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_charcoal ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/load_coal.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart # copy the last stone slot to a temp array execute store success score found_coal gm4_bore_fuel run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:"minecraft:coal"}] # refuel if coal was found execute if score found_coal gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_coal ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/fuel/search_fuel.mcfunction ================================================ # @s = tunnel bores with low fuel # at world spawn # called by gm4_tunnel_bores:bore/item_consumption/check_fuel_level # find nearby chest minecart execute at @s align xyz positioned ~.5 ~.5 ~.5 store success score found_supply_cart gm4_bore_fuel run tag @e[type=minecraft:chest_minecart,distance=..1.4,limit=1] add gm4_bore_supply_minecart # if a supply cart was found, continue fueling operation execute if score found_supply_cart gm4_bore_fuel matches 1.. run function gm4_tunnel_bores:bore/item_consumption/fuel/found_supply_cart # play horn sound if cart is nearly out of fuel and couldn't find any to refuel. Only do this when this function is called by a 2.9 fuel check, not an activator rail. execute if score Fuel gm4_bore_fuel matches 1..3600 if score refuel_clock gm4_bore_fuel matches 220.. at @s run playsound block.note_block.flute neutral @a[distance=..16] ~ ~ ~ 1 0.6 0 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/check_solidity.mcfunction ================================================ # @s = tunnel bore storage aec that has a rail to place # at tunnel bore minecart # called by gm4_tunnel_bores:bore/item_consumption/rail/handle_rail # remember that the bore tried to place a rail scoreboard players set placed_rail gm4_bore_rail 0 # place a rail if there is a support block beneath execute unless block ^ ^-1 ^1 #gm4_tunnel_bores:not_rail_solid run function gm4_tunnel_bores:bore/item_consumption/rail/place_rail ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/found_rail.mcfunction ================================================ # @s = bore aec that found rails in a supply cart # at bore minecart (aligned to block center) # run from gm4_tunnel_bores:bore/item_consumption/rail/found_supply_cart # load rails into AEC score execute store result score @s gm4_bore_rail run data get storage gm4_tunnel_bores:bore_container Items[0].count # delete rail items in original inventory data remove entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[0] # clean up storage data remove storage gm4_tunnel_bores:bore_container Items ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/found_supply_cart.mcfunction ================================================ # @s = bore aec that found rails in a supply cart # at bore minecart (aligned to block center) # run from gm4_tunnel_bores:bore/item_consumption/rail/load_rail # Copy the last rail item into temporary inventory execute store success score found_rail gm4_bore_rail run data modify storage gm4_tunnel_bores:bore_container Items[] set from entity @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart,limit=1] Items[{id:"minecraft:rail"}] # get the count in a scoreboard and deplete stack execute if score found_rail gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/found_rail # revoke tag tag @e[type=minecraft:chest_minecart,tag=gm4_bore_supply_minecart] remove gm4_bore_supply_minecart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/handle_rail.mcfunction ================================================ # @s = tunnel bore storage aec that has a rail to place # at tunnel bore minecart # called by gm4_tunnel_bores:bore/mine/break block and gm4_tunnel_bores:bore/check_cart_environment execute if score @s gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/item_consumption/rail/load_rail execute if score @s gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/check_solidity ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/load_rail.mcfunction ================================================ # @s = bore aec without rails looking for more rails # at bore minecart (aligned to block center) # run from gm4_tunnel_bores:bore/item_consumption/rail/handle_rail # find nearby chest minecart execute store success score found_supply_cart gm4_bore_rail run tag @e[type=minecraft:chest_minecart,distance=..1.4,limit=1] add gm4_bore_supply_minecart # continue rail loading operation if a supply cart was found execute if score found_supply_cart gm4_bore_rail matches 1.. run function gm4_tunnel_bores:bore/item_consumption/rail/found_supply_cart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/item_consumption/rail/place_rail.mcfunction ================================================ # @s = tunnel bore storage aec that has a rail to place and solid groudn beneath # at tunnel bore minecart # called by gm4_tunnel_bores:bore/item_consumption/rail/check_solidity execute unless block ^ ^ ^1 #gm4:water run setblock ^ ^ ^1 rail destroy execute if block ^ ^ ^1 #gm4:water run setblock ^ ^ ^1 rail[waterlogged=true] destroy scoreboard players remove @s gm4_bore_rail 1 # playsound playsound block.lantern.place block @a[distance=..8] ~ ~ ~ 0.5 0.5 0 # store operation scoreboard players add placed_rail gm4_bore_rail 1 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/auto_mine.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:main if any bores are loaded # handles default breaking operations. === 1.25Hz === # slow clock for refueling execute if score refuel_clock gm4_bore_fuel matches 220.. run function gm4_tunnel_bores:bore/item_consumption/fuel/check_fuel_level # detect mineable object infront and start auto mining execute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 90 at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block execute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches -90 at @s if block ~ ~ ~ #minecraft:rails[shape=east_west] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block execute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 0 at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block execute unless entity @s[tag=gm4_tunnel_bore_on_cooldown] if score @s gm4_bore_data matches 180 at @s if block ~ ~ ~ #minecraft:rails[shape=north_south] align xyz positioned ~.5 ~.5 ~.5 unless block ^ ^ ^1 #gm4_tunnel_bores:unbreakable unless block ^ ^ ^1 #minecraft:rails run function gm4_tunnel_bores:bore/mine/break_block ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/break_block.mcfunction ================================================ # @s = tunnel bores with mineable block infront # at @s (aligned to block center) # called by gm4_tunnel_bores:bore/mine/auto_mine and gm4_tunnel_bores:bore/activator_rail/force_mine upon breaking operation # mine tunnel use fill to circumvent MC-163286 execute positioned ^1 ^ ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^ ^ ^1 unless block ~ ~ ~ #minecraft:rails unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^-1 ^ ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^1 ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^ ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^-1 ^1 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^1 ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^ ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy execute positioned ^-1 ^2 ^1 unless block ~ ~ ~ #gm4_tunnel_bores:unbreakable run fill ~ ~ ~ ~ ~ ~ air destroy # playsound playsound minecraft:entity.iron_golem.step block @a[distance=..8] ~ ~ ~ 0.6 0.2 0 # check for rails ahead of the cart and initiate rail placement. Use at @s to adjust position to updated rotation execute if block ^ ^ ^1 #minecraft:air as @e[type=area_effect_cloud,tag=gm4_bore_storage,distance=..0.5,limit=1,sort=nearest] run function gm4_tunnel_bores:bore/item_consumption/rail/handle_rail # stop cart if rail placement failed execute if score placed_rail gm4_bore_rail matches 0 run function gm4_tunnel_bores:bore/mine/stop_cart # reset fake player scoreboard players reset placed_rail gm4_bore_rail # put cart on cooldown tag @s add gm4_tunnel_bore_on_cooldown ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/cooldown/calculate_clock_timings.mcfunction ================================================ # no @s # at world spawn # called by gm4_tunnel_bores:init # figure out tick values in a 5 tick intervall for 5Hz clock scoreboard players operation 5hz_pulse_1 gm4_bore_data = trigger_tick gm4_bore_data scoreboard players add 5hz_pulse_1 gm4_bore_data 4 scoreboard players operation 5hz_pulse_2 gm4_bore_data = 5hz_pulse_1 gm4_bore_data scoreboard players add 5hz_pulse_2 gm4_bore_data 4 scoreboard players operation 5hz_pulse_3 gm4_bore_data = 5hz_pulse_2 gm4_bore_data scoreboard players add 5hz_pulse_3 gm4_bore_data 4 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/cooldown/clock_control.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:pulse_check on a 1.25Hz pulse # control slow clock scoreboard players add slow_clock gm4_bore_data 1 execute if score slow_clock gm4_bore_data matches 3.. run scoreboard players set slow_clock gm4_bore_data 0 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/mine/stop_cart.mcfunction ================================================ # @s = tunnel bore that failed to place a rail # at tunnel bore minecart # called by gm4_tunnel_bores:bore/mine/break_block and gm4_tunnel_bores:bore/check_cart_environment # stop cart (physically) (and visually) data merge entity @s {DisplayState:{Properties:{facing:"up"}},Motion:[0.0,0.0,0.0],PushX:0.0,PushZ:0.0} # stop cart (code flag) scoreboard players set @s gm4_bore_data -1 # sound effect and particle effect playsound minecraft:block.redstone_torch.burnout neutral @a[distance=..8] ~ ~ ~ 0.5 0.01 0 particle minecraft:poof ~ ~.3 ~ 0.1 0.2 0.1 0.01 12 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/bore/tunnel_bore_5hz.mcfunction ================================================ # @s = tunnel bores # at world spawn # called by gm4_tunnel_bores:furnace_cart_20hz # handles cart facing vector and stores push direction properly. === 5Hz === #execute if score slow_clock gm4_bore_data = trigger_tick gm4_bore_data run say 5Hz and main #execute unless score clock gm4_bore_data = trigger_tick gm4_bore_data run say 5Hz # re-activate cart after cooldown execute if score slow_clock gm4_bore_data matches 0 if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run tag @s remove gm4_tunnel_bore_on_cooldown # calculate cart movement direction and supossed bore facing function gm4_tunnel_bores:bore/direction/update_direction # DEBUG PARTICLE. ENABLE TO DEBUG CART FACING. #execute unless score @s gm4_bore_data matches -1 at @s run particle minecraft:flame ^ ^ ^1 0 0 0 0 1 force # reassign rotation if cart is ontop of rail (heading =|= -1) execute unless score @s gm4_bore_data matches -1 at @s run function gm4_tunnel_bores:bore/check_cart_environment ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/furnace_cart_20hz.mcfunction ================================================ # @s = furnace_minecart # at world spawn # called by gm4_tunnel_bores:pulse_check # handle cart orientation and environment (rail interactions, cart push direction) on 5Hz execute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz execute if score main_clock gm4_bore_data = 5hz_pulse_1 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz execute if score main_clock gm4_bore_data = 5hz_pulse_2 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz execute if score main_clock gm4_bore_data = 5hz_pulse_3 gm4_bore_data if entity @s[tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/tunnel_bore_5hz ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/init.mcfunction ================================================ # init module scoreboards scoreboard objectives add gm4_bore_data dummy scoreboard players set trigger_tick gm4_bore_data 0 scoreboard players set #-1 gm4_bore_data -1 function gm4_tunnel_bores:bore/mine/cooldown/calculate_clock_timings scoreboard objectives add gm4_bore_fuel dummy scoreboard players set #3600 gm4_bore_fuel 3600 scoreboard objectives add gm4_bore_rail dummy # base execute unless score tunnel_bores gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Tunnel Bores"} execute unless score tunnel_bores gm4_earliest_version < tunnel_bores gm4_modules run scoreboard players operation tunnel_bores gm4_earliest_version = tunnel_bores gm4_modules scoreboard players set tunnel_bores gm4_modules 1 schedule function gm4_tunnel_bores:pulse_check 10t #$moduleUpdateList ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/create_cart.mcfunction ================================================ # places the tunnel_bore down # @s = hopper_minecart with the tunnel_bore name # located at @s # run from gm4_tunnel_bores:machine/verify_place_cart scoreboard players set $placed_block gm4_machine_data 1 # summon new command block minecart summon furnace_minecart ~ ~ ~ {CustomName:{"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"},DisplayState:{Name:"minecraft:piston",Properties:{facing:"up"}},DisplayOffset:6,Tags:["gm4_tunnel_bore","gm4_new_machine"],Passengers:[{id:"minecraft:area_effect_cloud",custom_particle:{type:"minecraft:block",block_state:"minecraft:air"},Duration:-1,CustomName:{"text":"gm4_bore_storage"},Tags:["gm4_bore_storage","gm4_machine_cart","smithed.entity","smithed.strict","gm4_new_machine"]}]} scoreboard players add @e[type=area_effect_cloud,tag=gm4_bore_storage,tag=gm4_new_machine,distance=..2] gm4_bore_rail 0 tp @e[type=furnace_minecart,distance=..0.1,tag=gm4_new_machine] @s scoreboard players set @e[distance=..2,tag=gm4_new_machine] gm4_entity_version 1 # clean up kill @s tag @e[distance=..2] remove gm4_new_machine ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/drop_item.mcfunction ================================================ # drops the correct item # @s = invalid item entity # located at @s # run from gm4_tunnel_bores:machine/destroy_cart # drop item, and set flag execute store success score $dropped_item gm4_machine_data as @e[type=area_effect_cloud,limit=1,tag=gm4_destroyed_bore_storage] run loot spawn ~ ~ ~ loot gm4_tunnel_bores:entities/piston_minecart # kill original (invalid) item kill @s ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/scan_hoppers.mcfunction ================================================ # searches for hoppers with invalid items # @s = tunnel_bore marker # located at @s # run from gm4_tunnel_bores:machine/destroy_cart # find hopper with the invalid item scoreboard players set $found_item gm4_machine_data 0 execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~00 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-1 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~00 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~01 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~00 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~01 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper execute if score $found_item gm4_machine_data matches 0 positioned ~-1 ~-2 ~-1 if items block ~ ~ ~ container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper # if no hoppers found, find hopper minecarts with the invalid item execute if score $found_item gm4_machine_data matches 0 as @e[type=hopper_minecart,distance=..3] if items entity @s container.* minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run function gm4_tunnel_bores:machine/destroy_cart/update_hopper_minecart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/update_hopper.mcfunction ================================================ # updates hoppers with invalid items # @s = tunnel_bore marker # located at the hopper with an invalid item # run from gm4_tunnel_bores:machine/destroy_cart/scan_hoppers # replace correct slot with proper item execute if items block ~ ~ ~ container.0 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace block ~ ~ ~ container.0 loot gm4_tunnel_bores:entities/piston_minecart execute if items block ~ ~ ~ container.1 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace block ~ ~ ~ container.1 loot gm4_tunnel_bores:entities/piston_minecart execute if items block ~ ~ ~ container.2 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace block ~ ~ ~ container.2 loot gm4_tunnel_bores:entities/piston_minecart execute if items block ~ ~ ~ container.3 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace block ~ ~ ~ container.3 loot gm4_tunnel_bores:entities/piston_minecart execute if items block ~ ~ ~ container.4 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace block ~ ~ ~ container.4 loot gm4_tunnel_bores:entities/piston_minecart scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart/update_hopper_minecart.mcfunction ================================================ # updates hopper minecarts with invalid items # @s = hopper minecart with invalid item # located at @s # run from gm4_tunnel_bores:machine/destroy_cart/scan_hoppers # replace correct slot with proper item execute if items entity @s container.0 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace entity @s container.0 loot gm4_tunnel_bores:entities/piston_minecart execute if items entity @s container.1 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace entity @s container.1 loot gm4_tunnel_bores:entities/piston_minecart execute if items entity @s container.2 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace entity @s container.2 loot gm4_tunnel_bores:entities/piston_minecart execute if items entity @s container.3 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace entity @s container.3 loot gm4_tunnel_bores:entities/piston_minecart execute if items entity @s container.4 minecraft:furnace_minecart[custom_name={"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston"}] run loot replace entity @s container.4 loot gm4_tunnel_bores:entities/piston_minecart scoreboard players set $found_item gm4_machine_data 1 ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/destroy_cart.mcfunction ================================================ # destroys the tunnel_bore # @s = tunnel_bore marker # located at @s # run from gm4_tunnel_bores:machine/verify_destroy tag @s add gm4_destroyed_bore_storage # drop item scoreboard players set $dropped_item gm4_machine_data 0 execute as @e[type=item,distance=..3,nbt={Age:0s,Item:{id:"minecraft:furnace_minecart",count:1,components:{"minecraft:custom_name":{"fallback":"Minecart with Piston","translate":"item.gm4.minecart.bore"}}}},limit=1,sort=nearest] at @s run function gm4_tunnel_bores:machine/destroy_cart/drop_item # scan hoppers if no item was broken execute if score $dropped_item gm4_machine_data matches 0 run function gm4_tunnel_bores:machine/destroy_cart/scan_hoppers # kill marker kill @s ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/verify_destroy_cart.mcfunction ================================================ # verifies that the destroyed machine was from this module # @s = machine block marker # located at @s # run from #gm4_machines:destroy execute if entity @s[tag=gm4_bore_storage] run function gm4_tunnel_bores:machine/destroy_cart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/machine/verify_place_cart.mcfunction ================================================ # verifies that the placed down machine minecart was from this module # @s = machine minecart # located at the machine minecart # run from #gm4_machines:place_cart execute if score $placed_block gm4_machine_data matches 0 if data entity @s {CustomName:{"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston","italic":false,"color":"white"}} run function gm4_tunnel_bores:machine/create_cart ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/main.mcfunction ================================================ # slow clock for refueling execute if score refuel_clock gm4_bore_fuel matches 220.. run scoreboard players set refuel_clock gm4_bore_fuel 0 scoreboard players add refuel_clock gm4_bore_fuel 1 # bore handling execute as @e[type=furnace_minecart,tag=gm4_tunnel_bore] run function gm4_tunnel_bores:bore/mine/auto_mine ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/function/pulse_check.mcfunction ================================================ schedule function gm4_tunnel_bores:pulse_check 1t # control main module clock scoreboard players add main_clock gm4_bore_data 1 execute if score main_clock gm4_bore_data matches 16.. run scoreboard players set main_clock gm4_bore_data 0 # control slow clock for cart cooldown execute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run function gm4_tunnel_bores:bore/mine/cooldown/clock_control # handle all furnace carts execute as @e[type=furnace_minecart] run function gm4_tunnel_bores:furnace_cart_20hz #compares assigned run tick to current tick and calls main execute if score main_clock gm4_bore_data = trigger_tick gm4_bore_data run function gm4_tunnel_bores:main ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/guidebook/tunnel_bores.json ================================================ { "id": "tunnel_bores", "name": "Tunnel Bores", "module_type": "module", "icon": { "id": "minecraft:piston" }, "criteria": { "obtain_minecart": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:minecart" ] } ] } }, "obtain_piston": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:piston" ] } ] } }, "obtain_tunnel_bore": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:furnace_minecart" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"tunnel_bore\"}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.tunnel_bores.description", "fallback": "Tunnel Bores can be crafted to aid in excavation. Piston Minecarts will break blocks and place rails, moving forward.\n\nThey can be crafted in a crafting table." } ] ] }, { "name": "crafting", "enable": [], "requirements": [ [ "obtain_piston" ], [ "obtain_minecart" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.tunnel_bores.crafting", "fallback": "Tunnel bores can be crafted as follows:" }, "\n", { "insert": "recipe", "recipe": "gm4_tunnel_bores:piston_minecart" } ], [ "\n\n", { "insert": "recipe", "recipe": "gm4_tunnel_bores:piston_minecart_from_furnace_minecart" } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_tunnel_bore" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.tunnel_bores.start_up", "fallback": "Piston Minecarts are upgraded furnace minecarts and require coal as fuel. To start the bore, use a piece of coal on the bore.\n\nPiston Minecarts will mine piston-movable blocks in a 3x3 area centered at the block above it." } ], [ { "translate": "text.gm4.guidebook.tunnel_bores.supply", "fallback": "These tunnel bores can place rails on solid blocks in front of it.\n\nChest Minecarts can be attached to supply the Piston Minecart with rails and coal." } ], [ { "translate": "text.gm4.guidebook.tunnel_bores.mining", "fallback": "Tunnel bores will continuously mine blocks when it hits a breakable block, but will always try to mine and refuel when on a powered activator rail.\n\nThis makes it possible to keep a stationary bore." } ] ], "grants": [ "crafting" ] } ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/loot_table/entities/piston_minecart.json ================================================ { "type": "minecraft:entity", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_tunnel_bores:items/piston_minecart" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:rail", "functions": [ { "function": "minecraft:set_count", "count": { "type": "minecraft:score", "target": "this", "score": "gm4_bore_rail" } } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": "this", "score": "gm4_bore_rail" }, "range": { "min": 1 } } ] } ] } ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/loot_table/items/piston_minecart.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:furnace_minecart", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_tunnel_bores:item/piston_minecart"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_machines:{id:'tunnel_bore'}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.gm4.minecart.bore", "fallback": "Minecart with Piston", "italic": false, "color": "white" } } ] } ] } ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/recipe/piston_minecart.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "group": "gm4_tunnel_bores:piston_minecart", "pattern": [ " F ", "TMP" ], "key": { "F": "minecraft:furnace", "T": "minecraft:tripwire_hook", "M": "minecraft:minecart", "P": "minecraft:piston" }, "result": { "id": "minecraft:furnace_minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_tunnel_bores:item/piston_minecart"]}, "minecraft:custom_data": "{gm4_machines:{id:'tunnel_bore'}}", "minecraft:custom_name": {"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston","color":"white","italic":false} } } } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/recipe/piston_minecart_from_furnace_minecart.json ================================================ { "type": "minecraft:crafting_shaped", "category": "redstone", "group": "gm4_tunnel_bores:piston_minecart", "pattern": [ "TMP" ], "key": { "T": "minecraft:tripwire_hook", "M": "minecraft:furnace_minecart", "P": "minecraft:piston" }, "result": { "id": "minecraft:furnace_minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_tunnel_bores:item/piston_minecart"]}, "minecraft:custom_data": "{gm4_machines:{id:'tunnel_bore'}}", "minecraft:custom_name": {"translate":"item.gm4.minecart.bore","fallback":"Minecart with Piston","color":"white","italic":false} } } } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/liquids.json ================================================ { "values": [ "#gm4:water", "minecraft:lava" ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/not_rail_solid.json ================================================ { "values": [ "#minecraft:air", "#minecraft:chains", "#gm4_tunnel_bores:liquids", "#minecraft:small_flowers", "minecraft:brown_mushroom", "minecraft:red_mushroom", "minecraft:tripwire", "minecraft:short_grass", "minecraft:kelp", "minecraft:seagrass", "minecraft:tall_grass", "minecraft:large_fern", "minecraft:rose_bush", "minecraft:sunflower", "minecraft:lilac", "minecraft:peony", "minecraft:oak_sapling", "minecraft:spruce_sapling", "minecraft:birch_sapling", "minecraft:jungle_sapling", "minecraft:acacia_sapling", "minecraft:dark_oak_sapling", "minecraft:dead_bush", "minecraft:torch", "minecraft:wall_torch", "minecraft:snow", "minecraft:fire", "minecraft:farmland", "minecraft:dirt_path", "minecraft:cactus", "#minecraft:leaves", "#minecraft:slabs", "#minecraft:stairs", "minecraft:nether_portal", "#minecraft:fences", "minecraft:chorus_plant", "minecraft:chorus_flower", "minecraft:end_rod", "minecraft:end_portal_frame", "minecraft:end_portal", "minecraft:dragon_egg", "minecraft:end_gateway", "minecraft:white_stained_glass_pane", "minecraft:orange_stained_glass_pane", "minecraft:magenta_stained_glass_pane", "minecraft:light_blue_stained_glass_pane", "minecraft:yellow_stained_glass_pane", "minecraft:lime_stained_glass_pane", "minecraft:pink_stained_glass_pane", "minecraft:gray_stained_glass_pane", "minecraft:light_gray_stained_glass_pane", "minecraft:cyan_stained_glass_pane", "minecraft:purple_stained_glass_pane", "minecraft:blue_stained_glass_pane", "minecraft:brown_stained_glass_pane", "minecraft:green_stained_glass_pane", "minecraft:red_stained_glass_pane", "minecraft:black_stained_glass_pane", "#minecraft:wool_carpets", "#minecraft:banners", "#minecraft:beds", "minecraft:stonecutter", "minecraft:grindstone", "minecraft:chest", "minecraft:trapped_chest", "minecraft:ender_chest", "minecraft:enchanting_table", "#minecraft:campfires", "#minecraft:anvil", "minecraft:conduit", "minecraft:bell", "minecraft:lectern", "minecraft:brewing_stand", "minecraft:cake", "#minecraft:wooden_pressure_plates", "minecraft:stone_pressure_plate", "minecraft:light_weighted_pressure_plate", "minecraft:heavy_weighted_pressure_plate", "minecraft:daylight_detector", "#minecraft:buttons", "minecraft:repeater", "minecraft:comparator", "minecraft:redstone_wire", "#minecraft:trapdoors", "#minecraft:doors", "minecraft:tripwire_hook", "minecraft:redstone_torch", "minecraft:redstone_wall_torch", "minecraft:lever", "#minecraft:rails", "minecraft:oak_fence_gate", "minecraft:acacia_fence_gate", "minecraft:dark_oak_fence_gate", "minecraft:spruce_fence_gate", "minecraft:birch_fence_gate", "minecraft:jungle_fence_gate", "#minecraft:walls", "minecraft:glass_pane", "minecraft:iron_bars", "minecraft:lantern", "minecraft:ladder", "minecraft:cobweb", "#minecraft:signs", "#minecraft:flower_pots", "minecraft:sea_pickle", "minecraft:turtle_egg", "minecraft:dragon_head", "minecraft:skeleton_skull", "minecraft:player_head", "minecraft:wither_skeleton_skull", "minecraft:creeper_head", "minecraft:zombie_head", "minecraft:dragon_wall_head", "minecraft:skeleton_wall_skull", "minecraft:player_wall_head", "minecraft:wither_skeleton_wall_skull", "minecraft:creeper_wall_head", "minecraft:zombie_wall_head", "#minecraft:underwater_bonemeals", "minecraft:melon_stem", "minecraft:pumpkin_stem", "minecraft:wheat", "minecraft:beetroots", "minecraft:potatoes", "minecraft:carrots", "minecraft:sugar_cane", "minecraft:cocoa", "minecraft:bamboo", "minecraft:bamboo_sapling", "minecraft:vine", "minecraft:lily_pad", "minecraft:structure_void", "minecraft:soul_torch", "minecraft:soul_wall_torch", "minecraft:soul_lantern", "minecraft:crimson_fungus", "minecraft:warped_fungus", "minecraft:weeping_vines", "minecraft:weeping_vines_plant", "minecraft:twisting_vines", "minecraft:twisting_vines_plant", "minecraft:crimson_roots", "minecraft:warped_roots", "minecraft:nether_sprouts", "minecraft:warped_fence", "minecraft:crimson_fence_gate", "minecraft:sweet_berry_bush", "minecraft:sculk_shrieker", "minecraft:mangrove_propagule", "minecraft:heavy_core" ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/rail_replacable.json ================================================ { "values": [ "#gm4:replaceable", "#gm4:foliage" ] } ================================================ FILE: gm4_tunnel_bores/data/gm4_tunnel_bores/tags/block/unbreakable.json ================================================ { "values": [ "#gm4_tunnel_bores:liquids", "minecraft:obsidian", "minecraft:air", "minecraft:void_air", "minecraft:cave_air", "minecraft:ancient_debris", "minecraft:barrier", "minecraft:bedrock", "minecraft:end_portal", "minecraft:end_portal_frame", "minecraft:end_gateway", "minecraft:command_block", "minecraft:repeating_command_block", "minecraft:chain_command_block", "minecraft:structure_block", "minecraft:jigsaw", "minecraft:structure_void", "minecraft:moving_piston", "minecraft:chest", "minecraft:barrel", "minecraft:dispenser", "minecraft:dropper", "minecraft:hopper", "minecraft:furnace", "minecraft:jukebox", "minecraft:trapped_chest", "minecraft:ender_chest", "minecraft:lectern", "minecraft:piston", "minecraft:sticky_piston", "minecraft:beacon", "minecraft:daylight_detector", "minecraft:conduit", "minecraft:enchanting_table", "#minecraft:banners", "#minecraft:campfires", "minecraft:blast_furnace", "minecraft:smoker", "minecraft:spawner", "minecraft:fire", "#minecraft:signs", "minecraft:piston_head", "minecraft:nether_portal", "minecraft:crying_obsidian", "minecraft:respawn_anchor", "minecraft:lodestone", "minecraft:reinforced_deepslate", "minecraft:crafter", "minecraft:trial_spawner", "minecraft:vault" ] } ================================================ FILE: gm4_tunnel_bores/mod.mcdoc ================================================ use ::java::util::slot::SlottedItem dispatch minecraft:storage[gm4_tunnel_bores:bore_container] to struct { Items?: [SlottedItem], } ================================================ FILE: gm4_undead_players/README.md ================================================ # Undead Players Ever wonder what happens to your player's body after you die? Well wonder no longer. This modular data pack reanimates your fallen-corpse as a zombie. ### Features - Players summon a zombie at their location upon death. - The "Undead Player" is named, and won't despawn, helping you track down where you died. - The "Undead Player" can pickup items, potentially saving some of your gear from despawning. - Adds a custom advancement for those who "rise again" as an undead player. ================================================ FILE: gm4_undead_players/beet.yaml ================================================ id: gm4_undead_players name: Undead Players version: 1.8.X data_pack: load: . pipeline: - gm4.plugins.extend.module - gm4.plugins.include.lib_player_death meta: gm4: versioning: required: lib_player_death: 1.4.0 schedule_loops: [main] model_data: - item: zombie_head reference: gui/advancement/undead_players template: advancement website: description: You'll find your death point faster, but you'll have to fight your corpse for your stuff back! recommended: [] notes: - Modifies items right after a player died, and might fight over those items with other Datapacks that do the same. modrinth: project_id: jx6D06Q4 planetminecraft: uid: 4294228 video: https://www.youtube.com/watch?v=dD8nChP8t9A wiki: https://wiki.gm4.co/wiki/Undead_Players credits: Creator: - Sparks Updated by: - SunderB Icon Design: - Hozz ================================================ FILE: gm4_undead_players/data/gm4/advancement/undead_players.json ================================================ { "display": { "icon": { "id": "zombie_head", "components": { "minecraft:custom_model_data": {"strings":["gm4_undead_players:gui/advancement/undead_players"]} } }, "title": { "translate": "advancement.gm4.undead_players.title", "fallback": "Risen" }, "description": { "translate": "advancement.gm4.undead_players.description", "fallback": "Die and raise up an undead zombie in your body's place", "color": "gray" } }, "parent": "gm4:root", "criteria": { "player_death": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_undead_players/data/gm4_player_death/tags/function/grave.json ================================================ { "values": [ "gm4_undead_players:died" ] } ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/died.mcfunction ================================================ #run from #gm4_player_death:grave #@s = player who took fatal damage # Summon undead player unless player has ignore tag or is in creative/spectator. execute if entity @s[tag=!gm4_undead_ignore,gamemode=!creative,gamemode=!spectator] run function gm4_undead_players:summon_zombie ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/init.mcfunction ================================================ # Add scoreboard used to implement custom logic for undead player drowned conversion. scoreboard objectives add gm4_undead_drown dummy execute unless score undead_players gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Undead Players"} execute unless score undead_players gm4_earliest_version < undead_players gm4_modules run scoreboard players operation undead_players gm4_earliest_version = undead_players gm4_modules scoreboard players set undead_players gm4_modules 1 schedule function gm4_undead_players:main 1t #$moduleUpdateList ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/init_drowned.mcfunction ================================================ #run from gm4_undead_players:summon_drowned #@s = newly spawned drowned player # Copy the equipment from the zombie to the drowned. data modify entity @s equipment merge from storage gm4_undead_players:temp zombie_data.equipment # Update the name from "Undead " to "Drowned " data modify storage gm4_undead_players:temp zombie_data.CustomName merge value {translate:"entity.gm4.drowned_player_name","fallback":"Drowned %s"} data modify entity @s CustomName merge from storage gm4_undead_players:temp zombie_data.CustomName # Remove the temporary "new" tag from the drowned. tag @s remove gm4_undead_player_new ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/init_zombie.mcfunction ================================================ #run from gm4_undead_players:summon_zombie #@s = newly spawned undead player # Store the player's name to storage data modify storage gm4_undead_players:temp name_attribute.Name set from entity @s equipment.head.components."minecraft:profile".name # Use an item modifier to generate the undead player's CustomName ("Undead "). item modify entity @s armor.head gm4_undead_players:zombie_name data modify entity @s CustomName set from entity @s equipment.head.components."minecraft:custom_name" data remove storage gm4_undead_players:temp name_attribute # Clear the temporary item from the undead player's hand and remove the temporary "new" tag. tag @s remove gm4_undead_player_new item replace entity @s armor.head with air ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/main.mcfunction ================================================ schedule function gm4_undead_players:main 16t execute as @e[type=zombie,tag=gm4_undead_player,nbt=!{DrownedConversionTime:-1}] run function gm4_undead_players:process_drowning ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/process_drowning.mcfunction ================================================ #run from gm4_undead_players:main #@s = undead player who is undergoing drowned conversion # Store DrownedConversionTime in a temporary scoreboard to use in calculations. execute store result score #conversion_time gm4_undead_drown run data get entity @s DrownedConversionTime # Initialize drowning score to (15s * 20t/s) if the zombie just started drowning. execute unless score @s gm4_undead_drown = @s gm4_undead_drown run scoreboard players set @s gm4_undead_drown 300 # Calculate how much the zombie has drowned since the last call to this function. scoreboard players set #conversion_diff gm4_undead_drown 300 scoreboard players operation #conversion_diff gm4_undead_drown -= #conversion_time gm4_undead_drown scoreboard players operation @s gm4_undead_drown -= #conversion_diff gm4_undead_drown # Reset the zombie's DrownedConversionTime so it doesn't drown naturally. execute if score @s gm4_undead_drown matches 0.. run data modify entity @s DrownedConversionTime set value 300 # The conversion is now complete; spawn a new drowned and copy the zombie's data. execute if score @s gm4_undead_drown matches ..-1 at @s run function gm4_undead_players:summon_drowned ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/summon_drowned.mcfunction ================================================ #run from gm4_undead_players:process_drowning #@s = undead player who is being converted into a drowned # Copy the zombie's NBT to storage, then kill the zombie instantly and without drops. data modify storage gm4_undead_players:temp zombie_data set from entity @s teleport @s ~ -10000 ~ data merge entity @s {Health:0f,DeathTime:19s} # Summon the drowned and initialize it based on the contents of storage. summon drowned ~ ~ ~ {Tags:["gm4_undead_player","gm4_undead_player_new"],PersistenceRequired:1b,CustomNameVisible:1b,drop_chances:{mainhand:1F,offhand:1F,feet:1F,legs:1F,chest:1F,head:1F}} execute as @e[type=drowned,tag=gm4_undead_player_new,distance=0,limit=1] run function gm4_undead_players:init_drowned # Clear storage to avoid deep comparison when this function is next called. data remove storage gm4_undead_players:temp zombie_data ================================================ FILE: gm4_undead_players/data/gm4_undead_players/function/summon_zombie.mcfunction ================================================ #run from gm4_undead_players:died #@s = player who has died and is not excluded from undead player spawning (via tag or gamemode) # Summon zombie to be initialized. summon zombie ~ ~1 ~ {CustomNameVisible:1b,CanPickUpLoot:1b,PersistenceRequired:1b,Tags:["gm4_undead_player","gm4_undead_player_new"]} # Use a loot table to extract the player's username. loot replace entity @e[type=zombie,tag=gm4_undead_player_new,dy=2,limit=1] armor.head loot gm4_undead_players:player_head # Run a function as the zombie to initialize its NBT. execute as @e[type=zombie,tag=gm4_undead_player_new,dy=1,limit=1] run function gm4_undead_players:init_zombie # Grant the "Risen" advancement to the player. advancement grant @s only gm4:undead_players ================================================ FILE: gm4_undead_players/data/gm4_undead_players/guidebook/undead_players.json ================================================ { "id": "undead_players", "name": "Undead Players", "module_type": "module", "icon": { "id": "minecraft:rotten_flesh" }, "criteria": { "summon_undead_player": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:undead_players": true } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "summon_undead_player" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.undead_players.description", "fallback": "When one dies, an undead version of them will spawn at the death site.\n\nThis zombie have a visible name, will never despawn, and will pick up armor and weapons." } ] ] } ] } ================================================ FILE: gm4_undead_players/data/gm4_undead_players/item_modifier/zombie_name.json ================================================ { "function": "minecraft:set_name", "entity": "this", "name": { "translate": "entity.gm4.undead_player_name", "fallback": "Undead %s", "with": [ { "storage": "gm4_undead_players:temp", "nbt": "name_attribute.Name" } ] } } ================================================ FILE: gm4_undead_players/data/gm4_undead_players/loot_table/player_head.json ================================================ { "type": "minecraft:generic", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:player_head", "functions": [ { "function": "minecraft:fill_player_head", "entity": "this" } ] } ] } ] } ================================================ FILE: gm4_undead_players/mod.mcdoc ================================================ use ::java::world::entity::mob::zombie::Zombie use ::java::util::text::Text dispatch minecraft:storage[gm4_undead_players:temp] to struct { zombie_data?: Zombie, name_attribute?: struct { Name: string, }, } ================================================ FILE: gm4_undead_players/translations.csv ================================================ key,en_us advancement.gm4.undead_players.description,Die and raise up an undead zombie in your body's place advancement.gm4.undead_players.title,Risen entity.gm4.drowned_player_name,Drowned %s entity.gm4.undead_player_name,Undead %s text.gm4.guidebook.module_desc.undead_players,"You'll find your death point faster, but you'll have to fight your corpse for your stuff back!" text.gm4.guidebook.undead_players.description,"When one dies, an undead version of them will spawn at the death site.\n\nThis zombie have a visible name, will never despawn, and will pick up armor and weapons." ================================================ FILE: gm4_vecto_shamir/README.md ================================================ # Vecto Shamir Summon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot! ### Features - Sneak on top of Water, Ice or Rails to spawn a temporary Boat or Minecart - The mode of transport disappears once the summoning player moves away from it - Boats spawned reflect the biome it spawns in - Builds on Gamemode 4's expansion on the Echantment system, [Metallurgy]($dynamicLink:gm4_metallurgy) ================================================ FILE: gm4_vecto_shamir/beet.yaml ================================================ id: gm4_vecto_shamir name: Vecto Shamir version: 1.7.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 schedule_loops: [main] model_data: - item: boots reference: shamir/vecto template: name: shamir metal: bismuth textures_path: gm4_metallurgy:item/shamir/bismuth website: description: Adds the 'Vecto' Shamir to Metallurgy. Summon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot! recommended: [] notes: [] modrinth: project_id: wwe9xfEp wiki: https://wiki.gm4.co/wiki/Metallurgy/Vecto_Shamir credits: Creator: - Denniss Icon Design: - BPR ================================================ FILE: gm4_vecto_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_vecto_shamir:check_item_validity" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_metallurgy/tags/function/summon_band/bismuth.json ================================================ { "values": [ "gm4_vecto_shamir:summon_band" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/advancement/join.json ================================================ { "criteria": { "join": { "trigger": "minecraft:location" } }, "rewards": { "function": "gm4_vecto_shamir:get_id" } } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/advancement/vehicle_check.json ================================================ { "criteria": { "not_in_vehicle": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{Tags:[\"gm4_vecto_active\"]}" } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_vecto_shamir:in_vehicle" } } ] } } }, "rewards": { "function": "gm4_vecto_shamir:vehicle/check" } } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/active.mcfunction ================================================ # @s = player with shamir equipped, sneaking # at @s # run from main # minecart execute if block ~ ~ ~ #minecraft:rails run function gm4_vecto_shamir:vehicle/spawn_minecart # boat execute if predicate gm4_vecto_shamir:water run function gm4_vecto_shamir:vehicle/position_check execute if block ~ ~-1 ~ #minecraft:ice if block ~ ~ ~ #gm4:no_collision if block ~0.7 ~ ~ #gm4:no_collision if block ~-0.7 ~ ~ #gm4:no_collision if block ~ ~ ~0.7 #gm4:no_collision if block ~ ~ ~-0.7 #gm4:no_collision if block ~0.7 ~ ~0.7 #gm4:no_collision if block ~0.7 ~ ~-0.7 #gm4:no_collision if block ~-0.7 ~ ~0.7 #gm4:no_collision if block ~-0.7 ~ ~-0.7 #gm4:no_collision run function gm4_vecto_shamir:vehicle/spawn_boat ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/check_item_validity.mcfunction ================================================ # @s = band is trying to apply to # at @s # run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vecto'}}] if items entity @s contents #gm4_vecto_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/get_id.mcfunction ================================================ # @s = new player # at @s # run from advancement join execute store result score @s gm4_vecto_id run data get entity @s UUID[0] ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/init.mcfunction ================================================ scoreboard objectives add gm4_vecto_id dummy team add gm4_vecto_nocoll team modify gm4_vecto_nocoll collisionRule never execute unless score vecto_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Vecto Shamir"} execute unless score vecto_shamir gm4_earliest_version < vecto_shamir gm4_modules run scoreboard players operation vecto_shamir gm4_earliest_version = vecto_shamir gm4_modules scoreboard players set vecto_shamir gm4_modules 1 schedule function gm4_vecto_shamir:main 4t #$moduleUpdateList ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/main.mcfunction ================================================ execute as @a[gamemode=!spectator,predicate=gm4_vecto_shamir:sneak_validblock,tag=!gm4_vecto_active] at @s run function gm4_vecto_shamir:active schedule function gm4_vecto_shamir:main 16t ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside # at @s # run from metallurgy:casting/summon_band/template via #gm4_metallurgy:summon_band/template loot spawn ~ ~ ~ loot gm4_vecto_shamir:band ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/check.mcfunction ================================================ # @s = player with tag gm4_vecto_active and not in vehicle # at @s # run from advancement vehicle_check advancement revoke @s only gm4_vecto_shamir:vehicle_check # copy player id scoreboard players operation $current gm4_vecto_id = @s gm4_vecto_id # remove vehicle if too far away from player execute as @e[type=#gm4_vecto_shamir:vehicle,tag=gm4_vecto_vehicle,distance=2..] if score @s gm4_vecto_id = $current gm4_vecto_id run function gm4_vecto_shamir:vehicle/remove # enable collision if not sneaking execute unless predicate gm4_vecto_shamir:sneaking as @e[type=#gm4_vecto_shamir:vehicle,tag=gm4_vecto_vehicle,distance=..2] if score @s gm4_vecto_id = $current gm4_vecto_id run team leave @s ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/check_boat_collision.mcfunction ================================================ # @s = player with shamir equipped, sneaking above water # positioned in water # run from position_check execute positioned ^ ^-.4 ^1 if block ^.7 ^ ^ #gm4:no_collision if block ^-.7 ^ ^ #gm4:no_collision if block ^ ^ ^1 #gm4:no_collision if block ^.7 ^ ^1 #gm4:no_collision if block ^-.7 ^ ^1 #gm4:no_collision if block ^.7 ^1 ^ #gm4:no_collision if block ^ ^1 ^ #gm4:no_collision if block ^-.7 ^1 ^ #gm4:no_collision if block ^ ^1 ^1 #gm4:no_collision if block ^.7 ^1 ^1 #gm4:no_collision if block ^-.7 ^1 ^1 #gm4:no_collision run function gm4_vecto_shamir:vehicle/spawn_boat ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/position_check.mcfunction ================================================ # @s = player with shamir equipped, sneaking above water # at @s # run from active # rotate check towards water execute if block ~ ~-1 ~-1 #gm4:full_collision rotated 0 0 run function gm4_vecto_shamir:vehicle/check_boat_collision execute unless entity @s[tag=gm4_vecto_active] if block ~1 ~-1 ~ #gm4:full_collision rotated 90 0 run function gm4_vecto_shamir:vehicle/check_boat_collision execute unless entity @s[tag=gm4_vecto_active] if block ~ ~-1 ~1 #gm4:full_collision rotated 180 0 run function gm4_vecto_shamir:vehicle/check_boat_collision execute unless entity @s[tag=gm4_vecto_active] if block ~-1 ~-1 ~ #gm4:full_collision rotated -90 0 run function gm4_vecto_shamir:vehicle/check_boat_collision ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/remove.mcfunction ================================================ # @s = temporary vehicle with no player # at @p[tag=gm4_vecto_active] not in vehicle # run from vehicle/check execute at @s run particle minecraft:cloud ~ ~ ~ .2 .2 .2 .05 20 execute at @s run playsound minecraft:entity.player.attack.nodamage neutral @a[distance=..15] ~ ~ ~ 1 .6 kill @s tag @p[tag=gm4_vecto_active] remove gm4_vecto_active ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat.mcfunction ================================================ # @s = player with shamir equipped, sneaking above water OR ice # at @s # run from active and vehicle/check_boat_collision tag @s add gm4_vecto_active # spawn boat execute if entity @s[y_rotation=-45..45] run function gm4_vecto_shamir:vehicle/spawn_boat_south execute if entity @s[y_rotation=45..135] run function gm4_vecto_shamir:vehicle/spawn_boat_west execute if entity @s[y_rotation=135..225] run function gm4_vecto_shamir:vehicle/spawn_boat_north execute if entity @s[y_rotation=-135..-45] run function gm4_vecto_shamir:vehicle/spawn_boat_east team join gm4_vecto_nocoll @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] # link player to boat with id scoreboard players operation @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] gm4_vecto_id = @s gm4_vecto_id # remove new tag tag @e[type=#minecraft:boat,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] remove gm4_vecto_new_vehicle # effects execute if block ~ ~-1 ~ #minecraft:ice run playsound minecraft:entity.boat.paddle_land player @a[distance=..15] ~ ~ ~ 2 1 execute unless block ~ ~-1 ~ #minecraft:ice run playsound minecraft:entity.boat.paddle_water player @a[distance=..15] ~ ~ ~ 2 1 ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_east.mcfunction ================================================ # run from spawn_boat execute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} execute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[270f,0f]} ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_north.mcfunction ================================================ # run from spawn_boat execute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} execute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[180f,0f]} ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_south.mcfunction ================================================ # run from spawn_boat execute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} execute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[0f,0f]} ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_boat_west.mcfunction ================================================ # run from spawn_boat execute if biome ~ ~ ~ #gm4_vecto_shamir:acacia run summon minecraft:acacia_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:bamboo run summon minecraft:bamboo_raft ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:birch run summon minecraft:birch_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:cherry run summon minecraft:cherry_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:dark_oak run summon minecraft:dark_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:jungle run summon minecraft:jungle_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:mangrove run summon minecraft:mangrove_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:pale_oak run summon minecraft:pale_oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute if biome ~ ~ ~ #gm4_vecto_shamir:spruce run summon minecraft:spruce_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} execute unless biome ~ ~ ~ #gm4_vecto_shamir:non_oak run summon minecraft:oak_boat ~ ~ ~ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"],Rotation:[90f,0f]} ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/function/vehicle/spawn_minecart.mcfunction ================================================ # @s = player with shamir equipped, sneaking on rails # at @s # run from active tag @s add gm4_vecto_active # spawn minecart summon minecraft:minecart ^ ^.1 ^ {Invulnerable:1b,Tags:["gm4_vecto_vehicle","gm4_vecto_new_vehicle"]} team join gm4_vecto_nocoll @e[type=minecraft:minecart,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] # link player to minecart with id scoreboard players operation @e[type=minecraft:minecart,tag=gm4_vecto_new_vehicle,distance=..1,sort=nearest,limit=1] gm4_vecto_id = @s gm4_vecto_id # effects playsound minecraft:block.metal.place neutral @a[distance=..15] ~ ~ ~ 1 2 ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/guidebook/vecto_shamir.json ================================================ { "id": "vecto_shamir", "name": "Vecto Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_vecto_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vecto'}}" } } ] } }, "obtain_vecto_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vecto'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.vecto_shamir.description", "fallback": "Vecto creates temporary boats and minecarts for easy travel." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_vecto_shamir", "obtain_vecto_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.vecto_shamir.usage", "fallback": "The Vecto Shamir is found on Bismuth Bands. It can be placed onto boots.\n\nSneak on top of water, ice, or rails to summon a temporary boat or minecart.\nThis vehicle disappears once the owner is not nearby." } ] ] } ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:bismuth_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_vecto_shamir:shamir/vecto"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'vecto'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.vecto", "fallback": "Vecto Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/in_vehicle.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "nbt": "{Tags:[\"gm4_vecto_vehicle\"]}" } } } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/sneak_validblock.json ================================================ [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true }, "equipment": { "feet": { "items": "#minecraft:foot_armor", "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vecto'}}" } } } } }, { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:rails" } } }, { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#minecraft:ice" } } }, { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "fluid": { "fluids": "#minecraft:water" } } } ] }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:location_check", "predicate": { "fluid": { "fluids": "#minecraft:water" } } } } ] ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/sneaking.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/predicate/water.json ================================================ [ { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "block": { "blocks": "#gm4:no_collision" } } }, { "condition": "minecraft:location_check", "offsetX": 0, "offsetY": -1, "offsetZ": 0, "predicate": { "fluid": { "fluid": "minecraft:water" } } } ] ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/entity_type/vehicle.json ================================================ { "values": [ "#minecraft:boat", "minecraft:minecart" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:foot_armor" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/acacia.json ================================================ { "values": [ "minecraft:savanna", "minecraft:savanna_plateau", "minecraft:windswept_savanna" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/bamboo.json ================================================ { "values": [ "minecraft:bamboo_jungle" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/birch.json ================================================ { "values": [ "minecraft:birch_forest", "minecraft:old_growth_birch_forest" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/cherry.json ================================================ { "values": [ "minecraft:cherry_grove" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/dark_oak.json ================================================ { "values": [ "minecraft:dark_forest" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/jungle.json ================================================ { "values": [ "minecraft:jungle", "minecraft:sparse_jungle" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/mangrove.json ================================================ { "values": [ "minecraft:mangrove_swamp" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/non_oak.json ================================================ { "values": [ "#gm4_vecto_shamir:acacia", "#gm4_vecto_shamir:bamboo", "#gm4_vecto_shamir:birch", "#gm4_vecto_shamir:cherry", "#gm4_vecto_shamir:dark_oak", "#gm4_vecto_shamir:jungle", "#gm4_vecto_shamir:mangrove", "#gm4_vecto_shamir:pale_oak", "#gm4_vecto_shamir:spruce" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/pale_oak.json ================================================ { "values": [ "minecraft:pale_garden" ] } ================================================ FILE: gm4_vecto_shamir/data/gm4_vecto_shamir/tags/worldgen/biome/spruce.json ================================================ { "values": [ "minecraft:taiga", "minecraft:snowy_taiga", "minecraft:snowy_plains", "minecraft:snowy_beach", "minecraft:snowy_slopes", "minecraft:old_growth_pine_taiga", "minecraft:old_growth_spruce_taiga", "minecraft:windswept_forest", "minecraft:windswept_hills", "minecraft:windswept_gravelly_hills", "minecraft:grove" ] } ================================================ FILE: gm4_vecto_shamir/translations.csv ================================================ key,en_us item.gm4.shamir.vecto,Vecto Shamir text.gm4.guidebook.module_desc.vecto_shamir,"Adds the 'Vecto' Shamir to Metallurgy. Summon a Boat or Minecart out of thin air when in need, no more wasting an inventory slot!" text.gm4.guidebook.vecto_shamir.description,Vecto creates temporary boats and minecarts for easy travel. text.gm4.guidebook.vecto_shamir.usage,"The Vecto Shamir is found on Bismuth Bands. It can be placed onto boots.\n\nSneak on top of water, ice, or rails to summon a temporary boat or minecart.\nThis vehicle disappears once the owner is not nearby." ================================================ FILE: gm4_vertical_rails/README.md ================================================ # Vertical Rails Turn ladders into vertical railways for your minecarts! This simple data pack is great way to travel from the depths of a mineshaft to the top of a mountian, without the need for dizzying railway corkscrews ![Note Block Interface Example](images/vertical_rails.webp) ### Features - Minecarts inside ladders automatically travel upwards until the reach the top, where they continue on regular rails. - Adds a custom advancement for your first ride up a wall ================================================ FILE: gm4_vertical_rails/assets/translations.csv ================================================ key,en_us advancement.gm4.vertical_rails.title,"Up, Up and Away!" advancement.gm4.vertical_rails.description,Ride a minecart going up a vertical rail text.gm4.guidebook.module_desc.vertical_rails,Use ladders as vertical Minecart tracks. text.gm4.guidebook.vertical_rails.description,Ladder will provide a vertical track for minecarts.\n\nMinecarts that enter a ladder block will travel upwards. text.gm4.guidebook.vertical_rails.behavior,"Once a minecart reaches the top of a ladder, it will have some upward and forward velocity to continue along normal rails." ================================================ FILE: gm4_vertical_rails/beet.yaml ================================================ id: gm4_vertical_rails name: Vertical Rails version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: - main - tick model_data: - item: ladder reference: gui/advancement/vertical_rails template: advancement website: description: Use ladders as vertical Minecart tracks. recommended: [] notes: [] modrinth: project_id: PL3P0wBS video: https://www.youtube.com/watch?v=LJoN7CmJL4Q wiki: https://wiki.gm4.co/wiki/Vertical_Rails credits: Creators: - Sparks - SiberianHat Updated by: - SpecialBuilder32 - Kruthers Icon Design: - DuckJr ================================================ FILE: gm4_vertical_rails/data/gm4/advancement/vertical_rails.json ================================================ { "display": { "icon": { "id": "ladder", "components": { "minecraft:custom_model_data": {"strings":["gm4_vertical_rails:gui/advancement/vertical_rails"]} } }, "title": { "translate": "advancement.gm4.vertical_rails.title", "fallback": "Up, Up and Away!" }, "description": { "translate": "advancement.gm4.vertical_rails.description", "fallback": "Ride a minecart going up a vertical rail", "color": "gray" } }, "parent": "gm4:root", "criteria": { "ride_vertical_rail": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/function/init.mcfunction ================================================ execute unless score vertical_rails gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Vertical Rails"} execute unless score vertical_rails gm4_earliest_version < vertical_rails gm4_modules run scoreboard players operation vertical_rails gm4_earliest_version = vertical_rails gm4_modules scoreboard players set vertical_rails gm4_modules 1 schedule function gm4_vertical_rails:main 1t schedule function gm4_vertical_rails:tick 1t #$moduleUpdateList ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/function/main.mcfunction ================================================ execute as @e[type=minecart,tag=!smithed.entity] at @s if block ~ ~ ~ ladder on passengers run advancement grant @s only gm4:vertical_rails schedule function gm4_vertical_rails:main 16t ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/function/momentum.mcfunction ================================================ execute if block ~ ~ ~ ladder[facing=north] run data merge entity @s {Motion:[0.0,0.32,0.15]} execute if block ~ ~ ~ ladder[facing=south] run data merge entity @s {Motion:[0.0,0.32,-0.15]} execute if block ~ ~ ~ ladder[facing=east] run data merge entity @s {Motion:[-0.15,0.32,0.0]} execute if block ~ ~ ~ ladder[facing=west] run data merge entity @s {Motion:[0.15,0.32,0.0]} ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/function/tick.mcfunction ================================================ execute as @e[type=#gm4:minecarts,tag=!smithed.entity] at @s if block ~ ~ ~ ladder run function gm4_vertical_rails:momentum schedule function gm4_vertical_rails:tick 2t ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/guidebook/vertical_rails.json ================================================ { "id": "vertical_rails", "name": "Vertical Rails", "module_type": "module", "icon": { "id": "minecraft:ladder" }, "criteria": { "obtain_ladder": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:ladder" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_ladder" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.vertical_rails.description", "fallback": "Ladder will provide a vertical track for minecarts.\n\nMinecarts that enter a ladder block will travel upwards." } ], [ { "translate": "text.gm4.guidebook.vertical_rails.behavior", "fallback": "Once a minecart reaches the top of a ladder, it will have some upward and forward velocity to continue along normal rails." } ] ] } ] } ================================================ FILE: gm4_vertical_rails/data/gm4_vertical_rails/test/go_up.mcfunction ================================================ # @template gm4_vertical_rails:test_track summon minecart ~1.5 ~1.0 ~1.5 await delay 3s execute positioned ~4.5 ~4.5 ~1.5 run assert entity @e[type=minecart,dx=0] ================================================ FILE: gm4_vigere_shamir/README.md ================================================ # Vigere Shamir When added to a Shield, you are healed when you block ### Features - Successfully blocking an attack heals the player 1.5 hearts, but applies Mining Fatigue 6. - Builds on Gamemode 4's extension of the enchantment system, [Metallurgy]($dynamicLink:gm4_metallurgy) ================================================ FILE: gm4_vigere_shamir/beet.yaml ================================================ id: gm4_vigere_shamir name: Vigere Shamir version: 1.6.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_metallurgy: 1.8.0 schedule_loops: [main] model_data: - item: shield reference: shamir/vigere template: name: shamir metal: barimium textures_path: gm4_metallurgy:item/shamir/barimium website: description: Adds the shamir 'Vigere' to Metallurgy. It heals you when you block with a shield. recommended: [] notes: [] modrinth: project_id: 9QdXJeGc wiki: https://wiki.gm4.co/wiki/Metallurgy/Vigere_Shamir credits: Creator: - Djones - TheEpyonProject Icon Design: - BPR ================================================ FILE: gm4_vigere_shamir/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_vigere_shamir:check_item_validity" ] } ================================================ FILE: gm4_vigere_shamir/data/gm4_metallurgy/tags/function/summon_band/barimium.json ================================================ { "values":[ "gm4_vigere_shamir:summon_band" ] } ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/check_heal.mcfunction ================================================ # checks for players who have recently healed from Vigere and removes the attributes from gm4_vigere_shamir:heal # run from main execute as @a[tag=gm4_vs_healed] run function gm4_vigere_shamir:revert_health ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'vigere'}}] if items entity @s contents #gm4_vigere_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/heal.mcfunction ================================================ # Heals the player for 1.5 hearts after blocking with a Vigere Shield # at @s, player blocking with a Vigere Shield # runs from gm4_vigere_shamir:main execute store result score $remove_health gm4_ml_data run attribute @s minecraft:max_health get scoreboard players operation $remove_health gm4_ml_data -= @s gm4_health # lower player's max health to their current health execute if score $remove_health gm4_ml_data matches 512.. run attribute @s minecraft:max_health modifier add minecraft:e0c18b32-4caf-4193-8899-74ad1cc0dba2 -512 add_value execute if score $remove_health gm4_ml_data matches 512.. run scoreboard players remove $remove_health gm4_ml_data 512 execute if score $remove_health gm4_ml_data matches 256.. run attribute @s minecraft:max_health modifier add minecraft:f7676355-5de1-4167-9c01-2a274b5ee6bc -256 add_value execute if score $remove_health gm4_ml_data matches 256.. run scoreboard players remove $remove_health gm4_ml_data 256 execute if score $remove_health gm4_ml_data matches 128.. run attribute @s minecraft:max_health modifier add minecraft:2df88b31-a47f-4c31-a5b8-aa51ed1c35bb -128 add_value execute if score $remove_health gm4_ml_data matches 128.. run scoreboard players remove $remove_health gm4_ml_data 128 execute if score $remove_health gm4_ml_data matches 64.. run attribute @s minecraft:max_health modifier add minecraft:41fd129e-322f-4147-b2fa-8185206f5b8e -64 add_value execute if score $remove_health gm4_ml_data matches 64.. run scoreboard players remove $remove_health gm4_ml_data 64 execute if score $remove_health gm4_ml_data matches 32.. run attribute @s minecraft:max_health modifier add minecraft:1afb3106-b947-46ca-942a-cad1a78f5df7 -32 add_value execute if score $remove_health gm4_ml_data matches 32.. run scoreboard players remove $remove_health gm4_ml_data 32 execute if score $remove_health gm4_ml_data matches 16.. run attribute @s minecraft:max_health modifier add minecraft:04f2b196-ca85-4ac8-b8e0-a7d569b415c8 -16 add_value execute if score $remove_health gm4_ml_data matches 16.. run scoreboard players remove $remove_health gm4_ml_data 16 execute if score $remove_health gm4_ml_data matches 8.. run attribute @s minecraft:max_health modifier add minecraft:1f624b8a-89a4-4951-b4ce-f21890adbf89 -8 add_value execute if score $remove_health gm4_ml_data matches 8.. run scoreboard players remove $remove_health gm4_ml_data 8 execute if score $remove_health gm4_ml_data matches 4.. run attribute @s minecraft:max_health modifier add minecraft:52b90103-a8c1-40a1-b2dd-9e7feb978b52 -4 add_value execute if score $remove_health gm4_ml_data matches 4.. run scoreboard players remove $remove_health gm4_ml_data 4 execute if score $remove_health gm4_ml_data matches 2.. run attribute @s minecraft:max_health modifier add minecraft:c875bec0-f7e4-4479-a030-dc92eb39d29a -2 add_value execute if score $remove_health gm4_ml_data matches 2.. run scoreboard players remove $remove_health gm4_ml_data 2 execute if score $remove_health gm4_ml_data matches 1.. run attribute @s minecraft:max_health modifier add minecraft:41b9fe4f-ce8e-4025-8215-d47f9321b853 -1 add_value execute if score $remove_health gm4_ml_data matches 1.. run scoreboard players remove $remove_health gm4_ml_data 1 # heal player attribute @s minecraft:max_health modifier add minecraft:f32329fb-6205-4eda-9db8-9f9ccc85605f 3 add_value effect give @s minecraft:instant_health 1 0 true # revert max health tag @s add gm4_vs_healed scoreboard players reset $remove_health gm4_ml_data # visuals execute anchored eyes run particle minecraft:heart ^ ^-.2 ^.7 .2 .1 .2 1 3 normal playsound minecraft:block.brewing_stand.brew player @s ~ ~ ~ 0.3 0.8 # debuff effect give @s minecraft:mining_fatigue 3 5 true execute store success score $in_mainhand gm4_ml_data if predicate gm4_vigere_shamir:vigere_in_mainhand run item modify entity @s weapon.mainhand gm4_vigere_shamir:use_durability_mainhand execute unless score $in_mainhand gm4_ml_data matches 1.. run item modify entity @s weapon.offhand gm4_vigere_shamir:use_durability_offhand scoreboard players reset $in_mainhand gm4_ml_data ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/init.mcfunction ================================================ scoreboard objectives add gm4_vigere_use minecraft.used:minecraft.shield scoreboard objectives add gm4_health health execute unless score vigere_shamir gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Vigere Shamir"} execute unless score vigere_shamir gm4_earliest_version < vigere_shamir gm4_modules run scoreboard players operation vigere_shamir gm4_earliest_version = vigere_shamir gm4_modules scoreboard players set vigere_shamir gm4_modules 1 schedule function gm4_vigere_shamir:main 1t #$moduleUpdateList ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/main.mcfunction ================================================ execute as @a[gamemode=!spectator] if score @s gm4_vigere_use matches 1.. at @s[predicate=gm4_vigere_shamir:vigere_active] run function gm4_vigere_shamir:heal scoreboard players reset @a gm4_vigere_use schedule function gm4_vigere_shamir:check_heal 1t schedule function gm4_vigere_shamir:main 16t ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/revert_health.mcfunction ================================================ # @s = player that health from Vigere # run from check_heal # revert max health attribute @s minecraft:max_health modifier remove minecraft:e0c18b32-4caf-4193-8899-74ad1cc0dba2 attribute @s minecraft:max_health modifier remove minecraft:f7676355-5de1-4167-9c01-2a274b5ee6bc attribute @s minecraft:max_health modifier remove minecraft:2df88b31-a47f-4c31-a5b8-aa51ed1c35bb attribute @s minecraft:max_health modifier remove minecraft:41fd129e-322f-4147-b2fa-8185206f5b8e attribute @s minecraft:max_health modifier remove minecraft:1afb3106-b947-46ca-942a-cad1a78f5df7 attribute @s minecraft:max_health modifier remove minecraft:04f2b196-ca85-4ac8-b8e0-a7d569b415c8 attribute @s minecraft:max_health modifier remove minecraft:1f624b8a-89a4-4951-b4ce-f21890adbf89 attribute @s minecraft:max_health modifier remove minecraft:52b90103-a8c1-40a1-b2dd-9e7feb978b52 attribute @s minecraft:max_health modifier remove minecraft:c875bec0-f7e4-4479-a030-dc92eb39d29a attribute @s minecraft:max_health modifier remove minecraft:41b9fe4f-ce8e-4025-8215-d47f9321b853 attribute @s minecraft:max_health modifier remove minecraft:f32329fb-6205-4eda-9db8-9f9ccc85605f tag @s remove gm4_vs_healed ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium loot spawn ~ ~ ~ loot gm4_vigere_shamir:band ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/guidebook/vigere_shamir.json ================================================ { "id": "vigere_shamir", "name": "Vigere Shamir", "module_type": "expansion", "base_module": "metallurgy", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_vigere_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'vigere'}}" } } ] } }, "obtain_vigere_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.vigere_shamir.description", "fallback": "Vigere alters shields to heal the user upon blocking an attack." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_vigere_shamir", "obtain_vigere_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.vigere_shamir.usage", "fallback": "The Vigere Shamir is found on Barimium Bands. It can be placed onto shields.\n\nBlocking an attack will heal the user 1.5 hearts and apply Mining Fatigue VI for 3 seconds.\nHealing damages the shield more." } ] ] } ] } ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/item_modifier/use_durability_mainhand.json ================================================ [ { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": { "min": 1, "max": 255 } } ] } } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": 1 } ] } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.33 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": 2 } ] } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.25 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": { "min": 3, "max": 255 } } ] } } } } } ] } ] ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/item_modifier/use_durability_offhand.json ================================================ [ { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": { "min": 1, "max": 255 } } ] } } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": 1 } ] } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.33 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": 2 } ] } } } } } ] }, { "function": "minecraft:set_damage", "damage": { "type": "minecraft:uniform", "min": -0.003, "max": -0.024 }, "add": true, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.25 }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:enchantments": [ { "enchantments": "minecraft:unbreaking", "levels": { "min": 3, "max": 255 } } ] } } } } } ] } ] ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:barimium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_vigere_shamir:shamir/vigere"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'vigere'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.vigere", "fallback": "Vigere Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/predicate/vigere_active.json ================================================ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:reference", "name": "gm4_vigere_shamir:vigere_in_mainhand" }, { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}" } } } } } ] } ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/predicate/vigere_in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:shield" ], "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'vigere'}}" } } } } } ================================================ FILE: gm4_vigere_shamir/data/gm4_vigere_shamir/tags/item/valid_items.json ================================================ { "values": [ "minecraft:shield" ] } ================================================ FILE: gm4_vigere_shamir/translations.csv ================================================ key,en_us item.gm4.shamir.vigere,Vigere Shamir text.gm4.guidebook.module_desc.vigere_shamir,Adds the shamir 'Vigere' to Metallurgy. It heals you when you block with a shield. text.gm4.guidebook.vigere_shamir.description,Vigere alters shields to heal the user upon blocking an attack. text.gm4.guidebook.vigere_shamir.usage,The Vigere Shamir is found on Barimium Bands. It can be placed onto shields.\n\nBlocking an attack will heal the user 1.5 hearts and apply Mining Fatigue VI for 3 seconds.\nHealing damages the shield more. ================================================ FILE: gm4_washing_tanks/README.md ================================================ # Washing Tanks Remove dye from items in a Liquid Tank filled with Water! ### Features - Extends the features of the Gamemode 4 [Liquid Tanks]($dynamicLink:gm4_liquid_tanks) data pack - Remove the dye from any item by putting it in a Liquid Tank with Water - All other info on the item (name/lore) is retained ================================================ FILE: gm4_washing_tanks/beet.yaml ================================================ id: gm4_washing_tanks name: Washing Tanks version: 1.6.X data_pack: load: . require: - bolt pipeline: - gm4.plugins.extend.module meta: gm4: versioning: required: gm4_liquid_tanks: 3.1.0 website: description: Die! Dye! Remove die from items in a Liquid Tank filled with Water, at the cost of ⅓ of a bucket. recommended: [] notes: [] modrinth: project_id: ipiZnkaE wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Washing_Tanks credits: Creators: - Bunnygamers - Misode Icon Design: - BPR ================================================ FILE: gm4_washing_tanks/data/gm4_liquid_tanks/tags/function/item_fill.json ================================================ { "values":[ "gm4_washing_tanks:item_fill" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/function/init.mcfunction ================================================ execute unless score washing_tanks gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Washing Tanks"} execute unless score washing_tanks gm4_earliest_version < washing_tanks gm4_modules run scoreboard players operation washing_tanks gm4_earliest_version = washing_tanks gm4_modules scoreboard players set washing_tanks gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/function/item_fill.mcfunction ================================================ #@s = liquid tank with item in first slot #run from liquid_tanks:item_process execute if entity @s[tag=gm4_lt_water] run function gm4_washing_tanks:wash ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/function/wash.mcfunction ================================================ #@s = water tank liquid_tank_stand with item in first slot #run from item_fill conversions = { "glass": "glass", "glass_pane": "glass_pane", "terracotta": "terracotta", "wool": "white_wool", "bed": "white_bed", "carpet": "white_carpet", "shulker_box": "shulker_box", "harness": "white_harness", "bundle": "bundle", "candle": "candle" } for from_id, to_id in conversions.items(): execute if items block ~ ~ ~ container.0 f"#gm4_washing_tanks:{from_id}" run function f"gm4_washing_tanks:washing_recipes/{from_id}": scoreboard players set $item_value gm4_lt_value -1 item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand from block ~ ~ ~ container.0 item modify entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand {"function":"minecraft:set_item", "item":f"minecraft:{to_id}"} function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill execute if items block ~ ~ ~ container.0 #gm4_washing_tanks:armour[dyed_color] run function gm4_washing_tanks:washing_recipes/armour: scoreboard players set $item_value gm4_lt_value -1 item replace entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand from block ~ ~ ~ container.0 item modify entity 00344d47-0004-0004-0004-000f04ce104d weapon.mainhand {"function":"minecraft:set_components", "components":{"!minecraft:dyed_color":{}}} function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/guidebook/washing_tanks.json ================================================ { "id": "washing_tanks", "name": "Washing Tanks", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:leather_leggings" }, "criteria": { "obtain_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{id:\"liquid_tank\"}}" } } ] } }, "obtain_water_bucket": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:water_bucket" ] } ] } } }, "sections": [ { "name": "usage", "enable": [], "requirements": [ [ "obtain_liquid_tank" ], [ "obtain_water_bucket" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.washing_tanks.usage", "fallback": "Water tanks can wash dyed items placed inside the tank.\n\nTerracotta, beds, wool, carpet, glass, glass panes, leather armour, and shulker boxes can be undyed." } ] ] } ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/armour.json ================================================ { "values": [ "minecraft:leather_boots", "minecraft:leather_leggings", "minecraft:leather_chestplate", "minecraft:leather_helmet", "minecraft:leather_horse_armor", "minecraft:wolf_armor" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/bed.json ================================================ { "values": [ "minecraft:orange_bed", "minecraft:magenta_bed", "minecraft:light_blue_bed", "minecraft:yellow_bed", "minecraft:lime_bed", "minecraft:pink_bed", "minecraft:gray_bed", "minecraft:light_gray_bed", "minecraft:cyan_bed", "minecraft:purple_bed", "minecraft:blue_bed", "minecraft:brown_bed", "minecraft:green_bed", "minecraft:red_bed", "minecraft:black_bed" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/bundle.json ================================================ { "values": [ "minecraft:black_bundle", "minecraft:blue_bundle", "minecraft:brown_bundle", "minecraft:cyan_bundle", "minecraft:gray_bundle", "minecraft:green_bundle", "minecraft:light_blue_bundle", "minecraft:light_gray_bundle", "minecraft:lime_bundle", "minecraft:magenta_bundle", "minecraft:orange_bundle", "minecraft:pink_bundle", "minecraft:purple_bundle", "minecraft:red_bundle", "minecraft:yellow_bundle", "minecraft:white_bundle" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/candle.json ================================================ { "values": [ "minecraft:white_candle", "minecraft:orange_candle", "minecraft:magenta_candle", "minecraft:light_blue_candle", "minecraft:yellow_candle", "minecraft:lime_candle", "minecraft:pink_candle", "minecraft:gray_candle", "minecraft:light_gray_candle", "minecraft:cyan_candle", "minecraft:purple_candle", "minecraft:blue_candle", "minecraft:brown_candle", "minecraft:green_candle", "minecraft:red_candle", "minecraft:black_candle" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/carpet.json ================================================ { "values": [ "minecraft:orange_carpet", "minecraft:magenta_carpet", "minecraft:light_blue_carpet", "minecraft:yellow_carpet", "minecraft:lime_carpet", "minecraft:pink_carpet", "minecraft:gray_carpet", "minecraft:light_gray_carpet", "minecraft:cyan_carpet", "minecraft:purple_carpet", "minecraft:blue_carpet", "minecraft:brown_carpet", "minecraft:green_carpet", "minecraft:red_carpet", "minecraft:black_carpet" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/glass.json ================================================ { "values": [ "minecraft:white_stained_glass", "minecraft:orange_stained_glass", "minecraft:magenta_stained_glass", "minecraft:light_blue_stained_glass", "minecraft:yellow_stained_glass", "minecraft:lime_stained_glass", "minecraft:pink_stained_glass", "minecraft:gray_stained_glass", "minecraft:light_gray_stained_glass", "minecraft:cyan_stained_glass", "minecraft:purple_stained_glass", "minecraft:blue_stained_glass", "minecraft:brown_stained_glass", "minecraft:green_stained_glass", "minecraft:red_stained_glass", "minecraft:black_stained_glass" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/glass_pane.json ================================================ { "values": [ "minecraft:white_stained_glass_pane", "minecraft:orange_stained_glass_pane", "minecraft:magenta_stained_glass_pane", "minecraft:light_blue_stained_glass_pane", "minecraft:yellow_stained_glass_pane", "minecraft:lime_stained_glass_pane", "minecraft:pink_stained_glass_pane", "minecraft:gray_stained_glass_pane", "minecraft:light_gray_stained_glass_pane", "minecraft:cyan_stained_glass_pane", "minecraft:purple_stained_glass_pane", "minecraft:blue_stained_glass_pane", "minecraft:brown_stained_glass_pane", "minecraft:green_stained_glass_pane", "minecraft:red_stained_glass_pane", "minecraft:black_stained_glass_pane" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/harness.json ================================================ { "values": [ "minecraft:orange_harness", "minecraft:magenta_harness", "minecraft:light_blue_harness", "minecraft:yellow_harness", "minecraft:lime_harness", "minecraft:pink_harness", "minecraft:gray_harness", "minecraft:light_gray_harness", "minecraft:cyan_harness", "minecraft:purple_harness", "minecraft:blue_harness", "minecraft:brown_harness", "minecraft:green_harness", "minecraft:red_harness", "minecraft:black_harness" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/shulker_box.json ================================================ { "values": [ "minecraft:white_shulker_box", "minecraft:orange_shulker_box", "minecraft:magenta_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:yellow_shulker_box", "minecraft:lime_shulker_box", "minecraft:pink_shulker_box", "minecraft:gray_shulker_box", "minecraft:light_gray_shulker_box", "minecraft:cyan_shulker_box", "minecraft:purple_shulker_box", "minecraft:blue_shulker_box", "minecraft:brown_shulker_box", "minecraft:green_shulker_box", "minecraft:red_shulker_box", "minecraft:black_shulker_box" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/terracotta.json ================================================ { "values": [ "minecraft:white_terracotta", "minecraft:orange_terracotta", "minecraft:magenta_terracotta", "minecraft:light_blue_terracotta", "minecraft:yellow_terracotta", "minecraft:lime_terracotta", "minecraft:pink_terracotta", "minecraft:gray_terracotta", "minecraft:light_gray_terracotta", "minecraft:cyan_terracotta", "minecraft:purple_terracotta", "minecraft:blue_terracotta", "minecraft:brown_terracotta", "minecraft:green_terracotta", "minecraft:red_terracotta", "minecraft:black_terracotta" ] } ================================================ FILE: gm4_washing_tanks/data/gm4_washing_tanks/tags/item/wool.json ================================================ { "values": [ "minecraft:orange_wool", "minecraft:magenta_wool", "minecraft:light_blue_wool", "minecraft:yellow_wool", "minecraft:lime_wool", "minecraft:pink_wool", "minecraft:gray_wool", "minecraft:light_gray_wool", "minecraft:cyan_wool", "minecraft:purple_wool", "minecraft:blue_wool", "minecraft:brown_wool", "minecraft:green_wool", "minecraft:red_wool", "minecraft:black_wool" ] } ================================================ FILE: gm4_washing_tanks/translations.csv ================================================ key,en_us text.gm4.guidebook.module_desc.washing_tanks,"Die! Dye! Remove die from items in a Liquid Tank filled with Water, at the cost of ⅓ of a bucket." text.gm4.guidebook.washing_tanks.usage,"Water tanks can wash dyed items placed inside the tank.\n\nTerracotta, beds, wool, carpet, glass, glass panes, leather armour, and shulker boxes can be undyed." ================================================ FILE: gm4_weighted_armour/README.md ================================================ # Weighted Armour A great way to add some variety to your UHC tournaments, or just some spice for everyday monster fighting. Weighted armour slows the player down depending on their armour points. Players now have the tactical choice between speed and protection. ### Features - Slowness levels increase with armour points. - Full leather armour causes no slowness, while full diamond armour causes slowness III. - Players should consider what level of protection they need for different activities, and have a few different outfits to wear accordingly - When used together with [Metallurgy]($dynamicLink:gm4_metallurgy) data pack, the Helious shamir can be used to counteract the weight of armour. ================================================ FILE: gm4_weighted_armour/assets/translations.csv ================================================ key,en_us item.gm4.shamir.helious,Helious Shamir text.gm4.guidebook.module_desc.helious_shamir,"Perfect for UHCs, this module forces you to balance protection with speed." text.gm4.guidebook.helious_shamir.description,"Helious hinders weighted armour, allowing users to wear more armour without slowing down." text.gm4.guidebook.helious_shamir.usage,The Helious Shamir is found on Aluminium Bands. It can be placed onto armour.\n\nEach Helious piece will reduce weighted armour by one slowness level. Too little of weight will cause levitation and wither effects. text.gm4.guidebook.module_desc.weighted_armour,"Perfect for UHCs, this module forces you to balance protection with speed." text.gm4.guidebook.weighted_armour.description,Users will be slowed down based on how much armour they have on. text.gm4.guidebook.weighted_armour.weight,The weight is purely based on how much armor one has on. Slowness III is applied for full armor points. text.gm4.guidebook.weighted_armour.weight_and_helious,The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\n\nThe Helious Shamir can help prevent armour slowness. ================================================ FILE: gm4_weighted_armour/beet.yaml ================================================ id: gm4_weighted_armour name: Weighted Armour version: 1.9.X data_pack: load: . resource_pack: load: ../gm4_metallurgy pipeline: - gm4_metallurgy.shamir_model_template - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [main] model_data: - item: armor reference: shamir/helious template: name: shamir metal: aluminium textures_path: gm4_metallurgy:item/shamir/aluminium website: description: Perfect for UHCs, this module forces you to balance protection with speed. recommended: [] notes: [] modrinth: project_id: ReZCIa6j video: https://www.youtube.com/watch?v=rVRSXTGQPbg wiki: https://wiki.gm4.co/wiki/Weighted_Armour credits: Creator: - Sparks Icon Design: - Hozz ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/function/apply_weight_effects.mcfunction ================================================ #@s = all players #run from weighted_armour:main via #gm4_weighted_armor:apply_weight_effects effect give @s[scores={gm4_armor_weight=..-1}] levitation 1 0 effect give @s[scores={gm4_armor_weight=..-1}] wither 1 1 ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/function/check_item_validity.mcfunction ================================================ #@s = band is trying to apply to #run from #gm4_metallurgy:check_item_validity execute if items entity @e[type=item,tag=gm4_ml_source,dx=0] contents *[custom_data~{gm4_metallurgy:{stored_shamir:'helious'}}] if items entity @s contents #gm4_helious_shamir:valid_items run scoreboard players set valid_item gm4_ml_data 1 ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/function/summon_band.mcfunction ================================================ # @s = a mould with matching metal inside #run from metallurgy:casting/summon_band/aluminium via #gm4_metallurgy:summon_band/aluminium loot spawn ~ ~ ~ loot gm4_helious_shamir:band ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/function/weight_modifier.mcfunction ================================================ #@s = all players #run from weighted_armour:main via #gm4_weighted_armor:weight_modifiers scoreboard players remove @s[predicate=gm4_helious_shamir:helious_head] gm4_armor_weight 1 scoreboard players remove @s[predicate=gm4_helious_shamir:helious_chest] gm4_armor_weight 1 scoreboard players remove @s[predicate=gm4_helious_shamir:helious_legs] gm4_armor_weight 1 scoreboard players remove @s[predicate=gm4_helious_shamir:helious_feet] gm4_armor_weight 1 ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/guidebook/helious_shamir.json ================================================ { "id": "helious_shamir", "name": "Helious Shamir", "module_type": "expansion", "load_check": "weighted_armour", "base_module": "metallurgy", "wiki_link": "https://wiki.gm4.co/Metallurgy/Helious_Shamir", "icon": { "id": "minecraft:anvil" }, "criteria": { "obtain_helious_shamir": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,stored_shamir:'helious'}}" } } ] } }, "obtain_helious_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{has_shamir:1b,active_shamir:'helious'}}" } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.helious_shamir.description", "fallback": "Helious hinders weighted armour, allowing users to wear more armour without slowing down." } ] ] }, { "name": "usage", "enable": [], "requirements": [ [ "obtain_helious_shamir", "obtain_helious_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.helious_shamir.usage", "fallback": "The Helious Shamir is found on Aluminium Bands. It can be placed onto armour.\n\nEach Helious piece will reduce weighted armour by one slowness level. Too little of weight will cause levitation and wither effects." } ] ] } ] } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/loot_table/band.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_metallurgy:aluminium_band", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_weighted_armour:shamir/helious"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_metallurgy:{stored_shamir:'helious'}}" }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.shamir.helious", "fallback": "Helious Shamir", "italic": false, "color": "gray" } ] } ] } ] } ] } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_chest.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "chest": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'helious'}}" } } } } } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_feet.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "feet": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'helious'}}" } } } } } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_head.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'helious'}}" } } } } } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/predicate/helious_legs.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "legs": { "predicates": { "minecraft:custom_data": "{gm4_metallurgy:{active_shamir:'helious'}}" } } } } } ================================================ FILE: gm4_weighted_armour/data/gm4_helious_shamir/tags/item/valid_items.json ================================================ { "values": [ "#minecraft:foot_armor", "#minecraft:leg_armor", "#minecraft:chest_armor", "#minecraft:head_armor" ] } ================================================ FILE: gm4_weighted_armour/data/gm4_metallurgy/tags/function/check_item_validity.json ================================================ { "values": [ "gm4_helious_shamir:check_item_validity" ] } ================================================ FILE: gm4_weighted_armour/data/gm4_metallurgy/tags/function/summon_band/aluminium.json ================================================ { "values":[ "gm4_helious_shamir:summon_band" ] } ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/function/init.mcfunction ================================================ scoreboard objectives add gm4_armor armor scoreboard objectives add gm4_armor_weight dummy execute unless score weighted_armour gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Weighted Armour"} execute unless score weighted_armour gm4_earliest_version < weighted_armour gm4_modules run scoreboard players operation weighted_armour gm4_earliest_version = weighted_armour gm4_modules scoreboard players set weighted_armour gm4_modules 1 schedule function gm4_weighted_armour:main 1t #$moduleUpdateList ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/function/main.mcfunction ================================================ execute as @a run function gm4_weighted_armour:player schedule function gm4_weighted_armour:main 16t ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/function/player.mcfunction ================================================ #@s = as @a #at world spawn scoreboard players set @s gm4_armor_weight 0 scoreboard players set @s[scores={gm4_armor=8..15}] gm4_armor_weight 1 scoreboard players set @s[scores={gm4_armor=16..19}] gm4_armor_weight 2 scoreboard players set @s[scores={gm4_armor=20..}] gm4_armor_weight 3 # allow other modules to modify weight function #gm4_weighted_armour:weight_modifiers # allow other modules to apply effects depending on weight function #gm4_weighted_armour:weight_effects effect give @s[scores={gm4_armor_weight=1}] slowness 2 0 true effect give @s[scores={gm4_armor_weight=2}] slowness 2 1 true effect give @s[scores={gm4_armor_weight=3}] slowness 2 2 true ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/guidebook/weighted_armour.json ================================================ { "id": "weighted_armour", "name": "Weighted Armour", "module_type": "module", "icon": { "id": "minecraft:iron_chestplate" }, "criteria": { "wear_armor": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": "this", "score": "gm4_armor" }, "range": { "min": 8 } } ] } }, "wear_heavy_armor": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": "this", "score": "gm4_armor" }, "range": { "min": 16 } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "wear_armor" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.weighted_armour.description", "fallback": "Users will be slowed down based on how much armour they have on." } ] ] }, { "name": "weight", "enable": [ { "id": "gm4_metallurgy", "load": -1 } ], "requirements": [ [ "wear_heavy_armor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.weighted_armour.weight", "fallback": "The weight is purely based on how much armor one has on. Slowness III is applied for full armor points." } ] ] }, { "name": "weight_and_helious", "enable": [ { "id": "gm4_metallurgy", "load": 1 } ], "requirements": [ [ "wear_heavy_armor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.weighted_armour.weight_and_helious", "fallback": "The weight is purely based on how much armor one has on. Slowness III is applied for full armor points.\n\nThe Helious Shamir can help prevent armour slowness." } ] ] } ] } ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/tags/function/weight_effects.json ================================================ { "values":["gm4_helious_shamir:apply_weight_effects"] } ================================================ FILE: gm4_weighted_armour/data/gm4_weighted_armour/tags/function/weight_modifiers.json ================================================ { "values":["gm4_helious_shamir:weight_modifier"] } ================================================ FILE: gm4_zauber_cauldrons/README.md ================================================ # Zauber Cauldrons Powerful potions, Wormholes, portable Beacons and special armour that makes you stronger! ### Features - Adds the creation for higher tier Potions above a Brewing Stand - Allows the player to create teleportation Potions - Adds a set of permanent Potion crystals if the player has enough Luck - To balance the data pack, crafting powerful Potions can have... side effects ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/models/block/zauber_cauldron.json ================================================ { "ambientocclusion": false, "textures": { "4": "gm4_zauber_cauldrons:block/cauldron_inside", "top": "gm4_zauber_cauldrons:block/cauldron_top", "bottom": "gm4_zauber_cauldrons:block/cauldron_bottom", "particle": "gm4_zauber_cauldrons:block/cauldron_side", "side": "gm4_zauber_cauldrons:block/cauldron_side", "inside": "gm4_zauber_cauldrons:block/cauldron_inner" }, "elements": [ { "from": [2.1, 2.9, 2.1], "to": [13.9, 4.1, 13.9], "faces": { "up": {"uv": [2, 2, 14, 14], "texture": "#inside"}, "down": {"uv": [2.1, 2.1, 13.9, 13.9], "texture": "#inside"} } }, { "from": [-0.1, 2.9, 13.9], "to": [13.9, 16.1, 16.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [14, 0, 0, 13], "texture": "#4", "cullface": "south"}, "south": {"uv": [0, 0, 14, 13], "texture": "#side", "cullface": "south"}, "west": {"uv": [14, 0, 16, 13], "texture": "#side", "cullface": "south"}, "up": {"uv": [0, 13.8, 14, 16], "texture": "#top", "cullface": "up"}, "down": {"uv": [2, 0, 14, 2], "texture": "#inside"} } }, { "from": [13.9, -0.1, 11.9], "to": [16.1, 2.9, 13.9], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [2.2, 13, 4.2, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [4.4, 13.8, 2.2, 16], "rotation": 270, "texture": "#bottom"} } }, { "from": [11.9, -0.1, 13.9], "to": [16.1, 2.9, 16.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [12.1, 13, 16, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [0, 13.8, 4.2, 16], "rotation": 180, "texture": "#bottom"} } }, { "from": [13.9, 2.9, 2.1], "to": [16.1, 16.1, 16.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "east": {"uv": [0, 0, 14, 13], "texture": "#side", "cullface": "south"}, "south": {"uv": [14, 0, 16, 13], "texture": "#side", "cullface": "south"}, "west": {"uv": [14, 0, 0, 13], "texture": "#4", "cullface": "south"}, "up": {"uv": [0, 13.8, 14, 16], "rotation": 270, "texture": "#top", "cullface": "up"}, "down": {"uv": [2, 0, 14, 2], "rotation": 90, "texture": "#inside"} } }, { "from": [11.9, -0.1, -0.1], "to": [13.9, 2.9, 2.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [2.2, 13, 4.2, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [4.4, 13.8, 2.2, 16], "texture": "#bottom"} } }, { "from": [13.9, -0.1, -0.1], "to": [16.1, 2.9, 4.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [12.1, 13, 16, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [0, 13.8, 4.2, 16], "rotation": 270, "texture": "#bottom"} } }, { "from": [2.1, 2.9, -0.1], "to": [16.1, 16.1, 2.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 0, 14, 13], "texture": "#side", "cullface": "south"}, "east": {"uv": [14, 0, 16, 13], "texture": "#side", "cullface": "south"}, "south": {"uv": [14, 0, 0, 13], "texture": "#4", "cullface": "south"}, "up": {"uv": [0, 13.8, 14, 16], "rotation": 180, "texture": "#top", "cullface": "up"}, "down": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#inside"} } }, { "from": [-0.1, -0.1, 2.1], "to": [2.1, 2.9, 4.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [2.2, 13, 4.2, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [4.4, 13.8, 2.2, 16], "rotation": 90, "texture": "#bottom"} } }, { "from": [-0.1, -0.1, -0.1], "to": [4.1, 2.9, 2.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [12.1, 13, 16, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [0, 13.8, 4.2, 16], "texture": "#bottom"} } }, { "from": [-0.1, 2.9, -0.1], "to": [2.1, 16.1, 13.9], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [14, 0, 16, 13], "texture": "#side", "cullface": "south"}, "east": {"uv": [14, 0, 0, 13], "texture": "#4", "cullface": "south"}, "west": {"uv": [0, 0, 14, 13], "texture": "#side", "cullface": "south"}, "up": {"uv": [0, 13.8, 14, 16], "rotation": 90, "texture": "#top", "cullface": "up"}, "down": {"uv": [2, 0, 14, 2], "rotation": 270, "texture": "#inside"} } }, { "from": [-0.1, -0.1, 11.9], "to": [2.1, 2.9, 16.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [12.1, 13, 16, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [0, 13.8, 4.2, 16], "rotation": 90, "texture": "#bottom"} } }, { "from": [2.1, -0.1, 13.9], "to": [4.1, 2.9, 16.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [12, 13, 16, 16], "texture": "#side", "cullface": "south"}, "east": {"uv": [0, 13, 2.2, 16], "texture": "#side", "cullface": "south"}, "south": {"uv": [2.2, 13, 4.2, 16], "texture": "#side", "cullface": "south"}, "west": {"uv": [0, 13, 2, 16], "texture": "#side", "cullface": "south"}, "down": {"uv": [4.4, 13.8, 2.2, 16], "rotation": 180, "texture": "#bottom"} } } ] } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_armor_layer_1.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_1_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_armor_layer_2.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_2_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_armor_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_attack_layer_1.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_1_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_attack_layer_2.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_2_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_attack_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_health_layer_1.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_1_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_health_layer_2.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_2_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_health_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_speed_layer_1.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_1_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_1.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/anim/zauber_speed_layer_2.properties ================================================ from=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_2_anim.png to=gm4_zauber_cauldrons:optifine/cit/zauber_speed_layer_2.png x=0 y=0 w=64 h=32 interpolate=true tile.0=0 duration.0=30 tile.1=0 duration.1=2 tile.2=1 duration.2=2 tile.3=2 duration.3=2 tile.4=3 duration.4=2 tile.5=4 duration.5=2 tile.6=5 duration.6=2 tile.7=6 duration.7=2 ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_armor.properties ================================================ type=armor matchItems=golden_boots texture.gold_layer_1=zauber_armor_layer_1 nbt.CustomModelData=$item/zauber_armor/armor_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_attack.properties ================================================ type=armor matchItems=golden_boots texture.gold_layer_1=zauber_attack_layer_1 nbt.CustomModelData=$item/zauber_armor/attack_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_health.properties ================================================ type=armor matchItems=golden_boots texture.gold_layer_1=zauber_health_layer_1 nbt.CustomModelData=$item/zauber_armor/health_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_boots_speed.properties ================================================ type=armor matchItems=golden_boots texture.gold_layer_1=zauber_speed_layer_1 nbt.CustomModelData=$item/zauber_armor/speed_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_armor.properties ================================================ type=armor matchItems=golden_chestplate texture.gold_layer_1=zauber_armor_layer_1 nbt.CustomModelData=$item/zauber_armor/armor_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_attack.properties ================================================ type=armor matchItems=golden_chestplate texture.gold_layer_1=zauber_attack_layer_1 nbt.CustomModelData=$item/zauber_armor/attack_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_health.properties ================================================ type=armor matchItems=golden_chestplate texture.gold_layer_1=zauber_health_layer_1 nbt.CustomModelData=$item/zauber_armor/health_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_chestplate_speed.properties ================================================ type=armor matchItems=golden_chestplate texture.gold_layer_1=zauber_speed_layer_1 nbt.CustomModelData=$item/zauber_armor/speed_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_armor.properties ================================================ type=armor matchItems=golden_helmet texture.gold_layer_1=zauber_armor_layer_1 nbt.CustomModelData=$item/zauber_armor/armor_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_attack.properties ================================================ type=armor matchItems=golden_helmet texture.gold_layer_1=zauber_attack_layer_1 nbt.CustomModelData=$item/zauber_armor/attack_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_health.properties ================================================ type=armor matchItems=golden_helmet texture.gold_layer_1=zauber_health_layer_1 nbt.CustomModelData=$item/zauber_armor/health_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_helmet_speed.properties ================================================ type=armor matchItems=golden_helmet texture.gold_layer_1=zauber_speed_layer_1 nbt.CustomModelData=$item/zauber_armor/speed_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_armor.properties ================================================ type=armor matchItems=golden_leggings texture.gold_layer_2=zauber_armor_layer_2 nbt.CustomModelData=$item/zauber_armor/armor_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_attack.properties ================================================ type=armor matchItems=golden_leggings texture.gold_layer_2=zauber_attack_layer_2 nbt.CustomModelData=r$item/zauber_armor/attack_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_health.properties ================================================ type=armor matchItems=golden_leggings texture.gold_layer_2=zauber_health_layer_2 nbt.CustomModelData=$item/zauber_armor/health_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/optifine/cit/zauber_leggings_speed.properties ================================================ type=armor matchItems=golden_leggings texture.gold_layer_2=zauber_speed_layer_2 nbt.CustomModelData=$item/zauber_armor/speed_boost ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/crystal.png.mcmeta ================================================ { "animation": { "frametime": 1, "frames": [ { "index": 0, "time": 55 }, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/instant_damage.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/instant_health.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/jump_boost.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/poison.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/regeneration.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/speed.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/crystal/strength.png.mcmeta ================================================ { "animation": { "frametime": 8, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/enchanted_prismarine_shard.png.mcmeta ================================================ { "animation": { "frametime": 20, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/magic_in_a_bottle.png.mcmeta ================================================ { "animation": { "frametime": 12, "interpolate": true, "frames": [ 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/wormhole_in_a_bottle.png.mcmeta ================================================ { "animation": { "frametime": 12, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/wormhole_in_a_bottle_overlay.png.mcmeta ================================================ { "animation": { "frametime": 6, "interpolate": true } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/boots.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/helmet.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/armor_boost/leggings.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/boots.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/helmet.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/attack_boost/leggings.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/boots.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/helmet.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/health_boost/leggings.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/boots.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/chestplate.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/helmet.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/gm4_zauber_cauldrons/textures/item/zauber_armor/speed_boost/leggings.png.mcmeta ================================================ { "animation": { "frametime": 2, "interpolate": true, "frames": [ { "index": 0, "time": 19 }, 0, 1, 2, 3, 4, 5, 6] } } ================================================ FILE: gm4_zauber_cauldrons/assets/model_data.yaml ================================================ model_data: - item: prismarine_shard reference: item/enchanted_prismarine_shard template: generated - item: glass_bottle reference: item/magic_in_a_bottle template: generated - item: potion reference: item/wormhole_in_a_bottle template: generated_overlay - item: player_head template: generated broadcast: - reference: item/crystal/instant_damage - reference: item/crystal/instant_health - reference: item/crystal/jump_boost - reference: item/crystal/poison - reference: item/crystal/regeneration - reference: item/crystal/speed - reference: item/crystal/strength # potion solutions registered by generate.py # armor registered by generate.py # magicol liquid registered by generate.py - item: [potion, splash_potion, lingering_potion] template: vanilla broadcast: - reference: item/bottled_magicol/polar - reference: item/bottled_magicol/temperate - reference: item/bottled_magicol/arid - item: [potion, splash_potion, lingering_potion] template: vanilla broadcast: - reference: item/bottled_magicol_soulution/polar - reference: item/bottled_magicol_soulution/temperate - reference: item/bottled_magicol_soulution/arid - item: structure_void reference: block/zauber_cauldron transforms: - name: item_display origin: [0.5,0.5,0.125] scale: [1,1,1] display: thirdperson_righthand - item: cauldron reference: gui/advancement/zauber_cauldrons_create template: advancement - item: chorus_fruit reference: gui/advancement/zauber_cauldrons_wormhole template: name: advancement forward: item/wormhole_in_a_bottle - item: glass_bottle reference: gui/advancement/zauber_cauldron_drink_multi_use_bottle template: advancement - item: golden_chestplate reference: gui/advancement/zauber_cauldrons_full_armor template: name: advancement forward: item/zauber_armor/attack_boost/chestplate - item: rabbit_foot reference: gui/advancement/zauber_cauldrons_rabbit template: advancement - item: potion reference: gui/advancement/zauber_cauldrons_drink_all_magicol template: name: advancement forward: item/bottled_magicol/temperate_potion - item: clock reference: gui/advancement/zauber_cauldrons_make_magicol template: name: advancement forward: minecraft:clock_00 - item: grass_block reference: gui/advancement/zauber_cauldrons_paint_biome template: advancement ================================================ FILE: gm4_zauber_cauldrons/assets/translations.csv ================================================ key,en_us advancement.gm4.zauber_cauldrons.creation.description,Create a Zauber Cauldron advancement.gm4.zauber_cauldrons.creation.title,Potion Chef advancement.gm4.zauber_cauldrons.drink_all_magicol.description,Drink all colors of Magicol advancement.gm4.zauber_cauldrons.drink_all_magicol.title,Taste the Rainbow advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.description,Take the ninth sip out of a single bottle advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.title,Clean Plate Club advancement.gm4.zauber_cauldrons.full_armour.description,Suit up with a full suit of Zauber Armor advancement.gm4.zauber_cauldrons.full_armour.title,Underrated Materials advancement.gm4.zauber_cauldrons.make_magicol.description,Wait for the right Moon phase to make some Magicol advancement.gm4.zauber_cauldrons.make_magicol.title,Seeing Things in a New Light advancement.gm4.zauber_cauldrons.paint_biome.description,Use Bottled Magicol to give a biome a new look advancement.gm4.zauber_cauldrons.paint_biome.title,Spreading the Magic advancement.gm4.zauber_cauldrons.rabbit.description,Where did my lunch go? advancement.gm4.zauber_cauldrons.rabbit.title,Soup Kitchen Magician advancement.gm4.zauber_cauldrons.wormhole.description,Just like the rabbits! advancement.gm4.zauber_cauldrons.wormhole.title,Questionable Ingredients entity.gm4.possessed_item,Possessed Item\u00A7 entity.gm4.zauber_cauldrons.smog.instant_health,their own incompetence entity.gm4.zauber_cauldrons.smog.regeneration,the mess they made entity.gm4.zauber_cauldrons.smog.poison,the mess they made item.gm4.enchanted_prismarine_shard,Enchanted Prismarine Shard item.gm4.magic_in_a_bottle,Magic in a Bottle item.gm4.wormhole_in_a_bottle,Wormhole in a Bottle item.gm4.zauber_cauldrons.bottled_magicol.arid,Bottle of Arid Magicol item.gm4.zauber_cauldrons.bottled_magicol.polar,Bottle of Polar Magicol item.gm4.zauber_cauldrons.bottled_magicol.temperate,Bottle of Temperate Magicol item.gm4.zauber_cauldrons.bottled_magicol.tint.black,Black Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.blue,Blue Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.brown,Brown Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.cyan,Cyan Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.gray,Gray Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.green,Green Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.light_blue,Light Blue Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.light_gray,Light Gray Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.lime,Lime Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.magenta,Magenta Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.orange,Orange Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.pink,Pink Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.purple,Purple Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.red,Red Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.white,White Tint item.gm4.zauber_cauldrons.bottled_magicol.tint.yellow,Yellow Tint item.gm4.zauber_cauldrons.crystal.instant_damage,Crystal of Harming item.gm4.zauber_cauldrons.crystal.instant_health,Crystal of Healing item.gm4.zauber_cauldrons.crystal.jump_boost,Crystal of Leaping item.gm4.zauber_cauldrons.crystal.poison,Crystal of Poison item.gm4.zauber_cauldrons.crystal.regeneration,Crystal of Regeneration item.gm4.zauber_cauldrons.crystal.speed,Crystal of Swiftness item.gm4.zauber_cauldrons.crystal.strength,Crystal of Strength item.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.arid,Soulution of Arid Magicol item.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.polar,Soulution of Polar Magicol item.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.temperate,Soulution of Temperate Magicol item.gm4.zauber_cauldrons.multi_use_bottle.lingering.harming,Lingering Soulution of Harming item.gm4.zauber_cauldrons.multi_use_bottle.lingering.healing,Lingering Soulution of Healing item.gm4.zauber_cauldrons.multi_use_bottle.lingering.leaping,Lingering Soulution of Leaping item.gm4.zauber_cauldrons.multi_use_bottle.lingering.poison,Lingering Soulution of Poison item.gm4.zauber_cauldrons.multi_use_bottle.lingering.regeneration,Lingering Soulution of Regeneration item.gm4.zauber_cauldrons.multi_use_bottle.lingering.strength,Lingering Soulution of Strength item.gm4.zauber_cauldrons.multi_use_bottle.lingering.swiftness,Lingering Soulution of Swiftness item.gm4.zauber_cauldrons.multi_use_bottle.lore.sips,Sips item.gm4.zauber_cauldrons.multi_use_bottle.lore.throws,Throws item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.harming,Soulution of Harming item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.healing,Soulution of Healing item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.leaping,Soulution of Leaping item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.poison,Soulution of Poison item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.regeneration,Soulution of Regeneration item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.strength,Soulution of Strength item.gm4.zauber_cauldrons.multi_use_bottle.drinkable.swiftness,Soulution of Swiftness item.gm4.zauber_cauldrons.multi_use_bottle.splash.harming,Splash Soulution of Harming item.gm4.zauber_cauldrons.multi_use_bottle.splash.healing,Splash Soulution of Healing item.gm4.zauber_cauldrons.multi_use_bottle.splash.leaping,Splash Soulution of Leaping item.gm4.zauber_cauldrons.multi_use_bottle.splash.poison,Splash Soulution of Poison item.gm4.zauber_cauldrons.multi_use_bottle.splash.regeneration,Splash Soulution of Regeneration item.gm4.zauber_cauldrons.multi_use_bottle.splash.strength,Splash Soulution of Strength item.gm4.zauber_cauldrons.multi_use_bottle.splash.swiftness,Splash Soulution of Swiftness item.gm4.zauber_cauldrons.zauber_armor.boots,Zauber Boots item.gm4.zauber_cauldrons.zauber_armor.chestplate,Zauber Chestplate item.gm4.zauber_cauldrons.zauber_armor.helmet,Zauber Helmet item.gm4.zauber_cauldrons.zauber_armor.leggings,Zauber Leggings item.gm4.zauber_cauldrons.zauber_armor.magic,+%s%% Magic text.gm4.guidebook.module_desc.zauber_cauldrons,"Powerful potions, Wormholes, portable Beacons and special armour that makes you stronger! Zauber Cauldrons adds an entire magic branch to the game." text.gm4.guidebook.zauber_cauldrons.description,"Zauber Cauldrons expand the magic system, allowing the creation of stronger potions, magical armour, effect granting crystals, and bottled wormholes." text.gm4.guidebook.zauber_cauldrons.section.creation,Creation text.gm4.guidebook.zauber_cauldrons.creation,A Zauber Cauldron is created by holding an enchanted book while looking into a water-filled cauldron over fire.\n\nSoul fire and campfires work as well. text.gm4.guidebook.zauber_cauldrons.recipes,"Zauber recipes are performed by dropping items into the cauldron, consuming some water for each recipe.\n\nWhen looking at a Zauber Cauldron, items inside the cauldron won't be picked up." text.gm4.guidebook.zauber_cauldrons.section.potions,Zauber Potions text.gm4.guidebook.zauber_cauldrons.tier_4_potions,"Powerful tier IV potions can be created by dropping a tier II potion, prismarine crystals, and golden apple into the cauldron.\n\nThere are some side effects when creating the tier IV potions." text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_potions,Splash and Lingering potions create an excess of heat and will explode if used in a tier IV potion recipe.\n\nUsing a snow powder cauldron will absorb the heat and successfully create a splash or lingering tier IV potion. text.gm4.guidebook.zauber_cauldrons.soulutions,Using soul fire underneath the cauldron will cause all brewed potions to be brewed as a Soulution.\n\nSoulutions can be drank 9 times before emptying. text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_soulutions,"Splash and Lingering soulutions can be created in the same way.\n\nWhen it lands, a splash or lingering soulution will summon a new soulution bottle at the location." text.gm4.guidebook.zauber_cauldrons.section.enchanted_prismarine_shard,Advanced Reactants text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard,An enchanted prismarine shard is used to upgrade armour and as a way to get Luck.\n\nThey can be created in a Zauber Cauldron or bought from a wandering trader. text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard_creation,They can be created by dropping a prismarine shard in the cauldron while standing nearby with at least 30 experience levels.\n\nThis will consume 30 levels from the nearest applicable observer. text.gm4.guidebook.zauber_cauldrons.section.armor,Zauber Armour text.gm4.guidebook.zauber_cauldrons.armor,"Zauber armour can be made with a piece of gold armour, an enchanted prismarine shard and a modifier item." text.gm4.guidebook.zauber_cauldrons.armor_modifiers,The following items can be used as a modifier.\n\nGlistering Melon\n +6 health\nBlaze Powder\n +35% Attack Damage\nSugar\n +12% Speed\nTurtle Helmet\n +1 Armour\n\nWearing a full set buffs the most prevalent modifier(s). text.gm4.guidebook.zauber_cauldrons.armor_effects,"Zauber armour has about a 55% increase in defense compared to normal gold armour.\n\nEach piece of Zauber Armour also has an Armour Toughness of 3, making it comparable to diamond armour." text.gm4.guidebook.zauber_cauldrons.section.crystals,Zauber Crystals text.gm4.guidebook.zauber_cauldrons.crystals,"Zauber Crystals can be created with a sea lantern, nether star and tier IV potion.\n\nCrystals only function in the offhand of someone with the luck effect." text.gm4.guidebook.zauber_cauldrons.section.luck,Luck text.gm4.guidebook.zauber_cauldrons.lucky_flowers,Each world has a different set of 'lucky' and 'poisonous' flowers.\n\nEach of the twelve small flowers fall under one of those categories. text.gm4.guidebook.zauber_cauldrons.luck_output,"These flowers are used for the Luck recipe, which grants the nearest one with Luck until death.\n\nIf some of the lucky flowers are missing from the Luck recipe, then nothing will happen." text.gm4.guidebook.zauber_cauldrons.luck_output_poison,"However, if a poisonous flower is added to the recipe, the cauldron will emit a poisonous cloud." text.gm4.guidebook.zauber_cauldrons.luck,"Luck can be granted to the nearest user by throwing lucky flowers, an enchanted prismarine shard, and short grass into a zauber cauldron." text.gm4.guidebook.zauber_cauldrons.section.extra_ingredients,Magic in a Bottle text.gm4.guidebook.zauber_cauldrons.extra_ingredients,"Any extra ingredients added to a Zauber recipe will leave the cauldron as Possessed Items, weaponless vexes." text.gm4.guidebook.zauber_cauldrons.bottling_vexes,"If a glass bottle is added to a recipe with extra ingredients, it can instead capture multiples of 3 Possessed Items.\n\nSo if 4 possessed items would normally spawn, 3 would be contained and 1 would be free." text.gm4.guidebook.zauber_cauldrons.magic_in_a_bottle,"If a Magic in a Bottle is left on the ground, the bottle will break and release the vexes.\n\nA Magic in a Bottle stores the location it was created which is useful in creating wormholes." text.gm4.guidebook.zauber_cauldrons.bottled_vex_moon_phase,"Each Magic in a Bottle has a preferred moon phase.\n\nDuring this moon phase, the bottle doesn't break as quickly and will sparkle to players wearing full zauber armor." text.gm4.guidebook.zauber_cauldrons.section.magicol,Magicol text.gm4.guidebook.zauber_cauldrons.magicol_description,"Water inside a Cauldron can be converted into a liquid called Magicol.\n\nMagicol is useful for converting areas into colored, spawn-proof biomes." text.gm4.guidebook.zauber_cauldrons.magicol_creation,"Dropping Magic in a Bottle, an enchanted prismarine shard and a dye into a water-filled zauber cauldron will dye the liquid into magicol.\n\nThe level of the liquid is conserved through this process." text.gm4.guidebook.zauber_cauldrons.magicol_bottling,"Magicol can be bottled only during the preferred moon phase of the magic in a bottle used to create it." text.gm4.guidebook.zauber_cauldrons.magicol_bottling_1,"Magicol can be bottled by dropping a splash or lingering water bottle and one piece of prismarine crystals, along with either a slime ball, magma cream, or snowball." text.gm4.guidebook.zauber_cauldrons.downfall,"Magicol bottled with slime balls will be temperate with rain.\n\nWith magma cream they will be arid with no rain, and with snowballs they will be polar with snow." text.gm4.guidebook.zauber_cauldrons.magicol_potion_types,"Soulutions can be created as normal.\n\nLingering bottles of magicol will create permanent particles inside the biome.\n\nDrinkable bottles of magicol can be created, but have no effect." text.gm4.guidebook.zauber_cauldrons.bottled_magicol_usage,Throwing a magicol bottle will cause the splashed area to turn into a new biome.\n\nThese biomes are colored according to the magicol liquid and do not spawn any mobs. text.gm4.guidebook.zauber_cauldrons.magicol_biome_colors,"When a new magicol biome is created, short grass and flowers will grow.\n\nLucky flowers are the only ones that grow when first splashing an area." text.gm4.guidebook.zauber_cauldrons.section.wormholes,Wormholes text.gm4.guidebook.zauber_cauldrons.wormhole_creation,"Throwing an Enchanted Shard, Magic in a Bottle, and some quantity of both Chorus Fruit and Popped Chorus Fruit will create a Wormhole in a Bottle with the location of the Magic in a Bottle." text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts,"The precise amount of fruit is different for each world, and requires experiments with blurry wormholes and possessed items.\n\nToo few chorus will result in blurry wormholes, locating to a random nearby location." text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts_1,"If too many chorus or popped chorus are used, the excess fruit will transform into possessed items, but a precise wormhole will be created." text.gm4.guidebook.zauber_cauldrons.wormhole_teleportation,"Wormholes explode when the drinker reaches their destination, damaging surrounding blocks without harming the drinker.\n\nIf they end up in a cauldron, there no is explosion." ================================================ FILE: gm4_zauber_cauldrons/beet.yaml ================================================ id: gm4_zauber_cauldrons name: Zauber Cauldrons version: 2.0.X data_pack: load: . resource_pack: load: . require: - bolt pipeline: - gm4_zauber_cauldrons.generate - gm4.plugins.extend.module - gm4.plugins.include.lib_forceload - gm4.plugins.include.lib_brewing - gm4.plugins.include.lib_potion_tracking meta: gm4: versioning: required: lib_forceload: 1.6.0 lib_brewing: 1.5.0 lib_potion_tracking: 1.4.0 schedule_loops: - main - cauldron/extra_items/process_bottled_vex_items website: description: Powerful potions, Wormholes, portable Beacons and special armour that makes you stronger! Zauber Cauldrons adds an entire magic branch to the game. recommended: - gm4_resource_pack - gm4_zauber_liquids notes: [] video: https://www.youtube.com/watch?v=Io1JTFUzyrc wiki: https://wiki.gm4.co/wiki/Zauber_Cauldrons credits: Creator: - Bloo Updated by: - Bloo - Lue - BPR - Misode Textures: - Memo - Kyrius Icon Design: - DuckJr ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_create.json ================================================ { "display": { "icon": { "id": "cauldron", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_create"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.creation.title", "fallback": "Potion Chef" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.creation.description", "fallback": "Create a Zauber Cauldron", "color": "gray" } }, "parent": "gm4:root", "criteria": { "create_zauber_cauldron": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_drink_all_magicol.json ================================================ { "display": { "icon": { "id": "minecraft:potion", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_drink_all_magicol"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.drink_all_magicol.title", "fallback": "Taste the Rainbow" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.drink_all_magicol.description", "fallback": "Drink all colors of Magicol", "color": "gray" }, "frame": "challenge", "hidden": false }, "parent": "gm4:zauber_cauldrons_make_magicol", "criteria": { "white_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"white\"}}" } } } }, "light_gray_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"light_gray\"}}" } } } }, "gray_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"gray\"}}" } } } }, "black_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"black\"}}" } } } }, "brown_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"brown\"}}" } } } }, "red_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"red\"}}" } } } }, "orange_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"orange\"}}" } } } }, "yellow_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"yellow\"}}" } } } }, "lime_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"lime\"}}" } } } }, "green_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"green\"}}" } } } }, "cyan_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"cyan\"}}" } } } }, "light_blue_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"light_blue\"}}" } } } }, "blue_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"blue\"}}" } } } }, "purple_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"purple\"}}" } } } }, "magenta_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"magenta\"}}" } } } }, "pink_magicol": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"pink\"}}" } } } } }, "requirements": [ [ "white_magicol" ], [ "light_gray_magicol" ], [ "gray_magicol" ], [ "black_magicol" ], [ "brown_magicol" ], [ "red_magicol" ], [ "orange_magicol" ], [ "yellow_magicol" ], [ "lime_magicol" ], [ "green_magicol" ], [ "cyan_magicol" ], [ "light_blue_magicol" ], [ "blue_magicol" ], [ "purple_magicol" ], [ "magenta_magicol" ], [ "pink_magicol" ] ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_drink_multi_use_bottle.json ================================================ { "display": { "icon": { "id": "glass_bottle", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldron_drink_multi_use_bottle"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.title", "fallback": "Clean Plate Club" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.drink_multi_use_bottle.description", "fallback": "Take the ninth sip out of a single bottle", "color": "gray" } }, "parent": "gm4:zauber_cauldrons_create", "criteria": { "consume_multi_use_bottle": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{multi_use:1b,sips:1}}}" } } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_full_armor.json ================================================ { "display": { "icon": { "id": "minecraft:golden_chestplate", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_full_armor"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.full_armour.title", "fallback": "Underrated Materials" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.full_armour.description", "fallback": "Suit up with a full suit of Zauber Armor", "color": "gray" } }, "parent": "gm4:zauber_cauldrons_create", "criteria": { "wear_full_zauber_armor": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_zauber_cauldrons:player/equipment/armor/full" } ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_make_magicol.json ================================================ { "display": { "icon": { "id": "clock", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_make_magicol"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.make_magicol.title", "fallback": "Seeing Things in a New Light" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.make_magicol.description", "fallback": "Wait for the right Moon phase to make some Magicol", "color": "gray" }, "frame": "task", "hidden": false }, "parent": "gm4:zauber_cauldrons_full_armor", "criteria": { "make_magicol": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_paint_biome.json ================================================ { "display": { "icon": { "id": "grass_block", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_paint_biome"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.paint_biome.title", "fallback": "Spreading the Magic" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.paint_biome.description", "fallback": "Use Bottled Magicol to give a biome a new look", "color": "gray" }, "frame": "goal", "hidden": false }, "parent": "gm4:zauber_cauldrons_make_magicol", "criteria": { "paint_biome": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_rabbit.json ================================================ { "display": { "icon": { "id": "rabbit_foot", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_rabbit"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.rabbit.title", "fallback": "Soup Kitchen Magician" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.rabbit.description", "fallback": "Where did my lunch go?", "color": "gray" }, "frame": "goal", "hidden": true }, "parent": "gm4:zauber_cauldrons_full_armor", "criteria": { "teleport_rabbit": { "trigger": "minecraft:impossible" } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4/advancement/zauber_cauldrons_wormhole.json ================================================ { "display": { "icon": { "id": "chorus_fruit", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:gui/advancement/zauber_cauldrons_wormhole"]} } }, "title": { "translate": "advancement.gm4.zauber_cauldrons.wormhole.title", "fallback": "Questionable Ingredients" }, "description": { "translate": "advancement.gm4.zauber_cauldrons.wormhole.description", "fallback": "Just like the rabbits!", "color": "gray" } }, "parent": "gm4:zauber_cauldrons_create", "criteria": { "use_wormhole_bottle": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}" } } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_brewing/tags/function/insert/lingering.json ================================================ { "values": [ "gm4_zauber_cauldrons:brewing_stand/lingering" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_brewing/tags/function/insert/splash.json ================================================ { "values": [ "gm4_zauber_cauldrons:brewing_stand/splash" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_potion_tracking/tags/function/potion_landed.json ================================================ { "values": [ "gm4_zauber_cauldrons:thrown_potion_tracking/verify_potion_nbt" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_potion_tracking/tags/function/tag_potion.json ================================================ { "values": [ "gm4_zauber_cauldrons:thrown_potion_tracking/tag_potion" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_0.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:cauldron" ] } } } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:cauldron/liquid/update/level_0/find_cauldron" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_1.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:water_cauldron" ], "state": { "level": "1" } } } } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:cauldron/liquid/update/level_1/find_cauldron" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_2.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:water_cauldron" ], "state": { "level": "2" } } } } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:cauldron/liquid/update/level_2/find_cauldron" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/cauldron/level_3.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:any_of", "terms": [ { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:water_cauldron" ], "state": { "level": "3" } } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": [ "minecraft:lava_cauldron", "minecraft:powder_snow" ] } } } ] } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:cauldron/liquid/update/level_3/find_cauldron" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/equipment/has_full_armor.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:reference", "name": "gm4_zauber_cauldrons:player/equipment/armor/full" } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:player/armor/apply_set_bonus" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/equipment/unequipped_armor.json ================================================ { "criteria": { "requirement": { "trigger": "minecraft:inventory_changed", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_zauber_cauldrons:equipment/has_full_armor": true } } } }, { "condition": "minecraft:inverted", "term": { "condition": "minecraft:reference", "name": "gm4_zauber_cauldrons:player/equipment/armor/full" } } ] } } }, "rewards": { "function": "gm4_zauber_cauldrons:player/armor/revoke_set_bonus" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/join.json ================================================ { "criteria": { "join_world": { "trigger": "location" } }, "rewards": { "function": "gm4_zauber_cauldrons:player/assign_id" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/use/multi_use_bottle.json ================================================ { "criteria": { "use_multi_sip": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}" } } } } }, "rewards": { "function": "gm4_zauber_cauldrons:player/multi_use_bottle/check_gamemode" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/advancement/use/wormhole.json ================================================ { "criteria": { "consume_wormhole_bottle": { "trigger": "minecraft:consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}" } } } } }, "rewards": { "function": "gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport" } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/age_painters.mcfunction ================================================ # Commands painters to paint at specific age values # @s = @e[type=marker,tag=gm4_zc_magicol_painter] # at @s # run from bottled_magicol/maintain_magicol_painters # time fillbiome scoreboard players add @s gm4_zc_magicol_painter_timer 1 execute if score @s gm4_zc_magicol_painter_timer matches 1 run playsound minecraft:entity.illusioner.prepare_mirror block @a[distance=..16] ~ ~ ~ 0.2 0.5 0.5 execute if score @s gm4_zc_magicol_painter_timer matches 6 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome execute if score @s gm4_zc_magicol_painter_timer matches 13 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome execute if score @s gm4_zc_magicol_painter_timer matches 20 run function gm4_zauber_cauldrons:bottled_magicol/prepare_fillbiome execute if score @s gm4_zc_magicol_painter_timer matches 20 run kill @s # set flag execute unless score @s gm4_zc_magicol_painter_timer matches 20.. run scoreboard players set $found_painter gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/fillbiome.mcfunction ================================================ # Fills the biome around a magicol painter # @s = @e[type=marker,tag=gm4_zc_magicol_painter] # at @s # run from bottled_magicol/prepare_fillbiome # change biome $fillbiome ~-$(radius) ~-$(radius) ~-$(radius) ~$(radius) ~$(radius) ~$(radius) $(biome) # place lucky (non-poisonous) flowers $execute if score $$(flower) gm4_zc_flowers matches 0 run place feature gm4_zauber_cauldrons:$(flower)_patch ~ ~ ~ $execute if score $$(flower) gm4_zc_flowers matches 0 run effect give @a[gamemode=!spectator,distance=..5] minecraft:luck 90 0 true # place tall grass particle minecraft:composter ~ ~ ~ 2 0.3 2 0 24 place feature gm4_zauber_cauldrons:short_grass_patch ~ ~ ~ # sound effect & particles playsound minecraft:block.chorus_flower.grow block @a[distance=..16] ~ ~ ~ 1 0.77 $particle minecraft:end_rod ~$(random_x_1) ~$(random_y_1) ~$(random_z_1) 0.2 0.2 0.2 0.1 24 $particle minecraft:end_rod ~$(random_x_2) ~$(random_y_2) ~$(random_z_2) 0.2 0.2 0.2 0.1 24 # grant advancement advancement grant @a[distance=..12,gamemode=!spectator] only gm4:zauber_cauldrons_paint_biome ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/maintain_magicol_painters.mcfunction ================================================ # Maintains magicol painters during their painting animation # @s = none # at world spawn # scheduled by bottled_magicol// functions when a magicol potion hits the ground execute as @e[type=marker,tag=gm4_zc_magicol_painter] at @s run function gm4_zauber_cauldrons:bottled_magicol/age_painters # reschedule execute if score $found_painter gm4_zc_data matches 1.. run schedule function gm4_zauber_cauldrons:bottled_magicol/maintain_magicol_painters 1t scoreboard players reset $found_painter gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/potion_landed.mcfunction ================================================ # Selects color of magicol thrown # @s = @e[type=marker,tag=gm4_potion_tracker] # at @s # run from zauber_cauldrons:soulution/thrown_potion_tracking/verify_potion_nbt # pull data of thrown potion into storage data modify storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item set from storage gm4_potion_tracking:temp entity_data.Item # select color # called functions are generated via beet from templates # generated with the help of bolt for color_data in ctx.meta['magicol_colors']: execute unless score $selected_color gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item.components."minecraft:custom_data".gm4_zauber_cauldrons{color:color_data['color']} run function f"gm4_zauber_cauldrons:bottled_magicol/{color_data['color']}/select_weather_modifier" # reset storage and fake players data remove storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item scoreboard players reset $selected_color gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/bottled_magicol/prepare_fillbiome.mcfunction ================================================ # Loads data from the marker to initiate the fillbiome command # @s = @e[type=marker,tag=gm4_zc_magicol_painter] # at @s # run from bottled_magicol/age_painters # load biome name into storage data modify storage gm4_zauber_cauldrons:temp/bottled_magicol/painter biome set from entity @s data.gm4_zauber_cauldrons.biome data modify storage gm4_zauber_cauldrons:temp/bottled_magicol/painter flower set from entity @s data.gm4_zauber_cauldrons.flower execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter radius int 0.25 run scoreboard players get @s gm4_zc_magicol_painter_timer execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_x_1 int 1 run random value -3..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_y_1 int 1 run random value 0..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_z_1 int 1 run random value -3..3 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_x_2 int 1 run random value -5..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_y_2 int 1 run random value 0..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates execute store result storage gm4_zauber_cauldrons:temp/bottled_magicol/painter random_z_2 int 1 run random value -5..5 gm4_zauber_cauldrons:bottled_magicol/particle_coordinates # fillbiome function gm4_zauber_cauldrons:bottled_magicol/fillbiome with storage gm4_zauber_cauldrons:temp/bottled_magicol/painter # reset storage data remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter biome data remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter flower data remove storage gm4_zauber_cauldrons:temp/bottled_magicol/painter radius ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/brewing_stand/lingering.mcfunction ================================================ # @s = brewing stand marker with a custom splash potion to be converted to a lingering potion # run from #gm4_brewing:insert/lingering execute if data entity @s data.gm4_brewing.insert.components."minecraft:custom_data".gm4_zauber_cauldrons{item:"splash_potion"} run scoreboard players set $insert gm4_brewing_data -1 execute if score $insert gm4_brewing_data matches -1 run summon tnt ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/brewing_stand/splash.mcfunction ================================================ # @s = brewing stand marker with a custom potion to be converted to a splash potion # run from #gm4_brewing:insert/splash execute if data entity @s data.gm4_brewing.insert.components."minecraft:custom_data".gm4_zauber_cauldrons{item:"potion"} run scoreboard players set $insert gm4_brewing_data -1 execute if score $insert gm4_brewing_data matches -1 run summon tnt ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/catch_possessed_items.mcfunction ================================================ # @s = zauber cauldron with overflow items and bottle(s) inside # run from prepare_bottle # at @s # read amount of excess items execute store result storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.vex_count int 1 run scoreboard players get @s gm4_zc_fullness # copy coordinates and dimension of cauldron to bottled vex item data modify storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients location # calculate and store preferred moon phase execute store result score $cauldron_x gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.x execute store result score $cauldron_y gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.y execute store result score $cauldron_z gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.cauldron_pos.z scoreboard players operation $cauldron_x gm4_zc_data /= #256 gm4_zc_moon_phase scoreboard players operation $cauldron_y gm4_zc_data /= #256 gm4_zc_moon_phase scoreboard players operation $cauldron_z gm4_zc_data /= #256 gm4_zc_moon_phase scoreboard players operation $cauldron_x gm4_zc_data += $cauldron_y gm4_zc_data scoreboard players operation $cauldron_x gm4_zc_data += $cauldron_z gm4_zc_data scoreboard players operation $cauldron_x gm4_zc_data += $magicol_offset gm4_zc_moon_phase scoreboard players operation $cauldron_x gm4_zc_data %= #8 gm4_zc_moon_phase execute store result storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons.preferred_moon_phase int 1 run scoreboard players get $cauldron_x gm4_zc_data # spawn item loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/bottled_vex # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # reset storage data remove storage gm4_zauber_cauldrons:temp/item/bottled_vex gm4_zauber_cauldrons # reset fake players scoreboard players reset $cauldron_x gm4_zc_data scoreboard players reset $cauldron_y gm4_zc_data scoreboard players reset $cauldron_z gm4_zc_data # store success scoreboard players set $bottled_possessed_items gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/create_possessed_items.mcfunction ================================================ # @s = zauber cauldron with overflow items OR bottled_vex item on ground # run from use_extra_items AND release_from_bottle # at @s # summons 1 vex for every unused item entity in a cauldron or every vex in bottle (on recipe processing) summon vex ~ ~ ~ {CustomName:{translate:"entity.gm4.possessed_item",fallback:"Possessed Item§"},CustomNameVisible:false,Team:"gm4_hide_name",life_ticks:320,attributes:[{id:"minecraft:attack_damage",base:2}],Health:4.0f,Motion:[0.0,0.25,0.0],active_effects:[{id:"minecraft:resistance",amplifier:10,duration:20,show_particles:false}]} scoreboard players remove @s gm4_zc_fullness 1 execute if score @s gm4_zc_fullness matches 1.. run function gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/failed_catch_possessed_items.mcfunction ================================================ # @s = zauber cauldron with overflow items and bottle(s) inside # at align xyz # run from prepare_bottle # animation particle minecraft:block{block_state:"minecraft:glass"} ~ ~.3 ~ 0.12 0.12 0.12 0 23 playsound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3 # re-add one to fullness (shards of broken bottle) scoreboard players add @s gm4_zc_fullness 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/prepare_bottle.mcfunction ================================================ # @s = zauber cauldron with overflow items and bottle(s) inside # run from cauldron/structure/use_extra_items # at center of block # remove one from fullness (bottle to be bottled into) scoreboard players remove @s gm4_zc_fullness 1 # copy fullness and take mod 3 scoreboard players operation $mod_fullness gm4_zc_fullness = @s gm4_zc_fullness scoreboard players operation $mod_fullness gm4_zc_fullness %= #modulo gm4_zc_fullness # catch possessed items if modulo returns 0 execute if score $mod_fullness gm4_zc_fullness matches 0 run function gm4_zauber_cauldrons:cauldron/extra_items/catch_possessed_items # failed catch execute if score $mod_fullness gm4_zc_fullness matches 1.. at @s run function gm4_zauber_cauldrons:cauldron/extra_items/failed_catch_possessed_items ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/process_bottled_vex_items.mcfunction ================================================ # @s = none # at world spawn # scheduled every 48t # get current moon phase execute store result score $current gm4_zc_moon_phase run time query minecraft:moon scoreboard players operation $current gm4_zc_moon_phase /= #24000 gm4_zc_moon_phase scoreboard players operation $current gm4_zc_moon_phase %= #8 gm4_zc_moon_phase # release vexes from bottled vexes execute as @e[type=item] if items entity @s contents *[custom_data~{gm4_zauber_cauldrons:{item:"bottled_vex"}}] at @s run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/check_timer # reschedule schedule function gm4_zauber_cauldrons:cauldron/extra_items/process_bottled_vex_items 48t ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/check_timer.mcfunction ================================================ # @s = bottled vex item # run from cauldron/extra_items/process_bottled_vex_items # at @s # initialize newly thrown bottles execute unless score @s gm4_zc_bottled_vex_escape_timer matches -2147483648..2147483647 run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/initialize_bottle # decrease timer execute if score @s gm4_zc_bottled_vex_escape_timer matches 0.. run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/crack_bottle # break free (if the moon phase is right, the bottle survives an additional tick) execute if score @s gm4_zc_bottled_vex_escape_timer matches 1 unless function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/release execute if score @s gm4_zc_bottled_vex_escape_timer matches ..0 run function gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/release ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/crack_bottle.mcfunction ================================================ # @s = bottled vex item # run from cauldron/extra_items/release_from_bottle/check_timer # at @s # decrease timer scoreboard players remove @s gm4_zc_bottled_vex_escape_timer 1 # play sound and particles playsound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 0.1 1.9 particle minecraft:block{block_state:"minecraft:glass"} ~ ~ ~ 0.1 0.1 0.1 0 1 # players wearing zauber armor can tell if its the right moon phase execute if score @s gm4_zc_moon_phase = $current gm4_zc_moon_phase if function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run particle minecraft:electric_spark ~ ~.2 ~ 0.15 0.15 0.15 0.01 3 normal @a[distance=..8,advancements={gm4_zauber_cauldrons:equipment/has_full_armor=true}] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/initialize_bottle.mcfunction ================================================ # @s = bottled vex item # run from cauldron/extra_items/release_from_bottle/check_timer # at @s # set initial score scoreboard players set @s gm4_zc_bottled_vex_escape_timer 3 # load data from item data modify storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex set from entity @s Item.components."minecraft:custom_data".gm4_zauber_cauldrons execute store result score @s gm4_zc_moon_phase run data get storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex.preferred_moon_phase execute store result score @s gm4_zc_fullness run data get storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex.vex_count # reset storage data remove storage gm4_zauber_cauldrons:temp/cauldron/extra_items bottled_vex ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/extra_items/release_from_bottle/release.mcfunction ================================================ # @s = bottled vex item # run from cauldron/extra_items/release_from_bottle/prepare_release # at @s # release vex and kill bottled vex item function gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items playsound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3 particle minecraft:block{block_state:"minecraft:glass"} ~ ~ ~ 0.12 0.12 0.12 0 16 kill @s ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/check_liquid_id.mcfunction ================================================ # confirms the liquid id to be 'magicol' before displaying particles # @s = zauber cauldron with valid structure # at @s align xyz # run via function tag #gm4_zauber_cauldrons:cauldron/liquid/cauldron_particles from cauldron/structure/valid # check liquid id unless another expansion already displayed a particle execute unless score $displayed_liquid_particle gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:"magicol"} run function gm4_zauber_cauldrons:cauldron/liquid/magicol/particles ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/check_moon_phase.mcfunction ================================================ # Checks the moon phase, time, and weather for the correct conditions for magicol bottling. Used to display sparkle particles and to bottle magicol. # @s = varies # at varies # run in if function conditions from gm4_zauber_cauldrons:cauldron/extra_items/release_from_bottle/check_timer, gm4_zauber_cauldrons:recipes/magicol/bottled/<...>/<...>/<...>, and gm4_zauber_cauldrons:cauldron/liquid/magicol/particles # require clear night and correct moon phase execute unless predicate gm4_zauber_cauldrons:cauldron/clear_night run return fail execute unless score $preferred gm4_zc_moon_phase = $current gm4_zc_moon_phase run return fail return 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/magicol/particles.mcfunction ================================================ # particles displayed over a cauldron when it is filled with magicol # @s = zauber cauldron with valid structure # at @s align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/magicol/check_liquid_id # display enchant particles for players with full zauber armor during the correct moon phase scoreboard players reset $preferred gm4_zc_moon_phase execute store result score $preferred gm4_zc_moon_phase run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid.magicol.moon_phase execute if function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run particle minecraft:electric_spark ~.5 ~.78 ~.5 0.25 0.25 0.25 0.01 6 normal @a[distance=..8,advancements={gm4_zauber_cauldrons:equipment/has_full_armor=true}] # make sure the cauldron is in loaded chunks to avoid entity buildup execute unless loaded ~ ~ ~ run return -1 # if liquid id is magicol, display particles # generated with the help of bolt for color_data in ctx.meta['magicol_colors']: # TODO 1.20.5: figure out how this particle looked in 1.20.4 execute unless score $displayed_magicol_particle gm4_zc_data matches 1.. store success score $displayed_magicol_particle gm4_zc_data if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:"magicol",magicol:{color:color_data['color']}} unless entity @e[type=area_effect_cloud,dx=0,limit=1] run summon area_effect_cloud ~.5 ~.75 ~.5 {CustomName:"gm4_zc_magicol_particle",Tags:["gm4_zc_magicol_particle"],custom_particle:{type:"minecraft:entity_effect",color:[1.0,1.0,1.0,1.0]},Radius:0.1f,Duration:10,Color:int(color_data['potion_color'].to_color_code('dec'))} # set flag scoreboard players set $displayed_liquid_particle gm4_zc_data 1 # reset fake player scoreboard players reset $displayed_magicol_particle gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/from_score.mcfunction ================================================ # loads the liquid level into the blockstate of the cauldron from its liquid level score # @s = zauber cauldron # at @s align xyz # run from cauldron/structure/analyze/liquid and recipes which need to update the liquid level execute if score @s gm4_zc_liquid_level matches 0 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/set execute if score @s gm4_zc_liquid_level matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set execute if score @s gm4_zc_liquid_level matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set execute if score @s gm4_zc_liquid_level matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/find_cauldron.mcfunction ================================================ # initiates a raycast to locate a zauber cauldron which was set to level=0 (minecraft:cauldron) by a player # @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand. # at @s # run from advancement cauldron/level_0 advancement revoke @s only gm4_zauber_cauldrons:cauldron/level_0 # remember player who has interacted with the cauldron tag @s add gm4_zc_actor # find cauldron that was interacted with scoreboard players set $ray gm4_zc_data 50 scoreboard players set $found gm4_zc_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray # remove tag tag @s remove gm4_zc_actor # reset fake players scoreboard players reset $ray gm4_zc_data scoreboard players reset $found gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/item_used/bucket.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction # check if an expansion handles this liquid type being removed via bucket. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data. function #gm4_zauber_cauldrons:cauldron/liquid/fill_bucket_from_cauldron # if no expansion handles this liquid type being removed via bucket, fall back to default behavior: # reset the cauldron to to its previous level and return the bucket to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_bucket # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/item_used/glass_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction # check if an expansion handles this liquid type being removed via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data. function #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron # if no expansion handles this liquid type being removed via bottle, fall back to default behavior: # reset the cauldron to to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/ray.mcfunction ================================================ # ray cast to find cauldron # @s = player that used a bucket (or bottle) to empty a cauldron # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/find_cauldron # check block scoreboard players set $found gm4_zc_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/reconstruct_interaction # runs the loop again scoreboard players remove $ray gm4_zc_data 1 execute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/reconstruct_interaction.mcfunction ================================================ # reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:cauldron (level=0) state based on the previous state of the cauldron. # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_0/ray scoreboard players set $found gm4_zc_data 1 # check whether the player who caused the interaction was in creative or survival/adventure execute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode # store fill level to fake player to enable easier access for expansions # make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0 execute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level scoreboard players add $previous_fill_level gm4_zc_data 0 # if the cauldron was at level=3 previously a bucket must have been used on the cauldron execute if score $previous_fill_level gm4_zc_data matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/item_used/bucket # if the cauldron was at level=1 previously a glass bottle must have been used on the cauldron execute if score $previous_fill_level gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/item_used/glass_bottle # reset fake player scoreboard players reset $actor_gamemode gm4_zc_data scoreboard players reset $previous_fill_level gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_0/set.mcfunction ================================================ # removes the custom liquid from a cauldron # @s = zauber cauldron # at @s align xyz # run from cauldron/liquid/level_update and cauldron/liquid/update//item_used/ fill ~ ~ ~ ~ ~ ~ cauldron replace #minecraft:cauldrons scoreboard players reset @s gm4_zc_liquid_level # kill display and remove liquid id from cauldron kill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] data modify entity @s data.gm4_zauber_cauldrons.liquid set value "none" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/find_cauldron.mcfunction ================================================ # initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=1] by a player # @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand. # at @s # run from advancement cauldron/level_1 advancement revoke @s only gm4_zauber_cauldrons:cauldron/level_1 # remember player who has interacted with the cauldron tag @s add gm4_zc_actor # find cauldron that was interacted with scoreboard players set $ray gm4_zc_data 50 scoreboard players set $found gm4_zc_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray # remove tag tag @s remove gm4_zc_actor # reset fake players scoreboard players reset $ray gm4_zc_data scoreboard players reset $found gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/item_used/glass_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # check if an expansion handles this liquid type being removed via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data. function #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron # if no expansion handles this liquid type being removed via bottle, fall back to default behavior: # reset the cauldron to to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/item_used/water_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # check if an expansion handles this liquid type being added via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the # liquid type in case the cauldron was empty; an empty cauldron has no liquid level score. function #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron # if no expansion handles this liquid type being added via bottle, fall back to default behavior: # reset the cauldron to to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_0/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/ray.mcfunction ================================================ # ray cast to find cauldron # @s = player who has interacted with a cauldron # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/find_cauldron # check block scoreboard players set $found gm4_zc_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # runs the loop again scoreboard players remove $ray gm4_zc_data 1 execute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/reconstruct_interaction.mcfunction ================================================ # reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=1] state based on the previous state of the cauldron. # @s = cauldron that was interacted with # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/ray scoreboard players set $found gm4_zc_data 1 # check whether the player who caused the interaction was in creative or survival/adventure execute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode # store fill level to fake player to enable easier access for expansions # make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0 execute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level scoreboard players add $previous_fill_level gm4_zc_data 0 # if the cauldron did not have a fill level before a full bottle must have been used on an empty cauldron, in this case no intervention is needed # noop # if the cauldron was at level=2 previously a glass bottle must have been used on the cauldron execute if score $previous_fill_level gm4_zc_data matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/item_used/glass_bottle # reset fake player scoreboard players reset $actor_gamemode gm4_zc_data scoreboard players reset $previous_fill_level gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_1/set.mcfunction ================================================ # sets the visual liquid level of a cauldron with custom liquid to 1 # @s = zauber cauldron # at @s align xyz # run from cauldron/liquid/update/from_score and cauldron/liquid/update//item_used/ fill ~ ~ ~ ~ ~ ~ water_cauldron[level=1] replace #minecraft:cauldrons data modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,0.001f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/find_cauldron.mcfunction ================================================ # initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=2] by a player # @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand. # at @s # run from advancement cauldron/level_2 advancement revoke @s only gm4_zauber_cauldrons:cauldron/level_2 # remember player who has interacted with the cauldron tag @s add gm4_zc_actor # find cauldron that was interacted with scoreboard players set $ray gm4_zc_data 50 scoreboard players set $found gm4_zc_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray # remove tag tag @s remove gm4_zc_actor # reset fake players scoreboard players reset $ray gm4_zc_data scoreboard players reset $found gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/item_used/glass_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # check if an expansion handles this liquid type being removed via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data. function #gm4_zauber_cauldrons:cauldron/liquid/fill_bottle_from_cauldron # if no expansion handles this liquid type being removed via bottle, fall back to default behavior: # reset the cauldron to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_glass_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/item_used/water_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # check if an expansion handles this liquid type being added via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the # liquid type in case the cauldron was empty; an empty cauldron has no liquid level score. function #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron # if no expansion handles this liquid type being added via bottle, fall back to default behavior: # reset the cauldron to to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_1/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/ray.mcfunction ================================================ # ray cast to find cauldron # @s = player who has interacted with a cauldron # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_2/find_cauldron # check block scoreboard players set $found gm4_zc_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/reconstruct_interaction # runs the loop again scoreboard players remove $ray gm4_zc_data 1 execute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/reconstruct_interaction.mcfunction ================================================ # reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=2] state based on the previous state of the cauldron. # @s = cauldron that was interacted with # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_2/ray scoreboard players set $found gm4_zc_data 1 # check whether the player who caused the interaction was in creative or survival/adventure execute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode # store fill level to fake player to enable easier access for expansions # make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0 execute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level scoreboard players add $previous_fill_level gm4_zc_data 0 # if the cauldron was at level=3 previously a glass bottle must have been used on the cauldron execute if score $previous_fill_level gm4_zc_data matches 3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/item_used/glass_bottle # if the cauldron was at level=1 previously a water bottle must have been used on the cauldron execute if score $previous_fill_level gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/item_used/water_bottle # reset fake player scoreboard players reset $actor_gamemode gm4_zc_data scoreboard players reset $previous_fill_level gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_2/set.mcfunction ================================================ # sets the visual liquid level of a cauldron with custom liquid to 2 # @s = zauber cauldron # at @s align xyz # run from cauldron/liquid/update/from_score and cauldron/liquid/update//item_used/ fill ~ ~ ~ ~ ~ ~ water_cauldron[level=2] replace #minecraft:cauldrons data modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,0.75f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/creative.mcfunction ================================================ # tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items # @s = player who has interacted with a cauldron # at position of cauldron, align xyz # run from cauldron/liquid/update/level_3/analyze_held_items/select_gamemode # figure out whether item in main or offhand was used execute if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_mainhand run return 0 execute if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_mainhand run return 2 execute if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_offhand run return 1 execute if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_offhand run return 3 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/select_gamemode.mcfunction ================================================ # selects how to check the players's held item depending on their gamemode # @s = player who has interacted with a zauber cauldron # at position of cauldron, align xyz # run from cauldron/liquid/update/level_3/reconstruct_interaction # the player can not have been in spectator, so checking for !creative is the same as checking for survival or adventure execute if entity @s[gamemode=!creative] store result score $item_use_code gm4_zc_data run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/survival_or_adventure execute if entity @s[gamemode=creative] store result score $item_use_code gm4_zc_data run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/creative ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/analyze_held_items/survival_or_adventure.mcfunction ================================================ # tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items # @s = player who has interacted with a cauldron # at position of cauldron, align xyz # run from cauldron/liquid/update/level_3/analyze_held_items/select_gamemode # figure out whether item in main or offhand was used # this is so complicated because when starting out with a level=2 cauldron there are two cases which can not be # distinguished only from looking at the cauldron's final level (level=3) and the items of the player after the interaction: # A) Offhand: Empty Bottle, Mainhand: Full Bucket # B) Offhand: Full Bottle, Mainhand: Empty Bucket # Both A) and B) result in a level=3 cauldron and the player holding Offhand:Empty Bottle, Mainhand: Empty Bucket # but buckets and bottles act differently on cauldrons. Therefore we simply ignore this case, which will lead to the player # losing either the contents of a bucket or of a filled bottle when they try to add liquid in state A) or B). execute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run return 2 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return -1 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand run return 0 execute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return 3 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_offhand run return 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/find_cauldron.mcfunction ================================================ # initiates a raycast to locate a zauber cauldron which was set to minecraft:water_cauldron[level=3], minecraft:lava_cauldron, or minecraft:powder_snow_cauldron by a player # @s = player who has interacted with the cauldron. May be survival or creative and may have used the offhand or the mainhand. # at @s # run from advancement cauldron/level_3 advancement revoke @s only gm4_zauber_cauldrons:cauldron/level_3 # remember player who has interacted with the cauldron tag @s add gm4_zc_actor # find cauldron that was interacted with scoreboard players set $ray gm4_zc_data 50 scoreboard players set $found gm4_zc_data 0 execute anchored eyes positioned ^ ^ ^ run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray # remove tag tag @s remove gm4_zc_actor # reset fake players scoreboard players reset $ray gm4_zc_data scoreboard players reset $found gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/analyze_held_items.mcfunction ================================================ # tries to deduct which item was used by the player when interacting with the cauldron by looking at the post-interaction state of the player's held items # @s = player who has interacted with a cauldron # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction # figure out whether item in main or offhand was stored # this is so complicated because when starting out with a level=2 cauldron there are two cases which can not be # distinguished only from looking at the cauldron's final level (level=3) and the items of the player after the interaction: # A) Offhand: Empty Bottle, Mainhand: Full Bucket # B) Offhand: Full Bottle, Mainhand: Empty Bucket # Both A) and B) result in a level=3 cauldron and the player holding Offhand:Empty Bottle, Mainhand: Empty Bucket # but buckets and bottles act differently on cauldrons. Therefore we simply ignore this case, which will lead to the player # losing either the contents of a bucket or of a filled bottle when they try to add liquid in state A) or B). execute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run return 2 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return -1 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_mainhand run return 0 execute if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run return 3 execute if predicate gm4_zauber_cauldrons:player/equipment/bucket/in_offhand run return 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/filled_bucket.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction # using any filled bucket on a cauldron will overwrite the currenlty contained liquid and fill the cauldron up fully. kill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] # check if an expansion handles this liquid type being added via bucket, which always overwrites the currenlty contained liquid. # therefore in this the expansion only needs to provide a corrosponding item_display if necessary. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. function #gm4_zauber_cauldrons:cauldron/liquid/drain_bucket_into_cauldron # if no expansion handled the liquid being inserted, fall back to vanilla bucket behavior and remove custom liquid, otherwise set liquid level to full execute unless score $interaction_intercepted gm4_zc_data matches 1.. run scoreboard players reset @s gm4_zc_liquid_level execute if score $interaction_intercepted gm4_zc_data matches 1.. run scoreboard players set @s gm4_zc_liquid_level 3 # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/item_used/water_bottle.mcfunction ================================================ # hands handling of the interaction to expansions, or enforces default behavior if no expansion handles the liquid in question # @s = cauldron that was emptied # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_1/reconstruct_interaction # check if an expansion handles this liquid type being added via bottle. # expansions must set the fake player $interaction_intercepted in gm4_zc_data to 1 if they successfully handled the interaction. # checking to see whether this flag was already set before intercepting an interaction is also recommended to prevent conflicts. # expansions can check the currently present liquid type (if any) via checking for the corrosponding tag on the present item_display (at dx=0). # the player who has interacted with the cauldron is tagged as gm4_zc_actor and their gamemode is available via the fake player # $actor_gamemode in gm4_zc_data: 0 = survival or adventure, 1 = creative. # the previous fill level is available via fake player $previous_fill_level gm4_zc_data and should be checked before checking for the # liquid type in case the cauldron was empty; an empty cauldron has no liquid level score. function #gm4_zauber_cauldrons:cauldron/liquid/drain_bottle_into_cauldron # if no expansion handles this liquid type being added via bottle, fall back to default behavior: # reset the cauldron to to its previous level and return the bottle to the player # gamemode doesn't matter in this case execute unless score $interaction_intercepted gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:cauldron/liquid/update/level_2/set execute unless score $interaction_intercepted gm4_zc_data matches 1.. as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/return_water_bottle # reset fake player scoreboard players reset $interaction_intercepted gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/ray.mcfunction ================================================ # ray cast to find cauldron # @s = player who has interacted with a cauldron # at @s anchored eyes positioned ^ ^ ^0.X where X = step count # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/find_cauldron # check block scoreboard players set $found gm4_zc_data 0 execute align xyz positioned ~0.5 ~0.5 ~0.5 if block ~ ~ ~ #minecraft:cauldrons align xyz as @e[type=marker,tag=gm4_zauber_cauldron,dx=0,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/reconstruct_interaction # runs the loop again scoreboard players remove $ray gm4_zc_data 1 execute unless score $found gm4_zc_data matches 1 if score $ray gm4_zc_data matches 1.. positioned ^ ^ ^0.1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/reconstruct_interaction.mcfunction ================================================ # reconstruct in which way the player has interacted with the cauldron to get it into its minecraft:water_cauldron[level=3], minecraft:lava_cauldron, or minecraft:powder_snow_cauldron state based on the previous state of the cauldron. # @s = cauldron that was interacted with # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/level_3/ray scoreboard players set $found gm4_zc_data 1 # check whether the player who caused the interaction was in creative or survival/adventure execute as @a[tag=gm4_zc_actor,limit=1] store result score $actor_gamemode gm4_zc_data run function gm4_zauber_cauldrons:player/check_gamemode # store fill level to fake player to enable easier access for expansions # make sure the operation doesn't set @s's gm4_zc_liquid_level from NaN to 0 execute if score @s gm4_zc_liquid_level matches 1.. run scoreboard players operation $previous_fill_level gm4_zc_data = @s gm4_zc_liquid_level scoreboard players add $previous_fill_level gm4_zc_data 0 # if the cauldron was at level=NaN, level=1, or at level=3 previously some filled bucket must have been used on the cauldron execute unless score $previous_fill_level gm4_zc_data matches 2 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/filled_bucket # in the case that the cauldron was previously at level=2 we can not distinguish between the use of a bucket or the use of a water bottle # without looking at the player's inventory (and even then there is a case in which we can not tell) execute if score $previous_fill_level gm4_zc_data matches 2 as @a[tag=gm4_zc_actor,limit=1] run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/analyze_held_items/select_gamemode execute if score $item_use_code gm4_zc_data matches 0..1 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/filled_bucket execute if score $item_use_code gm4_zc_data matches 2..3 run function gm4_zauber_cauldrons:cauldron/liquid/update/level_3/item_used/water_bottle # reset fake player scoreboard players reset $actor_gamemode gm4_zc_data scoreboard players reset $previous_fill_level gm4_zc_data scoreboard players reset $item_use_code gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/level_3/set.mcfunction ================================================ # sets the visual liquid level of a cauldron with custom liquid to 3 # @s = zauber cauldron # at @s align xyz # run from cauldron/liquid/update/from_score and cauldron/liquid/update//item_used/ fill ~ ~ ~ ~ ~ ~ water_cauldron[level=3] replace #minecraft:cauldrons data modify entity @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] transformation set value [1.984f,0f,0f,0f,0f,1.5f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_bucket.mcfunction ================================================ # returns an empty bucket to a player who has tried to fill up a bucket from a custom liquid zauber cauldron # @s = player who has interacted with the zauber cauldron # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update//item_used/ execute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_mainhand run item replace entity @s weapon.mainhand with minecraft:bucket execute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/water_bucket/in_offhand run item replace entity @s weapon.offhand with minecraft:bucket # reset fake player and prevent bucket fill sound stopsound @s block minecraft:item.bucket.fill scoreboard players reset $found_hand gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_glass_bottle.mcfunction ================================================ # returns an empty bottle to a player who has tried to fill up a bottle from a custom liquid zauber cauldron # @s = player who has interacted with the zauber cauldron # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update//item_used/ execute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_mainhand run item replace entity @s weapon.mainhand with minecraft:glass_bottle execute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/water_bottle/in_offhand run item replace entity @s weapon.offhand with minecraft:glass_bottle # reset fake player and prevent bottle fill sound stopsound @s block minecraft:item.bottle.fill scoreboard players reset $found_hand gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/liquid/update/return_water_bottle.mcfunction ================================================ # returns a water bottle to a player who has tried to fill up a into a custom liquid zauber cauldron # @s = player who has interacted with the zauber cauldron # at position of cauldron, align xyz # run from gm4_zauber_cauldrons:cauldron/liquid/update/<>/item_used/ execute store success score $found_hand gm4_zc_data if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand run item replace entity @s weapon.mainhand with minecraft:potion[potion_contents="minecraft:water"] execute unless score $found_hand gm4_zc_data matches 1.. if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand run item replace entity @s weapon.offhand with minecraft:potion[potion_contents="minecraft:water"] # reset fake player and prevent bottle empty sound stopsound @s block minecraft:item.bottle.empty scoreboard players reset $found_hand gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/rabbit_teleportation.mcfunction ================================================ # teleports a rabbit inside a cauldron to another empty cauldron # @s = zauber cauldron without water in it # at align xyz # run from cauldron/structure/validate/liquid # look for a target cauldron tag @e[type=marker,tag=gm4_zauber_cauldron,limit=1,distance=1..,sort=random,scores={gm4_zc_rabtarget=1}] add gm4_zc_selected_target execute unless entity @e[type=marker,tag=gm4_zc_selected_target] run return fail # advancement for player advancement grant @a[distance=..2,gamemode=!spectator,predicate=gm4_zauber_cauldrons:player/equipment/armor/full] only gm4:zauber_cauldrons_rabbit # departure sounds & particles particle minecraft:entity_effect{color:[0.2,0.3,0.2,0.5]} ~.5 ~.5 ~.5 0 0 0 0.5 32 playsound minecraft:entity.item.pickup neutral @a[distance=..8] ~ ~ ~ 0.5 0.5 # teleport rabbit tag @e[type=rabbit,dx=0,dy=0,dz=0,limit=1] add gm4_zc_magic_rabbit tp @e[type=rabbit,dx=0,tag=gm4_zc_magic_rabbit,limit=1] @e[type=marker,tag=gm4_zc_selected_target,limit=1] # arrival particles execute at @e[type=rabbit,tag=gm4_zc_magic_rabbit,limit=1] align xyz run particle minecraft:entity_effect{color:[0.2,0.3,0.2,0.5]} ~.5 ~.5 ~.5 0 0 0 0.5 32 # remove tags tag @e[type=rabbit] remove gm4_zc_magic_rabbit tag @e[type=marker,tag=gm4_zauber_cauldron] remove gm4_zc_selected_target ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/recipe_checks.mcfunction ================================================ # @s boiling zauber cauldron with valid structure and item(s) inside. # at @s (center of block) # ran from cauldron/structure/valid # branches off into different module components # make items not pickupable when a player is looking at a cauldron execute as @a[gamemode=!spectator,distance=..3] at @s anchored eyes positioned ^ ^ ^1.448 if block ~ ~ ~ #minecraft:cauldrons align xyz positioned ~.5 ~.5 ~.5 if entity @e[type=marker,tag=gm4_current_zauber_cauldron,distance=..0.1] align xyz as @e[type=item,dx=0,dy=0,dz=0] run data merge entity @s {PickupDelay:18s} # check if cauldron has a bottle execute if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:glass_bottle"}}}}] run scoreboard players set $has_bottle gm4_zc_fullness 1 # set $recipe_success to 0 scoreboard players set $recipe_success gm4_zc_data 0 # tier 4 potions execute if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:prismarine_crystals"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:golden_apple"}}}}] run function gm4_zauber_cauldrons:recipes/potions/select_bottle # zauber armor execute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"enchanted_prismarine_shard"}}}}] run function gm4_zauber_cauldrons:recipes/armor/select_piece # zauber crystals execute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:sea_lantern"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:nether_star"}}}}] run function gm4_zauber_cauldrons:recipes/crystals/select_effect # enchanted prismarine shard execute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:prismarine_shard"}}}}] if entity @a[level=30..,distance=..2,limit=1,sort=nearest,gamemode=!spectator] run function gm4_zauber_cauldrons:recipes/precursors/enchanted_prismarine_shard # luck from flowers execute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:short_grass"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"enchanted_prismarine_shard"}}}}] run function gm4_zauber_cauldrons:recipes/flowers/check_poisonous_flowers # wormhole in a bottle execute unless score $recipe_success gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"enchanted_prismarine_shard"}}}}] run function gm4_zauber_cauldrons:recipes/chorus/count_chorus # magicol execute unless score $recipe_success gm4_zc_data matches 1.. unless score $disable_magicol gm4_zc_data matches 1.. if score $has_water gm4_zc_data matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"enchanted_prismarine_shard"}}}}] run function gm4_zauber_cauldrons:recipes/magicol/select_color # bottled magicol execute unless score $recipe_success gm4_zc_data matches 1.. unless score $disable_magicol gm4_zc_data matches 1.. if score @s gm4_zc_liquid_level matches 1..3 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid{id:"magicol"} if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:potion_contents":{potion:"minecraft:water"}}}] if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:prismarine_crystals"}}}}] run function gm4_zauber_cauldrons:recipes/magicol/bottled/select_bottle # reset fake players and storage scoreboard players reset $recipe_success gm4_zc_data scoreboard players reset $has_bottle gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/animation/controller.mcfunction ================================================ # controls the creation animation # @s = player able to create a cauldron # at cauldron position # scheduled from gm4_zauber_cauldron:cauldron/setup/create # control animation flow execute if score $creation_counter gm4_zc_data matches ..40 run schedule function gm4_zauber_cauldrons:cauldron/setup/animation/controller 1t scoreboard players add $creation_counter gm4_zc_data 1 # display animation frame execute as @e[type=area_effect_cloud,tag=gm4_zc_creation_animation] at @s run function gm4_zauber_cauldrons:cauldron/setup/animation/step ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/animation/step.mcfunction ================================================ # displays a single frame of the creation animation # @s = animation marker # at @s # run from gm4_zauber_cauldron:cauldron/setup/animation/controller # move to new position teleport @s ^0.15 ^ ^0.025 facing entity @e[type=marker,tag=gm4_zauber_cauldron,distance=..1,limit=1] # display particle execute at @s run particle minecraft:enchant ~ ~0.6 ~ 0 0 0 0.001 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/create.mcfunction ================================================ # @s = player able to create a cauldron # at cauldron being looked at, align xyz # ran from cauldron/setup/validate_structure # summon marker AEC execute positioned ~.5 ~.5 ~.5 summon marker run function gm4_zauber_cauldrons:cauldron/setup/initialize_marker advancement grant @s only gm4:zauber_cauldrons_create playsound minecraft:entity.illusioner.prepare_mirror master @a[distance=..8] ~.5 ~.5 ~.5 1 1.6 # summon texture display summon minecraft:item_display ~.5 ~.5 ~.125 {CustomName:"gm4_zc_texture",item:{id:"minecraft:structure_void",count:1,components:{"minecraft:custom_model_data":{"strings":["gm4_zauber_cauldrons:block/zauber_cauldron"]}}},item_display:"thirdperson_righthand",Tags:["gm4_zc_texture","smithed.entity","smithed.strict"]} # start creation animation summon area_effect_cloud ~.5 ~.5 ~.5 {Radius:0,Age:-40,CustomName:"gm4_zc_creation_animation",Tags:["gm4_zc_creation_animation"],custom_particle:{type:"minecraft:block",block_state:"minecraft:air"}} scoreboard players set $creation_counter gm4_zc_data 1 schedule function gm4_zauber_cauldrons:cauldron/setup/animation/controller 1t ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/initialize_marker.mcfunction ================================================ # sets nbt and scores on newly created zauber cauldron markers # @s = newly created zauber cauldron # at @s # ran from cauldron/setup/create or from upgrade path 1.10 # set nbt data modify entity @s CustomName set value "gm4_zauber_cauldron" # store cauldron position and dimension in nbt, this is only done once upon creation # store coordinates as integers, wormholes always teleport to the center of the target block execute store result entity @s data.gm4_zauber_cauldrons.location.x int 1 run data get entity @s Pos[0] execute store result entity @s data.gm4_zauber_cauldrons.location.y int 1 run data get entity @s Pos[1] execute store result entity @s data.gm4_zauber_cauldrons.location.z int 1 run data get entity @s Pos[2] data modify entity @s data.gm4_zauber_cauldrons.location.dimension set from entity @p Dimension # TODO remove this when switching over to custom liquids only! # instead, the liquid type should be pulled from the vanilla cauldron # upon creation and the vanilla cauldron converted to custom liquid data modify entity @s data.gm4_zauber_cauldrons.liquid set value {id:"none"} # add tags tag @s add gm4_zauber_cauldron tag @s add smithed.entity tag @s add smithed.strict tag @s add smithed.block # set scores scoreboard players set @s gm4_entity_version 2 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/setup/validate_structure.mcfunction ================================================ # @s = non-spectator, non-adventure players, looking at a non-zauber cauldron, holding an enchanted book # at cauldron being looked at, align xyz # run from player/submain # analyze structure function gm4_zauber_cauldrons:cauldron/structure/analyze/liquid execute if score $has_liquid gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/analyze/heatsource # create zauber cauldron if structure is valid execute if score $has_heatsource gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/setup/create # reset fake players scoreboard players reset $has_liquid gm4_zc_data scoreboard players reset $has_water gm4_zc_data scoreboard players reset $has_powder_snow gm4_zc_data scoreboard players reset $has_lava gm4_zc_data scoreboard players reset $has_heatsource gm4_zc_data scoreboard players reset $has_soul_fire_heatsource gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/analyze/heatsource.mcfunction ================================================ # @s = zauber cauldron # at @s align xyz # run from cauldron/structure/validate/heatsource # fake players must be reset after the result of this function was evaluated # analyze type of heatsource used execute store success score $has_heatsource gm4_zc_data if block ~ ~-1 ~ #minecraft:campfires[lit=true] execute unless score $has_heatsource gm4_zc_data matches 1 store success score $has_heatsource gm4_zc_data if block ~ ~-1 ~ #minecraft:fire execute if score $has_heatsource gm4_zc_data matches 1 store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ #gm4_zauber_cauldrons:soul_fire_heatsource ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/analyze/liquid.mcfunction ================================================ # @s = zauber cauldron # at @s align xyz # run from cauldron/structure/validate/liquid and cauldron/setup/validate_structure # fake players must be reset after the result of this function was evaluated # analyze type of cauldron used execute if score @s gm4_zc_liquid_level matches 0..3 run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score execute if score @s gm4_zc_liquid_level matches 1..3 run scoreboard players set $has_liquid gm4_zc_data 1 execute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_water gm4_zc_data if block ~ ~ ~ minecraft:water_cauldron execute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_powder_snow gm4_zc_data if block ~ ~ ~ minecraft:powder_snow_cauldron execute unless score $has_liquid gm4_zc_data matches 1 store success score $has_liquid gm4_zc_data store success score $has_lava gm4_zc_data if block ~ ~ ~ minecraft:lava_cauldron ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/destroy.mcfunction ================================================ # Dismantles a Zauber Cauldron, thereby removing the marker and any related entities. # @s = a Zauber Cauldron marker which is no longer within a minecraft:cauldron block # at @s alignxyz # run from cauldron/structure/validate/liquid # remove marker kill @s # remove liquid displays if present kill @e[type=item_display,tag=gm4_zc_liquid,dx=0,limit=1] # remove cauldron texture overlay kill @e[type=item_display,tag=gm4_zc_texture,dx=0,limit=1] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_liquid.mcfunction ================================================ # @s = zauber cauldron # should be at @s # run from cauldron/structure/modify # check liquid type execute if score $has_water gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water execute if score $has_powder_snow gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/modify/use_powder_snow ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_powder_snow.mcfunction ================================================ # @s = zauber cauldron # run from recipe check functions # use powder snow execute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=1] run setblock ~ ~ ~ minecraft:cauldron execute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=2] run setblock ~ ~ ~ minecraft:water_cauldron[level=1] execute if block ~ ~ ~ minecraft:powder_snow_cauldron[level=3] run setblock ~ ~ ~ minecraft:water_cauldron[level=2] # particle particle minecraft:snowflake ~ ~ ~ .15 0.4 .15 0 24 # sound playsound minecraft:item.bucket.fill_powder_snow block @a[distance=..8] ~ ~ ~ 0.75 0.75 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/modify/use_water.mcfunction ================================================ # @s = zauber cauldron # run from cauldron/structure/modify # use water execute if block ~ ~ ~ minecraft:water_cauldron[level=1] run setblock ~ ~ ~ minecraft:cauldron execute if block ~ ~ ~ minecraft:water_cauldron[level=2] run setblock ~ ~ ~ minecraft:water_cauldron[level=1] execute if block ~ ~ ~ minecraft:water_cauldron[level=3] run setblock ~ ~ ~ minecraft:water_cauldron[level=2] # particle particle minecraft:splash ~ ~ ~ .15 0.1 .15 0 6 # sound playsound minecraft:item.bucket.fill block @a[distance=..8] ~ ~ ~ 0.5 0.75 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/register_items.mcfunction ================================================ # @s = item inside cauldron # at cauldron align xyz # run from cauldron/structure/valid # counts items in cauldron and virtualizes them # count item scoreboard players add @e[type=marker,tag=gm4_zauber_cauldron,tag=gm4_current_zauber_cauldron,limit=1] gm4_zc_fullness 1 # register item data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients item set from entity @s Item execute unless data storage gm4_zauber_cauldrons:temp/cauldron/ingredients item.components."minecraft:custom_data".gm4_zauber_cauldrons.item run data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients item.components."minecraft:custom_data".gm4_zauber_cauldrons.item set from entity @s Item.id data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients items append from storage gm4_zauber_cauldrons:temp/cauldron/ingredients item data remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients item ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/use_extra_items.mcfunction ================================================ # @s = zauber cauldron with overflow items # run from use_cauldron functions # at center of block # calculate how many excess items are in the recipe scoreboard players operation @s gm4_zc_fullness -= $expected_item_amount gm4_zc_fullness # absorb possessed items into a bottle if present scoreboard players set $bottled_possessed_items gm4_zc_data 0 execute if score $has_bottle gm4_zc_fullness matches 1.. if score @s gm4_zc_fullness matches 2.. align xyz positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:cauldron/extra_items/prepare_bottle # summon possessed items if no bottle present execute if score $bottled_possessed_items gm4_zc_data matches 0 run function gm4_zauber_cauldrons:cauldron/extra_items/create_possessed_items # reset fake players scoreboard players reset $bottled_possessed_items gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/valid.mcfunction ================================================ # @s = boiling cauldron with valid structure # at @s align xyz # run from cauldron/structure/validate/heatsource # tag this cauldron for future refrence tag @s add gm4_current_zauber_cauldron # count items in cauldron scoreboard players set @s gm4_zc_fullness 0 data remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients items execute as @e[type=item,dx=0,dy=0,dz=0] run function gm4_zauber_cauldrons:cauldron/structure/register_items # pull liquid id and cauldron location into ingredient storage data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data set from entity @s data.gm4_zauber_cauldrons data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data.liquid data modify storage gm4_zauber_cauldrons:temp/cauldron/ingredients location set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data.location data remove storage gm4_zauber_cauldrons:temp/cauldron/ingredients marker_data # particles execute if score $has_water gm4_zc_data matches 1 run particle minecraft:poof ~.5 ~.5 ~.5 .005 .2 .005 .0005 4 execute if score $has_powder_snow gm4_zc_data matches 1 run particle minecraft:dripping_water ~.5 ~0.88 ~.5 0.14 0 0.14 1 1 execute if score @s gm4_zc_liquid_level matches 1..3 run function #gm4_zauber_cauldrons:cauldron/liquid/cauldron_particles scoreboard players reset $displayed_liquid_particle gm4_zc_data # check for recipes if at least one item is found inside execute if score @s gm4_zc_fullness matches 1.. positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:cauldron/recipe_checks # reset tag @s remove gm4_current_zauber_cauldron ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/validate/heatsource.mcfunction ================================================ # @s = zauber cauldron # at @s align xyz # run from cauldron/structure/validate/liquid # analyze function gm4_zauber_cauldrons:cauldron/structure/analyze/heatsource # enable cauldron for crafting execute if score $has_heatsource gm4_zc_data matches 1 unless score $has_lava gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/valid # reset fake players scoreboard players reset $has_heatsource gm4_zc_data scoreboard players reset $has_soul_fire_heatsource gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/cauldron/structure/validate/liquid.mcfunction ================================================ # @s = zauber cauldron # at @s align xzy # run from main # reset rabbit target score scoreboard players set @s gm4_zc_rabtarget 0 # analyze function gm4_zauber_cauldrons:cauldron/structure/analyze/liquid # if there is a liquid present, continue to heat source checks execute if score $has_liquid gm4_zc_data matches 1 run function gm4_zauber_cauldrons:cauldron/structure/validate/heatsource # if the cauldron is empty, enable the rabbit teleportation easter egg execute unless score $has_liquid gm4_zc_data matches 1 if block ~ ~ ~ minecraft:cauldron if entity @e[type=rabbit,dx=0,dy=0,dz=0,limit=1] if entity @a[gamemode=!spectator,predicate=gm4_zauber_cauldrons:player/equipment/armor/full,distance=..2] run function gm4_zauber_cauldrons:cauldron/rabbit_teleportation execute unless score $has_liquid gm4_zc_data matches 1 run scoreboard players set @s gm4_zc_rabtarget 1 # if there is no longer a cauldron, destroy the zauber cauldron execute unless block ~ ~ ~ #minecraft:cauldrons run function gm4_zauber_cauldrons:cauldron/structure/destroy # reset fake players scoreboard players reset $has_liquid gm4_zc_data scoreboard players reset $has_water gm4_zc_data scoreboard players reset $has_powder_snow gm4_zc_data scoreboard players reset $has_lava gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/init.mcfunction ================================================ scoreboard objectives add gm4_entity_version dummy scoreboard objectives add gm4_zc_bottled_vex_escape_timer dummy scoreboard objectives add gm4_zc_chorus dummy scoreboard objectives add gm4_zc_crystal dummy scoreboard objectives add gm4_zc_data dummy scoreboard objectives add gm4_zc_flowers dummy scoreboard objectives add gm4_zc_fullness dummy scoreboard objectives add gm4_zc_id dummy scoreboard objectives add gm4_zc_liquid_level dummy scoreboard objectives add gm4_zc_moon_phase dummy scoreboard objectives add gm4_zc_no_explode dummy scoreboard objectives add gm4_zc_magicol_painter_timer dummy scoreboard objectives add gm4_zc_rabtarget dummy # assign lucky/poisonous flowers, unless this was done before execute unless score $required_flowers gm4_zc_flowers matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/flowers/initiate_flower_types # assign chorus amounts, unless this was done before. The latter score check without the $ and the scoreboard operation are required on old worlds. execute if score required_popped_chorus_fruit gm4_zc_chorus matches -2147483648..2147483647 run scoreboard players operation $required_popped_chorus_fruit gm4_zc_chorus = required_popped_chorus_fruit gm4_zc_chorus execute unless score $required_total gm4_zc_chorus matches -2147483648..2147483647 unless score required_total gm4_zc_chorus matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/chorus/initiate_chorus_amounts # assign moon phase offset execute unless score $magicol_offset gm4_zc_moon_phase matches -2147483648..2147483647 run function gm4_zauber_cauldrons:recipes/magicol/initiate_moon_phase_offset scoreboard players set #modulo gm4_zc_fullness 3 scoreboard players set #8 gm4_zc_moon_phase 8 scoreboard players set #256 gm4_zc_moon_phase 256 scoreboard players set #24000 gm4_zc_moon_phase 24000 team add gm4_hide_name team modify gm4_hide_name nametagVisibility never # module data version scoreboard players set $data_version gm4_zc_data 1 # website maintained module version execute unless score zauber_cauldrons gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Zauber Cauldrons"} execute unless score zauber_cauldrons gm4_earliest_version < zauber_cauldrons gm4_modules run scoreboard players operation zauber_cauldrons gm4_earliest_version = zauber_cauldrons gm4_modules scoreboard players set zauber_cauldrons gm4_modules 1 # start core functionality schedule function gm4_zauber_cauldrons:main 1t # start vex in a bottle release meachanism schedule function gm4_zauber_cauldrons:cauldron/extra_items/process_bottled_vex_items 2t #$moduleUpdateList ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/main.mcfunction ================================================ execute as @e[type=marker,tag=gm4_zauber_cauldron] at @s align xyz run function gm4_zauber_cauldrons:cauldron/structure/validate/liquid # player checks execute as @a[gamemode=!spectator] run function gm4_zauber_cauldrons:player/submain # prevent explosion handling scoreboard players remove @e[scores={gm4_zc_no_explode=1..}] gm4_zc_no_explode 1 schedule function gm4_zauber_cauldrons:main 16t ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/apply_set_bonus.mcfunction ================================================ # checks the players armor set for zauber flavor # @s = player who's inventory changed and now has full armor # at @s # run from advancement equipment/has_full_armor # advancement is not revoked as it is used as a flag for revoke set bonus in # advancement equipment/unequipped_armor # count flavors # note: also checking for the armor amount because all zauber armor has +3 armor by default execute store result score $armor_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:"zauber_armor"}},attribute_modifiers~{modifiers:{contains:[{attribute:"minecraft:armor",amount:1d}]}}] execute store result score $attack_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:"zauber_armor"}},attribute_modifiers~{modifiers:{contains:[{attribute:"minecraft:attack_damage"}]}}] execute store result score $health_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:"zauber_armor"}},attribute_modifiers~{modifiers:{contains:[{attribute:"minecraft:max_health"}]}}] execute store result score $speed_boost gm4_zc_data if items entity @s armor.* *[custom_data~{gm4_zauber_cauldrons:{item:"zauber_armor"}},attribute_modifiers~{modifiers:{contains:[{attribute:"minecraft:movement_speed"}]}}] # check how many of the most prevalent flavor there are scoreboard players set $comparison gm4_zc_data 0 scoreboard players operation $comparison gm4_zc_data > $armor_boost gm4_zc_data scoreboard players operation $comparison gm4_zc_data > $attack_boost gm4_zc_data scoreboard players operation $comparison gm4_zc_data > $health_boost gm4_zc_data scoreboard players operation $comparison gm4_zc_data > $speed_boost gm4_zc_data # give set boosts for the most prevalent flavors execute if score $comparison gm4_zc_data = $armor_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/armor_boost execute if score $comparison gm4_zc_data = $attack_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/attack_boost execute if score $comparison gm4_zc_data = $health_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/health_boost execute if score $comparison gm4_zc_data = $speed_boost gm4_zc_data run function gm4_zauber_cauldrons:player/armor/set_bonus/speed_boost # reset fake players scoreboard players reset $armor_boost gm4_zc_data scoreboard players reset $attack_boost gm4_zc_data scoreboard players reset $health_boost gm4_zc_data scoreboard players reset $speed_boost gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/revoke_set_bonus.mcfunction ================================================ # revokes set bonuses from players that don't have a full set of zauber armor anymore # @s = player who's inventory changed and they don't have zauber armor on anymore, but used to have zauber armor on # at @s # run from advancement equipment/unequipped_armor # revoke advancements advancement revoke @s only gm4_zauber_cauldrons:equipment/has_full_armor advancement revoke @s only gm4_zauber_cauldrons:equipment/unequipped_armor # revoke set bonuses attribute @s minecraft:armor modifier remove gm4_zauber_cauldrons:armor_boost attribute @s minecraft:attack_damage modifier remove gm4_zauber_cauldrons:attack_boost attribute @s minecraft:max_health modifier remove gm4_zauber_cauldrons:health_boost attribute @s minecraft:movement_speed modifier remove gm4_zauber_cauldrons:speed_boost # sound playsound minecraft:block.beacon.deactivate player @a[distance=..4] ~ ~ ~ 0.3 0.1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/armor_boost.mcfunction ================================================ # applies a set bonus and displays some particles # @s = player who's inventory changed and now has full armor_boost armor # at @s # run from player/armor/apply_set_bonus # attribute attribute @s minecraft:armor modifier add gm4_zauber_cauldrons:armor_boost 1 add_value # sounds and visuals particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1 particle minecraft:entity_effect{color:[0.561,0.271,0.929,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1 playsound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.55 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/attack_boost.mcfunction ================================================ # applies a set bonus and displays some particles # @s = player who's inventory changed and now has full attack_boost armor # at @s # run from player/armor/apply_set_bonus # attribute attribute @s minecraft:attack_damage modifier add gm4_zauber_cauldrons:attack_boost 1 add_value # sounds and visuals particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1 particle minecraft:entity_effect{color:[0.988,0.773,0.000,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1 playsound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.6 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/health_boost.mcfunction ================================================ # applies a set bonus and displays some particles # @s = player who's inventory changed and now has full health_boost armor # at @s # run from player/armor/apply_set_bonus # attribute attribute @s minecraft:max_health modifier add gm4_zauber_cauldrons:health_boost 4 add_value # sounds and visuals particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1 particle minecraft:entity_effect{color:[0.973,0.141,0.137,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1 playsound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.65 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/armor/set_bonus/speed_boost.mcfunction ================================================ # applies a set bonus and displays some particles # @s = player who's inventory changed and now has full speed_boost armor # at @s # run from player/armor/apply_set_bonus # attribute attribute @s minecraft:movement_speed modifier add gm4_zauber_cauldrons:speed_boost 0.12 add_multiplied_base # sounds and visuals particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~-.3 ~.8 ~-.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ~-.3 ~.8 ~.3 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^ ^1.2 ^0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^ ^1.2 ^-0.1 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^0.1 ^1.2 ^ 0 0 0 1 1 particle minecraft:entity_effect{color:[0.486,0.686,0.776,1.0]} ^-0.1 ^1.2 ^ 0 0 0 1 1 playsound minecraft:block.beacon.power_select player @a[distance=..4] ~ ~ ~ 0.2 1.7 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/assign_id.mcfunction ================================================ # @s = player who joined for the first time # run from advancement gm4_zauber_cauldrons:join execute store result score @s gm4_zc_id run data get entity @s UUID[3] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/check_gamemode.mcfunction ================================================ # checks whether the player who called this function was in creative or survival/adventure and returns 1 or 0 accordingly. # @s = a player # at unspecified # run from cauldron/liquid/update//reconstruct_interaction # sorted by gamemode player is most likely to be in execute if entity @s[gamemode=survival] run return 0 execute if entity @s[gamemode=creative] run return 1 execute if entity @s[gamemode=adventure] run return 0 return -1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/activate.mcfunction ================================================ # @s = player with crystal in off-hand # at @s # run from player/crystal/process # play activation sound playsound minecraft:block.beacon.activate player @a[distance=..8] ~ ~ ~ 0.3 1.7 playsound minecraft:block.amethyst_cluster.hit player @a[distance=..8] ~ ~ ~ 0.3 1.2 # add tag tag @s add gm4_zc_crystal_active ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/deactivate.mcfunction ================================================ # @s = player # at world spawn # run from player/submain # play deactivation sound playsound minecraft:block.beacon.deactivate player @a[distance=..8] ~ ~ ~ 0.3 1.7 playsound minecraft:block.amethyst_cluster.hit player @a[distance=..8] ~ ~ ~ 0.3 0.8 # clear tag tag @s remove gm4_zc_crystal_active ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/instant_health.mcfunction ================================================ # @s = player with crystal in off-hand # run from player/crystal/read_effect # give effects effect give @s instant_health 1 1 effect give @s nausea 10 0 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/speed.mcfunction ================================================ # @s = player with crystal in off-hand # run from player/crystal/read_effect # give effects effect give @s speed 7 1 effect give @s weakness 7 0 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/effect/strength.mcfunction ================================================ # @s = player with crystal in off-hand # run from player/crystal/read_effect # give effects effect give @s strength 7 1 effect give @s fire_resistance 7 0 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/process.mcfunction ================================================ # @s = player with crystal in off-hand # at world spawn # run from player/submain # activate freshly equiped crystals execute unless score @s gm4_zc_crystal matches 0..7 at @s run function gm4_zauber_cauldrons:player/crystal/activate # read and apply effects on slow clock execute if score @s gm4_zc_crystal matches 0..7 run scoreboard players add @s gm4_zc_crystal 1 execute if score @s gm4_zc_crystal matches 8.. run function gm4_zauber_cauldrons:player/crystal/read_effect # set fake player flag scoreboard players set $success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/crystal/read_effect.mcfunction ================================================ # @s = player with crystal in off-hand # run from player/crystal/process # read and apply effects execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"instant_damage"}}] run effect give @s instant_damage 1 1 execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"instant_health"}}] run function gm4_zauber_cauldrons:player/crystal/effect/instant_health execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"jump_boost"}}] run effect give @s jump_boost 7 1 execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"poison"}}] run effect give @s poison 7 1 execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"regeneration"}}] run effect give @s regeneration 7 1 execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"speed"}}] run function gm4_zauber_cauldrons:player/crystal/effect/speed execute if items entity @s weapon.offhand *[custom_data~{gm4_zauber_cauldrons:{type:"strength"}}] run function gm4_zauber_cauldrons:player/crystal/effect/strength # reset score data remove storage gm4_zauber_cauldrons:temp/player/equipment/offhand gm4_zauber_cauldrons scoreboard players set @s gm4_zc_crystal 0 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/dump.mcfunction ================================================ # @s = gm4_zc_nbt_storage item spawned in a previous tick. This item carries the 'tag' of the multi use bottles that was used # at location of player that drank this bottle # run from player/multi_use_bottle/cache/load # pull data into storage data modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item set from entity @s Item # kill item kill @s ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/load.mcfunction ================================================ # @s = player that consumed any multi_use_bottle 1 tick ago # at @s # run from player/multi_use_bottle/restore_context # move id of player to fake player scoreboard players operation $requested_id gm4_zc_id = @s gm4_zc_id # move matching item data from stored entity into storage execute as @e[type=item,tag=gm4_zc_nbt_storage] if score @s gm4_zc_id = $requested_id gm4_zc_id run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/dump # abort execution if one or less sips are remaining execute store result score $remaining_sips gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components."minecraft:custom_data".gm4_zauber_cauldrons.bottle.sips execute if score $remaining_sips gm4_zc_data matches 2.. run function gm4_zauber_cauldrons:player/multi_use_bottle/modify_bottle # revoke advancement advancement revoke @s only gm4_zauber_cauldrons:use/multi_use_bottle # reset storage data remove storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item # reset tags tag @s remove gm4_zc_used_mainhand tag @s remove gm4_zc_used_offhand scoreboard players reset $remaining_sips gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/cache/populate.mcfunction ================================================ # @s = player consuming any multi_use_bottle # at @s # run from player/multi_use_bottle/check_gamemode # save coordinates into id'd entity execute in overworld run summon item 29999998 1 7134 {Item:{id:"minecraft:potion",count:1},Tags:["gm4_zc_new_nbt_storage","gm4_zc_nbt_storage"],Age:5400,PickupDelay:32767} scoreboard players operation @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] gm4_zc_id = @s gm4_zc_id # read item data from hand into entity execute if predicate gm4_zauber_cauldrons:player/equipment/multi_use_bottle/in_mainhand run function gm4_zauber_cauldrons:player/multi_use_bottle/read_data/mainhand execute unless score $read_data gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/multi_use_bottle/in_offhand run function gm4_zauber_cauldrons:player/multi_use_bottle/read_data/offhand scoreboard players reset $read_data gm4_zc_data tag @e[type=item,tag=gm4_zc_nbt_storage] remove gm4_zc_new_nbt_storage # schedule delayed action schedule function gm4_zauber_cauldrons:player/multi_use_bottle/restore_context 1t replace ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/check_gamemode.mcfunction ================================================ # @s = player consuming any multi_use_bottle # at @s # run from advancement gm4_zauber_cauldrons:use/multi_use_bottle # for survival or adventure players: consume bottle execute if entity @s[gamemode=!spectator,gamemode=!creative] run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/populate # revoke advancement if gamemode is creative or spectator # (advancement is used as marker and will be removed a tick later for survival or adventure players, see player/multi_use_bottle/modify_bottle) execute unless entity @s[gamemode=!spectator,gamemode=!creative] run advancement revoke @s only gm4_zauber_cauldrons:use/multi_use_bottle ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/modify_bottle.mcfunction ================================================ # @s = player that consumed any multi_use_bottle 1 tick ago that had at least 2 sips remaining # at @s # run from player/multi_use_bottle/cache/load # call utility function to remove one sip and store resulting item into yellow shulker box (gamemode 4 lib_forceload standard) function gm4_zauber_cauldrons:soulution/use_sip # return modified items to player inventory, depending on offhand or mainhand use execute if entity @s[tag=gm4_zc_used_mainhand] if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_mainhand in overworld run loot replace entity @s weapon.mainhand 1 mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}] execute if entity @s[tag=gm4_zc_used_offhand] if predicate gm4_zauber_cauldrons:player/equipment/glass_bottle/in_offhand in overworld run loot replace entity @s weapon.offhand 1 mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/read_data/mainhand.mcfunction ================================================ # @s = player holding a multi_use_bottle in the mainhand # at world spawn # run from player/multi_use_bottle/cache/populate # copy mainhand wormhole x, y, z, and dimension to the temporary data storage data modify entity @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] Item set from entity @s SelectedItem # set flag to remember main hand operation across ticks tag @s add gm4_zc_used_mainhand # set flag scoreboard players set $read_data gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/read_data/offhand.mcfunction ================================================ # @s = player holding a multi_use_bottle in the offhand # at world spawn # run from player/multi_use_bottle/cache/populate # copy offhand wormhole x, y, z, and dimension to the temporary data storage data modify entity @e[type=item,tag=gm4_zc_new_nbt_storage,limit=1] Item set from entity @s equipment.offhand # set flag to remember offhand operation across ticks tag @s add gm4_zc_used_offhand ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/multi_use_bottle/restore_context.mcfunction ================================================ # @s = none # at world spawn # scheduled by player/multi_use_bottle/cache/populate # restore original context and start multi use code execute as @a[predicate=gm4_zauber_cauldrons:player/advancement/use/multi_use_bottle] at @s run function gm4_zauber_cauldrons:player/multi_use_bottle/cache/load ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/submain.mcfunction ================================================ # @s = non-spectator players # at world spawn # run from main # check creation execute at @s[gamemode=!adventure] if predicate gm4_zauber_cauldrons:player/equipment/enchanted_book/in_mainhand anchored eyes positioned ^ ^ ^1.448 align xyz unless entity @e[type=marker,tag=gm4_zauber_cauldron,dx=0] unless entity @e[tag=smithed.block,dx=0] run function gm4_zauber_cauldrons:cauldron/setup/validate_structure # crystal effects scoreboard players set $success gm4_zc_data 0 execute if predicate gm4_zauber_cauldrons:player/equipment/crystal/luck_and_in_offhand run function gm4_zauber_cauldrons:player/crystal/process execute if score $success gm4_zc_data matches 0 if entity @s[tag=gm4_zc_crystal_active] at @s run function gm4_zauber_cauldrons:player/crystal/deactivate scoreboard players reset $success gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/acquire_destination_context.mcfunction ================================================ # sets the execution location to the destination of the wormhole used # @s = user to pe teleported by wormhole # at @s # run from player/wormhole_targeting/prepare_teleport # insert coordinates and dimension, make sure coordinates are center-of-block coordinates $execute in $(dimension) positioned $(x) $(y) $(z) align xyz positioned ~.5 ~.5 ~.5 run function gm4_zauber_cauldrons:player/wormhole_targeting/teleport_user ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/prepare_teleport.mcfunction ================================================ # @s = player consuming wormhole_bottle # at @s # run from advancement zauber_cauldrons:use/wormhole # compatibility with other modules function #gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport # revoke advancement for next teleport advancement revoke @s only gm4_zauber_cauldrons:use/wormhole # detect main or offhand warp and prepare target coordinates in storage data remove storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos execute unless score $read_coordinates gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/wormhole/in_mainhand store success score $read_coordinates gm4_zc_data run data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos set from entity @s SelectedItem.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos execute unless score $read_coordinates gm4_zc_data matches 1 if predicate gm4_zauber_cauldrons:player/equipment/wormhole/in_offhand run data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos set from entity @s equipment.offhand.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos scoreboard players reset $read_coordinates gm4_zc_data # backwards compatibility with old wormholes from below v1.10 # earliest version is tracked by our upgrade paths framework execute if score zauber_cauldrons gm4_earliest_version matches ..110000 run function gm4_zauber_cauldrons:player/wormhole_targeting/translate_numeric_dimension_id with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos # affect player with resistance effect give @s resistance 1 12 true # particles and sound for depart particle minecraft:portal ~ ~.6 ~ .25 .25 .25 0 100 playsound minecraft:entity.enderman.teleport player @a[distance=0.001..8] ~ ~ ~ 1 .3 # teleport user to destination function gm4_zauber_cauldrons:player/wormhole_targeting/acquire_destination_context with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos # gm4_zc_wormhole_consumer tag used to be removed here, however, this wasn't reliable for tag removal for non-player entities. # The tag removal is now done in the function teleport_user, making this redundant. This is just a failsafe to # ensure players aren't left with the tag in case the dimension selection fails. tag @s remove gm4_zc_wormhole_consumer ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/remove_speechmarks.mcfunction ================================================ # removes the encasing speechmarks from a supplied dimension id # @s = player consuming wormhole_bottle # at @s # run from player/wormhole_targeting/translate_numeric_dimension_id # uses the fact that 'data modify ... set value "some_string"' and 'data modify ... set value some_string' result in the identical string "some_string" being stored in storage $data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos.dimension set value $(dimension) ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/teleport_user.mcfunction ================================================ # @s = user to pe teleported by wormhole # at target location of wormhole (center of block) # run from player/wormhole_targeting/acquire_destination_context # forcibly load the chunk execute store success score $forceloaded gm4_zc_data run forceload query ~ ~ execute if score $forceloaded gm4_zc_data matches 0 run forceload add ~ ~ execute if score $forceloaded gm4_zc_data matches 0 run forceload remove ~ ~ # teleport tp @s ~ ~.2 ~ # play arrival animation particle minecraft:portal ~ ~.8 ~ .25 .25 .25 0 100 force @a[distance=..32] execute positioned ~ ~.7 ~ run playsound minecraft:entity.enderman.teleport player @a[distance=..8] ~ ~ ~ 1 .3 # explode user if no cauldron is present # in future versions it may be required to wait until the chunks is loaded until the block check is done, # but as of 1.20.4 this seems to work just fine in combination with the forceload command above execute unless entity @e[tag=gm4_zc_wormhole_consumer,scores={gm4_zc_no_explode=1..},limit=1] unless block ~ ~ ~ #minecraft:cauldrons run summon tnt ~.5 ~.7 ~.5 {fuse:0s} # reset fake player scoreboard players reset $forceloaded gm4_zc_data # remove tag # Testing in 1.16.5 showed that, for non-player entities, the tag isn't removed as expected in prepare_teleport line 30. # This lead to entities with leftover tags, which would break teleportation server wide, as those entities might be teleported instead. # Keep testing whether this is still necessary in future versions. # Note that this would not be an issue in vanilla zauber, however, zauber liquids allows the teleportation of non-player entities. tag @s remove gm4_zc_wormhole_consumer ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/player/wormhole_targeting/translate_numeric_dimension_id.mcfunction ================================================ # translates a numeric dimension id from the forceload library to the dimension name as a string for backwards compatibility with old wormholes # @s = player consuming wormhole_bottle # at @s # run from player/wormhole_targeting/prepare_teleport # this macro function will fail to instantiate if $(dimension) does not contain a number, as the score ... matches expects a number, not a string. # as a result, this function will not run if a string is stored in $(dimension) # find dimension marker with matching id and get its name (the name will be something like '"minecraft:overworld"') $execute as @e[type=marker,tag=gm4_dimension] if score @s gm4_dimension matches $(dimension) run tag @s add gm4_zc_targeted_dimension data modify storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos.dimension set from entity @e[type=marker,tag=gm4_zc_targeted_dimension,limit=1] CustomName # the name stored is still encased by speechmarks, which we need to remove function gm4_zauber_cauldrons:player/wormhole_targeting/remove_speechmarks with storage gm4_zauber_cauldrons:temp/wormhole_targeting/destination cauldron_pos # remove tag tag @e[type=marker,tag=gm4_dimension] remove gm4_zc_targeted_dimension ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/init_piece.mcfunction ================================================ # @s = result item # at center of cauldron block # run from recipes/armor/{{piece}}/{{flavor}} # with $components: the initial item components of the armor piece $data modify entity @s Item.components merge value $(components) ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/select_piece.mcfunction ================================================ # @s = boiling zauber cauldron with enchanted prismarine shard inside # at @s (center of block) # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 3 # recipes # the select_flavor functions are generated via beet from templates # generated with the help of bolt for piece_data in ctx.meta['armor_pieces']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,id:f"minecraft:golden_{piece_data['piece']}"}] run function f"gm4_zauber_cauldrons:recipes/armor/{piece_data['piece']}/select_flavor" # use water and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/armor/use_cauldron # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/armor/use_cauldron.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s align xyz # run from recipes/armor/zauber_armor # calculate amount of vexes to spawn execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # sounds and visuals particle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10 playsound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5 # consume water function gm4_zauber_cauldrons:cauldron/structure/modify/use_water ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/blurry_wormhole.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from count_chorus # generate random coordinate offset from UUID of items in cauldron execute store result score $dx gm4_zc_data run data get entity @e[type=item,nbt={Item:{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}},limit=1] UUID[3] 0.000000005 execute store result score $dy gm4_zc_data run data get entity @e[type=item,nbt={Item:{id:"minecraft:chorus_fruit"}},limit=1] UUID[3] 0.000000005 execute store result score $dz gm4_zc_data run data get entity @e[type=item,nbt={Item:{id:"minecraft:popped_chorus_fruit"}},limit=1] UUID[3] 0.000000005 # get bottled_vex cauldron pos data modify storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}].components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos execute store result score $x gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x 1 execute store result score $y gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y 1 execute store result score $z gm4_zc_data run data get storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z 1 # add random offset (target coordinates) scoreboard players operation $x gm4_zc_data += $dx gm4_zc_data scoreboard players operation $y gm4_zc_data += $dy gm4_zc_data scoreboard players operation $z gm4_zc_data += $dz gm4_zc_data # copy target coordinates to storage execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x int 1 run scoreboard players get $x gm4_zc_data execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y int 1 run scoreboard players get $y gm4_zc_data execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z int 1 run scoreboard players get $z gm4_zc_data # kill remaining items execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon wormhole loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/wormhole # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # if one, popped or raw chorus, was more than required, turn those into vexes execute if score $raw_chorus_fullness gm4_zc_chorus matches 1.. run scoreboard players operation @s gm4_zc_fullness += $raw_chorus_fullness gm4_zc_chorus execute if score $popped_chorus_fullness gm4_zc_chorus matches 1.. run scoreboard players operation @s gm4_zc_fullness += $popped_chorus_fullness gm4_zc_chorus # cosmetics execute at @s run particle minecraft:witch ~ ~.3 ~ .1 .1 .1 1 7 execute at @s run playsound minecraft:entity.ender_eye.death master @a[distance=..8] ~ ~ ~ 1 .6 # set flag scoreboard players set $recipe_success gm4_zc_data 1 # reset fake players scoreboard players reset $dx gm4_zc_data scoreboard players reset $dy gm4_zc_data scoreboard players reset $dz gm4_zc_data scoreboard players reset $x gm4_zc_data scoreboard players reset $y gm4_zc_data scoreboard players reset $z gm4_zc_data ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/count_chorus.mcfunction ================================================ # @s = boiling zauber cauldron with bottled vex and enchanted_prismarine_shard inside # at center of block # run from cauldron/recipe_checks # initialise fake players scoreboard players set $cancel_recipe gm4_zc_data 0 # set expected fullness for these recipes (stack chorus+stack popped chorus+enchanted_prismarine_shard+bottled vex) scoreboard players set $expected_item_amount gm4_zc_fullness 4 # set sip level returned when crafting multi-sips, in case another module messed with these presets execute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b} # read count from chorus fruit stacks execute store result score $raw_chorus_fullness gm4_zc_chorus run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:chorus_fruit"}}}}].count 1 execute store result score $popped_chorus_fullness gm4_zc_chorus run data get storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:popped_chorus_fruit"}}}}].count 1 # cancel recipe if one of the ingredients is missing execute if score $raw_chorus_fullness gm4_zc_chorus matches 0 run scoreboard players set $cancel_recipe gm4_zc_data 2 execute if score $popped_chorus_fullness gm4_zc_chorus matches 0 run scoreboard players set $cancel_recipe gm4_zc_data 2 # check count against seed based count execute unless score $cancel_recipe gm4_zc_data matches 2 run scoreboard players operation $raw_chorus_fullness gm4_zc_chorus -= $required_chorus_fruit gm4_zc_chorus execute unless score $cancel_recipe gm4_zc_data matches 2 run scoreboard players operation $popped_chorus_fullness gm4_zc_chorus -= $required_popped_chorus_fruit gm4_zc_chorus # start incomplete recipe execute unless score $cancel_recipe gm4_zc_data matches 2 if score $raw_chorus_fullness gm4_zc_chorus matches ..-1 run scoreboard players set $cancel_recipe gm4_zc_data 1 execute unless score $cancel_recipe gm4_zc_data matches 2 if score $popped_chorus_fullness gm4_zc_chorus matches ..-1 run scoreboard players set $cancel_recipe gm4_zc_data 1 execute if score $cancel_recipe gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/chorus/blurry_wormhole # start complete recipe execute if score $cancel_recipe gm4_zc_data matches 0 run function gm4_zauber_cauldrons:recipes/chorus/precise_wormhole # use water and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 at @s if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items execute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water # reset fake players scoreboard players reset $cancel_recipe gm4_zc_data scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/initiate_chorus_amounts.mcfunction ================================================ # determines the chorus and popped chorus amounts required for the wormhole recipe depending on the world seed # none # at world spawn # Run from init if neither $required_total nor required_total are present in gm4_zc_flowers, the latter being a check for old worlds # initialize randomizer random reset gm4_zauber_cauldrons:chorus/chorus_amounts 0 true true # roll random chorus and popped chorus fruit amounts execute store result score $required_chorus_fruit gm4_zc_chorus run random value 1..64 gm4_zauber_cauldrons:chorus/chorus_amounts execute store result score $required_popped_chorus_fruit gm4_zc_chorus run random value 1..64 gm4_zauber_cauldrons:chorus/chorus_amounts # store total scoreboard players operation $required_total gm4_zc_chorus = $required_chorus_fruit gm4_zc_chorus scoreboard players operation $required_total gm4_zc_chorus += $required_popped_chorus_fruit gm4_zc_chorus ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/chorus/precise_wormhole.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from count_chorus # get bottled_vex nbt into blueprint data modify storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}].components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos # kill remaining items execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon wormhole loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/wormhole # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # cosmetics execute at @s run particle minecraft:witch ~ ~.3 ~ .1 .1 .1 1 17 execute at @s run playsound minecraft:entity.ender_eye.death master @a[distance=..8] ~ ~ ~ 0.6 .2 # add oversized stacks to cauldron fullness to summon vexes scoreboard players operation @s gm4_zc_fullness += $raw_chorus_fullness gm4_zc_chorus scoreboard players operation @s gm4_zc_fullness += $popped_chorus_fullness gm4_zc_chorus # set flag scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/crystals/select_effect.mcfunction ================================================ # @s = boiling zauber cauldron with sea lantern and nether star inside # at @s (center of block) # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 3 # recipes # the crystals/effects/ functions are generated via beet from templates # generated with the help of bolt for effect_data in ctx.meta['crystal_effects']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:effect_data['effect']}}}}] run function f"gm4_zauber_cauldrons:recipes/crystals/effects/{effect_data['effect']}" # use water and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:recipes/crystals/use_cauldron # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/crystals/use_cauldron.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s (center of block) # run from recipes/crystals/zauber_crystals # calculate amount of vexes to spawn execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # sounds and visuals particle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10 playsound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5 # consume water function gm4_zauber_cauldrons:cauldron/structure/modify/use_water ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/check_normal_flowers.mcfunction ================================================ # @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and NO poisonous flowers inside. # at center of block # run from recipes/flowers/check_poisonous_flowers # initialise fake player (required if all flowers are poisonous/gm4_zc_flowers=1) scoreboard players set $normal_flowers_amount gm4_zc_fullness 0 # count normal flowers for flower_data in ctx.meta['flower_types']: execute if score f"${flower_data['flower']}" gm4_zc_flowers matches 0 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:flower_data['item_id']}}}}] run scoreboard players add $normal_flowers_amount gm4_zc_fullness 1 # compare amount of normal flowers in cauldron to expected amount execute if score $normal_flowers_amount gm4_zc_fullness = $required_flowers gm4_zc_flowers run function gm4_zauber_cauldrons:recipes/flowers/luck # reset fake players scoreboard players reset $normal_flowers_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/check_poisonous_flowers.mcfunction ================================================ # @s = boiling zauber cauldron with grass and enchanted_prismarine_shard inside. # at center of block # run from cauldron/recipe_checks # initialise fake players scoreboard players set $cancel_recipe gm4_zc_data 0 # set expected fullness for these recipes scoreboard players operation $expected_item_amount gm4_zc_fullness = $required_flowers gm4_zc_flowers # add two to expected items (grass and enchanted_prismarine_shard) scoreboard players add $expected_item_amount gm4_zc_fullness 2 # poisonous flowers set flag to abort recipe checks for flower_data in ctx.meta['flower_types']: execute if score f"${flower_data['flower']}" gm4_zc_flowers matches 1 if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:flower_data['item_id']}}}}] run scoreboard players set $cancel_recipe gm4_zc_data 1 # recipe execute if score $cancel_recipe gm4_zc_data matches 0 run function gm4_zauber_cauldrons:recipes/flowers/check_normal_flowers # effect with poison if poisonous flower in cauldron execute if score $cancel_recipe gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:recipes/flowers/poison # use water and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 at @s if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items execute if score $recipe_success gm4_zc_data matches 1 at @s run function gm4_zauber_cauldrons:cauldron/structure/modify/use_water # reset fake players scoreboard players reset $cancel_recipe gm4_zc_data scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/initiate_flower_types.mcfunction ================================================ # selects flowers to be poisounous (=1) or lucky (=0) # none # at world spawn # Run from init if $required_flowers gm4_zc_flowers has no score # initialize randomizer random reset gm4_zauber_cauldrons:flowers/poisonous_flowers 0 true true # assign poisonous/lucky score for flower_data in ctx.meta['flower_types']: execute store result score f"${flower_data['flower']}" gm4_zc_flowers run random value 0..1 gm4_zauber_cauldrons:flowers/poisonous_flowers # store amount of non poisonous flowers as 12- scoreboard players set $required_flowers gm4_zc_flowers 12 for flower_data in ctx.meta['flower_types']: scoreboard players operation $required_flowers gm4_zc_flowers -= f"${flower_data['flower']}" gm4_zc_flowers ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/luck.mcfunction ================================================ # @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and poisonous flowers inside. # at center of block # run from recipes/flowers/check_normal_flowers execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] execute align y positioned ~ ~.75 ~ run effect give @a[distance=..2,gamemode=!spectator] minecraft:luck infinite 0 true summon area_effect_cloud ~ ~.75 ~ {Tags:["gm4_zc_luck_cloud"],Radius:1.6f,Duration:10,RadiusOnUse:0.0f,RadiusPerTick:0.0f,ReapplicationDelay:100,custom_particle:{type:"minecraft:happy_villager"},potion_contents:{custom_effects:[{id:"minecraft:luck",amplifier:0,duration:12,show_particles:0b}]}} playsound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5 scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/flowers/poison.mcfunction ================================================ # @s = boiling zauber cauldron with grass and enchanted_prismarine_shard and poisonous flowers inside. # at center of block # run from recipes/flowers/check_poisonous_flowers execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] summon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:"entity.gm4.zauber_cauldrons.smog.poison",fallback:"the mess they made"},Radius:2.1f,Duration:-1,RadiusOnUse:-0.1f,RadiusPerTick:-0.005f,ReapplicationDelay:40,potion_contents:{custom_effects:[{id:"minecraft:poison",amplifier:2,duration:3200}]}} playsound entity.elder_guardian.curse block @a[distance=..16] ~ ~ ~ 0.6 0.7 scoreboard players set $recipe_success gm4_zc_data 1 # set $expected_item_amount to 0, this turns all items into vexes scoreboard players set $expected_item_amount gm4_zc_fullness 0 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/select_bottle.mcfunction ================================================ # @s = magicol zauber cauldron with water bottle and prismarine crystals inside # at center of block # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 3 # set sip level returned when crafting multi-sips, in case another module messed with these presets execute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b} # select bottle type # called functions are generated via beet from templates # generated with the help of bolt for bottle_data in ctx.meta['potion_bottles']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:bottle_data['item_id']}}}}] run function f"gm4_zauber_cauldrons:recipes/magicol/bottled/{bottle_data['bottle']}/select_color" # use water or powder snow and play sound once a recipe ran execute if score $current gm4_zc_moon_phase = $preferred gm4_zc_moon_phase if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/magicol/bottled/use_cauldron # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/use_cauldron.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s (center of block) # run from recipes/magicol/bottled/select_bottle # calculate amount of vexes to spawn execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # sounds and visuals playsound minecraft:block.brewing_stand.brew block @a[distance=..16] ~ ~ ~ 0.6 0.66 # consume liquid scoreboard players remove @s gm4_zc_liquid_level 1 execute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/wrong_moon_phase.mcfunction ================================================ # @s = magicol zauber cauldron with water bottle and prismarine crystals inside # at center of block # run from recipes/magicol/bottled # calculate amount of vexes to spawn scoreboard players set $expected_item_amount gm4_zc_fullness 0 execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # sounds and visuals particle minecraft:block{block_state:"minecraft:glass"} ~ ~.3 ~ 0.12 0.12 0.12 0 23 playsound minecraft:block.glass.break block @a[distance=..8] ~ ~ ~ 1 1.3 # consume liquid scoreboard players remove @s gm4_zc_liquid_level 1 execute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score # return return fail ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/initiate_moon_phase_offset.mcfunction ================================================ # no @s. # at world spawn # called by init # generates a random moon_phase_offset based on the world seed on module installation random reset gm4_zauber_cauldrons:bottled_vex/moon_phase_offset 0 true true execute store result score $magicol_offset gm4_zc_moon_phase run random value 0..7 gm4_zauber_cauldrons:bottled_vex/moon_phase_offset ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/select_color.mcfunction ================================================ # @s = boiling zauber cauldron with enchanted prismarine shard & magic in a bottle inside # at @s (center of block) # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 3 # recipes # called functions are generated via beet from templates # generated with the help of bolt for color_data in ctx.meta['magicol_colors']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:color_data['ingredient_item_id']}}}}] run function f"gm4_zauber_cauldrons:recipes/magicol/{color_data['color']}" # use water and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/magicol/use_cauldron # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/magicol/use_cauldron.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s (center of block) # run from recipes/magicol/select_color # calculate amount of vexes to spawn execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # update cauldron liquid execute align xyz run function gm4_zauber_cauldrons:cauldron/liquid/update/from_score # sounds and visuals particle minecraft:entity_effect{color:[0.1,0.1,0.1,1.0]} ~ ~.4 ~ 0 0 0 1 10 playsound entity.player.levelup block @a[distance=..16] ~ ~ ~ 1 1.5 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/drinkable/check_liquid.mcfunction ================================================ # @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside # at center of block # run from recipes/potions/select_bottle # if powder snow is present, run effect checks # the select_effect function is generated via beet from templates execute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/drinkable/select_effect # strength recipe can also be executed with powder snow in the cauldron execute if score $has_powder_snow gm4_zc_data matches 1.. unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"minecraft:potion"}},"minecraft:potion_contents":{potion:"minecraft:strong_strength"}}}] run function gm4_zauber_cauldrons:recipes/potions/drinkable/strength ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/instant_damage.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes particle heart ~ ~.2 ~ .25 .2 .25 10 5 summon area_effect_cloud ~ ~.75 ~ {Radius:1.25f,Duration:-1,RadiusOnUse:-0.09f,RadiusPerTick:0.0f,ReapplicationDelay:20,potion_contents:{custom_effects:[{id:"minecraft:instant_health",amplifier:2,duration:1}]}} ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/instant_health.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes summon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:"entity.gm4.zauber_cauldrons.smog.instant_health",fallback:"their own incompetence"},Radius:2.1f,Duration:-1,RadiusOnUse:-0.75f,RadiusPerTick:-0.0005f,ReapplicationDelay:0,potion_contents:{custom_effects:[{id:"minecraft:instant_damage",amplifier:8,duration:40}]}} ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/jump_boost.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes particle minecraft:effect ~0.2 ~.7 ~ 0.2 0.2 0.2 0 30 summon rabbit ~0.2 ~.7 ~ {RabbitType:99,Tags:["gm4_zc_killer_rabbit"],attributes:[{id:"minecraft:max_health",base:31.0}],Health:31,active_effects:[{id:"minecraft:regeneration",amplifier:0,duration:2147483647,show_particles:false},{id:"minecraft:strength",amplifier:3,duration:2147483647,show_particles:false}]} playsound minecraft:entity.illusioner.mirror_move block @a[distance=..16] ~0.2 ~.7 ~ 0.4 0.5 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/poison.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes # cave spiders execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 execute if predicate gm4_zauber_cauldrons:cauldron/cave_spider_chance run summon cave_spider ~ ~.95 ~.1 # cobwebs execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~-1 #gm4:replaceable run setblock ~-1 ~0 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~0 #gm4:replaceable run setblock ~-1 ~0 ~0 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~0 ~1 #gm4:replaceable run setblock ~-1 ~0 ~1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~0 ~-1 #gm4:replaceable run setblock ~0 ~0 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~0 ~1 #gm4:replaceable run setblock ~0 ~0 ~1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~-1 #gm4:replaceable run setblock ~1 ~0 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~0 #gm4:replaceable run setblock ~1 ~0 ~0 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~0 ~1 #gm4:replaceable run setblock ~1 ~0 ~1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~-1 #gm4:replaceable run setblock ~-1 ~1 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~0 #gm4:replaceable run setblock ~-1 ~1 ~0 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~-1 ~1 ~1 #gm4:replaceable run setblock ~-1 ~1 ~1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~-1 #gm4:replaceable run setblock ~0 ~1 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~0 #gm4:replaceable run setblock ~0 ~1 ~0 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~0 ~1 ~1 #gm4:replaceable run setblock ~0 ~1 ~1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~-1 #gm4:replaceable run setblock ~1 ~1 ~-1 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~0 #gm4:replaceable run setblock ~1 ~1 ~0 cobweb destroy execute if predicate gm4_zauber_cauldrons:cauldron/cobweb_chance if block ~1 ~1 ~1 #gm4:replaceable run setblock ~1 ~1 ~1 cobweb destroy ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/regeneration.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes summon area_effect_cloud ~ ~.75 ~ {CustomName:{translate:"entity.gm4.zauber_cauldrons.smog.regeneration",fallback:"the mess they made"},Radius:1.8f,Duration:-1,RadiusOnUse:-0.01f,RadiusPerTick:-0.0002f,ReapplicationDelay:40,potion_contents:{custom_effects:[{id:"minecraft:wither",amplifier:3,duration:1280}]}} ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/speed.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes # no environmental effect ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/environmental_effects/strength.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at center of block # run from recipes/potions/ recipes # applies environmental effects caused by recipes # no environmental effects if powder snow was used execute if score $has_powder_snow gm4_zc_data matches 1.. run return 0 # sound playsound item.firecharge.use block @a[distance=..8] ~ ~ ~ 0.8 0.6 # place fire execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~-1 #gm4:replaceable run setblock ~-1 ~0 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~0 #gm4:replaceable run setblock ~-1 ~0 ~0 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~0 ~1 #gm4:replaceable run setblock ~-1 ~0 ~1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~0 ~-1 #gm4:replaceable run setblock ~0 ~0 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~0 ~1 #gm4:replaceable run setblock ~0 ~0 ~1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~-1 #gm4:replaceable run setblock ~1 ~0 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~0 #gm4:replaceable run setblock ~1 ~0 ~0 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~0 ~1 #gm4:replaceable run setblock ~1 ~0 ~1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~-1 #gm4:replaceable run setblock ~-1 ~1 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~0 #gm4:replaceable run setblock ~-1 ~1 ~0 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~-1 ~1 ~1 #gm4:replaceable run setblock ~-1 ~1 ~1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~1 ~-1 #gm4:replaceable run setblock ~0 ~1 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~0 ~1 ~1 #gm4:replaceable run setblock ~0 ~1 ~1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~-1 #gm4:replaceable run setblock ~1 ~1 ~-1 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~0 #gm4:replaceable run setblock ~1 ~1 ~0 fire destroy execute if predicate gm4_zauber_cauldrons:cauldron/fire_chance if block ~1 ~1 ~1 #gm4:replaceable run setblock ~1 ~1 ~1 fire destroy ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/invalid_recipe.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s # run from potions/lingering/check_liquid and potions/splash/check_liquid # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] #visuals scoreboard players reset $expected_item_amount gm4_zc_fullness summon tnt # kill marker and related entities function gm4_zauber_cauldrons:cauldron/structure/destroy ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/lingering/check_liquid.mcfunction ================================================ # @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside # at center of block # run from recipes/potions/select_bottle # if powder snow is present, run effect checks # the select_effect function is generated via beet from templates execute if score $has_powder_snow gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/lingering/select_effect # water used instead of powder snow execute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/invalid_recipe ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/select_bottle.mcfunction ================================================ # @s = boiling zauber cauldron with prismarine crystals and golden apple inside # at center of block # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 3 # set sip level returned when crafting multi-sips, in case another module messed with these presets execute if score $has_soul_fire_heatsource gm4_zc_data matches 1.. run data modify storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle set value {sips:9,size:9,multi_use:1b} # select bottle type # generated with the help of bolt for bottle_data in ctx.meta['potion_bottles']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:bottle_data['item_id']}}}}] run function f"gm4_zauber_cauldrons:recipes/potions/{bottle_data['bottle']}/check_liquid" # use water or powder snow and play sound once a recipe ran execute if score $recipe_success gm4_zc_data matches 1 run function gm4_zauber_cauldrons:recipes/potions/use_cauldron # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/splash/check_liquid.mcfunction ================================================ # @s = boiling zauber cauldron with prismarine crystals, golden apple and a splash potion inside # at center of block # run from recipes/potions/select_bottle # if powder snow is present, run effect checks # the select_effect function is generated via beet from templates execute if score $has_powder_snow gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/splash/select_effect # water used instead of powder snow execute if score $has_water gm4_zc_data matches 1.. run function gm4_zauber_cauldrons:recipes/potions/invalid_recipe ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/potions/use_cauldron.mcfunction ================================================ # @s = boiling zauber cauldron with recipe inside # at @s # run from zauber_potions # calculate amount of vexes to spawn execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # sounds and visuals playsound minecraft:block.brewing_stand.brew block @a[distance=..16] ~ ~ ~ 0.6 0.66 # consume liquid function gm4_zauber_cauldrons:cauldron/structure/modify/use_liquid ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/recipes/precursors/enchanted_prismarine_shard.mcfunction ================================================ # @s = boiling zauber cauldron with a precursor inside. # at center of block # run from cauldron/recipe_checks # set expected fullness for these recipes scoreboard players set $expected_item_amount gm4_zc_fullness 1 # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # recipe loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/enchanted_prismarine_shard # make items in cauldron pickup-able instantly execute align xyz as @e[type=item,dx=0,dy=0,dz=0] run data modify entity @s PickupDelay set value 0s # use xp execute as @a[level=30..,distance=..2,limit=1,sort=nearest,gamemode=!spectator] run experience add @s[gamemode=!creative] -30 levels # sounds and visuals playsound block.portal.travel block @a[distance=..16] ~ ~ ~ .2 1.2 particle enchanted_hit ~ ~.4 ~ .1 .1 .1 .15 10 # use water and play sound once a recipe ran function gm4_zauber_cauldrons:cauldron/structure/modify/use_water # check for leftover items execute if score @s gm4_zc_fullness > $expected_item_amount gm4_zc_fullness run function gm4_zauber_cauldrons:cauldron/structure/use_extra_items # reset fake players scoreboard players reset $expected_item_amount gm4_zc_fullness ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/potion_landed.mcfunction ================================================ # spawn copy of potion with one use less when a zauber splash soulution hits the ground # @s = @e[type=marker,tag=gm4_potion_tracker] # at @s # run from zauber_cauldrons:soulution/thrown_potion_tracking/verify_potion_nbt # pull data of thrown potion into storage data modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item set from storage gm4_potion_tracking:temp entity_data.Item # set to use throws instead of sips scoreboard players set $use_alternative_sips gm4_zc_data 1 # check remaining sips execute store result score $remaining_sips gm4_zc_data run data get storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components."minecraft:custom_data".gm4_zauber_cauldrons.bottle.sips execute if score $remaining_sips gm4_zc_data matches 2.. run function gm4_zauber_cauldrons:soulution/spawn_copy # reset fake players and storage scoreboard players reset $remaining_sips gm4_zc_data scoreboard players reset $use_alternative_sips gm4_zc_data data remove storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/spawn_copy.mcfunction ================================================ # Spawns a new soulution item at the location where a splash or lingering soulution hit the ground, with one less sip # @s = thrown zauber splash soulution that hit the ground (signaled by lib_potion_tracking) # at @s # run from zauber_cauldrons:soulution/thrown_potion_tracking/potion_landed # use sip and provided edited potion item in yellow shulker box (gamemode 4 lib_forceload standard) function gm4_zauber_cauldrons:soulution/use_sip # spawn potion item loot spawn ~ ~ ~ mine 29999998 1 7134 minecraft:stick[custom_data={drop_contents:1b}] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/soulution/use_sip.mcfunction ================================================ # Removes one sip from a soulution stored in storage gm4_zauber_cauldrons:temp/item/multi_use_bottle. Utility function called from multiple locations. # @s = varies, check calling functions # at varies, check calling functions # run from player/multi_use_bottle/modify_bottle and # NOTE: # Before calling this function, a couple of steps must be taken by the calling function to prepare # scores and storages. These are: # 1) Fake player $remaining_sips in gm4_zc_data must be set to the amount of uses left on the soulution (the amount before a sip was used!). # This fake player should be reset by the calling function afterwards. # 2) Storage gm4_zauber_cauldrons:temp/item/multi_use_bottle must have item-formatted nbt # (like entries inside the Items array of containers, or the Item nb tag on item entities) in the nb tag 'Item'. # This nbt will be used as a base for the item with one sip removed. Note that the first line of lore will be overwritten by the new # sip information. This storage should be reset by the calling function afterwards via storage remove <...>. # 3) Fake player $use_alternative_sips in gm4_zc_data must be set to 1 if 'throws' should be displayed instead of 'sips'. This is a purely visual change. # This fake player should be reset by the calling function afterwards. # # The item with the updated sip information will be placed in slot 0 of the yellow shulker box at minecraft:overworld 29999998 1 7134 (see lib_forceload), # from where the calling function must then immediately use it (waiting even for a single tick may cause the item to be overwritten). # # This function does not implement any sort of safeguard reagarding invalid sip amounts, i.e. the calling function must ensure there are still sips # left to be used on the soulution, e.g. by checking whether there were at least two sips remaining before the soulution was used. # subtract one sip scoreboard players remove $remaining_sips gm4_zc_data 1 execute store result storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.components."minecraft:custom_data".gm4_zauber_cauldrons.bottle.sips int 1 run scoreboard players get $remaining_sips gm4_zc_data # set slot information to target slot 0 in the yellow shulker box data modify storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item.Slot set value 0b # move data into shulker box at 29999998 1 7134 (gamemode 4 lib_forceload standard) execute in overworld run data modify block 29999998 1 7134 Items append from storage gm4_zauber_cauldrons:temp/item/multi_use_bottle Item # update lore scoreboard players add $use_alternative_sips gm4_zc_data 0 item modify block 29999998 1 7134 container.0 gm4_zauber_cauldrons:soulution/update_sips ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/thrown_potion_tracking/tag_potion.mcfunction ================================================ # marks thrown potion for tracking by lib_potion tracking # @s = @e[type=potion,tag=!gm4_potion_tracking_checked] # at @s # run from function tag #gm4_potion_tracking:tag_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}}}}] add gm4_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_magicol"}}}}}] add gm4_potion ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/thrown_potion_tracking/verify_potion_nbt.mcfunction ================================================ # checks if the potion that hit the ground was a zauber potion # @s = @e[type=marker,tag=gm4_potion_tracker] # at @s # run from function tag #gm4_potion_tracking:potion_landed execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:custom_data"{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}} run function gm4_zauber_cauldrons:soulution/potion_landed execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:custom_data"{gm4_zauber_cauldrons:{item:"bottled_magicol"}} run function gm4_zauber_cauldrons:bottled_magicol/potion_landed ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/function/upgrade_paths/1.10.mcfunction ================================================ # add pre-computed location and dimension data to existing Zauber Cauldrons, if there is a player in the same dimension as the cauldron (required for obtaining the dimension id) execute as @e[type=marker,tag=gm4_zauber_cauldron,scores={gm4_entity_version=..1}] at @s if entity @p[x=0] run function gm4_zauber_cauldrons:cauldron/setup/initialize_marker tag @a remove gm4_zc_luck ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/guidebook/zauber_cauldrons.json ================================================ { "id": "zauber_cauldrons", "name": "Zauber Cauldrons", "module_type": "module", "icon": { "id": "minecraft:cauldron" }, "criteria": { "obtain_enchanted_book": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:enchanted_book" ] } ] } }, "create_zauber_cauldron": { "trigger": "minecraft:tick", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:zauber_cauldrons_create": true } } } } ] } }, "obtain_potion": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:potion" ] } ] } }, "obtain_prismarine_shard": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:prismarine_shard" ] } ] } }, "obtain_gold_armor": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:golden_boots", "minecraft:golden_chestplate", "minecraft:golden_helmet", "minecraft:golden_leggings" ] } ] } }, "obtain_zauber_potion": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{}}}" } } ] } }, "obtain_nether_star": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:nether_star" ] } ] } }, "obtain_zauber_crystal": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:'crystal'}}" } } ] } }, "obtain_any_zauber_item": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{}}" } } ] } }, "obtain_bottled_vex": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:glass_bottle" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:'bottled_vex'}}" } } ] } }, "obtain_bottled_magicol": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\"}}" } } ] } }, "obtain_chorus_fruit": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:chorus_fruit", "minecraft:popped_chorus_fruit" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.zauber_cauldrons.description", "fallback": "Zauber Cauldrons expand the magic system, allowing the creation of stronger potions, magical armour, effect granting crystals, and bottled wormholes." } ] ] }, { "name": "creation", "enable": [], "requirements": [ [ "obtain_enchanted_book" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.creation", "fallback": "Creation", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.creation", "fallback": "A Zauber Cauldron is created by holding an enchanted book while looking into a water-filled cauldron over fire.\n\nSoul fire and campfires work as well." } ] ] }, { "name": "recipes", "enable": [], "requirements": [ [ "create_zauber_cauldron" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.recipes", "fallback": "Zauber recipes are performed by dropping items into the cauldron, consuming some water for each recipe.\n\nWhen looking at a Zauber Cauldron, items inside the cauldron won't be picked up." } ] ], "grants": [ "description", "creation" ] }, { "name": "potions", "enable": [], "requirements": [ [ "obtain_potion" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.potions", "fallback": "Zauber Potions", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.tier_4_potions", "fallback": "Powerful tier IV potions can be created by dropping a tier II potion, prismarine crystals, and golden apple into the cauldron.\n\nThere are some side effects when creating the tier IV potions." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_potions", "fallback": "Splash and Lingering potions create an excess of heat and will explode if used in a tier IV potion recipe.\n\nUsing a snow powder cauldron will absorb the heat and successfully create a splash or lingering tier IV potion." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.soulutions", "fallback": "Using soul fire underneath the cauldron will cause all brewed potions to be brewed as a Soulution.\n\nSoulutions can be drank 9 times before emptying." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.splash_and_lingering_soulutions", "fallback": "Splash and Lingering soulutions can be created in the same way.\n\nWhen it lands, a splash or lingering soulution will summon a new soulution bottle at the location." } ] ], "prerequisites": [ "recipes" ] }, { "name": "enchanted_shard", "enable": [], "requirements": [ [ "obtain_prismarine_shard" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.enchanted_prismarine_shard", "fallback": "Advanced Reactants", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard", "fallback": "An enchanted prismarine shard is used to upgrade armour and as a way to get Luck.\n\nThey can be created in a Zauber Cauldron or bought from a wandering trader." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.enchanted_prismarine_shard_creation", "fallback": "They can be created by dropping a prismarine shard in the cauldron while standing nearby with at least 30 experience levels.\n\nThis will consume 30 levels from the nearest applicable observer." } ] ], "prerequisites": [ "recipes" ] }, { "name": "armor", "enable": [], "requirements": [ [ "obtain_gold_armor" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.armor", "fallback": "Zauber Armour", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.armor", "fallback": "Zauber armour can be made with a piece of gold armour, an enchanted prismarine shard and a modifier item." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.armor_modifiers", "fallback": "The following items can be used as a modifier.\n\nGlistering Melon\n +6 health\nBlaze Powder\n +35% Attack Damage\nSugar\n +12% Speed\nTurtle Helmet\n +1 Armour\n\nWearing a full set buffs the most prevalent modifier(s)." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.armor_effects", "fallback": "Zauber armour has about a 55% increase in defense compared to normal gold armour.\n\nEach piece of Zauber Armour also has an Armour Toughness of 3, making it comparable to diamond armour." } ] ], "prerequisites": [ "enchanted_shard" ] }, { "name": "crystals", "enable": [], "requirements": [ [ "obtain_nether_star" ], [ "obtain_zauber_potion" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.crystals", "fallback": "Zauber Crystals", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.crystals", "fallback": "Zauber Crystals can be created with a sea lantern, nether star and tier IV potion.\n\nCrystals only function in the offhand of someone with the luck effect." } ] ] }, { "name": "luck", "enable": [], "requirements": [ [ "obtain_zauber_crystal" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.luck", "fallback": "Luck", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.lucky_flowers", "fallback": "Each world has a different set of 'lucky' and 'poisonous' flowers.\n\nEach of the twelve small flowers fall under one of those categories." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.luck_output", "fallback": "These flowers are used for the Luck recipe, which grants the nearest one with Luck until death.\n\nIf some of the lucky flowers are missing from the Luck recipe, then nothing will happen." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.luck_output_poison", "fallback": "However, if a poisonous flower is added to the recipe, the cauldron will emit a poisonous cloud." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.luck", "fallback": "Luck can be granted to the nearest user by throwing lucky flowers, an enchanted prismarine shard, and short grass into a zauber cauldron." } ] ], "grants": [ "crystals" ] }, { "name": "extra_ingredients", "enable": [], "requirements": [ [ "obtain_any_zauber_item" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.extra_ingredients", "fallback": "Magic in a Bottle", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.extra_ingredients", "fallback": "Any extra ingredients added to a Zauber recipe will leave the cauldron as Possessed Items, weaponless vexes." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.bottling_vexes", "fallback": "If a glass bottle is added to a recipe with extra ingredients, it can instead capture multiples of 3 Possessed Items.\n\nSo if 4 possessed items would normally spawn, 3 would be contained and 1 would be free." } ] ], "grants": [ "recipes" ] }, { "name": "magic_in_a_bottle", "enable": [], "requirements": [ [ "obtain_bottled_vex" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magic_in_a_bottle", "fallback": "If a Magic in a Bottle is left on the ground, the bottle will break and release the vexes.\n\nA Magic in a Bottle stores the location it was created which is useful in creating wormholes." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.bottled_vex_moon_phase", "fallback": "Each Magic in a Bottle has a preferred moon phase.\n\nDuring this moon phase, the bottle doesn't break as quickly and will sparkle to players wearing full zauber armor." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.magicol", "fallback": "Magicol", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_description", "fallback": "Water inside a Cauldron can be converted into a liquid called Magicol.\n\nMagicol is useful for converting areas into colored, spawn-proof biomes." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_creation", "fallback": "Dropping Magic in a Bottle, an enchanted prismarine shard and a dye into a water-filled zauber cauldron will dye the liquid into magicol.\n\nThe level of the liquid is conserved through this process." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_bottling", "fallback": "Magicol can be bottled only during the preferred moon phase of the magic in a bottle used to create it." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_bottling_1", "fallback": "Magicol can be bottled by dropping a splash or lingering water bottle and one piece of prismarine crystals, along with either a slime ball, magma cream, or snowball." } ] ] }, { "name": "magicol_usage", "enable": [], "requirements": [ [ "obtain_bottled_magicol" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.downfall", "fallback": "Magicol bottled with slime balls will be temperate with rain.\n\nWith magma cream they will be arid with no rain, and with snowballs they will be polar with snow." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_potion_types", "fallback": "Soulutions can be created as normal.\n\nLingering bottles of magicol will create permanent particles inside the biome.\n\nDrinkable bottles of magicol can be created, but have no effect." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.bottled_magicol_usage", "fallback": "Throwing a magicol bottle will cause the splashed area to turn into a new biome.\n\nThese biomes are colored according to the magicol liquid and do not spawn any mobs." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.magicol_biome_colors", "fallback": "When a new magicol biome is created, short grass and flowers will grow.\n\nLucky flowers are the only ones that grow when first splashing an area." } ] ] }, { "name": "wormholes", "enable": [], "requirements": [ [ "obtain_bottled_vex" ], [ "obtain_chorus_fruit" ] ], "pages": [ [ { "translate": "text.gm4.guidebook.zauber_cauldrons.section.wormholes", "fallback": "Wormholes", "bold": true }, "\n", { "translate": "text.gm4.guidebook.zauber_cauldrons.wormhole_creation", "fallback": "Throwing an Enchanted Shard, Magic in a Bottle, and some quantity of both Chorus Fruit and Popped Chorus Fruit will create a Wormhole in a Bottle with the location of the Magic in a Bottle." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts", "fallback": "The precise amount of fruit is different for each world, and requires experiments with blurry wormholes and possessed items.\n\nToo few chorus will result in blurry wormholes, locating to a random nearby location." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.wormhole_chorus_amounts_1", "fallback": "If too many chorus or popped chorus are used, the excess fruit will transform into possessed items, but a precise wormhole will be created." } ], [ { "translate": "text.gm4.guidebook.zauber_cauldrons.wormhole_teleportation", "fallback": "Wormholes explode when the drinker reaches their destination, damaging surrounding blocks without harming the drinker.\n\nIf they end up in a cauldron, there no is explosion." } ] ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/item_modifier/soulution/update_sips.json ================================================ [ { "function": "minecraft:set_lore", "mode": "replace_section", "offset": 0, "entity": "this", "lore": [ [ { "nbt": "Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.sips", "storage": "gm4_zauber_cauldrons:temp/item/multi_use_bottle", "plain": true, "color": "gray", "italic": false }, { "text": "/", "color": "gray", "italic": false }, { "nbt": "Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.size", "storage": "gm4_zauber_cauldrons:temp/item/multi_use_bottle", "plain": true, "color": "gray", "italic": false }, { "text": " ", "color": "gray", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.lore.sips", "fallback": "Sips", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$use_alternative_sips" }, "score": "gm4_zc_data" }, "range": 0 } ] }, { "function": "minecraft:set_lore", "mode": "replace_section", "offset": 0, "entity": "this", "lore": [ [ { "nbt": "Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.sips", "storage": "gm4_zauber_cauldrons:temp/item/multi_use_bottle", "plain": true, "color": "gray", "italic": false }, { "text": "/", "color": "gray", "italic": false }, { "nbt": "Item.components.'minecraft:custom_data'.gm4_zauber_cauldrons.bottle.size", "storage": "gm4_zauber_cauldrons:temp/item/multi_use_bottle", "plain": true, "color": "gray", "italic": false }, { "text": " ", "color": "gray", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.lore.throws", "fallback": "Throws", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$use_alternative_sips" }, "score": "gm4_zc_data" }, "range": 1 } ] } ] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/bottled_vex.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:glass_bottle", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/magic_in_a_bottle"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:'bottled_vex'}}" }, { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_zauber_cauldrons:temp/item/bottled_vex" }, "ops": [ { "source": "gm4_zauber_cauldrons", "target": "gm4_zauber_cauldrons", "op": "merge" } ] }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.magic_in_a_bottle", "fallback": "Magic in a Bottle" } } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/enchanted_prismarine_shard.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:prismarine_shard", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/enchanted_prismarine_shard"]}, "minecraft:rarity": "rare" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:'enchanted_prismarine_shard'}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.enchanted_prismarine_shard", "fallback": "Enchanted Prismarine Shard" } } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/items/wormhole.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:potion", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:enchantment_glint_override": true, "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/wormhole_in_a_bottle"]}, "minecraft:potion_contents": { "potion": "minecraft:thick", "custom_color": 8587123 }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:'wormhole_bottle',bottle:{multi_use:0b}}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.gm4.wormhole_in_a_bottle", "fallback": "Wormhole in a Bottle", "italic": false } }, { "function": "minecraft:set_name", "entity": "this", "name": { "translate": "item.gm4.wormhole_in_a_bottle", "fallback": "Wormhole in a Bottle", "italic": false }, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_zauber_cauldrons:blueprint/item/multi_sip" }, "ops": [ { "source": "gm4_zauber_cauldrons.bottle", "target": "gm4_zauber_cauldrons.bottle", "op": "replace" } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_zauber_cauldrons:blueprint/item/wormhole" }, "ops": [ { "source": "gm4_zauber_cauldrons.cauldron_pos", "target": "gm4_zauber_cauldrons.cauldron_pos", "op": "replace" } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "nbt": "gm4_zauber_cauldrons.bottle.sips", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": "/", "color": "gray", "italic": false }, { "nbt": "gm4_zauber_cauldrons.bottle.size", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": " ", "color": "gray", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.lore.sips", "fallback": "Sips", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/enchanted_prismarine_shard.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_zauber_cauldrons:items/enchanted_prismarine_shard", "functions": [ { "function": "minecraft:set_count", "count": 3, "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.125 } ] } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:emerald", "functions": [ { "function": "minecraft:set_count", "count": { "min": 24, "max": 47 } } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/golden_apple.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:golden_apple" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:emerald", "functions": [ { "function": "minecraft:set_count", "count": { "min": 10, "max": 14 } } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/loot_table/wandering_trader/prismarine_crystals.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:prismarine_crystals", "functions": [ { "function": "minecraft:set_count", "count": { "min": 8, "max": 24 } } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:emerald", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/cave_spider_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/clear_night.json ================================================ { "condition": "minecraft:all_of", "terms": [ { "condition": "minecraft:time_check", "clock": "minecraft:overworld", "value": { "min": 13000, "max": 23000 }, "period": 24000 }, { "condition": "minecraft:weather_check", "raining": false, "thundering": false } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/cobweb_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.33 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/cauldron/fire_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.66 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/advancement/use/multi_use_bottle.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4_zauber_cauldrons:use/multi_use_bottle": true } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/armor/full.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "head": { "items": [ "golden_helmet" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"zauber_armor\"}}" } }, "chest": { "items": [ "golden_chestplate" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"zauber_armor\"}}" } }, "legs": { "items": [ "golden_leggings" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"zauber_armor\"}}" } }, "feet": { "items": [ "golden_boots" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"zauber_armor\"}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/bucket/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:bucket" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/bucket/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:bucket" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/crystal/luck_and_in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "effects": { "luck": {} }, "equipment": { "offhand": { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"crystal\"}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/enchanted_book/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:enchanted_book" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/glass_bottle/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:glass_bottle" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/glass_bottle/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:glass_bottle" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/multi_use_bottle/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/multi_use_bottle/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{multi_use:1b}}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bottle/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:potion_contents": "minecraft:water" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bottle/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:potion_contents": "minecraft:water" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bucket/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:water_bucket" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/water_bucket/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:water_bucket" ] } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/wormhole/in_mainhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/equipment/wormhole/in_offhand.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "offhand": { "items": [ "minecraft:potion" ], "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{item:\"wormhole_bottle\"}}" } } } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/player/survival_or_adventure.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "gamemode": [ "survival", "adventure" ] } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/enchanted_prismarine_shard_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.33 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/golden_apple_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.5 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/predicate/wandering_trader/prismarine_crystals_chance.json ================================================ { "condition": "minecraft:random_chance", "chance": 0.4 } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/block/soul_fire_heatsource.json ================================================ { "values": [ "minecraft:soul_fire", "minecraft:soul_campfire" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/cauldron_particles.json ================================================ { "values": [ "gm4_zauber_cauldrons:cauldron/liquid/magicol/check_liquid_id" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/drain_bottle_into_cauldron.json ================================================ { "values": [ ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/drain_bucket_into_cauldron.json ================================================ { "values": [ ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/fill_bottle_from_cauldron.json ================================================ { "values": [ ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/cauldron/liquid/fill_bucket_from_cauldron.json ================================================ { "values": [ ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/function/player/wormhole_targeting/prepare_teleport.json ================================================ { "values": [] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/tags/item/golden_armor.json ================================================ { "values": [ "minecraft:golden_helmet", "minecraft:golden_chestplate", "minecraft:golden_leggings", "minecraft:golden_boots" ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/armor/craft_piece.mcfunction ================================================ # @s = heated water zauber cauldron with enchanted prismarine shard and golden {{piece}} inside # at @s (center of block) # run from recipe/armor/{{piece}}/select_flavor # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon item # item modifier is generated via beet from templates summon item ~ ~.2 ~ {Tags:["gm4_zc_temp_armor_piece"],Item:{id:"minecraft:golden_{{piece}}",count:1}} execute as @e[type=item,dx=0,dy=0,dz=0,tag=gm4_zc_temp_armor_piece,limit=1] run function gm4_zauber_cauldrons:recipes/armor/init_piece with storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,id:"minecraft:golden_{{piece}}"}] item modify entity @e[type=item,dx=0,dy=0,dz=0,tag=gm4_zc_temp_armor_piece,limit=1] contents gm4_zauber_cauldrons:armor/{{piece}}/{{flavor}} tag @e[type=item,dx=0,dy=0,dz=0] remove gm4_zc_temp_armor_piece # set flag scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/armor/select_flavor.mcfunction ================================================ # @s = heated water zauber cauldron with enchanted prismarine shard and golden {{piece}} inside # at @s (center of block) # run from recipe/armor/select_piece # generated with the help of bolt for flavor_data in ctx.meta['armor_flavors']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:flavor_data['ingredient_item_id']}}}}] run function f"gm4_zauber_cauldrons:recipes/armor/{{piece}}/{flavor_data['flavor']}" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/bottled_magicol/color_biome.mcfunction ================================================ # Colors the biome hit by this potion in {{weather_modifier}} {{color}} depending on the potion bottle type thrown # @s = @e[type=marker,tag=gm4_potion_tracker] # at @s # run from zauber_cauldrons:bottled_magicol/{{color}}/select_weather_modifier # prepare fillbiome execute if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item{id:"minecraft:splash_potion"} run summon marker ~ ~ ~ {CustomName:"gm4_zauber_cauldrons_magicol_painter",Tags:["gm4_zc_magicol_painter"],data:{gm4_zauber_cauldrons:{biome:"gm4_zauber_cauldrons:{{weather_modifier}}_{{color}}_verzauberte_plains",flower:"{{flower}}"}}} execute if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item{id:"minecraft:lingering_potion"} run summon marker ~ ~ ~ {CustomName:"gm4_zauber_cauldrons_magicol_painter",Tags:["gm4_zc_magicol_painter"],data:{gm4_zauber_cauldrons:{biome:"gm4_zauber_cauldrons:glittering_{{weather_modifier}}_{{color}}_verzauberte_plains",flower:"{{flower}}"}}} # eyecandy # TODO 1.20.5: figure out how this particle looked in 1.20.4 execute if loaded ~ ~ ~ run summon area_effect_cloud ~ ~ ~ {CustomName:"gm4_zauber_cauldrons_magicol_painter_particle",custom_particle:{type:"minecraft:entity_effect",color:[1.0,1.0,1.0,1.0]},Radius:5f,Duration:5,Color:{{potion_color}},Tags:["gm4_zc_magicol_painter_particle"]} particle minecraft:end_rod ~ ~ ~ 0.2 0.2 0.2 0.3 128 # run fillbiome function gm4_zauber_cauldrons:bottled_magicol/maintain_magicol_painters ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/bottled_magicol/select_weather_modifier.mcfunction ================================================ # Selects weather modifier of magicol thrown # @s = @e[type=marker,tag=gm4_potion_tracker] # at @s # run from zauber_cauldrons:bottled_magicol/potion_landed # check which weather modifier to use # called functions are generated via beet from templates # generated with the help of bolt for modifier_data in ctx.meta['weather_modifiers']: execute unless score $selected_color gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/item/bottled_magicol Item.components."minecraft:custom_data".gm4_zauber_cauldrons{weather_modifier:modifier_data['modifier']} align xyz positioned ~.5 ~.5 ~.5 run function f"gm4_zauber_cauldrons:bottled_magicol/{{color}}/{modifier_data['modifier']}" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/crystals/craft_crystal.mcfunction ================================================ # @s = heated water zauber cauldron with crystal recipe inside # at @s (center of block) # run from recipes/crystals/select_effect # templates/functions/crystals/craft_crystal.mcfunction # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon item # loot table is generated via beet from templates loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/crystals/{{effect}} # set flag scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/craft_bottled_magicol.mcfunction ================================================ # @s = heated {{color}} magicol zauber cauldron with bottled {{color}} magicol recipe inside # at @s (center of block) # run from recipes/magicol/bottled/{{bottle}}/{{color}}/select_weather_modifier # templates/functions/magicol/craft_bottled_magicol.mcfunction # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # set flag scoreboard players set $recipe_success gm4_zc_data 1 # cancel execution via return and spawn vexes, unless it is a clear night and the correct moon phase execute unless function gm4_zauber_cauldrons:cauldron/liquid/magicol/check_moon_phase run return run function gm4_zauber_cauldrons:recipes/magicol/bottled/wrong_moon_phase # summon item loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/bottled_magicol/{{bottle}}/{{color}}/{{weather_modifier}} # grant advancement advancement grant @a[distance=..8,gamemode=!spectator] only gm4:zauber_cauldrons_make_magicol ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/craft_liquid_magicol.mcfunction ================================================ # @s = heated water zauber cauldron with {{color}} magicol recipe inside # at @s (center of block) # run from recipes/magicol/select_color # templates/functions/magicol/craft_magicol.mcfunction # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon empty bottle summon minecraft:item ~ ~.2 ~ {Item:{id:"minecraft:glass_bottle",count:1}} # set cauldron liquid to magicol # set level execute if block ~ ~ ~ minecraft:water_cauldron[level=1] run scoreboard players set @s gm4_zc_liquid_level 1 execute if block ~ ~ ~ minecraft:water_cauldron[level=2] run scoreboard players set @s gm4_zc_liquid_level 2 execute if block ~ ~ ~ minecraft:water_cauldron[level=3] run scoreboard players set @s gm4_zc_liquid_level 3 # set liquid type data modify entity @s data.gm4_zauber_cauldrons.liquid set value {id:"magicol",magicol:{color:"{{color}}"}} data modify entity @s data.gm4_zauber_cauldrons.liquid.magicol.moon_phase set from storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"bottled_vex"}}}}].components."minecraft:custom_data".gm4_zauber_cauldrons.preferred_moon_phase # visuals summon minecraft:item_display ~ ~.0781 ~ {item:{id:"minecraft:{{color}}_concrete_powder",count:1,components:{"minecraft:custom_model_data":{strings:["gm4_zauber_cauldrons:block/liquid_magicol/{{color}}"]}}},item_display:"fixed",transformation:[1.984f,0f,0f,0f,0f,0f,0f,0f,0f,0f,1.984f,0f,0f,0f,0f,1f],Tags:["gm4_zc_liquid","gm4_zc_magicol","gm4_zc_{{color}}_magicol"]} # set flag scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/select_color.mcfunction ================================================ # @s = heated magicol zauber cauldron with bottled magicol recipe inside # at @s (center of block) # run from recipes/magicol/bottled/select_bottle # templates/functions/magicol/select_color.mcfunction # check which color of bottled magicol to craft # called functions are generated via beet from templates # generated with the help of bolt for color_data in ctx.meta['magicol_colors']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients liquid.magicol{color:color_data['color']} run function f"gm4_zauber_cauldrons:recipes/magicol/bottled/{{bottle}}/{color_data['color']}/select_weather_modifier" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/magicol/select_weather_modifier.mcfunction ================================================ # @s = heated magicol zauber cauldron with bottled magicol recipe inside # at @s (center of block) # run from recipes/magicol/bottled/select_bottle # templates/functions/magicol/select_weather_modifier.mcfunction # check which weather modifier to use # called functions are generated via beet from templates # generated with the help of bolt for modifier_data in ctx.meta['weather_modifiers']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:modifier_data['item_id']}}}}] run function f"gm4_zauber_cauldrons:recipes/magicol/bottled/{{bottle}}/{{color}}/{modifier_data['modifier']}" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/potions/craft_potion.mcfunction ================================================ # @s = heated water zauber cauldron with potion recipe inside # at @s (center of block) # run from recipes/potions/{{bottle}}/select_effect # templates/functions/potions/craft_potion.mcfunction # remove ingredients execute align xyz run kill @e[type=item,dx=0,dy=0,dz=0] # summon item loot spawn ~ ~.2 ~ loot gm4_zauber_cauldrons:items/potions/{{bottle}}/{{effect}} # visuals function gm4_zauber_cauldrons:recipes/potions/environmental_effects/{{effect}} # set flag scoreboard players set $recipe_success gm4_zc_data 1 ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/function/potions/select_effect.mcfunction ================================================ # @s = heated water zauber cauldron with potion recipe inside # at @s (center of block) # run from recipes/potions/{{bottle}}/check_liquid # templates/functions/potions/select_effect.mcfunction # check which potion type to craft # generated with the help of bolt for effect_data in ctx.meta['potion_effects']: execute unless score $recipe_success gm4_zc_data matches 1.. if data storage gm4_zauber_cauldrons:temp/cauldron/ingredients items[{count:1,components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"{{bottle_item_id}}"}},"minecraft:potion_contents":{potion:effect_data['base_potion_id']}}}] run function f"gm4_zauber_cauldrons:recipes/potions/{{bottle}}/{effect_data['effect']}" ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/item_modifier/zauber_armor.json ================================================ [ { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.zauber_cauldrons.zauber_armor.{{piece}}", "fallback": "{{translate_fallback}}" } }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/zauber_armor/{{flavor}}"]} } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:\"zauber_armor\",type:\"{{piece}}\"}}" }, { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:armor_toughness", "id": "gm4_zauber_cauldrons:armor_toughness_{{slot}}", "amount": 3, "operation": "add_value", "slot": "{{slot}}" }, { "attribute": "minecraft:armor", "id": "gm4_zauber_cauldrons:armor_{{slot}}", "amount": {{armor_value}}, "operation": "add_value", "slot": "{{slot}}" }, { "attribute": "{{flavor_attribute}}", "id": "gm4_zauber_cauldrons:armor_{{flavor}}_{{slot}}", "amount": {{flavor_amount}}, "operation": "{{flavor_operation}}", "slot": "{{slot}}" } ] }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "translate": "item.gm4.zauber_cauldrons.zauber_armor.magic", "fallback": "+%s%% Magic", "with": [ "25" ], "color": "blue", "italic": false } ] } ] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/bottled_magicol.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "{{bottle_item_id}}", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/bottled_magicol/{{weather_modifier}}"]}, "minecraft:potion_contents": { "custom_color": {{potion_color}} }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:\"bottled_magicol\",color:\"{{color}}\",weather_modifier:\"{{weather_modifier}}\",bottle:{multi_use:0b}}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.gm4.zauber_cauldrons.bottled_magicol.{{translate_name}}", "fallback": "{{translate_fallback}}", "italic": false } }, { "function": "minecraft:set_name", "entity": "this", "name": { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.bottled_magicol.{{translate_name}}", "fallback": "{{soulution_translate_fallback}}", "italic": false }, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_zauber_cauldrons:blueprint/item/multi_sip" }, "ops": [ { "source": "gm4_zauber_cauldrons.bottle", "target": "gm4_zauber_cauldrons.bottle", "op": "replace" } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/bottled_magicol_soulution/{{weather_modifier}}"]} }, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "nbt": "gm4_zauber_cauldrons.bottle.sips", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": "/", "color": "gray", "italic": false }, { "nbt": "gm4_zauber_cauldrons.bottle.size", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": " ", "color": "gray", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.lore.{{sips_translate_name}}", "fallback": "{{sips_translate_fallback}}", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_lore", "mode": "append", "lore": [ { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.bottled_magicol.tint.{{color}}", "fallback": "{{color_translate_fallback}}", "color": "blue", "italic": false } ] } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_armor.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:golden_{{piece}}", "functions": [ { "function": "minecraft:reference", "name": "gm4_zauber_cauldrons:armor/{{piece}}/{{flavor}}" } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_crystal.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:poisonous_potato", "functions": [ { "function": "minecraft:set_components", "components": { "!minecraft:consumable": {}, "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/crystal/{{effect}}"]}, "minecraft:max_stack_size": 1, "minecraft:rarity": "uncommon", "minecraft:item_model": "minecraft:player_head", "minecraft:profile": "$crystal/{{effect}}" } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:\"crystal\",type:\"{{effect}}\"}}" }, { "function": "minecraft:set_name", "target": "item_name", "name": { "translate": "item.gm4.zauber_cauldrons.crystal.{{effect}}", "fallback": "{{translate_fallback}}" } }, { "function": "minecraft:set_lore", "mode": "append", "lore": {{lore}} } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/loot_table/zauber_potion.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "{{bottle_item_id}}", "functions": [ { "function": "minecraft:set_components", "components": { "minecraft:potion_contents": { "custom_color": {{custom_potion_color}}, "custom_effects": {{custom_potion_effects}} }, "minecraft:tooltip_display": { "hidden_components": [ "minecraft:potion_contents" ] } } }, { "function": "minecraft:set_custom_data", "tag": "{gm4_zauber_cauldrons:{item:\"potion\",type:\"{{effect}}\",bottle:{multi_use:0b}}}" }, { "function": "minecraft:set_name", "name": { "translate": "item.minecraft.potion.effect.{{effect_translate_name}}", "italic": false } }, { "function": "minecraft:set_name", "entity": "this", "name": { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.{{bottle}}.{{effect_translate_name}}", "fallback": "{{soulution_translate_fallback}}", "italic": false }, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:copy_custom_data", "source": { "type": "minecraft:storage", "source": "gm4_zauber_cauldrons:blueprint/item/multi_sip" }, "ops": [ { "source": "gm4_zauber_cauldrons.bottle", "target": "gm4_zauber_cauldrons.bottle", "op": "replace" } ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_components", "components": { "minecraft:custom_model_data": {"strings":["gm4_zauber_cauldrons:item/soulution_potion/{{effect}}"]} }, "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_lore", "mode": "append", "entity": "this", "lore": [ [ { "nbt": "gm4_zauber_cauldrons.bottle.sips", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": "/", "color": "gray", "italic": false }, { "nbt": "gm4_zauber_cauldrons.bottle.size", "storage": "gm4_zauber_cauldrons:blueprint/item/multi_sip", "plain": true, "color": "gray", "italic": false }, { "text": " ", "color": "gray", "italic": false }, { "translate": "item.gm4.zauber_cauldrons.multi_use_bottle.lore.{{sips_translate_name}}", "fallback": "{{sips_translate_fallback}}", "color": "gray", "italic": false } ] ], "conditions": [ { "condition": "minecraft:value_check", "value": { "type": "minecraft:score", "target": { "type": "minecraft:fixed", "name": "$has_soul_fire_heatsource" }, "score": "gm4_zc_data" }, "range": 1 } ] }, { "function": "minecraft:set_lore", "mode": "append", "lore": {{lore}} } ] } ] } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/biome/verzauberte_plains.json ================================================ { "temperature": {{temperature}}, "downfall": 0.8, "has_precipitation": {{has_precipitation}}, "attributes": { "minecraft:visual/sky_color": {{sky_color}}, "minecraft:visual/fog_color": {{fog_color}}, "minecraft:visual/water_fog_color": {{water_fog_color}}, "minecraft:audio/ambient_sounds": { "mood": { "sound": "minecraft:ambient.cave", "tick_delay": 6000, "block_search_extent": 8, "offset": 2 } }, "minecraft:audio/background_music": { "default": { "sound": "minecraft:music.overworld.forest", "min_delay": 12000, "max_delay": 24000, "replace_current_music": false } } }, "effects": { "water_color": {{water_color}}, "grass_color": {{grass_color}}, "foliage_color": {{foliage_color}}, {{biome_particle}} }, "spawners": {}, "spawn_costs": {}, "carvers": [], "features": [ [ "gm4_zauber_cauldrons:{{flower}}_patch" ] ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/configured_feature/flower_patch.json ================================================ { "type": "minecraft:random_selector", "config": { "features": [], "default": { "feature": { "type": "minecraft:simple_block", "config": { "to_place": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:{{flower}}" } } } }, "placement": [ { "type": "minecraft:count", "count": 8 }, { "type": "minecraft:random_offset", "xz_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 5 }, "y_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 1 } }, { "type": "minecraft:block_predicate_filter", "predicate": { "type": "minecraft:matching_blocks", "blocks": "minecraft:air" } } ] } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/templates/worldgen/placed_feature/flower_patch.json ================================================ { "feature": "gm4_zauber_cauldrons:{{flower}}_patch", "placement": [ { "type": "minecraft:rarity_filter", "chance": 64 }, { "type": "minecraft:in_square" }, { "type": "minecraft:heightmap", "heightmap": "MOTION_BLOCKING" }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/test/rabbit_teleportation.mcfunction ================================================ # @template gm4:test_platform # @dummy ~1 ~1 ~1 setblock ~ ~ ~1 netherrack setblock ~ ~1 ~1 fire setblock ~ ~2 ~1 water_cauldron[level=3] setblock ~2 ~ ~1 netherrack setblock ~2 ~1 ~1 fire setblock ~2 ~2 ~1 water_cauldron[level=3] give @s enchanted_book[stored_enchantments={protection:1}] execute at @s run tp @s ~ ~ ~ facing ~1 ~ ~ await delay 1s execute at @s run tp @s ~ ~ ~ facing ~-1 ~ ~ await delay 1s await entity @s[advancements={gm4:zauber_cauldrons_create=true}] setblock ~ ~2 ~1 cauldron setblock ~2 ~2 ~1 cauldron summon rabbit ~0.5 ~3 ~1.5 loot replace entity @s armor.feet loot gm4_zauber_cauldrons:items/armor/boots/speed_boost loot replace entity @s armor.legs loot gm4_zauber_cauldrons:items/armor/leggings/speed_boost loot replace entity @s armor.chest loot gm4_zauber_cauldrons:items/armor/chestplate/speed_boost loot replace entity @s armor.head loot gm4_zauber_cauldrons:items/armor/helmet/speed_boost await entity @s[advancements={gm4:zauber_cauldrons_rabbit=true}] execute positioned ~2.5 ~2.5 ~1.5 run assert entity @e[type=rabbit,dx=0] ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/worldgen/configured_feature/short_grass_patch.json ================================================ { "type": "minecraft:random_selector", "config": { "features": [], "default": { "feature": { "type": "minecraft:simple_block", "config": { "to_place": { "type": "minecraft:simple_state_provider", "state": { "Name": "minecraft:short_grass" } } } }, "placement": [ { "type": "minecraft:count", "count": 8 }, { "type": "minecraft:random_offset", "xz_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 5 }, "y_spread": { "type": "minecraft:uniform", "min_inclusive": 0, "max_inclusive": 1 } }, { "type": "minecraft:block_predicate_filter", "predicate": { "type": "minecraft:matching_blocks", "blocks": "minecraft:air" } } ] } } } ================================================ FILE: gm4_zauber_cauldrons/data/gm4_zauber_cauldrons/worldgen/placed_feature/short_grass_patch.json ================================================ { "feature": "gm4_zauber_cauldrons:short_grass_patch", "placement": [ { "type": "minecraft:rarity_filter", "chance": 64 }, { "type": "minecraft:in_square" }, { "type": "minecraft:heightmap", "heightmap": "MOTION_BLOCKING" }, { "type": "minecraft:biome" } ] } ================================================ FILE: gm4_zauber_cauldrons/generate.py ================================================ from typing import Dict, Any from pathlib import Path from itertools import product from gm4.utils import CSV, CSVCell import json import nbtlib # type: ignore from beet import Context, Model, subproject def read_json(path: Path) -> Any: """ Reads in a json file and returns a python object representing the json. """ with open(path, mode='r') as file: json_file = json.load(file) return json_file def beet_default(ctx: Context): # read raw data raw = Path('gm4_zauber_cauldrons', 'raw') armor_flavors: CSV = CSV.from_file(raw / 'armor_flavors.csv') armor_pieces: CSV = CSV.from_file(raw / 'armor_pieces.csv') crystal_effects: CSV = CSV.from_file(raw / 'crystal_effects.csv') crystal_lores: Any = read_json(raw / 'crystal_lores.json') flower_types: CSV = CSV.from_file(raw / 'flower_types.csv') magicol_colors: CSV = CSV.from_file(raw / 'magicol_colors.csv') potion_bottles: CSV = CSV.from_file(raw / 'potion_bottles.csv') potion_effects: CSV = CSV.from_file(raw / 'potion_effects.csv') potion_bottles: CSV = CSV.from_file(raw / 'potion_bottles.csv') potion_lores: Any = read_json(raw / 'potion_lores.json') weather_modifiers: CSV = CSV.from_file(raw / 'weather_modifiers.csv') # generate files generate_armor_recipes(ctx, armor_flavors, armor_pieces) generate_crystal_recipes(ctx, crystal_effects, crystal_lores, potion_effects) generate_potion_recipes(ctx, potion_effects, potion_bottles, potion_lores) generate_magicol_recipes(ctx, weather_modifiers, magicol_colors, potion_bottles) generate_zauber_biomes(ctx, weather_modifiers, magicol_colors, potion_bottles, flower_types) generate_flower_features(ctx, flower_types) # make some csv data available to bolt later ctx.meta['armor_flavors'] = armor_flavors ctx.meta['armor_pieces'] = armor_pieces ctx.meta['crystal_effects'] = crystal_effects ctx.meta['flower_types'] = flower_types ctx.meta['magicol_colors'] = magicol_colors ctx.meta['potion_bottles'] = potion_bottles ctx.meta['potion_effects'] = potion_effects ctx.meta['potion_bottles'] = potion_bottles ctx.meta['weather_modifiers'] = weather_modifiers def generate_armor_recipes(ctx: Context, armor_flavors: CSV, armor_pieces: CSV): """ Generates the function tree and loot tables for all combinations of zauber armor. """ # create a loot tables and functions for each zauber armor piece + flavor combination for flavor_data in armor_flavors: armor_items: list[str] = [] armor_models: dict[str, str] = {} for piece_data in armor_pieces: armor_items.append(item:=f"golden_{piece_data['piece']}") armor_models.update({item: (tex_model:=f"item/zauber_armor/{flavor_data['flavor']}/{piece_data['piece']}")}) subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/function/recipes/armor/{piece_data['piece']}/select_flavor.mcfunction": "data/gm4_zauber_cauldrons/templates/function/armor/select_flavor.mcfunction", f"data/gm4_zauber_cauldrons/function/recipes/armor/{piece_data['piece']}/{flavor_data['flavor']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/armor/craft_piece.mcfunction", f"data/gm4_zauber_cauldrons/item_modifier/armor/{piece_data['piece']}/{flavor_data['flavor']}.json": "data/gm4_zauber_cauldrons/templates/item_modifier/zauber_armor.json", f"data/gm4_zauber_cauldrons/loot_table/items/armor/{piece_data['piece']}/{flavor_data['flavor']}.json": "data/gm4_zauber_cauldrons/templates/loot_table/zauber_armor.json" } ], "render": { "function": "*", "item_modifier": "*", "loot_table": "*" } }, "meta": { "armor_value": piece_data['armor'], "flavor": flavor_data['flavor'], "flavor_amount": flavor_data['amount'], "flavor_attribute": flavor_data['attribute'], "flavor_operation": flavor_data['operation'], "piece": piece_data['piece'], "slot": piece_data['slot'], "translate_fallback": piece_data['translate_fallback'] } } ctx.require(subproject(subproject_config)) ctx.generate(tex_model, Model({ "parent": "minecraft:item/generated", "textures": { "layer0": f"gm4_zauber_cauldrons:{tex_model}" } })) ctx.meta["gm4"].setdefault("model_data", []).append({ "item": armor_items, "reference": f"item/zauber_armor/{flavor_data['flavor']}", "model": armor_models, "template": "custom", }) def generate_crystal_recipes(ctx: Context, crystal_effects: CSV, crystal_lores: Dict[str, Any], potion_effects: CSV): """ Generates the function tree and loot tables for zauber crystals. """ for effect_data in crystal_effects: subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/function/recipes/crystals/effects/{effect_data['effect']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/crystals/craft_crystal.mcfunction", f"data/gm4_zauber_cauldrons/loot_table/items/crystals/{effect_data['effect']}.json": "data/gm4_zauber_cauldrons/templates/loot_table/zauber_crystal.json" } ], "render": { "function": "*", "loot_table": "*" } }, "meta": { "effect": effect_data['effect'], "custom_potion_color": potion_effects.find_row(value=effect_data['effect'], by_column='effect')['custom_potion_color'].to_color_code(CSVCell.DEC), "translate_fallback": effect_data['translate_fallback'], "lore": json.dumps(crystal_lores[effect_data['effect']]) } } ctx.require(subproject(subproject_config)) def generate_potion_recipes(ctx: Context, potion_effects: CSV, potion_bottles: CSV, potion_lores: Dict[str, Any]): """ Generates the function tree and loot tables for zauber potions and soulutions. """ for effect_data in potion_effects: for bottle_data in potion_bottles: subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/function/recipes/potions/{bottle_data['bottle']}/select_effect.mcfunction": "data/gm4_zauber_cauldrons/templates/function/potions/select_effect.mcfunction", f"data/gm4_zauber_cauldrons/function/recipes/potions/{bottle_data['bottle']}/{effect_data['effect']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/potions/craft_potion.mcfunction", f"data/gm4_zauber_cauldrons/loot_table/items/potions/{bottle_data['bottle']}/{effect_data['effect']}.json": "data/gm4_zauber_cauldrons/templates/loot_table/zauber_potion.json" } ], "render": { "function": "*", "loot_table": "*" } }, "meta": { "effect": effect_data['effect'], "effect_translate_name": effect_data['effect_translate_name'], "custom_potion_color": effect_data['custom_potion_color'].to_color_code(CSVCell.DEC), "custom_potion_effects": json.dumps(nbtlib.parse_nbt(effect_data['custom_potion_effects']).unpack(json=True)), # type: ignore "bottle_item_id": bottle_data['item_id'], "bottle": bottle_data['bottle'], "soulution_translate_fallback": bottle_data["soulution_translate_fallback_prefix"] + effect_data['soulution_translate_fallback'], "sips_translate_name": bottle_data['sips_translate_name'], "sips_translate_fallback": bottle_data['sips_translate_fallback'], "lore": json.dumps(potion_lores[effect_data['effect']]) } } ctx.require(subproject(subproject_config)) ctx.meta["gm4"]["model_data"].append({ "item": ["potion", "splash_potion", "lingering_potion"], "reference": f"item/soulution_potion/{effect_data['effect']}", "template": "vanilla" }) def generate_magicol_recipes(ctx: Context, weather_modifiers: CSV, magicol_colors: CSV, potion_bottles: CSV): """ Generates the function tree for crafting th magicol liquid. """ for bottle_data, color_data, modifier_data in product(potion_bottles, magicol_colors, weather_modifiers): subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/function/recipes/magicol/{color_data['color']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/magicol/craft_liquid_magicol.mcfunction", f"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/select_color.mcfunction": "data/gm4_zauber_cauldrons/templates/function/magicol/select_color.mcfunction", f"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/{color_data['color']}/select_weather_modifier.mcfunction": "data/gm4_zauber_cauldrons/templates/function/magicol/select_weather_modifier.mcfunction", f"data/gm4_zauber_cauldrons/function/recipes/magicol/bottled/{bottle_data['bottle']}/{color_data['color']}/{modifier_data['modifier']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/magicol/craft_bottled_magicol.mcfunction", f"data/gm4_zauber_cauldrons/loot_table/items/bottled_magicol/{bottle_data['bottle']}/{color_data['color']}/{modifier_data['modifier']}.json": "data/gm4_zauber_cauldrons/templates/loot_table/bottled_magicol.json" } ], "render": { "function": "*", "loot_table": "*" } }, "meta": { "color": color_data['color'], "potion_color": color_data['potion_color'].to_color_code(CSVCell.DEC), "bottle": bottle_data['bottle'], "bottle_item_id": bottle_data['item_id'], "weather_modifier": modifier_data['modifier'], "sips_translate_name": bottle_data['sips_translate_name'], "sips_translate_fallback": bottle_data['sips_translate_fallback'], "translate_name": modifier_data['translate_name'], "translate_fallback": modifier_data['translate_fallback'], "color_translate_name": color_data['color_translate_name'], "color_translate_fallback": color_data['color_translate_fallback'], "soulution_translate_fallback": modifier_data['soulution_translate_fallback'] } } ctx.require(subproject(subproject_config)) for color_data in magicol_colors: ctx.meta["gm4"]["model_data"].append({ "item": f"{color_data['color']}_concrete_powder", "reference": f"block/liquid_magicol/{color_data['color']}", "template": "vanilla" }) def generate_zauber_biomes(ctx: Context, weather_modifiers: CSV, magicol_colors: CSV, potion_bottles: CSV, flower_types: CSV): """ Generates biome files for verzauberte plains biomes. """ for bottle_data, color_data, modifier_data in product(potion_bottles, magicol_colors, weather_modifiers): # skip drinkable if bottle_data['bottle'] == 'drinkable': continue # prepare biome particle for splash & lingering adjective = '' biome_particle = '' if bottle_data['bottle'] == 'lingering': adjective = 'glittering_' # convert base-10 colors to rgb float colors biome_particle = '"particle":{"options":{"type":"minecraft:dust","color":' + color_data.get( f"particle_color_{modifier_data['modifier']}", 7979098).to_color_code(CSVCell.FLOAT) + ',"scale":2},"probability":0.002},' subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/function/bottled_magicol/{color_data['color']}/select_weather_modifier.mcfunction": "data/gm4_zauber_cauldrons/templates/function/bottled_magicol/select_weather_modifier.mcfunction", f"data/gm4_zauber_cauldrons/function/bottled_magicol/{color_data['color']}/{modifier_data['modifier']}.mcfunction": "data/gm4_zauber_cauldrons/templates/function/bottled_magicol/color_biome.mcfunction", f"data/gm4_zauber_cauldrons/worldgen/biome/{adjective}{modifier_data['modifier']}_{color_data['color']}_verzauberte_plains.json": "data/gm4_zauber_cauldrons/templates/worldgen/biome/verzauberte_plains.json" } ], "render": { "function": "*", "worldgen_biomes": "*" } }, "meta": { "color": color_data['color'], "potion_color": color_data['potion_color'].to_color_code(CSVCell.DEC), "weather_modifier": modifier_data['modifier'], "temperature": 0.0 if modifier_data['modifier'] == 'polar' else 0.7, "sky_color": color_data.get(f"sky_color_{modifier_data['modifier']}", 7972607).to_color_code(CSVCell.DEC), "has_precipitation": 'false' if modifier_data['modifier'] == 'arid' else 'true', "fog_color": color_data.get(f"fog_color_{modifier_data['modifier']}", 12638463).to_color_code(CSVCell.DEC), "water_color": color_data.get(f"water_color_{modifier_data['modifier']}", 4159204).to_color_code(CSVCell.DEC), "water_fog_color": color_data.get(f"water_fog_color_{modifier_data['modifier']}", 329011).to_color_code(CSVCell.DEC), "grass_color": color_data.get(f"grass_color_{modifier_data['modifier']}", 7979098).to_color_code(CSVCell.DEC), "foliage_color": color_data.get(f"foliage_color_{modifier_data['modifier']}", 5877296).to_color_code(CSVCell.DEC), "biome_particle": biome_particle, "flower": flower_types.find_row(color_data['flower'], 'flower').get('flower', 'short_grass') # only add flowers which are registered as zauber flowers } } ctx.require(subproject(subproject_config)) def generate_flower_features(ctx: Context, flower_types: CSV): """ Generates the worldgen features required for spawning lucky flowers with composter particles upon the use of magicol to convert a biome. """ for flower_data in flower_types: subproject_config = { "data_pack": { "load": [ { f"data/gm4_zauber_cauldrons/worldgen/configured_feature/{flower_data['flower']}_patch.json": "data/gm4_zauber_cauldrons/templates/worldgen/configured_feature/flower_patch.json", f"data/gm4_zauber_cauldrons/worldgen/placed_feature/{flower_data['flower']}_patch.json": "data/gm4_zauber_cauldrons/templates/worldgen/placed_feature/flower_patch.json" } ], "render": { "worldgen_configured_features": "*", "worldgen_placed_features": "*" } }, "meta": { "flower": flower_data['flower'] } } ctx.require(subproject(subproject_config)) ================================================ FILE: gm4_zauber_cauldrons/raw/armor_flavors.csv ================================================ flavor,ingredient_item_id,attribute,amount,operation armor_boost,minecraft:turtle_helmet,minecraft:armor,1,add_value attack_boost,minecraft:blaze_powder,minecraft:attack_damage,1,add_value health_boost,minecraft:glistering_melon_slice,minecraft:max_health,4,add_value speed_boost,minecraft:sugar,minecraft:movement_speed,0.12,add_multiplied_total ================================================ FILE: gm4_zauber_cauldrons/raw/armor_pieces.csv ================================================ piece,slot,armor,translate_fallback boots,feet,2,Zauber Boots chestplate,chest,7,Zauber Chestplate helmet,head,3,Zauber Helmet leggings,legs,5,Zauber Leggings ================================================ FILE: gm4_zauber_cauldrons/raw/crystal_effects.csv ================================================ effect,translate_fallback instant_damage,Crystal of Harming instant_health,Crystal of Healing jump_boost,Crystal of Leaping poison,Crystal of Poison regeneration,Crystal of Regeneration speed,Crystal of Swiftness strength,Crystal of Strength ================================================ FILE: gm4_zauber_cauldrons/raw/crystal_lores.json ================================================ { "instant_damage": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.instant_damage" }, { "translate": "potion.potency.1" } ], "color": "red", "italic": false } ], "instant_health": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.instant_health" }, { "translate": "potion.potency.1" } ], "color": "blue", "italic": false } ], [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.nausea" }, { "translate": "potion.potency.0" } ], "color": "red", "italic": false } ] ], "jump_boost": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.jump_boost" }, { "translate": "potion.potency.1" } ], "color": "blue", "italic": false } ] ], "poison": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.poison" }, { "translate": "potion.potency.1" } ], "color": "red", "italic": false } ] ], "regeneration": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.regeneration" }, { "translate": "potion.potency.1" } ], "color": "blue", "italic": false } ] ], "speed": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.speed" }, { "translate": "potion.potency.1" } ], "color": "blue", "italic": false } ], [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.weakness" }, { "translate": "potion.potency.0" } ], "color": "red", "italic": false } ], { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "attribute.modifier.plus.1", "with": [ "40", { "translate": "attribute.name.movement_speed" } ], "color": "blue", "italic": false }, { "translate": "attribute.modifier.take.0", "with": [ "4", { "translate": "attribute.name.attack_damage" } ], "color": "red", "italic": false } ], "strength": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.strength" }, { "translate": "potion.potency.1" } ], "color": "blue", "italic": false } ], [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.fire_resistance" }, { "translate": "potion.potency.0" } ], "color": "blue", "italic": false } ], { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "attribute.modifier.plus.0", "with": [ "6", { "translate": "attribute.name.attack_damage" } ], "color": "blue", "italic": false } ] } ================================================ FILE: gm4_zauber_cauldrons/raw/flower_types.csv ================================================ flower,item_id dandelion,minecraft:dandelion poppy,minecraft:poppy blue_orchid,minecraft:blue_orchid allium,minecraft:allium azure_bluet,minecraft:azure_bluet red_tulip,minecraft:red_tulip orange_tulip,minecraft:orange_tulip white_tulip,minecraft:white_tulip pink_tulip,minecraft:pink_tulip oxeye_daisy,minecraft:oxeye_daisy cornflower,minecraft:cornflower lily_of_the_valley,minecraft:lily_of_the_valley ================================================ FILE: gm4_zauber_cauldrons/raw/magicol_colors.csv ================================================ color,ingredient_item_id,color_translate_name,color_translate_fallback,flower,potion_color,sky_color_polar,fog_color_polar,water_color_polar,water_fog_color_polar,grass_color_polar,foliage_color_polar,particle_color_polar,sky_color_temperate,fog_color_temperate,water_color_temperate,water_fog_color_temperate,grass_color_temperate,foliage_color_temperate,particle_color_temperate,sky_color_arid,fog_color_arid,water_color_arid,water_fog_color_arid,grass_color_arid,foliage_color_arid,particle_color_arid white,minecraft:white_dye,white,White Tint,short_grass,#DCE0E6,,,,,#BDC3D9,,#BDC3D9,,,,,#D2E2E2,,#D2E2E2,,,,,#FFFFFF,,#FFFFFF light_gray,minecraft:light_gray_dye,light_gray,Light Gray Tint,short_grass,#807975,,,,,#96937E,,#96937E,,,,,#B1A997,,#B1A997,,,,,#C7C4B5,,#C7C4B5 gray,minecraft:gray_dye,gray,Gray Tint,short_grass,#3F464D,,,,,#53585C,,#53585C,,,,,#5E696F,,#5E696F,,,,,#7C8588,,#7C8588 black,minecraft:black_dye,black,Black Tint,short_grass,#1F1B2E,,,,,#16151F,,#16151F,,,,,#292631,,#292631,,,,,#343138,,#343138 brown,minecraft:brown_dye,brown,Brown Tint,orange_tulip,#8C613F,,,,,#6F4425,,#6F4425,,,,,#985E31,,#985E31,,,,,#AC7A47,,#AC7A47 red,minecraft:red_dye,red,Red Tint,poppy,#A63232,,,,,#B02539,,#B02539,,,,,#CB3431,,#CB3431,,,,,#DE4E40,,#DE4E40 orange,minecraft:orange_dye,orange,Orange Tint,red_tulip,#D98341,,,,,#C65112,,#C65112,,,,,#E26C1F,,#E26C1F,,,,,#F49331,,#F49331 yellow,minecraft:yellow_dye,yellow,Yellow Tint,dandelion,#F5C149,,,,,#C49313,,#C49313,,,,,#F8A520,,#F8A520,,,,,#EDBC53,,#EDBC53 lime,minecraft:lime_dye,lime,Lime Tint,oxeye_daisy,#69B324,,,,,#5CAC1C,,#5CAC1C,,,,,#8BD02C,,#8BD02C,,,,,#B3E14E,,#B3E14E green,minecraft:green_dye,green,Green Tint,azure_bluet,#6B8040,,,,,#4C822F,,#4C822F,,,,,#5E9936,,#5E9936,,,,,#80AE4F,,#80AE4F cyan,minecraft:cyan_dye,cyan,Cyan Tint,blue_orchid,#36A2B3,,,,,#229967,,#229967,,,,,#35C780,,#35C780,,,,,#6DE591,,#6DE591 light_blue,minecraft:light_blue_dye,light_blue,Light Blue Tint,white_tulip,#369DD9,,,,,#43C8D1,,#43C8D1,,,,,#53EFD7,,#53EFD7,,,,,#84FFD3,,#84FFD3 blue,minecraft:blue_dye,blue,Blue Tint,cornflower,#474BB3,,,,,#3854AC,,#3854AC,,,,,#417FDE,,#417FDE,,,,,#5DA1E5,,#5DA1E5 purple,minecraft:purple_dye,purple,Purple Tint,allium,#762DB3,,,,,#6544B8,,#6544B8,,,,,#A15FEF,,#A15FEF,,,,,#CF80F8,,#CF80F8 magenta,minecraft:magenta_dye,magenta,Magenta Tint,pink_tulip,#BA45B2,,,,,#B73AAE,,#B73AAE,,,,,#F153CA,,#F153CA,,,,,#FE73E2,,#FE73E2 pink,minecraft:pink_dye,pink,Pink Tint,lily_of_the_valley,#E68AAB,,,,,#D66DA1,,#D66DA1,,,,,#FF8DCC,,#FF8DCC,,,,,#FEA6C2,,#FEA6C2 ================================================ FILE: gm4_zauber_cauldrons/raw/potion_bottles.csv ================================================ bottle,item_id,sips_translate_name,sips_translate_fallback,soulution_translate_fallback_prefix drinkable,minecraft:potion,sips,Sips, splash,minecraft:splash_potion,throws,Throws,"Splash " lingering,minecraft:lingering_potion,throws,Throws,"Lingering " ================================================ FILE: gm4_zauber_cauldrons/raw/potion_effects.csv ================================================ effect,base_potion_id,effect_translate_name,custom_potion_color,custom_potion_effects,soulution_translate_fallback instant_damage,minecraft:strong_harming,harming,#A9656A,"[{id:'minecraft:instant_damage',amplifier:3,duration:1}]",Soulution of Harming instant_health,minecraft:strong_healing,healing,#F82423,"[{id:'minecraft:instant_health',amplifier:3,duration:1},{id:'minecraft:nausea',amplifier:0,duration:160}]",Soulution of Healing jump_boost,minecraft:strong_leaping,leaping,#FDFF84,"[{id:'minecraft:jump_boost',amplifier:3,duration:1800}]",Soulution of Leaping poison,minecraft:strong_poison,poison,#87A363,"[{id:'minecraft:poison',amplifier:3,duration:640}]",Soulution of Poison regeneration,minecraft:strong_regeneration,regeneration,#CD5CAB,"[{id:'minecraft:regeneration',amplifier:3,duration:440},{id:'minecraft:speed',amplifier:1,duration:320}]",Soulution of Regeneration speed,minecraft:strong_swiftness,swiftness,#33EBFF,"[{id:'minecraft:speed',amplifier:3,duration:4000},{id:'minecraft:weakness',amplifier:2,duration:4000}]",Soulution of Swiftness strength,minecraft:strong_strength,strength,#FFC700,"[{id:'minecraft:strength',amplifier:3,duration:1800},{id:'fire_resistance',amplifier:0,duration:320}]",Soulution of Strength ================================================ FILE: gm4_zauber_cauldrons/raw/potion_lores.json ================================================ { "instant_damage": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.instant_damage" }, { "translate": "potion.potency.3" } ], "color": "red", "italic": false } ] ], "instant_health": [ [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.instant_health" }, { "translate": "potion.potency.3" } ], "color": "blue", "italic": false } ], [ { "translate": "potion.withDuration", "with": [ { "translate": "effect.minecraft.nausea" }, "0:08" ], "color": "red", "italic": false } ] ], "jump_boost": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.jump_boost" }, { "translate": "potion.potency.3" } ] }, "1:30" ], "color": "blue", "italic": false } ] ], "poison": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.poison" }, { "translate": "potion.potency.3" } ] }, "0:32" ], "color": "red", "italic": false } ] ], "regeneration": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.regeneration" }, { "translate": "potion.potency.3" } ] }, "0:22" ], "color": "blue", "italic": false } ], [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.speed" }, { "translate": "potion.potency.1" } ] }, "0:16" ], "color": "blue", "italic": false } ], { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "attribute.modifier.plus.1", "with": [ "40", { "translate": "attribute.name.movement_speed" } ], "color": "blue", "italic": false } ], "speed": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.speed" }, { "translate": "potion.potency.3" } ] }, "3:20" ], "color": "blue", "italic": false } ], [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.weakness" }, { "translate": "potion.potency.2" } ] }, "3:20" ], "color": "red", "italic": false } ], { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "attribute.modifier.plus.1", "with": [ "80", { "translate": "attribute.name.movement_speed" } ], "color": "blue", "italic": false }, { "translate": "attribute.modifier.take.0", "with": [ "12", { "translate": "attribute.name.attack_damage" } ], "color": "red", "italic": false } ], "strength": [ [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.strength" }, { "translate": "potion.potency.3" } ] }, "1:30" ], "color": "blue", "italic": false } ], [ { "translate": "potion.withDuration", "with": [ { "translate": "potion.withAmplifier", "with": [ { "translate": "effect.minecraft.fire_resistance" }, { "translate": "potion.potency.0" } ] }, "0:16" ], "color": "blue", "italic": false } ], { "text": "" }, { "translate": "potion.whenDrank", "color": "dark_purple", "italic": false }, { "translate": "attribute.modifier.plus.0", "with": [ "12", { "translate": "attribute.name.attack_damage" } ], "color": "blue", "italic": false } ] } ================================================ FILE: gm4_zauber_cauldrons/raw/weather_modifiers.csv ================================================ modifier,item_id,translate_name,translate_fallback,soulution_translate_fallback polar,minecraft:snowball,polar,Bottle of Polar Magicol,Soulution of Polar Magicol temperate,minecraft:slime_ball,temperate,Bottle of Temperate Magicol,Soulution of Temperate Magicol arid,minecraft:magma_cream,arid,Bottle of Arid Magicol,Soulution of Arid Magicol ================================================ FILE: gm4_zauber_liquids/README.md ================================================ # Zauber Liquids Allows Zauber Cauldron produced potions to be stored in Liquid Tanks! ### Features - Allows storage of extra strong Zauber potions in a tank - Allows the storage of Zauber's "Wormhole" liquid which teleports the player to a specific location created during its process. ================================================ FILE: gm4_zauber_liquids/assets/translations.csv ================================================ key,en_us container.gm4.zauber_tank.harming,Zauber Harming Potion Tank container.gm4.zauber_tank.healing,Zauber Healing Potion Tank container.gm4.zauber_tank.leaping,Zauber Leaping Potion Tank container.gm4.zauber_tank.poison,Zauber Poison Potion Tank container.gm4.zauber_tank.regeneration,Zauber Regeneration Potion Tank container.gm4.zauber_tank.strength,Zauber Strength Potion Tank container.gm4.zauber_tank.swiftness,Zauber Swiftness Potion Tank container.gm4.zauber_tank.wormhole,Wormhole Tank text.gm4.guidebook.module_desc.zauber_liquids,From cauldron-made potions to potion-filled tanks! Store your tier IV potions and wormholes in Liquid Tanks! text.gm4.guidebook.zauber_liquids.description,Zauber Potions can be stored in liquid tanks. Soulutions can be taken out by placing soul fire under the liquid tank.\n\nMobs under a zauber potion tank will gain the specific potion effect. text.gm4.guidebook.zauber_liquids.wormhole_tanks,"If any mobs walks under a wormhole tank it will teleport to that location.\n\nWhen a tank receives a wormhole, it will update its location to the midpoint of its current location and the new location, keeping the dimension of the original location." ================================================ FILE: gm4_zauber_liquids/beet.yaml ================================================ id: gm4_zauber_liquids name: Zauber Liquids version: 1.9.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: minecraft: [] versioning: required: gm4_liquid_tanks: 2.7.0 gm4_zauber_cauldrons: 1.13.0 website: description: From cauldron-made potions to potion-filled tanks! Store your tier IV potions and wormholes in Liquid Tanks! recommended: [] notes: [] video: https://www.youtube.com/watch?v=qa9lcbii1BE wiki: https://wiki.gm4.co/wiki/Liquid_Tanks/Zauber_Liquids credits: Creators: - SpecialBuilder32 - Bloo Updated by: - JP12 Textures by: - Vilder50 - Hozz Icon Design: - Sparks ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/item_drain.json ================================================ { "values":[ "gm4_zauber_liquids:item_drain" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/item_fill.json ================================================ { "values":[ "gm4_zauber_liquids:item_fill" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/relocate/restore_liquid.json ================================================ { "values": [ "gm4_zauber_liquids:relocate/restore_wormhole_scores" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/relocate/set_data.json ================================================ { "values": [ "gm4_zauber_liquids:relocate/store_wormhole_scores" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/remove_liquid_tags.json ================================================ { "values":[ "gm4_zauber_liquids:remove_liquid_tags" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/tank_init.json ================================================ { "values":[ "gm4_zauber_liquids:tank_init" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_liquid_tanks/tags/function/util_below.json ================================================ { "values":[ "gm4_zauber_liquids:util_below" ] } ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/init.mcfunction ================================================ scoreboard objectives add gm4_zl_warp_cx dummy "gm4_zauber_liquids_warp_cx" scoreboard objectives add gm4_zl_warp_cy dummy "gm4_zauber_liquids_warp_cy" scoreboard objectives add gm4_zl_warp_cz dummy "gm4_zauber_liquids_warp_cz" scoreboard objectives add gm4_zl_warp_cd dummy "gm4_zauber_liquids_warp_cd" scoreboard players set #2 gm4_lt_value 2 #declare storage gm4_zauber_liquids:temp/item/fill/zauber_wormhole execute unless score zauber_liquids gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Zauber Liquids"} execute unless score zauber_liquids gm4_earliest_version < zauber_liquids gm4_modules run scoreboard players operation zauber_liquids gm4_earliest_version = zauber_liquids gm4_modules scoreboard players set zauber_liquids gm4_modules 1 #$moduleUpdateList ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain/zauber_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_drain # @s = tank being processed execute store result score $item_value gm4_lt_value run data get storage gm4_liquid_tanks:temp/tank input_slot.components."minecraft:custom_data".gm4_zauber_cauldrons.bottle.sips 1 # if not a soulution, sips path won't exist, so set value to 1 from 0 execute if score $item_value gm4_lt_value matches 0 run scoreboard players set $item_value gm4_lt_value 1 data merge storage gm4_liquid_tanks:temp/tank {output:{id:"glass_bottle"}} function gm4_liquid_tanks:smart_item_drain tag @s add gm4_lt_drain ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain/zauber_wormhole_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_drain # @s = tank being processed # Non-Weighted Averages: (oldcoord+newcoord)/2 execute store result score $math gm4_zl_warp_cx run data get storage gm4_liquid_tanks:temp/tank input_slot.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos.x execute store result score $math gm4_zl_warp_cy run data get storage gm4_liquid_tanks:temp/tank input_slot.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos.y execute store result score $math gm4_zl_warp_cz run data get storage gm4_liquid_tanks:temp/tank input_slot.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos.z execute store result score $math gm4_zl_warp_cd run data get storage gm4_liquid_tanks:temp/tank input_slot.components."minecraft:custom_data".gm4_zauber_cauldrons.cauldron_pos.dimension # Double score for first one so the initail input is just the actual position execute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cx += $math gm4_zl_warp_cx execute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cy += $math gm4_zl_warp_cy execute if score @s gm4_lt_value matches 0 run scoreboard players operation $math gm4_zl_warp_cz += $math gm4_zl_warp_cz # x math scoreboard players operation @s gm4_zl_warp_cx += $math gm4_zl_warp_cx scoreboard players operation @s gm4_zl_warp_cx /= #2 gm4_lt_value # # y math scoreboard players operation @s gm4_zl_warp_cy += $math gm4_zl_warp_cy scoreboard players operation @s gm4_zl_warp_cy /= #2 gm4_lt_value # # z math scoreboard players operation @s gm4_zl_warp_cz += $math gm4_zl_warp_cz scoreboard players operation @s gm4_zl_warp_cz /= #2 gm4_lt_value # set dimension if first wormhole execute if score @s gm4_lt_value matches 0 run scoreboard players operation @s gm4_zl_warp_cd = $math gm4_zl_warp_cd function gm4_zauber_liquids:item_drain/zauber_potion ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_drain.mcfunction ================================================ # Called by Liquid Tank's item_drain.json function tag # new smart interface handles the logic for whether there is enough space in the tank interrupts if not enough execute if entity @s[tag=gm4_lt_zauber_harming_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"instant_damage"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_healing_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"instant_health"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_leaping_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"jump_boost"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_poison_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"poison"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_regeneration_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"regeneration"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_strength_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"strength"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_swiftness_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"speed"}}}}} run function gm4_zauber_liquids:item_drain/zauber_potion execute if entity @s[tag=gm4_lt_zauber_wormhole_potion] if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"wormhole_bottle"}}}}} run function gm4_zauber_liquids:item_drain/zauber_wormhole_potion ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_harming_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/instant_damage data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_healing_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/instant_health data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_leaping_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/jump_boost data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_poison_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/poison data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_regeneration_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/regeneration data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_strength_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/strength data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_swiftness_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/potions/drinkable/speed data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill/zauber_wormhole_potion.mcfunction ================================================ # run from gm4_zauber_liquids:item_fill # @s = tank being processed # copy coords to storage for wormhole execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.x int 1 run scoreboard players get @s gm4_zl_warp_cx execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.y int 1 run scoreboard players get @s gm4_zl_warp_cy execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.z int 1 run scoreboard players get @s gm4_zl_warp_cz execute store result storage gm4_zauber_cauldrons:blueprint/item/wormhole gm4_zauber_cauldrons.cauldron_pos.dimension int 1 run scoreboard players get @s gm4_zl_warp_cd # $item_value set in item_fill function for efficiency loot replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand loot gm4_zauber_cauldrons:items/wormhole data modify storage gm4_liquid_tanks:temp/tank output set from entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] HandItems[0] item replace entity @e[type=armor_stand,tag=gm4_liquid_tank_stand,limit=1,sort=nearest,distance=..1] weapon.mainhand with air function gm4_liquid_tanks:smart_item_fill tag @s add gm4_lt_fill ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/item_fill.mcfunction ================================================ #@s = liquid tank with item in first slot #run from liquid_tanks:item_process # new smart interface handles the logic for whether there is enough liquid to fill the bottle and interrupts if not enough #all potions have the same liquid-amount rules, so we'll process here execute store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ soul_fire execute unless score $has_soul_fire_heatsource gm4_zc_data matches 1 store success score $has_soul_fire_heatsource gm4_zc_data if block ~ ~-1 ~ soul_campfire[lit=true] execute unless score $has_soul_fire_heatsource gm4_zc_data matches 1 run scoreboard players set $item_value gm4_lt_value -1 execute if score $has_soul_fire_heatsource gm4_zc_data matches 1 run scoreboard players set $item_value gm4_lt_value -9 execute if score $has_soul_fire_heatsource gm4_zc_data matches 1 if score @s gm4_lt_value matches ..8 run scoreboard players operation $item_value gm4_lt_value = @s gm4_lt_value scoreboard players set #-1 gm4_lt_value -1 execute if score $item_value gm4_lt_value matches 1.. run scoreboard players operation $item_value gm4_lt_value *= #-1 gm4_lt_value execute store result storage gm4_zauber_cauldrons:blueprint/item/multi_sip gm4_zauber_cauldrons.bottle.sips int -1.0 run scoreboard players get $item_value gm4_lt_value #harming execute if entity @s[tag=gm4_lt_zauber_harming_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_harming_potion #healing execute if entity @s[tag=gm4_lt_zauber_healing_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_healing_potion #leaping execute if entity @s[tag=gm4_lt_zauber_leaping_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_leaping_potion #poison execute if entity @s[tag=gm4_lt_zauber_poison_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_poison_potion #regeneration execute if entity @s[tag=gm4_lt_zauber_regeneration_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_regeneration_potion #speed execute if entity @s[tag=gm4_lt_zauber_swiftness_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_swiftness_potion #strength execute if entity @s[tag=gm4_lt_zauber_strength_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_strength_potion #wormhole execute if entity @s[tag=gm4_lt_zauber_wormhole_potion] if score $stack_size gm4_lt_value matches 1 if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:glass_bottle"}} run function gm4_zauber_liquids:item_fill/zauber_wormhole_potion data modify storage gm4_zauber_cauldrons gm4_zauber_cauldrons.bottle.sips set value 9 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/harming.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.harming","fallback":"Zauber Harming Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.harming","fallback":"Zauber Harming Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/harming"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_harming_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_harming_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/healing.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.healing","fallback":"Zauber Healing Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.healing","fallback":"Zauber Healing Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/healing"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_healing_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_healing_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/leaping.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.leaping","fallback":"Zauber Leaping Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.leaping","fallback":"Zauber Leaping Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/leaping"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_leaping_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_leaping_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/poison.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.poison","fallback":"Zauber Poison Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.poison","fallback":"Zauber Poison Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/poison"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_poison_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_poison_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/regeneration.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.regeneration","fallback":"Zauber Regeneration Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.regeneration","fallback":"Zauber Regeneration Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/regeneration"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_regeneration_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_regeneration_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/strength.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.strength","fallback":"Zauber Strength Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.strength","fallback":"Zauber Strength Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/strength"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_strength_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_strength_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/swiftness.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.swiftness","fallback":"Zauber Swiftness Potion Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.swiftness","fallback":"Zauber Swiftness Potion Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_potion_liquids:liquids/swiftness"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_swiftness_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_swiftness_potion tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/liquid_init/wormhole.mcfunction ================================================ data merge block ~ ~ ~ {CustomName:'{"translate":"gm4.second","fallback":"%1$s","with":[{"translate":"container.gm4.zauber_tank.wormhole","fallback":"Wormhole Tank"},[{"translate":"gui.gm4.liquid_tank","fallback":"","font":"gm4:container_gui","color":"white"},{"translate":"container.gm4.zauber_tank.wormhole","fallback":"Wormhole Tank","font":"gm4:default","color":"#404040"}]]}'} summon armor_stand ~ ~-.95 ~ {CustomName:'"gm4_liquid_tank_display"',Tags:["gm4_no_edit","gm4_liquid_tank_display","smithed.entity","smithed.strict"],NoGravity:1b,Marker:1b,Invisible:1b,Invulnerable:1b,Small:1b,Silent:1b,DisabledSlots:4144959,HasVisualFire:1b,ArmorItems:[{},{},{},{id:"player_head",count:1,components:{"minecraft:profile":"$gm4_zauber_liquids:liquids/wormhole"}}]} data modify entity @s data.gm4_liquid_tanks.liquid_tag set value "gm4_lt_zauber_wormhole_potion" scoreboard players set @s gm4_lt_max 300 tag @s add gm4_lt_zauber_wormhole_potion tag @s add gm4_volatile_liquid tag @s remove gm4_lt_empty ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/relocate/restore_wormhole_scores.mcfunction ================================================ # restores the liquid from the tank # @s = marker for this liquid tank # located at the center of the liquid tank # run from #gm4_liquid_tanks:relocate/restore_liquid execute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cx run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cx execute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cy run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cy execute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cz run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cz execute store result score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_zl_warp_cd run data get storage gm4_relocators:temp gm4_relocation.entity_data.zl_warp_cd ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/relocate/store_wormhole_scores.mcfunction ================================================ # stores the scores of the wormhole tank # @s = "smithed.block" entity inside the block # located at the center of the block to be picked up # run from #gm4_liquid_tanks:relocate/set_data execute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cx int 1 run scoreboard players get @s gm4_zl_warp_cx execute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cy int 1 run scoreboard players get @s gm4_zl_warp_cy execute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cz int 1 run scoreboard players get @s gm4_zl_warp_cz execute store result storage gm4_relocators:temp merge_data.entity_data.zl_warp_cd int 1 run scoreboard players get @s gm4_zl_warp_cd ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/remove_liquid_tags.mcfunction ================================================ #@s = liquid tank stand # removes all liquid tags from the stand. Used for emptying tank and reassigning liquid type tag @s remove gm4_lt_zauber_harming_potion tag @s remove gm4_lt_zauber_healing_potion tag @s remove gm4_lt_zauber_leaping_potion tag @s remove gm4_lt_zauber_poison_potion tag @s remove gm4_lt_zauber_regeneration_potion tag @s remove gm4_lt_zauber_swiftness_potion tag @s remove gm4_lt_zauber_strength_potion tag @s remove gm4_lt_zauber_wormhole_potion scoreboard players reset @s gm4_zl_warp_cx scoreboard players reset @s gm4_zl_warp_cy scoreboard players reset @s gm4_zl_warp_cz scoreboard players reset @s gm4_zl_warp_cd ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/tank_init.mcfunction ================================================ #@s = empty liquid tank with item in first slot or entity on top #run from liquid_tanks:item_process #zauber leaping execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"jump_boost"}}}}} run function gm4_zauber_liquids:liquid_init/leaping #zauber speed execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"speed"}}}}} run function gm4_zauber_liquids:liquid_init/swiftness #zauber healing execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"instant_health"}}}}} run function gm4_zauber_liquids:liquid_init/healing #zauber harming execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"instant_damage"}}}}} run function gm4_zauber_liquids:liquid_init/harming #zauber poison execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"poison"}}}}} run function gm4_zauber_liquids:liquid_init/poison #zauber regeneration execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"regeneration"}}}}} run function gm4_zauber_liquids:liquid_init/regeneration #zauber strength execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"potion",type:"strength"}}}}} run function gm4_zauber_liquids:liquid_init/strength #zauber wormhole execute if data storage gm4_liquid_tanks:temp/tank {input_slot:{id:"minecraft:potion",components:{"minecraft:custom_data":{gm4_zauber_cauldrons:{item:"wormhole_bottle"}}}}} run function gm4_zauber_liquids:liquid_init/wormhole ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/harming.mcfunction ================================================ #@s = living-base entity below zauber harming potion tank #run from zauber_liquids:util_below effect give @s instant_damage 1 3 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/healing.mcfunction ================================================ #@s = living-base entity below zauber healing potion tank #run from zauber_liquids:util_below effect give @s instant_health 1 3 effect give @s nausea 8 0 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/leaping.mcfunction ================================================ #@s = living-base entity below zauber leaping potion tank #run from zauber_liquids:util_below effect give @s jump_boost 90 3 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/poison.mcfunction ================================================ #@s = living-base entity below zauber poison potion tank #run from zauber_liquids:util_below effect give @s poison 32 3 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/regeneration.mcfunction ================================================ #@s = living-base entity below zauber regeneration potion tank #run from zauber_liquids:util_below effect give @s regeneration 22 3 effect give @s speed 16 2 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/strength.mcfunction ================================================ #@s = living-base entity below zauber strength potion tank #run from zauber_liquids:util_below effect give @s strength 90 3 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/swiftness.mcfunction ================================================ #@s = living-base entity below zauber speed potion tank #run from zauber_liquids:util_below effect give @s speed 200 3 effect give @s weakness 360 3 scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util/wormhole.mcfunction ================================================ #@s = living-base entity below wormhole potion tank #run from zauber_liquids:util_below # To work with non-player mobs, both versions require a change to @e from @a on line 14 of wormhole_targeting/set_dimension.mcfunction # Set coords scoreboard players operation $wormhole_x gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cx scoreboard players operation $wormhole_y gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cy scoreboard players operation $wormhole_z gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cz scoreboard players operation $wormhole_d gm4_zc_data = @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_zl_warp_cd scoreboard players set $read_coordinates gm4_zc_data 1 execute at @s run function gm4_zauber_cauldrons:player/wormhole_targeting/prepare_teleport scoreboard players remove @e[type=marker,tag=gm4_liquid_tank,tag=gm4_processing_tank] gm4_lt_value 1 playsound entity.player.swim block @a[distance=..8] ~ ~ ~ .5 1.5 ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/function/util_below.mcfunction ================================================ #@s = tank with entity above it positioned ~ ~-1 ~ #run from liquid_tanks:process via #gm4_liquid_tanks:util_below tag @s add gm4_processing_tank #harming execute if score @s[tag=gm4_lt_zauber_harming_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] run function gm4_zauber_liquids:util/harming #healing execute if score @s[tag=gm4_lt_zauber_healing_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] run function gm4_zauber_liquids:util/healing #leaping execute if score @s[tag=gm4_lt_zauber_leaping_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:jump_boost'}]}] run function gm4_zauber_liquids:util/leaping #poison execute if score @s[tag=gm4_lt_zauber_poison_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:poison'}]}] run function gm4_zauber_liquids:util/poison #regeneration execute if score @s[tag=gm4_lt_zauber_regeneration_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:regeneration'}]}] run function gm4_zauber_liquids:util/regeneration #speed execute if score @s[tag=gm4_lt_zauber_swiftness_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:speed'}]}] run function gm4_zauber_liquids:util/swiftness #strength execute if score @s[tag=gm4_lt_zauber_strength_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[nbt=!{active_effects:[{id:'minecraft:strength'}]}] run function gm4_zauber_liquids:util/strength #wormhole execute if score @s[tag=gm4_lt_zauber_wormhole_potion] gm4_lt_value matches 1.. as @e[type=!#gm4:non_living,type=!armor_stand,tag=!smithed.strict,limit=1,dx=0] unless entity @s[gamemode=spectator] if entity @s[tag=!gm4_zl_wormhole_ignore] run function gm4_zauber_liquids:util/wormhole tag @s remove gm4_processing_tank ================================================ FILE: gm4_zauber_liquids/data/gm4_zauber_liquids/guidebook/zauber_liquids.json ================================================ { "id": "zauber_liquids", "name": "Zauber Liquids", "module_type": "expansion", "base_module": "liquid_tanks", "icon": { "id": "minecraft:potion", "components": { "minecraft:potion_contents": { "custom_color": 8587123 } } }, "criteria": { "obtain_zauber_potion_after_liquid_tank": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "predicates": { "minecraft:custom_data": "{gm4_zauber_cauldrons:{bottle:{}}}" } } ], "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "type_specific": { "type": "player", "advancements": { "gm4:liquid_tanks_create": true } } } } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_zauber_potion_after_liquid_tank" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.zauber_liquids.description", "fallback": "Zauber Potions can be stored in liquid tanks. Soulutions can be taken out by placing soul fire under the liquid tank.\n\nMobs under a zauber potion tank will gain the specific potion effect." } ], [ { "translate": "text.gm4.guidebook.zauber_liquids.wormhole_tanks", "fallback": "If any mobs walks under a wormhole tank it will teleport to that location.\n\nWhen a tank receives a wormhole, it will update its location to the midpoint of its current location and the new location, keeping the dimension of the original location." } ] ] } ] } ================================================ FILE: gm4_ziprails/README.md ================================================ # Ziprails Everyone loves building minecart rail systems, but giant mono-rails across your world can get to be an eyesore. With this simple data pack, enable your minecarts to hang from "ziprails" made of tripwire, much less intrusive than regular rail lines. ![Ziprails Example](images/ziprails_example.webp) ### Features - All minecart types can grab onto a "ziprail" by riding under the tripwire hook at one end. - Minecarts will travel down a ziprail until it reaches the other end, much like a gondola or cable-car - Adds a custom advancement for your first ride in the sky ================================================ FILE: gm4_ziprails/beet.yaml ================================================ id: gm4_ziprails name: Ziprails version: 1.7.X data_pack: load: . pipeline: - gm4.plugins.extend.module meta: gm4: versioning: schedule_loops: [tick] model_data: - item: minecart reference: gui/advancement/ziprails template: advancement website: description: Automatically latch on to a tripwire to sail through the sky on a suspended line! recommended: - gm4_vertical_rails notes: [] modrinth: project_id: EpgLRkLf smithed: pack_id: gm4_ziprails planetminecraft: uid: 4298467 video: https://www.youtube.com/watch?v=QA7a5q2kVcg wiki: https://wiki.gm4.co/wiki/Ziprails credits: Creators: - Sparks - SpecialBuilder32 - Bloo Icon Design: - DuckJr ================================================ FILE: gm4_ziprails/data/gm4/advancement/ziprails.json ================================================ { "display": { "icon": { "id": "minecraft:minecart", "components": { "minecraft:custom_model_data": {"strings":["gm4_ziprails:gui/advancement/ziprails"]} } }, "title": { "translate": "advancement.gm4.ziprails.title", "fallback": "Wheeeeeeeee" }, "description": { "translate": "advancement.gm4.ziprails.description", "fallback": "Fly through the sky on a ziprail.", "color": "gray" } }, "parent": "gm4:root", "criteria": { "ride_ziprail": { "trigger": "minecraft:location", "conditions": { "player": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": { "type": "minecraft:minecart", "nbt": "{Tags:[\"gm4_linked\"]}" } } } ] } } } } ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/check_cable.mcfunction ================================================ # checks to see if minecart is under a tripwire cable # @s = minecart # run from main execute if block ~ ~1 ~ #gm4_ziprails:cable[attached=true] run function gm4_ziprails:ziprail/zipping execute if entity @s[tag=gm4_linked] unless block ~ ~1 ~ #gm4_ziprails:cable run function gm4_ziprails:ziprail/clear_tags ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/init.mcfunction ================================================ execute unless score ziprails gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Ziprails"} execute unless score ziprails gm4_earliest_version < ziprails gm4_modules run scoreboard players operation ziprails gm4_earliest_version = ziprails gm4_modules scoreboard players set ziprails gm4_modules 1 schedule function gm4_ziprails:main 1t #$moduleUpdateList ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/main.mcfunction ================================================ execute as @e[type=#gm4:minecarts,tag=!smithed.entity] at @s run function gm4_ziprails:check_cable schedule function gm4_ziprails:main 2t ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/ziprail/clear_tags.mcfunction ================================================ # run from check_cable tag @s remove gm4_linked tag @s remove gm4_zipping_north tag @s remove gm4_zipping_east tag @s remove gm4_zipping_south tag @s remove gm4_zipping_west ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/ziprail/link.mcfunction ================================================ # docks minecarts under hooks to assign them a zipline movement direction # @s = minecarts that are under a hook # run from ziprail/zipping tag @s add gm4_linked # remove old facing directions tag @s remove gm4_zipping_north tag @s remove gm4_zipping_south tag @s remove gm4_zipping_east tag @s remove gm4_zipping_west # assign minecart movement direction based on the direction of the hook above them execute if block ~ ~1 ~ tripwire_hook[facing=north] run tag @s add gm4_zipping_north execute if block ~ ~1 ~ tripwire_hook[facing=south] run tag @s add gm4_zipping_south execute if block ~ ~1 ~ tripwire_hook[facing=east] run tag @s add gm4_zipping_east execute if block ~ ~1 ~ tripwire_hook[facing=west] run tag @s add gm4_zipping_west # sound effect playsound minecraft:entity.item_frame.place neutral @p[distance=..1,limit=1] ================================================ FILE: gm4_ziprails/data/gm4_ziprails/function/ziprail/zipping.mcfunction ================================================ # @s = minecarts that are under a hook or string # run from check_cable # link minecarts that are on a hook execute if entity @s[tag=!gm4_linked] if block ~ ~1 ~ tripwire_hook[attached=true] run function gm4_ziprails:ziprail/link # teleport carts to rail-trigger height execute if entity @s[tag=!gm4_taut_link,tag=gm4_linked] unless block ~ ~ ~ #minecraft:rails align y run teleport @s ~ ~.36250001192093 ~ execute if entity @s[tag=gm4_linked] unless block ~ ~ ~ #minecraft:rails run tag @s add gm4_taut_link execute if block ~ ~ ~ #minecraft:rails run tag @s remove gm4_taut_link execute if entity @s[tag=!gm4_taut_link] if block ~ ~1 ~ tripwire_hook[attached=true] run function gm4_ziprails:ziprail/link # move docked minecarts along their string data merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_north] {Motion:[0.0,0.06,-0.4]} data merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_south] {Motion:[0.0,0.06,0.4]} data merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_east] {Motion:[0.4,0.06,0.0]} data merge entity @s[tag=gm4_taut_link,tag=gm4_zipping_west] {Motion:[-0.4,0.06,0.0]} ================================================ FILE: gm4_ziprails/data/gm4_ziprails/guidebook/ziprails.json ================================================ { "id": "ziprails", "name": "Ziprails", "module_type": "module", "icon": { "id": "minecraft:minecart" }, "criteria": { "obtain_minecart": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:minecart" ] } ] } }, "obtain_string": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ "minecraft:string" ] } ] } } }, "sections": [ { "name": "description", "enable": [], "requirements": [ [ "obtain_minecart" ], [ "obtain_string" ] ], "pages": [ [ { "insert": "title" }, { "translate": "text.gm4.guidebook.ziprails.description", "fallback": "Tripwires act as ziprails for minecarts.\n\nA rail must be directly under an connected tripwire hook to transfer a minecart to a zipline." } ] ] } ] } ================================================ FILE: gm4_ziprails/data/gm4_ziprails/tags/block/cable.json ================================================ { "values": [ "minecraft:tripwire_hook", "minecraft:tripwire" ] } ================================================ FILE: gm4_ziprails/translations.csv ================================================ key,en_us advancement.gm4.ziprails.title,Wheeeeeeeee advancement.gm4.ziprails.description,Fly through the sky on a ziprail. text.gm4.guidebook.module_desc.ziprails,Automatically latch on to a tripwire to sail through the sky on a suspended line! text.gm4.guidebook.ziprails.description,Tripwires act as ziprails for minecarts.\n\nA rail must be directly under an connected tripwire hook to transfer a minecart to a zipline. ================================================ FILE: lib_brewing/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_brewing/README.md ================================================ # lib_brewing lib_brewing is a mcfunction library that allows other data packs to replace custom potions with splash and lingering potions when brewed in a brewing stand. This is used to prevent the `Uncraftable Splash Potion` and `Uncraftable Lingering Potion` items from being obtainable. ## Uses ### Splash and Lingering Conversions This library automatically catches splash and lingering potion conversions to allow data packs to properly replace those potions. This means whenever a potion is brewed into a splash potion using gunpowder, a set of functions will be run to replace the Uncraftable Splash Potion with a custom splash potion. Similarly, whenever a splash potion is brewed into a lingering potion using dragon's breath, a set of functions will be run to replace the Uncraftable Lingering Potion with a custom lingering potion. Each brewing stand has a marker to track these changes. When splash and lingering potions are created, each potion is checked by calling the `#gm4_brewing:insert/splash` or `#gm4_brewing:insert/lingering` function tags (once per potion, so if there are 3 potions in the brewing stand, that function tag gets called for each potion). The full item components for each potion is saved into the nbt of the marker in `data.gm4_brewing.insert.components.`. For example if the brewing stand has the nbt `{Items:[{Slot:0b,id:"minecraft:potion",count:1,components:{'minecraft:custom_data':{my_custom_potion:1b}}}]}`, the marker would have the nbt `{data:{gm4_brewing:{insert:{Slot:0b,id:"minecraft:potion",count:1,components:{'minecraft:custom_data':{my_custom_potion:1b}}}}}}` when it's checking the first potion. This is how you should check for your custom potions To utilize this function, two functions tags, two functions, and two loot tables should be created. Below are the files for splash potions, and can be copied for lingering potions by replacing all instances of `splash` with `lingering` 1. create a single loot table to check the potion type and drop the proper splash potion: loot table `MODULE_ID:technical/brewing_stand/splash` ```json { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "name": "LOOT TABLE PATH TO SPLASH POTION 1", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{INDICATION NBT FOR POTION 1}}}}}" } } ] }, { "type": "minecraft:loot_table", "name": "LOOT TABLE PATH TO SPLASH POTION 2", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{INDICATION NBT FOR POTION 2}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_custom_data", "tag": "{gm4_custom_potion:1b}" } ] } ] } ``` 2. Create a function to call the splash potion loot table when the library catches a splash potion conversion: function `MODULE_ID:brewing_stand/splash` ```mcfunction # @s = brewing stand marker with a custom potion to be converted to a splash potion # run from #gm4_brewing:insert/splash loot spawn ~ ~ ~ loot MODULE_ID:technical/brewing_stand/splash # uncomment this line to completely clear the potion VV # execute if<...> run scoreboard players set $insert gm4_brewing_data -1 ``` 3. Add your function to the library API call that runs when the library catches a splash potion conversion: function tag `#gm4_brewing:insert/splash` ```json { "values": [ "MODULE_ID:brewing_stand/splash" ] } ``` ### Changing Splash and Lingering Outcomes - In the two created functions (`/brewing_stand/splash.mcfunction` and `/brewing_stand/lingering.mcfunction`) additonal commands can be run before the `/loot` command to change the outcome of the loot tables. For example, if you want potions to turn into a water bottle if the brewing stand is surrounded by water, you could set a score and have the loot table check for that score. - Using the following command will clear the potion from the brewing stand (should typically be used with a check so only certain custom potions are deleted): ```mcfunction scoreboard players set $insert gm4_brewing_data -1 ``` ### Additional Brewing Functions Every time a brewing stand completes a brew, the function tag `#gm4_brewing:finish_brew` runs AFTER the default interactions of creating splash and lingering potions. This allows further checks and modifications to potions (but is still restricted to the vanilla hardcoded brewing rules; i.e. it doesn't allow using dirt as a brewing ingredient). The `Items` nbt of the brewing stand is saved 1 tick before the potions finish brewing (when `#gm4_brewing:finish_brew` is called), so the brewing ingredient and original potion data is available inside the marker nbt. To test for items in the brewing stand, use the entity data from the marker: ```mcfunction execute if entity @s[nbt={data:{gm4_brewing:{previous_items:[BLOCK_DATA]}}}] ``` For example, this is the code that checks if a splash potion should be created: ```mcfunction execute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:"minecraft:gunpowder"}]}}}] ... ``` ## License This library, and the contents of the `lib_brewing` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_brewing/beet.yaml ================================================ id: gm4_brewing name: Gamemode 4 Brewing version: 1.5.X description: Allows datapacks to replace custom potions with splash and lingering potions when brewed in a brewing stand. data_pack: load: data: data pipeline: - gm4.plugins.extend.library meta: gm4: versioning: schedule_loops: [main] smithed: pack_id: gm4_lib_brewing credits: Creator: - BPR ================================================ FILE: lib_brewing/data/gm4_brewing/advancement/place_brewing_stand.json ================================================ { "criteria": { "place_brewing_stand": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:block_state_property", "block": "minecraft:brewing_stand" } ] } } }, "rewards": { "function": "gm4_brewing:place_brewing_stand" } } ================================================ FILE: lib_brewing/data/gm4_brewing/function/check_brew.mcfunction ================================================ # @s = none # run from process scoreboard players set $brewed gm4_brewing_data 0 execute as @e[type=marker,tag=gm4_brewing_tick] at @s if block ~ ~ ~ brewing_stand{BrewTime:1s} run function gm4_brewing:prep_finish_brew execute if score $brewed gm4_brewing_data matches 0 run schedule function gm4_brewing:check_brew 1t ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/get_brewing_stand.mcfunction ================================================ # @s = brewing stand marker that just finished brewing # run from finish_brew execute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:"minecraft:gunpowder"}]}}}] run function gm4_brewing:finalize_potions/splash/check_items execute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:"minecraft:dragon_breath"}]}}}] run function gm4_brewing:finalize_potions/lingering/check_items function #gm4_brewing:finish_brew ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/check_items.mcfunction ================================================ # @s = brewing stand marker that finished brewing with dragon's breath # run from finalize_potions/get_brewing_stand # store data into storage data modify storage gm4_brewing:temp Items set from entity @s data.gm4_brewing.previous_items # check contents of block for splash potions execute if data storage gm4_brewing:temp Items[{Slot:0b,id:"minecraft:splash_potion"}] run function gm4_brewing:finalize_potions/lingering/slot_0 execute if data storage gm4_brewing:temp Items[{Slot:1b,id:"minecraft:splash_potion"}] run function gm4_brewing:finalize_potions/lingering/slot_1 execute if data storage gm4_brewing:temp Items[{Slot:2b,id:"minecraft:splash_potion"}] run function gm4_brewing:finalize_potions/lingering/slot_2 # clean up data remove storage gm4_brewing:temp Items tag @s remove gm4_brewing_finished ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_0.mcfunction ================================================ # @s = brewing stand marker with a splash potion in slot 0 # run from finalize_potions/lingering/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:0b}] # use loot table to create new item function #gm4_brewing:insert/lingering execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:0b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 0b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:0b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_1.mcfunction ================================================ # @s = brewing stand marker with a splash potion in slot 1 # run from finalize_potions/lingering/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:1b}] # use loot table to create new item function #gm4_brewing:insert/lingering execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:1b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 1b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:1b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/lingering/slot_2.mcfunction ================================================ # @s = brewing stand marker with a splash potion in slot 2 # run from finalize_potions/lingering/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:2b}] # use loot table to create new item function #gm4_brewing:insert/lingering execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:2b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 2b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:2b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/splash/check_items.mcfunction ================================================ # @s = brewing stand marker that finished brewing with gunpowder # run from finalize_potions/get_brewing_stand # store data into storage data modify storage gm4_brewing:temp Items set from entity @s data.gm4_brewing.previous_items # check contents of block for potions execute if data storage gm4_brewing:temp Items[{Slot:0b,id:"minecraft:potion"}] run function gm4_brewing:finalize_potions/splash/slot_0 execute if data storage gm4_brewing:temp Items[{Slot:1b,id:"minecraft:potion"}] run function gm4_brewing:finalize_potions/splash/slot_1 execute if data storage gm4_brewing:temp Items[{Slot:2b,id:"minecraft:potion"}] run function gm4_brewing:finalize_potions/splash/slot_2 # clean up data remove storage gm4_brewing:temp Items tag @s remove gm4_brewing_finished ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_0.mcfunction ================================================ # @s = brewing stand marker with a potion in slot 0 # run from finalize_potions/splash/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:0b}] # use loot table to create new item function #gm4_brewing:insert/splash execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:0b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 0b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:0b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_1.mcfunction ================================================ # @s = brewing stand marker with a potion in slot 1 # run from finalize_potions/splash/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:1b}] # use loot table to create new item function #gm4_brewing:insert/splash execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:1b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 1b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:1b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finalize_potions/splash/slot_2.mcfunction ================================================ # @s = brewing stand marker with a potion in slot 2 # run from finalize_potions/splash/check_items data modify entity @s data.gm4_brewing.insert set from storage gm4_brewing:temp Items[{Slot:2b}] # use loot table to create new item function #gm4_brewing:insert/splash execute if score $insert gm4_brewing_data matches -1 run data remove block ~ ~ ~ Items[{Slot:2b}] execute store success score $insert gm4_brewing_data run data modify storage gm4_brewing:temp insert set from entity @e[type=item,predicate=gm4_brewing:is_custom_potion,limit=1] Item # insert item data remove storage gm4_brewing:temp insert.components."minecraft:custom_data".gm4_custom_potion data modify storage gm4_brewing:temp insert.Slot set value 2b execute if score $insert gm4_brewing_data matches 1.. run data modify block ~ ~ ~ Items[{Slot:2b}] set from storage gm4_brewing:temp insert # clean up scoreboard players reset $insert gm4_brewing_data kill @e[type=item,predicate=gm4_brewing:is_custom_potion] data remove entity @s data.gm4_brewing.insert data remove storage gm4_brewing:temp insert ================================================ FILE: lib_brewing/data/gm4_brewing/function/finish_brew.mcfunction ================================================ # @s = none # run from prep_finish_brew # finalize potions execute as @e[type=marker,tag=gm4_brewing_finished] at @s run function gm4_brewing:finalize_potions/get_brewing_stand ================================================ FILE: lib_brewing/data/gm4_brewing/function/load.mcfunction ================================================ scoreboard objectives add gm4_count dummy scoreboard objectives add gm4_brewing_data dummy schedule function gm4_brewing:main 9t ================================================ FILE: lib_brewing/data/gm4_brewing/function/main.mcfunction ================================================ schedule function gm4_brewing:main 16t execute as @e[type=marker,tag=gm4_brewing_stand] at @s run function gm4_brewing:process ================================================ FILE: lib_brewing/data/gm4_brewing/function/mark_adjacent_brewing_stand.mcfunction ================================================ # marches along and places a marker once a newly placed brewing stand is found # @s = player who has placed a brewing stand # at location along a ray originating from the player's eyes # run from gm4_brewing:place_brewing_stand # check for newly placed brewing stand, return when found execute positioned ~1 ~ ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} execute positioned ~ ~1 ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} execute positioned ~ ~ ~1 if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} execute positioned ~-1 ~ ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} execute positioned ~ ~-1 ~ if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} execute positioned ~ ~ ~-1 if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} # advance scoreboard players remove $ray gm4_count 1 execute if score $ray gm4_count matches 0.. positioned ^ ^ ^0.013 run function gm4_brewing:mark_adjacent_brewing_stand ================================================ FILE: lib_brewing/data/gm4_brewing/function/mark_brewing_stand.mcfunction ================================================ # marches along and places a marker once a newly placed brewing stand is found # @s = player who has placed a brewing stand # at location along a ray originating from the player's eyes # run from gm4_brewing:place_brewing_stand # check for newly placed brewing stand, return when found execute if block ~ ~ ~ brewing_stand align xyz unless entity @e[type=marker,tag=gm4_brewing_stand,dx=0,limit=1] run return run summon marker ~.5 ~.5 ~.5 {Tags:["gm4_brewing_stand"],CustomName:"gm4_brewing_stand"} # advance scoreboard players remove $ray gm4_count 1 execute if score $ray gm4_count matches 0.. positioned ^ ^ ^0.013 run return run function gm4_brewing:mark_brewing_stand execute unless score $ray gm4_count matches 0.. run return fail ================================================ FILE: lib_brewing/data/gm4_brewing/function/place_brewing_stand.mcfunction ================================================ # Initiates the search for the newly placed brewing stand # @s = player that just placed a brewing stand # at @s # run from advancement place_brewing_stand # revoke advancement advancement revoke @s only gm4_brewing:place_brewing_stand # find newly placed brewing stand and place marker # check blocks on looking vector scoreboard players set $ray gm4_count 500 execute store success score $found_brewing_stand gm4_count anchored eyes positioned ^ ^ ^ run function gm4_brewing:mark_brewing_stand # check adjacent blocks execute unless score $found_brewing_stand gm4_count matches 1 run function gm4_brewing:mark_adjacent_brewing_stand scoreboard players reset $found_brewing_stand gm4_count # reset fake players scoreboard players reset $ray gm4_count scoreboard players reset $found gm4_count ================================================ FILE: lib_brewing/data/gm4_brewing/function/prep_finish_brew.mcfunction ================================================ # @s = brewing stand that finished brewing # run from check_brew # mark as finished tag @s remove gm4_brewing_tick tag @s add gm4_brewing_finished scoreboard players set $brewed gm4_brewing_data 1 # store contents of brewing stand data modify entity @s data.gm4_brewing.previous_items set from block ~ ~ ~ Items # run the finish functions schedule function gm4_brewing:finish_brew 1t ================================================ FILE: lib_brewing/data/gm4_brewing/function/process.mcfunction ================================================ # @s = brewing stand marker # run from main execute unless block ~ ~ ~ brewing_stand run kill @s execute store result score @s gm4_brewing_data run data get block ~ ~ ~ BrewTime execute if score @s gm4_brewing_data matches 1..18 run tag @s add gm4_brewing_tick execute if score @s gm4_brewing_data matches 1..18 run schedule function gm4_brewing:check_brew 1t ================================================ FILE: lib_brewing/data/gm4_brewing/predicate/is_custom_potion.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "slots": { "contents": { "predicates": { "minecraft:custom_data": "{gm4_custom_potion:1b}" } } } } } ================================================ FILE: lib_brewing/data/gm4_brewing/tags/function/finish_brew.json ================================================ { "values": [] } ================================================ FILE: lib_brewing/data/gm4_brewing/tags/function/insert/lingering.json ================================================ { "values": [] } ================================================ FILE: lib_brewing/data/gm4_brewing/tags/function/insert/splash.json ================================================ { "values": [] } ================================================ FILE: lib_brewing/example_use/data/gm4_brewing/tags/functions/finish_brew.json ================================================ { "values": [ "gm4_example_pack:brewing_stand/finish_brew" ] } ================================================ FILE: lib_brewing/example_use/data/gm4_brewing/tags/functions/insert/lingering.json ================================================ { "values": [ "gm4_example_pack:brewing_stand/lingering" ] } ================================================ FILE: lib_brewing/example_use/data/gm4_brewing/tags/functions/insert/splash.json ================================================ { "values": [ "gm4_example_pack:brewing_stand/splash" ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/finish_brew.mcfunction ================================================ # @s = brewing stand marker that finished brewing a potion # run from #gm4_brewing:finish_brew # poison potion + fermented spider eye -> regeneration potion # (only implemented for first potion slot in this example) execute if entity @s[nbt={data:{gm4_brewing:{previous_items:[{Slot:3b,id:"minecraft:fermented_spider_eye"},{Slot:0b,id:"minecraft:potion",components:{"minecraft:potion_contents":{potion:"minecraft:poison"}}}]}}}] run data modify block ~ ~ ~ Items[{Slot:0b}] set value {Slot:0b,id:"minecraft:potion",components:{"minecraft:potion_contents":{potion:"minecraft:regeneration"}}} ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/lingering.mcfunction ================================================ # @s = brewing stand marker with a custom splash potion to be converted to a lingering potion # run from #gm4_brewing:insert/lingering # brews potions into their proper lingering variants loot spawn ~ ~ ~ loot gm4_example_pack:technical/brewing_stand/lingering # clears vanishing potions and summons an illusioner at its place execute if data entity @s data.gm4_brewing.insert{item:"minecraft:splash_potion",components:{"minecraft:custom_data":{custom_potion:"vanishing"}}} run scoreboard players set $insert gm4_brewing_data -1 execute if score $insert gm4_brewing_data matches -1 run summon illusioner ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/functions/brewing_stand/splash.mcfunction ================================================ # @s = brewing stand marker with a custom potion to be converted to a splash potion # run from #gm4_brewing:insert/splash # brews potions into their proper splash variants loot spawn ~ ~ ~ loot gm4_example_pack:technical/brewing_stand/splash # clears vanishing potions and summons an evoker at its place execute if data entity @s data.gm4_brewing.insert{item:"minecraft:splash_potion",components:{"minecraft:custom_data":{custom_potion:"vanishing"}}} run scoreboard players set $insert gm4_brewing_data -1 execute if score $insert gm4_brewing_data matches -1 run summon evoker ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/booze.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"booze\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:1200},{id:'minecraft:strength',amplifier:0b,duration:1200},{id:'minecraft:nausea',amplifier:1b,duration:400},{id:'minecraft:poison',amplifier:0b,duration:400},{id:'minecraft:absorption',amplifier:1b,duration:1200}],CustomPotionColor:11236936}" }, { "function": "set_name", "name": [ { "text": "Booze" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/lingering_booze.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:lingering_potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"booze\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:300},{id:'minecraft:strength',amplifier:0b,duration:300},{id:'minecraft:nausea',amplifier:1b,duration:100},{id:'minecraft:poison',amplifier:0b,duration:100},{id:'minecraft:absorption',amplifier:1b,duration:300}],CustomPotionColor:11236936}" }, { "function": "set_name", "name": [ { "text": "Lingering Booze" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/lingering_resistance_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:lingering_potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"resistance\",Potion:\"minecraft:mundane\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:150}]}" }, { "function": "set_name", "name": [ { "text": "Lingering Potion of Resistance" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/resistance_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"resistance\",Potion:\"minecraft:mundane\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:600}]}" }, { "function": "set_name", "name": [ { "text": "Potion of Resistance" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_booze.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:splash_potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"booze\",custom_potion_effects:[{id:'minecraft:slowness',amplifier:0b,duration:1200},{id:'minecraft:strength',amplifier:0b,duration:1200},{id:'minecraft:nausea',amplifier:1b,duration:400},{id:'minecraft:poison',amplifier:0b,duration:400},{id:'minecraft:absorption',amplifier:1b,duration:1200}],CustomPotionColor:11236936}" }, { "function": "set_name", "name": [ { "text": "Splashable Booze" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_resistance_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:splash_potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"resistance\",Potion:\"minecraft:mundane\",custom_potion_effects:[{id:'minecraft:resistance',amplifier:0b,duration:600}]}" }, { "function": "set_name", "name": [ { "text": "Splash Potion of Resistance" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/splash_vanishing_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:splash_potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"vanishing\",Potion:\"minecraft:mundane\",custom_potion_effects:[{id:'minecraft:invisibility',amplifier:9b,duration:600}]}" }, { "function": "set_name", "name": [ { "text": "Splash Potion of Vanishing" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/items/vanishing_potion.json ================================================ { "type": "generic", "pools": [ { "rolls": 1, "entries": [ { "type": "item", "weight": 1, "name": "minecraft:potion", "functions": [ { "function": "set_count", "count": 1 }, { "function": "set_nbt", "tag": "{custom_potion:\"vanishing\",Potion:\"minecraft:mundane\",custom_potion_effects:[{id:'minecraft:invisibility',amplifier:9b,duration:600}]}" }, { "function": "set_name", "name": [ { "text": "Potion of Vanishing" } ] } ] } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/technical/brewing_stand/lingering.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_example_pack:items/lingering_resistance_potion", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'resistance'}}}}}}" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_example_pack:items/lingering_booze", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'booze'}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_nbt", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: lib_brewing/example_use/data/gm4_example_pack/loot_tables/technical/brewing_stand/splash.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:loot_table", "value": "gm4_example_pack:items/splash_resistance_potion", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'resistance'}}}}}}" } } ] }, { "type": "minecraft:loot_table", "value": "gm4_example_pack:items/splash_booze", "conditions": [ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "nbt": "{data:{gm4_brewing:{insert:{components:{'minecraft:custom_data':{custom_potion:'booze'}}}}}}" } } ] } ] } ], "functions": [ { "function": "minecraft:set_nbt", "tag": "{gm4_custom_potion:1b}" } ] } ] } ================================================ FILE: lib_brewing/example_use/data/load/tags/functions/gm4_example_pack.json ================================================ { "values": [ "#load:gm4_brewing" ] } ================================================ FILE: lib_brewing/example_use/data/load/tags/functions/load.json ================================================ { "values": [ "#load:gm4_example_pack" ] } ================================================ FILE: lib_brewing/example_use/pack.mcmeta ================================================ { "pack": { "pack_format": 7, "description": [ "Example Pack", "\n", { "text": "Usage example of lib_brewing", "color": "gold" } ] }, "credits": { "Creator": [ [ "BPR", "https://bsky.app/profile/bpr02.com" ] ] } } ================================================ FILE: lib_brewing/mod.mcdoc ================================================ use ::java::util::slot::SlottedItem use ::java::world::item::ItemStack dispatch minecraft:storage[gm4_brewing:temp] to struct { Items?: [SlottedItem], insert?: (ItemStack | SlottedItem), } dispatch mcdoc:marker_data[gm4_brewing] to struct { previous_items?: [SlottedItem], } ================================================ FILE: lib_forceload/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_forceload/README.md ================================================ # lib_forceload lib_forceload is a mcfunction library adding a forceloaded chunk with common utlities. Available utilities are: * yellow-shulker-box for inventory manipulations * sign for text resolution * jukebox for single item storage * repeating command block for sub-tick execution * armour-stand for tool-based loot table context ## How to Use This library forceloads the chunk `29999999 7134`, which lies beyond the maximum world size, in every dimension - including custom defined dimensions. Each dimension initializes its forceloaded chunk when a player first logs into that dimension. ### Yellow Shulker Box Every dimension gets a `yellow_shulker_box` placed at `29999998 1 7134` for use with inventory manipulations. This library follows the "yellow-shulker-box" convention, including the standard loot table. example: ``` # move item from shulker box to output barrel loot insert ~ ~ ~ mine 29999998 1 7134 air{drop_contents:1b} ``` ### Birch Sign Every dimension gets a `birch_wall_sign` placed at `29999998 1 7133`. This can be used to resolve json text components and retrieve the resulting string. example: ``` data modify block 29999998 1 7133 front_text.messages[0] set value [{"text": "killed by "},{"storage":"my_storage:register", "nbt":"my_text.name"}] data modify entity @s CustomName set from block ~ ~ ~ front_text.messages[0] ``` ### Jukebox Every dimension gets a `jukebox` placed at `29999998 1 7132`. The item contained within can be used for whatever the developer wishes. ### Unique Dimension ID In each dimension, a marker entity with the tag `gm4_dimension` is summoned. This marker has a unique scoreboard value stored in the objective `gm4_dimension`, and a name matching the dimension's string ID. This score can be used to dynamically store a dimension on an item, such as for a recall ability, or for your data pack to support an arbitrary number of dimensions, added by other data packs. ### Repeating Command Block The overworld dimension has a repeating command block running the function tag `#gm4_forceload:command_block_tick`. Adding functions to this tag lets their contents to be run at a different subtick than ordinary functions. This is commonly used to intercept item drops before a player has the change to pick them up, but may be used to properly time other data pack code. ### Armor Stand The overworld dimension has a armour stand with the static uuid `344d47-4-4-4-f04ce104d`. This can be used with loot tables that utilize the `match_tool` predicate which require an entity with a mainhand slot. ## License This library, and the contents of the `lib_forceload` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_forceload/beet.yaml ================================================ id: gm4_forceload name: Gamemode 4 Forceload version: 1.6.X description: lib_forceload is a mcfunction library adding a forceloaded chunk with common utlities. data_pack: load: data: data pipeline: - gm4.plugins.extend.library meta: gm4: versioning: extra_version_injections: advancements: [change_dimension, join] smithed: pack_id: gm4_lib_forceload credits: Creator: - Misode ================================================ FILE: lib_forceload/data/gm4_forceload/advancement/change_dimension.json ================================================ { "criteria": { "change_dimension": { "trigger": "minecraft:changed_dimension" } }, "rewards": { "function": "gm4_forceload:mark_dimension" } } ================================================ FILE: lib_forceload/data/gm4_forceload/advancement/join.json ================================================ { "criteria": { "join": { "trigger": "minecraft:tick" } }, "rewards": { "function": "gm4_forceload:mark_dimension" } } ================================================ FILE: lib_forceload/data/gm4_forceload/function/init_chunk.mcfunction ================================================ # run from init_ow_chunk and mark_dimension forceload remove 29999999 7134 forceload add 29999999 7134 fill 29999998 0 7135 29999997 2 7130 minecraft:bedrock setblock 29999998 1 7134 minecraft:yellow_shulker_box setblock 29999998 1 7133 minecraft:birch_wall_sign[facing=north] setblock 29999998 1 7132 minecraft:jukebox{RecordItem:{id:"minecraft:stick",count:1}} ================================================ FILE: lib_forceload/data/gm4_forceload/function/init_ow_chunk.mcfunction ================================================ # @s = marker entity to forceload overworld # run from load tag @s add gm4_dimension data merge entity @s {CustomName:"minecraft:overworld"} function gm4_forceload:init_chunk setblock 29999998 1 7131 minecraft:repeating_command_block{auto:1b,Command:"function #gm4_forceload:command_block_tick"} summon armor_stand 29999999 0 7135 {UUID:[I;3427655,262148,262159,80613453],Invulnerable:1b,Invisible:1b,Marker:1b,Tags:["smithed.entity","smithed.strict"],CustomName:"lib_forceload_armorstand"} #alias uuid lib_forceload_armorstand 344d47-4-4-4-f04ce104d scoreboard players add #max gm4_dimension 1 scoreboard players operation @s gm4_dimension = #max gm4_dimension tp @s 29999999 0 7135 ================================================ FILE: lib_forceload/data/gm4_forceload/function/load.mcfunction ================================================ scoreboard objectives add gm4_dimension dummy gamerule command_block_output false execute store success score $initialized gm4_dimension if block 29999998 1 7133 birch_wall_sign execute if score $initialized gm4_dimension matches 0 positioned ~ 0 ~ summon marker run function gm4_forceload:init_ow_chunk ================================================ FILE: lib_forceload/data/gm4_forceload/function/mark_dimension.mcfunction ================================================ # @s = player who changed dimensions or joined for the first time # run from advancements "change_dimension" and "join" advancement revoke @s only gm4_forceload:change_dimension # exit if the dimension is already initialized execute if block 29999998 1 7133 birch_wall_sign run return 0 function gm4_forceload:init_chunk # spawn dimension marker with scoreboard ID and name tag @s add gm4_in_new_dimension execute summon minecraft:marker in minecraft:overworld run function gm4_forceload:set_marker_data tag @s remove gm4_in_new_dimension ================================================ FILE: lib_forceload/data/gm4_forceload/function/set_marker_data.mcfunction ================================================ # @s = new dimension marker AEC # executed in minecraft:overworld # run from mark_dimension # scoreboard ID scoreboard players add #max gm4_dimension 1 scoreboard players operation @s gm4_dimension = #max gm4_dimension # name data modify block 29999998 1 7133 front_text.messages[0] set value {"nbt": "Dimension", "entity": "@a[tag=gm4_in_new_dimension,limit=1]"} data modify entity @s CustomName set from block 29999998 1 7133 front_text.messages[0] # move to forceloaded chunk execute at @s run tp @s 29999999 0 7135 tag @s add gm4_dimension ================================================ FILE: lib_forceload/data/gm4_forceload/tags/function/command_block_tick.json ================================================ { "values": [] } ================================================ FILE: lib_forceload/data/minecraft/loot_table/blocks/yellow_shulker_box.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:item", "name": "minecraft:yellow_shulker_box", "functions": [ { "function": "minecraft:copy_components", "source": "block_entity", "include": [ "minecraft:custom_name", "minecraft:container", "minecraft:lock", "minecraft:container_loot" ] } ] } ], "conditions": [ { "condition": "minecraft:inverted", "term": { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": { "drop_contents": 1 } } } } } ] }, { "rolls": 1.0, "bonus_rolls": 0.0, "entries": [ { "type": "minecraft:dynamic", "name": "minecraft:contents" } ], "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": { "drop_contents": 1 } } } } ] } ], "random_sequence": "minecraft:blocks/yellow_shulker_box", "__smithed__": { "priority": { "stage": "early" }, "rules": [ { "type": "append", "target": "pools[0].conditions", "source": { "type": "reference", "path": "pools[0].conditions[0]" } }, { "type": "append", "target": "pools", "source": { "type": "reference", "path": "pools[1]" } } ] } } ================================================ FILE: lib_hooked_entity/LICENSE.md ================================================ MIT License Copyright (c) 2026 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_hooked_entity/README.md ================================================ # lib_hooked_entity lib_hooked_entity is a mcfunction library that enables running functions on the entity that a player hooked with a fishing rod. Without a library like this, this operation is not possible to do accurately. Furthermore, logic enabled by this library only triggers with the `fishing_rod_hooked` advancement trigger. ## Usage Usage of this library is achieved by adding functions to the provided function tags: `#gm4_hooked_entity:on_hooked_entity`, `#gm4_hooked_entity:pre_hook_on_player`, `#gm4_hooked_entity:post_hook_on_player` ### Function Tags in order of execution: #### `#gm4_hooked_entity:pre_hook_on_player` Run before selection of the hooked entity. Think of this as what will run any time the player triggers the `fishing_rod_hooked` advancement trigger, it is run as the player and at the player. The intention of this is to access the player in any way you need to before logic is run on the hooked entity. #### `#gm4_hooked_entity:on_hooked_entity` Run as the entity hooked by the player, at the fishing bobber. During this, the relevant player is tagged with `gm4_hooked_entity.player` in case you need to select them during this time frame. #### `#gm4_hooked_entity:post_hook_on_player` Very similar to the `#gm4_hooked_entity:pre_hook_on_player`, just run after `#gm4_hooked_entity:on_hooked_entity`. ## Technical Details This library operates by assigning a 16 bit binary ID in the form of scores on every entity that can be hooked by a fishing rod bobber, but only within 42 blocks of any fishing bobber. When a player uses the fishing rod and triggers `fishing_rod_hooked` they will receive 16 advancements which are used to reconstruct the binary ID of the entity. From there the scores are used in a macro function to select the entity directly. This method is only necessary due to 2 reasons - `execute on` is unable to select the entity a fishing bobber is hooked into - The height that the fishing bobber sits in an entity is dependent on that entity's hitbox height which cannot be known in advance of selection. (With the exceptions of paintings and item frames) ## License This library, and the contents of the `lib_hooked_entity` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_hooked_entity/beet.yaml ================================================ id: gm4_hooked_entity name: Gamemode 4 Hooked Entity Selection version: 1.0.X description: Allows other datapacks to run functions on the entity that a player hooked with a fishing rod. data_pack: load: data: data pipeline: - generate - gm4.plugins.extend.library meta: gm4: versioning: schedule_loops: [tick] smithed: pack_id: gm4_lib_hooked_entity credits: Creator: - runcows ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/id/clear.mcfunction ================================================ # clears id of @s # @s = entity with tag gm4_hooked_entity.id.tagged # run from id/loop scoreboard players reset @s gm4_hooked_entity.id_bit.0 scoreboard players reset @s gm4_hooked_entity.id_bit.1 scoreboard players reset @s gm4_hooked_entity.id_bit.2 scoreboard players reset @s gm4_hooked_entity.id_bit.3 scoreboard players reset @s gm4_hooked_entity.id_bit.4 scoreboard players reset @s gm4_hooked_entity.id_bit.5 scoreboard players reset @s gm4_hooked_entity.id_bit.6 scoreboard players reset @s gm4_hooked_entity.id_bit.7 scoreboard players reset @s gm4_hooked_entity.id_bit.8 scoreboard players reset @s gm4_hooked_entity.id_bit.9 scoreboard players reset @s gm4_hooked_entity.id_bit.10 scoreboard players reset @s gm4_hooked_entity.id_bit.11 scoreboard players reset @s gm4_hooked_entity.id_bit.12 scoreboard players reset @s gm4_hooked_entity.id_bit.13 scoreboard players reset @s gm4_hooked_entity.id_bit.14 scoreboard players reset @s gm4_hooked_entity.id_bit.15 tag @s remove gm4_hooked_entity.id.tagged ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/id/get_next.mcfunction ================================================ # Gets the next id # @s = entity to be assigned id # at @s # run from id/set ## Binary Counter # change bit 0 -> 1, return nothing else to do # change bit 1 -> 0, then go on to next bit # bit.0 execute if score $next gm4_hooked_entity.id_bit.0 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.0 1 scoreboard players set $next gm4_hooked_entity.id_bit.0 0 # bit.1 execute if score $next gm4_hooked_entity.id_bit.1 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.1 1 scoreboard players set $next gm4_hooked_entity.id_bit.1 0 # bit.2 execute if score $next gm4_hooked_entity.id_bit.2 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.2 1 scoreboard players set $next gm4_hooked_entity.id_bit.2 0 # bit.3 execute if score $next gm4_hooked_entity.id_bit.3 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.3 1 scoreboard players set $next gm4_hooked_entity.id_bit.3 0 # bit.4 execute if score $next gm4_hooked_entity.id_bit.4 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.4 1 scoreboard players set $next gm4_hooked_entity.id_bit.4 0 # bit.5 execute if score $next gm4_hooked_entity.id_bit.5 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.5 1 scoreboard players set $next gm4_hooked_entity.id_bit.5 0 # bit.6 execute if score $next gm4_hooked_entity.id_bit.6 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.6 1 scoreboard players set $next gm4_hooked_entity.id_bit.6 0 # bit.7 execute if score $next gm4_hooked_entity.id_bit.7 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.7 1 scoreboard players set $next gm4_hooked_entity.id_bit.7 0 # bit.8 execute if score $next gm4_hooked_entity.id_bit.8 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.8 1 scoreboard players set $next gm4_hooked_entity.id_bit.8 0 # bit.9 execute if score $next gm4_hooked_entity.id_bit.9 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.9 1 scoreboard players set $next gm4_hooked_entity.id_bit.9 0 # bit.10 execute if score $next gm4_hooked_entity.id_bit.10 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.10 1 scoreboard players set $next gm4_hooked_entity.id_bit.10 0 # bit.11 execute if score $next gm4_hooked_entity.id_bit.11 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.11 1 scoreboard players set $next gm4_hooked_entity.id_bit.11 0 # bit.12 execute if score $next gm4_hooked_entity.id_bit.12 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.12 1 scoreboard players set $next gm4_hooked_entity.id_bit.12 0 # bit.13 execute if score $next gm4_hooked_entity.id_bit.13 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.13 1 scoreboard players set $next gm4_hooked_entity.id_bit.13 0 # bit.14 execute if score $next gm4_hooked_entity.id_bit.14 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.14 1 scoreboard players set $next gm4_hooked_entity.id_bit.14 0 # bit.15 execute if score $next gm4_hooked_entity.id_bit.15 matches 0 run return run scoreboard players set $next gm4_hooked_entity.id_bit.15 1 scoreboard players set $next gm4_hooked_entity.id_bit.15 0 ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/id/loop.mcfunction ================================================ # checks for bobbers and stops when there are none # run from player/cast_line and scheduled from id/select_entities # assign new ids if there's a bobber execute as @e[type=minecraft:fishing_bobber] at @s run return run function gm4_hooked_entity:id/select_entities # no fishing bobber, clear ids execute as @e[tag=gm4_hooked_entity.id.tagged] run function gm4_hooked_entity:id/clear ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/id/select_entities.mcfunction ================================================ # selects entities to assign an id and schedules the loop to run again # @s = fishing_bobber # at @s # run from id/loop # set new id tags if needed # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber execute as @e[type=!#gm4_hooked_entity:ignore,tag=!gm4_hooked_entity.id.tagged,distance=..42] at @s run function gm4_hooked_entity:id/set # schedule again, since bobber still exists schedule function gm4_hooked_entity:id/loop 2t ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/id/set.mcfunction ================================================ # set an id on an entity # @s = entity to be assigned id # at @s # run from id/select_entities # get new id function gm4_hooked_entity:id/get_next # assign new id scoreboard players operation @s gm4_hooked_entity.id_bit.0 = $next gm4_hooked_entity.id_bit.0 scoreboard players operation @s gm4_hooked_entity.id_bit.1 = $next gm4_hooked_entity.id_bit.1 scoreboard players operation @s gm4_hooked_entity.id_bit.2 = $next gm4_hooked_entity.id_bit.2 scoreboard players operation @s gm4_hooked_entity.id_bit.3 = $next gm4_hooked_entity.id_bit.3 scoreboard players operation @s gm4_hooked_entity.id_bit.4 = $next gm4_hooked_entity.id_bit.4 scoreboard players operation @s gm4_hooked_entity.id_bit.5 = $next gm4_hooked_entity.id_bit.5 scoreboard players operation @s gm4_hooked_entity.id_bit.6 = $next gm4_hooked_entity.id_bit.6 scoreboard players operation @s gm4_hooked_entity.id_bit.7 = $next gm4_hooked_entity.id_bit.7 scoreboard players operation @s gm4_hooked_entity.id_bit.8 = $next gm4_hooked_entity.id_bit.8 scoreboard players operation @s gm4_hooked_entity.id_bit.9 = $next gm4_hooked_entity.id_bit.9 scoreboard players operation @s gm4_hooked_entity.id_bit.10 = $next gm4_hooked_entity.id_bit.10 scoreboard players operation @s gm4_hooked_entity.id_bit.11 = $next gm4_hooked_entity.id_bit.11 scoreboard players operation @s gm4_hooked_entity.id_bit.12 = $next gm4_hooked_entity.id_bit.12 scoreboard players operation @s gm4_hooked_entity.id_bit.13 = $next gm4_hooked_entity.id_bit.13 scoreboard players operation @s gm4_hooked_entity.id_bit.14 = $next gm4_hooked_entity.id_bit.14 scoreboard players operation @s gm4_hooked_entity.id_bit.15 = $next gm4_hooked_entity.id_bit.15 tag @s add gm4_hooked_entity.id.tagged ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/load.mcfunction ================================================ scoreboard objectives add gm4_hooked_entity.math dummy scoreboard objectives add gm4_hooked_entity.rods_cast minecraft.used:minecraft.fishing_rod # id scoreboard objectives add gm4_hooked_entity.id_bit.0 dummy scoreboard objectives add gm4_hooked_entity.id_bit.1 dummy scoreboard objectives add gm4_hooked_entity.id_bit.2 dummy scoreboard objectives add gm4_hooked_entity.id_bit.3 dummy scoreboard objectives add gm4_hooked_entity.id_bit.4 dummy scoreboard objectives add gm4_hooked_entity.id_bit.5 dummy scoreboard objectives add gm4_hooked_entity.id_bit.6 dummy scoreboard objectives add gm4_hooked_entity.id_bit.7 dummy scoreboard objectives add gm4_hooked_entity.id_bit.8 dummy scoreboard objectives add gm4_hooked_entity.id_bit.9 dummy scoreboard objectives add gm4_hooked_entity.id_bit.10 dummy scoreboard objectives add gm4_hooked_entity.id_bit.11 dummy scoreboard objectives add gm4_hooked_entity.id_bit.12 dummy scoreboard objectives add gm4_hooked_entity.id_bit.13 dummy scoreboard objectives add gm4_hooked_entity.id_bit.14 dummy scoreboard objectives add gm4_hooked_entity.id_bit.15 dummy schedule function gm4_hooked_entity:tick 5t ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/player/cast_line.mcfunction ================================================ # sets rods_cast to 0 and schedules id loop # @s = player, scores={gm4_hooked_entity.rods_cast=1..} # at @s # run from tick scoreboard players set @s gm4_hooked_entity.rods_cast 0 function gm4_hooked_entity:id/loop ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/player/find_hooked_entity.mcfunction ================================================ # Finds the entity the player hooked # @s = player who fished # at @s # with {bit_0, bit_1, bit_2, bit_3, bit_4, bit_5, bit_6, bit_7, bit_8, bit_9, bit_10, bit_11, bit_12, bit_13, bit_14, bit_15} # run from player/received_bit function #gm4_hooked_entity:pre_hook_on_player tag @s add gm4_hooked_entity.player # distance from bobber to entity is ..42 as that represents a vanilla entity of 3.28 blocks tall at a max of 16x scale and then 80% of the height to find the fishing bobber $execute as @e[type=minecraft:fishing_bobber,distance=..33] \ if function gm4_hooked_entity:player/owns_bobber \ at @s as @e[\ distance=..42, limit=1, type=!#gm4_hooked_entity:ignore, \ scores={$(bit_0),$(bit_1),$(bit_2),$(bit_3),$(bit_4),$(bit_5),$(bit_6),$(bit_7),$(bit_8),$(bit_9),$(bit_10),$(bit_11),$(bit_12),$(bit_13),$(bit_14),$(bit_15)}\ ] run function #gm4_hooked_entity:on_hooked_entity tag @s remove gm4_hooked_entity.player function #gm4_hooked_entity:post_hook_on_player ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/player/owns_bobber.mcfunction ================================================ # Checks if a fishing bobber belongs to the targeted owner # @s = a fishing bobber # at owner # run from player/find_hooked_entity return run execute on origin if entity @s[tag=gm4_hooked_entity.player] ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/player/received_bit.mcfunction ================================================ # Logic for when a player receives a bit # @s = player who received a bit # at @s # with {bit, UUID} # run from player/bits/bit_{bit}_{value} $data modify storage gm4_hooked_entity:players "$(UUID)".bit_$(bit) set from storage gm4_hooked_entity:temp bit_data.bit_score # fail if not all bits $execute store result score $bit_count gm4_hooked_entity.math run data get storage gm4_hooked_entity:players "$(UUID)" execute unless score $bit_count gm4_hooked_entity.math matches 16 run return fail # all bits received $function gm4_hooked_entity:player/find_hooked_entity with storage gm4_hooked_entity:players "$(UUID)" # clear storage $data remove storage gm4_hooked_entity:players "$(UUID)" ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/function/tick.mcfunction ================================================ # checks if players have cast a line, then will assign ids to entities around bobber execute as @a[scores={gm4_hooked_entity.rods_cast=1..}] run function gm4_hooked_entity:player/cast_line # schedule again schedule function gm4_hooked_entity:tick 3t ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/tags/entity_type/ignore.json ================================================ { "values": [ "minecraft:area_effect_cloud", "minecraft:arrow", "minecraft:block_display", "minecraft:dragon_fireball", "minecraft:egg", "minecraft:ender_pearl", "minecraft:evoker_fangs", "minecraft:experience_bottle", "minecraft:experience_orb", "minecraft:eye_of_ender", "minecraft:firework_rocket", "minecraft:fishing_bobber", "minecraft:interaction", "minecraft:item_display", "minecraft:lightning_bolt", "minecraft:lingering_potion", "minecraft:llama_spit", "minecraft:marker", "minecraft:ominous_item_spawner", "minecraft:splash_potion", "minecraft:small_fireball", "minecraft:snowball", "minecraft:spectral_arrow", "minecraft:text_display", "minecraft:trident", "minecraft:wither_skull" ] } ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/tags/function/on_hooked_entity.json ================================================ { "values": [] } ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/tags/function/post_hook_on_player.json ================================================ { "values": [] } ================================================ FILE: lib_hooked_entity/data/gm4_hooked_entity/tags/function/pre_hook_on_player.json ================================================ { "values": [] } ================================================ FILE: lib_hooked_entity/generate.py ================================================ from beet import Context, Advancement, Function def beet_default(ctx: Context): for bit in range(16): for value in range(2): ctx.data[f"gm4_hooked_entity:bit_{bit}_{value}"] = Advancement({ "criteria":{ "fishing_rod_hooked":{ "trigger":"minecraft:fishing_rod_hooked", "conditions":{ "entity": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { f"gm4_hooked_entity.id_bit.{bit}": value } } ] } } }, "rewards":{ "function": f"gm4_hooked_entity:player/bits/bit_{bit}_{value}" } }) ctx.data[f"gm4_hooked_entity:player/bits/bit_{bit}_{value}"] = Function([ f"# player adv logic for getting bit {bit} at value {value}. Generated by generate.py.", f"# run from advancement bit_{bit}_{value}\n", f"advancement revoke @s only gm4_hooked_entity:bit_{bit}_{value}\n", "data modify storage gm4_hooked_entity:temp bit_data set value {bit_score:\"" + f"gm4_hooked_entity.id_bit.{bit}={value}\", bit:\"{bit}\"" + "}", "data modify storage gm4_hooked_entity:temp bit_data.UUID set from entity @s UUID", "function gm4_hooked_entity:player/received_bit with storage gm4_hooked_entity:temp bit_data" ]) ================================================ FILE: lib_lore/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_lore/README.md ================================================ # lib_lore lib_lore is a mcfunction library that allows other data packs to easily search, remove, insert, and replace lines of lore on items. ## How to use There are 4 operations that can be applied. Each operation uses data storage and scoreboards as inputs and outputs. ### Inputs There are three data storage inputs, along with two scoreboard inputs. Below are their terminologies (will be used further in this document), as well as their uses and the command to set them. `Source`: This is a list of the lore that will be modified, typically this would be extracted directly from the item being modified, but can be set manually to a desired set of lore. ```mcfunction data modify storage gm4_lore:temp Source set from <...> ``` `Target`: This is a single json item (i.e. a single 'line' of lore) that will be found during the operations. This sets the line of lore to be searched, removed, inserted after, or replaced. ```mcfunction data modify storage gm4_lore:temp Target set from <...> ``` `Input`: This is list of the lore that will be inserted or replaced. This should not be set when simply searching or removing and will be ignored if set while using the search or remove operation. ```mcfunction data modify storage gm4_lore:temp Input set from <...> ``` `start`: This is an integer that determines where the operation will start. It is essentially the offset for the operations. More specific use cases can be found under each specific operation description. ```mcfunction scoreboard players set $start gm4_lore ``` `extra`: This is an integer that determines the extra lines to be removed after the initial line. This is only used during the remove operation and will be ignored otherwise. More specific use cases can be found under the remove operation description. ```mcfunction scoreboard players set $extra gm4_lore ``` ### Outputs There are three outputs to work to work with after running an operation. Each operation uses the three outputs differently, which can be found under the specific operation description. Below are their terminologies (will be used further in this document), as well as their general uses and the command to get them. `Source`: This is the modified version of the input Source. ```mcfunction data get storage gm4_lore:temp Source ``` `Dump`: This is extra info about the operation that was used, usually the line of lore that was modified. ```mcfunction data get storage gm4_lore:temp Dump ``` `index`: This is the index of the lore where the operation took place. ```mcfunction scoreboard players get $index gm4_lore ``` ### Operations Below are the four operations and how to utilize them. Note that every operation requires `Source` and `Target` to be set. #### Remove Removes a specified line of lore - `start` determines where the removal will start when it finds the `Target` line; this can be negative to start removing before the line or positive to start removing after the line. Defaults to 0. - `extra` determines how many more lines to remove after the first target line is removed. Must be positive. Defaults to 0. If set to -1, every line after the first target line will be removed. ```mcfunction function #gm4_lore:remove ``` - `Source` is the updated `Source` without the `Target` line. - `Dump` is the removed line of lore. - `index` is the location of first line that was removed. #### Search Finds the index of a specified line of lore - `start` determines where the search will start; must be a positive number. Defaults to 0. ```mcfunction function #gm4_lore:search ``` - `Source` remains unchanged. - `Dump` is the found line of lore (`Target`). - `index` is the location of first line that was found. #### Insert Inserts lines of lore after a specified line of lore - `Input` determines the lines of lore to add after the `Target` line - `start` determines where the insertion will start when it finds the `Target` line; this can be negative to insert before the line or positive to insert after the line. Defaults to 0. ```mcfunction function #gm4_lore:insert ``` - `Source` is the updated `Source` with the added lore. - `Dump` is the added lines of lore (`Input`). - `index` is the location of first line that was added. #### Replace Replaces a specified line of lore with one or more new lines of lore - `Input ` determines the lines of lore to replace the `Target` line - `start` determines where the search for the `Target` line will start; must be a positive number. Defaults to 0. ```mcfunction function #gm4_lore:replace ``` - `Source` is the updated `Source` with the replaced lore - `Dump` is the replaced line of lore (`Target`) - `index` is the location of first line that was replaced. Please note that the `example_pack` must be started by calling `#load:load`, as a proper load implementation is not included. ## Technical Details - Technically the item isn't modified directly, this means the `Source` and be added to the lore of the item using the default `data modify` operations. - These operations are technically not limited to lore, but can also be used for any type of list. ## License This library, and the contents of the `lib_lore` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_lore/beet.yaml ================================================ id: gm4_lore name: Gamemode 4 Lore version: 1.4.X description: Allows other datapacks to easily search, remove, insert, and replace lines of lore on items. data_pack: load: data: data pipeline: - gm4.plugins.extend.library meta: gm4: versioning: extra_version_injections: functions: - resolve_algorithm/insert - resolve_algorithm/remove - resolve_algorithm/replace - resolve_algorithm/search smithed: pack_id: gm4_lib_lore credits: Creator: - BPR ================================================ FILE: lib_lore/data/gm4_lore/function/algorithms/insert.mcfunction ================================================ # insert lines of Lore after a specified line of Lore # run from modules that use this library # prepare for insert function gm4_lore:utilities/prepare # move all lines prior to the target line to a temp storage # Source[0] will become equal to Target after this function gm4_lore:utilities/find_line # if start is specified, iterate through the lines execute if score $start gm4_lore matches ..-1 run function gm4_lore:utilities/start_before execute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after # insert lore execute unless score $index gm4_lore matches 0 run function gm4_lore:utilities/insert/insert_after execute unless score $index gm4_lore matches -1 run data modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Input[] # store the input lines data modify storage gm4_lore:temp Dump set from storage gm4_lore:temp Input # place the lines back into Source from the TempSource data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[] # clean up function gm4_lore:utilities/clean_up ================================================ FILE: lib_lore/data/gm4_lore/function/algorithms/remove.mcfunction ================================================ # remove a specified line of Lore from a source Lore # run from modules that use this library # prepare for removal function gm4_lore:utilities/prepare # move all lines prior to the target line to a temp storage # Source[0] will become equal to Target after this function gm4_lore:utilities/find_line # if start is specified, iterate through the lines execute if score $start gm4_lore matches ..-1 run function gm4_lore:utilities/start_before execute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after # if extra is specified, remove the rest of the extra lines execute if score $extra gm4_lore matches 1.. run function gm4_lore:utilities/remove/extra_lines # remove the first line of source data modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0] data remove storage gm4_lore:temp Source[0] # if extra is -1, clear Source execute if score $extra gm4_lore matches -1 run function gm4_lore:utilities/remove/remove_rest # place the lines back into Source from the TempSource data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[] # clean up function gm4_lore:utilities/clean_up ================================================ FILE: lib_lore/data/gm4_lore/function/algorithms/replace.mcfunction ================================================ # replaces a specified line of Lore with a new line of Lore # run from modules that use this library # prepare for replace function gm4_lore:utilities/prepare # if start is specified, ignore the lines before that index execute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after # move all lines prior to the target line to a temp storage # Source[0] will become equal to Target after this function gm4_lore:utilities/find_line # replace the first line of source (target line) data modify storage gm4_lore:temp TempInput set from storage gm4_lore:temp Input data modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0] data modify storage gm4_lore:temp Source[0] set from storage gm4_lore:temp Input[-1] data remove storage gm4_lore:temp Input[-1] data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp Input[] data modify storage gm4_lore:temp Input set from storage gm4_lore:temp TempInput # place the lines back into Source from the TempSource data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[] # clean up function gm4_lore:utilities/clean_up ================================================ FILE: lib_lore/data/gm4_lore/function/algorithms/search.mcfunction ================================================ # find a specified line of Lore from a source Lore # run from modules that use this library # prepare for search function gm4_lore:utilities/prepare # if start is specified, ignore the lines before that index execute if score $start gm4_lore matches 1.. run function gm4_lore:utilities/start_after # move all lines prior to the target line to a temp storage # Source[0] will become equal to Target after this function gm4_lore:utilities/find_line # store the first line of source (target line) data modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0] # place the lines back into Source from the TempSource data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[] # clean up function gm4_lore:utilities/clean_up ================================================ FILE: lib_lore/data/gm4_lore/function/load.mcfunction ================================================ scoreboard objectives add gm4_lore dummy ================================================ FILE: lib_lore/data/gm4_lore/function/resolve_algorithm/insert.mcfunction ================================================ execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/insert ================================================ FILE: lib_lore/data/gm4_lore/function/resolve_algorithm/remove.mcfunction ================================================ execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/remove ================================================ FILE: lib_lore/data/gm4_lore/function/resolve_algorithm/replace.mcfunction ================================================ execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/replace ================================================ FILE: lib_lore/data/gm4_lore/function/resolve_algorithm/search.mcfunction ================================================ execute if score gm4_lore load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_lore:algorithms/search ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/clean_up.mcfunction ================================================ # all 4 functions end with this block of code, cleans up everything after the algorithms run # run from gm4_lore: # clean up scoreboard players reset $line_count gm4_lore scoreboard players reset $start gm4_lore scoreboard players reset $extra gm4_lore scoreboard players reset $incorrect_line gm4_lore data remove storage gm4_lore:temp TempSource data remove storage gm4_lore:temp TempInput ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/find_line.mcfunction ================================================ # finds the target line of lore # run from gm4_lore: # store original lines to a temp source data modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0] # check if the first line matches the target line execute store success score $incorrect_line gm4_lore run data modify storage gm4_lore:temp Source[0] set from storage gm4_lore:temp Target # remove the line from Source unless it's the target line execute if score $incorrect_line gm4_lore matches 1 run data remove storage gm4_lore:temp Source[0] execute if score $incorrect_line gm4_lore matches 0 run data remove storage gm4_lore:temp TempSource[-1] # loop until the line is found execute if score $incorrect_line gm4_lore matches 1 run scoreboard players add $index gm4_lore 1 execute if score $index gm4_lore < $line_count gm4_lore if score $incorrect_line gm4_lore matches 1 run function gm4_lore:utilities/find_line execute if score $index gm4_lore >= $line_count gm4_lore run scoreboard players set $index gm4_lore -1 ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/insert/insert_after.mcfunction ================================================ # moves additional lines from Source # run from gm4_lore:insert data modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0] data remove storage gm4_lore:temp Source[0] scoreboard players add $index gm4_lore 1 ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/prepare.mcfunction ================================================ # all 4 functions start with this block of code, sets up everything before the rest of the algorithms run # run from gm4_lore: scoreboard players set $index gm4_lore 0 execute store result score $line_count gm4_lore run data get storage gm4_lore:temp Source data remove storage gm4_lore:temp TempSource data remove storage gm4_lore:temp Dump ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/remove/extra_lines.mcfunction ================================================ # deletes additional lines from Source # run from gm4_lore:remove data modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[0] data remove storage gm4_lore:temp Source[0] scoreboard players remove $extra gm4_lore 1 execute if score $extra gm4_lore matches 1.. run function gm4_lore:utilities/remove/extra_lines ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/remove/remove_rest.mcfunction ================================================ data modify storage gm4_lore:temp Dump append from storage gm4_lore:temp Source[] data remove storage gm4_lore:temp Source ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/start_after.mcfunction ================================================ # moves additional lines from Source to TempSource # run from gm4_lore: data modify storage gm4_lore:temp TempSource append from storage gm4_lore:temp Source[0] data remove storage gm4_lore:temp Source[0] # loop until all of the lines are moved over scoreboard players add $index gm4_lore 1 execute if score $index gm4_lore >= $line_count gm4_lore run scoreboard players set $index gm4_lore -1 scoreboard players remove $start gm4_lore 1 execute unless score $start gm4_lore matches 0 run function gm4_lore:utilities/start_after ================================================ FILE: lib_lore/data/gm4_lore/function/utilities/start_before.mcfunction ================================================ # moves lines from TempSource back to Source # run from gm4_lore:insert and gm4_lore:remove data modify storage gm4_lore:temp Source prepend from storage gm4_lore:temp TempSource[-1] data remove storage gm4_lore:temp TempSource[-1] # loop until all of the lines are moved over execute unless score $index gm4_lore matches 0 run scoreboard players remove $index gm4_lore 1 scoreboard players add $start gm4_lore 1 execute unless score $start gm4_lore matches 0 run function gm4_lore:utilities/start_before ================================================ FILE: lib_lore/data/gm4_lore/tags/function/insert.json ================================================ { "values": [ "#gm4_lore:resolve_algorithm/insert" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/remove.json ================================================ { "values": [ "#gm4_lore:resolve_algorithm/remove" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/replace.json ================================================ { "values": [ "#gm4_lore:resolve_algorithm/replace" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/resolve_algorithm/insert.json ================================================ { "values": [ "gm4_lore:resolve_algorithm/insert" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/resolve_algorithm/remove.json ================================================ { "values": [ "gm4_lore:resolve_algorithm/remove" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/resolve_algorithm/replace.json ================================================ { "values": [ "gm4_lore:resolve_algorithm/replace" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/resolve_algorithm/search.json ================================================ { "values": [ "gm4_lore:resolve_algorithm/search" ] } ================================================ FILE: lib_lore/data/gm4_lore/tags/function/search.json ================================================ { "values": [ "#gm4_lore:resolve_algorithm/search" ] } ================================================ FILE: lib_lore/example_use/data/gm4_example_pack/functions/insert_examples.mcfunction ================================================ # demonstrates uses of insert operation of lib_lore ## Inserts Lore in Player's mainhand # set inputs data modify storage gm4_lore:temp Source set from entity @s SelectedItem.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"The inserted lines will appear after this line"} data modify storage gm4_lore:temp Input set value [{"text":"This line will be inserted after the line"},{"text":"This line will also be inserted after the line"},{"text":"Same with this line"}] # run operation function #gm4_lore:insert # update player's item with item modifier item modify entity @s weapon.mainhand gm4_example_pack:update_player ## Inserts Lore in an item # set inputs data modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"The inserted lines will appear before this line since start is -1"} data modify storage gm4_lore:temp Input set value [{"text":"This line will be inserted before the line"},{"text":"This line will also be inserted, following the previous line (still in front of the TARGET_LINE)"}] scoreboard players set $start gm4_lore -1 # run operation function #gm4_lore:insert # update item data modify entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" set from storage gm4_lore:temp Source ## Inserts Lore in one item, and also transfers them to another item # set inputs summon item ~ ~ ~ {Tags:["item_1"],Item:{components:{"minecraft:lore":[{"text":"TARGET_LINE"},{"text":"The inserted lines will appear after this line"},{"text":"The inserted lines will appear before this line"}]}}} data modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"TARGET_LINE"} scoreboard players set $start gm4_lore 1 data modify storage gm4_lore:temp Input set value [{"text":"This line will be inserted"},{"text":"This line will follow the line before it"}] # run operation function #gm4_lore:insert # set updated lore into item_1 data modify entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" set from storage gm4_lore:temp Source # appends inserted lore line to the closest item data modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components."minecraft:lore" append from storage gm4_lore:temp Dump # note that using "Dump" and "Input" in the command above is functionally equivalent ================================================ FILE: lib_lore/example_use/data/gm4_example_pack/functions/remove_examples.mcfunction ================================================ # demonstrates uses of remove operation of lib_lore ## Removes 1 line of lore from Player's mainhand # set inputs data modify storage gm4_lore:temp Source set from entity @s SelectedItem.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"This line will be removed"} # run operation function #gm4_lore:remove # update player's item with item modifier item modify entity @s weapon.mainhand gm4_example_pack:update_player ## Removes 3 lines of lore from an item # set inputs data modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"The 3 lines before this line will be removed"} scoreboard players set $start gm4_lore -3 scoreboard players set $extra gm4_lore 2 # run operation function #gm4_lore:remove # update item data modify entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" set from storage gm4_lore:temp Source ## Removes lore from one item, and transfers it to another item # set inputs summon item ~ ~ ~ {Tags:["item_1"],Item:{id:"stone",components:{"minecraft:lore":[{"text":"This line and the ones after will be searched for the TARGET_LINE"},{"text":"FILLER_LINE"},{"text":"TARGET_LINE"},{"text":"The line after this line will be removed, since start is 2 (2 after TARGET_LINE)"},{"text":"This line will be removed and appended to another item"},{"text":"This line will be removed and appended to another item since extra is -1"},{"text":"This line will be removed and appended to another item since extra is -1"}]}}} data modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"TARGET_LINE"} scoreboard players set $start gm4_lore 2 scoreboard players set $extra gm4_lore -1 # run operation function #gm4_lore:remove # set updated lore into item_1 data modify entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" set from storage gm4_lore:temp Source # appends removed lore lines to the closest item data modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components."minecraft:lore" append from storage gm4_lore:temp Dump ================================================ FILE: lib_lore/example_use/data/gm4_example_pack/functions/replace_examples.mcfunction ================================================ # demonstrates uses of replace operation of lib_lore ## Replaces Lore in Player's mainhand # set inputs data modify storage gm4_lore:temp Source set from entity @s SelectedItem.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"This line will be replaced"} data modify storage gm4_lore:temp Input set value [{"text":"This line will replace the line"}] # run operation function #gm4_lore:replace # update player's item with item modifier item modify entity @s weapon.mainhand gm4_example_pack:update_player ## Replaces Lore in an item # set inputs data modify storage gm4_lore:temp Source set from entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"This line will be replaced"} data modify storage gm4_lore:temp Input set value [{"text":"This line will replace the line"},{"text":"This line will follow the line before it"}] # run operation function #gm4_lore:replace # update item data modify entity @e[type=item,limit=1,sort=nearest] Item.components."minecraft:lore" set from storage gm4_lore:temp Source ## Replaces Lore in one item, and transfers it to another item # set inputs summon item ~ ~ ~ {Tags:["item_1"],Item:{id:"minecraf:stick",components:{"minecraft:lore":[{"text":"TARGET_LINE"},{"text":"The first two lines will be skipped/ignored"},{"text":"The line after this one will be replaced"},{"text":"TARGET_LINE"},{"text":"This line will remain at the end"}]}}} data modify storage gm4_lore:temp Source set from entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" data modify storage gm4_lore:temp Target set value {"text":"TARGET_LINE"} scoreboard players set $start gm4_lore 2 data modify storage gm4_lore:temp Input set value [{"text":"This line will replace the TARGET_LINE"},{"text":"This line will follow the line before it"}] # run operation function #gm4_lore:replace # set updated lore into item_1 data modify entity @e[type=item,tag=item_1,limit=1] Item.components."minecraft:lore" set from storage gm4_lore:temp Source # appends replaced lore line to the closest item data modify entity @e[type=item,tag=!item_1,sort=nearest,limit=1] Item.components."minecraft:lore" append from storage gm4_lore:temp Dump # note that using "Dump" and "Target" in the command above is functionally equivalent ================================================ FILE: lib_lore/example_use/data/gm4_example_pack/functions/search_examples.mcfunction ================================================ # demonstrates uses of search operation of lib_lore ## Searches for a duplicate line of lore from Player's mainhand ## Checks if any line of lore is the same as the first line # set inputs data modify storage gm4_lore:temp Source set from entity @s SelectedItem.components."minecraft:lore" data modify storage gm4_lore:temp Target set from entity @s SelectedItem.components."minecraft:lore"[0] scoreboard players set $start gm4_lore 1 # run operation function #gm4_lore:search # check if there was a duplicate line execute unless score $index gm4_lore matches -1 run say There is a lore line that is exactly the same as the first lore line! ================================================ FILE: lib_lore/example_use/data/gm4_example_pack/item_modifiers/update_player.json ================================================ { "function": "minecraft:copy_nbt", "source": { "type": "minecraft:storage", "source": "gm4_lore:temp" }, "ops": [ { "source": "Source", "target": "display.Lore", "op": "replace" } ] } ================================================ FILE: lib_lore/example_use/data/load/tags/functions/gm4_example_pack.json ================================================ { "values": [ "#load:gm4_lore" ] } ================================================ FILE: lib_lore/example_use/data/load/tags/functions/load.json ================================================ { "values": [ "#load:gm4_example_pack" ] } ================================================ FILE: lib_lore/example_use/pack.mcmeta ================================================ { "pack": { "pack_format": 7, "description": [ "Example Pack", "\n", { "text": "Usage example of lib_lore", "color": "gold" } ] }, "credits": { "Creator": [ [ "BPR", "https://bsky.app/profile/bpr02.com" ] ] } } ================================================ FILE: lib_lore/mod.mcdoc ================================================ use ::java::util::text::Text dispatch minecraft:storage[gm4_lore:temp] to struct { /// A list of the lore that will be modified, typically this would be extracted directly from the item being modified, but can be set manually to a desired set of lore. Source?: [Text], /// A single json item (i.e. a single 'line' of lore) that will be found during the operations. This sets the line of lore to be searched, removed, inserted after, or replaced. Target?: Text, /// A list of the lore that will be inserted or replaced. This should not be set when simply searching or removing and will be ignored if set while using the search or remove operation. Input?: [Text], TempSource?: [Text], TempInput?: [Text], Dump?: [Text], } ================================================ FILE: lib_machines/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_machines/README.md ================================================ # lib_machines lib_machines is a mcfunction library that adds logic for placing and breaking custom blocks. ## Terminology Gamemode 4 primarily uses this library for machine blocks, but any mention of "machine" or "machine blocks" below refers to any custom block. ## How to Use There are 2 function tags to be used: one for placing machines (`#gm4_machines:place_down`) and one for breaking machines (`#gm4_machines:destroy`). ### Placing Down Machines Machine blocks must be player heads with the following NBT data: ```mcfunction {components:{"minecraft:custom_data":{gm4_machines:{id:"BLOCK_INDENTIFIER"}}}} ``` When placing down a player head with this NBT, the function tag `#gm4_machines:place_down` will run. This will run `as` the player who placed the block and `at` the center of the block that was placed. The following command should be used to verify the specific machine placed: ```mcfunction execute if score $placed_block gm4_machine_data matches 0 if data storage gm4_machines:temp {id:"BLOCK_INDENTIFIER"} run function MODULE_NAMESPACE:machine/create ``` The function `MODULE_NAMESPACE:machine/create` should have the following commands: ```mcfunction scoreboard players set $placed_block gm4_machine_data 1 summon marker ~ ~ ~ {Tags:["gm4_machine_marker","smithed.block","smithed.entity","smithed.strict","IDENTIFIER","ADD ANY EXTRA TAGS"],CustomName:"PLEASE NAME YOUR MACHINE MARKERS",<...>} ``` Each machine block has a marker entity located at the center of the block (`align xyz positioned ~0.5 ~0.5 ~0.5`) with the tag `gm4_machine_marker`. The score `$rotation gm4_machine_data` stores the direction the player is facing and can be used in the `create` function: ``` 1: up 2: down 3: north 4: east 5: south 6: west ``` This can be used to rotate blocks according to facing direction. Note that normally most rotated blocks (droppers, barrels, pistons, etc.) are placed with a facing direction opposite of the player's facing direction. E.g. if the player faces downwards, a placed dropper faces upwards. The score `$single_rotation gm4_machine_data` stores the cardinal direction the player is facing and can be used in the `create` function: ``` 1: north 2: east 3: south 4: west ``` This can be used to rotate blocks according to facing direction if the block doesn't have a vertical direction, such as furnaces. The score `$face_placement gm4_machine_data` stores the face that the block was placed on and can be used in the `create` function: ``` 1: north 2: east 3: south 4: west ``` This can be used to rotate blocks according to what face of the block it was placed on. Note that normally hoppers are placed with a facing direction opposite to the face that it was placed on. E.g. if a player places a hopper onto the south face of a block, it will point north, into the block it was placed on. The scores `$x_rotation` and `$y_rotation` store the exact rotations of the player and can be used for more precise block placement than the three options outlined above. ### Breaking Machines Every tick, machine markers will check if it is in one of the following blocks: ``` air moving_piston lava water ``` If it is in one of those blocks, it will activate a destruction function tag `#gm4_machines:destroy`. This runs `as` and `at` the marker entity. This function is run during the command block sub-tick, meaning you can kill/modify items before they can be picked up by hoppers and hopper minecarts. E.g. if the base block of a machine is a dropper, when the machine marker detects it has been broken, the dropper item can be killed and/or replaced with a custom item (likely the player head used to place down the machine block). The following command should be used to verify the specific machine destroyed: ```mcfunction execute if entity @s[tag=IDENTIFIER] run function MODULE_NAMESPACE:machine/destroy ``` ## License This library, and the contents of the `lib_machines` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_machines/beet.yaml ================================================ id: gm4_machines name: Gamemode 4 Machines version: 1.5.X description: lib_machines is a mcfunction library that adds logic for placing and breaking custom blocks. data_pack: load: data: data pipeline: - gm4.plugins.extend.library - gm4.plugins.include.lib_forceload meta: gm4: versioning: required: lib_forceload: 1.6.0 schedule_loops: [main] extra_version_injections: functions: - resolve_tick advancements: - place_machine_block - place_machine_cart smithed: pack_id: gm4_lib_machines credits: Machines Library Creator: - BPR ================================================ FILE: lib_machines/data/gm4_forceload/tags/function/command_block_tick.json ================================================ { "values": [ "gm4_machines:resolve_tick" ] } ================================================ FILE: lib_machines/data/gm4_machines/advancement/place_machine_block.json ================================================ { "criteria": { "placed_machine_block": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": [ "minecraft:player_head" ], "predicates": { "minecraft:custom_data": "{gm4_machines:{}}" } } } ] } } }, "rewards": { "function": "gm4_machines:place_down/place_machine_block" } } ================================================ FILE: lib_machines/data/gm4_machines/advancement/place_machine_cart.json ================================================ { "criteria": { "placed_machine_entity": { "trigger": "minecraft:item_used_on_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "items": "#gm4_machines:minecarts", "predicates": { "minecraft:custom_data": "{gm4_machines:{}}" } } }, { "condition": "minecraft:location_check", "predicate": { "block": { "blocks": "#minecraft:rails" } } } ] } } }, "rewards": { "function": "gm4_machines:place_down/place_machine_cart" } } ================================================ FILE: lib_machines/data/gm4_machines/function/load.mcfunction ================================================ scoreboard objectives add gm4_machine_data dummy scoreboard objectives add gm4_entity_version dummy schedule function gm4_machines:main 6t ================================================ FILE: lib_machines/data/gm4_machines/function/main.mcfunction ================================================ # runs every 16t # @s = none # located at world spawn # run from gm4_machines:load schedule function gm4_machines:main 16t # check if a new minecart machine has been spawned (via dispenser, since placed by player is detected via advancement) execute if entity @e[type=#gm4:minecarts,tag=!gm4_machine_checked,limit=1] run function gm4_machines:place_down/place_machine_cart ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/check_layer.mcfunction ================================================ # replaces any machine player heads with their corresponding block # @s = player that just placed a machine block player head # located at @s rotated positioned ^-4 ^X ^-1, X = layer number - 4 # run from gm4_machines:place_down/place_machine_block execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^ if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^1 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^2 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^3 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^4 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^ ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^1 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^2 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^3 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^4 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^5 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^6 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^7 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place execute if score $player_head_count gm4_machine_data matches 1.. positioned ^8 ^ ^5 if block ~ ~ ~ #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} run function gm4_machines:place_down/prep_place scoreboard players add $layer_count gm4_machine_data 1 execute if score $player_head_count gm4_machine_data matches 1.. if score $layer_count gm4_machine_data matches ..10 positioned ~ ~1 ~ run function gm4_machines:place_down/check_layer ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/count_heads/east.mcfunction ================================================ # counts the number of players heads # @s = player that just placed a machine block player head # located at @s # run from gm4_machines:plade_down/place_machine_block execute store result score $player_head_add gm4_machine_data run clone ~-1 ~-4 ~-4 ~4 ~-4 ~4 ~-1 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~-3 ~-4 ~4 ~-3 ~4 ~-1 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~-2 ~-4 ~4 ~-2 ~4 ~-1 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~-1 ~-4 ~4 ~-1 ~4 ~-1 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~ ~-4 ~4 ~ ~4 ~-1 ~ ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~1 ~-4 ~4 ~1 ~4 ~-1 ~1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~2 ~-4 ~4 ~2 ~4 ~-1 ~2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~3 ~-4 ~4 ~3 ~4 ~-1 ~3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~4 ~-4 ~4 ~4 ~4 ~-1 ~4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~5 ~-4 ~4 ~5 ~4 ~-1 ~5 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-1 ~6 ~-4 ~4 ~6 ~4 ~-1 ~6 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/count_heads/north.mcfunction ================================================ # counts the number of players heads # @s = player that just placed a machine block player head # located at @s # run from gm4_machines:plade_down/place_machine_block execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-4 ~4 ~-4 ~1 ~-4 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-4 ~4 ~-3 ~1 ~-4 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-4 ~4 ~-2 ~1 ~-4 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-4 ~4 ~-1 ~1 ~-4 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-4 ~4 ~ ~1 ~-4 ~ ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-4 ~4 ~1 ~1 ~-4 ~1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-4 ~4 ~2 ~1 ~-4 ~2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-4 ~4 ~3 ~1 ~-4 ~3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-4 ~4 ~4 ~1 ~-4 ~4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-4 ~4 ~5 ~1 ~-4 ~5 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-4 ~4 ~6 ~1 ~-4 ~6 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/count_heads/south.mcfunction ================================================ # counts the number of players heads # @s = player that just placed a machine block player head # located at @s # run from gm4_machines:plade_down/place_machine_block execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-1 ~4 ~-4 ~4 ~-4 ~-4 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-1 ~4 ~-3 ~4 ~-4 ~-3 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-1 ~4 ~-2 ~4 ~-4 ~-2 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-1 ~4 ~-1 ~4 ~-4 ~-1 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-1 ~4 ~ ~4 ~-4 ~ ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-1 ~4 ~1 ~4 ~-4 ~1 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-1 ~4 ~2 ~4 ~-4 ~2 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-1 ~4 ~3 ~4 ~-4 ~3 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-1 ~4 ~4 ~4 ~-4 ~4 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-1 ~4 ~5 ~4 ~-4 ~5 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-1 ~4 ~6 ~4 ~-4 ~6 ~-1 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/count_heads/west.mcfunction ================================================ # counts the number of players heads # @s = player that just placed a machine block player head # located at @s # run from gm4_machines:plade_down/place_machine_block execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-4 ~-4 ~1 ~-4 ~4 ~-4 ~-4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-3 ~-4 ~1 ~-3 ~4 ~-4 ~-3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-2 ~-4 ~1 ~-2 ~4 ~-4 ~-2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~-1 ~-4 ~1 ~-1 ~4 ~-4 ~-1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~ ~-4 ~1 ~ ~4 ~-4 ~ ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~1 ~-4 ~1 ~1 ~4 ~-4 ~1 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~2 ~-4 ~1 ~2 ~4 ~-4 ~2 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~3 ~-4 ~1 ~3 ~4 ~-4 ~3 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~4 ~-4 ~1 ~4 ~4 ~-4 ~4 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~5 ~-4 ~1 ~5 ~4 ~-4 ~5 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data execute store result score $player_head_add gm4_machine_data run clone ~-4 ~6 ~-4 ~1 ~6 ~4 ~-4 ~6 ~-4 filtered #gm4_machines:player_heads{components:{"minecraft:custom_data":{gm4_machines:{}}}} force scoreboard players operation $player_head_count gm4_machine_data += $player_head_add gm4_machine_data ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/place_machine_block.mcfunction ================================================ # finds the player head that was placed by the player # @s = player that just placed a machine block player head # located at @s # run from gm4_machines:resolve_load/place_machine_block advancement revoke @s only gm4_machines:place_machine_block # get rotation of player # key: direction of player # 3: north, 4: east, 5: south, 6: west execute store result score $y_rotation gm4_machine_data run data get entity @s Rotation[0] scoreboard players set $rotation gm4_machine_data 0 execute if score $y_rotation gm4_machine_data matches 45..135 run scoreboard players set $rotation gm4_machine_data 6 execute if score $rotation gm4_machine_data matches 0 if score $y_rotation gm4_machine_data matches -45..45 run scoreboard players set $rotation gm4_machine_data 5 execute if score $rotation gm4_machine_data matches 0 if score $y_rotation gm4_machine_data matches -135..-45 run scoreboard players set $rotation gm4_machine_data 4 execute if score $rotation gm4_machine_data matches 0 run scoreboard players set $rotation gm4_machine_data 3 # store cardinal y_rotation scoreboard players operation $single_rotation gm4_machine_data = $rotation gm4_machine_data scoreboard players remove $single_rotation gm4_machine_data 2 # find player heads in the specific region scoreboard players set $player_head_count gm4_machine_data 0 execute if score $rotation gm4_machine_data matches 3 run function gm4_machines:place_down/count_heads/north execute if score $rotation gm4_machine_data matches 4 run function gm4_machines:place_down/count_heads/east execute if score $rotation gm4_machine_data matches 5 run function gm4_machines:place_down/count_heads/south execute if score $rotation gm4_machine_data matches 6 run function gm4_machines:place_down/count_heads/west # replace player heads with the corresponding block scoreboard players set $layer_count gm4_machine_data 0 execute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 3 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 180 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer execute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 4 align xyz positioned ~0.5 ~0.5 ~0.5 rotated -90 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer execute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 5 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 0 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer execute if score $player_head_count gm4_machine_data matches 1.. if score $rotation gm4_machine_data matches 6 align xyz positioned ~0.5 ~0.5 ~0.5 rotated 90 0 positioned ^-4 ^-4 ^-1 run function gm4_machines:place_down/check_layer ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/place_machine_cart.mcfunction ================================================ # finds the minecart that was placed by the player OR dispenser # @s = player that just placed a machine minecart OR none # located at @s OR world spawn # run from gm4_machines:resolve_load/place_machine_minecart # and from gm4_machines:main advancement revoke @s only gm4_machines:place_machine_cart # set up tag @s add gm4_machines_placer scoreboard players set $placed_block gm4_machine_data 0 # call function for all minecarts with custom names execute as @e[type=#gm4:minecarts,tag=!gm4_machine_checked] if data entity @s CustomName at @s run function #gm4_machines:place_cart # clean up tag @e[type=#gm4:minecarts] add gm4_machine_checked tag @s remove gm4_machines_placer ================================================ FILE: lib_machines/data/gm4_machines/function/place_down/prep_place.mcfunction ================================================ # prepares the storage and scores for block placement # @s = player that just placed a machine block player head # located at the center of the block that was placed # run from gm4_machines:resolve_load/place_machine_block # overwrite rotation if player is looking highly up or down # key: direction of player # 1: up, 2: down execute store result score $x_rotation gm4_machine_data run data get entity @s Rotation[1] execute if score $x_rotation gm4_machine_data matches -90..-45 run scoreboard players set $rotation gm4_machine_data 1 execute if score $x_rotation gm4_machine_data matches 45..90 run scoreboard players set $rotation gm4_machine_data 2 # store face placed on # key: block face # 1: up, 2: down, 3: north, 4: east, 5: south, 6: west scoreboard players set $face_placement gm4_machine_data 1 execute if block ~ ~ ~ player_head if score $x_rotation gm4_machine_data matches -90..0 run scoreboard players set $face_placement gm4_machine_data 2 execute if block ~ ~ ~ player_wall_head[facing=north] run scoreboard players set $face_placement gm4_machine_data 3 execute if block ~ ~ ~ player_wall_head[facing=east] run scoreboard players set $face_placement gm4_machine_data 4 execute if block ~ ~ ~ player_wall_head[facing=south] run scoreboard players set $face_placement gm4_machine_data 5 execute if block ~ ~ ~ player_wall_head[facing=west] run scoreboard players set $face_placement gm4_machine_data 6 data modify storage gm4_machines:temp id set from block ~ ~ ~ components."minecraft:custom_data".gm4_machines.id scoreboard players set $placed_block gm4_machine_data 0 scoreboard players remove $player_head_count gm4_machine_data 1 function #gm4_machines:place_down data remove storage gm4_machines:temp id # prevent multi-machines execute store result score $entity_count gm4_machine_data if entity @e[type=marker,tag=gm4_machine_marker,distance=..0.1] execute if score $entity_count gm4_machine_data matches 2.. run setblock ~ ~ ~ air destroy ================================================ FILE: lib_machines/data/gm4_machines/function/resolve_tick.mcfunction ================================================ # checks if lib_machines module is loaded # @s = forceloaded command block # located at 29999998 1 7131 # run from function tag #gm4_forceload:command_block_tick execute if score gm4_machines load.status matches 1 if score gm4_machines_minor load.status matches 1 run function gm4_machines:tick ================================================ FILE: lib_machines/data/gm4_machines/function/tick.mcfunction ================================================ # runs every tick on the command block subtick; detects when a machine block has been broken # @s = forceloaded command block # located at 29999998 1 7131 # run from gm4_machines:resolve_tick # check if machine blocks have been broken or moved by a piston (note: this assumes that the block is never replaced with a /fill command) execute as @e[type=marker,tag=gm4_machine_marker] at @s if block ~ ~ ~ #gm4_machines:empty_block run function #gm4_machines:destroy execute as @e[type=item_display,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart execute as @e[type=area_effect_cloud,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart execute as @e[type=marker,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart # Necessary for liquid minecarts execute as @e[type=armor_stand,tag=gm4_machine_cart,predicate=!gm4_machines:has_vehicle] at @s run function #gm4_machines:destroy_cart ================================================ FILE: lib_machines/data/gm4_machines/predicate/has_vehicle.json ================================================ { "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "vehicle": {} } } ================================================ FILE: lib_machines/data/gm4_machines/tags/block/empty_block.json ================================================ { "values": [ "minecraft:air", "minecraft:moving_piston", "minecraft:water", "minecraft:lava" ] } ================================================ FILE: lib_machines/data/gm4_machines/tags/block/player_heads.json ================================================ { "values": [ "minecraft:player_head", "minecraft:player_wall_head" ] } ================================================ FILE: lib_machines/data/gm4_machines/tags/function/destroy.json ================================================ { "values": [] } ================================================ FILE: lib_machines/data/gm4_machines/tags/function/destroy_cart.json ================================================ { "values": [] } ================================================ FILE: lib_machines/data/gm4_machines/tags/function/place_cart.json ================================================ { "values": [] } ================================================ FILE: lib_machines/data/gm4_machines/tags/function/place_down.json ================================================ { "values": [] } ================================================ FILE: lib_machines/data/gm4_machines/tags/item/minecarts.json ================================================ { "values": [ "minecraft:minecart", "minecraft:chest_minecart", "minecraft:hopper_minecart", "minecraft:furnace_minecart", "minecraft:tnt_minecart", "minecraft:command_block_minecart" ] } ================================================ FILE: lib_machines/mod.mcdoc ================================================ use ::java::util::slot::SlottedItem dispatch minecraft:storage[gm4_machines:temp] to struct { id?: string, Items?: [SlottedItem], } dispatch mcdoc:custom_data[gm4_machines] to struct { id: string, } ================================================ FILE: lib_player_death/LICENSE.md ================================================ MIT License Copyright (c) 2024 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_player_death/README.md ================================================ # lib_player_death ================================================ FILE: lib_player_death/beet.yaml ================================================ id: gm4_player_death name: Gamemode 4 Player Death version: 1.4.X data_pack: load: data: data pipeline: - gm4.plugins.extend.library meta: gm4: versioning: extra_version_injections: advancements: - death credits: Creator: - Misode ================================================ FILE: lib_player_death/data/gm4_player_death/advancement/death.json ================================================ { "criteria": { "die": { "trigger": "minecraft:entity_hurt_player", "conditions": { "player": [ { "condition": "minecraft:entity_scores", "entity": "this", "scores": { "gm4_player_death_count": { "min": 1 } } } ] } } }, "rewards": { "function": "gm4_player_death:death" } } ================================================ FILE: lib_player_death/data/gm4_player_death/function/death.mcfunction ================================================ # @s = player that just died # run from advancement player_death advancement revoke @s only gm4_player_death:death scoreboard players reset @s gm4_player_death_count function #gm4_player_death:_private/death ================================================ FILE: lib_player_death/data/gm4_player_death/function/load.mcfunction ================================================ # Add death tracking and reset objective in case the player died while the data pack was disabled scoreboard objectives add gm4_player_death_count deathCount scoreboard players reset * gm4_player_death_count ================================================ FILE: lib_player_death/data/gm4_player_death/tags/function/_private/death.json ================================================ { "values": [ { "id": "#gm4_player_death:soul_bound", "required": false }, { "id": "#gm4_player_death:relocate", "required": false }, { "id": "#gm4_player_death:grave", "required": false }, { "id": "#gm4_player_death:death", "required": false } ] } ================================================ FILE: lib_player_motion/LICENSE.md ================================================ MIT License Copyright (c) 2025 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --- MIT License Copyright (c) 2024 BigPapi13, MulverineX Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_player_motion/README.md ================================================ # lib_player_motion The [Player Motion](https://modrinth.com/datapack/player_motion) library prefixed with the GM4 namespace and properly versioned to prevent conflicts with other versions of player motion. ## changes The following usage changes have been made to the original player motion library: - The scoreboard objective `gm4_player_motion.api.launch` should be used instead of `player_motion.api.launch` when setting the parameters for the launch. - The function tags `#gm4_player_motion:launch_xyz` and `#gm4_player_motion:launch_looking` function tags should be used instead of the `player_motion:api/launch_xyz` and `player_motion:api/launch_looking` functions. The following file changes have been made to the original player motion library: - The `#minecraft:load` function tag has been removed in favor of lantern load. - The `player_motion` namespace has been changed to `gm4_player_motion` to prevent potential conflicts with other versions of the player motion library. - The `player_motion:internal/technical/load` function has been moved to `gm4_player_motion:load` as per GM4 file conventions. - The `#gm4_player_motion:launch_xyz` and `#gm4_player_motion:launch_looking` functions tags have been added as version-checked API calls. The following implementation changes have been made to the original player motion library: - All scoreboard objectives and storage references use `gm4_player_motion` instead of `player_motion` to prevent potential conflicts with other versions of the player motion library. - The UUID for the marker used to get vectors has been changed to a different UUID to prevent potential conflicts with other versions of the player motion library. - The marker is kept at 29999998 0 7133 instead of 0 0 0 to prevent forceloading 0 0; instead the GM4 forceloaded chunk is used to keep the marker selectable. ================================================ FILE: lib_player_motion/beet.yaml ================================================ id: gm4_player_motion name: Gamemode 4 Player Motion version: 1.1.X data_pack: load: data: data pipeline: - gm4.plugins.extend.library - gm4.plugins.include.lib_forceload meta: gm4: versioning: required: lib_forceload: 1.6.0 schedule_loops: [internal/technical/tick] credits: Original Creator: - MulverineX Adapted for GM4 by: - BPR ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/api/launch_looking.mcfunction ================================================ #> gm4_player_motion:api/launch_looking # Launches the player in the input direction execute if entity @s[type=!player] run return fail execute on vehicle run return fail scoreboard players set $function_called gm4_player_motion.internal.dummy 1 tag @s add gm4_player_motion.launch execute store result storage gm4_player_motion:math strength double 0.0001 run scoreboard players get $strength gm4_player_motion.api.launch execute as 9a347e6c-1ce5-434a-b717-6707d51f4299 in minecraft:overworld positioned 0.0 0.0 0.0 run function gm4_player_motion:internal/math/looking_to_xyz with storage gm4_player_motion:math # ^ changed UUID to prevent potential conflict execute store result score $out gm4_player_motion.internal.motion.x run data get storage gm4_player_motion:math motion[0] 10000 execute store result score $out gm4_player_motion.internal.motion.y run data get storage gm4_player_motion:math motion[1] 10000 execute store result score $out gm4_player_motion.internal.motion.z run data get storage gm4_player_motion:math motion[2] 10000 scoreboard players operation @s gm4_player_motion.internal.motion.x += $out gm4_player_motion.internal.motion.x scoreboard players operation @s gm4_player_motion.internal.motion.y += $out gm4_player_motion.internal.motion.y scoreboard players operation @s gm4_player_motion.internal.motion.z += $out gm4_player_motion.internal.motion.z ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/api/launch_xyz.mcfunction ================================================ #> gm4_player_motion-1.4:api/launch_xyz # Launches the player in the input direction execute if entity @s[type=!player] run return fail execute on vehicle run return fail scoreboard players set $function_called gm4_player_motion.internal.dummy 1 tag @s add gm4_player_motion.launch scoreboard players operation @s gm4_player_motion.internal.motion.x += $x gm4_player_motion.api.launch scoreboard players operation @s gm4_player_motion.internal.motion.y += $y gm4_player_motion.api.launch scoreboard players operation @s gm4_player_motion.internal.motion.z += $z gm4_player_motion.api.launch ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/launch/exp_pos.mcfunction ================================================ #> gm4_player_motion:internal/launch/exp_pos $tp 9a347e6c-1ce5-434a-b717-6707d51f4299 ^ ^ ^$(d) # ^ (GM4) changed UUID to prevent potential conflict ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/launch/gamemode/get.mcfunction ================================================ #> gm4_player_motion:internal/launch/gamemode/get execute if entity @s[gamemode=survival] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 0 execute if entity @s[gamemode=creative] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 1 execute if entity @s[gamemode=adventure] run return run scoreboard players set $mode gm4_player_motion.internal.gamemode 2 execute if entity @s[gamemode=spectator] run scoreboard players set $mode gm4_player_motion.internal.gamemode 3 ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/launch/gamemode/restore.mcfunction ================================================ #> gm4_player_motion:internal/launch/gamemode/restore execute if score $mode gm4_player_motion.internal.gamemode matches 0 run return run gamemode survival @s execute if score $mode gm4_player_motion.internal.gamemode matches 1 run return run gamemode creative @s execute if score $mode gm4_player_motion.internal.gamemode matches 2 run return run gamemode adventure @s execute if score $mode gm4_player_motion.internal.gamemode matches 3 run gamemode spectator @s ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/launch/main.mcfunction ================================================ #> gm4_player_motion:internal/launch/main # Launches players in the input direction execute \ store result storage gm4_player_motion:math motion[0] double 0.0001 \ store result storage gm4_player_motion:math motion_x double 0.0001 run \ scoreboard players operation $motion_x gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.x execute \ store result storage gm4_player_motion:math motion[1] double 0.0001 \ store result storage gm4_player_motion:math motion_y double 0.0001 run \ scoreboard players operation $motion_y gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.y execute \ store result storage gm4_player_motion:math motion[2] double 0.0001 \ store result storage gm4_player_motion:math motion_z double 0.0001 run \ scoreboard players operation $motion_z gm4_player_motion.internal.math = @s gm4_player_motion.internal.motion.z execute in minecraft:overworld run function gm4_player_motion:internal/math/main attribute @s knockback_resistance modifier add gm4_player_motion:disable_knockback_resistance -1 add_multiplied_total function gm4_player_motion:internal/launch/gamemode/get gamemode creative tp ~ ~10000 ~ execute rotated as @s positioned ~ ~10000 ~ run function gm4_player_motion:internal/summon/main with storage gm4_player_motion:math tp ~ ~ ~ function gm4_player_motion:internal/launch/gamemode/restore attribute @s knockback_resistance modifier remove gm4_player_motion:disable_knockback_resistance scoreboard players set $function_called gm4_player_motion.internal.dummy 0 tag @s remove gm4_player_motion.launch # Reset scoreboards scoreboard players reset @s gm4_player_motion.internal.motion.x scoreboard players reset @s gm4_player_motion.internal.motion.y scoreboard players reset @s gm4_player_motion.internal.motion.z ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/eyelevel.mcfunction ================================================ #> gm4_player_motion:internal/math/eyelevel # eyelevel=y(eyes)-y(player) execute anchored eyes positioned ^ ^ ^ if entity @s[distance=...41] run \ return run scoreboard players set $eyelevel gm4_player_motion.internal.math 40 execute anchored eyes positioned ^ ^ ^ if entity @s[distance=..1.27] run \ return run scoreboard players set $eyelevel gm4_player_motion.internal.math 127 scoreboard players set $eyelevel gm4_player_motion.internal.math 162 ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/sine.mcfunction ================================================ # > gm4_player_motion:internal/math/full_power/sine $execute store result score $n_full_exp gm4_player_motion.internal.math run data get storage gm4_player_motion:trig arr[$(angle)] scoreboard players operation $n_full_exp gm4_player_motion.internal.math *= $motion_y gm4_player_motion.internal.math execute store result score $sub_power gm4_player_motion.internal.math run scoreboard players operation $n_full_exp gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/tp.mcfunction ================================================ # > gm4_player_motion:internal/math/full_power/tp execute store result storage gm4_player_motion:math pos[0] double 0.1 run scoreboard players get $motion_x gm4_player_motion.internal.math execute store result storage gm4_player_motion:math pos[1] double 0.1 run scoreboard players get $motion_y gm4_player_motion.internal.math execute store result storage gm4_player_motion:math pos[2] double 0.1 run scoreboard players get $motion_z gm4_player_motion.internal.math data modify entity @s Pos set from storage gm4_player_motion:math pos execute at @s facing 0.0 0.0 0.0 run tp @s 0 0 0 0 ~ execute store result storage gm4_player_motion:math magnitude.angle int 1 run data get entity @s Rotation[1] 100 tp @s 29999998.0 0.0 7133.0 # ^ (GM4) move entity back to GM4 forceloaded chunk ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/full_power/trig.mcfunction ================================================ # > gm4_player_motion:internal/math/full_power/trig execute as 9a347e6c-1ce5-434a-b717-6707d51f4299 run function gm4_player_motion:internal/math/full_power/tp # ^ (GM4) changed UUID to prevent potential conflict function gm4_player_motion:internal/math/full_power/sine with storage gm4_player_motion:math magnitude ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/looking_to_xyz.mcfunction ================================================ #> gm4_player_motion:internal/math/looking_to_xyz $tp @s ^ ^ ^$(strength) data modify storage gm4_player_motion:math motion set from entity @s Pos tp @s 29999998.0 0.0 7133.0 # ^ (GM4) changed to move back to GM4 forceloaded chunk coords ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/main.mcfunction ================================================ #> gm4_player_motion:internal/math/main # full_power=sqrt(motion_x²+motion_y²+motion_z²) # Save sign of $motion_y execute store success score $negative_sine gm4_player_motion.internal.math \ if score $motion_y gm4_player_motion.internal.math matches ..-1 # Normalize execute if score $motion_x gm4_player_motion.internal.math matches ..-1 run \ scoreboard players operation $motion_x gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const execute if score $motion_y gm4_player_motion.internal.math matches ..-1 run \ scoreboard players operation $motion_y gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const execute if score $motion_z gm4_player_motion.internal.math matches ..-1 run \ scoreboard players operation $motion_z gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const # Sets angle before exchange scoreboard players set $angle gm4_player_motion.internal.math 0 execute if score $motion_y gm4_player_motion.internal.math matches 0 run \ scoreboard players set $angle gm4_player_motion.internal.math 1 # SuperSwordTW's method. Credit: https://github.com/SuperSwordTW/Distance-Trig-Calc-3d execute if score $motion_y gm4_player_motion.internal.math matches 0 run \ scoreboard players operation $motion_y gm4_player_motion.internal.math >< $motion_x gm4_player_motion.internal.math execute if score $motion_y gm4_player_motion.internal.math matches 0 run \ scoreboard players operation $motion_y gm4_player_motion.internal.math >< $motion_z gm4_player_motion.internal.math function gm4_player_motion:internal/math/full_power/trig # n_full_exp=floor(full_power/0.865) scoreboard players operation $n_full_exp gm4_player_motion.internal.math /= #constant.fpc gm4_player_motion.internal.const # Change back the angle execute if score $angle gm4_player_motion.internal.math matches 1 run data modify storage gm4_player_motion:math magnitude.angle set value 0 # eyelevel=y(eyes)-y(player) function gm4_player_motion:internal/math/eyelevel # sub power operations # sub_power=floor(full_power%0.8) scoreboard players operation $sub_power gm4_player_motion.internal.math %= #constant.fpc gm4_player_motion.internal.const # d12=1-sub_power scoreboard players set $d12 gm4_player_motion.internal.math 10000 scoreboard players operation $d12 gm4_player_motion.internal.math -= $sub_power gm4_player_motion.internal.math # Formula d=-(eyelevel*sinα + d12*12 * cos(arcsin(cosα*eyelevel/(d12*12)))) # d12 = d12*12 scoreboard players operation $d12 gm4_player_motion.internal.math *= #constant.12 gm4_player_motion.internal.const # Obtain sinα and cosα function gm4_player_motion:internal/math/trig/sine with storage gm4_player_motion:math magnitude # cosα *= eyelevel, record cosα for later use scoreboard players operation $cosine gm4_player_motion.internal.math *= $eyelevel gm4_player_motion.internal.math scoreboard players operation $cosine1 gm4_player_motion.internal.math = $cosine gm4_player_motion.internal.math # cosα /= d12 = cosα*eyelevel / (d12*12) scoreboard players operation $cosine gm4_player_motion.internal.math *= #constant.10 gm4_player_motion.internal.const scoreboard players operation $cosine gm4_player_motion.internal.math /= $d12 gm4_player_motion.internal.math # obtain cos(arcsin(cosα*eyelevel/(d12*12)))) execute store result storage gm4_player_motion:math magnitude.quotient int 1 run scoreboard players get $cosine gm4_player_motion.internal.math function gm4_player_motion:internal/math/trig/arcsine with storage gm4_player_motion:math magnitude # cos(arcsin(cosα*eyelevel/(d12)))) *= d12 scoreboard players operation $d gm4_player_motion.internal.math *= $d12 gm4_player_motion.internal.math scoreboard players operation $d gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const # sinα *= eyelevel, record sine for later use scoreboard players operation $sine gm4_player_motion.internal.math *= $eyelevel gm4_player_motion.internal.math scoreboard players operation $sine gm4_player_motion.internal.math /= #constant.10 gm4_player_motion.internal.const scoreboard players operation $sine1 gm4_player_motion.internal.math = $sine gm4_player_motion.internal.math # d += sine execute store result storage gm4_player_motion:math d double -0.0001 run \ scoreboard players operation $d gm4_player_motion.internal.math += $sine gm4_player_motion.internal.math # full power operations # d12=1-fpc(0.8) = 0.2 scoreboard players set $d12 gm4_player_motion.internal.math 2000 #full_d = -(eyelevel*sinα + (d12*12)*cos(arcsin(cosα*eyelevel/(d12*12)))) # d12 = d12*12 scoreboard players operation $d12 gm4_player_motion.internal.math *= #constant.12 gm4_player_motion.internal.const # cosine1 = cosα*eyelevel, cosine1 /= d12 scoreboard players operation $cosine1 gm4_player_motion.internal.math *= #constant.10 gm4_player_motion.internal.const scoreboard players operation $cosine1 gm4_player_motion.internal.math /= $d12 gm4_player_motion.internal.math # Obtain cos(arcsin(cosine1)) execute store result storage gm4_player_motion:math magnitude.quotient int 1 run scoreboard players get $cosine1 gm4_player_motion.internal.math function gm4_player_motion:internal/math/trig/arcsine with storage gm4_player_motion:math magnitude # cos(arcsin(cosα*eyelevel/(d12)))) *= d12 scoreboard players operation $d gm4_player_motion.internal.math *= $d12 gm4_player_motion.internal.math scoreboard players operation $d gm4_player_motion.internal.math /= #constant.1000 gm4_player_motion.internal.const # d += sine1 execute store result storage gm4_player_motion:math full_d double -0.0001 run \ scoreboard players operation $d gm4_player_motion.internal.math += $sine1 gm4_player_motion.internal.math ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/trig/arcsine.mcfunction ================================================ $execute store result score $d gm4_player_motion.internal.math run data get storage gm4_player_motion:arcsine arr[$(quotient)] ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/math/trig/sine.mcfunction ================================================ $execute store result score $sine gm4_player_motion.internal.math run data get storage gm4_player_motion:sine arr[$(angle)] execute if score $negative_sine gm4_player_motion.internal.math matches 1 run scoreboard players operation $sine gm4_player_motion.internal.math *= #constant.-1 gm4_player_motion.internal.const $execute store result score $cosine gm4_player_motion.internal.math run data get storage gm4_player_motion:cosine arr[$(angle)] ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/summon/crystal.mcfunction ================================================ #> gm4_player_motion:internal/summon/crystal $execute if score $n_full_exp gm4_player_motion.internal.math matches 1.. anchored eyes positioned ^ ^ ^$(full_d) run function gm4_player_motion:internal/summon/loop $execute anchored eyes positioned ^ ^ ^$(d) summon end_crystal run damage @s 0 ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/summon/loop.mcfunction ================================================ #> gm4_player_motion:internal/summon/loop scoreboard players remove $n_full_exp gm4_player_motion.internal.math 1 execute summon end_crystal run damage @s 0 execute if score $n_full_exp gm4_player_motion.internal.math matches 1.. run function gm4_player_motion:internal/summon/loop ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/summon/main.mcfunction ================================================ #> gm4_player_motion:internal/summon/main $execute facing ~$(motion_x) ~$(motion_y) ~$(motion_z) run function gm4_player_motion:internal/summon/crystal with storage gm4_player_motion:math ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/technical/tick.mcfunction ================================================ #> gm4_player_motion:internal/technical/tick # TICK FUNCTION schedule function gm4_player_motion:internal/technical/tick 1t append # LAUNCH PLAYERS execute if score $function_called gm4_player_motion.internal.dummy matches 1 as @a[tag=gm4_player_motion.launch] at @s run function gm4_player_motion:internal/launch/main ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/internal/technical/trig.mcfunction ================================================ data modify storage gm4_player_motion:trig arr set value [10000000,5729580,2864790,1909860,1432390,1145920,954929,818511,716197,636620,572958,520871,477465,440737,409255,381972,358099,337034,318310,301557,286479,272837,260436,249112,238733,229183,220369,212207,204628,197572,190986,184825,179050,173624,168517,163703,159155,154854,150779,146913,143240,139746,136419,133247,130218,127325,124557,121907,119367,116931,114593,112346,110185,108106,106104,104175,102315,100520,98787,97113,95494,93929,92414,90947,89526,88149,86813,85518,84260,83039,81853,80700,79579,78489,77428,76396,75391,74412,73458,72528,71622,70737,69875,69033,68211,67409,66625,65859,65111,64379,63664,62965,62280,61611,60955,60314,59685,59070,58467,57877,57298,56731,56175,55629,55095,54570,54055,53550,53054,52568,52090,51621,51160,50707,50262,49825,49396,48974,48559,48151,47749,47355,46967,46585,46209,45840,45476,45118,44766,44419,44077,43741,43409,43083,42761,42445,42133,41825,41522,41224,40929,40639,40353,40071,39792,39518,39247,38980,38717,38457,38201,37948,37699,37452,37209,36969,36732,36498,36267,36039,35814,35592,35372,35155,34941,34729,34520,34313,34109,33907,33708,33511,33316,33123,32933,32745,32559,32375,32193,32014,31836,31660,31486,31314,31144,30976,30809,30644,30481,30320,30161,30003,29847,29692,29539,29388,29238,29089,28943,28797,28653,28511,28370,28230,28092,27955,27819,27685,27552,27420,27289,27160,27032,26905,26779,26655,26532,26409,26288,26168,26049,25932,25815,25699,25584,25471,25358,25247,25136,25026,24917,24810,24703,24597,24492,24388,24284,24182,24080,23980,23880,23781,23682,23585,23488,23393,23298,23203,23110,23017,22925,22834,22743,22653,22564,22476,22388,22301,22215,22129,22044,21959,21876,21793,21710,21628,21547,21466,21386,21307,21228,21150,21072,20995,20918,20842,20767,20692,20618,20544,20470,20398,20325,20254,20182,20112,20041,19972,19902,19833,19765,19697,19630,19563,19496,19430,19365,19300,19235,19171,19107,19043,18980,18918,18856,18794,18733,18672,18611,18551,18491,18432,18373,18314,18256,18198,18140,18083,18026,17970,17914,17858,17803,17748,17693,17638,17584,17531,17477,17424,17371,17319,17267,17215,17164,17112,17062,17011,16961,16911,16861,16812,16763,16714,16665,16617,16569,16521,16474,16427,16380,16333,16287,16241,16195,16149,16104,16059,16014,15970,15925,15881,15838,15794,15751,15708,15665,15622,15580,15538,15496,15454,15412,15371,15330,15289,15249,15208,15168,15128,15088,15049,15010,14970,14931,14893,14854,14816,14778,14740,14702,14665,14627,14590,14553,14516,14480,14443,14407,14371,14335,14299,14264,14229,14193,14158,14124,14089,14054,14020,13986,13952,13918,13885,13851,13818,13785,13752,13719,13686,13654,13621,13589,13557,13525,13493,13462,13430,13399,13368,13337,13306,13275,13244,13214,13184,13153,13123,13093,13064,13034,13005,12975,12946,12917,12888,12859,12830,12802,12773,12745,12717,12689,12661,12633,12605,12578,12550,12523,12496,12468,12442,12415,12388,12361,12335,12308,12282,12256,12230,12204,12178,12152,12127,12101,12076,12050,12025,12000,11975,11950,11925,11901,11876,11852,11827,11803,11779,11755,11731,11707,11683,11659,11636,11612,11589,11566,11542,11519,11496,11473,11450,11428,11405,11382,11360,11338,11315,11293,11271,11249,11227,11205,11183,11162,11140,11118,11097,11076,11054,11033,11012,10991,10970,10949,10928,10908,10887,10866,10846,10825,10805,10785,10765,10745,10725,10705,10685,10665,10645,10626,10606,10586,10567,10548,10528,10509,10490,10471,10452,10433,10414,10395,10377,10358,10339,10321,10302,10284,10265,10247,10229,10211,10193,10175,10157,10139,10121,10103,10086,10068,10050,10033,10015,9998,9981,9963,9946,9929,9912,9895,9878,9861,9844,9827,9811,9794,9777,9761,9744,9728,9711,9695,9679,9663,9646,9630,9614,9598,9582,9566,9550,9535,9519,9503,9487,9472,9456,9441,9425,9410,9395,9379,9364,9349,9334,9319,9304,9289,9274,9259,9244,9229,9214,9200,9185,9170,9156,9141,9127,9112,9098,9084,9069,9055,9041,9027,9013,8999,8985,8971,8957,8943,8929,8915,8901,8888,8874,8860,8847,8833,8820,8806,8793,8779,8766,8753,8739,8726,8713,8700,8687,8674,8661,8648,8635,8622,8609,8596,8583,8571,8558,8545,8533,8520,8507,8495,8482,8470,8458,8445,8433,8421,8408,8396,8384,8372,8360,8347,8335,8323,8311,8299,8287,8276,8264,8252,8240,8228,8217,8205,8193,8182,8170,8159,8147,8136,8124,8113,8101,8090,8079,8067,8056,8045,8034,8023,8011,8000,7989,7978,7967,7956,7945,7934,7923,7913,7902,7891,7880,7870,7859,7848,7837,7827,7816,7806,7795,7785,7774,7764,7753,7743,7733,7722,7712,7702,7691,7681,7671,7661,7651,7641,7630,7620,7610,7600,7590,7580,7570,7561,7551,7541,7531,7521,7511,7502,7492,7482,7473,7463,7453,7444,7434,7425,7415,7406,7396,7387,7377,7368,7358,7349,7340,7330,7321,7312,7303,7294,7284,7275,7266,7257,7248,7239,7230,7221,7212,7203,7194,7185,7176,7167,7158,7149,7140,7132,7123,7114,7105,7097,7088,7079,7071,7062,7053,7045,7036,7028,7019,7011,7002,6994,6985,6977,6968,6960,6952,6943,6935,6927,6919,6910,6902,6894,6886,6877,6869,6861,6853,6845,6837,6829,6821,6813,6805,6797,6789,6781,6773,6765,6757,6749,6741,6734,6726,6718,6710,6702,6695,6687,6679,6671,6664,6656,6649,6641,6633,6626,6618,6611,6603,6596,6588,6581,6573,6566,6558,6551,6543,6536,6529,6521,6514,6507,6499,6492,6485,6478,6470,6463,6456,6449,6442,6435,6427,6420,6413,6406,6399,6392,6385,6378,6371,6364,6357,6350,6343,6336,6329,6322,6315,6309,6302,6295,6288,6281,6274,6268,6261,6254,6247,6241,6234,6227,6221,6214,6207,6201,6194,6187,6181,6174,6168,6161,6155,6148,6142,6135,6129,6122,6116,6109,6103,6097,6090,6084,6077,6071,6065,6058,6052,6046,6039,6033,6027,6021,6014,6008,6002,5996,5990,5983,5977,5971,5965,5959,5953,5947,5941,5935,5929,5922,5916,5910,5904,5898,5892,5887,5881,5875,5869,5863,5857,5851,5845,5839,5833,5828,5822,5816,5810,5804,5798,5793,5787,5781,5775,5770,5764,5758,5753,5747,5741,5736,5730,5724,5719,5713,5707,5702,5696,5691,5685,5680,5674,5669,5663,5657,5652,5647,5641,5636,5630,5625,5619,5614,5608,5603,5598,5592,5587,5582,5576,5571,5566,5560,5555,5550,5544,5539,5534,5529,5523,5518,5513,5508,5502,5497,5492,5487,5482,5477,5471,5466,5461,5456,5451,5446,5441,5436,5431,5426,5421,5416,5410,5405,5400,5395,5390,5385,5381,5376,5371,5366,5361,5356,5351,5346,5341,5336,5331,5326,5322,5317,5312,5307,5302,5297,5293,5288,5283,5278,5273,5269,5264,5259,5254,5250,5245,5240,5236,5231,5226,5222,5217,5212,5208,5203,5198,5194,5189,5184,5180,5175,5171,5166,5162,5157,5152,5148,5143,5139,5134,5130,5125,5121,5116,5112,5107,5103,5098,5094,5090,5085,5081,5076,5072,5068,5063,5059,5054,5050,5046,5041,5037,5033,5028,5024,5020,5015,5011,5007,5002,4998,4994,4990,4985,4981,4977,4973,4968,4964,4960,4956,4952,4947,4943,4939,4935,4931,4927,4922,4918,4914,4910,4906,4902,4898,4894,4890,4885,4881,4877,4873,4869,4865,4861,4857,4853,4849,4845,4841,4837,4833,4829,4825,4821,4817,4813,4809,4805,4801,4797,4793,4790,4786,4782,4778,4774,4770,4766,4762,4758,4755,4751,4747,4743,4739,4735,4732,4728,4724,4720,4716,4713,4709,4705,4701,4697,4694,4690,4686,4682,4679,4675,4671,4668,4664,4660,4656,4653,4649,4645,4642,4638,4634,4631,4627,4623,4620,4616,4612,4609,4605,4602,4598,4594,4591,4587,4584,4580,4576,4573,4569,4566,4562,4559,4555,4552,4548,4545,4541,4538,4534,4531,4527,4524,4520,4517,4513,4510,4506,4503,4499,4496,4492,4489,4486,4482,4479,4475,4472,4469,4465,4462,4458,4455,4452,4448,4445,4442,4438,4435,4432,4428,4425,4422,4418,4415,4412,4408,4405,4402,4398,4395,4392,4389,4385,4382,4379,4375,4372,4369,4366,4362,4359,4356,4353,4350,4346,4343,4340,4337,4334,4330,4327,4324,4321,4318,4315,4311,4308,4305,4302,4299,4296,4293,4289,4286,4283,4280,4277,4274,4271,4268,4265,4261,4258,4255,4252,4249,4246,4243,4240,4237,4234,4231,4228,4225,4222,4219,4216,4213,4210,4207,4204,4201,4198,4195,4192,4189,4186,4183,4180,4177,4174,4171,4168,4165,4162,4159,4156,4153,4151,4148,4145,4142,4139,4136,4133,4130,4127,4124,4122,4119,4116,4113,4110,4107,4104,4101,4099,4096,4093,4090,4087,4084,4082,4079,4076,4073,4070,4068,4065,4062,4059,4056,4054,4051,4048,4045,4043,4040,4037,4034,4032,4029,4026,4023,4021,4018,4015,4012,4010,4007,4004,4002,3999,3996,3993,3991,3988,3985,3983,3980,3977,3975,3972,3969,3967,3964,3961,3959,3956,3953,3951,3948,3946,3943,3940,3938,3935,3932,3930,3927,3925,3922,3919,3917,3914,3912,3909,3906,3904,3901,3899,3896,3894,3891,3889,3886,3883,3881,3878,3876,3873,3871,3868,3866,3863,3861,3858,3856,3853,3851,3848,3846,3843,3841,3838,3836,3833,3831,3828,3826,3823,3821,3818,3816,3814,3811,3809,3806,3804,3801,3799,3796,3794,3792,3789,3787,3784,3782,3780,3777,3775,3772,3770,3768,3765,3763,3760,3758,3756,3753,3751,3749,3746,3744,3741,3739,3737,3734,3732,3730,3727,3725,3723,3720,3718,3716,3713,3711,3709,3706,3704,3702,3700,3697,3695,3693,3690,3688,3686,3684,3681,3679,3677,3674,3672,3670,3668,3665,3663,3661,3659,3656,3654,3652,3650,3647,3645,3643,3641,3639,3636,3634,3632,3630,3627,3625,3623,3621,3619,3616,3614,3612,3610,3608,3606,3603,3601,3599,3597,3595,3592,3590,3588,3586,3584,3582,3580,3577,3575,3573,3571,3569,3567,3565,3562,3560,3558,3556,3554,3552,3550,3548,3546,3543,3541,3539,3537,3535,3533,3531,3529,3527,3525,3523,3520,3518,3516,3514,3512,3510,3508,3506,3504,3502,3500,3498,3496,3494,3492,3490,3488,3486,3484,3481,3479,3477,3475,3473,3471,3469,3467,3465,3463,3461,3459,3457,3455,3453,3451,3449,3447,3445,3443,3441,3439,3437,3435,3434,3432,3430,3428,3426,3424,3422,3420,3418,3416,3414,3412,3410,3408,3406,3404,3402,3400,3398,3397,3395,3393,3391,3389,3387,3385,3383,3381,3379,3377,3376,3374,3372,3370,3368,3366,3364,3362,3360,3358,3357,3355,3353,3351,3349,3347,3345,3344,3342,3340,3338,3336,3334,3332,3331,3329,3327,3325,3323,3321,3319,3318,3316,3314,3312,3310,3309,3307,3305,3303,3301,3299,3298,3296,3294,3292,3290,3289,3287,3285,3283,3281,3280,3278,3276,3274,3273,3271,3269,3267,3265,3264,3262,3260,3258,3257,3255,3253,3251,3250,3248,3246,3244,3243,3241,3239,3237,3236,3234,3232,3230,3229,3227,3225,3223,3222,3220,3218,3217,3215,3213,3211,3210,3208,3206,3205,3203,3201,3199,3198,3196,3194,3193,3191,3189,3188,3186,3184,3183,3181,3179,3178,3176,3174,3173,3171,3169,3168,3166,3164,3163,3161,3159,3158,3156,3154,3153,3151,3149,3148,3146,3144,3143,3141,3140,3138,3136,3135,3133,3131,3130,3128,3127,3125,3123,3122,3120,3119,3117,3115,3114,3112,3111,3109,3107,3106,3104,3103,3101,3099,3098,3096,3095,3093,3091,3090,3088,3087,3085,3084,3082,3080,3079,3077,3076,3074,3073,3071,3069,3068,3066,3065,3063,3062,3060,3059,3057,3056,3054,3052,3051,3049,3048,3046,3045,3043,3042,3040,3039,3037,3036,3034,3033,3031,3030,3028,3027,3025,3024,3022,3021,3019,3018,3016,3015,3013,3012,3010,3009,3007,3006,3004,3003,3001,3000,2998,2997,2995,2994,2992,2991,2989,2988,2986,2985,2983,2982,2981,2979,2978,2976,2975,2973,2972,2970,2969,2967,2966,2965,2963,2962,2960,2959,2957,2956,2955,2953,2952,2950,2949,2947,2946,2944,2943,2942,2940,2939,2937,2936,2935,2933,2932,2930,2929,2928,2926,2925,2923,2922,2921,2919,2918,2916,2915,2914,2912,2911,2909,2908,2907,2905,2904,2902,2901,2900,2898,2897,2896,2894,2893,2891,2890,2889,2887,2886,2885,2883,2882,2881,2879,2878,2876,2875,2874,2872,2871,2870,2868,2867,2866,2864,2863,2862,2860,2859,2858,2856,2855,2854,2852,2851,2850,2848,2847,2846,2844,2843,2842,2840,2839,2838,2836,2835,2834,2832,2831,2830,2829,2827,2826,2825,2823,2822,2821,2819,2818,2817,2816,2814,2813,2812,2810,2809,2808,2807,2805,2804,2803,2801,2800,2799,2798,2796,2795,2794,2792,2791,2790,2789,2787,2786,2785,2784,2782,2781,2780,2779,2777,2776,2775,2774,2772,2771,2770,2769,2767,2766,2765,2764,2762,2761,2760,2759,2757,2756,2755,2754,2752,2751,2750,2749,2747,2746,2745,2744,2743,2741,2740,2739,2738,2736,2735,2734,2733,2732,2730,2729,2728,2727,2726,2724,2723,2722,2721,2720,2718,2717,2716,2715,2714,2712,2711,2710,2709,2708,2706,2705,2704,2703,2702,2701,2699,2698,2697,2696,2695,2693,2692,2691,2690,2689,2688,2686,2685,2684,2683,2682,2681,2679,2678,2677,2676,2675,2674,2672,2671,2670,2669,2668,2667,2666,2664,2663,2662,2661,2660,2659,2657,2656,2655,2654,2653,2652,2651,2650,2648,2647,2646,2645,2644,2643,2642,2640,2639,2638,2637,2636,2635,2634,2633,2631,2630,2629,2628,2627,2626,2625,2624,2623,2621,2620,2619,2618,2617,2616,2615,2614,2613,2612,2610,2609,2608,2607,2606,2605,2604,2603,2602,2601,2599,2598,2597,2596,2595,2594,2593,2592,2591,2590,2589,2588,2586,2585,2584,2583,2582,2581,2580,2579,2578,2577,2576,2575,2574,2573,2572,2570,2569,2568,2567,2566,2565,2564,2563,2562,2561,2560,2559,2558,2557,2556,2555,2554,2553,2551,2550,2549,2548,2547,2546,2545,2544,2543,2542,2541,2540,2539,2538,2537,2536,2535,2534,2533,2532,2531,2530,2529,2528,2527,2526,2525,2524,2523,2522,2521,2519,2518,2517,2516,2515,2514,2513,2512,2511,2510,2509,2508,2507,2506,2505,2504,2503,2502,2501,2500,2499,2498,2497,2496,2495,2494,2493,2492,2491,2490,2489,2488,2487,2486,2485,2484,2483,2482,2481,2480,2479,2479,2478,2477,2476,2475,2474,2473,2472,2471,2470,2469,2468,2467,2466,2465,2464,2463,2462,2461,2460,2459,2458,2457,2456,2455,2454,2453,2452,2451,2450,2449,2448,2448,2447,2446,2445,2444,2443,2442,2441,2440,2439,2438,2437,2436,2435,2434,2433,2432,2431,2430,2430,2429,2428,2427,2426,2425,2424,2423,2422,2421,2420,2419,2418,2417,2416,2416,2415,2414,2413,2412,2411,2410,2409,2408,2407,2406,2405,2404,2404,2403,2402,2401,2400,2399,2398,2397,2396,2395,2394,2394,2393,2392,2391,2390,2389,2388,2387,2386,2385,2384,2384,2383,2382,2381,2380,2379,2378,2377,2376,2375,2375,2374,2373,2372,2371,2370,2369,2368,2367,2367,2366,2365,2364,2363,2362,2361,2360,2360,2359,2358,2357,2356,2355,2354,2353,2352,2352,2351,2350,2349,2348,2347,2346,2346,2345,2344,2343,2342,2341,2340,2339,2339,2338,2337,2336,2335,2334,2333,2333,2332,2331,2330,2329,2328,2327,2327,2326,2325,2324,2323,2322,2321,2321,2320,2319,2318,2317,2316,2316,2315,2314,2313,2312,2311,2310,2310,2309,2308,2307,2306,2305,2305,2304,2303,2302,2301,2300,2300,2299,2298,2297,2296,2295,2295,2294,2293,2292,2291,2291,2290,2289,2288,2287,2286,2286,2285,2284,2283,2282,2281,2281,2280,2279,2278,2277,2277,2276,2275,2274,2273,2273,2272,2271,2270,2269,2269,2268,2267,2266,2265,2264,2264,2263,2262,2261,2260,2260,2259,2258,2257,2256,2256,2255,2254,2253,2252,2252,2251,2250,2249,2249,2248,2247,2246,2245,2245,2244,2243,2242,2241,2241,2240,2239,2238,2238,2237,2236,2235,2234,2234,2233,2232,2231,2231,2230,2229,2228,2227,2227,2226,2225,2224,2224,2223,2222,2221,2220,2220,2219,2218,2217,2217,2216,2215,2214,2214,2213,2212,2211,2211,2210,2209,2208,2207,2207,2206,2205,2204,2204,2203,2202,2201,2201,2200,2199,2198,2198,2197,2196,2195,2195,2194,2193,2192,2192,2191,2190,2189,2189,2188,2187,2186,2186,2185,2184,2184,2183,2182,2181,2181,2180,2179,2178,2178,2177,2176,2175,2175,2174,2173,2172,2172,2171,2170,2170,2169,2168,2167,2167,2166,2165,2164,2164,2163,2162,2162,2161,2160,2159,2159,2158,2157,2157,2156,2155,2154,2154,2153,2152,2151,2151,2150,2149,2149,2148,2147,2146,2146,2145,2144,2144,2143,2142,2142,2141,2140,2139,2139,2138,2137,2137,2136,2135,2134,2134,2133,2132,2132,2131,2130,2130,2129,2128,2127,2127,2126,2125,2125,2124,2123,2123,2122,2121,2121,2120,2119,2118,2118,2117,2116,2116,2115,2114,2114,2113,2112,2112,2111,2110,2109,2109,2108,2107,2107,2106,2105,2105,2104,2103,2103,2102,2101,2101,2100,2099,2099,2098,2097,2097,2096,2095,2095,2094,2093,2093,2092,2091,2091,2090,2089,2089,2088,2087,2087,2086,2085,2085,2084,2083,2083,2082,2081,2081,2080,2079,2079,2078,2077,2077,2076,2075,2075,2074,2073,2073,2072,2071,2071,2070,2069,2069,2068,2067,2067,2066,2065,2065,2064,2063,2063,2062,2062,2061,2060,2060,2059,2058,2058,2057,2056,2056,2055,2054,2054,2053,2052,2052,2051,2051,2050,2049,2049,2048,2047,2047,2046,2045,2045,2044,2044,2043,2042,2042,2041,2040,2040,2039,2038,2038,2037,2037,2036,2035,2035,2034,2033,2033,2032,2032,2031,2030,2030,2029,2028,2028,2027,2027,2026,2025,2025,2024,2023,2023,2022,2022,2021,2020,2020,2019,2018,2018,2017,2017,2016,2015,2015,2014,2014,2013,2012,2012,2011,2010,2010,2009,2009,2008,2007,2007,2006,2006,2005,2004,2004,2003,2003,2002,2001,2001,2000,2000,1999,1998,1998,1997,1996,1996,1995,1995,1994,1993,1993,1992,1992,1991,1990,1990,1989,1989,1988,1987,1987,1986,1986,1985,1985,1984,1983,1983,1982,1982,1981,1980,1980,1979,1979,1978,1977,1977,1976,1976,1975,1974,1974,1973,1973,1972,1972,1971,1970,1970,1969,1969,1968,1967,1967,1966,1966,1965,1965,1964,1963,1963,1962,1962,1961,1961,1960,1959,1959,1958,1958,1957,1956,1956,1955,1955,1954,1954,1953,1952,1952,1951,1951,1950,1950,1949,1948,1948,1947,1947,1946,1946,1945,1944,1944,1943,1943,1942,1942,1941,1941,1940,1939,1939,1938,1938,1937,1937,1936,1935,1935,1934,1934,1933,1933,1932,1932,1931,1930,1930,1929,1929,1928,1928,1927,1927,1926,1925,1925,1924,1924,1923,1923,1922,1922,1921,1920,1920,1919,1919,1918,1918,1917,1917,1916,1916,1915,1914,1914,1913,1913,1912,1912,1911,1911,1910,1910,1909,1908,1908,1907,1907,1906,1906,1905,1905,1904,1904,1903,1903,1902,1901,1901,1900,1900,1899,1899,1898,1898,1897,1897,1896,1896,1895,1895,1894,1893,1893,1892,1892,1891,1891,1890,1890,1889,1889,1888,1888,1887,1887,1886,1886,1885,1884,1884,1883,1883,1882,1882,1881,1881,1880,1880,1879,1879,1878,1878,1877,1877,1876,1876,1875,1875,1874,1874,1873,1872,1872,1871,1871,1870,1870,1869,1869,1868,1868,1867,1867,1866,1866,1865,1865,1864,1864,1863,1863,1862,1862,1861,1861,1860,1860,1859,1859,1858,1858,1857,1857,1856,1856,1855,1855,1854,1854,1853,1853,1852,1852,1851,1851,1850,1850,1849,1849,1848,1848,1847,1847,1846,1846,1845,1845,1844,1844,1843,1843,1842,1842,1841,1841,1840,1840,1839,1839,1838,1838,1837,1837,1836,1836,1835,1835,1834,1834,1833,1833,1832,1832,1831,1831,1830,1830,1829,1829,1828,1828,1827,1827,1826,1826,1825,1825,1824,1824,1823,1823,1822,1822,1821,1821,1820,1820,1819,1819,1819,1818,1818,1817,1817,1816,1816,1815,1815,1814,1814,1813,1813,1812,1812,1811,1811,1810,1810,1809,1809,1808,1808,1807,1807,1807,1806,1806,1805,1805,1804,1804,1803,1803,1802,1802,1801,1801,1800,1800,1799,1799,1799,1798,1798,1797,1797,1796,1796,1795,1795,1794,1794,1793,1793,1792,1792,1792,1791,1791,1790,1790,1789,1789,1788,1788,1787,1787,1786,1786,1785,1785,1785,1784,1784,1783,1783,1782,1782,1781,1781,1780,1780,1780,1779,1779,1778,1778,1777,1777,1776,1776,1775,1775,1774,1774,1774,1773,1773,1772,1772,1771,1771,1770,1770,1770,1769,1769,1768,1768,1767,1767,1766,1766,1765,1765,1765,1764,1764,1763,1763,1762,1762,1761,1761,1761,1760,1760,1759,1759,1758,1758,1757,1757,1757,1756,1756,1755,1755,1754,1754,1753,1753,1753,1752,1752,1751,1751,1750,1750,1749,1749,1749,1748,1748,1747,1747,1746,1746,1746,1745,1745,1744,1744,1743,1743,1743,1742,1742,1741,1741,1740,1740,1739,1739,1739,1738,1738,1737,1737,1736,1736,1736,1735,1735,1734,1734,1733,1733,1733,1732,1732,1731,1731,1730,1730,1730,1729,1729,1728,1728,1727,1727,1727,1726,1726,1725,1725,1725,1724,1724,1723,1723,1722,1722,1722,1721,1721,1720,1720,1719,1719,1719,1718,1718,1717,1717,1717,1716,1716,1715,1715,1714,1714,1714,1713,1713,1712,1712,1712,1711,1711,1710,1710,1709,1709,1709,1708,1708,1707,1707,1707,1706,1706,1705,1705,1704,1704,1704,1703,1703,1702,1702,1702,1701,1701,1700,1700,1700,1699,1699,1698,1698,1698,1697,1697,1696,1696,1696,1695,1695,1694,1694,1693,1693,1693,1692,1692,1691,1691,1691,1690,1690,1689,1689,1689,1688,1688,1687,1687,1687,1686,1686,1685,1685,1685,1684,1684,1683,1683,1683,1682,1682,1681,1681,1681,1680,1680,1679,1679,1679,1678,1678,1678,1677,1677,1676,1676,1676,1675,1675,1674,1674,1674,1673,1673,1672,1672,1672,1671,1671,1670,1670,1670,1669,1669,1668,1668,1668,1667,1667,1667,1666,1666,1665,1665,1665,1664,1664,1663,1663,1663,1662,1662,1662,1661,1661,1660,1660,1660,1659,1659,1658,1658,1658,1657,1657,1657,1656,1656,1655,1655,1655,1654,1654,1653,1653,1653,1652,1652,1652,1651,1651,1650,1650,1650,1649,1649,1649,1648,1648,1647,1647,1647,1646,1646,1646,1645,1645,1644,1644,1644,1643,1643,1643,1642,1642,1641,1641,1641,1640,1640,1640,1639,1639,1638,1638,1638,1637,1637,1637,1636,1636,1635,1635,1635,1634,1634,1634,1633,1633,1633,1632,1632,1631,1631,1631,1630,1630,1630,1629,1629,1629,1628,1628,1627,1627,1627,1626,1626,1626,1625,1625,1624,1624,1624,1623,1623,1623,1622,1622,1622,1621,1621,1621,1620,1620,1619,1619,1619,1618,1618,1618,1617,1617,1617,1616,1616,1615,1615,1615,1614,1614,1614,1613,1613,1613,1612,1612,1612,1611,1611,1610,1610,1610,1609,1609,1609,1608,1608,1608,1607,1607,1607,1606,1606,1606,1605,1605,1604,1604,1604,1603,1603,1603,1602,1602,1602,1601,1601,1601,1600,1600,1600,1599,1599,1599,1598,1598,1597,1597,1597,1596,1596,1596,1595,1595,1595,1594,1594,1594,1593,1593,1593,1592,1592,1592,1591,1591,1591,1590,1590,1590,1589,1589,1589,1588,1588,1587,1587,1587,1586,1586,1586,1585,1585,1585,1584,1584,1584,1583,1583,1583,1582,1582,1582,1581,1581,1581,1580,1580,1580,1579,1579,1579,1578,1578,1578,1577,1577,1577,1576,1576,1576,1575,1575,1575,1574,1574,1574,1573,1573,1573,1572,1572,1572,1571,1571,1571,1570,1570,1570,1569,1569,1569,1568,1568,1568,1567,1567,1567,1566,1566,1566,1565,1565,1565,1564,1564,1564,1563,1563,1563,1562,1562,1562,1561,1561,1561,1560,1560,1560,1559,1559,1559,1558,1558,1558,1557,1557,1557,1557,1556,1556,1556,1555,1555,1555,1554,1554,1554,1553,1553,1553,1552,1552,1552,1551,1551,1551,1550,1550,1550,1549,1549,1549,1548,1548,1548,1548,1547,1547,1547,1546,1546,1546,1545,1545,1545,1544,1544,1544,1543,1543,1543,1542,1542,1542,1541,1541,1541,1541,1540,1540,1540,1539,1539,1539,1538,1538,1538,1537,1537,1537,1536,1536,1536,1536,1535,1535,1535,1534,1534,1534,1533,1533,1533,1532,1532,1532,1531,1531,1531,1531,1530,1530,1530,1529,1529,1529,1528,1528,1528,1527,1527,1527,1527,1526,1526,1526,1525,1525,1525,1524,1524,1524,1523,1523,1523,1523,1522,1522,1522,1521,1521,1521,1520,1520,1520,1519,1519,1519,1519,1518,1518,1518,1517,1517,1517,1516,1516,1516,1516,1515,1515,1515,1514,1514,1514,1513,1513,1513,1513,1512,1512,1512,1511,1511,1511,1510,1510,1510,1510,1509,1509,1509,1508,1508,1508,1507,1507,1507,1507,1506,1506,1506,1505,1505,1505,1505,1504,1504,1504,1503,1503,1503,1502,1502,1502,1502,1501,1501,1501,1500,1500,1500,1500,1499,1499,1499,1498,1498,1498,1497,1497,1497,1497,1496,1496,1496,1495,1495,1495,1495,1494,1494,1494,1493,1493,1493,1493,1492,1492,1492,1491,1491,1491,1491,1490,1490,1490,1489,1489,1489,1489,1488,1488,1488,1487,1487,1487,1486,1486,1486,1486,1485,1485,1485,1485,1484,1484,1484,1483,1483,1483,1483,1482,1482,1482,1481,1481,1481,1481,1480,1480,1480,1479,1479,1479,1479,1478,1478,1478,1477,1477,1477,1477,1476,1476,1476,1475,1475,1475,1475,1474,1474,1474,1474,1473,1473,1473,1472,1472,1472,1472,1471,1471,1471,1470,1470,1470,1470,1469,1469,1469,1469,1468,1468,1468,1467,1467,1467,1467,1466,1466,1466,1466,1465,1465,1465,1464,1464,1464,1464,1463,1463,1463,1462,1462,1462,1462,1461,1461,1461,1461,1460,1460,1460,1460,1459,1459,1459,1458,1458,1458,1458,1457,1457,1457,1457,1456,1456,1456,1455,1455,1455,1455,1454,1454,1454,1454,1453,1453,1453,1453,1452,1452,1452,1451,1451,1451,1451,1450,1450,1450,1450,1449,1449,1449,1449,1448,1448,1448,1447,1447,1447,1447,1446,1446,1446,1446,1445,1445,1445,1445,1444,1444,1444,1443,1443,1443,1443,1442,1442,1442,1442,1441,1441,1441,1441,1440,1440,1440,1440,1439,1439,1439,1439,1438,1438,1438,1437,1437,1437,1437,1436,1436,1436,1436,1435,1435,1435,1435,1434,1434,1434,1434,1433,1433,1433,1433,1432,1432,1432,1432,1431,1431,1431,1431,1430,1430,1430,1430,1429,1429,1429,1429,1428,1428,1428,1427,1427,1427,1427,1426,1426,1426,1426,1425,1425,1425,1425,1424,1424,1424,1424,1423,1423,1423,1423,1422,1422,1422,1422,1421,1421,1421,1421,1420,1420,1420,1420,1419,1419,1419,1419,1418,1418,1418,1418,1417,1417,1417,1417,1416,1416,1416,1416,1415,1415,1415,1415,1414,1414,1414,1414,1413,1413,1413,1413,1412,1412,1412,1412,1411,1411,1411,1411,1411,1410,1410,1410,1410,1409,1409,1409,1409,1408,1408,1408,1408,1407,1407,1407,1407,1406,1406,1406,1406,1405,1405,1405,1405,1404,1404,1404,1404,1403,1403,1403,1403,1402,1402,1402,1402,1402,1401,1401,1401,1401,1400,1400,1400,1400,1399,1399,1399,1399,1398,1398,1398,1398,1397,1397,1397,1397,1397,1396,1396,1396,1396,1395,1395,1395,1395,1394,1394,1394,1394,1393,1393,1393,1393,1392,1392,1392,1392,1392,1391,1391,1391,1391,1390,1390,1390,1390,1389,1389,1389,1389,1388,1388,1388,1388,1388,1387,1387,1387,1387,1386,1386,1386,1386,1385,1385,1385,1385,1385,1384,1384,1384,1384,1383,1383,1383,1383,1382,1382,1382,1382,1382,1381,1381,1381,1381,1380,1380,1380,1380,1379,1379,1379,1379,1379,1378,1378,1378,1378,1377,1377,1377,1377,1377,1376,1376,1376,1376,1375,1375,1375,1375,1374,1374,1374,1374,1374,1373,1373,1373,1373,1372,1372,1372,1372,1372,1371,1371,1371,1371,1370,1370,1370,1370,1370,1369,1369,1369,1369,1368,1368,1368,1368,1367,1367,1367,1367,1367,1366,1366,1366,1366,1365,1365,1365,1365,1365,1364,1364,1364,1364,1364,1363,1363,1363,1363,1362,1362,1362,1362,1362,1361,1361,1361,1361,1360,1360,1360,1360,1360,1359,1359,1359,1359,1358,1358,1358,1358,1358,1357,1357,1357,1357,1356,1356,1356,1356,1356,1355,1355,1355,1355,1355,1354,1354,1354,1354,1353,1353,1353,1353,1353,1352,1352,1352,1352,1352,1351,1351,1351,1351,1350,1350,1350,1350,1350,1349,1349,1349,1349,1349,1348,1348,1348,1348,1347,1347,1347,1347,1347,1346,1346,1346,1346,1346,1345,1345,1345,1345,1344,1344,1344,1344,1344,1343,1343,1343,1343,1343,1342,1342,1342,1342,1342,1341,1341,1341,1341,1341,1340,1340,1340,1340,1339,1339,1339,1339,1339,1338,1338,1338,1338,1338,1337,1337,1337,1337,1337,1336,1336,1336,1336,1336,1335,1335,1335,1335,1334,1334,1334,1334,1334,1333,1333,1333,1333,1333,1332,1332,1332,1332,1332,1331,1331,1331,1331,1331,1330,1330,1330,1330,1330,1329,1329,1329,1329,1329,1328,1328,1328,1328,1328,1327,1327,1327,1327,1327,1326,1326,1326,1326,1326,1325,1325,1325,1325,1325,1324,1324,1324,1324,1324,1323,1323,1323,1323,1323,1322,1322,1322,1322,1322,1321,1321,1321,1321,1321,1320,1320,1320,1320,1320,1319,1319,1319,1319,1319,1318,1318,1318,1318,1318,1317,1317,1317,1317,1317,1316,1316,1316,1316,1316,1315,1315,1315,1315,1315,1314,1314,1314,1314,1314,1313,1313,1313,1313,1313,1312,1312,1312,1312,1312,1311,1311,1311,1311,1311,1310,1310,1310,1310,1310,1310,1309,1309,1309,1309,1309,1308,1308,1308,1308,1308,1307,1307,1307,1307,1307,1306,1306,1306,1306,1306,1305,1305,1305,1305,1305,1305,1304,1304,1304,1304,1304,1303,1303,1303,1303,1303,1302,1302,1302,1302,1302,1301,1301,1301,1301,1301,1301,1300,1300,1300,1300,1300,1299,1299,1299,1299,1299,1298,1298,1298,1298,1298,1298,1297,1297,1297,1297,1297,1296,1296,1296,1296,1296,1295,1295,1295,1295,1295,1295,1294,1294,1294,1294,1294,1293,1293,1293,1293,1293,1292,1292,1292,1292,1292,1292,1291,1291,1291,1291,1291,1290,1290,1290,1290,1290,1290,1289,1289,1289,1289,1289,1288,1288,1288,1288,1288,1288,1287,1287,1287,1287,1287,1286,1286,1286,1286,1286,1286,1285,1285,1285,1285,1285,1284,1284,1284,1284,1284,1284,1283,1283,1283,1283,1283,1282,1282,1282,1282,1282,1282,1281,1281,1281,1281,1281,1280,1280,1280,1280,1280,1280,1279,1279,1279,1279,1279,1279,1278,1278,1278,1278,1278,1277,1277,1277,1277,1277,1277,1276,1276,1276,1276,1276,1276,1275,1275,1275,1275,1275,1274,1274,1274,1274,1274,1274,1273,1273,1273,1273,1273,1273,1272,1272,1272,1272,1272,1271,1271,1271,1271,1271,1271,1270,1270,1270,1270,1270,1270,1269,1269,1269,1269,1269,1269,1268,1268,1268,1268,1268,1267,1267,1267,1267,1267,1267,1266,1266,1266,1266,1266,1266,1265,1265,1265,1265,1265,1265,1264,1264,1264,1264,1264,1264,1263,1263,1263,1263,1263,1263,1262,1262,1262,1262,1262,1261,1261,1261,1261,1261,1261,1260,1260,1260,1260,1260,1260,1259,1259,1259,1259,1259,1259,1258,1258,1258,1258,1258,1258,1257,1257,1257,1257,1257,1257,1256,1256,1256,1256,1256,1256,1255,1255,1255,1255,1255,1255,1254,1254,1254,1254,1254,1254,1253,1253,1253,1253,1253,1253,1252,1252,1252,1252,1252,1252,1251,1251,1251,1251,1251,1251,1250,1250,1250,1250,1250,1250,1250,1249,1249,1249,1249,1249,1249,1248,1248,1248,1248,1248,1248,1247,1247,1247,1247,1247,1247,1246,1246,1246,1246,1246,1246,1245,1245,1245,1245,1245,1245,1244,1244,1244,1244,1244,1244,1244,1243,1243,1243,1243,1243,1243,1242,1242,1242,1242,1242,1242,1241,1241,1241,1241,1241,1241,1240,1240,1240,1240,1240,1240,1240,1239,1239,1239,1239,1239,1239,1238,1238,1238,1238,1238,1238,1237,1237,1237,1237,1237,1237,1237,1236,1236,1236,1236,1236,1236,1235,1235,1235,1235,1235,1235,1234,1234,1234,1234,1234,1234,1234,1233,1233,1233,1233,1233,1233,1232,1232,1232,1232,1232,1232,1232,1231,1231,1231,1231,1231,1231,1230,1230,1230,1230,1230,1230,1230,1229,1229,1229,1229,1229,1229,1228,1228,1228,1228,1228,1228,1228,1227,1227,1227,1227,1227,1227,1226,1226,1226,1226,1226,1226,1226,1225,1225,1225,1225,1225,1225,1224,1224,1224,1224,1224,1224,1224,1223,1223,1223,1223,1223,1223,1223,1222,1222,1222,1222,1222,1222,1221,1221,1221,1221,1221,1221,1221,1220,1220,1220,1220,1220,1220,1220,1219,1219,1219,1219,1219,1219,1218,1218,1218,1218,1218,1218,1218,1217,1217,1217,1217,1217,1217,1217,1216,1216,1216,1216,1216,1216,1216,1215,1215,1215,1215,1215,1215,1215,1214,1214,1214,1214,1214,1214,1213,1213,1213,1213,1213,1213,1213,1212,1212,1212,1212,1212,1212,1212,1211,1211,1211,1211,1211,1211,1211,1210,1210,1210,1210,1210,1210,1210,1209,1209,1209,1209,1209,1209,1209,1208,1208,1208,1208,1208,1208,1208,1207,1207,1207,1207,1207,1207,1207,1206,1206,1206,1206,1206,1206,1206,1205,1205,1205,1205,1205,1205,1205,1204,1204,1204,1204,1204,1204,1204,1203,1203,1203,1203,1203,1203,1203,1202,1202,1202,1202,1202,1202,1202,1201,1201,1201,1201,1201,1201,1201,1201,1200,1200,1200,1200,1200,1200,1200,1199,1199,1199,1199,1199,1199,1199,1198,1198,1198,1198,1198,1198,1198,1197,1197,1197,1197,1197,1197,1197,1196,1196,1196,1196,1196,1196,1196,1196,1195,1195,1195,1195,1195,1195,1195,1194,1194,1194,1194,1194,1194,1194,1193,1193,1193,1193,1193,1193,1193,1193,1192,1192,1192,1192,1192,1192,1192,1191,1191,1191,1191,1191,1191,1191,1191,1190,1190,1190,1190,1190,1190,1190,1189,1189,1189,1189,1189,1189,1189,1189,1188,1188,1188,1188,1188,1188,1188,1187,1187,1187,1187,1187,1187,1187,1187,1186,1186,1186,1186,1186,1186,1186,1185,1185,1185,1185,1185,1185,1185,1185,1184,1184,1184,1184,1184,1184,1184,1183,1183,1183,1183,1183,1183,1183,1183,1182,1182,1182,1182,1182,1182,1182,1182,1181,1181,1181,1181,1181,1181,1181,1180,1180,1180,1180,1180,1180,1180,1180,1179,1179,1179,1179,1179,1179,1179,1179,1178,1178,1178,1178,1178,1178,1178,1178,1177,1177,1177,1177,1177,1177,1177,1177,1176,1176,1176,1176,1176,1176,1176,1175,1175,1175,1175,1175,1175,1175,1175,1174,1174,1174,1174,1174,1174,1174,1174,1173,1173,1173,1173,1173,1173,1173,1173,1172,1172,1172,1172,1172,1172,1172,1172,1171,1171,1171,1171,1171,1171,1171,1171,1170,1170,1170,1170,1170,1170,1170,1170,1169,1169,1169,1169,1169,1169,1169,1169,1168,1168,1168,1168,1168,1168,1168,1168,1167,1167,1167,1167,1167,1167,1167,1167,1167,1166,1166,1166,1166,1166,1166,1166,1166,1165,1165,1165,1165,1165,1165,1165,1165,1164,1164,1164,1164,1164,1164,1164,1164,1163,1163,1163,1163,1163,1163,1163,1163,1162,1162,1162,1162,1162,1162,1162,1162,1162,1161,1161,1161,1161,1161,1161,1161,1161,1160,1160,1160,1160,1160,1160,1160,1160,1159,1159,1159,1159,1159,1159,1159,1159,1159,1158,1158,1158,1158,1158,1158,1158,1158,1157,1157,1157,1157,1157,1157,1157,1157,1157,1156,1156,1156,1156,1156,1156,1156,1156,1155,1155,1155,1155,1155,1155,1155,1155,1155,1154,1154,1154,1154,1154,1154,1154,1154,1154,1153,1153,1153,1153,1153,1153,1153,1153,1152,1152,1152,1152,1152,1152,1152,1152,1152,1151,1151,1151,1151,1151,1151,1151,1151,1151,1150,1150,1150,1150,1150,1150,1150,1150,1149,1149,1149,1149,1149,1149,1149,1149,1149,1148,1148,1148,1148,1148,1148,1148,1148,1148,1147,1147,1147,1147,1147,1147,1147,1147,1147,1146,1146,1146,1146,1146,1146,1146,1146,1146,1145,1145,1145,1145,1145,1145,1145,1145,1145,1144,1144,1144,1144,1144,1144,1144,1144,1144,1143,1143,1143,1143,1143,1143,1143,1143,1143,1142,1142,1142,1142,1142,1142,1142,1142,1142,1141,1141,1141,1141,1141,1141,1141,1141,1141,1140,1140,1140,1140,1140,1140,1140,1140,1140,1139,1139,1139,1139,1139,1139,1139,1139,1139,1138,1138,1138,1138,1138,1138,1138,1138,1138,1138,1137,1137,1137,1137,1137,1137,1137,1137,1137,1136,1136,1136,1136,1136,1136,1136,1136,1136,1135,1135,1135,1135,1135,1135,1135,1135,1135,1135,1134,1134,1134,1134,1134,1134,1134,1134,1134,1133,1133,1133,1133,1133,1133,1133,1133,1133,1132,1132,1132,1132,1132,1132,1132,1132,1132,1132,1131,1131,1131,1131,1131,1131,1131,1131,1131,1130,1130,1130,1130,1130,1130,1130,1130,1130,1130,1129,1129,1129,1129,1129,1129,1129,1129,1129,1129,1128,1128,1128,1128,1128,1128,1128,1128,1128,1127,1127,1127,1127,1127,1127,1127,1127,1127,1127,1126,1126,1126,1126,1126,1126,1126,1126,1126,1126,1125,1125,1125,1125,1125,1125,1125,1125,1125,1125,1124,1124,1124,1124,1124,1124,1124,1124,1124,1124,1123,1123,1123,1123,1123,1123,1123,1123,1123,1123,1122,1122,1122,1122,1122,1122,1122,1122,1122,1122,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1120,1120,1120,1120,1120,1120,1120,1120,1120,1120,1119,1119,1119,1119,1119,1119,1119,1119,1119,1119,1118,1118,1118,1118,1118,1118,1118,1118,1118,1118,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,1115,1115,1115,1115,1115,1115,1115,1115,1115,1115,1114,1114,1114,1114,1114,1114,1114,1114,1114,1114,1114,1113,1113,1113,1113,1113,1113,1113,1113,1113,1113,1112,1112,1112,1112,1112,1112,1112,1112,1112,1112,1112,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1110,1109,1109,1109,1109,1109,1109,1109,1109,1109,1109,1109,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1108,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1107,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1106,1105,1105,1105,1105,1105,1105,1105,1105,1105,1105,1105,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1104,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1102,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1099,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1098,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1097,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1096,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1095,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1094,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1093,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1092,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1091,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1090,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1088,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1087,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1086,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1085,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1084,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1083,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1082,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1081,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1080,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1079,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1078,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1077,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1076,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1075,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1074,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1073,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1072,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1071,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1070,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1069,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1066,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1065,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1064,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1063,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1061,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1060,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1058,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1055,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1054,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1053,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1052,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1050,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1049,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1047,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1046,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1045,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1043,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1042,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1040,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1039,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1038,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1037,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1036,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1035,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1033,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1032,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1031,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1030,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1028,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1027,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1026,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1022,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1021,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1020,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1017,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1015,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1012,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1011,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1010,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1009,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1008,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1007,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1006,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1005,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1004,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1003,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1002,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000] data modify storage gm4_player_motion:sine arr set value [0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,16,16,17,17,17,17,17,17,18,18,18,18,18,19,19,19,19,19,19,20,20,20,20,20,20,21,21,21,21,21,21,22,22,22,22,22,23,23,23,23,23,23,24,24,24,24,24,24,25,25,25,25,25,26,26,26,26,26,26,27,27,27,27,27,27,28,28,28,28,28,28,29,29,29,29,29,30,30,30,30,30,30,31,31,31,31,31,31,32,32,32,32,32,32,33,33,33,33,33,34,34,34,34,34,34,35,35,35,35,35,35,36,36,36,36,36,36,37,37,37,37,37,38,38,38,38,38,38,39,39,39,39,39,39,40,40,40,40,40,41,41,41,41,41,41,42,42,42,42,42,42,43,43,43,43,43,43,44,44,44,44,44,45,45,45,45,45,45,46,46,46,46,46,46,47,47,47,47,47,47,48,48,48,48,48,49,49,49,49,49,49,50,50,50,50,50,50,51,51,51,51,51,51,52,52,52,52,52,53,53,53,53,53,53,54,54,54,54,54,54,55,55,55,55,55,55,56,56,56,56,56,57,57,57,57,57,57,58,58,58,58,58,58,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,62,62,62,62,62,62,63,63,63,63,63,64,64,64,64,64,64,65,65,65,65,65,65,66,66,66,66,66,66,67,67,67,67,67,68,68,68,68,68,68,69,69,69,69,69,69,70,70,70,70,70,70,71,71,71,71,71,72,72,72,72,72,72,73,73,73,73,73,73,74,74,74,74,74,74,75,75,75,75,75,76,76,76,76,76,76,77,77,77,77,77,77,78,78,78,78,78,78,79,79,79,79,79,80,80,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,84,84,84,84,84,84,85,85,85,85,85,85,86,86,86,86,86,86,87,87,87,87,87,88,88,88,88,88,88,89,89,89,89,89,89,90,90,90,90,90,90,91,91,91,91,91,92,92,92,92,92,92,93,93,93,93,93,93,94,94,94,94,94,94,95,95,95,95,95,96,96,96,96,96,96,97,97,97,97,97,97,98,98,98,98,98,98,99,99,99,99,99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,103,103,103,103,103,104,104,104,104,104,104,105,105,105,105,105,105,106,106,106,106,106,106,107,107,107,107,107,107,108,108,108,108,108,109,109,109,109,109,109,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,115,115,116,116,116,116,116,117,117,117,117,117,117,118,118,118,118,118,118,119,119,119,119,119,119,120,120,120,120,120,121,121,121,121,121,121,122,122,122,122,122,122,123,123,123,123,123,123,124,124,124,124,124,124,125,125,125,125,125,126,126,126,126,126,126,127,127,127,127,127,127,128,128,128,128,128,128,129,129,129,129,129,130,130,130,130,130,130,131,131,131,131,131,131,132,132,132,132,132,132,133,133,133,133,133,133,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,136,136,137,137,137,137,137,137,138,138,138,138,138,139,139,139,139,139,139,140,140,140,140,140,140,141,141,141,141,141,141,142,142,142,142,142,142,143,143,143,143,143,144,144,144,144,144,144,145,145,145,145,145,145,146,146,146,146,146,146,147,147,147,147,147,147,148,148,148,148,148,149,149,149,149,149,149,150,150,150,150,150,150,151,151,151,151,151,151,152,152,152,152,152,152,153,153,153,153,153,154,154,154,154,154,154,155,155,155,155,155,155,156,156,156,156,156,156,157,157,157,157,157,157,158,158,158,158,158,159,159,159,159,159,159,160,160,160,160,160,160,161,161,161,161,161,161,162,162,162,162,162,162,163,163,163,163,163,164,164,164,164,164,164,165,165,165,165,165,165,166,166,166,166,166,166,167,167,167,167,167,167,168,168,168,168,168,169,169,169,169,169,169,170,170,170,170,170,170,171,171,171,171,171,171,172,172,172,172,172,172,173,173,173,173,173,173,174,174,174,174,174,175,175,175,175,175,175,176,176,176,176,176,176,177,177,177,177,177,177,178,178,178,178,178,178,179,179,179,179,179,180,180,180,180,180,180,181,181,181,181,181,181,182,182,182,182,182,182,183,183,183,183,183,183,184,184,184,184,184,184,185,185,185,185,185,186,186,186,186,186,186,187,187,187,187,187,187,188,188,188,188,188,188,189,189,189,189,189,189,190,190,190,190,190,190,191,191,191,191,191,192,192,192,192,192,192,193,193,193,193,193,193,194,194,194,194,194,194,195,195,195,195,195,195,196,196,196,196,196,196,197,197,197,197,197,197,198,198,198,198,198,199,199,199,199,199,199,200,200,200,200,200,200,201,201,201,201,201,201,202,202,202,202,202,202,203,203,203,203,203,203,204,204,204,204,204,205,205,205,205,205,205,206,206,206,206,206,206,207,207,207,207,207,207,208,208,208,208,208,208,209,209,209,209,209,209,210,210,210,210,210,210,211,211,211,211,211,212,212,212,212,212,212,213,213,213,213,213,213,214,214,214,214,214,214,215,215,215,215,215,215,216,216,216,216,216,216,217,217,217,217,217,217,218,218,218,218,218,218,219,219,219,219,219,220,220,220,220,220,220,221,221,221,221,221,221,222,222,222,222,222,222,223,223,223,223,223,223,224,224,224,224,224,224,225,225,225,225,225,225,226,226,226,226,226,226,227,227,227,227,227,228,228,228,228,228,228,229,229,229,229,229,229,230,230,230,230,230,230,231,231,231,231,231,231,232,232,232,232,232,232,233,233,233,233,233,233,234,234,234,234,234,234,235,235,235,235,235,235,236,236,236,236,236,237,237,237,237,237,237,238,238,238,238,238,238,239,239,239,239,239,239,240,240,240,240,240,240,241,241,241,241,241,241,242,242,242,242,242,242,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,246,246,246,246,246,246,247,247,247,247,247,248,248,248,248,248,248,249,249,249,249,249,249,250,250,250,250,250,250,251,251,251,251,251,251,252,252,252,252,252,252,253,253,253,253,253,253,254,254,254,254,254,254,255,255,255,255,255,255,256,256,256,256,256,256,257,257,257,257,257,257,258,258,258,258,258,258,259,259,259,259,259,259,260,260,260,260,260,261,261,261,261,261,261,262,262,262,262,262,262,263,263,263,263,263,263,264,264,264,264,264,264,265,265,265,265,265,265,266,266,266,266,266,266,267,267,267,267,267,267,268,268,268,268,268,268,269,269,269,269,269,269,270,270,270,270,270,270,271,271,271,271,271,271,272,272,272,272,272,272,273,273,273,273,273,273,274,274,274,274,274,274,275,275,275,275,275,275,276,276,276,276,276,276,277,277,277,277,277,277,278,278,278,278,278,278,279,279,279,279,279,279,280,280,280,280,280,281,281,281,281,281,281,282,282,282,282,282,282,283,283,283,283,283,283,284,284,284,284,284,284,285,285,285,285,285,285,286,286,286,286,286,286,287,287,287,287,287,287,288,288,288,288,288,288,289,289,289,289,289,289,290,290,290,290,290,290,291,291,291,291,291,291,292,292,292,292,292,292,293,293,293,293,293,293,294,294,294,294,294,294,295,295,295,295,295,295,296,296,296,296,296,296,297,297,297,297,297,297,298,298,298,298,298,298,299,299,299,299,299,299,300,300,300,300,300,300,301,301,301,301,301,301,302,302,302,302,302,302,303,303,303,303,303,303,304,304,304,304,304,304,305,305,305,305,305,305,306,306,306,306,306,306,307,307,307,307,307,307,308,308,308,308,308,308,309,309,309,309,309,309,310,310,310,310,310,310,311,311,311,311,311,311,312,312,312,312,312,312,312,313,313,313,313,313,313,314,314,314,314,314,314,315,315,315,315,315,315,316,316,316,316,316,316,317,317,317,317,317,317,318,318,318,318,318,318,319,319,319,319,319,319,320,320,320,320,320,320,321,321,321,321,321,321,322,322,322,322,322,322,323,323,323,323,323,323,324,324,324,324,324,324,325,325,325,325,325,325,326,326,326,326,326,326,327,327,327,327,327,327,328,328,328,328,328,328,329,329,329,329,329,329,330,330,330,330,330,330,331,331,331,331,331,331,331,332,332,332,332,332,332,333,333,333,333,333,333,334,334,334,334,334,334,335,335,335,335,335,335,336,336,336,336,336,336,337,337,337,337,337,337,338,338,338,338,338,338,339,339,339,339,339,339,340,340,340,340,340,340,341,341,341,341,341,341,342,342,342,342,342,342,343,343,343,343,343,343,343,344,344,344,344,344,344,345,345,345,345,345,345,346,346,346,346,346,346,347,347,347,347,347,347,348,348,348,348,348,348,349,349,349,349,349,349,350,350,350,350,350,350,351,351,351,351,351,351,352,352,352,352,352,352,352,353,353,353,353,353,353,354,354,354,354,354,354,355,355,355,355,355,355,356,356,356,356,356,356,357,357,357,357,357,357,358,358,358,358,358,358,359,359,359,359,359,359,359,360,360,360,360,360,360,361,361,361,361,361,361,362,362,362,362,362,362,363,363,363,363,363,363,364,364,364,364,364,364,365,365,365,365,365,365,366,366,366,366,366,366,366,367,367,367,367,367,367,368,368,368,368,368,368,369,369,369,369,369,369,370,370,370,370,370,370,371,371,371,371,371,371,372,372,372,372,372,372,372,373,373,373,373,373,373,374,374,374,374,374,374,375,375,375,375,375,375,376,376,376,376,376,376,377,377,377,377,377,377,378,378,378,378,378,378,378,379,379,379,379,379,379,380,380,380,380,380,380,381,381,381,381,381,381,382,382,382,382,382,382,383,383,383,383,383,383,383,384,384,384,384,384,384,385,385,385,385,385,385,386,386,386,386,386,386,387,387,387,387,387,387,387,388,388,388,388,388,388,389,389,389,389,389,389,390,390,390,390,390,390,391,391,391,391,391,391,392,392,392,392,392,392,392,393,393,393,393,393,393,394,394,394,394,394,394,395,395,395,395,395,395,396,396,396,396,396,396,396,397,397,397,397,397,397,398,398,398,398,398,398,399,399,399,399,399,399,400,400,400,400,400,400,400,401,401,401,401,401,401,402,402,402,402,402,402,403,403,403,403,403,403,404,404,404,404,404,404,404,405,405,405,405,405,405,406,406,406,406,406,406,407,407,407,407,407,407,408,408,408,408,408,408,408,409,409,409,409,409,409,410,410,410,410,410,410,411,411,411,411,411,411,411,412,412,412,412,412,412,413,413,413,413,413,413,414,414,414,414,414,414,415,415,415,415,415,415,415,416,416,416,416,416,416,417,417,417,417,417,417,418,418,418,418,418,418,418,419,419,419,419,419,419,420,420,420,420,420,420,421,421,421,421,421,421,421,422,422,422,422,422,422,423,423,423,423,423,423,424,424,424,424,424,424,424,425,425,425,425,425,425,426,426,426,426,426,426,427,427,427,427,427,427,427,428,428,428,428,428,428,429,429,429,429,429,429,430,430,430,430,430,430,430,431,431,431,431,431,431,432,432,432,432,432,432,433,433,433,433,433,433,433,434,434,434,434,434,434,435,435,435,435,435,435,436,436,436,436,436,436,436,437,437,437,437,437,437,438,438,438,438,438,438,438,439,439,439,439,439,439,440,440,440,440,440,440,441,441,441,441,441,441,441,442,442,442,442,442,442,443,443,443,443,443,443,444,444,444,444,444,444,444,445,445,445,445,445,445,446,446,446,446,446,446,446,447,447,447,447,447,447,448,448,448,448,448,448,449,449,449,449,449,449,449,450,450,450,450,450,450,451,451,451,451,451,451,451,452,452,452,452,452,452,453,453,453,453,453,453,453,454,454,454,454,454,454,455,455,455,455,455,455,456,456,456,456,456,456,456,457,457,457,457,457,457,458,458,458,458,458,458,458,459,459,459,459,459,459,460,460,460,460,460,460,460,461,461,461,461,461,461,462,462,462,462,462,462,462,463,463,463,463,463,463,464,464,464,464,464,464,464,465,465,465,465,465,465,466,466,466,466,466,466,467,467,467,467,467,467,467,468,468,468,468,468,468,469,469,469,469,469,469,469,470,470,470,470,470,470,471,471,471,471,471,471,471,472,472,472,472,472,472,473,473,473,473,473,473,473,474,474,474,474,474,474,475,475,475,475,475,475,475,476,476,476,476,476,476,477,477,477,477,477,477,477,478,478,478,478,478,478,478,479,479,479,479,479,479,480,480,480,480,480,480,480,481,481,481,481,481,481,482,482,482,482,482,482,482,483,483,483,483,483,483,484,484,484,484,484,484,484,485,485,485,485,485,485,486,486,486,486,486,486,486,487,487,487,487,487,487,488,488,488,488,488,488,488,489,489,489,489,489,489,489,490,490,490,490,490,490,491,491,491,491,491,491,491,492,492,492,492,492,492,493,493,493,493,493,493,493,494,494,494,494,494,494,495,495,495,495,495,495,495,496,496,496,496,496,496,496,497,497,497,497,497,497,498,498,498,498,498,498,498,499,499,499,499,499,499,500,500,500,500,500,500,500,501,501,501,501,501,501,501,502,502,502,502,502,502,503,503,503,503,503,503,503,504,504,504,504,504,504,504,505,505,505,505,505,505,506,506,506,506,506,506,506,507,507,507,507,507,507,507,508,508,508,508,508,508,509,509,509,509,509,509,509,510,510,510,510,510,510,510,511,511,511,511,511,511,512,512,512,512,512,512,512,513,513,513,513,513,513,513,514,514,514,514,514,514,515,515,515,515,515,515,515,516,516,516,516,516,516,516,517,517,517,517,517,517,518,518,518,518,518,518,518,519,519,519,519,519,519,519,520,520,520,520,520,520,521,521,521,521,521,521,521,522,522,522,522,522,522,522,523,523,523,523,523,523,523,524,524,524,524,524,524,525,525,525,525,525,525,525,526,526,526,526,526,526,526,527,527,527,527,527,527,527,528,528,528,528,528,528,529,529,529,529,529,529,529,530,530,530,530,530,530,530,531,531,531,531,531,531,531,532,532,532,532,532,532,533,533,533,533,533,533,533,534,534,534,534,534,534,534,535,535,535,535,535,535,535,536,536,536,536,536,536,537,537,537,537,537,537,537,538,538,538,538,538,538,538,539,539,539,539,539,539,539,540,540,540,540,540,540,540,541,541,541,541,541,541,542,542,542,542,542,542,542,543,543,543,543,543,543,543,544,544,544,544,544,544,544,545,545,545,545,545,545,545,546,546,546,546,546,546,546,547,547,547,547,547,547,548,548,548,548,548,548,548,549,549,549,549,549,549,549,550,550,550,550,550,550,550,551,551,551,551,551,551,551,552,552,552,552,552,552,552,553,553,553,553,553,553,553,554,554,554,554,554,554,554,555,555,555,555,555,555,556,556,556,556,556,556,556,557,557,557,557,557,557,557,558,558,558,558,558,558,558,559,559,559,559,559,559,559,560,560,560,560,560,560,560,561,561,561,561,561,561,561,562,562,562,562,562,562,562,563,563,563,563,563,563,563,564,564,564,564,564,564,564,565,565,565,565,565,565,565,566,566,566,566,566,566,566,567,567,567,567,567,567,567,568,568,568,568,568,568,568,569,569,569,569,569,569,569,570,570,570,570,570,570,571,571,571,571,571,571,571,572,572,572,572,572,572,572,573,573,573,573,573,573,573,574,574,574,574,574,574,574,575,575,575,575,575,575,575,576,576,576,576,576,576,576,577,577,577,577,577,577,577,578,578,578,578,578,578,578,578,579,579,579,579,579,579,579,580,580,580,580,580,580,580,581,581,581,581,581,581,581,582,582,582,582,582,582,582,583,583,583,583,583,583,583,584,584,584,584,584,584,584,585,585,585,585,585,585,585,586,586,586,586,586,586,586,587,587,587,587,587,587,587,588,588,588,588,588,588,588,589,589,589,589,589,589,589,590,590,590,590,590,590,590,591,591,591,591,591,591,591,592,592,592,592,592,592,592,592,593,593,593,593,593,593,593,594,594,594,594,594,594,594,595,595,595,595,595,595,595,596,596,596,596,596,596,596,597,597,597,597,597,597,597,598,598,598,598,598,598,598,599,599,599,599,599,599,599,600,600,600,600,600,600,600,600,601,601,601,601,601,601,601,602,602,602,602,602,602,602,603,603,603,603,603,603,603,604,604,604,604,604,604,604,605,605,605,605,605,605,605,605,606,606,606,606,606,606,606,607,607,607,607,607,607,607,608,608,608,608,608,608,608,609,609,609,609,609,609,609,610,610,610,610,610,610,610,610,611,611,611,611,611,611,611,612,612,612,612,612,612,612,613,613,613,613,613,613,613,614,614,614,614,614,614,614,614,615,615,615,615,615,615,615,616,616,616,616,616,616,616,617,617,617,617,617,617,617,617,618,618,618,618,618,618,618,619,619,619,619,619,619,619,620,620,620,620,620,620,620,621,621,621,621,621,621,621,621,622,622,622,622,622,622,622,623,623,623,623,623,623,623,624,624,624,624,624,624,624,624,625,625,625,625,625,625,625,626,626,626,626,626,626,626,627,627,627,627,627,627,627,627,628,628,628,628,628,628,628,629,629,629,629,629,629,629,629,630,630,630,630,630,630,630,631,631,631,631,631,631,631,632,632,632,632,632,632,632,632,633,633,633,633,633,633,633,634,634,634,634,634,634,634,635,635,635,635,635,635,635,635,636,636,636,636,636,636,636,637,637,637,637,637,637,637,637,638,638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,640,640,640,640,640,640,641,641,641,641,641,641,641,641,642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,644,644,644,644,644,644,644,645,645,645,645,645,645,645,645,646,646,646,646,646,646,646,647,647,647,647,647,647,647,647,648,648,648,648,648,648,648,649,649,649,649,649,649,649,649,650,650,650,650,650,650,650,651,651,651,651,651,651,651,651,652,652,652,652,652,652,652,653,653,653,653,653,653,653,653,654,654,654,654,654,654,654,655,655,655,655,655,655,655,655,656,656,656,656,656,656,656,656,657,657,657,657,657,657,657,658,658,658,658,658,658,658,658,659,659,659,659,659,659,659,660,660,660,660,660,660,660,660,661,661,661,661,661,661,661,661,662,662,662,662,662,662,662,663,663,663,663,663,663,663,663,664,664,664,664,664,664,664,664,665,665,665,665,665,665,665,666,666,666,666,666,666,666,666,667,667,667,667,667,667,667,667,668,668,668,668,668,668,668,669,669,669,669,669,669,669,669,670,670,670,670,670,670,670,670,671,671,671,671,671,671,671,671,672,672,672,672,672,672,672,673,673,673,673,673,673,673,673,674,674,674,674,674,674,674,674,675,675,675,675,675,675,675,675,676,676,676,676,676,676,676,677,677,677,677,677,677,677,677,678,678,678,678,678,678,678,678,679,679,679,679,679,679,679,679,680,680,680,680,680,680,680,680,681,681,681,681,681,681,681,681,682,682,682,682,682,682,682,683,683,683,683,683,683,683,683,684,684,684,684,684,684,684,684,685,685,685,685,685,685,685,685,686,686,686,686,686,686,686,686,687,687,687,687,687,687,687,687,688,688,688,688,688,688,688,688,689,689,689,689,689,689,689,689,690,690,690,690,690,690,690,691,691,691,691,691,691,691,691,692,692,692,692,692,692,692,692,693,693,693,693,693,693,693,693,694,694,694,694,694,694,694,694,695,695,695,695,695,695,695,695,696,696,696,696,696,696,696,696,697,697,697,697,697,697,697,697,698,698,698,698,698,698,698,698,699,699,699,699,699,699,699,699,700,700,700,700,700,700,700,700,701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702,703,703,703,703,703,703,703,703,704,704,704,704,704,704,704,704,705,705,705,705,705,705,705,705,705,706,706,706,706,706,706,706,706,707,707,707,707,707,707,707,707,708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709,710,710,710,710,710,710,710,710,711,711,711,711,711,711,711,711,712,712,712,712,712,712,712,712,713,713,713,713,713,713,713,713,713,714,714,714,714,714,714,714,714,715,715,715,715,715,715,715,715,716,716,716,716,716,716,716,716,717,717,717,717,717,717,717,717,718,718,718,718,718,718,718,718,718,719,719,719,719,719,719,719,719,720,720,720,720,720,720,720,720,721,721,721,721,721,721,721,721,722,722,722,722,722,722,722,722,722,723,723,723,723,723,723,723,723,724,724,724,724,724,724,724,724,725,725,725,725,725,725,725,725,725,726,726,726,726,726,726,726,726,727,727,727,727,727,727,727,727,728,728,728,728,728,728,728,728,728,729,729,729,729,729,729,729,729,730,730,730,730,730,730,730,730,730,731,731,731,731,731,731,731,731,732,732,732,732,732,732,732,732,733,733,733,733,733,733,733,733,733,734,734,734,734,734,734,734,734,735,735,735,735,735,735,735,735,735,736,736,736,736,736,736,736,736,737,737,737,737,737,737,737,737,737,738,738,738,738,738,738,738,738,739,739,739,739,739,739,739,739,739,740,740,740,740,740,740,740,740,741,741,741,741,741,741,741,741,741,742,742,742,742,742,742,742,742,743,743,743,743,743,743,743,743,743,744,744,744,744,744,744,744,744,745,745,745,745,745,745,745,745,745,746,746,746,746,746,746,746,746,746,747,747,747,747,747,747,747,747,748,748,748,748,748,748,748,748,748,749,749,749,749,749,749,749,749,749,750,750,750,750,750,750,750,750,751,751,751,751,751,751,751,751,751,752,752,752,752,752,752,752,752,752,753,753,753,753,753,753,753,753,754,754,754,754,754,754,754,754,754,755,755,755,755,755,755,755,755,755,756,756,756,756,756,756,756,756,756,757,757,757,757,757,757,757,757,758,758,758,758,758,758,758,758,758,759,759,759,759,759,759,759,759,759,760,760,760,760,760,760,760,760,760,761,761,761,761,761,761,761,761,761,762,762,762,762,762,762,762,762,763,763,763,763,763,763,763,763,763,764,764,764,764,764,764,764,764,764,765,765,765,765,765,765,765,765,765,766,766,766,766,766,766,766,766,766,767,767,767,767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,769,769,769,769,769,769,769,769,769,770,770,770,770,770,770,770,770,770,771,771,771,771,771,771,771,771,771,772,772,772,772,772,772,772,772,772,773,773,773,773,773,773,773,773,773,774,774,774,774,774,774,774,774,774,775,775,775,775,775,775,775,775,775,776,776,776,776,776,776,776,776,776,777,777,777,777,777,777,777,777,777,778,778,778,778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779,780,780,780,780,780,780,780,780,780,781,781,781,781,781,781,781,781,781,782,782,782,782,782,782,782,782,782,783,783,783,783,783,783,783,783,783,784,784,784,784,784,784,784,784,784,784,785,785,785,785,785,785,785,785,785,786,786,786,786,786,786,786,786,786,787,787,787,787,787,787,787,787,787,788,788,788,788,788,788,788,788,788,788,789,789,789,789,789,789,789,789,789,790,790,790,790,790,790,790,790,790,791,791,791,791,791,791,791,791,791,791,792,792,792,792,792,792,792,792,792,793,793,793,793,793,793,793,793,793,793,794,794,794,794,794,794,794,794,794,795,795,795,795,795,795,795,795,795,796,796,796,796,796,796,796,796,796,796,797,797,797,797,797,797,797,797,797,798,798,798,798,798,798,798,798,798,798,799,799,799,799,799,799,799,799,799,799,800,800,800,800,800,800,800,800,800,801,801,801,801,801,801,801,801,801,801,802,802,802,802,802,802,802,802,802,803,803,803,803,803,803,803,803,803,803,804,804,804,804,804,804,804,804,804,804,805,805,805,805,805,805,805,805,805,806,806,806,806,806,806,806,806,806,806,807,807,807,807,807,807,807,807,807,807,808,808,808,808,808,808,808,808,808,809,809,809,809,809,809,809,809,809,809,810,810,810,810,810,810,810,810,810,810,811,811,811,811,811,811,811,811,811,811,812,812,812,812,812,812,812,812,812,812,813,813,813,813,813,813,813,813,813,814,814,814,814,814,814,814,814,814,814,815,815,815,815,815,815,815,815,815,815,816,816,816,816,816,816,816,816,816,816,817,817,817,817,817,817,817,817,817,817,818,818,818,818,818,818,818,818,818,818,819,819,819,819,819,819,819,819,819,819,820,820,820,820,820,820,820,820,820,820,821,821,821,821,821,821,821,821,821,821,822,822,822,822,822,822,822,822,822,822,823,823,823,823,823,823,823,823,823,823,824,824,824,824,824,824,824,824,824,824,825,825,825,825,825,825,825,825,825,825,825,826,826,826,826,826,826,826,826,826,826,827,827,827,827,827,827,827,827,827,827,828,828,828,828,828,828,828,828,828,828,829,829,829,829,829,829,829,829,829,829,830,830,830,830,830,830,830,830,830,830,830,831,831,831,831,831,831,831,831,831,831,832,832,832,832,832,832,832,832,832,832,833,833,833,833,833,833,833,833,833,833,833,834,834,834,834,834,834,834,834,834,834,835,835,835,835,835,835,835,835,835,835,835,836,836,836,836,836,836,836,836,836,836,837,837,837,837,837,837,837,837,837,837,838,838,838,838,838,838,838,838,838,838,838,839,839,839,839,839,839,839,839,839,839,839,840,840,840,840,840,840,840,840,840,840,841,841,841,841,841,841,841,841,841,841,841,842,842,842,842,842,842,842,842,842,842,843,843,843,843,843,843,843,843,843,843,843,844,844,844,844,844,844,844,844,844,844,844,845,845,845,845,845,845,845,845,845,845,846,846,846,846,846,846,846,846,846,846,846,847,847,847,847,847,847,847,847,847,847,847,848,848,848,848,848,848,848,848,848,848,848,849,849,849,849,849,849,849,849,849,849,849,850,850,850,850,850,850,850,850,850,850,850,851,851,851,851,851,851,851,851,851,851,852,852,852,852,852,852,852,852,852,852,852,853,853,853,853,853,853,853,853,853,853,853,854,854,854,854,854,854,854,854,854,854,854,855,855,855,855,855,855,855,855,855,855,855,855,856,856,856,856,856,856,856,856,856,856,856,857,857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858,858,858,858,858,858,859,859,859,859,859,859,859,859,859,859,859,860,860,860,860,860,860,860,860,860,860,860,861,861,861,861,861,861,861,861,861,861,861,861,862,862,862,862,862,862,862,862,862,862,862,863,863,863,863,863,863,863,863,863,863,863,864,864,864,864,864,864,864,864,864,864,864,864,865,865,865,865,865,865,865,865,865,865,865,866,866,866,866,866,866,866,866,866,866,866,866,867,867,867,867,867,867,867,867,867,867,867,868,868,868,868,868,868,868,868,868,868,868,868,869,869,869,869,869,869,869,869,869,869,869,870,870,870,870,870,870,870,870,870,870,870,870,871,871,871,871,871,871,871,871,871,871,871,871,872,872,872,872,872,872,872,872,872,872,872,873,873,873,873,873,873,873,873,873,873,873,873,874,874,874,874,874,874,874,874,874,874,874,874,875,875,875,875,875,875,875,875,875,875,875,875,876,876,876,876,876,876,876,876,876,876,876,876,877,877,877,877,877,877,877,877,877,877,877,877,878,878,878,878,878,878,878,878,878,878,878,878,879,879,879,879,879,879,879,879,879,879,879,879,880,880,880,880,880,880,880,880,880,880,880,880,881,881,881,881,881,881,881,881,881,881,881,881,882,882,882,882,882,882,882,882,882,882,882,882,883,883,883,883,883,883,883,883,883,883,883,883,884,884,884,884,884,884,884,884,884,884,884,884,884,885,885,885,885,885,885,885,885,885,885,885,885,886,886,886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887,887,887,887,887,887,887,887,888,888,888,888,888,888,888,888,888,888,888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,890,890,890,890,890,890,890,890,890,890,890,890,891,891,891,891,891,891,891,891,891,891,891,891,891,892,892,892,892,892,892,892,892,892,892,892,892,892,893,893,893,893,893,893,893,893,893,893,893,893,893,894,894,894,894,894,894,894,894,894,894,894,894,895,895,895,895,895,895,895,895,895,895,895,895,895,896,896,896,896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,897,897,897,897,897,897,897,897,898,898,898,898,898,898,898,898,898,898,898,898,898,899,899,899,899,899,899,899,899,899,899,899,899,899,900,900,900,900,900,900,900,900,900,900,900,900,900,901,901,901,901,901,901,901,901,901,901,901,901,901,901,902,902,902,902,902,902,902,902,902,902,902,902,902,903,903,903,903,903,903,903,903,903,903,903,903,903,904,904,904,904,904,904,904,904,904,904,904,904,904,904,905,905,905,905,905,905,905,905,905,905,905,905,905,906,906,906,906,906,906,906,906,906,906,906,906,906,906,907,907,907,907,907,907,907,907,907,907,907,907,907,907,908,908,908,908,908,908,908,908,908,908,908,908,908,909,909,909,909,909,909,909,909,909,909,909,909,909,909,910,910,910,910,910,910,910,910,910,910,910,910,910,910,911,911,911,911,911,911,911,911,911,911,911,911,911,911,912,912,912,912,912,912,912,912,912,912,912,912,912,912,913,913,913,913,913,913,913,913,913,913,913,913,913,913,914,914,914,914,914,914,914,914,914,914,914,914,914,914,915,915,915,915,915,915,915,915,915,915,915,915,915,915,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,917,917,917,917,917,917,917,917,917,917,917,917,917,917,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,919,919,919,919,919,919,919,919,919,919,919,919,919,919,920,920,920,920,920,920,920,920,920,920,920,920,920,920,920,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,922,922,922,922,922,922,922,922,922,922,922,922,922,922,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,930,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,942,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,943,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,947,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,951,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,953,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,956,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,962,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,963,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,965,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,966,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,967,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,973,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,975,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,976,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,977,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,978,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,979,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,980,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,981,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,982,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,984,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,985,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,988,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,989,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,991,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,994,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,1000] data modify storage gm4_player_motion:arcsine arr set value [1000,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,998,997,997,997,997,997,997,997,997,997,997,997,997,997,997,996,996,996,996,996,996,996,996,996,996,996,996,995,995,995,995,995,995,995,995,995,995,994,994,994,994,994,994,994,994,994,994,993,993,993,993,993,993,993,993,993,992,992,992,992,992,992,992,992,991,991,991,991,991,991,991,990,990,990,990,990,990,990,990,989,989,989,989,989,989,988,988,988,988,988,988,988,987,987,987,987,987,987,986,986,986,986,986,986,985,985,985,985,985,985,984,984,984,984,984,984,983,983,983,983,983,982,982,982,982,982,981,981,981,981,981,981,980,980,980,980,979,979,979,979,979,978,978,978,978,978,977,977,977,977,977,976,976,976,976,975,975,975,975,975,974,974,974,974,973,973,973,973,972,972,972,972,971,971,971,971,971,970,970,970,970,969,969,969,969,968,968,968,967,967,967,967,966,966,966,966,965,965,965,965,964,964,964,963,963,963,963,962,962,962,962,961,961,961,960,960,960,960,959,959,959,958,958,958,957,957,957,957,956,956,956,955,955,955,954,954,954,953,953,953,952,952,952,952,951,951,951,950,950,950,949,949,949,948,948,948,947,947,947,946,946,946,945,945,945,944,944,943,943,943,942,942,942,941,941,941,940,940,940,939,939,938,938,938,937,937,937,936,936,936,935,935,934,934,934,933,933,932,932,932,931,931,931,930,930,929,929,929,928,928,927,927,927,926,926,925,925,924,924,924,923,923,922,922,922,921,921,920,920,919,919,919,918,918,917,917,916,916,916,915,915,914,914,913,913,912,912,912,911,911,910,910,909,909,908,908,907,907,907,906,906,905,905,904,904,903,903,902,902,901,901,900,900,899,899,898,898,897,897,897,896,896,895,895,894,894,893,893,892,892,891,891,890,889,889,888,888,887,887,886,886,885,885,884,884,883,883,882,882,881,881,880,879,879,878,878,877,877,876,876,875,875,874,873,873,872,872,871,871,870,870,869,868,868,867,867,866,866,865,864,864,863,863,862,861,861,860,860,859,858,858,857,857,856,855,855,854,854,853,852,852,851,851,850,849,849,848,847,847,846,846,845,844,844,843,842,842,841,841,840,839,839,838,837,837,836,835,835,834,833,833,832,831,831,830,829,829,828,827,827,826,825,825,824,823,823,822,821,820,820,819,818,818,817,816,816,815,814,813,813,812,811,811,810,809,808,808,807,806,805,805,804,803,802,802,801,800,800,799,798,797,796,796,795,794,793,793,792,791,790,790,789,788,787,786,786,785,784,783,783,782,781,780,779,779,778,777,776,775,774,774,773,772,771,770,770,769,768,767,766,765,765,764,763,762,761,760,759,759,758,757,756,755,754,753,753,752,751,750,749,748,747,746,745,745,744,743,742,741,740,739,738,737,736,735,735,734,733,732,731,730,729,728,727,726,725,724,723,722,721,720,719,719,718,717,716,715,714,713,712,711,710,709,708,707,706,705,704,703,702,701,700,699,698,697,696,695,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,676,675,674,673,672,671,670,669,668,667,665,664,663,662,661,660,659,658,656,655,654,653,652,651,649,648,647,646,645,644,642,641,640,639,638,636,635,634,633,631,630,629,628,627,625,624,623,622,620,619,618,616,615,614,613,611,610,609,607,606,605,603,602,601,600,598,597,595,594,593,591,590,589,587,586,585,583,582,580,579,578,576,575,573,572,570,569,568,566,565,563,562,560,559,557,556,554,553,551,550,548,547,545,544,542,541,539,537,536,534,533,531,529,528,526,525,523,521,520,518,516,515,513,511,510,508,506,505,503,501,500,498,496,494,493,491,489,487,485,484,482,480,478,476,474,473,471,469,467,465,463,461,459,457,455,454,452,450,448,446,444,442,439,437,435,433,431,429,427,425,423,421,418,416,414,412,410,407,405,403,401,398,396,394,391,389,387,384,382,379,377,375,372,370,367,365,362,359,357,354,352,349,346,343,341,338,335,332,329,327,324,321,318,315,312,309,306,302,299,296,293,290,286,283,280,276,273,269,265,262,258,254,250,247,243,239,234,230,226,222,217,213,208,203,198,194,188,183,178,172,166,160,154,147,141,133,126,118,109,99,89,77,63,44,0] data modify storage gm4_player_motion:cosine arr set value [10000,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9998,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9997,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9996,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9995,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9994,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9993,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9992,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9991,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9990,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9989,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9988,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9987,9986,9986,9986,9986,9986,9986,9986,9986,9986,9986,9986,9985,9985,9985,9985,9985,9985,9985,9985,9985,9985,9984,9984,9984,9984,9984,9984,9984,9984,9984,9984,9984,9983,9983,9983,9983,9983,9983,9983,9983,9983,9983,9982,9982,9982,9982,9982,9982,9982,9982,9982,9981,9981,9981,9981,9981,9981,9981,9981,9981,9981,9980,9980,9980,9980,9980,9980,9980,9980,9980,9979,9979,9979,9979,9979,9979,9979,9979,9979,9978,9978,9978,9978,9978,9978,9978,9978,9978,9977,9977,9977,9977,9977,9977,9977,9977,9976,9976,9976,9976,9976,9976,9976,9976,9976,9975,9975,9975,9975,9975,9975,9975,9975,9974,9974,9974,9974,9974,9974,9974,9974,9973,9973,9973,9973,9973,9973,9973,9973,9972,9972,9972,9972,9972,9972,9972,9971,9971,9971,9971,9971,9971,9971,9971,9970,9970,9970,9970,9970,9970,9970,9969,9969,9969,9969,9969,9969,9969,9969,9968,9968,9968,9968,9968,9968,9968,9967,9967,9967,9967,9967,9967,9967,9966,9966,9966,9966,9966,9966,9966,9965,9965,9965,9965,9965,9965,9965,9964,9964,9964,9964,9964,9964,9964,9963,9963,9963,9963,9963,9963,9963,9962,9962,9962,9962,9962,9962,9961,9961,9961,9961,9961,9961,9961,9960,9960,9960,9960,9960,9960,9959,9959,9959,9959,9959,9959,9959,9958,9958,9958,9958,9958,9958,9957,9957,9957,9957,9957,9957,9956,9956,9956,9956,9956,9956,9955,9955,9955,9955,9955,9955,9954,9954,9954,9954,9954,9954,9953,9953,9953,9953,9953,9953,9952,9952,9952,9952,9952,9952,9951,9951,9951,9951,9951,9951,9950,9950,9950,9950,9950,9950,9949,9949,9949,9949,9949,9948,9948,9948,9948,9948,9948,9947,9947,9947,9947,9947,9947,9946,9946,9946,9946,9946,9945,9945,9945,9945,9945,9945,9944,9944,9944,9944,9944,9943,9943,9943,9943,9943,9943,9942,9942,9942,9942,9942,9941,9941,9941,9941,9941,9940,9940,9940,9940,9940,9939,9939,9939,9939,9939,9939,9938,9938,9938,9938,9938,9937,9937,9937,9937,9937,9936,9936,9936,9936,9936,9935,9935,9935,9935,9935,9934,9934,9934,9934,9934,9933,9933,9933,9933,9933,9932,9932,9932,9932,9932,9931,9931,9931,9931,9931,9930,9930,9930,9930,9930,9929,9929,9929,9929,9929,9928,9928,9928,9928,9927,9927,9927,9927,9927,9926,9926,9926,9926,9926,9925,9925,9925,9925,9925,9924,9924,9924,9924,9923,9923,9923,9923,9923,9922,9922,9922,9922,9922,9921,9921,9921,9921,9920,9920,9920,9920,9920,9919,9919,9919,9919,9918,9918,9918,9918,9918,9917,9917,9917,9917,9916,9916,9916,9916,9916,9915,9915,9915,9915,9914,9914,9914,9914,9913,9913,9913,9913,9913,9912,9912,9912,9912,9911,9911,9911,9911,9910,9910,9910,9910,9910,9909,9909,9909,9909,9908,9908,9908,9908,9907,9907,9907,9907,9907,9906,9906,9906,9906,9905,9905,9905,9905,9904,9904,9904,9904,9903,9903,9903,9903,9902,9902,9902,9902,9901,9901,9901,9901,9900,9900,9900,9900,9899,9899,9899,9899,9899,9898,9898,9898,9898,9897,9897,9897,9897,9896,9896,9896,9896,9895,9895,9895,9895,9894,9894,9894,9893,9893,9893,9893,9892,9892,9892,9892,9891,9891,9891,9891,9890,9890,9890,9890,9889,9889,9889,9889,9888,9888,9888,9888,9887,9887,9887,9887,9886,9886,9886,9885,9885,9885,9885,9884,9884,9884,9884,9883,9883,9883,9883,9882,9882,9882,9882,9881,9881,9881,9880,9880,9880,9880,9879,9879,9879,9879,9878,9878,9878,9877,9877,9877,9877,9876,9876,9876,9876,9875,9875,9875,9874,9874,9874,9874,9873,9873,9873,9873,9872,9872,9872,9871,9871,9871,9871,9870,9870,9870,9869,9869,9869,9869,9868,9868,9868,9867,9867,9867,9867,9866,9866,9866,9866,9865,9865,9865,9864,9864,9864,9864,9863,9863,9863,9862,9862,9862,9861,9861,9861,9861,9860,9860,9860,9859,9859,9859,9859,9858,9858,9858,9857,9857,9857,9857,9856,9856,9856,9855,9855,9855,9854,9854,9854,9854,9853,9853,9853,9852,9852,9852,9851,9851,9851,9851,9850,9850,9850,9849,9849,9849,9848,9848,9848,9848,9847,9847,9847,9846,9846,9846,9845,9845,9845,9845,9844,9844,9844,9843,9843,9843,9842,9842,9842,9841,9841,9841,9841,9840,9840,9840,9839,9839,9839,9838,9838,9838,9837,9837,9837,9836,9836,9836,9836,9835,9835,9835,9834,9834,9834,9833,9833,9833,9832,9832,9832,9831,9831,9831,9830,9830,9830,9829,9829,9829,9829,9828,9828,9828,9827,9827,9827,9826,9826,9826,9825,9825,9825,9824,9824,9824,9823,9823,9823,9822,9822,9822,9821,9821,9821,9820,9820,9820,9819,9819,9819,9818,9818,9818,9817,9817,9817,9816,9816,9816,9815,9815,9815,9814,9814,9814,9813,9813,9813,9812,9812,9812,9811,9811,9811,9810,9810,9810,9809,9809,9809,9808,9808,9808,9807,9807,9807,9806,9806,9806,9805,9805,9805,9804,9804,9804,9803,9803,9803,9802,9802,9802,9801,9801,9800,9800,9800,9799,9799,9799,9798,9798,9798,9797,9797,9797,9796,9796,9796,9795,9795,9795,9794,9794,9793,9793,9793,9792,9792,9792,9791,9791,9791,9790,9790,9790,9789,9789,9789,9788,9788,9787,9787,9787,9786,9786,9786,9785,9785,9785,9784,9784,9784,9783,9783,9782,9782,9782,9781,9781,9781,9780,9780,9780,9779,9779,9778,9778,9778,9777,9777,9777,9776,9776,9775,9775,9775,9774,9774,9774,9773,9773,9773,9772,9772,9771,9771,9771,9770,9770,9770,9769,9769,9768,9768,9768,9767,9767,9767,9766,9766,9765,9765,9765,9764,9764,9764,9763,9763,9762,9762,9762,9761,9761,9761,9760,9760,9759,9759,9759,9758,9758,9758,9757,9757,9756,9756,9756,9755,9755,9754,9754,9754,9753,9753,9753,9752,9752,9751,9751,9751,9750,9750,9749,9749,9749,9748,9748,9748,9747,9747,9746,9746,9746,9745,9745,9744,9744,9744,9743,9743,9742,9742,9742,9741,9741,9740,9740,9740,9739,9739,9738,9738,9738,9737,9737,9736,9736,9736,9735,9735,9734,9734,9734,9733,9733,9732,9732,9732,9731,9731,9730,9730,9730,9729,9729,9728,9728,9728,9727,9727,9726,9726,9726,9725,9725,9724,9724,9724,9723,9723,9722,9722,9722,9721,9721,9720,9720,9720,9719,9719,9718,9718,9717,9717,9717,9716,9716,9715,9715,9715,9714,9714,9713,9713,9713,9712,9712,9711,9711,9710,9710,9710,9709,9709,9708,9708,9708,9707,9707,9706,9706,9705,9705,9705,9704,9704,9703,9703,9702,9702,9702,9701,9701,9700,9700,9699,9699,9699,9698,9698,9697,9697,9697,9696,9696,9695,9695,9694,9694,9694,9693,9693,9692,9692,9691,9691,9691,9690,9690,9689,9689,9688,9688,9687,9687,9687,9686,9686,9685,9685,9684,9684,9684,9683,9683,9682,9682,9681,9681,9681,9680,9680,9679,9679,9678,9678,9677,9677,9677,9676,9676,9675,9675,9674,9674,9674,9673,9673,9672,9672,9671,9671,9670,9670,9670,9669,9669,9668,9668,9667,9667,9666,9666,9666,9665,9665,9664,9664,9663,9663,9662,9662,9661,9661,9661,9660,9660,9659,9659,9658,9658,9657,9657,9656,9656,9656,9655,9655,9654,9654,9653,9653,9652,9652,9651,9651,9651,9650,9650,9649,9649,9648,9648,9647,9647,9646,9646,9646,9645,9645,9644,9644,9643,9643,9642,9642,9641,9641,9640,9640,9640,9639,9639,9638,9638,9637,9637,9636,9636,9635,9635,9634,9634,9633,9633,9633,9632,9632,9631,9631,9630,9630,9629,9629,9628,9628,9627,9627,9626,9626,9625,9625,9625,9624,9624,9623,9623,9622,9622,9621,9621,9620,9620,9619,9619,9618,9618,9617,9617,9616,9616,9615,9615,9615,9614,9614,9613,9613,9612,9612,9611,9611,9610,9610,9609,9609,9608,9608,9607,9607,9606,9606,9605,9605,9604,9604,9603,9603,9602,9602,9601,9601,9600,9600,9600,9599,9599,9598,9598,9597,9597,9596,9596,9595,9595,9594,9594,9593,9593,9592,9592,9591,9591,9590,9590,9589,9589,9588,9588,9587,9587,9586,9586,9585,9585,9584,9584,9583,9583,9582,9582,9581,9581,9580,9580,9579,9579,9578,9578,9577,9577,9576,9576,9575,9575,9574,9574,9573,9573,9572,9572,9571,9571,9570,9570,9569,9569,9568,9568,9567,9567,9566,9566,9565,9565,9564,9564,9563,9563,9562,9562,9561,9561,9560,9559,9559,9558,9558,9557,9557,9556,9556,9555,9555,9554,9554,9553,9553,9552,9552,9551,9551,9550,9550,9549,9549,9548,9548,9547,9547,9546,9546,9545,9545,9544,9543,9543,9542,9542,9541,9541,9540,9540,9539,9539,9538,9538,9537,9537,9536,9536,9535,9535,9534,9534,9533,9532,9532,9531,9531,9530,9530,9529,9529,9528,9528,9527,9527,9526,9526,9525,9525,9524,9523,9523,9522,9522,9521,9521,9520,9520,9519,9519,9518,9518,9517,9517,9516,9515,9515,9514,9514,9513,9513,9512,9512,9511,9511,9510,9510,9509,9508,9508,9507,9507,9506,9506,9505,9505,9504,9504,9503,9502,9502,9501,9501,9500,9500,9499,9499,9498,9498,9497,9496,9496,9495,9495,9494,9494,9493,9493,9492,9492,9491,9490,9490,9489,9489,9488,9488,9487,9487,9486,9486,9485,9484,9484,9483,9483,9482,9482,9481,9481,9480,9479,9479,9478,9478,9477,9477,9476,9476,9475,9474,9474,9473,9473,9472,9472,9471,9470,9470,9469,9469,9468,9468,9467,9467,9466,9465,9465,9464,9464,9463,9463,9462,9461,9461,9460,9460,9459,9459,9458,9458,9457,9456,9456,9455,9455,9454,9454,9453,9452,9452,9451,9451,9450,9450,9449,9448,9448,9447,9447,9446,9446,9445,9444,9444,9443,9443,9442,9442,9441,9440,9440,9439,9439,9438,9438,9437,9436,9436,9435,9435,9434,9433,9433,9432,9432,9431,9431,9430,9429,9429,9428,9428,9427,9426,9426,9425,9425,9424,9424,9423,9422,9422,9421,9421,9420,9419,9419,9418,9418,9417,9417,9416,9415,9415,9414,9414,9413,9412,9412,9411,9411,9410,9409,9409,9408,9408,9407,9407,9406,9405,9405,9404,9404,9403,9402,9402,9401,9401,9400,9399,9399,9398,9398,9397,9396,9396,9395,9395,9394,9393,9393,9392,9392,9391,9390,9390,9389,9389,9388,9387,9387,9386,9386,9385,9384,9384,9383,9383,9382,9381,9381,9380,9380,9379,9378,9378,9377,9377,9376,9375,9375,9374,9374,9373,9372,9372,9371,9370,9370,9369,9369,9368,9367,9367,9366,9366,9365,9364,9364,9363,9363,9362,9361,9361,9360,9359,9359,9358,9358,9357,9356,9356,9355,9355,9354,9353,9353,9352,9351,9351,9350,9350,9349,9348,9348,9347,9347,9346,9345,9345,9344,9343,9343,9342,9342,9341,9340,9340,9339,9338,9338,9337,9337,9336,9335,9335,9334,9333,9333,9332,9332,9331,9330,9330,9329,9328,9328,9327,9327,9326,9325,9325,9324,9323,9323,9322,9321,9321,9320,9320,9319,9318,9318,9317,9316,9316,9315,9315,9314,9313,9313,9312,9311,9311,9310,9309,9309,9308,9308,9307,9306,9306,9305,9304,9304,9303,9302,9302,9301,9300,9300,9299,9299,9298,9297,9297,9296,9295,9295,9294,9293,9293,9292,9291,9291,9290,9290,9289,9288,9288,9287,9286,9286,9285,9284,9284,9283,9282,9282,9281,9280,9280,9279,9279,9278,9277,9277,9276,9275,9275,9274,9273,9273,9272,9271,9271,9270,9269,9269,9268,9267,9267,9266,9265,9265,9264,9263,9263,9262,9261,9261,9260,9260,9259,9258,9258,9257,9256,9256,9255,9254,9254,9253,9252,9252,9251,9250,9250,9249,9248,9248,9247,9246,9246,9245,9244,9244,9243,9242,9242,9241,9240,9240,9239,9238,9238,9237,9236,9236,9235,9234,9234,9233,9232,9232,9231,9230,9230,9229,9228,9228,9227,9226,9226,9225,9224,9224,9223,9222,9222,9221,9220,9219,9219,9218,9217,9217,9216,9215,9215,9214,9213,9213,9212,9211,9211,9210,9209,9209,9208,9207,9207,9206,9205,9205,9204,9203,9203,9202,9201,9200,9200,9199,9198,9198,9197,9196,9196,9195,9194,9194,9193,9192,9192,9191,9190,9189,9189,9188,9187,9187,9186,9185,9185,9184,9183,9183,9182,9181,9181,9180,9179,9178,9178,9177,9176,9176,9175,9174,9174,9173,9172,9171,9171,9170,9169,9169,9168,9167,9167,9166,9165,9165,9164,9163,9162,9162,9161,9160,9160,9159,9158,9158,9157,9156,9155,9155,9154,9153,9153,9152,9151,9151,9150,9149,9148,9148,9147,9146,9146,9145,9144,9143,9143,9142,9141,9141,9140,9139,9139,9138,9137,9136,9136,9135,9134,9134,9133,9132,9131,9131,9130,9129,9129,9128,9127,9126,9126,9125,9124,9124,9123,9122,9121,9121,9120,9119,9119,9118,9117,9116,9116,9115,9114,9114,9113,9112,9111,9111,9110,9109,9108,9108,9107,9106,9106,9105,9104,9103,9103,9102,9101,9101,9100,9099,9098,9098,9097,9096,9095,9095,9094,9093,9093,9092,9091,9090,9090,9089,9088,9087,9087,9086,9085,9085,9084,9083,9082,9082,9081,9080,9079,9079,9078,9077,9077,9076,9075,9074,9074,9073,9072,9071,9071,9070,9069,9068,9068,9067,9066,9066,9065,9064,9063,9063,9062,9061,9060,9060,9059,9058,9057,9057,9056,9055,9054,9054,9053,9052,9051,9051,9050,9049,9049,9048,9047,9046,9046,9045,9044,9043,9043,9042,9041,9040,9040,9039,9038,9037,9037,9036,9035,9034,9034,9033,9032,9031,9031,9030,9029,9028,9028,9027,9026,9025,9025,9024,9023,9022,9022,9021,9020,9019,9019,9018,9017,9016,9016,9015,9014,9013,9013,9012,9011,9010,9010,9009,9008,9007,9006,9006,9005,9004,9003,9003,9002,9001,9000,9000,8999,8998,8997,8997,8996,8995,8994,8994,8993,8992,8991,8990,8990,8989,8988,8987,8987,8986,8985,8984,8984,8983,8982,8981,8981,8980,8979,8978,8977,8977,8976,8975,8974,8974,8973,8972,8971,8971,8970,8969,8968,8967,8967,8966,8965,8964,8964,8963,8962,8961,8960,8960,8959,8958,8957,8957,8956,8955,8954,8954,8953,8952,8951,8950,8950,8949,8948,8947,8947,8946,8945,8944,8943,8943,8942,8941,8940,8939,8939,8938,8937,8936,8936,8935,8934,8933,8932,8932,8931,8930,8929,8929,8928,8927,8926,8925,8925,8924,8923,8922,8921,8921,8920,8919,8918,8917,8917,8916,8915,8914,8914,8913,8912,8911,8910,8910,8909,8908,8907,8906,8906,8905,8904,8903,8902,8902,8901,8900,8899,8898,8898,8897,8896,8895,8894,8894,8893,8892,8891,8890,8890,8889,8888,8887,8886,8886,8885,8884,8883,8882,8882,8881,8880,8879,8878,8878,8877,8876,8875,8874,8874,8873,8872,8871,8870,8870,8869,8868,8867,8866,8866,8865,8864,8863,8862,8862,8861,8860,8859,8858,8857,8857,8856,8855,8854,8853,8853,8852,8851,8850,8849,8849,8848,8847,8846,8845,8844,8844,8843,8842,8841,8840,8840,8839,8838,8837,8836,8836,8835,8834,8833,8832,8831,8831,8830,8829,8828,8827,8827,8826,8825,8824,8823,8822,8822,8821,8820,8819,8818,8817,8817,8816,8815,8814,8813,8813,8812,8811,8810,8809,8808,8808,8807,8806,8805,8804,8803,8803,8802,8801,8800,8799,8798,8798,8797,8796,8795,8794,8793,8793,8792,8791,8790,8789,8789,8788,8787,8786,8785,8784,8784,8783,8782,8781,8780,8779,8778,8778,8777,8776,8775,8774,8773,8773,8772,8771,8770,8769,8768,8768,8767,8766,8765,8764,8763,8763,8762,8761,8760,8759,8758,8758,8757,8756,8755,8754,8753,8752,8752,8751,8750,8749,8748,8747,8747,8746,8745,8744,8743,8742,8741,8741,8740,8739,8738,8737,8736,8736,8735,8734,8733,8732,8731,8730,8730,8729,8728,8727,8726,8725,8724,8724,8723,8722,8721,8720,8719,8718,8718,8717,8716,8715,8714,8713,8712,8712,8711,8710,8709,8708,8707,8706,8706,8705,8704,8703,8702,8701,8700,8700,8699,8698,8697,8696,8695,8694,8694,8693,8692,8691,8690,8689,8688,8688,8687,8686,8685,8684,8683,8682,8681,8681,8680,8679,8678,8677,8676,8675,8675,8674,8673,8672,8671,8670,8669,8668,8668,8667,8666,8665,8664,8663,8662,8661,8661,8660,8659,8658,8657,8656,8655,8655,8654,8653,8652,8651,8650,8649,8648,8648,8647,8646,8645,8644,8643,8642,8641,8640,8640,8639,8638,8637,8636,8635,8634,8633,8633,8632,8631,8630,8629,8628,8627,8626,8626,8625,8624,8623,8622,8621,8620,8619,8618,8618,8617,8616,8615,8614,8613,8612,8611,8610,8610,8609,8608,8607,8606,8605,8604,8603,8602,8602,8601,8600,8599,8598,8597,8596,8595,8594,8594,8593,8592,8591,8590,8589,8588,8587,8586,8586,8585,8584,8583,8582,8581,8580,8579,8578,8577,8577,8576,8575,8574,8573,8572,8571,8570,8569,8568,8568,8567,8566,8565,8564,8563,8562,8561,8560,8559,8559,8558,8557,8556,8555,8554,8553,8552,8551,8550,8550,8549,8548,8547,8546,8545,8544,8543,8542,8541,8540,8540,8539,8538,8537,8536,8535,8534,8533,8532,8531,8530,8530,8529,8528,8527,8526,8525,8524,8523,8522,8521,8520,8520,8519,8518,8517,8516,8515,8514,8513,8512,8511,8510,8509,8509,8508,8507,8506,8505,8504,8503,8502,8501,8500,8499,8498,8498,8497,8496,8495,8494,8493,8492,8491,8490,8489,8488,8487,8486,8486,8485,8484,8483,8482,8481,8480,8479,8478,8477,8476,8475,8474,8474,8473,8472,8471,8470,8469,8468,8467,8466,8465,8464,8463,8462,8461,8461,8460,8459,8458,8457,8456,8455,8454,8453,8452,8451,8450,8449,8448,8447,8447,8446,8445,8444,8443,8442,8441,8440,8439,8438,8437,8436,8435,8434,8433,8432,8432,8431,8430,8429,8428,8427,8426,8425,8424,8423,8422,8421,8420,8419,8418,8417,8416,8416,8415,8414,8413,8412,8411,8410,8409,8408,8407,8406,8405,8404,8403,8402,8401,8400,8399,8399,8398,8397,8396,8395,8394,8393,8392,8391,8390,8389,8388,8387,8386,8385,8384,8383,8382,8381,8380,8380,8379,8378,8377,8376,8375,8374,8373,8372,8371,8370,8369,8368,8367,8366,8365,8364,8363,8362,8361,8360,8359,8359,8358,8357,8356,8355,8354,8353,8352,8351,8350,8349,8348,8347,8346,8345,8344,8343,8342,8341,8340,8339,8338,8337,8336,8335,8335,8334,8333,8332,8331,8330,8329,8328,8327,8326,8325,8324,8323,8322,8321,8320,8319,8318,8317,8316,8315,8314,8313,8312,8311,8310,8309,8308,8307,8306,8305,8304,8304,8303,8302,8301,8300,8299,8298,8297,8296,8295,8294,8293,8292,8291,8290,8289,8288,8287,8286,8285,8284,8283,8282,8281,8280,8279,8278,8277,8276,8275,8274,8273,8272,8271,8270,8269,8268,8267,8266,8265,8264,8263,8262,8261,8260,8259,8259,8258,8257,8256,8255,8254,8253,8252,8251,8250,8249,8248,8247,8246,8245,8244,8243,8242,8241,8240,8239,8238,8237,8236,8235,8234,8233,8232,8231,8230,8229,8228,8227,8226,8225,8224,8223,8222,8221,8220,8219,8218,8217,8216,8215,8214,8213,8212,8211,8210,8209,8208,8207,8206,8205,8204,8203,8202,8201,8200,8199,8198,8197,8196,8195,8194,8193,8192,8191,8190,8189,8188,8187,8186,8185,8184,8183,8182,8181,8180,8179,8178,8177,8176,8175,8174,8173,8172,8171,8170,8169,8168,8167,8166,8165,8164,8163,8162,8161,8160,8159,8158,8157,8156,8155,8154,8153,8152,8151,8150,8149,8148,8147,8146,8145,8144,8143,8142,8141,8140,8139,8138,8137,8136,8135,8134,8133,8132,8131,8129,8128,8127,8126,8125,8124,8123,8122,8121,8120,8119,8118,8117,8116,8115,8114,8113,8112,8111,8110,8109,8108,8107,8106,8105,8104,8103,8102,8101,8100,8099,8098,8097,8096,8095,8094,8093,8092,8091,8090,8089,8088,8087,8086,8085,8084,8082,8081,8080,8079,8078,8077,8076,8075,8074,8073,8072,8071,8070,8069,8068,8067,8066,8065,8064,8063,8062,8061,8060,8059,8058,8057,8056,8055,8054,8053,8052,8051,8049,8048,8047,8046,8045,8044,8043,8042,8041,8040,8039,8038,8037,8036,8035,8034,8033,8032,8031,8030,8029,8028,8027,8026,8025,8024,8022,8021,8020,8019,8018,8017,8016,8015,8014,8013,8012,8011,8010,8009,8008,8007,8006,8005,8004,8003,8002,8001,7999,7998,7997,7996,7995,7994,7993,7992,7991,7990,7989,7988,7987,7986,7985,7984,7983,7982,7981,7980,7978,7977,7976,7975,7974,7973,7972,7971,7970,7969,7968,7967,7966,7965,7964,7963,7962,7961,7960,7958,7957,7956,7955,7954,7953,7952,7951,7950,7949,7948,7947,7946,7945,7944,7943,7942,7940,7939,7938,7937,7936,7935,7934,7933,7932,7931,7930,7929,7928,7927,7926,7925,7923,7922,7921,7920,7919,7918,7917,7916,7915,7914,7913,7912,7911,7910,7909,7907,7906,7905,7904,7903,7902,7901,7900,7899,7898,7897,7896,7895,7894,7892,7891,7890,7889,7888,7887,7886,7885,7884,7883,7882,7881,7880,7879,7877,7876,7875,7874,7873,7872,7871,7870,7869,7868,7867,7866,7865,7863,7862,7861,7860,7859,7858,7857,7856,7855,7854,7853,7852,7851,7849,7848,7847,7846,7845,7844,7843,7842,7841,7840,7839,7838,7836,7835,7834,7833,7832,7831,7830,7829,7828,7827,7826,7824,7823,7822,7821,7820,7819,7818,7817,7816,7815,7814,7813,7811,7810,7809,7808,7807,7806,7805,7804,7803,7802,7801,7799,7798,7797,7796,7795,7794,7793,7792,7791,7790,7789,7787,7786,7785,7784,7783,7782,7781,7780,7779,7778,7776,7775,7774,7773,7772,7771,7770,7769,7768,7767,7765,7764,7763,7762,7761,7760,7759,7758,7757,7756,7754,7753,7752,7751,7750,7749,7748,7747,7746,7745,7743,7742,7741,7740,7739,7738,7737,7736,7735,7733,7732,7731,7730,7729,7728,7727,7726,7725,7724,7722,7721,7720,7719,7718,7717,7716,7715,7714,7712,7711,7710,7709,7708,7707,7706,7705,7704,7702,7701,7700,7699,7698,7697,7696,7695,7693,7692,7691,7690,7689,7688,7687,7686,7685,7683,7682,7681,7680,7679,7678,7677,7676,7675,7673,7672,7671,7670,7669,7668,7667,7666,7664,7663,7662,7661,7660,7659,7658,7657,7655,7654,7653,7652,7651,7650,7649,7648,7646,7645,7644,7643,7642,7641,7640,7639,7637,7636,7635,7634,7633,7632,7631,7630,7628,7627,7626,7625,7624,7623,7622,7621,7619,7618,7617,7616,7615,7614,7613,7611,7610,7609,7608,7607,7606,7605,7604,7602,7601,7600,7599,7598,7597,7596,7594,7593,7592,7591,7590,7589,7588,7587,7585,7584,7583,7582,7581,7580,7579,7577,7576,7575,7574,7573,7572,7571,7569,7568,7567,7566,7565,7564,7563,7561,7560,7559,7558,7557,7556,7555,7553,7552,7551,7550,7549,7548,7547,7545,7544,7543,7542,7541,7540,7539,7537,7536,7535,7534,7533,7532,7531,7529,7528,7527,7526,7525,7524,7522,7521,7520,7519,7518,7517,7516,7514,7513,7512,7511,7510,7509,7508,7506,7505,7504,7503,7502,7501,7499,7498,7497,7496,7495,7494,7493,7491,7490,7489,7488,7487,7486,7484,7483,7482,7481,7480,7479,7477,7476,7475,7474,7473,7472,7471,7469,7468,7467,7466,7465,7464,7462,7461,7460,7459,7458,7457,7455,7454,7453,7452,7451,7450,7448,7447,7446,7445,7444,7443,7441,7440,7439,7438,7437,7436,7434,7433,7432,7431,7430,7429,7427,7426,7425,7424,7423,7422,7420,7419,7418,7417,7416,7415,7413,7412,7411,7410,7409,7408,7406,7405,7404,7403,7402,7401,7399,7398,7397,7396,7395,7393,7392,7391,7390,7389,7388,7386,7385,7384,7383,7382,7381,7379,7378,7377,7376,7375,7373,7372,7371,7370,7369,7368,7366,7365,7364,7363,7362,7360,7359,7358,7357,7356,7355,7353,7352,7351,7350,7349,7347,7346,7345,7344,7343,7342,7340,7339,7338,7337,7336,7334,7333,7332,7331,7330,7328,7327,7326,7325,7324,7323,7321,7320,7319,7318,7317,7315,7314,7313,7312,7311,7309,7308,7307,7306,7305,7304,7302,7301,7300,7299,7298,7296,7295,7294,7293,7292,7290,7289,7288,7287,7286,7284,7283,7282,7281,7280,7278,7277,7276,7275,7274,7272,7271,7270,7269,7268,7266,7265,7264,7263,7262,7260,7259,7258,7257,7256,7254,7253,7252,7251,7250,7248,7247,7246,7245,7244,7242,7241,7240,7239,7238,7236,7235,7234,7233,7232,7230,7229,7228,7227,7226,7224,7223,7222,7221,7220,7218,7217,7216,7215,7213,7212,7211,7210,7209,7207,7206,7205,7204,7203,7201,7200,7199,7198,7197,7195,7194,7193,7192,7190,7189,7188,7187,7186,7184,7183,7182,7181,7180,7178,7177,7176,7175,7173,7172,7171,7170,7169,7167,7166,7165,7164,7163,7161,7160,7159,7158,7156,7155,7154,7153,7152,7150,7149,7148,7147,7145,7144,7143,7142,7141,7139,7138,7137,7136,7134,7133,7132,7131,7130,7128,7127,7126,7125,7123,7122,7121,7120,7119,7117,7116,7115,7114,7112,7111,7110,7109,7107,7106,7105,7104,7103,7101,7100,7099,7098,7096,7095,7094,7093,7092,7090,7089,7088,7087,7085,7084,7083,7082,7080,7079,7078,7077,7076,7074,7073,7072,7071,7069,7068,7067,7066,7064,7063,7062,7061,7059,7058,7057,7056,7055,7053,7052,7051,7050,7048,7047,7046,7045,7043,7042,7041,7040,7038,7037,7036,7035,7033,7032,7031,7030,7028,7027,7026,7025,7024,7022,7021,7020,7019,7017,7016,7015,7014,7012,7011,7010,7009,7007,7006,7005,7004,7002,7001,7000,6999,6997,6996,6995,6994,6992,6991,6990,6989,6987,6986,6985,6984,6982,6981,6980,6979,6977,6976,6975,6974,6972,6971,6970,6969,6967,6966,6965,6964,6962,6961,6960,6959,6957,6956,6955,6954,6952,6951,6950,6949,6947,6946,6945,6944,6942,6941,6940,6939,6937,6936,6935,6934,6932,6931,6930,6928,6927,6926,6925,6923,6922,6921,6920,6918,6917,6916,6915,6913,6912,6911,6910,6908,6907,6906,6905,6903,6902,6901,6899,6898,6897,6896,6894,6893,6892,6891,6889,6888,6887,6886,6884,6883,6882,6881,6879,6878,6877,6875,6874,6873,6872,6870,6869,6868,6867,6865,6864,6863,6861,6860,6859,6858,6856,6855,6854,6853,6851,6850,6849,6848,6846,6845,6844,6842,6841,6840,6839,6837,6836,6835,6834,6832,6831,6830,6828,6827,6826,6825,6823,6822,6821,6819,6818,6817,6816,6814,6813,6812,6811,6809,6808,6807,6805,6804,6803,6802,6800,6799,6798,6796,6795,6794,6793,6791,6790,6789,6788,6786,6785,6784,6782,6781,6780,6779,6777,6776,6775,6773,6772,6771,6770,6768,6767,6766,6764,6763,6762,6761,6759,6758,6757,6755,6754,6753,6752,6750,6749,6748,6746,6745,6744,6743,6741,6740,6739,6737,6736,6735,6733,6732,6731,6730,6728,6727,6726,6724,6723,6722,6721,6719,6718,6717,6715,6714,6713,6712,6710,6709,6708,6706,6705,6704,6702,6701,6700,6699,6697,6696,6695,6693,6692,6691,6690,6688,6687,6686,6684,6683,6682,6680,6679,6678,6677,6675,6674,6673,6671,6670,6669,6667,6666,6665,6664,6662,6661,6660,6658,6657,6656,6654,6653,6652,6651,6649,6648,6647,6645,6644,6643,6641,6640,6639,6637,6636,6635,6634,6632,6631,6630,6628,6627,6626,6624,6623,6622,6620,6619,6618,6617,6615,6614,6613,6611,6610,6609,6607,6606,6605,6603,6602,6601,6600,6598,6597,6596,6594,6593,6592,6590,6589,6588,6586,6585,6584,6582,6581,6580,6579,6577,6576,6575,6573,6572,6571,6569,6568,6567,6565,6564,6563,6561,6560,6559,6557,6556,6555,6554,6552,6551,6550,6548,6547,6546,6544,6543,6542,6540,6539,6538,6536,6535,6534,6532,6531,6530,6528,6527,6526,6524,6523,6522,6520,6519,6518,6517,6515,6514,6513,6511,6510,6509,6507,6506,6505,6503,6502,6501,6499,6498,6497,6495,6494,6493,6491,6490,6489,6487,6486,6485,6483,6482,6481,6479,6478,6477,6475,6474,6473,6471,6470,6469,6467,6466,6465,6463,6462,6461,6459,6458,6457,6455,6454,6453,6451,6450,6449,6447,6446,6445,6443,6442,6441,6439,6438,6437,6435,6434,6433,6431,6430,6429,6427,6426,6425,6423,6422,6421,6419,6418,6417,6415,6414,6413,6411,6410,6409,6407,6406,6405,6403,6402,6401,6399,6398,6397,6395,6394,6393,6391,6390,6389,6387,6386,6384,6383,6382,6380,6379,6378,6376,6375,6374,6372,6371,6370,6368,6367,6366,6364,6363,6362,6360,6359,6358,6356,6355,6354,6352,6351,6350,6348,6347,6345,6344,6343,6341,6340,6339,6337,6336,6335,6333,6332,6331,6329,6328,6327,6325,6324,6322,6321,6320,6318,6317,6316,6314,6313,6312,6310,6309,6308,6306,6305,6304,6302,6301,6299,6298,6297,6295,6294,6293,6291,6290,6289,6287,6286,6285,6283,6282,6280,6279,6278,6276,6275,6274,6272,6271,6270,6268,6267,6266,6264,6263,6261,6260,6259,6257,6256,6255,6253,6252,6251,6249,6248,6246,6245,6244,6242,6241,6240,6238,6237,6236,6234,6233,6231,6230,6229,6227,6226,6225,6223,6222,6221,6219,6218,6216,6215,6214,6212,6211,6210,6208,6207,6206,6204,6203,6201,6200,6199,6197,6196,6195,6193,6192,6190,6189,6188,6186,6185,6184,6182,6181,6179,6178,6177,6175,6174,6173,6171,6170,6168,6167,6166,6164,6163,6162,6160,6159,6157,6156,6155,6153,6152,6151,6149,6148,6146,6145,6144,6142,6141,6140,6138,6137,6135,6134,6133,6131,6130,6129,6127,6126,6124,6123,6122,6120,6119,6118,6116,6115,6113,6112,6111,6109,6108,6106,6105,6104,6102,6101,6100,6098,6097,6095,6094,6093,6091,6090,6088,6087,6086,6084,6083,6082,6080,6079,6077,6076,6075,6073,6072,6070,6069,6068,6066,6065,6064,6062,6061,6059,6058,6057,6055,6054,6052,6051,6050,6048,6047,6045,6044,6043,6041,6040,6039,6037,6036,6034,6033,6032,6030,6029,6027,6026,6025,6023,6022,6020,6019,6018,6016,6015,6013,6012,6011,6009,6008,6006,6005,6004,6002,6001,6000,5998,5997,5995,5994,5993,5991,5990,5988,5987,5986,5984,5983,5981,5980,5979,5977,5976,5974,5973,5972,5970,5969,5967,5966,5965,5963,5962,5960,5959,5958,5956,5955,5953,5952,5951,5949,5948,5946,5945,5944,5942,5941,5939,5938,5936,5935,5934,5932,5931,5929,5928,5927,5925,5924,5922,5921,5920,5918,5917,5915,5914,5913,5911,5910,5908,5907,5906,5904,5903,5901,5900,5899,5897,5896,5894,5893,5891,5890,5889,5887,5886,5884,5883,5882,5880,5879,5877,5876,5875,5873,5872,5870,5869,5867,5866,5865,5863,5862,5860,5859,5858,5856,5855,5853,5852,5850,5849,5848,5846,5845,5843,5842,5841,5839,5838,5836,5835,5833,5832,5831,5829,5828,5826,5825,5824,5822,5821,5819,5818,5816,5815,5814,5812,5811,5809,5808,5807,5805,5804,5802,5801,5799,5798,5797,5795,5794,5792,5791,5789,5788,5787,5785,5784,5782,5781,5780,5778,5777,5775,5774,5772,5771,5770,5768,5767,5765,5764,5762,5761,5760,5758,5757,5755,5754,5752,5751,5750,5748,5747,5745,5744,5742,5741,5740,5738,5737,5735,5734,5732,5731,5730,5728,5727,5725,5724,5722,5721,5720,5718,5717,5715,5714,5712,5711,5710,5708,5707,5705,5704,5702,5701,5699,5698,5697,5695,5694,5692,5691,5689,5688,5687,5685,5684,5682,5681,5679,5678,5677,5675,5674,5672,5671,5669,5668,5666,5665,5664,5662,5661,5659,5658,5656,5655,5653,5652,5651,5649,5648,5646,5645,5643,5642,5641,5639,5638,5636,5635,5633,5632,5630,5629,5628,5626,5625,5623,5622,5620,5619,5617,5616,5615,5613,5612,5610,5609,5607,5606,5604,5603,5602,5600,5599,5597,5596,5594,5593,5591,5590,5589,5587,5586,5584,5583,5581,5580,5578,5577,5576,5574,5573,5571,5570,5568,5567,5565,5564,5562,5561,5560,5558,5557,5555,5554,5552,5551,5549,5548,5546,5545,5544,5542,5541,5539,5538,5536,5535,5533,5532,5531,5529,5528,5526,5525,5523,5522,5520,5519,5517,5516,5515,5513,5512,5510,5509,5507,5506,5504,5503,5501,5500,5498,5497,5496,5494,5493,5491,5490,5488,5487,5485,5484,5482,5481,5480,5478,5477,5475,5474,5472,5471,5469,5468,5466,5465,5463,5462,5461,5459,5458,5456,5455,5453,5452,5450,5449,5447,5446,5444,5443,5441,5440,5439,5437,5436,5434,5433,5431,5430,5428,5427,5425,5424,5422,5421,5420,5418,5417,5415,5414,5412,5411,5409,5408,5406,5405,5403,5402,5400,5399,5397,5396,5395,5393,5392,5390,5389,5387,5386,5384,5383,5381,5380,5378,5377,5375,5374,5372,5371,5370,5368,5367,5365,5364,5362,5361,5359,5358,5356,5355,5353,5352,5350,5349,5347,5346,5344,5343,5342,5340,5339,5337,5336,5334,5333,5331,5330,5328,5327,5325,5324,5322,5321,5319,5318,5316,5315,5313,5312,5311,5309,5308,5306,5305,5303,5302,5300,5299,5297,5296,5294,5293,5291,5290,5288,5287,5285,5284,5282,5281,5279,5278,5276,5275,5274,5272,5271,5269,5268,5266,5265,5263,5262,5260,5259,5257,5256,5254,5253,5251,5250,5248,5247,5245,5244,5242,5241,5239,5238,5236,5235,5233,5232,5230,5229,5227,5226,5224,5223,5222,5220,5219,5217,5216,5214,5213,5211,5210,5208,5207,5205,5204,5202,5201,5199,5198,5196,5195,5193,5192,5190,5189,5187,5186,5184,5183,5181,5180,5178,5177,5175,5174,5172,5171,5169,5168,5166,5165,5163,5162,5160,5159,5157,5156,5154,5153,5151,5150,5148,5147,5145,5144,5142,5141,5139,5138,5136,5135,5133,5132,5130,5129,5127,5126,5124,5123,5121,5120,5118,5117,5115,5114,5112,5111,5109,5108,5106,5105,5103,5102,5100,5099,5097,5096,5094,5093,5091,5090,5088,5087,5085,5084,5082,5081,5079,5078,5076,5075,5073,5072,5070,5069,5067,5066,5064,5063,5061,5060,5058,5057,5055,5054,5052,5051,5049,5048,5046,5045,5043,5042,5040,5039,5037,5036,5034,5033,5031,5030,5028,5027,5025,5024,5022,5021,5019,5018,5016,5015,5013,5012,5010,5009,5007,5006,5004,5003,5001,5000,4998,4996,4995,4993,4992,4990,4989,4987,4986,4984,4983,4981,4980,4978,4977,4975,4974,4972,4971,4969,4968,4966,4965,4963,4962,4960,4959,4957,4956,4954,4953,4951,4950,4948,4947,4945,4943,4942,4940,4939,4937,4936,4934,4933,4931,4930,4928,4927,4925,4924,4922,4921,4919,4918,4916,4915,4913,4912,4910,4909,4907,4905,4904,4902,4901,4899,4898,4896,4895,4893,4892,4890,4889,4887,4886,4884,4883,4881,4880,4878,4877,4875,4874,4872,4870,4869,4867,4866,4864,4863,4861,4860,4858,4857,4855,4854,4852,4851,4849,4848,4846,4845,4843,4841,4840,4838,4837,4835,4834,4832,4831,4829,4828,4826,4825,4823,4822,4820,4819,4817,4816,4814,4812,4811,4809,4808,4806,4805,4803,4802,4800,4799,4797,4796,4794,4793,4791,4789,4788,4786,4785,4783,4782,4780,4779,4777,4776,4774,4773,4771,4770,4768,4766,4765,4763,4762,4760,4759,4757,4756,4754,4753,4751,4750,4748,4747,4745,4743,4742,4740,4739,4737,4736,4734,4733,4731,4730,4728,4727,4725,4723,4722,4720,4719,4717,4716,4714,4713,4711,4710,4708,4707,4705,4703,4702,4700,4699,4697,4696,4694,4693,4691,4690,4688,4687,4685,4683,4682,4680,4679,4677,4676,4674,4673,4671,4670,4668,4666,4665,4663,4662,4660,4659,4657,4656,4654,4653,4651,4649,4648,4646,4645,4643,4642,4640,4639,4637,4636,4634,4632,4631,4629,4628,4626,4625,4623,4622,4620,4619,4617,4615,4614,4612,4611,4609,4608,4606,4605,4603,4601,4600,4598,4597,4595,4594,4592,4591,4589,4588,4586,4584,4583,4581,4580,4578,4577,4575,4574,4572,4570,4569,4567,4566,4564,4563,4561,4560,4558,4557,4555,4553,4552,4550,4549,4547,4546,4544,4543,4541,4539,4538,4536,4535,4533,4532,4530,4529,4527,4525,4524,4522,4521,4519,4518,4516,4515,4513,4511,4510,4508,4507,4505,4504,4502,4500,4499,4497,4496,4494,4493,4491,4490,4488,4486,4485,4483,4482,4480,4479,4477,4476,4474,4472,4471,4469,4468,4466,4465,4463,4461,4460,4458,4457,4455,4454,4452,4451,4449,4447,4446,4444,4443,4441,4440,4438,4436,4435,4433,4432,4430,4429,4427,4426,4424,4422,4421,4419,4418,4416,4415,4413,4411,4410,4408,4407,4405,4404,4402,4400,4399,4397,4396,4394,4393,4391,4389,4388,4386,4385,4383,4382,4380,4379,4377,4375,4374,4372,4371,4369,4368,4366,4364,4363,4361,4360,4358,4357,4355,4353,4352,4350,4349,4347,4346,4344,4342,4341,4339,4338,4336,4335,4333,4331,4330,4328,4327,4325,4324,4322,4320,4319,4317,4316,4314,4312,4311,4309,4308,4306,4305,4303,4301,4300,4298,4297,4295,4294,4292,4290,4289,4287,4286,4284,4283,4281,4279,4278,4276,4275,4273,4272,4270,4268,4267,4265,4264,4262,4260,4259,4257,4256,4254,4253,4251,4249,4248,4246,4245,4243,4241,4240,4238,4237,4235,4234,4232,4230,4229,4227,4226,4224,4223,4221,4219,4218,4216,4215,4213,4211,4210,4208,4207,4205,4204,4202,4200,4199,4197,4196,4194,4192,4191,4189,4188,4186,4185,4183,4181,4180,4178,4177,4175,4173,4172,4170,4169,4167,4165,4164,4162,4161,4159,4158,4156,4154,4153,4151,4150,4148,4146,4145,4143,4142,4140,4138,4137,4135,4134,4132,4131,4129,4127,4126,4124,4123,4121,4119,4118,4116,4115,4113,4111,4110,4108,4107,4105,4104,4102,4100,4099,4097,4096,4094,4092,4091,4089,4088,4086,4084,4083,4081,4080,4078,4076,4075,4073,4072,4070,4068,4067,4065,4064,4062,4060,4059,4057,4056,4054,4053,4051,4049,4048,4046,4045,4043,4041,4040,4038,4037,4035,4033,4032,4030,4029,4027,4025,4024,4022,4021,4019,4017,4016,4014,4013,4011,4009,4008,4006,4005,4003,4001,4000,3998,3997,3995,3993,3992,3990,3989,3987,3985,3984,3982,3981,3979,3977,3976,3974,3973,3971,3969,3968,3966,3965,3963,3961,3960,3958,3957,3955,3953,3952,3950,3949,3947,3945,3944,3942,3941,3939,3937,3936,3934,3933,3931,3929,3928,3926,3924,3923,3921,3920,3918,3916,3915,3913,3912,3910,3908,3907,3905,3904,3902,3900,3899,3897,3896,3894,3892,3891,3889,3888,3886,3884,3883,3881,3879,3878,3876,3875,3873,3871,3870,3868,3867,3865,3863,3862,3860,3859,3857,3855,3854,3852,3851,3849,3847,3846,3844,3842,3841,3839,3838,3836,3834,3833,3831,3830,3828,3826,3825,3823,3821,3820,3818,3817,3815,3813,3812,3810,3809,3807,3805,3804,3802,3801,3799,3797,3796,3794,3792,3791,3789,3788,3786,3784,3783,3781,3780,3778,3776,3775,3773,3771,3770,3768,3767,3765,3763,3762,3760,3759,3757,3755,3754,3752,3750,3749,3747,3746,3744,3742,3741,3739,3737,3736,3734,3733,3731,3729,3728,3726,3725,3723,3721,3720,3718,3716,3715,3713,3712,3710,3708,3707,3705,3703,3702,3700,3699,3697,3695,3694,3692,3690,3689,3687,3686,3684,3682,3681,3679,3677,3676,3674,3673,3671,3669,3668,3666,3665,3663,3661,3660,3658,3656,3655,3653,3652,3650,3648,3647,3645,3643,3642,3640,3639,3637,3635,3634,3632,3630,3629,3627,3626,3624,3622,3621,3619,3617,3616,3614,3612,3611,3609,3608,3606,3604,3603,3601,3599,3598,3596,3595,3593,3591,3590,3588,3586,3585,3583,3582,3580,3578,3577,3575,3573,3572,3570,3569,3567,3565,3564,3562,3560,3559,3557,3555,3554,3552,3551,3549,3547,3546,3544,3542,3541,3539,3538,3536,3534,3533,3531,3529,3528,3526,3524,3523,3521,3520,3518,3516,3515,3513,3511,3510,3508,3506,3505,3503,3502,3500,3498,3497,3495,3493,3492,3490,3488,3487,3485,3484,3482,3480,3479,3477,3475,3474,3472,3470,3469,3467,3466,3464,3462,3461,3459,3457,3456,3454,3452,3451,3449,3448,3446,3444,3443,3441,3439,3438,3436,3434,3433,3431,3430,3428,3426,3425,3423,3421,3420,3418,3416,3415,3413,3411,3410,3408,3407,3405,3403,3402,3400,3398,3397,3395,3393,3392,3390,3389,3387,3385,3384,3382,3380,3379,3377,3375,3374,3372,3370,3369,3367,3366,3364,3362,3361,3359,3357,3356,3354,3352,3351,3349,3347,3346,3344,3343,3341,3339,3338,3336,3334,3333,3331,3329,3328,3326,3324,3323,3321,3319,3318,3316,3315,3313,3311,3310,3308,3306,3305,3303,3301,3300,3298,3296,3295,3293,3291,3290,3288,3287,3285,3283,3282,3280,3278,3277,3275,3273,3272,3270,3268,3267,3265,3263,3262,3260,3258,3257,3255,3254,3252,3250,3249,3247,3245,3244,3242,3240,3239,3237,3235,3234,3232,3230,3229,3227,3225,3224,3222,3221,3219,3217,3216,3214,3212,3211,3209,3207,3206,3204,3202,3201,3199,3197,3196,3194,3192,3191,3189,3187,3186,3184,3182,3181,3179,3178,3176,3174,3173,3171,3169,3168,3166,3164,3163,3161,3159,3158,3156,3154,3153,3151,3149,3148,3146,3144,3143,3141,3139,3138,3136,3134,3133,3131,3129,3128,3126,3125,3123,3121,3120,3118,3116,3115,3113,3111,3110,3108,3106,3105,3103,3101,3100,3098,3096,3095,3093,3091,3090,3088,3086,3085,3083,3081,3080,3078,3076,3075,3073,3071,3070,3068,3066,3065,3063,3061,3060,3058,3056,3055,3053,3051,3050,3048,3046,3045,3043,3041,3040,3038,3037,3035,3033,3032,3030,3028,3027,3025,3023,3022,3020,3018,3017,3015,3013,3012,3010,3008,3007,3005,3003,3002,3000,2998,2997,2995,2993,2992,2990,2988,2987,2985,2983,2982,2980,2978,2977,2975,2973,2972,2970,2968,2967,2965,2963,2962,2960,2958,2957,2955,2953,2952,2950,2948,2947,2945,2943,2942,2940,2938,2937,2935,2933,2932,2930,2928,2927,2925,2923,2922,2920,2918,2917,2915,2913,2912,2910,2908,2907,2905,2903,2902,2900,2898,2897,2895,2893,2891,2890,2888,2886,2885,2883,2881,2880,2878,2876,2875,2873,2871,2870,2868,2866,2865,2863,2861,2860,2858,2856,2855,2853,2851,2850,2848,2846,2845,2843,2841,2840,2838,2836,2835,2833,2831,2830,2828,2826,2825,2823,2821,2820,2818,2816,2815,2813,2811,2810,2808,2806,2804,2803,2801,2799,2798,2796,2794,2793,2791,2789,2788,2786,2784,2783,2781,2779,2778,2776,2774,2773,2771,2769,2768,2766,2764,2763,2761,2759,2758,2756,2754,2753,2751,2749,2747,2746,2744,2742,2741,2739,2737,2736,2734,2732,2731,2729,2727,2726,2724,2722,2721,2719,2717,2716,2714,2712,2711,2709,2707,2706,2704,2702,2700,2699,2697,2695,2694,2692,2690,2689,2687,2685,2684,2682,2680,2679,2677,2675,2674,2672,2670,2669,2667,2665,2663,2662,2660,2658,2657,2655,2653,2652,2650,2648,2647,2645,2643,2642,2640,2638,2637,2635,2633,2631,2630,2628,2626,2625,2623,2621,2620,2618,2616,2615,2613,2611,2610,2608,2606,2605,2603,2601,2599,2598,2596,2594,2593,2591,2589,2588,2586,2584,2583,2581,2579,2578,2576,2574,2573,2571,2569,2567,2566,2564,2562,2561,2559,2557,2556,2554,2552,2551,2549,2547,2546,2544,2542,2540,2539,2537,2535,2534,2532,2530,2529,2527,2525,2524,2522,2520,2519,2517,2515,2513,2512,2510,2508,2507,2505,2503,2502,2500,2498,2497,2495,2493,2491,2490,2488,2486,2485,2483,2481,2480,2478,2476,2475,2473,2471,2469,2468,2466,2464,2463,2461,2459,2458,2456,2454,2453,2451,2449,2447,2446,2444,2442,2441,2439,2437,2436,2434,2432,2431,2429,2427,2425,2424,2422,2420,2419,2417,2415,2414,2412,2410,2409,2407,2405,2403,2402,2400,2398,2397,2395,2393,2392,2390,2388,2387,2385,2383,2381,2380,2378,2376,2375,2373,2371,2370,2368,2366,2364,2363,2361,2359,2358,2356,2354,2353,2351,2349,2348,2346,2344,2342,2341,2339,2337,2336,2334,2332,2331,2329,2327,2325,2324,2322,2320,2319,2317,2315,2314,2312,2310,2308,2307,2305,2303,2302,2300,2298,2297,2295,2293,2292,2290,2288,2286,2285,2283,2281,2280,2278,2276,2275,2273,2271,2269,2268,2266,2264,2263,2261,2259,2258,2256,2254,2252,2251,2249,2247,2246,2244,2242,2241,2239,2237,2235,2234,2232,2230,2229,2227,2225,2223,2222,2220,2218,2217,2215,2213,2212,2210,2208,2206,2205,2203,2201,2200,2198,2196,2195,2193,2191,2189,2188,2186,2184,2183,2181,2179,2178,2176,2174,2172,2171,2169,2167,2166,2164,2162,2160,2159,2157,2155,2154,2152,2150,2149,2147,2145,2143,2142,2140,2138,2137,2135,2133,2132,2130,2128,2126,2125,2123,2121,2120,2118,2116,2114,2113,2111,2109,2108,2106,2104,2103,2101,2099,2097,2096,2094,2092,2091,2089,2087,2085,2084,2082,2080,2079,2077,2075,2073,2072,2070,2068,2067,2065,2063,2062,2060,2058,2056,2055,2053,2051,2050,2048,2046,2044,2043,2041,2039,2038,2036,2034,2032,2031,2029,2027,2026,2024,2022,2021,2019,2017,2015,2014,2012,2010,2009,2007,2005,2003,2002,2000,1998,1997,1995,1993,1991,1990,1988,1986,1985,1983,1981,1979,1978,1976,1974,1973,1971,1969,1968,1966,1964,1962,1961,1959,1957,1956,1954,1952,1950,1949,1947,1945,1944,1942,1940,1938,1937,1935,1933,1932,1930,1928,1926,1925,1923,1921,1920,1918,1916,1914,1913,1911,1909,1908,1906,1904,1902,1901,1899,1897,1896,1894,1892,1890,1889,1887,1885,1884,1882,1880,1878,1877,1875,1873,1872,1870,1868,1866,1865,1863,1861,1860,1858,1856,1854,1853,1851,1849,1848,1846,1844,1842,1841,1839,1837,1836,1834,1832,1830,1829,1827,1825,1824,1822,1820,1818,1817,1815,1813,1812,1810,1808,1806,1805,1803,1801,1800,1798,1796,1794,1793,1791,1789,1788,1786,1784,1782,1781,1779,1777,1776,1774,1772,1770,1769,1767,1765,1763,1762,1760,1758,1757,1755,1753,1751,1750,1748,1746,1745,1743,1741,1739,1738,1736,1734,1733,1731,1729,1727,1726,1724,1722,1721,1719,1717,1715,1714,1712,1710,1708,1707,1705,1703,1702,1700,1698,1696,1695,1693,1691,1690,1688,1686,1684,1683,1681,1679,1678,1676,1674,1672,1671,1669,1667,1665,1664,1662,1660,1659,1657,1655,1653,1652,1650,1648,1647,1645,1643,1641,1640,1638,1636,1634,1633,1631,1629,1628,1626,1624,1622,1621,1619,1617,1616,1614,1612,1610,1609,1607,1605,1603,1602,1600,1598,1597,1595,1593,1591,1590,1588,1586,1585,1583,1581,1579,1578,1576,1574,1572,1571,1569,1567,1566,1564,1562,1560,1559,1557,1555,1554,1552,1550,1548,1547,1545,1543,1541,1540,1538,1536,1535,1533,1531,1529,1528,1526,1524,1522,1521,1519,1517,1516,1514,1512,1510,1509,1507,1505,1503,1502,1500,1498,1497,1495,1493,1491,1490,1488,1486,1484,1483,1481,1479,1478,1476,1474,1472,1471,1469,1467,1466,1464,1462,1460,1459,1457,1455,1453,1452,1450,1448,1447,1445,1443,1441,1440,1438,1436,1434,1433,1431,1429,1428,1426,1424,1422,1421,1419,1417,1415,1414,1412,1410,1409,1407,1405,1403,1402,1400,1398,1396,1395,1393,1391,1390,1388,1386,1384,1383,1381,1379,1377,1376,1374,1372,1370,1369,1367,1365,1364,1362,1360,1358,1357,1355,1353,1351,1350,1348,1346,1345,1343,1341,1339,1338,1336,1334,1332,1331,1329,1327,1326,1324,1322,1320,1319,1317,1315,1313,1312,1310,1308,1306,1305,1303,1301,1300,1298,1296,1294,1293,1291,1289,1287,1286,1284,1282,1281,1279,1277,1275,1274,1272,1270,1268,1267,1265,1263,1261,1260,1258,1256,1255,1253,1251,1249,1248,1246,1244,1242,1241,1239,1237,1236,1234,1232,1230,1229,1227,1225,1223,1222,1220,1218,1216,1215,1213,1211,1210,1208,1206,1204,1203,1201,1199,1197,1196,1194,1192,1190,1189,1187,1185,1184,1182,1180,1178,1177,1175,1173,1171,1170,1168,1166,1164,1163,1161,1159,1158,1156,1154,1152,1151,1149,1147,1145,1144,1142,1140,1138,1137,1135,1133,1132,1130,1128,1126,1125,1123,1121,1119,1118,1116,1114,1112,1111,1109,1107,1106,1104,1102,1100,1099,1097,1095,1093,1092,1090,1088,1086,1085,1083,1081,1079,1078,1076,1074,1073,1071,1069,1067,1066,1064,1062,1060,1059,1057,1055,1053,1052,1050,1048,1047,1045,1043,1041,1040,1038,1036,1034,1033,1031,1029,1027,1026,1024,1022,1020,1019,1017,1015,1014,1012,1010,1008,1007,1005,1003,1001,1000,998,996,994,993,991,989,987,986,984,982,981,979,977,975,974,972,970,968,967,965,963,961,960,958,956,954,953,951,949,948,946,944,942,941,939,937,935,934,932,930,928,927,925,923,921,920,918,916,915,913,911,909,908,906,904,902,901,899,897,895,894,892,890,888,887,885,883,881,880,878,876,875,873,871,869,868,866,864,862,861,859,857,855,854,852,850,848,847,845,843,841,840,838,836,835,833,831,829,828,826,824,822,821,819,817,815,814,812,810,808,807,805,803,801,800,798,796,795,793,791,789,788,786,784,782,781,779,777,775,774,772,770,768,767,765,763,761,760,758,756,755,753,751,749,748,746,744,742,741,739,737,735,734,732,730,728,727,725,723,721,720,718,716,714,713,711,709,708,706,704,702,701,699,697,695,694,692,690,688,687,685,683,681,680,678,676,674,673,671,669,667,666,664,662,660,659,657,655,654,652,650,648,647,645,643,641,640,638,636,634,633,631,629,627,626,624,622,620,619,617,615,613,612,610,608,607,605,603,601,600,598,596,594,593,591,589,587,586,584,582,580,579,577,575,573,572,570,568,566,565,563,561,559,558,556,554,552,551,549,547,546,544,542,540,539,537,535,533,532,530,528,526,525,523,521,519,518,516,514,512,511,509,507,505,504,502,500,498,497,495,493,491,490,488,486,485,483,481,479,478,476,474,472,471,469,467,465,464,462,460,458,457,455,453,451,450,448,446,444,443,441,439,437,436,434,432,430,429,427,425,423,422,420,418,417,415,413,411,410,408,406,404,403,401,399,397,396,394,392,390,389,387,385,383,382,380,378,376,375,373,371,369,368,366,364,362,361,359,357,355,354,352,350,348,347,345,343,342,340,338,336,335,333,331,329,328,326,324,322,321,319,317,315,314,312,310,308,307,305,303,301,300,298,296,294,293,291,289,287,286,284,282,280,279,277,275,273,272,270,268,267,265,263,261,260,258,256,254,253,251,249,247,246,244,242,240,239,237,235,233,232,230,228,226,225,223,221,219,218,216,214,212,211,209,207,205,204,202,200,198,197,195,193,191,190,188,186,184,183,181,179,178,176,174,172,171,169,167,165,164,162,160,158,157,155,153,151,150,148,146,144,143,141,139,137,136,134,132,130,129,127,125,123,122,120,118,116,115,113,111,109,108,106,104,102,101,99,97,95,94,92,90,89,87,85,83,82,80,78,76,75,73,71,69,68,66,64,62,61,59,57,55,54,52,50,48,47,45,43,41,40,38,36,34,33,31,29,27,26,24,22,20,19,17,15,13,12,10,8,6,5,3,1,0] ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/load.mcfunction ================================================ # (GM4) moved from internal/technical/load # LOAD FUNCTION # STORAGE data modify storage gm4_player_motion:math unitvector set value [0.0d,0.0d,0.0d] data modify storage gm4_player_motion:math motion set value [0.0d,0.0d,0.0d] data modify storage gm4_player_motion:math pos set value [0.0d,0.0d,0.0d] # TICK FUNCTION schedule function gm4_player_motion:internal/technical/tick 1t append # SCORES scoreboard objectives add gm4_player_motion.api.launch dummy scoreboard objectives add gm4_player_motion.internal.dummy dummy scoreboard objectives add gm4_player_motion.internal.math dummy scoreboard objectives add gm4_player_motion.internal.math.sqrt dummy scoreboard objectives add gm4_player_motion.internal.const dummy scoreboard players set #constant.-1 gm4_player_motion.internal.const -1 scoreboard players set #constant.2 gm4_player_motion.internal.const 2 scoreboard players set #constant.10 gm4_player_motion.internal.const 10 scoreboard players set #constant.12 gm4_player_motion.internal.const 12 scoreboard players set #constant.1000 gm4_player_motion.internal.const 1000 scoreboard players set #constant.100 gm4_player_motion.internal.const 100 scoreboard players set #constant.fpc gm4_player_motion.internal.const 8000 scoreboard objectives add gm4_player_motion.internal.motion.x dummy scoreboard objectives add gm4_player_motion.internal.motion.y dummy scoreboard objectives add gm4_player_motion.internal.motion.z dummy scoreboard objectives add gm4_player_motion.internal.gamemode dummy # MARKER kill 9a347e6c-1ce5-434a-b717-6707d51f4299 # ^ (GM4) changed UUID to prevent potential conflict summon marker 29999998.0 0.0 7133.0 {UUID:[I; -1707835796, 484787018, -1223203065, -719371623], Tags:["smithed.strict", "smithed.entity"]} # ^ (GM4) changed position to GM4 forceloaded chunk and changed UUID to prevent potential conflict # TRIG LOOKUP TABLE: function gm4_player_motion:internal/technical/trig ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/resolve_load/launch_looking.mcfunction ================================================ execute if score gm4_player_motion load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_player_motion:api/launch_looking ================================================ FILE: lib_player_motion/data/gm4_player_motion/function/resolve_load/launch_xyz.mcfunction ================================================ execute if score gm4_player_motion load.status matches 1 if score gm4_lore_minor load.status matches 0.. run function gm4_player_motion:api/launch_xyz ================================================ FILE: lib_player_motion/data/gm4_player_motion/tags/function/launch_looking.json ================================================ { "values": [ "gm4_player_motion:resolve_load/launch_looking" ] } ================================================ FILE: lib_player_motion/data/gm4_player_motion/tags/function/launch_xyz.json ================================================ { "values": [ "gm4_player_motion:resolve_load/launch_xyz" ] } ================================================ FILE: lib_potion_tracking/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_potion_tracking/README.md ================================================ # lib_potion_tracking lib_potion_tracking is a mcfunction library that allows other data packs to track thrown splash or lingering potions. This can be used to create custom splash/lingering potion events. ## How to Use There are 2 function tags to be used: one to initially tag the potion to be tracked, and another which activates when the tracked potion lands. ### Marking the Potion to be Tracked The function tag `#gm4_potion_tracking:tag_potion` is used to tag potions. This function tag runs every tick `as @e[type=potion,tag=!gm4_potion_tracking_checked]` (all potions are tagged with `gm4_potion_tracking_checked`, so each potion is only checked once). Modules should add the tag `gm4_potion` to allow the library to track the potion. The entire entity data of the potion is stored in data storage under the namespace `gm4_potion_tracking:temp entity_data`. This storage can be used to verify the potion, but directly tagging the entity using a conditional `@s` is usually more efficient: ```mcfunction tag @s[tag=!gm4_potion,nbt={}] add gm4_potion ``` - Note that `tag=!gm4_potion` **should** be used before checking NBT, since multiple modules will be calling this function tag, thus checking for the tag first will prevent extra unnecessary nbt checks When the potion is tracked, a marker entity with the tag `gm4_potion_tracker` will be linked to the potion. The entire NBT data of the potion when it was thrown will be stored in the marker entity under the NBT `{data:{gm4_potion:{}}}`. #### Tagging Example The follow function will tag all invisibility splash/lingering potions for tracking: ```mcfunction tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{potion:"minecraft:invisibility"}}}}] add gm4_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{potion:"minecraft:long_invisibility"}}}}] add gm4_potion tag @s[tag=!gm4_potion,nbt={Item:{components:{"minecraft:potion_contents":{custom_effects:[{id:"minecraft:invisibility"}]}}}}] add gm4_potion ``` So if the potion was a splash potion of invisibility, the summoned marker will have the following nbt: `{data:{gm4_potion:{Item:{id:"minecraft:splash_potion",count:1,components:{"minecraft:potion_contents":{potion:"minecraft:invisibility"}}}}}}` ### Executing When the Potion Lands A function tag under the namespace `#gm4_potion_tracking:potion_landed` can be used to execute commands when the potion lands. This runs `as @e[type=marker,tag=gm4_potion_tracker] at @s`. When the potion lands, data storage under the namespace `gm4_potion_tracking:temp entity_data` is set to the original potion's entity nbt (set from the marker's entity NBT `{data:{gm4_potion:{}}}`). The storage should be used to verify if the potion matches the module's custom potion. The marker's entity nbt is available (This is `@s` in the context of the function tag), but storage look up is more efficient in almost all cases. #### Landing Example The following function will catch when invisibility potions hit something: ```mcfunction execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:potion_contents"{potion:"minecraft:invisibility"} run function ... execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:potion_contents"{potion:"minecraft:long_invisibility"} run function ... execute if data storage gm4_potion_tracking:temp entity_data.Item.components."minecraft:potion_contents"{custom_effects:[{id:"minecraft:invisibility"}]} run function ... ``` ## License This library, and the contents of the `lib_potion_tracking` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_potion_tracking/beet.yaml ================================================ id: gm4_potion_tracking name: Gamemode 4 Potion Tracking version: 1.4.X description: Allows other datapacks to track thrown splash or lingering potions. data_pack: load: data: data pipeline: - gm4.plugins.extend.library - gm4.plugins.include.lib_forceload meta: gm4: versioning: required: lib_forceload: 1.6.0 extra_version_injections: functions: [resolve_tick] smithed: pack_id: gm4_lib_potion_tracking credits: Creator: - BPR ================================================ FILE: lib_potion_tracking/data/gm4_forceload/tags/function/command_block_tick.json ================================================ { "values": [ "gm4_potion_tracking:resolve_tick" ] } ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/load.mcfunction ================================================ scoreboard objectives add gm4_potion_id dummy scoreboard objectives add gm4_potion_time dummy ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/potion.mcfunction ================================================ # executes commands as all potion entities # @s = all potion entities # located at world spawn # run from gm4_potion_tracking-1.0:tick # allow modules to check if potions should be tracked execute if entity @s[tag=!gm4_potion_tracking_checked] run function gm4_potion_tracking:track/check_potion # track custom potions execute if entity @s[tag=gm4_potion] at @s run function gm4_potion_tracking:track/potion ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/resolve_tick.mcfunction ================================================ # checks if potion_tracking module is loaded # @s = forceloaded command block # located at 29999998 1 7131 # run from function tag #gm4_forceload:command_block_tick execute if score gm4_potion_tracking load.status matches 1 run function gm4_potion_tracking:tick ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/tick.mcfunction ================================================ # finds custom gm4 potions # @s = forceloaded command block # located at 29999998 1 7131 # run from gm4_potion_tracking-1.0:resolve_tick # execute as all potions execute as @e[type=#gm4_potion_tracking:potion] run function gm4_potion_tracking:potion ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/check_marker.mcfunction ================================================ # checks potion_tracker markers # @s = none # located at world spawn # run from gm4_potion_tracking-1.0:track/potion execute as @e[type=marker,tag=gm4_potion_tracker] at @s run function gm4_potion_tracking:track/marker ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/check_potion.mcfunction ================================================ # checks if potions should be tracked # @s = all potions that haven't yet been checked # located at world spawn # run from gm4_potion_tracking-1.0:potion # set storage to be used when the function tag below is called data modify storage gm4_potion_tracking:temp entity_data set from entity @s {} # function tag to allow modules to tag their custom potions (add tag gm4_potion) function #gm4_potion_tracking:tag_potion # don't check this potion again tag @s add gm4_potion_tracking_checked ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/initialize_potion.mcfunction ================================================ # initializes potion with an id and potion tracker marker # @s = new custom potion # located at @s # run from gm4_potion_tracking-1.0:track/potion # give potion a score based on their UUID execute store result score @s gm4_potion_id run data get entity @s UUID[3] # summon potion tracker marker summon marker ~ ~ ~ {Tags:["gm4_potion_tracker","gm4_potion_tracker_new"]} # match potion tracker id to potion id scoreboard players operation @e[type=marker,tag=gm4_potion_tracker_new,limit=1] gm4_potion_id = @s gm4_potion_id # store entire potion data into marker data data modify entity @e[type=marker,tag=gm4_potion_tracker_new,limit=1] data.gm4_potion set from storage gm4_potion_tracking:temp entity_data # clean up tag @e[type=marker] remove gm4_potion_tracker_new data remove storage gm4_potion_tracking:temp entity_data ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/marker.mcfunction ================================================ # runs commands for all custom potion tracker markers # @s = potion tracker marker # located at @s # run from gm4_potion_tracking-1.0:track/check_marker # check if their potion still exists scoreboard players operation $current gm4_potion_id = @s gm4_potion_id scoreboard players set $match gm4_potion_id 0 execute as @e[type=#gm4_potion_tracking:potion,tag=gm4_potion] if score @s gm4_potion_id = $current gm4_potion_id run scoreboard players set $match gm4_potion_id 1 # if there is no matching potion, run their commands execute unless score $match gm4_potion_id matches 1 run function gm4_potion_tracking:track/potion_landed ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/potion.mcfunction ================================================ # runs commands for all custom potions # @s = custom gm4 potion (tag=gm4_potion) # located at @s # run from gm4_potion_tracking-1.0:potion # initialize potions execute unless score @s gm4_potion_id = @s gm4_potion_id run function gm4_potion_tracking:track/initialize_potion # constantly teleport potion tracker marker to the potion scoreboard players operation $current gm4_potion_id = @s gm4_potion_id execute as @e[type=marker,tag=gm4_potion_tracker] if score @s gm4_potion_id = $current gm4_potion_id run tp ~ ~ ~ # schedule potion tracker detection schedule function gm4_potion_tracking:track/check_marker 1t ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/function/track/potion_landed.mcfunction ================================================ # runs commands for landed custom potion tracker markers # @s = potion tracker marker # located at @s # run from gm4_potion_tracking-1.0:track/marker # run commands data modify storage gm4_potion_tracking:temp entity_data set from entity @s data.gm4_potion function #gm4_potion_tracking:potion_landed # clean up data remove storage gm4_potion_tracking:temp entity_data kill @s ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/tags/entity_type/potion.json ================================================ { "values": [ "minecraft:lingering_potion", "minecraft:splash_potion" ] } ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/tags/function/potion_landed.json ================================================ { "values": [] } ================================================ FILE: lib_potion_tracking/data/gm4_potion_tracking/tags/function/tag_potion.json ================================================ { "values": [] } ================================================ FILE: lib_potion_tracking/mod.mcdoc ================================================ use ::java::world::entity::projectile::throwable::Potion dispatch minecraft:storage[gm4_potion_tracking:temp] to struct { entity_data?: Potion, } ================================================ FILE: lib_trees/LICENSE.md ================================================ MIT License Copyright (c) 2021 Gamemode 4 Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: lib_trees/README.md ================================================ # lib_trees lib_trees is a mcfunction library that facilites the creation of custom trees. This library handles many of the functions required for growing custom trees from saplings: sapling placement and breaking, tree growth via saplings, and sapling drops from specific leaves. ## Example Pack The example data pack has everything required to use this library (except for full lantern load implementation). This document will refer to the example pack for specific details. ## Generating Trees with Worldgen This library does not handle generation of trees via worldgen, but information of how to generate trees to be used in conjunction of this library will be outlined below. Trees will need to be defined using custom structures. It is technically possible to use configured features (how normal trees generate), but the sapling drops become more complex. This will only outline the process using structures. Refer to the `worldgen`, `tags`, and `structures` folder of the example pack to set up custom structures. ### Leaf Markers The most important thing for custom trees to be usable with this data pack is to add leaf markers to your trees. Leaf markers must be created with the `gm4_tree_leaf` tag and an additional identifier tag: ```mcfunction summon marker ~ ~ ~ {Tags:["gm4_tree_leaf","LEAF_IDENTIFIER_TAG"]} ``` Markers can be placed in a few ways; this document will outline the 3 most reasonable ways. - Place a marker in every leaf - This may get laggy if your trees have a lot of leaves, but will allow the tree to be "fully custom" since normal leaf drops can be deleted and replaced. - Place a few markers manually - This is an option if you just want specific leaves to be able to drop saplings, but it will be the same for every tree - Use jigsaws to randomly select where markers should generate - This is a better option if you don't want every leaf to have a marker, since it will allow for random leaves to have a sapling drop chance. This is the method present in the example pack. - During worldgen, the location of these markers will be the same when using the same seed; this can be used to your advantage if you, for example, want fruit to generate at these leaves and have that be seed random. ## Custom Saplings ### Leaf Drops When a leaf marker is no longer in a leaf block, it will run the `#gm4_trees:destroy_leaf` function tag at the location of the leaf marker. The function tag should call a verification function to check if the marker was a custom marker from your data pack: ```mcfunction execute if entity @s[tag=LEAF_IDENTIFIER_TAG] run function ... ``` That should run a function that drops a sapling and kills the marker (`@s`). The easiest way to drop saplings is to use a loot table to drop a custom sapling upon a specific chance, as shown in the example pack: ```mcfunction loot spawn ~ ~ ~ loot ... kill @s ``` ### Placing Saplings Custom sapling items need some specific data so this library knows it's a custom sapling and should be tracked when placed. You can use a command like below, or a loot table, like in the example pack. A loot table is recommended since it's more versatile. ```mcfunction # any sapling type can be used give @s oak_sapling{gm4_trees:{item:{id:"sapling",type:"IDENTIFIER"}}} ``` When these custom saplings are placed, the library will find the placed sapling and run the `#gm4_trees:initialize_sapling` function tag at the location of the sapling. The function tag should call a verification function to check if the sapling was a custom sapling from your data pack: ```mcfunction execute if data storage gm4_trees:temp sapling{type:"IDENTIFIER"} run function ... ``` That should run a function that summons a marker with the `gm4_tree_sapling` tag and an additional identifier tag, and then sets its `gm4_sap_growth` score to a positive number. This score increases every time the sapling increases its `Age` block state. Vanilla saplings have 2 growth stages until they grow into a tree. ```mcfunction # this marker must be spawned at the center of the block (which is where it's run from) summon marker ~ ~ ~ {Tags:["gm4_tree_sapling","SAPLING_ID_TAG"]} # set stage requirement (higher = longer to grow) scoreboard players set @e[type=marker,tag=SAPLING_ID_TAG,distance=..0.1] gm4_sap_growth 2 ``` ### Breaking Saplings When a custom sapling is broken, the `#gm4_trees:destroy_sapling` function tag is run from the sapling marker. The function tag should call a verification function to check if the sapling marker was a custom sapling from your data pack: ```mcfunction execute if entity @s[tag=SAPLING_ID_TAG] run function ... ``` That should run a function that replaces the normal item with the custom sapling item: ```mcfunction # any sapling type can be used (as long as it matches the custom item) kill @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_sapling",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] loot spawn ~ ~ ~ loot gm4_trees_example:items/apple_tree_sapling ``` ### Growing Saplings Custom saplings can be grown like vanilla saplings. The growth is based on the block state of the sapling, so bonemeal can be used like normal. When the age reaches the sapling marker's `gm4_sap_growth` score, it will generate a tree. When this happens, the `#gm4_trees:generate_tree` function tag will run at the location of the sapling marker. The function tag should call a verification function to check if the sapling was a custom sapling from your data pack: ```mcfunction execute if entity @s[tag=SAPLING_ID_TAG] run function ... ``` That should run a function that generates the tree using `/place jigsaw` then kills the marker (`@s`): ```mcfunction # generate tree using custom structure place jigsaw gm4_trees_example:apple_trees gm4_trees:trunk 6 ~ ~1 ~ kill @s ``` ## License This library, and the contents of the `lib_trees` directory on the [github repository](https://github.com/Gamemode4Dev/GM4_Datapacks), is licensed under the MIT License. ================================================ FILE: lib_trees/beet.yaml ================================================ id: gm4_trees name: Gamemode 4 Trees version: 1.5.X description: A mcfunction library that facilitates the creation of custom trees. data_pack: load: data: data pipeline: - gm4.plugins.extend.library meta: gm4: versioning: schedule_loops: - tick - main extra_version_injections: advancements: - place_sapling smithed: pack_id: gm4_lib_trees credits: Creator: - BPR - Bloo ================================================ FILE: lib_trees/data/gm4_trees/advancement/place_sapling.json ================================================ { "criteria": { "place_sapling": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": "{gm4_trees:{item:{id:\"sapling\"}}}" } } } ] } }, "backwards_compat": { "trigger": "minecraft:placed_block", "conditions": { "location": [ { "condition": "minecraft:match_tool", "predicate": { "predicates": { "minecraft:custom_data": "{gm4_fruiting_trees:{item:{id:\"sapling\"}}}" } } } ] } } }, "requirements": [ [ "place_sapling", "backwards_compat" ] ], "rewards": { "function": "gm4_trees:sapling/place_sapling" } } ================================================ FILE: lib_trees/data/gm4_trees/function/load.mcfunction ================================================ scoreboard objectives add gm4_tree_data dummy scoreboard objectives add gm4_sap_stage dummy scoreboard objectives add gm4_sap_growth dummy schedule function gm4_trees:tick 1t replace schedule function gm4_trees:main 2t replace ================================================ FILE: lib_trees/data/gm4_trees/function/main.mcfunction ================================================ schedule function gm4_trees:main 8t # upgrade old entities execute as @e[type=marker,tag=gm4_fruiting_sapling] run function #gm4_trees:upgrade_fruiting_to_general # process leaves execute as @e[type=marker,tag=gm4_tree_leaf] at @s if block ~ ~ ~ #gm4_trees:empty_block run function #gm4_trees:destroy_leaf ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/advance_stage.mcfunction ================================================ # reverts the sapling to stage=0 # @s = sapling marker # at @s align xyz # run from gm4_trees:sapling/process # prevent normal tree from spawning execute if block ~ ~ ~ minecraft:oak_sapling run setblock ~ ~ ~ minecraft:oak_sapling[stage=0] execute if block ~ ~ ~ minecraft:birch_sapling run setblock ~ ~ ~ minecraft:birch_sapling[stage=0] execute if block ~ ~ ~ minecraft:spruce_sapling run setblock ~ ~ ~ minecraft:spruce_sapling[stage=0] execute if block ~ ~ ~ minecraft:jungle_sapling run setblock ~ ~ ~ minecraft:jungle_sapling[stage=0] execute if block ~ ~ ~ minecraft:acacia_sapling run setblock ~ ~ ~ minecraft:acacia_sapling[stage=0] execute if block ~ ~ ~ minecraft:dark_oak_sapling run setblock ~ ~ ~ minecraft:dark_oak_sapling[stage=0] execute if block ~ ~ ~ minecraft:pale_oak_sapling run setblock ~ ~ ~ minecraft:pale_oak_sapling[stage=0] execute if block ~ ~ ~ minecraft:mangrove_propagule[waterlogged=false,hanging=false,age=4] run setblock ~ ~ ~ minecraft:mangrove_propagule[stage=0,age=4,waterlogged=false] execute if block ~ ~ ~ minecraft:mangrove_propagule[waterlogged=true,hanging=false,age=4] run setblock ~ ~ ~ minecraft:mangrove_propagule[stage=0,age=4,waterlogged=true] execute if block ~ ~ ~ minecraft:cherry_sapling run setblock ~ ~ ~ minecraft:cherry_sapling[stage=0] # advance stage of custom sapling, if stage is large enough, grow the tree scoreboard players add @s gm4_sap_stage 1 execute if score @s gm4_sap_stage >= @s gm4_sap_growth run function #gm4_trees:generate_tree ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/destroy.mcfunction ================================================ # kill marker if not inside a sapling anymore # @s = any gm4_tree_sapling # at @s # run from gm4_trees:sapling/process # restore the data of the sapling and kill marker function #gm4_trees:destroy_sapling kill @s ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/find_adjacent_sapling.mcfunction ================================================ # ray cast to find sapling # @s = player that placed a custom sapling # at a position along a ray originating from the player's eyes # run from gm4_trees:sapling/place_sapling # check adjacent blocks execute positioned ~1 ~ ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker execute positioned ~ ~1 ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker execute positioned ~ ~ ~1 if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker execute positioned ~-1 ~ ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker execute positioned ~ ~-1 ~ if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker execute positioned ~ ~ ~-1 if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker # runs the loop again scoreboard players remove $ray gm4_tree_data 1 execute if score $ray gm4_tree_data matches 1.. positioned ^ ^ ^0.013 run function gm4_trees:sapling/find_adjacent_sapling ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/find_sapling.mcfunction ================================================ # ray cast to find sapling # @s = player that placed a custom sapling # at a position along a ray originating from the player's eyes # run from gm4_trees:sapling/place_sapling # check blocks on looking vector execute if block ~ ~ ~ #minecraft:saplings align xyz unless entity @e[tag=smithed.block,dx=0,limit=1] run return run function gm4_trees:sapling/summon_marker # runs the loop again scoreboard players remove $ray gm4_tree_data 1 execute if score $ray gm4_tree_data matches 0.. positioned ^ ^ ^0.013 run return run function gm4_trees:sapling/find_sapling execute unless score $ray gm4_tree_data matches 0.. run return fail ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/place_sapling.mcfunction ================================================ # Initiates the search for the placed sapling # @s = player that just placed a custom sapling # at @s # run from advancement gm4_trees:place_sapling # run from function tag gm4_trees:place_sapling advancement revoke @s only gm4_trees:place_sapling # check for sapling blocks on the looking vector of the player (most likely location) scoreboard players set $ray gm4_tree_data 500 execute store success score $found_sapling gm4_tree_data anchored eyes positioned ^ ^ ^ run function gm4_trees:sapling/find_sapling # if no sapling was found, check blocks adjacent to the looking vector execute unless score $found_sapling gm4_tree_data matches 1 anchored eyes positioned ^ ^ ^ run function gm4_trees:sapling/find_adjacent_sapling ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/process.mcfunction ================================================ # processes the sapling every tick for stage change or broken block # @s = sapling marker # at @s # run from gm4_fruiting_trees:tick # destroy if not in a sapling execute unless block ~ ~ ~ #minecraft:saplings run function gm4_trees:sapling/destroy # prevents normal trees from growing by preventing the sapling from reaching stage 2 # also allows saplings to run their own stage growth checks execute if block ~ ~ ~ #minecraft:saplings[stage=1] run function gm4_trees:sapling/advance_stage ================================================ FILE: lib_trees/data/gm4_trees/function/sapling/summon_marker.mcfunction ================================================ # summons the sapling marker # @s = player who placed the custom sapling # located align xyz of the newly placed sapling # run from gm4_trees:sapling/place_sapling # set up storage to be read from # mainhand data modify storage gm4_trees:temp sapling.type set from entity @s SelectedItem.components."minecraft:custom_data".gm4_trees.item.type ## backwards compatibility with old items execute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s SelectedItem.components."minecraft:custom_data".gm4_fruiting_trees.item.type # offhand execute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s equipment.offhand.components."minecraft:custom_data".gm4_trees.item.type ## backwards compatibility with old items execute unless data storage gm4_trees:temp sapling run data modify storage gm4_trees:temp sapling.type set from entity @s equipment.offhand.components."minecraft:custom_data".gm4_fruiting_trees.item.type # call initialize function so other modules can add their markers # | NOTE positioned ~.5 ~.5 ~.5 to not break data packs that relied on this behavior of old versions of this library execute positioned ~.5 ~.5 ~.5 run function #gm4_trees:initialize_sapling # clean up data remove storage gm4_trees:temp sapling # signal that a sapling was found return 1 ================================================ FILE: lib_trees/data/gm4_trees/function/tick.mcfunction ================================================ schedule function gm4_trees:tick 1t # process saplings execute as @e[type=marker,tag=gm4_tree_sapling] at @s run function gm4_trees:sapling/process ================================================ FILE: lib_trees/data/gm4_trees/tags/block/empty_block.json ================================================ { "values": [ "minecraft:air", "minecraft:moving_piston", "minecraft:water", "minecraft:lava" ] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/destroy_leaf.json ================================================ { "values": [] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/destroy_sapling.json ================================================ { "values": [] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/generate_tree.json ================================================ { "values": [] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/initialize_sapling.json ================================================ { "values": [] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/place_sapling.json ================================================ { "values": [ "gm4_trees:sapling/place_sapling" ] } ================================================ FILE: lib_trees/data/gm4_trees/tags/function/upgrade_fruiting_to_general.json ================================================ { "values": [] } ================================================ FILE: lib_trees/example_use/data/gm4_trees/tags/functions/destroy_leaf.json ================================================ { "values": [ "gm4_trees_example:verify/destroy_leaf" ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees/tags/functions/destroy_sapling.json ================================================ { "values": [ "gm4_trees_example:verify/destroy_sapling" ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees/tags/functions/generate_tree.json ================================================ { "values": [ "gm4_trees_example:verify/generate_tree" ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees/tags/functions/initialize_sapling.json ================================================ { "values": [ "gm4_trees_example:verify/initialize_sapling" ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/destroy_leaf.mcfunction ================================================ # removes a leaf marker if it's no longer in a leaf block # @s = gm4_example_leaf marker # located at @s # run from gm4_trees_example:verify/destroy_leaf # drop sapling loot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf # (if you want special drops from silk touch, you can instead use these command below) ##execute if entity @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_leaves",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] run loot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf_silk_touch ##execute unless entity @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_leaves",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] run loot spawn ~ ~ ~ loot gm4_trees_example:blocks/apple_tree_leaf # if desired, these commands can be used to replace all normally dropped items # this should really only be used if there's a marker in every leaf from this tree ##kill @e[type=item,nbt={Age:0s,Item:{id:"minecraft:stick",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] ##kill @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_sapling",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] ##kill @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_leaves",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] # kill marker kill @s ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/destroy_sapling.mcfunction ================================================ # restores the data of the sapling when breaking the block # @s = example tree sapling marker # located at @s # run from gm4_trees_example:verify/destroy_sapling # kill old sapling (in this case the base item is an oak sapling) kill @e[type=item,nbt={Age:0s,Item:{id:"minecraft:oak_sapling",count:1}},nbt=!{Item:{components:{}}},limit=1,dx=0] # spawn the new sapling loot spawn ~ ~ ~ loot gm4_trees_example:items/apple_tree_sapling ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/generate_tree.mcfunction ================================================ # generates the example tree # @s = example sapling marker # located at @s # run from gm4_trees_example:verify/generate_tree # generate tree using custom structure place jigsaw gm4_trees_example:apple_trees gm4_trees:trunk 6 ~ ~1 ~ kill @s # replace grass with dirt (optional) execute if block ~ ~-1 ~ grass_block run setblock ~ ~-1 ~ dirt ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/initialize_sapling.mcfunction ================================================ # initializes the example tree's marker # @s = player who placed down the example tree sapling # located at the center of the placed sapling # run from gm4_trees:example:verify/initialize_sapling # summon marker summon marker ~ ~ ~ {CustomName:"gm4_apple_tree_sapling",Tags:["gm4_tree_sapling","gm4_apple_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} # set stage requirement (higher = longer to grow) scoreboard players set @e[type=marker,tag=gm4_apple_tree_sapling,distance=..0.1] gm4_sap_growth 2 ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/verify/destroy_leaf.mcfunction ================================================ # verifies that the leaf type is from this module # @s = gm4_tree_leaf marker # located at @s # run from gm4_trees:tick via #gm4_trees:destroy_leaf execute if entity @s[tag=gm4_apple_leaf] run function gm4_trees_example:destroy_leaf # multiple tree type can be checked here execute if entity @s[tag=gm4_example_leaf2] run function gm4_trees_example:destroy_leaf2 execute if entity @s[tag=gm4_example_leaf3] run function gm4_trees_example:destroy_leaf3 ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/verify/destroy_sapling.mcfunction ================================================ # verifies that the sapling type is from this module # @s = gm4_tree_sapling marker # located at @s # run from gm4_trees:sapling/process via #gm4_trees:destroy_sapling execute if entity @s[tag=gm4_apple_tree_sapling] run function gm4_trees_example:destroy_sapling # multiple tree type can be checked here execute if entity @s[tag=gm4_example_tree_sapling2] run function gm4_trees_example:destroy_sapling2 execute if entity @s[tag=gm4_example_tree_sapling3] run function gm4_trees_example:destroy_sapling3 ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/verify/generate_tree.mcfunction ================================================ # verifies that the sapling type is from this module # @s = gm4_tree_sapling marker # located at @s # run from gm4_trees:advance_stage via #gm4_trees:generate_tree execute if entity @s[tag=gm4_apple_tree_sapling] run function gm4_trees_example:generate_tree # multiple tree type can be checked here execute if entity @s[tag=gm4_example_tree_sapling2] run function gm4_trees_example:generate_tree2 execute if entity @s[tag=gm4_example_tree_sapling3] run function gm4_trees_example:generate_tree3 ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/functions/verify/initialize_sapling.mcfunction ================================================ # verifies that the sapling type is from this module # @s = player who just placed down a custom sapling # located at the center sapling block # run from gm4_trees:sapling/summon marker via #gm4_trees:initialize_sapling execute if data storage gm4_trees:temp sapling{type:"apple"} run function gm4_trees_example:initialize_sapling # multiple tree type can be checked here execute if data storage gm4_trees:temp sapling{type:"example2"} run function gm4_trees_example:initialize_sapling2 execute if data storage gm4_trees:temp sapling{type:"example3"} run function gm4_trees_example:initialize_sapling3 ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/loot_tables/blocks/apple_tree_leaf.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "gm4_trees_example:items/apple_tree_sapling", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.75 } ] } ] } ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/loot_tables/items/apple_tree_sapling.json ================================================ { "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:oak_sapling", "functions": [ { "function": "minecraft:set_name", "target": "item_name", "name": { "text": "Apple Tree Sapling", "italic": false } }, { "function": "minecraft:set_nbt", "tag": "{gm4_trees:{item:{id:\"sapling\",type:\"apple\"}}}" } ] } ] } ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/tags/worldgen/biome/has_structure/apple_tree.json ================================================ { "values": [ "minecraft:dark_forest", "minecraft:flower_forest", "minecraft:forest" ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/worldgen/structure/apple_tree.json ================================================ { "type": "minecraft:jigsaw", "biomes": "#gm4_trees_example:has_structure/apple_tree", "step": "vegetal_decoration", "spawn_overrides": {}, "terrain_adaptation": "beard_thin", "start_pool": "gm4_trees_example:apple_trees", "size": 6, "start_height": { "absolute": 0 }, "start_jigsaw_name": "gm4_trees:trunk", "project_start_to_heightmap": "MOTION_BLOCKING_NO_LEAVES", "max_distance_from_center": 80, "use_expansion_hack": false } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/worldgen/structure_set/apple_tree.json ================================================ { "structures": [ { "structure": "gm4_trees_example:apple_tree", "weight": 1 } ], "placement": { "type": "minecraft:random_spread", "salt": 114563218, "frequency_reduction_method": "default", "frequency": 0.4, "locate_offset": [ 8, 0, 8 ], "spacing": 3, "separation": 0 } } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/apple_leaf.json ================================================ { "name": "gm4_trees_example:apple_leaf", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_trees_example:apple_leaf", "processors": "minecraft:empty" } }, { "weight": 5, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid" } } ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/apple_trees.json ================================================ { "name": "gm4_trees_example:apple_trees", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_trees_example:apple_tree_1", "processors": "minecraft:empty" } }, { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_trees_example:apple_tree_2", "processors": "minecraft:empty" } } ] } ================================================ FILE: lib_trees/example_use/data/gm4_trees_example/worldgen/template_pool/corner_leaf.json ================================================ { "name": "gm4_trees_example:corner_leaf", "fallback": "minecraft:empty", "elements": [ { "weight": 1, "element": { "element_type": "minecraft:legacy_single_pool_element", "projection": "rigid", "location": "gm4_trees_example:corner_leaf", "processors": "minecraft:empty" } }, { "weight": 2, "element": { "element_type": "minecraft:empty_pool_element", "projection": "rigid" } } ] } ================================================ FILE: lib_trees/example_use/data/load/tags/functions/gm4_trees_example.json ================================================ { "values":[ { "id": "#load:gm4_trees", "required": false } ] } ================================================ FILE: lib_trees/example_use/data/load/tags/functions/load.json ================================================ { "values": [ "#load:gm4_trees_example" ] } ================================================ FILE: lib_trees/example_use/pack.mcmeta ================================================ { "pack": { "pack_format": 10, "description": [ "Example Use of GM4 Trees Library" ] } } ================================================ FILE: lib_trees/mod.mcdoc ================================================ dispatch minecraft:storage[gm4_trees:temp] to struct { sapling?: struct { type: string, }, } dispatch mcdoc:custom_data[gm4_trees] to struct { item?: struct { type: string, }, } ================================================ FILE: library.yaml ================================================ pipeline: - gm4.plugins.upgrade_paths.lib - gm4.plugins.versioning.libraries ================================================ FILE: module.yaml ================================================ pipeline: - gm4.plugins.module.default_pack_icon - gm4.plugins.module.gm4_root_advancement - gm4.plugins.versioning.modules - gm4.plugins.upgrade_paths - gm4_guidebook.generate_guidebooks - gm4.plugins.resource_pack.build - mecha - directory: '../base' extend: 'beet.yaml' ================================================ FILE: pfb_biome_extensions/beet.yaml ================================================ data_pack: load: . ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_nether", "required": false }, "minecraft:nether_cave" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_nether", "required": false }, "minecraft:nether_cave" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_nether", "required": false }, "minecraft:nether_cave" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_nether", "required": false }, "minecraft:nether_cave" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_nether", "required": false }, "minecraft:nether_cave" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/configured_carver/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:in_overworld", "required": false }, "minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava", "minecraft:spring_lava_frozen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava", "minecraft:spring_lava_frozen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava", "minecraft:spring_lava_frozen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava", "minecraft:spring_lava_frozen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/fluid_springs/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:fluid_springs/in_overworld", "required": false }, "minecraft:spring_water", "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/lakes/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:lakes/in_overworld", "required": false }, "minecraft:lake_lava_underground", "minecraft:lake_lava_surface" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:iceberg_packed", "minecraft:iceberg_blue", "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode", "minecraft:large_dripstone" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:iceberg_packed", "minecraft:iceberg_blue", "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode", "minecraft:forest_rock" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode", "minecraft:forest_rock" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_nether", "required": false }, "minecraft:basalt_pillar" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/local_modifications/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:local_modifications/in_overworld", "required": false }, "minecraft:amethyst_geode" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_end", "required": false }, "minecraft:end_island_decorated" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/raw_generation/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:raw_generation/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/strongholds/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:strongholds/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_nether", "required": false }, "minecraft:delta", "minecraft:small_basalt_columns", "minecraft:large_basalt_columns" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false }, "minecraft:blue_ice" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false }, "minecraft:desert_well" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_end", "required": false }, "minecraft:end_gateway_return" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false }, "minecraft:blue_ice" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false }, "minecraft:ice_spike", "minecraft:ice_patch" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_end", "required": false }, "minecraft:end_spike" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/surface_structures/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:surface_structures/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_end", "required": false }, "minecraft:end_platform" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/the_void.json ================================================ { "replace": false, "values": [ "minecraft:void_start_platform" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/top_layer_modification/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:top_layer_modification/in_overworld", "required": false }, "minecraft:freeze_top_layer" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_nether", "required": false }, "minecraft:basalt_blobs", "minecraft:blackstone_blobs", "minecraft:spring_delta", "minecraft:patch_fire", "minecraft:patch_soul_fire", "minecraft:glowstone_extra", "minecraft:glowstone", "minecraft:brown_mushroom_nether", "minecraft:red_mushroom_nether", "minecraft:ore_magma", "minecraft:spring_closed_double", "minecraft:ore_gold_deltas", "minecraft:ore_quartz_deltas", "minecraft:ore_ancient_debris_large", "minecraft:ore_debris_small" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_nether", "required": false }, "minecraft:spring_open", "minecraft:patch_fire", "minecraft:glowstone_extra", "minecraft:glowstone", "minecraft:ore_magma", "minecraft:spring_closed", "minecraft:ore_gravel_nether", "minecraft:ore_blackstone", "minecraft:ore_gold_nether", "minecraft:ore_quartz_nether", "minecraft:ore_ancient_debris_large", "minecraft:ore_debris_small" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:sculk_vein", "minecraft:sculk_patch_deep_dark" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:dripstone_cluster", "minecraft:pointed_dripstone" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_nether", "required": false }, "minecraft:spring_open", "minecraft:patch_fire", "minecraft:patch_soul_fire", "minecraft:glowstone_extra", "minecraft:glowstone", "minecraft:brown_mushroom_nether", "minecraft:red_mushroom_nether", "minecraft:ore_magma", "minecraft:spring_closed", "minecraft:ore_gravel_nether", "minecraft:ore_blackstone", "minecraft:ore_gold_nether", "minecraft:ore_quartz_nether", "minecraft:ore_ancient_debris_large", "minecraft:ore_debris_small" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_nether", "required": false }, "minecraft:spring_open", "minecraft:patch_fire", "minecraft:patch_soul_fire", "minecraft:glowstone_extra", "minecraft:glowstone", "minecraft:patch_crimson_roots", "minecraft:ore_magma", "minecraft:spring_closed", "minecraft:ore_soul_sand", "minecraft:ore_gravel_nether", "minecraft:ore_blackstone", "minecraft:ore_gold_nether", "minecraft:ore_quartz_nether", "minecraft:ore_ancient_debris_large", "minecraft:ore_debris_small" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_nether", "required": false }, "minecraft:spring_open", "minecraft:patch_fire", "minecraft:patch_soul_fire", "minecraft:glowstone_extra", "minecraft:glowstone", "minecraft:ore_magma", "minecraft:spring_closed", "minecraft:ore_gravel_nether", "minecraft:ore_blackstone", "minecraft:ore_gold_nether", "minecraft:ore_quartz_nether", "minecraft:ore_ancient_debris_large", "minecraft:ore_debris_small" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false }, "minecraft:ore_infested" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_decoration/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_decoration/in_overworld", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:ore_gold_extra", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper_large", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:ore_gold_extra", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:ore_clay", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_grass", "minecraft:disk_clay" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_clay" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel", "minecraft:ore_emerald" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_ores/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_ores/in_overworld", "required": false }, "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper", "minecraft:ore_granite_lower", "minecraft:ore_diorite_upper", "minecraft:ore_diorite_lower", "minecraft:ore_andesite_upper", "minecraft:ore_andesite_lower", "minecraft:ore_tuff", "minecraft:ore_coal_upper", "minecraft:ore_coal_lower", "minecraft:ore_iron_upper", "minecraft:ore_iron_middle", "minecraft:ore_iron_small", "minecraft:ore_gold", "minecraft:ore_gold_lower", "minecraft:ore_redstone", "minecraft:ore_redstone_lower", "minecraft:ore_diamond", "minecraft:ore_diamond_medium", "minecraft:ore_diamond_large", "minecraft:ore_diamond_buried", "minecraft:ore_lapis", "minecraft:ore_lapis_buried", "minecraft:ore_copper", "minecraft:underwater_magma", "minecraft:ore_gold_extra", "minecraft:disk_sand", "minecraft:disk_clay", "minecraft:disk_gravel" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:fossil_upper", "minecraft:fossil_lower", "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:fossil_upper", "minecraft:fossil_lower", "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:fossil_upper", "minecraft:fossil_lower", "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/underground_structures/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:underground_structures/in_overworld", "required": false }, "minecraft:monster_room", "minecraft:monster_room_deep" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_grass_badlands", "minecraft:patch_dry_grass_badlands", "minecraft:patch_dead_bush_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane_badlands", "minecraft:patch_pumpkin", "minecraft:patch_cactus_decorated", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/bamboo_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:bamboo", "minecraft:bamboo_vegetation", "minecraft:flower_warm", "minecraft:patch_grass_jungle", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:vines", "minecraft:patch_melon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/basalt_deltas.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_nether", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:forest_flowers", "minecraft:wildflowers_birch_forest", "minecraft:trees_birch", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_forest", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/cherry_grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:patch_grass_plain", "minecraft:flower_cherry", "minecraft:trees_cherry" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_cold", "minecraft:kelp_cold" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/crimson_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_nether", "required": false }, "minecraft:spring_lava", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:weeping_vines", "minecraft:crimson_fungi", "minecraft:crimson_forest_vegetation" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/dark_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:dark_forest_vegetation", "minecraft:forest_flowers", "minecraft:flower_default", "minecraft:patch_grass_forest", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_leaf_litter", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_cold_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_deep_cold", "minecraft:kelp_cold" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_dark.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:trees_plains", "minecraft:flower_plains", "minecraft:patch_grass_plain", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_deep_warm", "minecraft:kelp_warm" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/deep_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_deep", "minecraft:kelp_cold" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/desert.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:patch_dry_grass_desert", "minecraft:patch_dead_bush_2", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane_desert", "minecraft:patch_pumpkin", "minecraft:patch_cactus_desert" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/dripstone_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:trees_plains", "minecraft:flower_plains", "minecraft:patch_grass_plain", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_barrens.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_highlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_end", "required": false }, "minecraft:chorus_plant" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/end_midlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/eroded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_grass_badlands", "minecraft:patch_dry_grass_badlands", "minecraft:patch_dead_bush_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane_badlands", "minecraft:patch_pumpkin", "minecraft:patch_cactus_decorated", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/flower_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:flower_forest_flowers", "minecraft:trees_flower_forest", "minecraft:flower_flower_forest", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:forest_flowers", "minecraft:trees_birch_and_oak_leaf_litter", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_forest", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/frozen_river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/grove.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_grove", "minecraft:patch_pumpkin" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ice_spikes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_snowy", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/jagged_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:bamboo_light", "minecraft:trees_jungle", "minecraft:flower_warm", "minecraft:patch_grass_jungle", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:vines", "minecraft:patch_melon" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/lukewarm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_warm", "minecraft:kelp_warm" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/lush_caves.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:lush_caves_ceiling_vegetation", "minecraft:cave_vines", "minecraft:lush_caves_clay", "minecraft:lush_caves_vegetation", "minecraft:rooted_azalea_tree", "minecraft:spore_blossom", "minecraft:classic_vines_cave_feature" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/mangrove_swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_mangrove", "minecraft:patch_grass_normal", "minecraft:patch_dead_bush", "minecraft:patch_waterlily", "minecraft:seagrass_swamp", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/meadow.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:patch_grass_meadow", "minecraft:flower_meadow", "minecraft:trees_meadow", "minecraft:wildflowers_meadow" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/mushroom_fields.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:mushroom_island_vegetation", "minecraft:brown_mushroom_taiga", "minecraft:red_mushroom_taiga", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/nether_wastes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_nether", "required": false }, "minecraft:spring_lava", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_normal", "minecraft:kelp_cold" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_birch_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:forest_flowers", "minecraft:wildflowers_birch_forest", "minecraft:birch_tall", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_forest", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_pine_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_large_fern", "minecraft:trees_old_growth_pine_taiga", "minecraft:flower_default", "minecraft:patch_grass_taiga", "minecraft:patch_dead_bush", "minecraft:brown_mushroom_old_growth", "minecraft:red_mushroom_old_growth", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:patch_berry_common" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/old_growth_spruce_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_large_fern", "minecraft:trees_old_growth_spruce_taiga", "minecraft:flower_default", "minecraft:patch_grass_taiga", "minecraft:patch_dead_bush", "minecraft:brown_mushroom_old_growth", "minecraft:red_mushroom_old_growth", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:patch_berry_common" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/pale_garden.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:pale_garden_vegetation", "minecraft:pale_moss_patch", "minecraft:pale_garden_flowers", "minecraft:flower_pale_garden", "minecraft:patch_grass_forest", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:patch_bush", "minecraft:trees_plains", "minecraft:flower_plains", "minecraft:patch_grass_plain", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/river.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:seagrass_river" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass", "minecraft:trees_savanna", "minecraft:flower_warm", "minecraft:patch_grass_savanna", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/savanna_plateau.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass", "minecraft:trees_savanna", "minecraft:flower_warm", "minecraft:patch_grass_savanna", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/small_end_islands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_beach.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_snowy", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_slopes.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_pumpkin" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/snowy_taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_large_fern", "minecraft:trees_taiga", "minecraft:flower_default", "minecraft:patch_grass_taiga_2", "minecraft:brown_mushroom_taiga", "minecraft:red_mushroom_taiga", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:patch_berry_rare" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/soul_sand_valley.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_nether", "required": false }, "minecraft:spring_lava" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/sparse_jungle.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_sparse_jungle", "minecraft:flower_warm", "minecraft:patch_grass_jungle", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:vines", "minecraft:patch_melon_sparse" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/stony_peaks.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/stony_shore.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/sunflower_plains.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_tall_grass_2", "minecraft:patch_sunflower", "minecraft:trees_plains", "minecraft:flower_plains", "minecraft:patch_grass_plain", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/swamp.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_swamp", "minecraft:flower_swamp", "minecraft:patch_grass_normal", "minecraft:patch_dead_bush", "minecraft:patch_waterlily", "minecraft:brown_mushroom_swamp", "minecraft:red_mushroom_swamp", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane_swamp", "minecraft:patch_pumpkin", "minecraft:patch_firefly_bush_swamp", "minecraft:patch_firefly_bush_near_water_swamp", "minecraft:seagrass_swamp" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/taiga.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:patch_large_fern", "minecraft:trees_taiga", "minecraft:flower_default", "minecraft:patch_grass_taiga_2", "minecraft:brown_mushroom_taiga", "minecraft:red_mushroom_taiga", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:patch_berry_common" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/the_end.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_end", "required": false } ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/the_void.json ================================================ { "replace": false, "values": [] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/warm_ocean.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_water", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water", "minecraft:warm_ocean_vegetation", "minecraft:seagrass_warm", "minecraft:sea_pickle" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/warped_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_nether", "required": false }, "minecraft:spring_lava", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:warped_fungi", "minecraft:warped_forest_vegetation", "minecraft:nether_sprouts", "minecraft:twisting_vines" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_forest.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_windswept_forest", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_gravelly_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_windswept_hills", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_hills.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_windswept_hills", "minecraft:patch_bush", "minecraft:flower_default", "minecraft:patch_grass_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/windswept_savanna.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_windswept_savanna", "minecraft:flower_default", "minecraft:patch_grass_normal", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_pumpkin", "minecraft:patch_sugar_cane", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/tags/worldgen/placed_feature/vegetal_decoration/in_biome/wooded_badlands.json ================================================ { "replace": false, "values": [ { "id": "#minecraft:vegetal_decoration/in_overworld", "required": false }, "minecraft:glow_lichen", "minecraft:trees_badlands", "minecraft:patch_grass_badlands", "minecraft:patch_dry_grass_badlands", "minecraft:patch_dead_bush_badlands", "minecraft:brown_mushroom_normal", "minecraft:red_mushroom_normal", "minecraft:patch_sugar_cane_badlands", "minecraft:patch_pumpkin", "minecraft:patch_cactus_decorated", "minecraft:patch_firefly_bush_near_water" ] } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/badlands.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.badlands" } }, "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/badlands", "creature_spawn_probability": 0.03, "downfall": 0.0, "effects": { "foliage_color": "#9e814d", "grass_color": "#90814d", "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/badlands", "#minecraft:lakes/in_biome/badlands", "#minecraft:local_modifications/in_biome/badlands", "#minecraft:underground_structures/in_biome/badlands", "#minecraft:surface_structures/in_biome/badlands", "#minecraft:strongholds/in_biome/badlands", "#minecraft:underground_ores/in_biome/badlands", "#minecraft:underground_decoration/in_biome/badlands", "#minecraft:fluid_springs/in_biome/badlands", "#minecraft:vegetal_decoration/in_biome/badlands", "#minecraft:top_layer_modification/in_biome/badlands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:armadillo", "maxCount": 2, "minCount": 1, "weight": 6 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/bamboo_jungle.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.bamboo_jungle" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#77a8ff" }, "carvers": "#minecraft:in_biome/bamboo_jungle", "downfall": 0.9, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/bamboo_jungle", "#minecraft:lakes/in_biome/bamboo_jungle", "#minecraft:local_modifications/in_biome/bamboo_jungle", "#minecraft:underground_structures/in_biome/bamboo_jungle", "#minecraft:surface_structures/in_biome/bamboo_jungle", "#minecraft:strongholds/in_biome/bamboo_jungle", "#minecraft:underground_ores/in_biome/bamboo_jungle", "#minecraft:underground_decoration/in_biome/bamboo_jungle", "#minecraft:fluid_springs/in_biome/bamboo_jungle", "#minecraft:vegetal_decoration/in_biome/bamboo_jungle", "#minecraft:top_layer_modification/in_biome/bamboo_jungle" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:parrot", "maxCount": 2, "minCount": 1, "weight": 40 }, { "type": "minecraft:panda", "maxCount": 2, "minCount": 1, "weight": 80 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:ocelot", "maxCount": 1, "minCount": 1, "weight": 2 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.95 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/basalt_deltas.json ================================================ { "attributes": { "minecraft:audio/ambient_sounds": { "additions": { "sound": "minecraft:ambient.basalt_deltas.additions", "tick_chance": 0.0111 }, "loop": "minecraft:ambient.basalt_deltas.loop", "mood": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.basalt_deltas.mood", "tick_delay": 6000 } }, "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.nether.basalt_deltas" } }, "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:white_ash" }, "probability": 0.118093334 } ], "minecraft:visual/fog_color": "#685f70" }, "carvers": "#minecraft:in_biome/basalt_deltas", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/basalt_deltas", "#minecraft:lakes/in_biome/basalt_deltas", "#minecraft:local_modifications/in_biome/basalt_deltas", "#minecraft:underground_structures/in_biome/basalt_deltas", "#minecraft:surface_structures/in_biome/basalt_deltas", "#minecraft:strongholds/in_biome/basalt_deltas", "#minecraft:underground_ores/in_biome/basalt_deltas", "#minecraft:underground_decoration/in_biome/basalt_deltas", "#minecraft:fluid_springs/in_biome/basalt_deltas", "#minecraft:vegetal_decoration/in_biome/basalt_deltas", "#minecraft:top_layer_modification/in_biome/basalt_deltas" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [ { "type": "minecraft:strider", "maxCount": 2, "minCount": 1, "weight": 60 } ], "misc": [], "monster": [ { "type": "minecraft:ghast", "maxCount": 1, "minCount": 1, "weight": 40 }, { "type": "minecraft:magma_cube", "maxCount": 5, "minCount": 2, "weight": 100 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/beach.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#78a7ff" }, "carvers": "#minecraft:in_biome/beach", "downfall": 0.4, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/beach", "#minecraft:lakes/in_biome/beach", "#minecraft:local_modifications/in_biome/beach", "#minecraft:underground_structures/in_biome/beach", "#minecraft:surface_structures/in_biome/beach", "#minecraft:strongholds/in_biome/beach", "#minecraft:underground_ores/in_biome/beach", "#minecraft:underground_decoration/in_biome/beach", "#minecraft:fluid_springs/in_biome/beach", "#minecraft:vegetal_decoration/in_biome/beach", "#minecraft:top_layer_modification/in_biome/beach" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:turtle", "maxCount": 5, "minCount": 2, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/birch_forest.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.forest" } }, "minecraft:visual/sky_color": "#7aa5ff" }, "carvers": "#minecraft:in_biome/birch_forest", "downfall": 0.6, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/birch_forest", "#minecraft:lakes/in_biome/birch_forest", "#minecraft:local_modifications/in_biome/birch_forest", "#minecraft:underground_structures/in_biome/birch_forest", "#minecraft:surface_structures/in_biome/birch_forest", "#minecraft:strongholds/in_biome/birch_forest", "#minecraft:underground_ores/in_biome/birch_forest", "#minecraft:underground_decoration/in_biome/birch_forest", "#minecraft:fluid_springs/in_biome/birch_forest", "#minecraft:vegetal_decoration/in_biome/birch_forest", "#minecraft:top_layer_modification/in_biome/birch_forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.6 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/cherry_grove.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.cherry_grove" } }, "minecraft:visual/sky_color": "#7ba4ff", "minecraft:visual/water_fog_color": "#5db7ef" }, "carvers": "#minecraft:in_biome/cherry_grove", "downfall": 0.8, "effects": { "foliage_color": "#b6db61", "grass_color": "#b6db61", "water_color": "#5db7ef" }, "features": [ "#minecraft:raw_generation/in_biome/cherry_grove", "#minecraft:lakes/in_biome/cherry_grove", "#minecraft:local_modifications/in_biome/cherry_grove", "#minecraft:underground_structures/in_biome/cherry_grove", "#minecraft:surface_structures/in_biome/cherry_grove", "#minecraft:strongholds/in_biome/cherry_grove", "#minecraft:underground_ores/in_biome/cherry_grove", "#minecraft:underground_decoration/in_biome/cherry_grove", "#minecraft:fluid_springs/in_biome/cherry_grove", "#minecraft:vegetal_decoration/in_biome/cherry_grove", "#minecraft:top_layer_modification/in_biome/cherry_grove" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:pig", "maxCount": 2, "minCount": 1, "weight": 1 }, { "type": "minecraft:rabbit", "maxCount": 6, "minCount": 2, "weight": 2 }, { "type": "minecraft:sheep", "maxCount": 4, "minCount": 2, "weight": 2 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/cold_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/cold_ocean", "downfall": 0.5, "effects": { "water_color": "#3d57d6" }, "features": [ "#minecraft:raw_generation/in_biome/cold_ocean", "#minecraft:lakes/in_biome/cold_ocean", "#minecraft:local_modifications/in_biome/cold_ocean", "#minecraft:underground_structures/in_biome/cold_ocean", "#minecraft:surface_structures/in_biome/cold_ocean", "#minecraft:strongholds/in_biome/cold_ocean", "#minecraft:underground_ores/in_biome/cold_ocean", "#minecraft:underground_decoration/in_biome/cold_ocean", "#minecraft:fluid_springs/in_biome/cold_ocean", "#minecraft:vegetal_decoration/in_biome/cold_ocean", "#minecraft:top_layer_modification/in_biome/cold_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 15 }, { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 15 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 3 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 2 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/crimson_forest.json ================================================ { "attributes": { "minecraft:audio/ambient_sounds": { "additions": { "sound": "minecraft:ambient.crimson_forest.additions", "tick_chance": 0.0111 }, "loop": "minecraft:ambient.crimson_forest.loop", "mood": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.crimson_forest.mood", "tick_delay": 6000 } }, "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.nether.crimson_forest" } }, "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:crimson_spore" }, "probability": 0.025 } ], "minecraft:visual/fog_color": "#330303" }, "carvers": "#minecraft:in_biome/crimson_forest", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/crimson_forest", "#minecraft:lakes/in_biome/crimson_forest", "#minecraft:local_modifications/in_biome/crimson_forest", "#minecraft:underground_structures/in_biome/crimson_forest", "#minecraft:surface_structures/in_biome/crimson_forest", "#minecraft:strongholds/in_biome/crimson_forest", "#minecraft:underground_ores/in_biome/crimson_forest", "#minecraft:underground_decoration/in_biome/crimson_forest", "#minecraft:fluid_springs/in_biome/crimson_forest", "#minecraft:vegetal_decoration/in_biome/crimson_forest", "#minecraft:top_layer_modification/in_biome/crimson_forest" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [ { "type": "minecraft:strider", "maxCount": 2, "minCount": 1, "weight": 60 } ], "misc": [], "monster": [ { "type": "minecraft:zombified_piglin", "maxCount": 4, "minCount": 2, "weight": 1 }, { "type": "minecraft:hoglin", "maxCount": 4, "minCount": 3, "weight": 9 }, { "type": "minecraft:piglin", "maxCount": 4, "minCount": 3, "weight": 5 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/dark_forest.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.forest" } }, "minecraft:visual/sky_color": "#79a6ff" }, "carvers": "#minecraft:in_biome/dark_forest", "downfall": 0.8, "effects": { "dry_foliage_color": "#7b5334", "grass_color_modifier": "dark_forest", "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/dark_forest", "#minecraft:lakes/in_biome/dark_forest", "#minecraft:local_modifications/in_biome/dark_forest", "#minecraft:underground_structures/in_biome/dark_forest", "#minecraft:surface_structures/in_biome/dark_forest", "#minecraft:strongholds/in_biome/dark_forest", "#minecraft:underground_ores/in_biome/dark_forest", "#minecraft:underground_decoration/in_biome/dark_forest", "#minecraft:fluid_springs/in_biome/dark_forest", "#minecraft:vegetal_decoration/in_biome/dark_forest", "#minecraft:top_layer_modification/in_biome/dark_forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/deep_cold_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/deep_cold_ocean", "downfall": 0.5, "effects": { "water_color": "#3d57d6" }, "features": [ "#minecraft:raw_generation/in_biome/deep_cold_ocean", "#minecraft:lakes/in_biome/deep_cold_ocean", "#minecraft:local_modifications/in_biome/deep_cold_ocean", "#minecraft:underground_structures/in_biome/deep_cold_ocean", "#minecraft:surface_structures/in_biome/deep_cold_ocean", "#minecraft:strongholds/in_biome/deep_cold_ocean", "#minecraft:underground_ores/in_biome/deep_cold_ocean", "#minecraft:underground_decoration/in_biome/deep_cold_ocean", "#minecraft:fluid_springs/in_biome/deep_cold_ocean", "#minecraft:vegetal_decoration/in_biome/deep_cold_ocean", "#minecraft:top_layer_modification/in_biome/deep_cold_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 15 }, { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 15 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 3 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 2 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/deep_dark.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.deep_dark" } }, "minecraft:visual/sky_color": "#78a7ff" }, "carvers": "#minecraft:in_biome/deep_dark", "downfall": 0.4, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/deep_dark", "#minecraft:lakes/in_biome/deep_dark", "#minecraft:local_modifications/in_biome/deep_dark", "#minecraft:underground_structures/in_biome/deep_dark", "#minecraft:surface_structures/in_biome/deep_dark", "#minecraft:strongholds/in_biome/deep_dark", "#minecraft:underground_ores/in_biome/deep_dark", "#minecraft:underground_decoration/in_biome/deep_dark", "#minecraft:fluid_springs/in_biome/deep_dark", "#minecraft:vegetal_decoration/in_biome/deep_dark", "#minecraft:top_layer_modification/in_biome/deep_dark" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/deep_frozen_ocean.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/deep_frozen_ocean", "downfall": 0.5, "effects": { "water_color": "#3938c9" }, "features": [ "#minecraft:raw_generation/in_biome/deep_frozen_ocean", "#minecraft:lakes/in_biome/deep_frozen_ocean", "#minecraft:local_modifications/in_biome/deep_frozen_ocean", "#minecraft:underground_structures/in_biome/deep_frozen_ocean", "#minecraft:surface_structures/in_biome/deep_frozen_ocean", "#minecraft:strongholds/in_biome/deep_frozen_ocean", "#minecraft:underground_ores/in_biome/deep_frozen_ocean", "#minecraft:underground_decoration/in_biome/deep_frozen_ocean", "#minecraft:fluid_springs/in_biome/deep_frozen_ocean", "#minecraft:vegetal_decoration/in_biome/deep_frozen_ocean", "#minecraft:top_layer_modification/in_biome/deep_frozen_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:polar_bear", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 15 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 1 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 2 } ] }, "temperature": 0.5, "temperature_modifier": "frozen" } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/deep_lukewarm_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff", "minecraft:visual/water_fog_color": "#041633" }, "carvers": "#minecraft:in_biome/deep_lukewarm_ocean", "downfall": 0.5, "effects": { "water_color": "#45adf2" }, "features": [ "#minecraft:raw_generation/in_biome/deep_lukewarm_ocean", "#minecraft:lakes/in_biome/deep_lukewarm_ocean", "#minecraft:local_modifications/in_biome/deep_lukewarm_ocean", "#minecraft:underground_structures/in_biome/deep_lukewarm_ocean", "#minecraft:surface_structures/in_biome/deep_lukewarm_ocean", "#minecraft:strongholds/in_biome/deep_lukewarm_ocean", "#minecraft:underground_ores/in_biome/deep_lukewarm_ocean", "#minecraft:underground_decoration/in_biome/deep_lukewarm_ocean", "#minecraft:fluid_springs/in_biome/deep_lukewarm_ocean", "#minecraft:vegetal_decoration/in_biome/deep_lukewarm_ocean", "#minecraft:top_layer_modification/in_biome/deep_lukewarm_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 8 }, { "type": "minecraft:pufferfish", "maxCount": 3, "minCount": 1, "weight": 5 }, { "type": "minecraft:tropical_fish", "maxCount": 8, "minCount": 8, "weight": 25 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 8 }, { "type": "minecraft:dolphin", "maxCount": 2, "minCount": 1, "weight": 2 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 5 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/deep_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/deep_ocean", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/deep_ocean", "#minecraft:lakes/in_biome/deep_ocean", "#minecraft:local_modifications/in_biome/deep_ocean", "#minecraft:underground_structures/in_biome/deep_ocean", "#minecraft:surface_structures/in_biome/deep_ocean", "#minecraft:strongholds/in_biome/deep_ocean", "#minecraft:underground_ores/in_biome/deep_ocean", "#minecraft:underground_decoration/in_biome/deep_ocean", "#minecraft:fluid_springs/in_biome/deep_ocean", "#minecraft:vegetal_decoration/in_biome/deep_ocean", "#minecraft:top_layer_modification/in_biome/deep_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 10 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 1 }, { "type": "minecraft:dolphin", "maxCount": 2, "minCount": 1, "weight": 1 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 5 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/desert.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.desert" } }, "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/desert", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/desert", "#minecraft:lakes/in_biome/desert", "#minecraft:local_modifications/in_biome/desert", "#minecraft:underground_structures/in_biome/desert", "#minecraft:surface_structures/in_biome/desert", "#minecraft:strongholds/in_biome/desert", "#minecraft:underground_ores/in_biome/desert", "#minecraft:underground_decoration/in_biome/desert", "#minecraft:fluid_springs/in_biome/desert", "#minecraft:vegetal_decoration/in_biome/desert", "#minecraft:top_layer_modification/in_biome/desert" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 12 }, { "type": "minecraft:camel", "maxCount": 1, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 19 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 50 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:husk", "maxCount": 4, "minCount": 4, "weight": 80 }, { "type": "minecraft:parched", "maxCount": 4, "minCount": 4, "weight": 50 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/dripstone_caves.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.dripstone_caves" } }, "minecraft:visual/sky_color": "#78a7ff" }, "carvers": "#minecraft:in_biome/dripstone_caves", "downfall": 0.4, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/dripstone_caves", "#minecraft:lakes/in_biome/dripstone_caves", "#minecraft:local_modifications/in_biome/dripstone_caves", "#minecraft:underground_structures/in_biome/dripstone_caves", "#minecraft:surface_structures/in_biome/dripstone_caves", "#minecraft:strongholds/in_biome/dripstone_caves", "#minecraft:underground_ores/in_biome/dripstone_caves", "#minecraft:underground_decoration/in_biome/dripstone_caves", "#minecraft:fluid_springs/in_biome/dripstone_caves", "#minecraft:vegetal_decoration/in_biome/dripstone_caves", "#minecraft:top_layer_modification/in_biome/dripstone_caves" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 4, "minCount": 4, "weight": 95 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/end_barrens.json ================================================ { "carvers": "#minecraft:in_biome/end_barrens", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/end_barrens", "#minecraft:lakes/in_biome/end_barrens", "#minecraft:local_modifications/in_biome/end_barrens", "#minecraft:underground_structures/in_biome/end_barrens", "#minecraft:surface_structures/in_biome/end_barrens", "#minecraft:strongholds/in_biome/end_barrens", "#minecraft:underground_ores/in_biome/end_barrens", "#minecraft:underground_decoration/in_biome/end_barrens", "#minecraft:fluid_springs/in_biome/end_barrens", "#minecraft:vegetal_decoration/in_biome/end_barrens", "#minecraft:top_layer_modification/in_biome/end_barrens" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 10 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/end_highlands.json ================================================ { "carvers": "#minecraft:in_biome/end_highlands", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/end_highlands", "#minecraft:lakes/in_biome/end_highlands", "#minecraft:local_modifications/in_biome/end_highlands", "#minecraft:underground_structures/in_biome/end_highlands", "#minecraft:surface_structures/in_biome/end_highlands", "#minecraft:strongholds/in_biome/end_highlands", "#minecraft:underground_ores/in_biome/end_highlands", "#minecraft:underground_decoration/in_biome/end_highlands", "#minecraft:fluid_springs/in_biome/end_highlands", "#minecraft:vegetal_decoration/in_biome/end_highlands", "#minecraft:top_layer_modification/in_biome/end_highlands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 10 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/end_midlands.json ================================================ { "carvers": "#minecraft:in_biome/end_midlands", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/end_midlands", "#minecraft:lakes/in_biome/end_midlands", "#minecraft:local_modifications/in_biome/end_midlands", "#minecraft:underground_structures/in_biome/end_midlands", "#minecraft:surface_structures/in_biome/end_midlands", "#minecraft:strongholds/in_biome/end_midlands", "#minecraft:underground_ores/in_biome/end_midlands", "#minecraft:underground_decoration/in_biome/end_midlands", "#minecraft:fluid_springs/in_biome/end_midlands", "#minecraft:vegetal_decoration/in_biome/end_midlands", "#minecraft:top_layer_modification/in_biome/end_midlands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 10 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/eroded_badlands.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.badlands" } }, "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/eroded_badlands", "creature_spawn_probability": 0.03, "downfall": 0.0, "effects": { "foliage_color": "#9e814d", "grass_color": "#90814d", "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/eroded_badlands", "#minecraft:lakes/in_biome/eroded_badlands", "#minecraft:local_modifications/in_biome/eroded_badlands", "#minecraft:underground_structures/in_biome/eroded_badlands", "#minecraft:surface_structures/in_biome/eroded_badlands", "#minecraft:strongholds/in_biome/eroded_badlands", "#minecraft:underground_ores/in_biome/eroded_badlands", "#minecraft:underground_decoration/in_biome/eroded_badlands", "#minecraft:fluid_springs/in_biome/eroded_badlands", "#minecraft:vegetal_decoration/in_biome/eroded_badlands", "#minecraft:top_layer_modification/in_biome/eroded_badlands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:armadillo", "maxCount": 2, "minCount": 1, "weight": 6 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/flower_forest.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.flower_forest" } }, "minecraft:visual/sky_color": "#79a6ff" }, "carvers": "#minecraft:in_biome/flower_forest", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/flower_forest", "#minecraft:lakes/in_biome/flower_forest", "#minecraft:local_modifications/in_biome/flower_forest", "#minecraft:underground_structures/in_biome/flower_forest", "#minecraft:surface_structures/in_biome/flower_forest", "#minecraft:strongholds/in_biome/flower_forest", "#minecraft:underground_ores/in_biome/flower_forest", "#minecraft:underground_decoration/in_biome/flower_forest", "#minecraft:fluid_springs/in_biome/flower_forest", "#minecraft:vegetal_decoration/in_biome/flower_forest", "#minecraft:top_layer_modification/in_biome/flower_forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/forest.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.forest" } }, "minecraft:visual/sky_color": "#79a6ff" }, "carvers": "#minecraft:in_biome/forest", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/forest", "#minecraft:lakes/in_biome/forest", "#minecraft:local_modifications/in_biome/forest", "#minecraft:underground_structures/in_biome/forest", "#minecraft:surface_structures/in_biome/forest", "#minecraft:strongholds/in_biome/forest", "#minecraft:underground_ores/in_biome/forest", "#minecraft:underground_decoration/in_biome/forest", "#minecraft:fluid_springs/in_biome/forest", "#minecraft:vegetal_decoration/in_biome/forest", "#minecraft:top_layer_modification/in_biome/forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 4, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_ocean.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7fa1ff" }, "carvers": "#minecraft:in_biome/frozen_ocean", "downfall": 0.5, "effects": { "water_color": "#3938c9" }, "features": [ "#minecraft:raw_generation/in_biome/frozen_ocean", "#minecraft:lakes/in_biome/frozen_ocean", "#minecraft:local_modifications/in_biome/frozen_ocean", "#minecraft:underground_structures/in_biome/frozen_ocean", "#minecraft:surface_structures/in_biome/frozen_ocean", "#minecraft:strongholds/in_biome/frozen_ocean", "#minecraft:underground_ores/in_biome/frozen_ocean", "#minecraft:underground_decoration/in_biome/frozen_ocean", "#minecraft:fluid_springs/in_biome/frozen_ocean", "#minecraft:vegetal_decoration/in_biome/frozen_ocean", "#minecraft:top_layer_modification/in_biome/frozen_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:polar_bear", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 15 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 1 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 2 } ] }, "temperature": 0.0, "temperature_modifier": "frozen" } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_peaks.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.frozen_peaks" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#859dff" }, "carvers": "#minecraft:in_biome/frozen_peaks", "downfall": 0.9, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/frozen_peaks", "#minecraft:lakes/in_biome/frozen_peaks", "#minecraft:local_modifications/in_biome/frozen_peaks", "#minecraft:underground_structures/in_biome/frozen_peaks", "#minecraft:surface_structures/in_biome/frozen_peaks", "#minecraft:strongholds/in_biome/frozen_peaks", "#minecraft:underground_ores/in_biome/frozen_peaks", "#minecraft:underground_decoration/in_biome/frozen_peaks", "#minecraft:fluid_springs/in_biome/frozen_peaks", "#minecraft:vegetal_decoration/in_biome/frozen_peaks", "#minecraft:top_layer_modification/in_biome/frozen_peaks" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:goat", "maxCount": 3, "minCount": 1, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/frozen_river.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7fa1ff" }, "carvers": "#minecraft:in_biome/frozen_river", "downfall": 0.5, "effects": { "water_color": "#3938c9" }, "features": [ "#minecraft:raw_generation/in_biome/frozen_river", "#minecraft:lakes/in_biome/frozen_river", "#minecraft:local_modifications/in_biome/frozen_river", "#minecraft:underground_structures/in_biome/frozen_river", "#minecraft:surface_structures/in_biome/frozen_river", "#minecraft:strongholds/in_biome/frozen_river", "#minecraft:underground_ores/in_biome/frozen_river", "#minecraft:underground_decoration/in_biome/frozen_river", "#minecraft:fluid_springs/in_biome/frozen_river", "#minecraft:vegetal_decoration/in_biome/frozen_river", "#minecraft:top_layer_modification/in_biome/frozen_river" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 1 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 5 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 2 } ] }, "temperature": 0.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/grove.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.grove" } }, "minecraft:visual/sky_color": "#81a0ff" }, "carvers": "#minecraft:in_biome/grove", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/grove", "#minecraft:lakes/in_biome/grove", "#minecraft:local_modifications/in_biome/grove", "#minecraft:underground_structures/in_biome/grove", "#minecraft:surface_structures/in_biome/grove", "#minecraft:strongholds/in_biome/grove", "#minecraft:underground_ores/in_biome/grove", "#minecraft:underground_decoration/in_biome/grove", "#minecraft:fluid_springs/in_biome/grove", "#minecraft:vegetal_decoration/in_biome/grove", "#minecraft:top_layer_modification/in_biome/grove" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:wolf", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 8 }, { "type": "minecraft:fox", "maxCount": 4, "minCount": 2, "weight": 4 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -0.2 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/ice_spikes.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7fa1ff" }, "carvers": "#minecraft:in_biome/ice_spikes", "creature_spawn_probability": 0.07, "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/ice_spikes", "#minecraft:lakes/in_biome/ice_spikes", "#minecraft:local_modifications/in_biome/ice_spikes", "#minecraft:underground_structures/in_biome/ice_spikes", "#minecraft:surface_structures/in_biome/ice_spikes", "#minecraft:strongholds/in_biome/ice_spikes", "#minecraft:underground_ores/in_biome/ice_spikes", "#minecraft:underground_decoration/in_biome/ice_spikes", "#minecraft:fluid_springs/in_biome/ice_spikes", "#minecraft:vegetal_decoration/in_biome/ice_spikes", "#minecraft:top_layer_modification/in_biome/ice_spikes" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 10 }, { "type": "minecraft:polar_bear", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 20 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:stray", "maxCount": 4, "minCount": 4, "weight": 80 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/jagged_peaks.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.jagged_peaks" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#859dff" }, "carvers": "#minecraft:in_biome/jagged_peaks", "downfall": 0.9, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/jagged_peaks", "#minecraft:lakes/in_biome/jagged_peaks", "#minecraft:local_modifications/in_biome/jagged_peaks", "#minecraft:underground_structures/in_biome/jagged_peaks", "#minecraft:surface_structures/in_biome/jagged_peaks", "#minecraft:strongholds/in_biome/jagged_peaks", "#minecraft:underground_ores/in_biome/jagged_peaks", "#minecraft:underground_decoration/in_biome/jagged_peaks", "#minecraft:fluid_springs/in_biome/jagged_peaks", "#minecraft:vegetal_decoration/in_biome/jagged_peaks", "#minecraft:top_layer_modification/in_biome/jagged_peaks" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:goat", "maxCount": 3, "minCount": 1, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/jungle.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.jungle" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#77a8ff" }, "carvers": "#minecraft:in_biome/jungle", "downfall": 0.9, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/jungle", "#minecraft:lakes/in_biome/jungle", "#minecraft:local_modifications/in_biome/jungle", "#minecraft:underground_structures/in_biome/jungle", "#minecraft:surface_structures/in_biome/jungle", "#minecraft:strongholds/in_biome/jungle", "#minecraft:underground_ores/in_biome/jungle", "#minecraft:underground_decoration/in_biome/jungle", "#minecraft:fluid_springs/in_biome/jungle", "#minecraft:vegetal_decoration/in_biome/jungle", "#minecraft:top_layer_modification/in_biome/jungle" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:parrot", "maxCount": 2, "minCount": 1, "weight": 40 }, { "type": "minecraft:panda", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:ocelot", "maxCount": 3, "minCount": 1, "weight": 2 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.95 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/lukewarm_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff", "minecraft:visual/water_fog_color": "#041633" }, "carvers": "#minecraft:in_biome/lukewarm_ocean", "downfall": 0.5, "effects": { "water_color": "#45adf2" }, "features": [ "#minecraft:raw_generation/in_biome/lukewarm_ocean", "#minecraft:lakes/in_biome/lukewarm_ocean", "#minecraft:local_modifications/in_biome/lukewarm_ocean", "#minecraft:underground_structures/in_biome/lukewarm_ocean", "#minecraft:surface_structures/in_biome/lukewarm_ocean", "#minecraft:strongholds/in_biome/lukewarm_ocean", "#minecraft:underground_ores/in_biome/lukewarm_ocean", "#minecraft:underground_decoration/in_biome/lukewarm_ocean", "#minecraft:fluid_springs/in_biome/lukewarm_ocean", "#minecraft:vegetal_decoration/in_biome/lukewarm_ocean", "#minecraft:top_layer_modification/in_biome/lukewarm_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 15 }, { "type": "minecraft:pufferfish", "maxCount": 3, "minCount": 1, "weight": 5 }, { "type": "minecraft:tropical_fish", "maxCount": 8, "minCount": 8, "weight": 25 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 2, "minCount": 1, "weight": 10 }, { "type": "minecraft:dolphin", "maxCount": 2, "minCount": 1, "weight": 2 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 5 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/lush_caves.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.lush_caves" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/lush_caves", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/lush_caves", "#minecraft:lakes/in_biome/lush_caves", "#minecraft:local_modifications/in_biome/lush_caves", "#minecraft:underground_structures/in_biome/lush_caves", "#minecraft:surface_structures/in_biome/lush_caves", "#minecraft:strongholds/in_biome/lush_caves", "#minecraft:underground_ores/in_biome/lush_caves", "#minecraft:underground_decoration/in_biome/lush_caves", "#minecraft:fluid_springs/in_biome/lush_caves", "#minecraft:vegetal_decoration/in_biome/lush_caves", "#minecraft:top_layer_modification/in_biome/lush_caves" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [ { "type": "minecraft:axolotl", "maxCount": 6, "minCount": 4, "weight": 10 } ], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:tropical_fish", "maxCount": 8, "minCount": 8, "weight": 25 } ], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/mangrove_swamp.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.swamp" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/fog_color": "#c0d8ff", "minecraft:visual/sky_color": "#78a7ff", "minecraft:visual/water_fog_color": "#4d7a60", "minecraft:visual/water_fog_end_distance": { "argument": 0.85, "modifier": "multiply" } }, "carvers": "#minecraft:in_biome/mangrove_swamp", "downfall": 0.9, "effects": { "dry_foliage_color": "#7b5334", "foliage_color": "#8db127", "grass_color_modifier": "swamp", "water_color": "#3a7a6a" }, "features": [ "#minecraft:raw_generation/in_biome/mangrove_swamp", "#minecraft:lakes/in_biome/mangrove_swamp", "#minecraft:local_modifications/in_biome/mangrove_swamp", "#minecraft:underground_structures/in_biome/mangrove_swamp", "#minecraft:surface_structures/in_biome/mangrove_swamp", "#minecraft:strongholds/in_biome/mangrove_swamp", "#minecraft:underground_ores/in_biome/mangrove_swamp", "#minecraft:underground_decoration/in_biome/mangrove_swamp", "#minecraft:fluid_springs/in_biome/mangrove_swamp", "#minecraft:vegetal_decoration/in_biome/mangrove_swamp", "#minecraft:top_layer_modification/in_biome/mangrove_swamp" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:frog", "maxCount": 5, "minCount": 2, "weight": 10 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 70 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:slime", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:bogged", "maxCount": 4, "minCount": 4, "weight": 30 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:tropical_fish", "maxCount": 8, "minCount": 8, "weight": 25 } ], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/meadow.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.meadow" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/meadow", "downfall": 0.8, "effects": { "water_color": "#0e4ecf" }, "features": [ "#minecraft:raw_generation/in_biome/meadow", "#minecraft:lakes/in_biome/meadow", "#minecraft:local_modifications/in_biome/meadow", "#minecraft:underground_structures/in_biome/meadow", "#minecraft:surface_structures/in_biome/meadow", "#minecraft:strongholds/in_biome/meadow", "#minecraft:underground_ores/in_biome/meadow", "#minecraft:underground_decoration/in_biome/meadow", "#minecraft:fluid_springs/in_biome/meadow", "#minecraft:vegetal_decoration/in_biome/meadow", "#minecraft:top_layer_modification/in_biome/meadow" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:donkey", "maxCount": 2, "minCount": 1, "weight": 1 }, { "type": "minecraft:rabbit", "maxCount": 6, "minCount": 2, "weight": 2 }, { "type": "minecraft:sheep", "maxCount": 4, "minCount": 2, "weight": 2 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/mushroom_fields.json ================================================ { "attributes": { "minecraft:gameplay/can_pillager_patrol_spawn": false, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#77a8ff" }, "carvers": "#minecraft:in_biome/mushroom_fields", "downfall": 1.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/mushroom_fields", "#minecraft:lakes/in_biome/mushroom_fields", "#minecraft:local_modifications/in_biome/mushroom_fields", "#minecraft:underground_structures/in_biome/mushroom_fields", "#minecraft:surface_structures/in_biome/mushroom_fields", "#minecraft:strongholds/in_biome/mushroom_fields", "#minecraft:underground_ores/in_biome/mushroom_fields", "#minecraft:underground_decoration/in_biome/mushroom_fields", "#minecraft:fluid_springs/in_biome/mushroom_fields", "#minecraft:vegetal_decoration/in_biome/mushroom_fields", "#minecraft:top_layer_modification/in_biome/mushroom_fields" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:mooshroom", "maxCount": 8, "minCount": 4, "weight": 8 } ], "misc": [], "monster": [], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.9 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/nether_wastes.json ================================================ { "attributes": { "minecraft:audio/ambient_sounds": { "additions": { "sound": "minecraft:ambient.nether_wastes.additions", "tick_chance": 0.0111 }, "loop": "minecraft:ambient.nether_wastes.loop", "mood": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.nether_wastes.mood", "tick_delay": 6000 } }, "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.nether.nether_wastes" } }, "minecraft:visual/fog_color": "#330808" }, "carvers": "#minecraft:in_biome/nether_wastes", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/nether_wastes", "#minecraft:lakes/in_biome/nether_wastes", "#minecraft:local_modifications/in_biome/nether_wastes", "#minecraft:underground_structures/in_biome/nether_wastes", "#minecraft:surface_structures/in_biome/nether_wastes", "#minecraft:strongholds/in_biome/nether_wastes", "#minecraft:underground_ores/in_biome/nether_wastes", "#minecraft:underground_decoration/in_biome/nether_wastes", "#minecraft:fluid_springs/in_biome/nether_wastes", "#minecraft:vegetal_decoration/in_biome/nether_wastes", "#minecraft:top_layer_modification/in_biome/nether_wastes" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [ { "type": "minecraft:strider", "maxCount": 2, "minCount": 1, "weight": 60 } ], "misc": [], "monster": [ { "type": "minecraft:ghast", "maxCount": 4, "minCount": 4, "weight": 50 }, { "type": "minecraft:zombified_piglin", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:magma_cube", "maxCount": 4, "minCount": 4, "weight": 2 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 1 }, { "type": "minecraft:piglin", "maxCount": 4, "minCount": 4, "weight": 15 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/ocean", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/ocean", "#minecraft:lakes/in_biome/ocean", "#minecraft:local_modifications/in_biome/ocean", "#minecraft:underground_structures/in_biome/ocean", "#minecraft:surface_structures/in_biome/ocean", "#minecraft:strongholds/in_biome/ocean", "#minecraft:underground_ores/in_biome/ocean", "#minecraft:underground_decoration/in_biome/ocean", "#minecraft:fluid_springs/in_biome/ocean", "#minecraft:vegetal_decoration/in_biome/ocean", "#minecraft:top_layer_modification/in_biome/ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:cod", "maxCount": 6, "minCount": 3, "weight": 10 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 1 }, { "type": "minecraft:dolphin", "maxCount": 2, "minCount": 1, "weight": 1 }, { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 5 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_birch_forest.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.forest" } }, "minecraft:visual/sky_color": "#7aa5ff" }, "carvers": "#minecraft:in_biome/old_growth_birch_forest", "downfall": 0.6, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/old_growth_birch_forest", "#minecraft:lakes/in_biome/old_growth_birch_forest", "#minecraft:local_modifications/in_biome/old_growth_birch_forest", "#minecraft:underground_structures/in_biome/old_growth_birch_forest", "#minecraft:surface_structures/in_biome/old_growth_birch_forest", "#minecraft:strongholds/in_biome/old_growth_birch_forest", "#minecraft:underground_ores/in_biome/old_growth_birch_forest", "#minecraft:underground_decoration/in_biome/old_growth_birch_forest", "#minecraft:fluid_springs/in_biome/old_growth_birch_forest", "#minecraft:vegetal_decoration/in_biome/old_growth_birch_forest", "#minecraft:top_layer_modification/in_biome/old_growth_birch_forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.6 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_pine_taiga.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.old_growth_taiga" } }, "minecraft:visual/sky_color": "#7ca3ff" }, "carvers": "#minecraft:in_biome/old_growth_pine_taiga", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/old_growth_pine_taiga", "#minecraft:lakes/in_biome/old_growth_pine_taiga", "#minecraft:local_modifications/in_biome/old_growth_pine_taiga", "#minecraft:underground_structures/in_biome/old_growth_pine_taiga", "#minecraft:surface_structures/in_biome/old_growth_pine_taiga", "#minecraft:strongholds/in_biome/old_growth_pine_taiga", "#minecraft:underground_ores/in_biome/old_growth_pine_taiga", "#minecraft:underground_decoration/in_biome/old_growth_pine_taiga", "#minecraft:fluid_springs/in_biome/old_growth_pine_taiga", "#minecraft:vegetal_decoration/in_biome/old_growth_pine_taiga", "#minecraft:top_layer_modification/in_biome/old_growth_pine_taiga" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 }, { "type": "minecraft:fox", "maxCount": 4, "minCount": 2, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 25 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.3 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/old_growth_spruce_taiga.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.old_growth_taiga" } }, "minecraft:visual/sky_color": "#7da3ff" }, "carvers": "#minecraft:in_biome/old_growth_spruce_taiga", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/old_growth_spruce_taiga", "#minecraft:lakes/in_biome/old_growth_spruce_taiga", "#minecraft:local_modifications/in_biome/old_growth_spruce_taiga", "#minecraft:underground_structures/in_biome/old_growth_spruce_taiga", "#minecraft:surface_structures/in_biome/old_growth_spruce_taiga", "#minecraft:strongholds/in_biome/old_growth_spruce_taiga", "#minecraft:underground_ores/in_biome/old_growth_spruce_taiga", "#minecraft:underground_decoration/in_biome/old_growth_spruce_taiga", "#minecraft:fluid_springs/in_biome/old_growth_spruce_taiga", "#minecraft:vegetal_decoration/in_biome/old_growth_spruce_taiga", "#minecraft:top_layer_modification/in_biome/old_growth_spruce_taiga" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 }, { "type": "minecraft:fox", "maxCount": 4, "minCount": 2, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.25 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/pale_garden.json ================================================ { "attributes": { "minecraft:audio/background_music": {}, "minecraft:audio/music_volume": 0.0, "minecraft:visual/fog_color": "#817770", "minecraft:visual/sky_color": "#b9b9b9", "minecraft:visual/water_fog_color": "#556980" }, "carvers": "#minecraft:in_biome/pale_garden", "downfall": 0.8, "effects": { "dry_foliage_color": "#a0a69c", "foliage_color": "#878d76", "grass_color": "#778272", "water_color": "#76889d" }, "features": [ "#minecraft:raw_generation/in_biome/pale_garden", "#minecraft:lakes/in_biome/pale_garden", "#minecraft:local_modifications/in_biome/pale_garden", "#minecraft:underground_structures/in_biome/pale_garden", "#minecraft:surface_structures/in_biome/pale_garden", "#minecraft:strongholds/in_biome/pale_garden", "#minecraft:underground_ores/in_biome/pale_garden", "#minecraft:underground_decoration/in_biome/pale_garden", "#minecraft:fluid_springs/in_biome/pale_garden", "#minecraft:vegetal_decoration/in_biome/pale_garden", "#minecraft:top_layer_modification/in_biome/pale_garden" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.7 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/plains.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#78a7ff" }, "carvers": "#minecraft:in_biome/plains", "downfall": 0.4, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/plains", "#minecraft:lakes/in_biome/plains", "#minecraft:local_modifications/in_biome/plains", "#minecraft:underground_structures/in_biome/plains", "#minecraft:surface_structures/in_biome/plains", "#minecraft:strongholds/in_biome/plains", "#minecraft:underground_ores/in_biome/plains", "#minecraft:underground_decoration/in_biome/plains", "#minecraft:fluid_springs/in_biome/plains", "#minecraft:vegetal_decoration/in_biome/plains", "#minecraft:top_layer_modification/in_biome/plains" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:horse", "maxCount": 6, "minCount": 2, "weight": 5 }, { "type": "minecraft:donkey", "maxCount": 3, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/river.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/river", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/river", "#minecraft:lakes/in_biome/river", "#minecraft:local_modifications/in_biome/river", "#minecraft:underground_structures/in_biome/river", "#minecraft:surface_structures/in_biome/river", "#minecraft:strongholds/in_biome/river", "#minecraft:underground_ores/in_biome/river", "#minecraft:underground_decoration/in_biome/river", "#minecraft:fluid_springs/in_biome/river", "#minecraft:vegetal_decoration/in_biome/river", "#minecraft:top_layer_modification/in_biome/river" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 100 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:salmon", "maxCount": 5, "minCount": 1, "weight": 5 } ], "water_creature": [ { "type": "minecraft:squid", "maxCount": 4, "minCount": 1, "weight": 2 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/savanna.json ================================================ { "attributes": { "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/savanna", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/savanna", "#minecraft:lakes/in_biome/savanna", "#minecraft:local_modifications/in_biome/savanna", "#minecraft:underground_structures/in_biome/savanna", "#minecraft:surface_structures/in_biome/savanna", "#minecraft:strongholds/in_biome/savanna", "#minecraft:underground_ores/in_biome/savanna", "#minecraft:underground_decoration/in_biome/savanna", "#minecraft:fluid_springs/in_biome/savanna", "#minecraft:vegetal_decoration/in_biome/savanna", "#minecraft:top_layer_modification/in_biome/savanna" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:horse", "maxCount": 6, "minCount": 2, "weight": 1 }, { "type": "minecraft:donkey", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:armadillo", "maxCount": 3, "minCount": 2, "weight": 10 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/savanna_plateau.json ================================================ { "attributes": { "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/savanna_plateau", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/savanna_plateau", "#minecraft:lakes/in_biome/savanna_plateau", "#minecraft:local_modifications/in_biome/savanna_plateau", "#minecraft:underground_structures/in_biome/savanna_plateau", "#minecraft:surface_structures/in_biome/savanna_plateau", "#minecraft:strongholds/in_biome/savanna_plateau", "#minecraft:underground_ores/in_biome/savanna_plateau", "#minecraft:underground_decoration/in_biome/savanna_plateau", "#minecraft:fluid_springs/in_biome/savanna_plateau", "#minecraft:vegetal_decoration/in_biome/savanna_plateau", "#minecraft:top_layer_modification/in_biome/savanna_plateau" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:horse", "maxCount": 6, "minCount": 2, "weight": 1 }, { "type": "minecraft:donkey", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:armadillo", "maxCount": 3, "minCount": 2, "weight": 10 }, { "type": "minecraft:llama", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 8, "minCount": 4, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/small_end_islands.json ================================================ { "carvers": "#minecraft:in_biome/small_end_islands", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/small_end_islands", "#minecraft:lakes/in_biome/small_end_islands", "#minecraft:local_modifications/in_biome/small_end_islands", "#minecraft:underground_structures/in_biome/small_end_islands", "#minecraft:surface_structures/in_biome/small_end_islands", "#minecraft:strongholds/in_biome/small_end_islands", "#minecraft:underground_ores/in_biome/small_end_islands", "#minecraft:underground_decoration/in_biome/small_end_islands", "#minecraft:fluid_springs/in_biome/small_end_islands", "#minecraft:vegetal_decoration/in_biome/small_end_islands", "#minecraft:top_layer_modification/in_biome/small_end_islands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 10 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_beach.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7fa1ff" }, "carvers": "#minecraft:in_biome/snowy_beach", "downfall": 0.3, "effects": { "water_color": "#3d57d6" }, "features": [ "#minecraft:raw_generation/in_biome/snowy_beach", "#minecraft:lakes/in_biome/snowy_beach", "#minecraft:local_modifications/in_biome/snowy_beach", "#minecraft:underground_structures/in_biome/snowy_beach", "#minecraft:surface_structures/in_biome/snowy_beach", "#minecraft:strongholds/in_biome/snowy_beach", "#minecraft:underground_ores/in_biome/snowy_beach", "#minecraft:underground_decoration/in_biome/snowy_beach", "#minecraft:fluid_springs/in_biome/snowy_beach", "#minecraft:vegetal_decoration/in_biome/snowy_beach", "#minecraft:top_layer_modification/in_biome/snowy_beach" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.05 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_plains.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7fa1ff" }, "carvers": "#minecraft:in_biome/snowy_plains", "creature_spawn_probability": 0.07, "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/snowy_plains", "#minecraft:lakes/in_biome/snowy_plains", "#minecraft:local_modifications/in_biome/snowy_plains", "#minecraft:underground_structures/in_biome/snowy_plains", "#minecraft:surface_structures/in_biome/snowy_plains", "#minecraft:strongholds/in_biome/snowy_plains", "#minecraft:underground_ores/in_biome/snowy_plains", "#minecraft:underground_decoration/in_biome/snowy_plains", "#minecraft:fluid_springs/in_biome/snowy_plains", "#minecraft:vegetal_decoration/in_biome/snowy_plains", "#minecraft:top_layer_modification/in_biome/snowy_plains" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 10 }, { "type": "minecraft:polar_bear", "maxCount": 2, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 20 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:stray", "maxCount": 4, "minCount": 4, "weight": 80 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_slopes.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.snowy_slopes" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#829fff" }, "carvers": "#minecraft:in_biome/snowy_slopes", "downfall": 0.9, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/snowy_slopes", "#minecraft:lakes/in_biome/snowy_slopes", "#minecraft:local_modifications/in_biome/snowy_slopes", "#minecraft:underground_structures/in_biome/snowy_slopes", "#minecraft:surface_structures/in_biome/snowy_slopes", "#minecraft:strongholds/in_biome/snowy_slopes", "#minecraft:underground_ores/in_biome/snowy_slopes", "#minecraft:underground_decoration/in_biome/snowy_slopes", "#minecraft:fluid_springs/in_biome/snowy_slopes", "#minecraft:vegetal_decoration/in_biome/snowy_slopes", "#minecraft:top_layer_modification/in_biome/snowy_slopes" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 }, { "type": "minecraft:goat", "maxCount": 3, "minCount": 1, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -0.3 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/snowy_taiga.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#839eff" }, "carvers": "#minecraft:in_biome/snowy_taiga", "downfall": 0.4, "effects": { "water_color": "#3d57d6" }, "features": [ "#minecraft:raw_generation/in_biome/snowy_taiga", "#minecraft:lakes/in_biome/snowy_taiga", "#minecraft:local_modifications/in_biome/snowy_taiga", "#minecraft:underground_structures/in_biome/snowy_taiga", "#minecraft:surface_structures/in_biome/snowy_taiga", "#minecraft:strongholds/in_biome/snowy_taiga", "#minecraft:underground_ores/in_biome/snowy_taiga", "#minecraft:underground_decoration/in_biome/snowy_taiga", "#minecraft:fluid_springs/in_biome/snowy_taiga", "#minecraft:vegetal_decoration/in_biome/snowy_taiga", "#minecraft:top_layer_modification/in_biome/snowy_taiga" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 }, { "type": "minecraft:fox", "maxCount": 4, "minCount": 2, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": -0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/soul_sand_valley.json ================================================ { "attributes": { "minecraft:audio/ambient_sounds": { "additions": { "sound": "minecraft:ambient.soul_sand_valley.additions", "tick_chance": 0.0111 }, "loop": "minecraft:ambient.soul_sand_valley.loop", "mood": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.soul_sand_valley.mood", "tick_delay": 6000 } }, "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.nether.soul_sand_valley" } }, "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:ash" }, "probability": 0.00625 } ], "minecraft:visual/fog_color": "#1b4745" }, "carvers": "#minecraft:in_biome/soul_sand_valley", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/soul_sand_valley", "#minecraft:lakes/in_biome/soul_sand_valley", "#minecraft:local_modifications/in_biome/soul_sand_valley", "#minecraft:underground_structures/in_biome/soul_sand_valley", "#minecraft:surface_structures/in_biome/soul_sand_valley", "#minecraft:strongholds/in_biome/soul_sand_valley", "#minecraft:underground_ores/in_biome/soul_sand_valley", "#minecraft:underground_decoration/in_biome/soul_sand_valley", "#minecraft:fluid_springs/in_biome/soul_sand_valley", "#minecraft:vegetal_decoration/in_biome/soul_sand_valley", "#minecraft:top_layer_modification/in_biome/soul_sand_valley" ], "has_precipitation": false, "spawn_costs": { "minecraft:enderman": { "charge": 0.7, "energy_budget": 0.15 }, "minecraft:ghast": { "charge": 0.7, "energy_budget": 0.15 }, "minecraft:skeleton": { "charge": 0.7, "energy_budget": 0.15 }, "minecraft:strider": { "charge": 0.7, "energy_budget": 0.15 } }, "spawners": { "ambient": [], "axolotls": [], "creature": [ { "type": "minecraft:strider", "maxCount": 2, "minCount": 1, "weight": 60 } ], "misc": [], "monster": [ { "type": "minecraft:skeleton", "maxCount": 5, "minCount": 5, "weight": 20 }, { "type": "minecraft:ghast", "maxCount": 4, "minCount": 4, "weight": 50 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 1 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/sparse_jungle.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.sparse_jungle" } }, "minecraft:visual/sky_color": "#77a8ff" }, "carvers": "#minecraft:in_biome/sparse_jungle", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/sparse_jungle", "#minecraft:lakes/in_biome/sparse_jungle", "#minecraft:local_modifications/in_biome/sparse_jungle", "#minecraft:underground_structures/in_biome/sparse_jungle", "#minecraft:surface_structures/in_biome/sparse_jungle", "#minecraft:strongholds/in_biome/sparse_jungle", "#minecraft:underground_ores/in_biome/sparse_jungle", "#minecraft:underground_decoration/in_biome/sparse_jungle", "#minecraft:fluid_springs/in_biome/sparse_jungle", "#minecraft:vegetal_decoration/in_biome/sparse_jungle", "#minecraft:top_layer_modification/in_biome/sparse_jungle" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 2, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.95 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/stony_peaks.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.stony_peaks" } }, "minecraft:visual/sky_color": "#76a8ff" }, "carvers": "#minecraft:in_biome/stony_peaks", "downfall": 0.3, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/stony_peaks", "#minecraft:lakes/in_biome/stony_peaks", "#minecraft:local_modifications/in_biome/stony_peaks", "#minecraft:underground_structures/in_biome/stony_peaks", "#minecraft:surface_structures/in_biome/stony_peaks", "#minecraft:strongholds/in_biome/stony_peaks", "#minecraft:underground_ores/in_biome/stony_peaks", "#minecraft:underground_decoration/in_biome/stony_peaks", "#minecraft:fluid_springs/in_biome/stony_peaks", "#minecraft:vegetal_decoration/in_biome/stony_peaks", "#minecraft:top_layer_modification/in_biome/stony_peaks" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 1.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/stony_shore.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7da2ff" }, "carvers": "#minecraft:in_biome/stony_shore", "downfall": 0.3, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/stony_shore", "#minecraft:lakes/in_biome/stony_shore", "#minecraft:local_modifications/in_biome/stony_shore", "#minecraft:underground_structures/in_biome/stony_shore", "#minecraft:surface_structures/in_biome/stony_shore", "#minecraft:strongholds/in_biome/stony_shore", "#minecraft:underground_ores/in_biome/stony_shore", "#minecraft:underground_decoration/in_biome/stony_shore", "#minecraft:fluid_springs/in_biome/stony_shore", "#minecraft:vegetal_decoration/in_biome/stony_shore", "#minecraft:top_layer_modification/in_biome/stony_shore" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.2 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/sunflower_plains.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#78a7ff" }, "carvers": "#minecraft:in_biome/sunflower_plains", "downfall": 0.4, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/sunflower_plains", "#minecraft:lakes/in_biome/sunflower_plains", "#minecraft:local_modifications/in_biome/sunflower_plains", "#minecraft:underground_structures/in_biome/sunflower_plains", "#minecraft:surface_structures/in_biome/sunflower_plains", "#minecraft:strongholds/in_biome/sunflower_plains", "#minecraft:underground_ores/in_biome/sunflower_plains", "#minecraft:underground_decoration/in_biome/sunflower_plains", "#minecraft:fluid_springs/in_biome/sunflower_plains", "#minecraft:vegetal_decoration/in_biome/sunflower_plains", "#minecraft:top_layer_modification/in_biome/sunflower_plains" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:horse", "maxCount": 6, "minCount": 2, "weight": 5 }, { "type": "minecraft:donkey", "maxCount": 3, "minCount": 1, "weight": 1 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/swamp.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.swamp" } }, "minecraft:gameplay/increased_fire_burnout": true, "minecraft:visual/sky_color": "#78a7ff", "minecraft:visual/water_fog_color": "#232317", "minecraft:visual/water_fog_end_distance": { "argument": 0.85, "modifier": "multiply" } }, "carvers": "#minecraft:in_biome/swamp", "downfall": 0.9, "effects": { "dry_foliage_color": "#7b5334", "foliage_color": "#6a7039", "grass_color_modifier": "swamp", "water_color": "#617b64" }, "features": [ "#minecraft:raw_generation/in_biome/swamp", "#minecraft:lakes/in_biome/swamp", "#minecraft:local_modifications/in_biome/swamp", "#minecraft:underground_structures/in_biome/swamp", "#minecraft:surface_structures/in_biome/swamp", "#minecraft:strongholds/in_biome/swamp", "#minecraft:underground_ores/in_biome/swamp", "#minecraft:underground_decoration/in_biome/swamp", "#minecraft:fluid_springs/in_biome/swamp", "#minecraft:vegetal_decoration/in_biome/swamp", "#minecraft:top_layer_modification/in_biome/swamp" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:frog", "maxCount": 5, "minCount": 2, "weight": 10 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 70 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:slime", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:bogged", "maxCount": 4, "minCount": 4, "weight": 30 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.8 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/taiga.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7da3ff" }, "carvers": "#minecraft:in_biome/taiga", "downfall": 0.8, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/taiga", "#minecraft:lakes/in_biome/taiga", "#minecraft:local_modifications/in_biome/taiga", "#minecraft:underground_structures/in_biome/taiga", "#minecraft:surface_structures/in_biome/taiga", "#minecraft:strongholds/in_biome/taiga", "#minecraft:underground_ores/in_biome/taiga", "#minecraft:underground_decoration/in_biome/taiga", "#minecraft:fluid_springs/in_biome/taiga", "#minecraft:vegetal_decoration/in_biome/taiga", "#minecraft:top_layer_modification/in_biome/taiga" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:wolf", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:rabbit", "maxCount": 3, "minCount": 2, "weight": 4 }, { "type": "minecraft:fox", "maxCount": 4, "minCount": 2, "weight": 8 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.25 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/the_end.json ================================================ { "carvers": "#minecraft:in_biome/the_end", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/the_end", "#minecraft:lakes/in_biome/the_end", "#minecraft:local_modifications/in_biome/the_end", "#minecraft:underground_structures/in_biome/the_end", "#minecraft:surface_structures/in_biome/the_end", "#minecraft:strongholds/in_biome/the_end", "#minecraft:underground_ores/in_biome/the_end", "#minecraft:underground_decoration/in_biome/the_end", "#minecraft:fluid_springs/in_biome/the_end", "#minecraft:vegetal_decoration/in_biome/the_end", "#minecraft:top_layer_modification/in_biome/the_end" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 10 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/the_void.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7ba4ff" }, "carvers": "#minecraft:in_biome/the_void", "downfall": 0.5, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/the_void", "#minecraft:lakes/in_biome/the_void", "#minecraft:local_modifications/in_biome/the_void", "#minecraft:underground_structures/in_biome/the_void", "#minecraft:surface_structures/in_biome/the_void", "#minecraft:strongholds/in_biome/the_void", "#minecraft:underground_ores/in_biome/the_void", "#minecraft:underground_decoration/in_biome/the_void", "#minecraft:fluid_springs/in_biome/the_void", "#minecraft:vegetal_decoration/in_biome/the_void", "#minecraft:top_layer_modification/in_biome/the_void" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [], "axolotls": [], "creature": [], "misc": [], "monster": [], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/warm_ocean.json ================================================ { "attributes": { "minecraft:audio/background_music": { "creative": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.creative" }, "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.game" }, "underwater": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.under_water" } }, "minecraft:visual/sky_color": "#7ba4ff", "minecraft:visual/water_fog_color": "#041f33" }, "carvers": "#minecraft:in_biome/warm_ocean", "downfall": 0.5, "effects": { "water_color": "#43d5ee" }, "features": [ "#minecraft:raw_generation/in_biome/warm_ocean", "#minecraft:lakes/in_biome/warm_ocean", "#minecraft:local_modifications/in_biome/warm_ocean", "#minecraft:underground_structures/in_biome/warm_ocean", "#minecraft:surface_structures/in_biome/warm_ocean", "#minecraft:strongholds/in_biome/warm_ocean", "#minecraft:underground_ores/in_biome/warm_ocean", "#minecraft:underground_decoration/in_biome/warm_ocean", "#minecraft:fluid_springs/in_biome/warm_ocean", "#minecraft:vegetal_decoration/in_biome/warm_ocean", "#minecraft:top_layer_modification/in_biome/warm_ocean" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [], "misc": [], "monster": [ { "type": "minecraft:drowned", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [ { "type": "minecraft:pufferfish", "maxCount": 3, "minCount": 1, "weight": 15 }, { "type": "minecraft:tropical_fish", "maxCount": 8, "minCount": 8, "weight": 25 } ], "water_creature": [ { "type": "minecraft:nautilus", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:squid", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:dolphin", "maxCount": 2, "minCount": 1, "weight": 2 } ] }, "temperature": 0.5 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/warped_forest.json ================================================ { "attributes": { "minecraft:audio/ambient_sounds": { "additions": { "sound": "minecraft:ambient.warped_forest.additions", "tick_chance": 0.0111 }, "loop": "minecraft:ambient.warped_forest.loop", "mood": { "block_search_extent": 8, "offset": 2.0, "sound": "minecraft:ambient.warped_forest.mood", "tick_delay": 6000 } }, "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.nether.warped_forest" } }, "minecraft:visual/ambient_particles": [ { "particle": { "type": "minecraft:warped_spore" }, "probability": 0.01428 } ], "minecraft:visual/fog_color": "#1a051a" }, "carvers": "#minecraft:in_biome/warped_forest", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/warped_forest", "#minecraft:lakes/in_biome/warped_forest", "#minecraft:local_modifications/in_biome/warped_forest", "#minecraft:underground_structures/in_biome/warped_forest", "#minecraft:surface_structures/in_biome/warped_forest", "#minecraft:strongholds/in_biome/warped_forest", "#minecraft:underground_ores/in_biome/warped_forest", "#minecraft:underground_decoration/in_biome/warped_forest", "#minecraft:fluid_springs/in_biome/warped_forest", "#minecraft:vegetal_decoration/in_biome/warped_forest", "#minecraft:top_layer_modification/in_biome/warped_forest" ], "has_precipitation": false, "spawn_costs": { "minecraft:enderman": { "charge": 1.0, "energy_budget": 0.12 } }, "spawners": { "ambient": [], "axolotls": [], "creature": [ { "type": "minecraft:strider", "maxCount": 2, "minCount": 1, "weight": 60 } ], "misc": [], "monster": [ { "type": "minecraft:enderman", "maxCount": 4, "minCount": 4, "weight": 1 } ], "underground_water_creature": [], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_forest.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7da2ff" }, "carvers": "#minecraft:in_biome/windswept_forest", "downfall": 0.3, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/windswept_forest", "#minecraft:lakes/in_biome/windswept_forest", "#minecraft:local_modifications/in_biome/windswept_forest", "#minecraft:underground_structures/in_biome/windswept_forest", "#minecraft:surface_structures/in_biome/windswept_forest", "#minecraft:strongholds/in_biome/windswept_forest", "#minecraft:underground_ores/in_biome/windswept_forest", "#minecraft:underground_decoration/in_biome/windswept_forest", "#minecraft:fluid_springs/in_biome/windswept_forest", "#minecraft:vegetal_decoration/in_biome/windswept_forest", "#minecraft:top_layer_modification/in_biome/windswept_forest" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:llama", "maxCount": 6, "minCount": 4, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.2 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_gravelly_hills.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7da2ff" }, "carvers": "#minecraft:in_biome/windswept_gravelly_hills", "downfall": 0.3, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/windswept_gravelly_hills", "#minecraft:lakes/in_biome/windswept_gravelly_hills", "#minecraft:local_modifications/in_biome/windswept_gravelly_hills", "#minecraft:underground_structures/in_biome/windswept_gravelly_hills", "#minecraft:surface_structures/in_biome/windswept_gravelly_hills", "#minecraft:strongholds/in_biome/windswept_gravelly_hills", "#minecraft:underground_ores/in_biome/windswept_gravelly_hills", "#minecraft:underground_decoration/in_biome/windswept_gravelly_hills", "#minecraft:fluid_springs/in_biome/windswept_gravelly_hills", "#minecraft:vegetal_decoration/in_biome/windswept_gravelly_hills", "#minecraft:top_layer_modification/in_biome/windswept_gravelly_hills" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:llama", "maxCount": 6, "minCount": 4, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.2 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_hills.json ================================================ { "attributes": { "minecraft:visual/sky_color": "#7da2ff" }, "carvers": "#minecraft:in_biome/windswept_hills", "downfall": 0.3, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/windswept_hills", "#minecraft:lakes/in_biome/windswept_hills", "#minecraft:local_modifications/in_biome/windswept_hills", "#minecraft:underground_structures/in_biome/windswept_hills", "#minecraft:surface_structures/in_biome/windswept_hills", "#minecraft:strongholds/in_biome/windswept_hills", "#minecraft:underground_ores/in_biome/windswept_hills", "#minecraft:underground_decoration/in_biome/windswept_hills", "#minecraft:fluid_springs/in_biome/windswept_hills", "#minecraft:vegetal_decoration/in_biome/windswept_hills", "#minecraft:top_layer_modification/in_biome/windswept_hills" ], "has_precipitation": true, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:llama", "maxCount": 6, "minCount": 4, "weight": 5 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 0.2 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/windswept_savanna.json ================================================ { "attributes": { "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/windswept_savanna", "downfall": 0.0, "effects": { "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/windswept_savanna", "#minecraft:lakes/in_biome/windswept_savanna", "#minecraft:local_modifications/in_biome/windswept_savanna", "#minecraft:underground_structures/in_biome/windswept_savanna", "#minecraft:surface_structures/in_biome/windswept_savanna", "#minecraft:strongholds/in_biome/windswept_savanna", "#minecraft:underground_ores/in_biome/windswept_savanna", "#minecraft:underground_decoration/in_biome/windswept_savanna", "#minecraft:fluid_springs/in_biome/windswept_savanna", "#minecraft:vegetal_decoration/in_biome/windswept_savanna", "#minecraft:top_layer_modification/in_biome/windswept_savanna" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:horse", "maxCount": 6, "minCount": 2, "weight": 1 }, { "type": "minecraft:donkey", "maxCount": 1, "minCount": 1, "weight": 1 }, { "type": "minecraft:armadillo", "maxCount": 3, "minCount": 2, "weight": 10 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 90 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:zombie_horse", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_biome_extensions/data/minecraft/worldgen/biome/wooded_badlands.json ================================================ { "attributes": { "minecraft:audio/background_music": { "default": { "max_delay": 24000, "min_delay": 12000, "sound": "minecraft:music.overworld.badlands" } }, "minecraft:gameplay/snow_golem_melts": true, "minecraft:visual/sky_color": "#6eb1ff" }, "carvers": "#minecraft:in_biome/wooded_badlands", "creature_spawn_probability": 0.04, "downfall": 0.0, "effects": { "foliage_color": "#9e814d", "grass_color": "#90814d", "water_color": "#3f76e4" }, "features": [ "#minecraft:raw_generation/in_biome/wooded_badlands", "#minecraft:lakes/in_biome/wooded_badlands", "#minecraft:local_modifications/in_biome/wooded_badlands", "#minecraft:underground_structures/in_biome/wooded_badlands", "#minecraft:surface_structures/in_biome/wooded_badlands", "#minecraft:strongholds/in_biome/wooded_badlands", "#minecraft:underground_ores/in_biome/wooded_badlands", "#minecraft:underground_decoration/in_biome/wooded_badlands", "#minecraft:fluid_springs/in_biome/wooded_badlands", "#minecraft:vegetal_decoration/in_biome/wooded_badlands", "#minecraft:top_layer_modification/in_biome/wooded_badlands" ], "has_precipitation": false, "spawn_costs": {}, "spawners": { "ambient": [ { "type": "minecraft:bat", "maxCount": 8, "minCount": 8, "weight": 10 } ], "axolotls": [], "creature": [ { "type": "minecraft:sheep", "maxCount": 4, "minCount": 4, "weight": 12 }, { "type": "minecraft:pig", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:chicken", "maxCount": 4, "minCount": 4, "weight": 10 }, { "type": "minecraft:cow", "maxCount": 4, "minCount": 4, "weight": 8 }, { "type": "minecraft:armadillo", "maxCount": 2, "minCount": 1, "weight": 6 }, { "type": "minecraft:wolf", "maxCount": 8, "minCount": 4, "weight": 2 } ], "misc": [], "monster": [ { "type": "minecraft:spider", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:zombie", "maxCount": 4, "minCount": 4, "weight": 95 }, { "type": "minecraft:zombie_villager", "maxCount": 1, "minCount": 1, "weight": 5 }, { "type": "minecraft:skeleton", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:creeper", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:slime", "maxCount": 4, "minCount": 4, "weight": 100 }, { "type": "minecraft:enderman", "maxCount": 4, "minCount": 1, "weight": 10 }, { "type": "minecraft:witch", "maxCount": 1, "minCount": 1, "weight": 5 } ], "underground_water_creature": [ { "type": "minecraft:glow_squid", "maxCount": 6, "minCount": 4, "weight": 10 } ], "water_ambient": [], "water_creature": [] }, "temperature": 2.0 } ================================================ FILE: pfb_orbis/beet.yaml ================================================ id: gm4_orbis name: Orbis Prefabs data_pack: load: . pipeline: - gm4.plugins.prefabs ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/common.json ================================================ { "type": "minecraft:chest", "pools": [ { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "minecraft:item", "weight": 10, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 }, "add": true } ] }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:spider_eye" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:string", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:melon_seeds", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:beetroot_seeds", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:pumpkin_seeds", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:arrow" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:wheat" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_pickaxe" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:iron_chestplate" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:iron_boots" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_shovel" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:gold_ingot" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:iron_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 4 } } ] } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/rare.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_chestplate", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_leggings", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:diamond_leggings" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:diamond_boots" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:diamond_pickaxe", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.8 } ] } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:diamond_axe" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:diamond_shovel" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond_horse_armor" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:iron_horse_armor" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:golden_horse_armor" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:leather_horse_armor" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:enchanted_golden_apple" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:obsidian" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_mellohi" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_mall" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_otherside" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:bucket" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:name_tag" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:pumpkin_seeds" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:melon_seeds" } ] }, { "rolls": { "min": 1, "max": 4 }, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:spider_eye", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:arrow", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:string" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:wheat" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:carrot" } ] }, { "rolls": { "min": 2, "max": 3 }, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:iron_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:gold_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:ender_pearl", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon/uncommon.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:iron_helmet" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:iron_chestplate" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:iron_leggings" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:iron_boots" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:iron_pickaxe", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:iron_shovel" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:diamond_leggings" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:diamond_boots" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond_pickaxe", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.3 } ] } ] } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:golden_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:leather_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:enchanted_golden_apple" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:obsidian" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:music_disc_mellohi" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:music_disc_mall" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:music_disc_otherside" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bucket" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:name_tag" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:pumpkin_seeds" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:melon_seeds" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:saddle" } ] }, { "rolls": { "min": 2, "max": 6 }, "entries": [ { "type": "minecraft:item", "weight": 10, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:spider_eye", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:arrow", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:string" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:wheat" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:carrot" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 15, "name": "minecraft:iron_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:gold_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:diamond" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:ender_pearl" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/dungeon.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "weight": 15, "value": "gm4_orbis:chests/dungeon/rare" }, { "type": "minecraft:loot_table", "weight": 35, "value": "gm4_orbis:chests/dungeon/uncommon" }, { "type": "minecraft:loot_table", "weight": 60, "value": "gm4_orbis:chests/dungeon/common" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:book", "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 5, "max": 10 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 50 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 8, "max": 15 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 32, "max": 49 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 10, "max": 20 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 10, "max": 31 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 15, "max": 25 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -20, "max": 9 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 20, "max": 30 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": -40, "max": -21 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 25, "max": 30 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "max": -41 } } } } ] } ] } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.7 } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/tower/common.json ================================================ { "type": "minecraft:chest", "pools": [ { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "minecraft:item", "weight": 10, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 }, "add": true } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:feather" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:string", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:phantom_membrane", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:beetroot_seeds", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:pumpkin_seeds", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] }, { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:lapis_lazuli" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:iron_ingot" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:arrow" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:wheat" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:copper_ingot" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:campfire" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:spyglass" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_axe" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:iron_leggings" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:iron_helmet" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_hoe" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/tower/rare.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_chestplate", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_leggings", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:diamond_chestplate" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:diamond_boots" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:diamond_axe" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond_shovel" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:diamond_sword", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.8 } ] } ] } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond_horse_armor" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:iron_horse_armor" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:golden_horse_armor" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:leather_horse_armor" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:enchanted_golden_apple" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_mall" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_blocks" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:music_disc_wait" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:spyglass" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:pumpkin_seeds" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:melon_seeds" }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:campfire" } ] }, { "rolls": { "min": 1, "max": 4 }, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:spider_eye", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:phantom_membrane", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:feather" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:wheat" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:potato" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:carrot" } ] }, { "rolls": { "min": 2, "max": 3 }, "entries": [ { "type": "minecraft:item", "weight": 8, "name": "minecraft:copper_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 2, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:gold_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:diamond", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:ender_pearl", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/tower/uncommon.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_helmet" }, { "type": "minecraft:item", "weight": 5, "name": "minecraft:iron_chestplate", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.5 } ] } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:iron_leggings" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_boots" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:iron_sword", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.8 } ] } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:iron_hoe" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond_chestplate" }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:diamond_helmet" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:diamond_sword", "functions": [ { "function": "minecraft:enchant_randomly", "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.3 } ] } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_pickaxe" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:diamond_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:iron_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:golden_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:leather_horse_armor" }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:golden_apple" }, { "type": "minecraft:item", "weight": 1, "name": "minecraft:enchanted_golden_apple" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:music_disc_mall" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:music_disc_blocks" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:music_disc_wait" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:campfire" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:spyglass" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:pumpkin_seeds" }, { "type": "minecraft:item", "weight": 10, "name": "minecraft:melon_seeds" }, { "type": "minecraft:item", "weight": 9, "name": "minecraft:saddle" } ] }, { "rolls": { "min": 2, "max": 6 }, "entries": [ { "type": "minecraft:item", "weight": 10, "name": "minecraft:rotten_flesh", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 5 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:bone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 6, "name": "minecraft:gunpowder", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:spider_eye", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:redstone", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:arrow", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:string" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 5, "name": "minecraft:wheat" }, { "type": "minecraft:item", "weight": 3, "name": "minecraft:bread" }, { "type": "minecraft:item", "weight": 4, "name": "minecraft:carrot" } ] }, { "rolls": { "min": 1, "max": 2 }, "entries": [ { "type": "minecraft:item", "weight": 15, "name": "minecraft:iron_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 4 } } ] }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:gold_ingot", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 2 } } ] }, { "type": "minecraft:item", "weight": 2, "name": "minecraft:diamond" }, { "type": "minecraft:item", "weight": 8, "name": "minecraft:lapis_lazuli", "functions": [ { "function": "minecraft:set_count", "count": { "min": 1, "max": 3 } } ] }, { "type": "minecraft:item", "weight": 7, "name": "minecraft:ender_pearl" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/chests/tower.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "weight": 15, "value": "gm4_orbis:chests/tower/rare" }, { "type": "minecraft:loot_table", "weight": 35, "value": "gm4_orbis:chests/tower/uncommon" }, { "type": "minecraft:loot_table", "weight": 60, "value": "gm4_orbis:chests/tower/common" } ] }, { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "minecraft:book", "functions": [ { "function": "minecraft:enchant_with_levels", "levels": { "min": 1, "max": 5 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "max": 64 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 5, "max": 10 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 65, "max": 70 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 10, "max": 20 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 71, "max": 90 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 15, "max": 25 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 90, "max": 131 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 20, "max": 30 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 131, "max": 180 } } } } ] }, { "function": "minecraft:enchant_with_levels", "levels": { "min": 25, "max": 30 }, "options": "#minecraft:non_treasure", "conditions": [ { "condition": "minecraft:location_check", "predicate": { "position": { "y": { "min": 180 } } } } ] } ] } ], "conditions": [ { "condition": "minecraft:random_chance", "chance": 0.7 } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/cave_spider.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/cave_spider" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/creeper.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/creeper" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/drowned.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/drowned" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/glow_squid.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/glow_squid" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/guardian.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/guardian" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/pufferfish.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/pufferfish" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/skeleton.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/skeleton" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/spider.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/spider" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/entities/zombie.json ================================================ { "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:loot_table", "value": "minecraft:entities/zombie" } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/loot_table/traps/arrow_dispenser.json ================================================ { "pools": [ { "rolls": { "min": 2, "max": 4 }, "entries": [ { "type": "item", "name": "minecraft:arrow", "functions": [ { "function": "set_count", "count": { "min": 1, "max": 4 } } ] } ] }, { "rolls": 1, "conditions": [ { "condition": "random_chance", "chance": 0.25 } ], "entries": [ { "type": "item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "set_potion", "id": "poison" } ] }, { "type": "item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "set_potion", "id": "harming" } ] }, { "type": "item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "set_potion", "id": "weakness" } ] }, { "type": "item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "set_potion", "id": "strong_harming" } ] }, { "type": "item", "name": "minecraft:tipped_arrow", "functions": [ { "function": "set_potion", "id": "slowness" } ] } ], "functions": [ { "function": "set_count", "count": { "min": 1, "max": 3 } } ] } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/default.json ================================================ { "name": "gm4_orbis:spawner/default", "fallback": "minecraft:empty", "elements": [ { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/creeper_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/creeper_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/creeper_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_side" } } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/spider.json ================================================ { "name": "gm4_orbis:spawner/spider", "fallback": "minecraft:empty", "elements": [ { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/spider_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/extra/cave_spider_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/extra/cave_spider_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/extra/cave_spider_up" } } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/undead.json ================================================ { "name": "gm4_orbis:spawner/default", "fallback": "minecraft:empty", "elements": [ { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/zombie_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/default/skeleton_side" } } ] } ================================================ FILE: pfb_orbis/data/gm4_orbis/worldgen/template_pool/spawner/water.json ================================================ { "name": "gm4_orbis:spawner/water", "fallback": "gm4_orbis:spawner/water", "elements": [ { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/drowned_down" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/glow_squid_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/guardian_down" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/pufferfish_down" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/drowned_up" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/glow_squid_up" } }, { "weight": 6, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/guardian_up" } }, { "weight": 2, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/pufferfish_up" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/drowned_side" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/glow_squid_side" } }, { "weight": 5, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/guardian_side" } }, { "weight": 3, "element": { "element_type": "minecraft:single_pool_element", "projection": "rigid", "processors": "minecraft:empty", "location": "gm4_orbis:spawner/water/pufferfish_side" } } ] } ================================================ FILE: pyproject.toml ================================================ [project] name = "gm4" version = "1.0.0" description = "Data packs for https://gm4.co" authors = [ {name = "Gamemode 4 Contributors"}, ] requires-python = ">=3.14" dependencies = [ "beet>=0.115.0", "mecha>=0.103.0", "bolt>=0.50.1", "requests>=2.28.1", "repro-zipfile>=0.1.0", ] [dependency-groups] dev = [ "black>=22.6.0", "isort>=5.10.1", ] [project.entry-points.beet] commands = "gm4.commands" autoload = "gm4.plugins.autoload" [tool.beet] [tool.pyright] typeCheckingMode = "strict" [tool.isort] profile = "black" [build-system] requires = ["setuptools"] [tool.setuptools] packages = ["gm4"] ================================================ FILE: resource_pack/beet.yaml ================================================ id: gm4_resource_pack name: Resource Pack version: 1.5.X resource_pack: load: pack.png: pack.png # other files are inherited by the full-project build pipeline: - dev_warning meta: gm4: website: description: Use our resource pack for the definitive Gamemode 4 experience! This resource pack does not touch vanilla textures, but adds textures and models to most Gamemode 4 blocks, items and mobs. recommended: [] notes: [] wiki: null credits: Textures: - Memo - Hozz Translations: - ToffeeMax - SarguCopperpot - TheRedCommander - KompetenterKeks Font Magic: - BPR ================================================ FILE: resource_pack/dev_description.py ================================================ from beet import Context def beet_default(ctx: Context): ctx.assets.description = [ "Merged Developer Resources\n", { "text": f"Development Only!", "color": "red" } ] ctx.assets.min_format = 84 ctx.assets.max_format = 84 ================================================ FILE: resource_pack/dev_warning.py ================================================ from beet import Context import logging logger = logging.getLogger("gm4.gm4_resource_pack") def beet_default(ctx: Context): if ctx.meta.get("gm4_dev"): logger.error("The resource pack cannot be cherry-picked by the 'beet dev' command - it inherits all its resources from other modules as they are built by the beet pipeline. If a full build is necessary, use the full project build 'beet build', otherwise just list the desired module(s) in 'beet dev' and use the partial resource pack output.") ================================================ FILE: spyglass.json ================================================ { "env": { "gameVersion": "Latest snapshot", "exclude": [ ".*/**", "docs/**", "out/**", "release/**" ], "mcmetaSummaryOverrides": { "commands": { "path": "./commands.json", "replace": false } }, "customResources": { "guidebook": { "category": "gm4_guidebook" }, "templates/loot_table": { "category": "loot_table" }, "templates/worldgen/biome": { "category": "worldgen/biome" }, "templates/worldgen/configured_feature": { "category": "worldgen/configured_feature" }, "templates/worldgen/placed_feature": { "category": "worldgen/placed_feature" } } } }