From f56d534d4afbb63781d66a52afa554b128ef85a6 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Mon, 26 Oct 2026 17:05:59 +0000 Subject: [PATCH] Port Base Metals to Forge 1.21.11 Keep the existing gameplay and save identities, use native equipment and recipe APIs, and accept vanilla copper equivalents. Preserve older saved world data and defer OreSpawn host tags until they are ready. --- .github/workflows/ci.yml | 40 +- .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/validate-gradle-build.yml | 4 +- CHANGELOG.txt | 12 + README.md | 38 +- build.gradle | 14 +- ci-fixtures/tools/README.md | 12 +- ...craft-mavenizer-0.5.21-orespawn-compat.jar | Bin 2566960 -> 2566959 bytes ...aft-mavenizer-0.5.21-orespawn-compat.patch | 2 +- .../tools/minecraft-source-compatibility.json | 2 +- docs/COMPATIBILITY.md | 5 +- docs/MIGRATION.md | 33 +- docs/VERSIONS.md | 19 +- docs/WORLDGEN.md | 4 +- docs/schemas/orespawn-4.1.0/README.md | 4 +- gradle.properties | 26 +- gradle/README.md | 7 +- gradle/dependencies.gradle | 4 +- gradle/ide/eclipse.gradle | 4 +- gradle/release/artifacts.gradle | 34 +- gradle/verification/packaged-runtime.gradle | 22 +- gradle/verification/support.gradle | 37 +- .../basemetals/data/BMBlockStateProvider.java | 112 +++-- .../data/BaseMetalsDataGenerators.java | 392 ++++++++--------- .../mc/basemetals/data/GeneratedData.java | 78 +++- .../templates/block/bars_post_ends.json | 49 +++ .../templates/block/door_bottom_left.json | 7 + .../block/door_bottom_left_open.json | 7 + .../templates/block/door_bottom_right.json | 7 + .../block/door_bottom_right_open.json | 7 + .../templates/block/door_top_left.json | 7 + .../templates/block/door_top_left_open.json | 7 + .../templates/block/door_top_right.json | 7 + .../templates/block/door_top_right_open.json | 7 + .../templates/block/wall_side_tall.json | 6 + .../datagen/templates/blockstates/anvil.json | 49 +++ .../datagen/templates/blockstates/bars.json | 100 +++++ .../datagen/templates/blockstates/block.json | 7 + .../datagen/templates/blockstates/button.json | 118 ++++++ .../datagen/templates/blockstates/door.json | 124 ++++++ .../templates/blockstates/human_detector.json | 10 + .../datagen/templates/blockstates/lever.json | 76 ++++ .../datagen/templates/blockstates/plate.json | 27 ++ .../templates/blockstates/pressure_plate.json | 10 + .../datagen/templates/blockstates/slab.json | 13 + .../datagen/templates/blockstates/stairs.json | 209 ++++++++++ .../templates/blockstates/trapdoor.json | 68 +++ .../datagen/templates/blockstates/wall.json | 90 ++++ .../mc/basemetals/GameTestRegistration.java | 63 +++ .../compat/CompatibilityRecipeGameTests.java | 20 +- .../content/BaseMetalsGameTests.java | 254 ++++++----- .../content/ForwardPortGameTests.java | 65 +-- .../content/NativeComponentGameTests.java | 150 ++++++- .../basemetals/content/RuntimeTestData.java | 27 ++ .../migration/MigrationGameTests.java | 104 ++--- .../basemetals/equipment/adamantine.json | 19 + .../assets/basemetals/equipment/antimony.json | 19 + .../assets/basemetals/equipment/aquarium.json | 19 + .../assets/basemetals/equipment/bismuth.json | 19 + .../assets/basemetals/equipment/brass.json | 19 + .../assets/basemetals/equipment/bronze.json | 19 + .../assets/basemetals/equipment/coldiron.json | 19 + .../assets/basemetals/equipment/copper.json | 19 + .../basemetals/equipment/cupronickel.json | 19 + .../assets/basemetals/equipment/electrum.json | 19 + .../assets/basemetals/equipment/emerald.json | 19 + .../assets/basemetals/equipment/invar.json | 19 + .../assets/basemetals/equipment/lead.json | 19 + .../assets/basemetals/equipment/mithril.json | 19 + .../assets/basemetals/equipment/nickel.json | 19 + .../assets/basemetals/equipment/obsidian.json | 19 + .../assets/basemetals/equipment/pewter.json | 19 + .../assets/basemetals/equipment/platinum.json | 19 + .../assets/basemetals/equipment/quartz.json | 19 + .../assets/basemetals/equipment/silver.json | 19 + .../basemetals/equipment/starsteel.json | 19 + .../assets/basemetals/equipment/steel.json | 19 + .../assets/basemetals/equipment/tin.json | 19 + .../assets/basemetals/equipment/zinc.json | 19 + .../assets/basemetals/items/adamantine.json | 6 + .../basemetals/items/adamantine_anvil.json | 6 + .../basemetals/items/adamantine_arrow.json | 6 + .../basemetals/items/adamantine_axe.json | 6 + .../basemetals/items/adamantine_bars.json | 6 + .../basemetals/items/adamantine_block.json | 6 + .../basemetals/items/adamantine_bolt.json | 6 + .../basemetals/items/adamantine_boots.json | 6 + .../basemetals/items/adamantine_bow.json | 35 ++ .../basemetals/items/adamantine_bucket.json | 20 + .../basemetals/items/adamantine_button.json | 6 + .../basemetals/items/adamantine_casing.json | 6 + .../items/adamantine_chestplate.json | 6 + .../basemetals/items/adamantine_clump.json | 6 + .../items/adamantine_crackhammer.json | 6 + .../basemetals/items/adamantine_crossbow.json | 35 ++ .../basemetals/items/adamantine_crushed.json | 6 + .../items/adamantine_crushed_purified.json | 6 + .../basemetals/items/adamantine_crystal.json | 6 + .../items/adamantine_dense_plate.json | 6 + .../basemetals/items/adamantine_door.json | 6 + .../items/adamantine_fishing_rod.json | 14 + .../basemetals/items/adamantine_gear.json | 6 + .../basemetals/items/adamantine_helmet.json | 6 + .../basemetals/items/adamantine_hoe.json | 6 + .../items/adamantine_horse_armor.json | 6 + .../basemetals/items/adamantine_ingot.json | 6 + .../basemetals/items/adamantine_leggings.json | 6 + .../basemetals/items/adamantine_lever.json | 6 + .../basemetals/items/adamantine_nugget.json | 6 + .../basemetals/items/adamantine_ore.json | 6 + .../basemetals/items/adamantine_pickaxe.json | 6 + .../basemetals/items/adamantine_plate.json | 6 + .../basemetals/items/adamantine_powder.json | 6 + .../items/adamantine_powder_dirty.json | 6 + .../items/adamantine_pressure_plate.json | 6 + .../basemetals/items/adamantine_raw.json | 6 + .../basemetals/items/adamantine_rod.json | 6 + .../basemetals/items/adamantine_scythe.json | 6 + .../basemetals/items/adamantine_shard.json | 6 + .../basemetals/items/adamantine_shears.json | 6 + .../basemetals/items/adamantine_shield.json | 14 + .../basemetals/items/adamantine_shovel.json | 6 + .../basemetals/items/adamantine_slab.json | 6 + .../items/adamantine_smallpowder.json | 6 + .../basemetals/items/adamantine_stairs.json | 6 + .../basemetals/items/adamantine_sword.json | 6 + .../basemetals/items/adamantine_trapdoor.json | 6 + .../basemetals/items/adamantine_wall.json | 6 + .../assets/basemetals/items/antimony.json | 6 + .../basemetals/items/antimony_arrow.json | 6 + .../assets/basemetals/items/antimony_axe.json | 6 + .../basemetals/items/antimony_bars.json | 6 + .../basemetals/items/antimony_block.json | 6 + .../basemetals/items/antimony_bolt.json | 6 + .../basemetals/items/antimony_boots.json | 6 + .../assets/basemetals/items/antimony_bow.json | 35 ++ .../basemetals/items/antimony_bucket.json | 20 + .../basemetals/items/antimony_button.json | 6 + .../basemetals/items/antimony_casing.json | 6 + .../basemetals/items/antimony_chestplate.json | 6 + .../basemetals/items/antimony_clump.json | 6 + .../items/antimony_crackhammer.json | 6 + .../basemetals/items/antimony_crossbow.json | 35 ++ .../basemetals/items/antimony_crushed.json | 6 + .../items/antimony_crushed_purified.json | 6 + .../basemetals/items/antimony_crystal.json | 6 + .../items/antimony_dense_plate.json | 6 + .../basemetals/items/antimony_door.json | 6 + .../items/antimony_fishing_rod.json | 14 + .../basemetals/items/antimony_gear.json | 6 + .../basemetals/items/antimony_helmet.json | 6 + .../assets/basemetals/items/antimony_hoe.json | 6 + .../items/antimony_horse_armor.json | 6 + .../basemetals/items/antimony_ingot.json | 6 + .../basemetals/items/antimony_leggings.json | 6 + .../basemetals/items/antimony_lever.json | 6 + .../basemetals/items/antimony_nugget.json | 6 + .../assets/basemetals/items/antimony_ore.json | 6 + .../basemetals/items/antimony_pickaxe.json | 6 + .../basemetals/items/antimony_plate.json | 6 + .../basemetals/items/antimony_powder.json | 6 + .../items/antimony_powder_dirty.json | 6 + .../items/antimony_pressure_plate.json | 6 + .../assets/basemetals/items/antimony_raw.json | 6 + .../assets/basemetals/items/antimony_rod.json | 6 + .../basemetals/items/antimony_scythe.json | 6 + .../basemetals/items/antimony_shard.json | 6 + .../basemetals/items/antimony_shears.json | 6 + .../basemetals/items/antimony_shield.json | 14 + .../basemetals/items/antimony_shovel.json | 6 + .../basemetals/items/antimony_slab.json | 6 + .../items/antimony_smallpowder.json | 6 + .../basemetals/items/antimony_stairs.json | 6 + .../basemetals/items/antimony_sword.json | 6 + .../basemetals/items/antimony_trapdoor.json | 6 + .../basemetals/items/antimony_wall.json | 6 + .../assets/basemetals/items/aquarium.json | 6 + .../basemetals/items/aquarium_arrow.json | 6 + .../assets/basemetals/items/aquarium_axe.json | 6 + .../basemetals/items/aquarium_bars.json | 6 + .../basemetals/items/aquarium_blend.json | 6 + .../basemetals/items/aquarium_block.json | 6 + .../basemetals/items/aquarium_bolt.json | 6 + .../basemetals/items/aquarium_boots.json | 6 + .../assets/basemetals/items/aquarium_bow.json | 35 ++ .../basemetals/items/aquarium_bucket.json | 20 + .../basemetals/items/aquarium_button.json | 6 + .../basemetals/items/aquarium_chestplate.json | 6 + .../items/aquarium_crackhammer.json | 6 + .../basemetals/items/aquarium_crossbow.json | 35 ++ .../basemetals/items/aquarium_door.json | 6 + .../items/aquarium_fishing_rod.json | 14 + .../basemetals/items/aquarium_gear.json | 6 + .../basemetals/items/aquarium_helmet.json | 6 + .../assets/basemetals/items/aquarium_hoe.json | 6 + .../items/aquarium_horse_armor.json | 6 + .../basemetals/items/aquarium_ingot.json | 6 + .../basemetals/items/aquarium_leggings.json | 6 + .../basemetals/items/aquarium_lever.json | 6 + .../basemetals/items/aquarium_nugget.json | 6 + .../basemetals/items/aquarium_pickaxe.json | 6 + .../basemetals/items/aquarium_plate.json | 6 + .../basemetals/items/aquarium_powder.json | 6 + .../items/aquarium_pressure_plate.json | 6 + .../assets/basemetals/items/aquarium_rod.json | 6 + .../basemetals/items/aquarium_scythe.json | 6 + .../basemetals/items/aquarium_shears.json | 6 + .../basemetals/items/aquarium_shield.json | 14 + .../basemetals/items/aquarium_shovel.json | 6 + .../basemetals/items/aquarium_slab.json | 6 + .../basemetals/items/aquarium_smallblend.json | 6 + .../items/aquarium_smallpowder.json | 6 + .../basemetals/items/aquarium_stairs.json | 6 + .../basemetals/items/aquarium_sword.json | 6 + .../basemetals/items/aquarium_trapdoor.json | 6 + .../basemetals/items/aquarium_wall.json | 6 + .../assets/basemetals/items/bismuth.json | 6 + .../basemetals/items/bismuth_arrow.json | 6 + .../assets/basemetals/items/bismuth_axe.json | 6 + .../assets/basemetals/items/bismuth_bars.json | 6 + .../basemetals/items/bismuth_block.json | 6 + .../assets/basemetals/items/bismuth_bolt.json | 6 + .../basemetals/items/bismuth_boots.json | 6 + .../assets/basemetals/items/bismuth_bow.json | 35 ++ .../basemetals/items/bismuth_bucket.json | 20 + .../basemetals/items/bismuth_button.json | 6 + .../basemetals/items/bismuth_casing.json | 6 + .../basemetals/items/bismuth_chestplate.json | 6 + .../basemetals/items/bismuth_clump.json | 6 + .../basemetals/items/bismuth_crackhammer.json | 6 + .../basemetals/items/bismuth_crossbow.json | 35 ++ .../basemetals/items/bismuth_crushed.json | 6 + .../items/bismuth_crushed_purified.json | 6 + .../basemetals/items/bismuth_crystal.json | 6 + .../basemetals/items/bismuth_dense_plate.json | 6 + .../assets/basemetals/items/bismuth_door.json | 6 + .../basemetals/items/bismuth_fishing_rod.json | 14 + .../assets/basemetals/items/bismuth_gear.json | 6 + .../basemetals/items/bismuth_helmet.json | 6 + .../assets/basemetals/items/bismuth_hoe.json | 6 + .../basemetals/items/bismuth_horse_armor.json | 6 + .../basemetals/items/bismuth_ingot.json | 6 + .../basemetals/items/bismuth_leggings.json | 6 + .../basemetals/items/bismuth_lever.json | 6 + .../basemetals/items/bismuth_nugget.json | 6 + .../assets/basemetals/items/bismuth_ore.json | 6 + .../basemetals/items/bismuth_pickaxe.json | 6 + .../basemetals/items/bismuth_plate.json | 6 + .../basemetals/items/bismuth_powder.json | 6 + .../items/bismuth_powder_dirty.json | 6 + .../items/bismuth_pressure_plate.json | 6 + .../assets/basemetals/items/bismuth_raw.json | 6 + .../assets/basemetals/items/bismuth_rod.json | 6 + .../basemetals/items/bismuth_scythe.json | 6 + .../basemetals/items/bismuth_shard.json | 6 + .../basemetals/items/bismuth_shears.json | 6 + .../basemetals/items/bismuth_shield.json | 14 + .../basemetals/items/bismuth_shovel.json | 6 + .../assets/basemetals/items/bismuth_slab.json | 6 + .../basemetals/items/bismuth_smallpowder.json | 6 + .../basemetals/items/bismuth_stairs.json | 6 + .../basemetals/items/bismuth_sword.json | 6 + .../basemetals/items/bismuth_trapdoor.json | 6 + .../assets/basemetals/items/bismuth_wall.json | 6 + .../assets/basemetals/items/brass.json | 6 + .../assets/basemetals/items/brass_arrow.json | 6 + .../assets/basemetals/items/brass_axe.json | 6 + .../assets/basemetals/items/brass_bars.json | 6 + .../assets/basemetals/items/brass_blend.json | 6 + .../assets/basemetals/items/brass_block.json | 6 + .../assets/basemetals/items/brass_bolt.json | 6 + .../assets/basemetals/items/brass_boots.json | 6 + .../assets/basemetals/items/brass_bow.json | 35 ++ .../assets/basemetals/items/brass_bucket.json | 20 + .../assets/basemetals/items/brass_button.json | 6 + .../basemetals/items/brass_chestplate.json | 6 + .../basemetals/items/brass_crackhammer.json | 6 + .../basemetals/items/brass_crossbow.json | 35 ++ .../assets/basemetals/items/brass_door.json | 6 + .../basemetals/items/brass_fishing_rod.json | 14 + .../assets/basemetals/items/brass_gear.json | 6 + .../assets/basemetals/items/brass_helmet.json | 6 + .../assets/basemetals/items/brass_hoe.json | 6 + .../basemetals/items/brass_horse_armor.json | 6 + .../assets/basemetals/items/brass_ingot.json | 6 + .../basemetals/items/brass_leggings.json | 6 + .../assets/basemetals/items/brass_lever.json | 6 + .../assets/basemetals/items/brass_nugget.json | 6 + .../basemetals/items/brass_pickaxe.json | 6 + .../assets/basemetals/items/brass_plate.json | 6 + .../assets/basemetals/items/brass_powder.json | 6 + .../items/brass_pressure_plate.json | 6 + .../assets/basemetals/items/brass_rod.json | 6 + .../assets/basemetals/items/brass_scythe.json | 6 + .../assets/basemetals/items/brass_shears.json | 6 + .../assets/basemetals/items/brass_shield.json | 14 + .../assets/basemetals/items/brass_shovel.json | 6 + .../assets/basemetals/items/brass_slab.json | 6 + .../basemetals/items/brass_smallblend.json | 6 + .../basemetals/items/brass_smallpowder.json | 6 + .../assets/basemetals/items/brass_stairs.json | 6 + .../assets/basemetals/items/brass_sword.json | 6 + .../basemetals/items/brass_trapdoor.json | 6 + .../assets/basemetals/items/brass_wall.json | 6 + .../assets/basemetals/items/bronze.json | 6 + .../assets/basemetals/items/bronze_arrow.json | 6 + .../assets/basemetals/items/bronze_axe.json | 6 + .../assets/basemetals/items/bronze_bars.json | 6 + .../assets/basemetals/items/bronze_blend.json | 6 + .../assets/basemetals/items/bronze_block.json | 6 + .../assets/basemetals/items/bronze_bolt.json | 6 + .../assets/basemetals/items/bronze_boots.json | 6 + .../assets/basemetals/items/bronze_bow.json | 35 ++ .../basemetals/items/bronze_bucket.json | 20 + .../basemetals/items/bronze_button.json | 6 + .../basemetals/items/bronze_chestplate.json | 6 + .../basemetals/items/bronze_crackhammer.json | 6 + .../basemetals/items/bronze_crossbow.json | 35 ++ .../assets/basemetals/items/bronze_door.json | 6 + .../basemetals/items/bronze_fishing_rod.json | 14 + .../assets/basemetals/items/bronze_gear.json | 6 + .../basemetals/items/bronze_helmet.json | 6 + .../assets/basemetals/items/bronze_hoe.json | 6 + .../basemetals/items/bronze_horse_armor.json | 6 + .../assets/basemetals/items/bronze_ingot.json | 6 + .../basemetals/items/bronze_leggings.json | 6 + .../assets/basemetals/items/bronze_lever.json | 6 + .../basemetals/items/bronze_nugget.json | 6 + .../basemetals/items/bronze_pickaxe.json | 6 + .../assets/basemetals/items/bronze_plate.json | 6 + .../basemetals/items/bronze_powder.json | 6 + .../items/bronze_pressure_plate.json | 6 + .../assets/basemetals/items/bronze_rod.json | 6 + .../basemetals/items/bronze_scythe.json | 6 + .../basemetals/items/bronze_shears.json | 6 + .../basemetals/items/bronze_shield.json | 14 + .../basemetals/items/bronze_shovel.json | 6 + .../assets/basemetals/items/bronze_slab.json | 6 + .../basemetals/items/bronze_smallblend.json | 6 + .../basemetals/items/bronze_smallpowder.json | 6 + .../basemetals/items/bronze_stairs.json | 6 + .../assets/basemetals/items/bronze_sword.json | 6 + .../basemetals/items/bronze_trapdoor.json | 6 + .../assets/basemetals/items/bronze_wall.json | 6 + .../assets/basemetals/items/charcoal.json | 6 + .../basemetals/items/charcoal_block.json | 6 + .../basemetals/items/charcoal_bucket.json | 20 + .../basemetals/items/charcoal_nugget.json | 6 + .../basemetals/items/charcoal_powder.json | 6 + .../items/charcoal_smallpowder.json | 6 + .../assets/basemetals/items/coal.json | 6 + .../assets/basemetals/items/coal_bucket.json | 20 + .../assets/basemetals/items/coal_nugget.json | 6 + .../assets/basemetals/items/coal_powder.json | 6 + .../basemetals/items/coal_smallpowder.json | 6 + .../assets/basemetals/items/coldiron.json | 6 + .../basemetals/items/coldiron_arrow.json | 6 + .../assets/basemetals/items/coldiron_axe.json | 6 + .../basemetals/items/coldiron_bars.json | 6 + .../basemetals/items/coldiron_block.json | 6 + .../basemetals/items/coldiron_bolt.json | 6 + .../basemetals/items/coldiron_boots.json | 6 + .../assets/basemetals/items/coldiron_bow.json | 35 ++ .../basemetals/items/coldiron_bucket.json | 20 + .../basemetals/items/coldiron_button.json | 6 + .../basemetals/items/coldiron_casing.json | 6 + .../basemetals/items/coldiron_chestplate.json | 6 + .../basemetals/items/coldiron_clump.json | 6 + .../items/coldiron_crackhammer.json | 6 + .../basemetals/items/coldiron_crossbow.json | 35 ++ .../basemetals/items/coldiron_crushed.json | 6 + .../items/coldiron_crushed_purified.json | 6 + .../basemetals/items/coldiron_crystal.json | 6 + .../items/coldiron_dense_plate.json | 6 + .../basemetals/items/coldiron_door.json | 6 + .../items/coldiron_fishing_rod.json | 14 + .../basemetals/items/coldiron_gear.json | 6 + .../basemetals/items/coldiron_helmet.json | 6 + .../assets/basemetals/items/coldiron_hoe.json | 6 + .../items/coldiron_horse_armor.json | 6 + .../basemetals/items/coldiron_ingot.json | 6 + .../basemetals/items/coldiron_leggings.json | 6 + .../basemetals/items/coldiron_lever.json | 6 + .../basemetals/items/coldiron_nugget.json | 6 + .../assets/basemetals/items/coldiron_ore.json | 6 + .../basemetals/items/coldiron_pickaxe.json | 6 + .../basemetals/items/coldiron_plate.json | 6 + .../basemetals/items/coldiron_powder.json | 6 + .../items/coldiron_powder_dirty.json | 6 + .../items/coldiron_pressure_plate.json | 6 + .../assets/basemetals/items/coldiron_raw.json | 6 + .../assets/basemetals/items/coldiron_rod.json | 6 + .../basemetals/items/coldiron_scythe.json | 6 + .../basemetals/items/coldiron_shard.json | 6 + .../basemetals/items/coldiron_shears.json | 6 + .../basemetals/items/coldiron_shield.json | 14 + .../basemetals/items/coldiron_shovel.json | 6 + .../basemetals/items/coldiron_slab.json | 6 + .../items/coldiron_smallpowder.json | 6 + .../basemetals/items/coldiron_stairs.json | 6 + .../basemetals/items/coldiron_sword.json | 6 + .../basemetals/items/coldiron_trapdoor.json | 6 + .../basemetals/items/coldiron_wall.json | 6 + .../assets/basemetals/items/copper.json | 6 + .../assets/basemetals/items/copper_arrow.json | 6 + .../assets/basemetals/items/copper_axe.json | 6 + .../assets/basemetals/items/copper_bars.json | 6 + .../assets/basemetals/items/copper_block.json | 6 + .../assets/basemetals/items/copper_bolt.json | 6 + .../assets/basemetals/items/copper_boots.json | 6 + .../assets/basemetals/items/copper_bow.json | 35 ++ .../basemetals/items/copper_bucket.json | 20 + .../basemetals/items/copper_button.json | 6 + .../basemetals/items/copper_chestplate.json | 6 + .../basemetals/items/copper_crackhammer.json | 6 + .../basemetals/items/copper_crossbow.json | 35 ++ .../assets/basemetals/items/copper_door.json | 6 + .../basemetals/items/copper_fishing_rod.json | 14 + .../assets/basemetals/items/copper_gear.json | 6 + .../basemetals/items/copper_helmet.json | 6 + .../assets/basemetals/items/copper_hoe.json | 6 + .../basemetals/items/copper_horse_armor.json | 6 + .../assets/basemetals/items/copper_ingot.json | 6 + .../basemetals/items/copper_leggings.json | 6 + .../assets/basemetals/items/copper_lever.json | 6 + .../basemetals/items/copper_nugget.json | 6 + .../assets/basemetals/items/copper_ore.json | 6 + .../basemetals/items/copper_pickaxe.json | 6 + .../assets/basemetals/items/copper_plate.json | 6 + .../basemetals/items/copper_powder.json | 6 + .../items/copper_pressure_plate.json | 6 + .../assets/basemetals/items/copper_rod.json | 6 + .../basemetals/items/copper_scythe.json | 6 + .../basemetals/items/copper_shears.json | 6 + .../basemetals/items/copper_shield.json | 14 + .../basemetals/items/copper_shovel.json | 6 + .../assets/basemetals/items/copper_slab.json | 6 + .../basemetals/items/copper_smallpowder.json | 6 + .../basemetals/items/copper_stairs.json | 6 + .../assets/basemetals/items/copper_sword.json | 6 + .../basemetals/items/copper_trapdoor.json | 6 + .../assets/basemetals/items/copper_wall.json | 6 + .../assets/basemetals/items/cupronickel.json | 6 + .../basemetals/items/cupronickel_arrow.json | 6 + .../basemetals/items/cupronickel_axe.json | 6 + .../basemetals/items/cupronickel_bars.json | 6 + .../basemetals/items/cupronickel_blend.json | 6 + .../basemetals/items/cupronickel_block.json | 6 + .../basemetals/items/cupronickel_bolt.json | 6 + .../basemetals/items/cupronickel_boots.json | 6 + .../basemetals/items/cupronickel_bow.json | 35 ++ .../basemetals/items/cupronickel_bucket.json | 20 + .../basemetals/items/cupronickel_button.json | 6 + .../items/cupronickel_chestplate.json | 6 + .../items/cupronickel_crackhammer.json | 6 + .../items/cupronickel_crossbow.json | 35 ++ .../basemetals/items/cupronickel_door.json | 6 + .../items/cupronickel_fishing_rod.json | 14 + .../basemetals/items/cupronickel_gear.json | 6 + .../basemetals/items/cupronickel_helmet.json | 6 + .../basemetals/items/cupronickel_hoe.json | 6 + .../items/cupronickel_horse_armor.json | 6 + .../basemetals/items/cupronickel_ingot.json | 6 + .../items/cupronickel_leggings.json | 6 + .../basemetals/items/cupronickel_lever.json | 6 + .../basemetals/items/cupronickel_nugget.json | 6 + .../basemetals/items/cupronickel_pickaxe.json | 6 + .../basemetals/items/cupronickel_plate.json | 6 + .../basemetals/items/cupronickel_powder.json | 6 + .../items/cupronickel_pressure_plate.json | 6 + .../basemetals/items/cupronickel_rod.json | 6 + .../basemetals/items/cupronickel_scythe.json | 6 + .../basemetals/items/cupronickel_shears.json | 6 + .../basemetals/items/cupronickel_shield.json | 14 + .../basemetals/items/cupronickel_shovel.json | 6 + .../basemetals/items/cupronickel_slab.json | 6 + .../items/cupronickel_smallblend.json | 6 + .../items/cupronickel_smallpowder.json | 6 + .../basemetals/items/cupronickel_stairs.json | 6 + .../basemetals/items/cupronickel_sword.json | 6 + .../items/cupronickel_trapdoor.json | 6 + .../basemetals/items/cupronickel_wall.json | 6 + .../assets/basemetals/items/diamond.json | 6 + .../basemetals/items/diamond_arrow.json | 6 + .../assets/basemetals/items/diamond_bars.json | 6 + .../basemetals/items/diamond_blend.json | 6 + .../assets/basemetals/items/diamond_bolt.json | 6 + .../assets/basemetals/items/diamond_bow.json | 35 ++ .../basemetals/items/diamond_bucket.json | 20 + .../basemetals/items/diamond_button.json | 6 + .../basemetals/items/diamond_crackhammer.json | 6 + .../basemetals/items/diamond_crossbow.json | 35 ++ .../assets/basemetals/items/diamond_door.json | 6 + .../basemetals/items/diamond_fishing_rod.json | 14 + .../assets/basemetals/items/diamond_gear.json | 6 + .../basemetals/items/diamond_lever.json | 6 + .../basemetals/items/diamond_nugget.json | 6 + .../basemetals/items/diamond_powder.json | 6 + .../items/diamond_pressure_plate.json | 6 + .../assets/basemetals/items/diamond_rod.json | 6 + .../basemetals/items/diamond_scythe.json | 6 + .../basemetals/items/diamond_shears.json | 6 + .../basemetals/items/diamond_shield.json | 14 + .../assets/basemetals/items/diamond_slab.json | 6 + .../basemetals/items/diamond_smallblend.json | 6 + .../basemetals/items/diamond_smallpowder.json | 6 + .../basemetals/items/diamond_stairs.json | 6 + .../basemetals/items/diamond_trapdoor.json | 6 + .../assets/basemetals/items/diamond_wall.json | 6 + .../assets/basemetals/items/electrum.json | 6 + .../basemetals/items/electrum_arrow.json | 6 + .../assets/basemetals/items/electrum_axe.json | 6 + .../basemetals/items/electrum_bars.json | 6 + .../basemetals/items/electrum_blend.json | 6 + .../basemetals/items/electrum_block.json | 6 + .../basemetals/items/electrum_bolt.json | 6 + .../basemetals/items/electrum_boots.json | 6 + .../assets/basemetals/items/electrum_bow.json | 35 ++ .../basemetals/items/electrum_bucket.json | 20 + .../basemetals/items/electrum_button.json | 6 + .../basemetals/items/electrum_chestplate.json | 6 + .../items/electrum_crackhammer.json | 6 + .../basemetals/items/electrum_crossbow.json | 35 ++ .../basemetals/items/electrum_door.json | 6 + .../items/electrum_fishing_rod.json | 14 + .../basemetals/items/electrum_gear.json | 6 + .../basemetals/items/electrum_helmet.json | 6 + .../assets/basemetals/items/electrum_hoe.json | 6 + .../items/electrum_horse_armor.json | 6 + .../basemetals/items/electrum_ingot.json | 6 + .../basemetals/items/electrum_leggings.json | 6 + .../basemetals/items/electrum_lever.json | 6 + .../basemetals/items/electrum_nugget.json | 6 + .../basemetals/items/electrum_pickaxe.json | 6 + .../basemetals/items/electrum_plate.json | 6 + .../basemetals/items/electrum_powder.json | 6 + .../items/electrum_pressure_plate.json | 6 + .../assets/basemetals/items/electrum_rod.json | 6 + .../basemetals/items/electrum_scythe.json | 6 + .../basemetals/items/electrum_shears.json | 6 + .../basemetals/items/electrum_shield.json | 14 + .../basemetals/items/electrum_shovel.json | 6 + .../basemetals/items/electrum_slab.json | 6 + .../basemetals/items/electrum_smallblend.json | 6 + .../items/electrum_smallpowder.json | 6 + .../basemetals/items/electrum_stairs.json | 6 + .../basemetals/items/electrum_sword.json | 6 + .../basemetals/items/electrum_trapdoor.json | 6 + .../basemetals/items/electrum_wall.json | 6 + .../assets/basemetals/items/emerald.json | 6 + .../basemetals/items/emerald_arrow.json | 6 + .../assets/basemetals/items/emerald_axe.json | 6 + .../assets/basemetals/items/emerald_bars.json | 6 + .../assets/basemetals/items/emerald_bolt.json | 6 + .../basemetals/items/emerald_boots.json | 6 + .../assets/basemetals/items/emerald_bow.json | 35 ++ .../basemetals/items/emerald_bucket.json | 20 + .../basemetals/items/emerald_button.json | 6 + .../basemetals/items/emerald_chestplate.json | 6 + .../basemetals/items/emerald_crackhammer.json | 6 + .../basemetals/items/emerald_crossbow.json | 35 ++ .../assets/basemetals/items/emerald_door.json | 6 + .../basemetals/items/emerald_fishing_rod.json | 14 + .../assets/basemetals/items/emerald_gear.json | 6 + .../basemetals/items/emerald_helmet.json | 6 + .../assets/basemetals/items/emerald_hoe.json | 6 + .../basemetals/items/emerald_horse_armor.json | 6 + .../basemetals/items/emerald_leggings.json | 6 + .../basemetals/items/emerald_lever.json | 6 + .../basemetals/items/emerald_nugget.json | 6 + .../basemetals/items/emerald_pickaxe.json | 6 + .../basemetals/items/emerald_powder.json | 6 + .../items/emerald_pressure_plate.json | 6 + .../assets/basemetals/items/emerald_rod.json | 6 + .../basemetals/items/emerald_scythe.json | 6 + .../basemetals/items/emerald_shears.json | 6 + .../basemetals/items/emerald_shield.json | 14 + .../basemetals/items/emerald_shovel.json | 6 + .../assets/basemetals/items/emerald_slab.json | 6 + .../basemetals/items/emerald_smallpowder.json | 6 + .../basemetals/items/emerald_stairs.json | 6 + .../basemetals/items/emerald_sword.json | 6 + .../basemetals/items/emerald_trapdoor.json | 6 + .../assets/basemetals/items/emerald_wall.json | 6 + .../assets/basemetals/items/ender.json | 6 + .../assets/basemetals/items/ender_bucket.json | 20 + .../assets/basemetals/items/gold.json | 6 + .../assets/basemetals/items/gold_arrow.json | 6 + .../assets/basemetals/items/gold_bars.json | 6 + .../assets/basemetals/items/gold_blend.json | 6 + .../assets/basemetals/items/gold_bolt.json | 6 + .../assets/basemetals/items/gold_bow.json | 35 ++ .../assets/basemetals/items/gold_bucket.json | 20 + .../assets/basemetals/items/gold_button.json | 6 + .../basemetals/items/gold_crackhammer.json | 6 + .../basemetals/items/gold_crossbow.json | 35 ++ .../assets/basemetals/items/gold_door.json | 6 + .../basemetals/items/gold_fishing_rod.json | 14 + .../assets/basemetals/items/gold_gear.json | 6 + .../assets/basemetals/items/gold_lever.json | 6 + .../assets/basemetals/items/gold_plate.json | 6 + .../assets/basemetals/items/gold_powder.json | 6 + .../assets/basemetals/items/gold_rod.json | 6 + .../assets/basemetals/items/gold_scythe.json | 6 + .../assets/basemetals/items/gold_shears.json | 6 + .../assets/basemetals/items/gold_shield.json | 14 + .../assets/basemetals/items/gold_slab.json | 6 + .../basemetals/items/gold_smallblend.json | 6 + .../basemetals/items/gold_smallpowder.json | 6 + .../assets/basemetals/items/gold_stairs.json | 6 + .../basemetals/items/gold_trapdoor.json | 6 + .../assets/basemetals/items/gold_wall.json | 6 + .../basemetals/items/human_detector.json | 6 + .../assets/basemetals/items/invar.json | 6 + .../assets/basemetals/items/invar_arrow.json | 6 + .../assets/basemetals/items/invar_axe.json | 6 + .../assets/basemetals/items/invar_bars.json | 6 + .../assets/basemetals/items/invar_blend.json | 6 + .../assets/basemetals/items/invar_block.json | 6 + .../assets/basemetals/items/invar_bolt.json | 6 + .../assets/basemetals/items/invar_boots.json | 6 + .../assets/basemetals/items/invar_bow.json | 35 ++ .../assets/basemetals/items/invar_bucket.json | 20 + .../assets/basemetals/items/invar_button.json | 6 + .../basemetals/items/invar_chestplate.json | 6 + .../basemetals/items/invar_crackhammer.json | 6 + .../basemetals/items/invar_crossbow.json | 35 ++ .../assets/basemetals/items/invar_door.json | 6 + .../basemetals/items/invar_fishing_rod.json | 14 + .../assets/basemetals/items/invar_gear.json | 6 + .../assets/basemetals/items/invar_helmet.json | 6 + .../assets/basemetals/items/invar_hoe.json | 6 + .../basemetals/items/invar_horse_armor.json | 6 + .../assets/basemetals/items/invar_ingot.json | 6 + .../basemetals/items/invar_leggings.json | 6 + .../assets/basemetals/items/invar_lever.json | 6 + .../assets/basemetals/items/invar_nugget.json | 6 + .../basemetals/items/invar_pickaxe.json | 6 + .../assets/basemetals/items/invar_plate.json | 6 + .../assets/basemetals/items/invar_powder.json | 6 + .../items/invar_pressure_plate.json | 6 + .../assets/basemetals/items/invar_rod.json | 6 + .../assets/basemetals/items/invar_scythe.json | 6 + .../assets/basemetals/items/invar_shears.json | 6 + .../assets/basemetals/items/invar_shield.json | 14 + .../assets/basemetals/items/invar_shovel.json | 6 + .../assets/basemetals/items/invar_slab.json | 6 + .../basemetals/items/invar_smallblend.json | 6 + .../basemetals/items/invar_smallpowder.json | 6 + .../assets/basemetals/items/invar_stairs.json | 6 + .../assets/basemetals/items/invar_sword.json | 6 + .../basemetals/items/invar_trapdoor.json | 6 + .../assets/basemetals/items/invar_wall.json | 6 + .../assets/basemetals/items/iron.json | 6 + .../assets/basemetals/items/iron_arrow.json | 6 + .../assets/basemetals/items/iron_blend.json | 6 + .../assets/basemetals/items/iron_bolt.json | 6 + .../assets/basemetals/items/iron_bow.json | 35 ++ .../assets/basemetals/items/iron_bucket.json | 20 + .../assets/basemetals/items/iron_button.json | 6 + .../basemetals/items/iron_crackhammer.json | 6 + .../basemetals/items/iron_crossbow.json | 35 ++ .../basemetals/items/iron_fishing_rod.json | 14 + .../assets/basemetals/items/iron_gear.json | 6 + .../assets/basemetals/items/iron_lever.json | 6 + .../assets/basemetals/items/iron_plate.json | 6 + .../assets/basemetals/items/iron_powder.json | 6 + .../assets/basemetals/items/iron_rod.json | 6 + .../assets/basemetals/items/iron_scythe.json | 6 + .../assets/basemetals/items/iron_shield.json | 14 + .../assets/basemetals/items/iron_slab.json | 6 + .../basemetals/items/iron_smallblend.json | 6 + .../basemetals/items/iron_smallpowder.json | 6 + .../assets/basemetals/items/iron_stairs.json | 6 + .../assets/basemetals/items/iron_wall.json | 6 + .../assets/basemetals/items/lapis.json | 6 + .../assets/basemetals/items/lapis_bucket.json | 20 + .../basemetals/items/lapis_smallpowder.json | 6 + .../assets/basemetals/items/lead.json | 6 + .../assets/basemetals/items/lead_arrow.json | 6 + .../assets/basemetals/items/lead_axe.json | 6 + .../assets/basemetals/items/lead_bars.json | 6 + .../assets/basemetals/items/lead_block.json | 6 + .../assets/basemetals/items/lead_bolt.json | 6 + .../assets/basemetals/items/lead_boots.json | 6 + .../assets/basemetals/items/lead_bow.json | 35 ++ .../assets/basemetals/items/lead_bucket.json | 20 + .../assets/basemetals/items/lead_button.json | 6 + .../basemetals/items/lead_chestplate.json | 6 + .../basemetals/items/lead_crackhammer.json | 6 + .../basemetals/items/lead_crossbow.json | 35 ++ .../assets/basemetals/items/lead_door.json | 6 + .../basemetals/items/lead_fishing_rod.json | 14 + .../assets/basemetals/items/lead_gear.json | 6 + .../assets/basemetals/items/lead_helmet.json | 6 + .../assets/basemetals/items/lead_hoe.json | 6 + .../basemetals/items/lead_horse_armor.json | 6 + .../assets/basemetals/items/lead_ingot.json | 6 + .../basemetals/items/lead_leggings.json | 6 + .../assets/basemetals/items/lead_lever.json | 6 + .../assets/basemetals/items/lead_nugget.json | 6 + .../assets/basemetals/items/lead_ore.json | 6 + .../assets/basemetals/items/lead_pickaxe.json | 6 + .../assets/basemetals/items/lead_plate.json | 6 + .../assets/basemetals/items/lead_powder.json | 6 + .../basemetals/items/lead_pressure_plate.json | 6 + .../assets/basemetals/items/lead_raw.json | 6 + .../assets/basemetals/items/lead_rod.json | 6 + .../assets/basemetals/items/lead_scythe.json | 6 + .../assets/basemetals/items/lead_shears.json | 6 + .../assets/basemetals/items/lead_shield.json | 14 + .../assets/basemetals/items/lead_shovel.json | 6 + .../assets/basemetals/items/lead_slab.json | 6 + .../basemetals/items/lead_smallpowder.json | 6 + .../assets/basemetals/items/lead_stairs.json | 6 + .../assets/basemetals/items/lead_sword.json | 6 + .../basemetals/items/lead_trapdoor.json | 6 + .../assets/basemetals/items/lead_wall.json | 6 + .../assets/basemetals/items/mercury.json | 6 + .../basemetals/items/mercury_bucket.json | 20 + .../basemetals/items/mercury_ingot.json | 6 + .../basemetals/items/mercury_nugget.json | 6 + .../assets/basemetals/items/mercury_ore.json | 6 + .../basemetals/items/mercury_powder.json | 6 + .../assets/basemetals/items/mercury_raw.json | 6 + .../basemetals/items/mercury_smallpowder.json | 6 + .../assets/basemetals/items/mithril.json | 6 + .../basemetals/items/mithril_arrow.json | 6 + .../assets/basemetals/items/mithril_axe.json | 6 + .../assets/basemetals/items/mithril_bars.json | 6 + .../basemetals/items/mithril_blend.json | 6 + .../basemetals/items/mithril_block.json | 6 + .../assets/basemetals/items/mithril_bolt.json | 6 + .../basemetals/items/mithril_boots.json | 6 + .../assets/basemetals/items/mithril_bow.json | 35 ++ .../basemetals/items/mithril_bucket.json | 20 + .../basemetals/items/mithril_button.json | 6 + .../basemetals/items/mithril_chestplate.json | 6 + .../basemetals/items/mithril_crackhammer.json | 6 + .../basemetals/items/mithril_crossbow.json | 35 ++ .../assets/basemetals/items/mithril_door.json | 6 + .../basemetals/items/mithril_fishing_rod.json | 14 + .../assets/basemetals/items/mithril_gear.json | 6 + .../basemetals/items/mithril_helmet.json | 6 + .../assets/basemetals/items/mithril_hoe.json | 6 + .../basemetals/items/mithril_horse_armor.json | 6 + .../basemetals/items/mithril_ingot.json | 6 + .../basemetals/items/mithril_leggings.json | 6 + .../basemetals/items/mithril_lever.json | 6 + .../basemetals/items/mithril_nugget.json | 6 + .../basemetals/items/mithril_pickaxe.json | 6 + .../basemetals/items/mithril_plate.json | 6 + .../basemetals/items/mithril_powder.json | 6 + .../items/mithril_pressure_plate.json | 6 + .../assets/basemetals/items/mithril_rod.json | 6 + .../basemetals/items/mithril_scythe.json | 6 + .../basemetals/items/mithril_shears.json | 6 + .../basemetals/items/mithril_shield.json | 14 + .../basemetals/items/mithril_shovel.json | 6 + .../assets/basemetals/items/mithril_slab.json | 6 + .../basemetals/items/mithril_smallblend.json | 6 + .../basemetals/items/mithril_smallpowder.json | 6 + .../basemetals/items/mithril_stairs.json | 6 + .../basemetals/items/mithril_sword.json | 6 + .../basemetals/items/mithril_trapdoor.json | 6 + .../assets/basemetals/items/mithril_wall.json | 6 + .../assets/basemetals/items/nickel.json | 6 + .../assets/basemetals/items/nickel_arrow.json | 6 + .../assets/basemetals/items/nickel_axe.json | 6 + .../assets/basemetals/items/nickel_bars.json | 6 + .../assets/basemetals/items/nickel_block.json | 6 + .../assets/basemetals/items/nickel_bolt.json | 6 + .../assets/basemetals/items/nickel_boots.json | 6 + .../assets/basemetals/items/nickel_bow.json | 35 ++ .../basemetals/items/nickel_bucket.json | 20 + .../basemetals/items/nickel_button.json | 6 + .../basemetals/items/nickel_casing.json | 6 + .../basemetals/items/nickel_chestplate.json | 6 + .../assets/basemetals/items/nickel_clump.json | 6 + .../basemetals/items/nickel_crackhammer.json | 6 + .../basemetals/items/nickel_crossbow.json | 35 ++ .../basemetals/items/nickel_crushed.json | 6 + .../items/nickel_crushed_purified.json | 6 + .../basemetals/items/nickel_crystal.json | 6 + .../basemetals/items/nickel_dense_plate.json | 6 + .../assets/basemetals/items/nickel_door.json | 6 + .../basemetals/items/nickel_fishing_rod.json | 14 + .../assets/basemetals/items/nickel_gear.json | 6 + .../basemetals/items/nickel_helmet.json | 6 + .../assets/basemetals/items/nickel_hoe.json | 6 + .../basemetals/items/nickel_horse_armor.json | 6 + .../assets/basemetals/items/nickel_ingot.json | 6 + .../basemetals/items/nickel_leggings.json | 6 + .../assets/basemetals/items/nickel_lever.json | 6 + .../basemetals/items/nickel_nugget.json | 6 + .../assets/basemetals/items/nickel_ore.json | 6 + .../basemetals/items/nickel_pickaxe.json | 6 + .../assets/basemetals/items/nickel_plate.json | 6 + .../basemetals/items/nickel_powder.json | 6 + .../basemetals/items/nickel_powder_dirty.json | 6 + .../items/nickel_pressure_plate.json | 6 + .../assets/basemetals/items/nickel_raw.json | 6 + .../assets/basemetals/items/nickel_rod.json | 6 + .../basemetals/items/nickel_scythe.json | 6 + .../assets/basemetals/items/nickel_shard.json | 6 + .../basemetals/items/nickel_shears.json | 6 + .../basemetals/items/nickel_shield.json | 14 + .../basemetals/items/nickel_shovel.json | 6 + .../assets/basemetals/items/nickel_slab.json | 6 + .../basemetals/items/nickel_smallpowder.json | 6 + .../basemetals/items/nickel_stairs.json | 6 + .../assets/basemetals/items/nickel_sword.json | 6 + .../basemetals/items/nickel_trapdoor.json | 6 + .../assets/basemetals/items/nickel_wall.json | 6 + .../assets/basemetals/items/obsidian.json | 6 + .../basemetals/items/obsidian_arrow.json | 6 + .../assets/basemetals/items/obsidian_axe.json | 6 + .../basemetals/items/obsidian_bars.json | 6 + .../basemetals/items/obsidian_bolt.json | 6 + .../basemetals/items/obsidian_boots.json | 6 + .../assets/basemetals/items/obsidian_bow.json | 35 ++ .../basemetals/items/obsidian_bucket.json | 20 + .../basemetals/items/obsidian_button.json | 6 + .../basemetals/items/obsidian_chestplate.json | 6 + .../items/obsidian_crackhammer.json | 6 + .../basemetals/items/obsidian_crossbow.json | 35 ++ .../basemetals/items/obsidian_door.json | 6 + .../items/obsidian_fishing_rod.json | 14 + .../basemetals/items/obsidian_gear.json | 6 + .../basemetals/items/obsidian_helmet.json | 6 + .../assets/basemetals/items/obsidian_hoe.json | 6 + .../items/obsidian_horse_armor.json | 6 + .../basemetals/items/obsidian_ingot.json | 6 + .../basemetals/items/obsidian_leggings.json | 6 + .../basemetals/items/obsidian_lever.json | 6 + .../basemetals/items/obsidian_nugget.json | 6 + .../basemetals/items/obsidian_pickaxe.json | 6 + .../basemetals/items/obsidian_powder.json | 6 + .../items/obsidian_pressure_plate.json | 6 + .../assets/basemetals/items/obsidian_rod.json | 6 + .../basemetals/items/obsidian_scythe.json | 6 + .../basemetals/items/obsidian_shears.json | 6 + .../basemetals/items/obsidian_shield.json | 14 + .../basemetals/items/obsidian_shovel.json | 6 + .../basemetals/items/obsidian_slab.json | 6 + .../items/obsidian_smallpowder.json | 6 + .../basemetals/items/obsidian_stairs.json | 6 + .../basemetals/items/obsidian_sword.json | 6 + .../basemetals/items/obsidian_trapdoor.json | 6 + .../basemetals/items/obsidian_wall.json | 6 + .../assets/basemetals/items/pewter.json | 6 + .../assets/basemetals/items/pewter_arrow.json | 6 + .../assets/basemetals/items/pewter_axe.json | 6 + .../assets/basemetals/items/pewter_bars.json | 6 + .../assets/basemetals/items/pewter_blend.json | 6 + .../assets/basemetals/items/pewter_block.json | 6 + .../assets/basemetals/items/pewter_bolt.json | 6 + .../assets/basemetals/items/pewter_boots.json | 6 + .../assets/basemetals/items/pewter_bow.json | 35 ++ .../basemetals/items/pewter_bucket.json | 20 + .../basemetals/items/pewter_button.json | 6 + .../basemetals/items/pewter_chestplate.json | 6 + .../basemetals/items/pewter_crackhammer.json | 6 + .../basemetals/items/pewter_crossbow.json | 35 ++ .../assets/basemetals/items/pewter_door.json | 6 + .../basemetals/items/pewter_fishing_rod.json | 14 + .../assets/basemetals/items/pewter_gear.json | 6 + .../basemetals/items/pewter_helmet.json | 6 + .../assets/basemetals/items/pewter_hoe.json | 6 + .../basemetals/items/pewter_horse_armor.json | 6 + .../assets/basemetals/items/pewter_ingot.json | 6 + .../basemetals/items/pewter_leggings.json | 6 + .../assets/basemetals/items/pewter_lever.json | 6 + .../basemetals/items/pewter_nugget.json | 6 + .../basemetals/items/pewter_pickaxe.json | 6 + .../assets/basemetals/items/pewter_plate.json | 6 + .../basemetals/items/pewter_powder.json | 6 + .../items/pewter_pressure_plate.json | 6 + .../assets/basemetals/items/pewter_rod.json | 6 + .../basemetals/items/pewter_scythe.json | 6 + .../basemetals/items/pewter_shears.json | 6 + .../basemetals/items/pewter_shield.json | 14 + .../basemetals/items/pewter_shovel.json | 6 + .../assets/basemetals/items/pewter_slab.json | 6 + .../basemetals/items/pewter_smallblend.json | 6 + .../basemetals/items/pewter_smallpowder.json | 6 + .../basemetals/items/pewter_stairs.json | 6 + .../assets/basemetals/items/pewter_sword.json | 6 + .../basemetals/items/pewter_trapdoor.json | 6 + .../assets/basemetals/items/pewter_wall.json | 6 + .../assets/basemetals/items/platinum.json | 6 + .../basemetals/items/platinum_arrow.json | 6 + .../assets/basemetals/items/platinum_axe.json | 6 + .../basemetals/items/platinum_bars.json | 6 + .../basemetals/items/platinum_block.json | 6 + .../basemetals/items/platinum_bolt.json | 6 + .../basemetals/items/platinum_boots.json | 6 + .../assets/basemetals/items/platinum_bow.json | 35 ++ .../basemetals/items/platinum_bucket.json | 20 + .../basemetals/items/platinum_button.json | 6 + .../basemetals/items/platinum_casing.json | 6 + .../basemetals/items/platinum_chestplate.json | 6 + .../basemetals/items/platinum_clump.json | 6 + .../items/platinum_crackhammer.json | 6 + .../basemetals/items/platinum_crossbow.json | 35 ++ .../basemetals/items/platinum_crushed.json | 6 + .../items/platinum_crushed_purified.json | 6 + .../basemetals/items/platinum_crystal.json | 6 + .../items/platinum_dense_plate.json | 6 + .../basemetals/items/platinum_door.json | 6 + .../items/platinum_fishing_rod.json | 14 + .../basemetals/items/platinum_gear.json | 6 + .../basemetals/items/platinum_helmet.json | 6 + .../assets/basemetals/items/platinum_hoe.json | 6 + .../items/platinum_horse_armor.json | 6 + .../basemetals/items/platinum_ingot.json | 6 + .../basemetals/items/platinum_leggings.json | 6 + .../basemetals/items/platinum_lever.json | 6 + .../basemetals/items/platinum_nugget.json | 6 + .../assets/basemetals/items/platinum_ore.json | 6 + .../basemetals/items/platinum_pickaxe.json | 6 + .../basemetals/items/platinum_plate.json | 6 + .../basemetals/items/platinum_powder.json | 6 + .../items/platinum_powder_dirty.json | 6 + .../items/platinum_pressure_plate.json | 6 + .../assets/basemetals/items/platinum_raw.json | 6 + .../assets/basemetals/items/platinum_rod.json | 6 + .../basemetals/items/platinum_scythe.json | 6 + .../basemetals/items/platinum_shard.json | 6 + .../basemetals/items/platinum_shears.json | 6 + .../basemetals/items/platinum_shield.json | 14 + .../basemetals/items/platinum_shovel.json | 6 + .../basemetals/items/platinum_slab.json | 6 + .../items/platinum_smallpowder.json | 6 + .../basemetals/items/platinum_stairs.json | 6 + .../basemetals/items/platinum_sword.json | 6 + .../basemetals/items/platinum_trapdoor.json | 6 + .../basemetals/items/platinum_wall.json | 6 + .../assets/basemetals/items/prismarine.json | 6 + .../basemetals/items/prismarine_bucket.json | 20 + .../assets/basemetals/items/quartz.json | 6 + .../assets/basemetals/items/quartz_arrow.json | 6 + .../assets/basemetals/items/quartz_axe.json | 6 + .../assets/basemetals/items/quartz_bars.json | 6 + .../assets/basemetals/items/quartz_bolt.json | 6 + .../assets/basemetals/items/quartz_boots.json | 6 + .../assets/basemetals/items/quartz_bow.json | 35 ++ .../basemetals/items/quartz_bucket.json | 20 + .../basemetals/items/quartz_button.json | 6 + .../basemetals/items/quartz_chestplate.json | 6 + .../basemetals/items/quartz_crackhammer.json | 6 + .../basemetals/items/quartz_crossbow.json | 35 ++ .../assets/basemetals/items/quartz_door.json | 6 + .../basemetals/items/quartz_fishing_rod.json | 14 + .../assets/basemetals/items/quartz_gear.json | 6 + .../basemetals/items/quartz_helmet.json | 6 + .../assets/basemetals/items/quartz_hoe.json | 6 + .../basemetals/items/quartz_horse_armor.json | 6 + .../basemetals/items/quartz_leggings.json | 6 + .../assets/basemetals/items/quartz_lever.json | 6 + .../basemetals/items/quartz_nugget.json | 6 + .../basemetals/items/quartz_pickaxe.json | 6 + .../basemetals/items/quartz_powder.json | 6 + .../items/quartz_pressure_plate.json | 6 + .../assets/basemetals/items/quartz_rod.json | 6 + .../basemetals/items/quartz_scythe.json | 6 + .../basemetals/items/quartz_shears.json | 6 + .../basemetals/items/quartz_shield.json | 14 + .../basemetals/items/quartz_shovel.json | 6 + .../basemetals/items/quartz_smallpowder.json | 6 + .../assets/basemetals/items/quartz_sword.json | 6 + .../basemetals/items/quartz_trapdoor.json | 6 + .../assets/basemetals/items/quartz_wall.json | 6 + .../assets/basemetals/items/redstone.json | 6 + .../basemetals/items/redstone_bucket.json | 20 + .../basemetals/items/redstone_ingot.json | 6 + .../items/redstone_smallpowder.json | 6 + .../assets/basemetals/items/silver.json | 6 + .../assets/basemetals/items/silver_arrow.json | 6 + .../assets/basemetals/items/silver_axe.json | 6 + .../assets/basemetals/items/silver_bars.json | 6 + .../assets/basemetals/items/silver_block.json | 6 + .../assets/basemetals/items/silver_bolt.json | 6 + .../assets/basemetals/items/silver_boots.json | 6 + .../assets/basemetals/items/silver_bow.json | 35 ++ .../basemetals/items/silver_bucket.json | 20 + .../basemetals/items/silver_button.json | 6 + .../basemetals/items/silver_chestplate.json | 6 + .../basemetals/items/silver_crackhammer.json | 6 + .../basemetals/items/silver_crossbow.json | 35 ++ .../assets/basemetals/items/silver_door.json | 6 + .../basemetals/items/silver_fishing_rod.json | 14 + .../assets/basemetals/items/silver_gear.json | 6 + .../basemetals/items/silver_helmet.json | 6 + .../assets/basemetals/items/silver_hoe.json | 6 + .../basemetals/items/silver_horse_armor.json | 6 + .../assets/basemetals/items/silver_ingot.json | 6 + .../basemetals/items/silver_leggings.json | 6 + .../assets/basemetals/items/silver_lever.json | 6 + .../basemetals/items/silver_nugget.json | 6 + .../assets/basemetals/items/silver_ore.json | 6 + .../basemetals/items/silver_pickaxe.json | 6 + .../assets/basemetals/items/silver_plate.json | 6 + .../basemetals/items/silver_powder.json | 6 + .../items/silver_pressure_plate.json | 6 + .../assets/basemetals/items/silver_raw.json | 6 + .../assets/basemetals/items/silver_rod.json | 6 + .../basemetals/items/silver_scythe.json | 6 + .../basemetals/items/silver_shears.json | 6 + .../basemetals/items/silver_shield.json | 14 + .../basemetals/items/silver_shovel.json | 6 + .../assets/basemetals/items/silver_slab.json | 6 + .../basemetals/items/silver_smallpowder.json | 6 + .../basemetals/items/silver_stairs.json | 6 + .../assets/basemetals/items/silver_sword.json | 6 + .../basemetals/items/silver_trapdoor.json | 6 + .../assets/basemetals/items/silver_wall.json | 6 + .../assets/basemetals/items/starsteel.json | 6 + .../basemetals/items/starsteel_arrow.json | 6 + .../basemetals/items/starsteel_axe.json | 6 + .../basemetals/items/starsteel_bars.json | 6 + .../basemetals/items/starsteel_block.json | 6 + .../basemetals/items/starsteel_bolt.json | 6 + .../basemetals/items/starsteel_boots.json | 6 + .../basemetals/items/starsteel_bow.json | 35 ++ .../basemetals/items/starsteel_bucket.json | 20 + .../basemetals/items/starsteel_button.json | 6 + .../basemetals/items/starsteel_casing.json | 6 + .../items/starsteel_chestplate.json | 6 + .../basemetals/items/starsteel_clump.json | 6 + .../items/starsteel_crackhammer.json | 6 + .../basemetals/items/starsteel_crossbow.json | 35 ++ .../basemetals/items/starsteel_crushed.json | 6 + .../items/starsteel_crushed_purified.json | 6 + .../basemetals/items/starsteel_crystal.json | 6 + .../items/starsteel_dense_plate.json | 6 + .../basemetals/items/starsteel_door.json | 6 + .../items/starsteel_fishing_rod.json | 14 + .../basemetals/items/starsteel_gear.json | 6 + .../basemetals/items/starsteel_helmet.json | 6 + .../basemetals/items/starsteel_hoe.json | 6 + .../items/starsteel_horse_armor.json | 6 + .../basemetals/items/starsteel_ingot.json | 6 + .../basemetals/items/starsteel_leggings.json | 6 + .../basemetals/items/starsteel_lever.json | 6 + .../basemetals/items/starsteel_nugget.json | 6 + .../basemetals/items/starsteel_ore.json | 6 + .../basemetals/items/starsteel_pickaxe.json | 6 + .../basemetals/items/starsteel_plate.json | 6 + .../basemetals/items/starsteel_powder.json | 6 + .../items/starsteel_powder_dirty.json | 6 + .../items/starsteel_pressure_plate.json | 6 + .../basemetals/items/starsteel_raw.json | 6 + .../basemetals/items/starsteel_rod.json | 6 + .../basemetals/items/starsteel_scythe.json | 6 + .../basemetals/items/starsteel_shard.json | 6 + .../basemetals/items/starsteel_shears.json | 6 + .../basemetals/items/starsteel_shield.json | 14 + .../basemetals/items/starsteel_shovel.json | 6 + .../basemetals/items/starsteel_slab.json | 6 + .../items/starsteel_smallpowder.json | 6 + .../basemetals/items/starsteel_stairs.json | 6 + .../basemetals/items/starsteel_sword.json | 6 + .../basemetals/items/starsteel_trapdoor.json | 6 + .../basemetals/items/starsteel_wall.json | 6 + .../assets/basemetals/items/steel.json | 6 + .../assets/basemetals/items/steel_anvil.json | 6 + .../assets/basemetals/items/steel_arrow.json | 6 + .../assets/basemetals/items/steel_axe.json | 6 + .../assets/basemetals/items/steel_bars.json | 6 + .../assets/basemetals/items/steel_blend.json | 6 + .../assets/basemetals/items/steel_block.json | 6 + .../assets/basemetals/items/steel_bolt.json | 6 + .../assets/basemetals/items/steel_boots.json | 6 + .../assets/basemetals/items/steel_bow.json | 35 ++ .../assets/basemetals/items/steel_bucket.json | 20 + .../assets/basemetals/items/steel_button.json | 6 + .../basemetals/items/steel_chestplate.json | 6 + .../basemetals/items/steel_crackhammer.json | 6 + .../basemetals/items/steel_crossbow.json | 35 ++ .../assets/basemetals/items/steel_door.json | 6 + .../basemetals/items/steel_fishing_rod.json | 14 + .../assets/basemetals/items/steel_gear.json | 6 + .../assets/basemetals/items/steel_helmet.json | 6 + .../assets/basemetals/items/steel_hoe.json | 6 + .../basemetals/items/steel_horse_armor.json | 6 + .../assets/basemetals/items/steel_ingot.json | 6 + .../basemetals/items/steel_leggings.json | 6 + .../assets/basemetals/items/steel_lever.json | 6 + .../assets/basemetals/items/steel_nugget.json | 6 + .../basemetals/items/steel_pickaxe.json | 6 + .../assets/basemetals/items/steel_plate.json | 6 + .../assets/basemetals/items/steel_powder.json | 6 + .../items/steel_pressure_plate.json | 6 + .../assets/basemetals/items/steel_rod.json | 6 + .../assets/basemetals/items/steel_scythe.json | 6 + .../assets/basemetals/items/steel_shears.json | 6 + .../assets/basemetals/items/steel_shield.json | 14 + .../assets/basemetals/items/steel_shovel.json | 6 + .../assets/basemetals/items/steel_slab.json | 6 + .../basemetals/items/steel_smallblend.json | 6 + .../basemetals/items/steel_smallpowder.json | 6 + .../assets/basemetals/items/steel_stairs.json | 6 + .../assets/basemetals/items/steel_sword.json | 6 + .../basemetals/items/steel_trapdoor.json | 6 + .../assets/basemetals/items/steel_wall.json | 6 + .../assets/basemetals/items/stone.json | 6 + .../assets/basemetals/items/stone_anvil.json | 6 + .../assets/basemetals/items/stone_bucket.json | 20 + .../basemetals/items/stone_crackhammer.json | 6 + .../assets/basemetals/items/stone_gear.json | 6 + .../assets/basemetals/items/stone_rod.json | 6 + .../assets/basemetals/items/stone_scythe.json | 6 + .../assets/basemetals/items/tin.json | 6 + .../assets/basemetals/items/tin_arrow.json | 6 + .../assets/basemetals/items/tin_axe.json | 6 + .../assets/basemetals/items/tin_bars.json | 6 + .../assets/basemetals/items/tin_block.json | 6 + .../assets/basemetals/items/tin_bolt.json | 6 + .../assets/basemetals/items/tin_boots.json | 6 + .../assets/basemetals/items/tin_bow.json | 35 ++ .../assets/basemetals/items/tin_bucket.json | 20 + .../assets/basemetals/items/tin_button.json | 6 + .../basemetals/items/tin_chestplate.json | 6 + .../basemetals/items/tin_crackhammer.json | 6 + .../assets/basemetals/items/tin_crossbow.json | 35 ++ .../assets/basemetals/items/tin_door.json | 6 + .../basemetals/items/tin_fishing_rod.json | 14 + .../assets/basemetals/items/tin_gear.json | 6 + .../assets/basemetals/items/tin_helmet.json | 6 + .../assets/basemetals/items/tin_hoe.json | 6 + .../basemetals/items/tin_horse_armor.json | 6 + .../assets/basemetals/items/tin_ingot.json | 6 + .../assets/basemetals/items/tin_leggings.json | 6 + .../assets/basemetals/items/tin_lever.json | 6 + .../assets/basemetals/items/tin_nugget.json | 6 + .../assets/basemetals/items/tin_ore.json | 6 + .../assets/basemetals/items/tin_pickaxe.json | 6 + .../assets/basemetals/items/tin_plate.json | 6 + .../assets/basemetals/items/tin_powder.json | 6 + .../basemetals/items/tin_pressure_plate.json | 6 + .../assets/basemetals/items/tin_raw.json | 6 + .../assets/basemetals/items/tin_rod.json | 6 + .../assets/basemetals/items/tin_scythe.json | 6 + .../assets/basemetals/items/tin_shears.json | 6 + .../assets/basemetals/items/tin_shield.json | 14 + .../assets/basemetals/items/tin_shovel.json | 6 + .../assets/basemetals/items/tin_slab.json | 6 + .../basemetals/items/tin_smallpowder.json | 6 + .../assets/basemetals/items/tin_stairs.json | 6 + .../assets/basemetals/items/tin_sword.json | 6 + .../assets/basemetals/items/tin_trapdoor.json | 6 + .../assets/basemetals/items/tin_wall.json | 6 + .../assets/basemetals/items/wood.json | 6 + .../assets/basemetals/items/wood_bucket.json | 20 + .../basemetals/items/wood_crackhammer.json | 6 + .../assets/basemetals/items/wood_gear.json | 6 + .../assets/basemetals/items/wood_scythe.json | 6 + .../assets/basemetals/items/zinc.json | 6 + .../assets/basemetals/items/zinc_arrow.json | 6 + .../assets/basemetals/items/zinc_axe.json | 6 + .../assets/basemetals/items/zinc_bars.json | 6 + .../assets/basemetals/items/zinc_block.json | 6 + .../assets/basemetals/items/zinc_bolt.json | 6 + .../assets/basemetals/items/zinc_boots.json | 6 + .../assets/basemetals/items/zinc_bow.json | 35 ++ .../assets/basemetals/items/zinc_bucket.json | 20 + .../assets/basemetals/items/zinc_button.json | 6 + .../assets/basemetals/items/zinc_casing.json | 6 + .../basemetals/items/zinc_chestplate.json | 6 + .../assets/basemetals/items/zinc_clump.json | 6 + .../basemetals/items/zinc_crackhammer.json | 6 + .../basemetals/items/zinc_crossbow.json | 35 ++ .../assets/basemetals/items/zinc_crushed.json | 6 + .../items/zinc_crushed_purified.json | 6 + .../assets/basemetals/items/zinc_crystal.json | 6 + .../basemetals/items/zinc_dense_plate.json | 6 + .../assets/basemetals/items/zinc_door.json | 6 + .../basemetals/items/zinc_fishing_rod.json | 14 + .../assets/basemetals/items/zinc_gear.json | 6 + .../assets/basemetals/items/zinc_helmet.json | 6 + .../assets/basemetals/items/zinc_hoe.json | 6 + .../basemetals/items/zinc_horse_armor.json | 6 + .../assets/basemetals/items/zinc_ingot.json | 6 + .../basemetals/items/zinc_leggings.json | 6 + .../assets/basemetals/items/zinc_lever.json | 6 + .../assets/basemetals/items/zinc_nugget.json | 6 + .../assets/basemetals/items/zinc_ore.json | 6 + .../assets/basemetals/items/zinc_pickaxe.json | 6 + .../assets/basemetals/items/zinc_plate.json | 6 + .../assets/basemetals/items/zinc_powder.json | 6 + .../basemetals/items/zinc_powder_dirty.json | 6 + .../basemetals/items/zinc_pressure_plate.json | 6 + .../assets/basemetals/items/zinc_raw.json | 6 + .../assets/basemetals/items/zinc_rod.json | 6 + .../assets/basemetals/items/zinc_scythe.json | 6 + .../assets/basemetals/items/zinc_shard.json | 6 + .../assets/basemetals/items/zinc_shears.json | 6 + .../assets/basemetals/items/zinc_shield.json | 14 + .../assets/basemetals/items/zinc_shovel.json | 6 + .../assets/basemetals/items/zinc_slab.json | 6 + .../basemetals/items/zinc_smallpowder.json | 6 + .../assets/basemetals/items/zinc_stairs.json | 6 + .../assets/basemetals/items/zinc_sword.json | 6 + .../basemetals/items/zinc_trapdoor.json | 6 + .../assets/basemetals/items/zinc_wall.json | 6 + .../models/block/adamantine_ore.json | 12 +- .../basemetals/models/block/antimony_ore.json | 12 +- .../basemetals/models/block/bismuth_ore.json | 12 +- .../basemetals/models/block/coldiron_ore.json | 12 +- .../basemetals/models/block/copper_ore.json | 12 +- .../basemetals/models/block/lead_ore.json | 12 +- .../basemetals/models/block/mercury_ore.json | 12 +- .../basemetals/models/block/nickel_ore.json | 12 +- .../basemetals/models/block/platinum_ore.json | 12 +- .../basemetals/models/block/silver_ore.json | 12 +- .../models/block/starsteel_ore.json | 12 +- .../basemetals/models/block/tin_ore.json | 12 +- .../basemetals/models/block/zinc_ore.json | 12 +- .../models/item/adamantine_bucket.json | 8 +- .../models/item/antimony_bucket.json | 8 +- .../models/item/aquarium_bucket.json | 8 +- .../models/item/bismuth_bucket.json | 8 +- .../basemetals/models/item/brass_bucket.json | 8 +- .../basemetals/models/item/bronze_bucket.json | 8 +- .../models/item/charcoal_bucket.json | 8 +- .../basemetals/models/item/coal_bucket.json | 8 +- .../models/item/coldiron_bucket.json | 8 +- .../basemetals/models/item/copper_bucket.json | 8 +- .../models/item/cupronickel_bucket.json | 8 +- .../models/item/diamond_bucket.json | 8 +- .../models/item/electrum_bucket.json | 8 +- .../models/item/emerald_bucket.json | 8 +- .../basemetals/models/item/ender_bucket.json | 8 +- .../basemetals/models/item/gold_bucket.json | 8 +- .../basemetals/models/item/invar_bucket.json | 8 +- .../basemetals/models/item/iron_bucket.json | 8 +- .../basemetals/models/item/lapis_bucket.json | 8 +- .../basemetals/models/item/lead_bucket.json | 8 +- .../models/item/mercury_bucket.json | 8 +- .../models/item/mithril_bucket.json | 8 +- .../basemetals/models/item/nickel_bucket.json | 8 +- .../models/item/obsidian_bucket.json | 8 +- .../basemetals/models/item/pewter_bucket.json | 8 +- .../models/item/platinum_bucket.json | 8 +- .../models/item/prismarine_bucket.json | 8 +- .../basemetals/models/item/quartz_bucket.json | 8 +- .../models/item/redstone_bucket.json | 8 +- .../basemetals/models/item/silver_bucket.json | 8 +- .../models/item/starsteel_bucket.json | 8 +- .../basemetals/models/item/steel_bucket.json | 8 +- .../basemetals/models/item/stone_bucket.json | 8 +- .../basemetals/models/item/tin_bucket.json | 8 +- .../basemetals/models/item/wood_bucket.json | 8 +- .../basemetals/models/item/zinc_bucket.json | 8 +- .../equipment/horse_body/adamantine.png | Bin 0 -> 3000 bytes .../entity/equipment/horse_body/antimony.png | Bin 0 -> 1981 bytes .../entity/equipment/horse_body/aquarium.png | Bin 0 -> 4844 bytes .../entity/equipment/horse_body/bismuth.png | Bin 0 -> 2283 bytes .../entity/equipment/horse_body/brass.png | Bin 0 -> 2295 bytes .../entity/equipment/horse_body/bronze.png | Bin 0 -> 2552 bytes .../entity/equipment/horse_body/coldiron.png | Bin 0 -> 2303 bytes .../entity/equipment/horse_body/copper.png | Bin 0 -> 2489 bytes .../equipment/horse_body/cupronickel.png | Bin 0 -> 2174 bytes .../entity/equipment/horse_body/electrum.png | Bin 0 -> 2458 bytes .../entity/equipment/horse_body/emerald.png | Bin 0 -> 5478 bytes .../entity/equipment/horse_body/invar.png | Bin 0 -> 2202 bytes .../entity/equipment/horse_body/lead.png | Bin 0 -> 1880 bytes .../entity/equipment/horse_body/mithril.png | Bin 0 -> 1383 bytes .../entity/equipment/horse_body/nickel.png | Bin 0 -> 2341 bytes .../entity/equipment/horse_body/obsidian.png | Bin 0 -> 4229 bytes .../entity/equipment/horse_body/pewter.png | Bin 0 -> 1917 bytes .../entity/equipment/horse_body/platinum.png | Bin 0 -> 1296 bytes .../entity/equipment/horse_body/quartz.png | Bin 0 -> 4304 bytes .../entity/equipment/horse_body/silver.png | Bin 0 -> 1410 bytes .../entity/equipment/horse_body/starsteel.png | Bin 0 -> 3842 bytes .../entity/equipment/horse_body/steel.png | Bin 0 -> 2140 bytes .../entity/equipment/horse_body/tin.png | Bin 0 -> 2044 bytes .../entity/equipment/horse_body/zinc.png | Bin 0 -> 1735 bytes .../entity/equipment/humanoid/adamantine.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/antimony.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/aquarium.png | Bin 0 -> 3098 bytes .../entity/equipment/humanoid/bismuth.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/brass.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/bronze.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/coldiron.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/copper.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/cupronickel.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/electrum.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/emerald.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/invar.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/lead.png | Bin 0 -> 773 bytes .../entity/equipment/humanoid/mithril.png | Bin 0 -> 602 bytes .../entity/equipment/humanoid/nickel.png | Bin 0 -> 932 bytes .../entity/equipment/humanoid/obsidian.png | Bin 0 -> 1888 bytes .../entity/equipment/humanoid/pewter.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/platinum.png | Bin 0 -> 904 bytes .../entity/equipment/humanoid/quartz.png | Bin 0 -> 888 bytes .../entity/equipment/humanoid/silver.png | Bin 0 -> 807 bytes .../entity/equipment/humanoid/starsteel.png | Bin 0 -> 268171 bytes .../entity/equipment/humanoid/steel.png | Bin 0 -> 935 bytes .../entity/equipment/humanoid/tin.png | Bin 0 -> 932 bytes .../entity/equipment/humanoid/zinc.png | Bin 0 -> 785 bytes .../humanoid_leggings/adamantine.png | Bin 0 -> 601 bytes .../equipment/humanoid_leggings/antimony.png | Bin 0 -> 538 bytes .../equipment/humanoid_leggings/aquarium.png | Bin 0 -> 2220 bytes .../equipment/humanoid_leggings/bismuth.png | Bin 0 -> 652 bytes .../equipment/humanoid_leggings/brass.png | Bin 0 -> 632 bytes .../equipment/humanoid_leggings/bronze.png | Bin 0 -> 631 bytes .../equipment/humanoid_leggings/coldiron.png | Bin 0 -> 635 bytes .../equipment/humanoid_leggings/copper.png | Bin 0 -> 663 bytes .../humanoid_leggings/cupronickel.png | Bin 0 -> 652 bytes .../equipment/humanoid_leggings/electrum.png | Bin 0 -> 596 bytes .../equipment/humanoid_leggings/emerald.png | Bin 0 -> 652 bytes .../equipment/humanoid_leggings/invar.png | Bin 0 -> 632 bytes .../equipment/humanoid_leggings/lead.png | Bin 0 -> 521 bytes .../equipment/humanoid_leggings/mithril.png | Bin 0 -> 477 bytes .../equipment/humanoid_leggings/nickel.png | Bin 0 -> 619 bytes .../equipment/humanoid_leggings/obsidian.png | Bin 0 -> 881 bytes .../equipment/humanoid_leggings/pewter.png | Bin 0 -> 652 bytes .../equipment/humanoid_leggings/platinum.png | Bin 0 -> 637 bytes .../equipment/humanoid_leggings/quartz.png | Bin 0 -> 583 bytes .../equipment/humanoid_leggings/silver.png | Bin 0 -> 552 bytes .../equipment/humanoid_leggings/starsteel.png | Bin 0 -> 248542 bytes .../equipment/humanoid_leggings/steel.png | Bin 0 -> 599 bytes .../equipment/humanoid_leggings/tin.png | Bin 0 -> 631 bytes .../equipment/humanoid_leggings/zinc.png | Bin 0 -> 538 bytes .../recipes/copper_ingot_from_nuggets.json | 4 +- .../chests/inject/abandoned_mineshaft.json | 18 +- .../chests/inject/spawn_bonus_chest.json | 18 +- .../chests/inject/stronghold_crossing.json | 18 +- .../chests/inject/village_armorer.json | 18 +- .../chests/inject/village_toolsmith.json | 18 +- .../chests/inject/village_weaponsmith.json | 18 +- .../basemetals/recipe/activator_rail.json | 12 +- .../basemetals/recipe/adamantine_anvil.json | 8 +- .../basemetals/recipe/adamantine_arrow.json | 12 +- .../recipe/adamantine_arrow_recycling.json | 4 +- .../basemetals/recipe/adamantine_axe.json | 8 +- .../recipe/adamantine_axe_recycling.json | 4 +- .../basemetals/recipe/adamantine_bars.json | 4 +- .../basemetals/recipe/adamantine_bars_2.json | 4 +- .../recipe/adamantine_bars_recycling.json | 4 +- .../basemetals/recipe/adamantine_block.json | 4 +- .../recipe/adamantine_block_crushing.json | 4 +- .../recipe/adamantine_block_ingot.json | 4 +- .../basemetals/recipe/adamantine_bolt.json | 8 +- .../recipe/adamantine_bolt_recycling.json | 4 +- .../basemetals/recipe/adamantine_boots.json | 4 +- .../recipe/adamantine_boots_plate_repair.json | 4 +- .../recipe/adamantine_boots_recycling.json | 4 +- .../basemetals/recipe/adamantine_bow.json | 8 +- .../recipe/adamantine_bow_recycling.json | 4 +- .../basemetals/recipe/adamantine_button.json | 4 +- .../recipe/adamantine_button_recycling.json | 4 +- .../recipe/adamantine_chestplate.json | 4 +- .../adamantine_chestplate_plate_repair.json | 4 +- .../adamantine_chestplate_recycling.json | 4 +- .../recipe/adamantine_crackhammer.json | 8 +- .../adamantine_crackhammer_recycling.json | 4 +- .../recipe/adamantine_crossbow.json | 12 +- .../recipe/adamantine_crossbow_recycling.json | 4 +- .../basemetals/recipe/adamantine_door.json | 4 +- .../recipe/adamantine_door_recycling.json | 4 +- .../recipe/adamantine_fishingrod.json | 8 +- .../basemetals/recipe/adamantine_gear.json | 8 +- .../recipe/adamantine_gear_recycling.json | 4 +- .../basemetals/recipe/adamantine_helmet.json | 4 +- .../adamantine_helmet_plate_repair.json | 4 +- .../recipe/adamantine_helmet_recycling.json | 4 +- .../basemetals/recipe/adamantine_hoe.json | 8 +- .../recipe/adamantine_hoe_recycling.json | 4 +- .../recipe/adamantine_horsearmor.json | 8 +- .../recipe/adamantine_ingot_crushing.json | 4 +- .../recipe/adamantine_ingot_from_nuggets.json | 4 +- .../recipe/adamantine_leggings.json | 4 +- .../adamantine_leggings_plate_repair.json | 4 +- .../recipe/adamantine_leggings_recycling.json | 4 +- .../basemetals/recipe/adamantine_lever.json | 8 +- .../recipe/adamantine_lever_recycling.json | 4 +- .../recipe/adamantine_nugget_crushing.json | 4 +- .../basemetals/recipe/adamantine_nuggets.json | 4 +- .../recipe/adamantine_ore_blasting.json | 4 +- .../recipe/adamantine_ore_crushing.json | 4 +- .../recipe/adamantine_ore_smelting.json | 4 +- .../basemetals/recipe/adamantine_pickaxe.json | 8 +- .../recipe/adamantine_pickaxe_recycling.json | 4 +- .../basemetals/recipe/adamantine_plate.json | 4 +- .../recipe/adamantine_plate_recycling.json | 4 +- .../recipe/adamantine_powder_from_small.json | 4 +- .../recipe/adamantine_powder_smelting.json | 4 +- .../recipe/adamantine_pressure_plate.json | 4 +- .../adamantine_pressure_plate_recycling.json | 4 +- .../recipe/adamantine_raw_blasting.json | 4 +- .../recipe/adamantine_raw_crushing.json | 4 +- .../recipe/adamantine_raw_smelting.json | 4 +- .../basemetals/recipe/adamantine_rod.json | 4 +- .../recipe/adamantine_rod_recycling.json | 4 +- .../basemetals/recipe/adamantine_scythe.json | 8 +- .../basemetals/recipe/adamantine_shears.json | 4 +- .../recipe/adamantine_shears_recycling.json | 4 +- .../basemetals/recipe/adamantine_shield.json | 8 +- .../adamantine_shield_plate_repair.json | 4 +- .../basemetals/recipe/adamantine_shovel.json | 8 +- .../recipe/adamantine_shovel_recycling.json | 4 +- .../basemetals/recipe/adamantine_slab.json | 4 +- .../recipe/adamantine_slab_recycling.json | 4 +- .../recipe/adamantine_smallpowder.json | 4 +- .../adamantine_smallpowder_smelting.json | 4 +- .../basemetals/recipe/adamantine_stairs.json | 4 +- .../basemetals/recipe/adamantine_sword.json | 8 +- .../recipe/adamantine_sword_recycling.json | 4 +- .../recipe/adamantine_trapdoor.json | 4 +- .../recipe/adamantine_trapdoor_recycling.json | 4 +- .../basemetals/recipe/adamantine_wall.json | 4 +- .../recipe/adamantine_wall_recycling.json | 4 +- .../recipe/ancient_debris_crushing.json | 4 +- .../basemetals/recipe/antimony_arrow.json | 12 +- .../recipe/antimony_arrow_recycling.json | 4 +- .../data/basemetals/recipe/antimony_axe.json | 8 +- .../recipe/antimony_axe_recycling.json | 4 +- .../data/basemetals/recipe/antimony_bars.json | 4 +- .../basemetals/recipe/antimony_bars_2.json | 4 +- .../recipe/antimony_bars_recycling.json | 4 +- .../basemetals/recipe/antimony_block.json | 4 +- .../recipe/antimony_block_crushing.json | 4 +- .../recipe/antimony_block_ingot.json | 4 +- .../data/basemetals/recipe/antimony_bolt.json | 8 +- .../recipe/antimony_bolt_recycling.json | 4 +- .../basemetals/recipe/antimony_boots.json | 4 +- .../recipe/antimony_boots_plate_repair.json | 4 +- .../recipe/antimony_boots_recycling.json | 4 +- .../data/basemetals/recipe/antimony_bow.json | 8 +- .../recipe/antimony_bow_recycling.json | 4 +- .../basemetals/recipe/antimony_button.json | 4 +- .../recipe/antimony_button_recycling.json | 4 +- .../recipe/antimony_chestplate.json | 4 +- .../antimony_chestplate_plate_repair.json | 4 +- .../recipe/antimony_chestplate_recycling.json | 4 +- .../recipe/antimony_crackhammer.json | 8 +- .../antimony_crackhammer_recycling.json | 4 +- .../basemetals/recipe/antimony_crossbow.json | 12 +- .../recipe/antimony_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/antimony_door.json | 4 +- .../recipe/antimony_door_recycling.json | 4 +- .../recipe/antimony_fishingrod.json | 8 +- .../data/basemetals/recipe/antimony_gear.json | 8 +- .../recipe/antimony_gear_recycling.json | 4 +- .../basemetals/recipe/antimony_helmet.json | 4 +- .../recipe/antimony_helmet_plate_repair.json | 4 +- .../recipe/antimony_helmet_recycling.json | 4 +- .../data/basemetals/recipe/antimony_hoe.json | 8 +- .../recipe/antimony_hoe_recycling.json | 4 +- .../recipe/antimony_horsearmor.json | 8 +- .../recipe/antimony_ingot_crushing.json | 4 +- .../recipe/antimony_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/antimony_leggings.json | 4 +- .../antimony_leggings_plate_repair.json | 4 +- .../recipe/antimony_leggings_recycling.json | 4 +- .../basemetals/recipe/antimony_lever.json | 8 +- .../recipe/antimony_lever_recycling.json | 4 +- .../recipe/antimony_nugget_crushing.json | 4 +- .../basemetals/recipe/antimony_nuggets.json | 4 +- .../recipe/antimony_ore_blasting.json | 4 +- .../recipe/antimony_ore_crushing.json | 4 +- .../recipe/antimony_ore_smelting.json | 4 +- .../basemetals/recipe/antimony_pickaxe.json | 8 +- .../recipe/antimony_pickaxe_recycling.json | 4 +- .../basemetals/recipe/antimony_plate.json | 4 +- .../recipe/antimony_plate_recycling.json | 4 +- .../recipe/antimony_powder_from_small.json | 4 +- .../recipe/antimony_powder_smelting.json | 4 +- .../recipe/antimony_pressure_plate.json | 4 +- .../antimony_pressure_plate_recycling.json | 4 +- .../recipe/antimony_raw_blasting.json | 4 +- .../recipe/antimony_raw_crushing.json | 4 +- .../recipe/antimony_raw_smelting.json | 4 +- .../data/basemetals/recipe/antimony_rod.json | 4 +- .../recipe/antimony_rod_recycling.json | 4 +- .../basemetals/recipe/antimony_scythe.json | 8 +- .../basemetals/recipe/antimony_shears.json | 4 +- .../recipe/antimony_shears_recycling.json | 4 +- .../basemetals/recipe/antimony_shield.json | 8 +- .../recipe/antimony_shield_plate_repair.json | 4 +- .../basemetals/recipe/antimony_shovel.json | 8 +- .../recipe/antimony_shovel_recycling.json | 4 +- .../data/basemetals/recipe/antimony_slab.json | 4 +- .../recipe/antimony_slab_recycling.json | 4 +- .../recipe/antimony_smallpowder.json | 4 +- .../recipe/antimony_smallpowder_smelting.json | 4 +- .../basemetals/recipe/antimony_stairs.json | 4 +- .../basemetals/recipe/antimony_sword.json | 8 +- .../recipe/antimony_sword_recycling.json | 4 +- .../basemetals/recipe/antimony_trapdoor.json | 4 +- .../recipe/antimony_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/antimony_wall.json | 4 +- .../recipe/antimony_wall_recycling.json | 4 +- .../basemetals/recipe/aquarium_arrow.json | 12 +- .../recipe/aquarium_arrow_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_axe.json | 8 +- .../recipe/aquarium_axe_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_bars.json | 4 +- .../basemetals/recipe/aquarium_bars_2.json | 4 +- .../recipe/aquarium_bars_recycling.json | 4 +- .../basemetals/recipe/aquarium_blend.json | 16 +- .../recipe/aquarium_blend_from_small.json | 4 +- .../recipe/aquarium_blend_smelting.json | 4 +- .../basemetals/recipe/aquarium_block.json | 4 +- .../recipe/aquarium_block_crushing.json | 4 +- .../recipe/aquarium_block_ingot.json | 4 +- .../data/basemetals/recipe/aquarium_bolt.json | 8 +- .../recipe/aquarium_bolt_recycling.json | 4 +- .../basemetals/recipe/aquarium_boots.json | 4 +- .../recipe/aquarium_boots_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_bow.json | 8 +- .../recipe/aquarium_bow_recycling.json | 4 +- .../basemetals/recipe/aquarium_button.json | 4 +- .../recipe/aquarium_button_recycling.json | 4 +- .../recipe/aquarium_chestplate.json | 4 +- .../recipe/aquarium_chestplate_recycling.json | 4 +- .../recipe/aquarium_crackhammer.json | 8 +- .../aquarium_crackhammer_recycling.json | 4 +- .../basemetals/recipe/aquarium_crossbow.json | 12 +- .../recipe/aquarium_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_door.json | 4 +- .../recipe/aquarium_door_recycling.json | 4 +- .../recipe/aquarium_fishingrod.json | 8 +- .../data/basemetals/recipe/aquarium_gear.json | 8 +- .../recipe/aquarium_gear_recycling.json | 4 +- .../basemetals/recipe/aquarium_helmet.json | 4 +- .../recipe/aquarium_helmet_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_hoe.json | 8 +- .../recipe/aquarium_hoe_recycling.json | 4 +- .../recipe/aquarium_horsearmor.json | 8 +- .../recipe/aquarium_ingot_crushing.json | 4 +- .../recipe/aquarium_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/aquarium_leggings.json | 4 +- .../recipe/aquarium_leggings_recycling.json | 4 +- .../basemetals/recipe/aquarium_lever.json | 8 +- .../recipe/aquarium_lever_recycling.json | 4 +- .../recipe/aquarium_nugget_crushing.json | 4 +- .../basemetals/recipe/aquarium_nuggets.json | 4 +- .../basemetals/recipe/aquarium_pickaxe.json | 8 +- .../recipe/aquarium_pickaxe_recycling.json | 4 +- .../basemetals/recipe/aquarium_plate.json | 4 +- .../recipe/aquarium_plate_recycling.json | 4 +- .../recipe/aquarium_powder_from_small.json | 4 +- .../recipe/aquarium_powder_smelting.json | 4 +- .../recipe/aquarium_pressure_plate.json | 4 +- .../aquarium_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_rod.json | 4 +- .../recipe/aquarium_rod_recycling.json | 4 +- .../basemetals/recipe/aquarium_scythe.json | 8 +- .../basemetals/recipe/aquarium_shears.json | 4 +- .../recipe/aquarium_shears_recycling.json | 4 +- .../basemetals/recipe/aquarium_shield.json | 8 +- .../basemetals/recipe/aquarium_shovel.json | 8 +- .../recipe/aquarium_shovel_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_slab.json | 4 +- .../recipe/aquarium_slab_recycling.json | 4 +- .../recipe/aquarium_smallblend.json | 4 +- .../recipe/aquarium_smallblend_smelting.json | 4 +- .../recipe/aquarium_smallpowder.json | 4 +- .../recipe/aquarium_smallpowder_smelting.json | 4 +- .../basemetals/recipe/aquarium_stairs.json | 4 +- .../basemetals/recipe/aquarium_sword.json | 8 +- .../recipe/aquarium_sword_recycling.json | 4 +- .../basemetals/recipe/aquarium_trapdoor.json | 4 +- .../recipe/aquarium_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/aquarium_wall.json | 4 +- .../recipe/aquarium_wall_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_arrow.json | 12 +- .../recipe/bismuth_arrow_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_axe.json | 8 +- .../recipe/bismuth_axe_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_bars.json | 4 +- .../basemetals/recipe/bismuth_bars_2.json | 4 +- .../recipe/bismuth_bars_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_block.json | 4 +- .../recipe/bismuth_block_crushing.json | 4 +- .../recipe/bismuth_block_ingot.json | 4 +- .../data/basemetals/recipe/bismuth_bolt.json | 8 +- .../recipe/bismuth_bolt_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_boots.json | 4 +- .../recipe/bismuth_boots_plate_repair.json | 4 +- .../recipe/bismuth_boots_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_bow.json | 8 +- .../recipe/bismuth_bow_recycling.json | 4 +- .../basemetals/recipe/bismuth_button.json | 4 +- .../recipe/bismuth_button_recycling.json | 4 +- .../basemetals/recipe/bismuth_chestplate.json | 4 +- .../bismuth_chestplate_plate_repair.json | 4 +- .../recipe/bismuth_chestplate_recycling.json | 4 +- .../recipe/bismuth_crackhammer.json | 8 +- .../recipe/bismuth_crackhammer_recycling.json | 4 +- .../basemetals/recipe/bismuth_crossbow.json | 12 +- .../recipe/bismuth_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_door.json | 4 +- .../recipe/bismuth_door_recycling.json | 4 +- .../basemetals/recipe/bismuth_fishingrod.json | 8 +- .../data/basemetals/recipe/bismuth_gear.json | 8 +- .../recipe/bismuth_gear_recycling.json | 4 +- .../basemetals/recipe/bismuth_helmet.json | 4 +- .../recipe/bismuth_helmet_plate_repair.json | 4 +- .../recipe/bismuth_helmet_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_hoe.json | 8 +- .../recipe/bismuth_hoe_recycling.json | 4 +- .../basemetals/recipe/bismuth_horsearmor.json | 8 +- .../recipe/bismuth_ingot_crushing.json | 4 +- .../recipe/bismuth_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/bismuth_leggings.json | 4 +- .../recipe/bismuth_leggings_plate_repair.json | 4 +- .../recipe/bismuth_leggings_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_lever.json | 8 +- .../recipe/bismuth_lever_recycling.json | 4 +- .../recipe/bismuth_nugget_crushing.json | 4 +- .../basemetals/recipe/bismuth_nuggets.json | 4 +- .../recipe/bismuth_ore_blasting.json | 4 +- .../recipe/bismuth_ore_crushing.json | 4 +- .../recipe/bismuth_ore_smelting.json | 4 +- .../basemetals/recipe/bismuth_pickaxe.json | 8 +- .../recipe/bismuth_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_plate.json | 4 +- .../recipe/bismuth_plate_recycling.json | 4 +- .../recipe/bismuth_powder_from_small.json | 4 +- .../recipe/bismuth_powder_smelting.json | 4 +- .../recipe/bismuth_pressure_plate.json | 4 +- .../bismuth_pressure_plate_recycling.json | 4 +- .../recipe/bismuth_raw_blasting.json | 4 +- .../recipe/bismuth_raw_crushing.json | 4 +- .../recipe/bismuth_raw_smelting.json | 4 +- .../data/basemetals/recipe/bismuth_rod.json | 4 +- .../recipe/bismuth_rod_recycling.json | 4 +- .../basemetals/recipe/bismuth_scythe.json | 8 +- .../basemetals/recipe/bismuth_shears.json | 4 +- .../recipe/bismuth_shears_recycling.json | 4 +- .../basemetals/recipe/bismuth_shield.json | 8 +- .../recipe/bismuth_shield_plate_repair.json | 4 +- .../basemetals/recipe/bismuth_shovel.json | 8 +- .../recipe/bismuth_shovel_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_slab.json | 4 +- .../recipe/bismuth_slab_recycling.json | 4 +- .../recipe/bismuth_smallpowder.json | 4 +- .../recipe/bismuth_smallpowder_smelting.json | 4 +- .../basemetals/recipe/bismuth_stairs.json | 4 +- .../data/basemetals/recipe/bismuth_sword.json | 8 +- .../recipe/bismuth_sword_recycling.json | 4 +- .../basemetals/recipe/bismuth_trapdoor.json | 4 +- .../recipe/bismuth_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/bismuth_wall.json | 4 +- .../recipe/bismuth_wall_recycling.json | 4 +- .../basemetals/recipe/blaze_rod_crushing.json | 4 +- .../recipe/bone_block_crushing.json | 4 +- .../data/basemetals/recipe/bone_crushing.json | 4 +- .../data/basemetals/recipe/brass_arrow.json | 12 +- .../recipe/brass_arrow_recycling.json | 4 +- .../data/basemetals/recipe/brass_axe.json | 8 +- .../recipe/brass_axe_recycling.json | 4 +- .../data/basemetals/recipe/brass_bars.json | 4 +- .../data/basemetals/recipe/brass_bars_2.json | 4 +- .../recipe/brass_bars_recycling.json | 4 +- .../data/basemetals/recipe/brass_blend.json | 16 +- .../recipe/brass_blend_from_small.json | 4 +- .../recipe/brass_blend_smelting.json | 4 +- .../data/basemetals/recipe/brass_block.json | 4 +- .../recipe/brass_block_crushing.json | 4 +- .../basemetals/recipe/brass_block_ingot.json | 4 +- .../data/basemetals/recipe/brass_bolt.json | 8 +- .../recipe/brass_bolt_recycling.json | 4 +- .../data/basemetals/recipe/brass_boots.json | 4 +- .../recipe/brass_boots_plate_repair.json | 4 +- .../recipe/brass_boots_recycling.json | 4 +- .../data/basemetals/recipe/brass_bow.json | 8 +- .../recipe/brass_bow_recycling.json | 4 +- .../data/basemetals/recipe/brass_button.json | 4 +- .../recipe/brass_button_recycling.json | 4 +- .../basemetals/recipe/brass_chestplate.json | 4 +- .../recipe/brass_chestplate_plate_repair.json | 4 +- .../recipe/brass_chestplate_recycling.json | 4 +- .../basemetals/recipe/brass_crackhammer.json | 8 +- .../recipe/brass_crackhammer_recycling.json | 4 +- .../basemetals/recipe/brass_crossbow.json | 12 +- .../recipe/brass_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/brass_door.json | 4 +- .../recipe/brass_door_recycling.json | 4 +- .../basemetals/recipe/brass_fishingrod.json | 8 +- .../data/basemetals/recipe/brass_gear.json | 8 +- .../recipe/brass_gear_recycling.json | 4 +- .../data/basemetals/recipe/brass_helmet.json | 4 +- .../recipe/brass_helmet_plate_repair.json | 4 +- .../recipe/brass_helmet_recycling.json | 4 +- .../data/basemetals/recipe/brass_hoe.json | 8 +- .../recipe/brass_hoe_recycling.json | 4 +- .../basemetals/recipe/brass_horsearmor.json | 8 +- .../recipe/brass_ingot_crushing.json | 4 +- .../recipe/brass_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/brass_leggings.json | 4 +- .../recipe/brass_leggings_plate_repair.json | 4 +- .../recipe/brass_leggings_recycling.json | 4 +- .../data/basemetals/recipe/brass_lever.json | 8 +- .../recipe/brass_lever_recycling.json | 4 +- .../recipe/brass_nugget_crushing.json | 4 +- .../data/basemetals/recipe/brass_nuggets.json | 4 +- .../data/basemetals/recipe/brass_pickaxe.json | 8 +- .../recipe/brass_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/brass_plate.json | 4 +- .../recipe/brass_plate_recycling.json | 4 +- .../recipe/brass_powder_from_small.json | 4 +- .../recipe/brass_powder_smelting.json | 4 +- .../recipe/brass_pressure_plate.json | 4 +- .../brass_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/brass_rod.json | 4 +- .../recipe/brass_rod_recycling.json | 4 +- .../data/basemetals/recipe/brass_scythe.json | 8 +- .../data/basemetals/recipe/brass_shears.json | 4 +- .../recipe/brass_shears_recycling.json | 4 +- .../data/basemetals/recipe/brass_shield.json | 8 +- .../recipe/brass_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/brass_shovel.json | 8 +- .../recipe/brass_shovel_recycling.json | 4 +- .../data/basemetals/recipe/brass_slab.json | 4 +- .../recipe/brass_slab_recycling.json | 4 +- .../basemetals/recipe/brass_smallblend.json | 4 +- .../recipe/brass_smallblend_smelting.json | 4 +- .../basemetals/recipe/brass_smallpowder.json | 4 +- .../recipe/brass_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/brass_stairs.json | 4 +- .../data/basemetals/recipe/brass_sword.json | 8 +- .../recipe/brass_sword_recycling.json | 4 +- .../basemetals/recipe/brass_trapdoor.json | 4 +- .../recipe/brass_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/brass_wall.json | 4 +- .../recipe/brass_wall_recycling.json | 4 +- .../data/basemetals/recipe/bronze_arrow.json | 12 +- .../recipe/bronze_arrow_recycling.json | 4 +- .../data/basemetals/recipe/bronze_axe.json | 8 +- .../recipe/bronze_axe_recycling.json | 4 +- .../data/basemetals/recipe/bronze_bars.json | 4 +- .../data/basemetals/recipe/bronze_bars_2.json | 4 +- .../recipe/bronze_bars_recycling.json | 4 +- .../data/basemetals/recipe/bronze_blend.json | 16 +- .../recipe/bronze_blend_from_small.json | 4 +- .../recipe/bronze_blend_smelting.json | 4 +- .../data/basemetals/recipe/bronze_block.json | 4 +- .../recipe/bronze_block_crushing.json | 4 +- .../basemetals/recipe/bronze_block_ingot.json | 4 +- .../data/basemetals/recipe/bronze_bolt.json | 8 +- .../recipe/bronze_bolt_recycling.json | 4 +- .../data/basemetals/recipe/bronze_boots.json | 4 +- .../recipe/bronze_boots_plate_repair.json | 4 +- .../recipe/bronze_boots_recycling.json | 4 +- .../data/basemetals/recipe/bronze_bow.json | 8 +- .../recipe/bronze_bow_recycling.json | 4 +- .../data/basemetals/recipe/bronze_button.json | 4 +- .../recipe/bronze_button_recycling.json | 4 +- .../basemetals/recipe/bronze_chestplate.json | 4 +- .../bronze_chestplate_plate_repair.json | 4 +- .../recipe/bronze_chestplate_recycling.json | 4 +- .../basemetals/recipe/bronze_crackhammer.json | 8 +- .../recipe/bronze_crackhammer_recycling.json | 4 +- .../basemetals/recipe/bronze_crossbow.json | 12 +- .../recipe/bronze_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/bronze_door.json | 4 +- .../recipe/bronze_door_recycling.json | 4 +- .../basemetals/recipe/bronze_fishingrod.json | 8 +- .../data/basemetals/recipe/bronze_gear.json | 8 +- .../recipe/bronze_gear_recycling.json | 4 +- .../data/basemetals/recipe/bronze_helmet.json | 4 +- .../recipe/bronze_helmet_plate_repair.json | 4 +- .../recipe/bronze_helmet_recycling.json | 4 +- .../data/basemetals/recipe/bronze_hoe.json | 8 +- .../recipe/bronze_hoe_recycling.json | 4 +- .../basemetals/recipe/bronze_horsearmor.json | 8 +- .../recipe/bronze_ingot_crushing.json | 4 +- .../recipe/bronze_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/bronze_leggings.json | 4 +- .../recipe/bronze_leggings_plate_repair.json | 4 +- .../recipe/bronze_leggings_recycling.json | 4 +- .../data/basemetals/recipe/bronze_lever.json | 8 +- .../recipe/bronze_lever_recycling.json | 4 +- .../recipe/bronze_nugget_crushing.json | 4 +- .../basemetals/recipe/bronze_nuggets.json | 4 +- .../basemetals/recipe/bronze_pickaxe.json | 8 +- .../recipe/bronze_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/bronze_plate.json | 4 +- .../recipe/bronze_plate_recycling.json | 4 +- .../recipe/bronze_powder_from_small.json | 4 +- .../recipe/bronze_powder_smelting.json | 4 +- .../recipe/bronze_pressure_plate.json | 4 +- .../bronze_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/bronze_rod.json | 4 +- .../recipe/bronze_rod_recycling.json | 4 +- .../data/basemetals/recipe/bronze_scythe.json | 8 +- .../data/basemetals/recipe/bronze_shears.json | 4 +- .../recipe/bronze_shears_recycling.json | 4 +- .../data/basemetals/recipe/bronze_shield.json | 8 +- .../recipe/bronze_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/bronze_shovel.json | 8 +- .../recipe/bronze_shovel_recycling.json | 4 +- .../data/basemetals/recipe/bronze_slab.json | 4 +- .../recipe/bronze_slab_recycling.json | 4 +- .../basemetals/recipe/bronze_smallblend.json | 4 +- .../recipe/bronze_smallblend_smelting.json | 4 +- .../basemetals/recipe/bronze_smallpowder.json | 4 +- .../recipe/bronze_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/bronze_stairs.json | 4 +- .../data/basemetals/recipe/bronze_sword.json | 8 +- .../recipe/bronze_sword_recycling.json | 4 +- .../basemetals/recipe/bronze_trapdoor.json | 4 +- .../recipe/bronze_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/bronze_wall.json | 4 +- .../recipe/bronze_wall_recycling.json | 4 +- .../basemetals/recipe/charcoal_block.json | 4 +- .../recipe/charcoal_block_crushing.json | 4 +- .../recipe/charcoal_block_dust.json | 4 +- .../basemetals/recipe/charcoal_crushing.json | 4 +- .../basemetals/recipe/charcoal_ingot.json | 4 +- .../basemetals/recipe/charcoal_nugget.json | 4 +- .../recipe/charcoal_nugget_crushing.json | 4 +- .../recipe/charcoal_powder_from_small.json | 4 +- .../recipe/charcoal_smallpowder.json | 4 +- .../recipe/coal_block_crushing.json | 4 +- .../basemetals/recipe/coal_block_dust.json | 4 +- .../data/basemetals/recipe/coal_crushing.json | 4 +- .../data/basemetals/recipe/coal_ingot.json | 4 +- .../data/basemetals/recipe/coal_nugget.json | 4 +- .../recipe/coal_nugget_crushing.json | 4 +- .../basemetals/recipe/coal_ore_crushing.json | 4 +- .../recipe/coal_powder_from_small.json | 4 +- .../basemetals/recipe/coal_smallpowder.json | 4 +- .../recipe/cobblestone_crushing.json | 4 +- .../recipe/cobblestone_wall_crushing.json | 4 +- .../basemetals/recipe/coldiron_arrow.json | 12 +- .../recipe/coldiron_arrow_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_axe.json | 8 +- .../recipe/coldiron_axe_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_bars.json | 4 +- .../basemetals/recipe/coldiron_bars_2.json | 4 +- .../recipe/coldiron_bars_recycling.json | 4 +- .../basemetals/recipe/coldiron_block.json | 4 +- .../recipe/coldiron_block_crushing.json | 4 +- .../recipe/coldiron_block_ingot.json | 4 +- .../data/basemetals/recipe/coldiron_bolt.json | 8 +- .../recipe/coldiron_bolt_recycling.json | 4 +- .../basemetals/recipe/coldiron_boots.json | 4 +- .../recipe/coldiron_boots_plate_repair.json | 4 +- .../recipe/coldiron_boots_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_bow.json | 8 +- .../recipe/coldiron_bow_recycling.json | 4 +- .../basemetals/recipe/coldiron_button.json | 4 +- .../recipe/coldiron_button_recycling.json | 4 +- .../recipe/coldiron_chestplate.json | 4 +- .../coldiron_chestplate_plate_repair.json | 4 +- .../recipe/coldiron_chestplate_recycling.json | 4 +- .../recipe/coldiron_crackhammer.json | 8 +- .../coldiron_crackhammer_recycling.json | 4 +- .../basemetals/recipe/coldiron_crossbow.json | 12 +- .../recipe/coldiron_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_door.json | 4 +- .../recipe/coldiron_door_recycling.json | 4 +- .../recipe/coldiron_fishingrod.json | 8 +- .../data/basemetals/recipe/coldiron_gear.json | 8 +- .../recipe/coldiron_gear_recycling.json | 4 +- .../basemetals/recipe/coldiron_helmet.json | 4 +- .../recipe/coldiron_helmet_plate_repair.json | 4 +- .../recipe/coldiron_helmet_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_hoe.json | 8 +- .../recipe/coldiron_hoe_recycling.json | 4 +- .../recipe/coldiron_horsearmor.json | 8 +- .../recipe/coldiron_ingot_crushing.json | 4 +- .../recipe/coldiron_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/coldiron_leggings.json | 4 +- .../coldiron_leggings_plate_repair.json | 4 +- .../recipe/coldiron_leggings_recycling.json | 4 +- .../basemetals/recipe/coldiron_lever.json | 8 +- .../recipe/coldiron_lever_recycling.json | 4 +- .../recipe/coldiron_nugget_crushing.json | 4 +- .../basemetals/recipe/coldiron_nuggets.json | 4 +- .../recipe/coldiron_ore_blasting.json | 4 +- .../recipe/coldiron_ore_crushing.json | 4 +- .../recipe/coldiron_ore_smelting.json | 4 +- .../basemetals/recipe/coldiron_pickaxe.json | 8 +- .../recipe/coldiron_pickaxe_recycling.json | 4 +- .../basemetals/recipe/coldiron_plate.json | 4 +- .../recipe/coldiron_plate_recycling.json | 4 +- .../recipe/coldiron_powder_from_small.json | 4 +- .../recipe/coldiron_powder_smelting.json | 4 +- .../recipe/coldiron_pressure_plate.json | 4 +- .../coldiron_pressure_plate_recycling.json | 4 +- .../recipe/coldiron_raw_blasting.json | 4 +- .../recipe/coldiron_raw_crushing.json | 4 +- .../recipe/coldiron_raw_smelting.json | 4 +- .../data/basemetals/recipe/coldiron_rod.json | 4 +- .../recipe/coldiron_rod_recycling.json | 4 +- .../basemetals/recipe/coldiron_scythe.json | 8 +- .../basemetals/recipe/coldiron_shears.json | 4 +- .../recipe/coldiron_shears_recycling.json | 4 +- .../basemetals/recipe/coldiron_shield.json | 8 +- .../recipe/coldiron_shield_plate_repair.json | 4 +- .../basemetals/recipe/coldiron_shovel.json | 8 +- .../recipe/coldiron_shovel_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_slab.json | 4 +- .../recipe/coldiron_slab_recycling.json | 4 +- .../recipe/coldiron_smallpowder.json | 4 +- .../recipe/coldiron_smallpowder_smelting.json | 4 +- .../basemetals/recipe/coldiron_stairs.json | 4 +- .../basemetals/recipe/coldiron_sword.json | 8 +- .../recipe/coldiron_sword_recycling.json | 4 +- .../basemetals/recipe/coldiron_trapdoor.json | 4 +- .../recipe/coldiron_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/coldiron_wall.json | 4 +- .../recipe/coldiron_wall_recycling.json | 4 +- .../casting/copper/nugget_gold_cast.json | 2 +- .../casting/copper/nugget_sand_cast.json | 2 +- .../data/basemetals/recipe/copper_arrow.json | 12 +- .../recipe/copper_arrow_recycling.json | 6 +- .../data/basemetals/recipe/copper_axe.json | 14 +- .../recipe/copper_axe_recycling.json | 4 +- .../data/basemetals/recipe/copper_bars.json | 8 +- .../data/basemetals/recipe/copper_bars_2.json | 8 +- .../recipe/copper_bars_recycling.json | 6 +- .../data/basemetals/recipe/copper_block.json | 4 +- .../recipe/copper_block_crushing.json | 4 +- .../basemetals/recipe/copper_block_ingot.json | 4 +- .../data/basemetals/recipe/copper_bolt.json | 8 +- .../recipe/copper_bolt_recycling.json | 6 +- .../data/basemetals/recipe/copper_boots.json | 10 +- .../recipe/copper_boots_plate_repair.json | 4 +- .../recipe/copper_boots_recycling.json | 4 +- .../data/basemetals/recipe/copper_bow.json | 8 +- .../recipe/copper_bow_recycling.json | 4 +- .../data/basemetals/recipe/copper_button.json | 4 +- .../recipe/copper_button_recycling.json | 6 +- .../basemetals/recipe/copper_chestplate.json | 10 +- .../copper_chestplate_plate_repair.json | 4 +- .../recipe/copper_chestplate_recycling.json | 4 +- .../basemetals/recipe/copper_crackhammer.json | 8 +- .../recipe/copper_crackhammer_recycling.json | 4 +- .../basemetals/recipe/copper_crossbow.json | 12 +- .../recipe/copper_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/copper_door.json | 4 +- .../recipe/copper_door_recycling.json | 4 +- .../basemetals/recipe/copper_fishingrod.json | 8 +- .../data/basemetals/recipe/copper_gear.json | 8 +- .../recipe/copper_gear_recycling.json | 4 +- .../data/basemetals/recipe/copper_helmet.json | 10 +- .../recipe/copper_helmet_plate_repair.json | 4 +- .../recipe/copper_helmet_recycling.json | 4 +- .../data/basemetals/recipe/copper_hoe.json | 14 +- .../recipe/copper_hoe_recycling.json | 4 +- .../basemetals/recipe/copper_horsearmor.json | 14 +- .../recipe/copper_ingot_crushing.json | 4 +- .../recipe/copper_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/copper_leggings.json | 10 +- .../recipe/copper_leggings_plate_repair.json | 4 +- .../recipe/copper_leggings_recycling.json | 4 +- .../data/basemetals/recipe/copper_lever.json | 8 +- .../recipe/copper_lever_recycling.json | 4 +- .../recipe/copper_nugget_crushing.json | 4 +- .../basemetals/recipe/copper_nuggets.json | 8 +- .../recipe/copper_ore_blasting.json | 4 +- .../recipe/copper_ore_crushing.json | 4 +- .../recipe/copper_ore_smelting.json | 4 +- .../basemetals/recipe/copper_pickaxe.json | 14 +- .../recipe/copper_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/copper_plate.json | 4 +- .../recipe/copper_plate_recycling.json | 4 +- .../recipe/copper_powder_from_small.json | 4 +- .../recipe/copper_powder_smelting.json | 4 +- .../recipe/copper_pressure_plate.json | 4 +- .../copper_pressure_plate_recycling.json | 4 +- .../recipe/copper_raw_crushing.json | 4 +- .../data/basemetals/recipe/copper_rod.json | 4 +- .../recipe/copper_rod_recycling.json | 6 +- .../data/basemetals/recipe/copper_scythe.json | 8 +- .../data/basemetals/recipe/copper_shears.json | 4 +- .../recipe/copper_shears_recycling.json | 4 +- .../data/basemetals/recipe/copper_shield.json | 8 +- .../recipe/copper_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/copper_shovel.json | 14 +- .../recipe/copper_shovel_recycling.json | 4 +- .../data/basemetals/recipe/copper_slab.json | 4 +- .../recipe/copper_slab_recycling.json | 6 +- .../basemetals/recipe/copper_smallpowder.json | 4 +- .../recipe/copper_smallpowder_smelting.json | 6 +- .../data/basemetals/recipe/copper_stairs.json | 4 +- .../data/basemetals/recipe/copper_sword.json | 14 +- .../recipe/copper_sword_recycling.json | 4 +- .../basemetals/recipe/copper_trapdoor.json | 4 +- .../recipe/copper_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/copper_wall.json | 4 +- .../recipe/copper_wall_recycling.json | 4 +- .../basemetals/recipe/cupronickel_arrow.json | 12 +- .../recipe/cupronickel_arrow_recycling.json | 4 +- .../basemetals/recipe/cupronickel_axe.json | 8 +- .../recipe/cupronickel_axe_recycling.json | 4 +- .../basemetals/recipe/cupronickel_bars.json | 4 +- .../basemetals/recipe/cupronickel_bars_2.json | 4 +- .../recipe/cupronickel_bars_recycling.json | 4 +- .../basemetals/recipe/cupronickel_blend.json | 16 +- .../recipe/cupronickel_blend_from_small.json | 4 +- .../recipe/cupronickel_blend_smelting.json | 4 +- .../basemetals/recipe/cupronickel_block.json | 4 +- .../recipe/cupronickel_block_crushing.json | 4 +- .../recipe/cupronickel_block_ingot.json | 4 +- .../basemetals/recipe/cupronickel_bolt.json | 8 +- .../recipe/cupronickel_bolt_recycling.json | 4 +- .../basemetals/recipe/cupronickel_boots.json | 4 +- .../cupronickel_boots_plate_repair.json | 4 +- .../recipe/cupronickel_boots_recycling.json | 4 +- .../basemetals/recipe/cupronickel_bow.json | 8 +- .../recipe/cupronickel_bow_recycling.json | 4 +- .../basemetals/recipe/cupronickel_button.json | 4 +- .../recipe/cupronickel_button_recycling.json | 4 +- .../recipe/cupronickel_chestplate.json | 4 +- .../cupronickel_chestplate_plate_repair.json | 4 +- .../cupronickel_chestplate_recycling.json | 4 +- .../recipe/cupronickel_crackhammer.json | 8 +- .../cupronickel_crackhammer_recycling.json | 4 +- .../recipe/cupronickel_crossbow.json | 12 +- .../cupronickel_crossbow_recycling.json | 4 +- .../basemetals/recipe/cupronickel_door.json | 4 +- .../recipe/cupronickel_door_recycling.json | 4 +- .../recipe/cupronickel_fishingrod.json | 8 +- .../basemetals/recipe/cupronickel_gear.json | 8 +- .../recipe/cupronickel_gear_recycling.json | 4 +- .../basemetals/recipe/cupronickel_helmet.json | 4 +- .../cupronickel_helmet_plate_repair.json | 4 +- .../recipe/cupronickel_helmet_recycling.json | 4 +- .../basemetals/recipe/cupronickel_hoe.json | 8 +- .../recipe/cupronickel_hoe_recycling.json | 4 +- .../recipe/cupronickel_horsearmor.json | 8 +- .../recipe/cupronickel_ingot_crushing.json | 4 +- .../cupronickel_ingot_from_nuggets.json | 4 +- .../recipe/cupronickel_leggings.json | 4 +- .../cupronickel_leggings_plate_repair.json | 4 +- .../cupronickel_leggings_recycling.json | 4 +- .../basemetals/recipe/cupronickel_lever.json | 8 +- .../recipe/cupronickel_lever_recycling.json | 4 +- .../recipe/cupronickel_nugget_crushing.json | 4 +- .../recipe/cupronickel_nuggets.json | 4 +- .../recipe/cupronickel_pickaxe.json | 8 +- .../recipe/cupronickel_pickaxe_recycling.json | 4 +- .../basemetals/recipe/cupronickel_plate.json | 4 +- .../recipe/cupronickel_plate_recycling.json | 4 +- .../recipe/cupronickel_powder_from_small.json | 4 +- .../recipe/cupronickel_powder_smelting.json | 4 +- .../recipe/cupronickel_pressure_plate.json | 4 +- .../cupronickel_pressure_plate_recycling.json | 4 +- .../basemetals/recipe/cupronickel_rod.json | 4 +- .../recipe/cupronickel_rod_recycling.json | 4 +- .../basemetals/recipe/cupronickel_scythe.json | 8 +- .../basemetals/recipe/cupronickel_shears.json | 4 +- .../recipe/cupronickel_shears_recycling.json | 4 +- .../basemetals/recipe/cupronickel_shield.json | 8 +- .../cupronickel_shield_plate_repair.json | 4 +- .../basemetals/recipe/cupronickel_shovel.json | 8 +- .../recipe/cupronickel_shovel_recycling.json | 4 +- .../basemetals/recipe/cupronickel_slab.json | 4 +- .../recipe/cupronickel_slab_recycling.json | 4 +- .../recipe/cupronickel_smallblend.json | 4 +- .../cupronickel_smallblend_smelting.json | 4 +- .../recipe/cupronickel_smallpowder.json | 4 +- .../cupronickel_smallpowder_smelting.json | 4 +- .../basemetals/recipe/cupronickel_stairs.json | 4 +- .../basemetals/recipe/cupronickel_sword.json | 8 +- .../recipe/cupronickel_sword_recycling.json | 4 +- .../recipe/cupronickel_trapdoor.json | 4 +- .../cupronickel_trapdoor_recycling.json | 4 +- .../basemetals/recipe/cupronickel_wall.json | 4 +- .../recipe/cupronickel_wall_recycling.json | 4 +- .../recipe/dark_prismarine_crushing.json | 4 +- .../data/basemetals/recipe/detector_rail.json | 12 +- .../data/basemetals/recipe/diamond_arrow.json | 12 +- .../recipe/diamond_arrow_recycling.json | 4 +- .../data/basemetals/recipe/diamond_bars.json | 4 +- .../basemetals/recipe/diamond_bars_2.json | 4 +- .../recipe/diamond_bars_recycling.json | 4 +- .../recipe/diamond_block_crushing.json | 4 +- .../data/basemetals/recipe/diamond_bolt.json | 8 +- .../recipe/diamond_bolt_recycling.json | 4 +- .../recipe/diamond_boots_plate_repair.json | 4 +- .../data/basemetals/recipe/diamond_bow.json | 8 +- .../recipe/diamond_bow_recycling.json | 4 +- .../basemetals/recipe/diamond_button.json | 4 +- .../recipe/diamond_button_recycling.json | 4 +- .../diamond_chestplate_plate_repair.json | 4 +- .../recipe/diamond_crackhammer.json | 8 +- .../recipe/diamond_crackhammer_recycling.json | 4 +- .../basemetals/recipe/diamond_crossbow.json | 12 +- .../recipe/diamond_crossbow_recycling.json | 4 +- .../basemetals/recipe/diamond_crushing.json | 4 +- .../data/basemetals/recipe/diamond_door.json | 4 +- .../recipe/diamond_door_recycling.json | 4 +- .../basemetals/recipe/diamond_fishingrod.json | 8 +- .../data/basemetals/recipe/diamond_gear.json | 8 +- .../recipe/diamond_gear_recycling.json | 4 +- .../recipe/diamond_helmet_plate_repair.json | 4 +- .../recipe/diamond_leggings_plate_repair.json | 4 +- .../data/basemetals/recipe/diamond_lever.json | 8 +- .../recipe/diamond_lever_recycling.json | 4 +- .../recipe/diamond_nugget_crushing.json | 4 +- .../recipe/diamond_ore_crushing.json | 4 +- .../recipe/diamond_powder_from_small.json | 4 +- .../recipe/diamond_powder_smelting.json | 4 +- .../recipe/diamond_pressure_plate.json | 4 +- .../diamond_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/diamond_rod.json | 4 +- .../recipe/diamond_rod_recycling.json | 4 +- .../basemetals/recipe/diamond_scythe.json | 8 +- .../basemetals/recipe/diamond_shears.json | 4 +- .../recipe/diamond_shears_recycling.json | 4 +- .../basemetals/recipe/diamond_shield.json | 8 +- .../recipe/diamond_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/diamond_slab.json | 4 +- .../recipe/diamond_slab_recycling.json | 4 +- .../recipe/diamond_smallblend_smelting.json | 4 +- .../recipe/diamond_smallpowder.json | 4 +- .../recipe/diamond_smallpowder_smelting.json | 4 +- .../basemetals/recipe/diamond_stairs.json | 4 +- .../basemetals/recipe/diamond_trapdoor.json | 4 +- .../recipe/diamond_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/diamond_wall.json | 4 +- .../recipe/diamond_wall_recycling.json | 4 +- .../basemetals/recipe/electrum_arrow.json | 12 +- .../recipe/electrum_arrow_recycling.json | 4 +- .../data/basemetals/recipe/electrum_axe.json | 8 +- .../recipe/electrum_axe_recycling.json | 4 +- .../data/basemetals/recipe/electrum_bars.json | 4 +- .../basemetals/recipe/electrum_bars_2.json | 4 +- .../recipe/electrum_bars_recycling.json | 4 +- .../basemetals/recipe/electrum_blend.json | 8 +- .../recipe/electrum_blend_from_small.json | 4 +- .../recipe/electrum_blend_smelting.json | 4 +- .../basemetals/recipe/electrum_block.json | 4 +- .../recipe/electrum_block_crushing.json | 4 +- .../recipe/electrum_block_ingot.json | 4 +- .../data/basemetals/recipe/electrum_bolt.json | 8 +- .../recipe/electrum_bolt_recycling.json | 4 +- .../basemetals/recipe/electrum_boots.json | 4 +- .../recipe/electrum_boots_plate_repair.json | 4 +- .../recipe/electrum_boots_recycling.json | 4 +- .../data/basemetals/recipe/electrum_bow.json | 8 +- .../recipe/electrum_bow_recycling.json | 4 +- .../basemetals/recipe/electrum_button.json | 4 +- .../recipe/electrum_button_recycling.json | 4 +- .../recipe/electrum_chestplate.json | 4 +- .../electrum_chestplate_plate_repair.json | 4 +- .../recipe/electrum_chestplate_recycling.json | 4 +- .../recipe/electrum_crackhammer.json | 8 +- .../electrum_crackhammer_recycling.json | 4 +- .../basemetals/recipe/electrum_crossbow.json | 12 +- .../recipe/electrum_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/electrum_door.json | 4 +- .../recipe/electrum_door_recycling.json | 4 +- .../recipe/electrum_fishingrod.json | 8 +- .../data/basemetals/recipe/electrum_gear.json | 8 +- .../recipe/electrum_gear_recycling.json | 4 +- .../basemetals/recipe/electrum_helmet.json | 4 +- .../recipe/electrum_helmet_plate_repair.json | 4 +- .../recipe/electrum_helmet_recycling.json | 4 +- .../data/basemetals/recipe/electrum_hoe.json | 8 +- .../recipe/electrum_hoe_recycling.json | 4 +- .../recipe/electrum_horsearmor.json | 8 +- .../recipe/electrum_ingot_crushing.json | 4 +- .../recipe/electrum_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/electrum_leggings.json | 4 +- .../electrum_leggings_plate_repair.json | 4 +- .../recipe/electrum_leggings_recycling.json | 4 +- .../basemetals/recipe/electrum_lever.json | 8 +- .../recipe/electrum_lever_recycling.json | 4 +- .../recipe/electrum_nugget_crushing.json | 4 +- .../basemetals/recipe/electrum_nuggets.json | 4 +- .../basemetals/recipe/electrum_pickaxe.json | 8 +- .../recipe/electrum_pickaxe_recycling.json | 4 +- .../basemetals/recipe/electrum_plate.json | 4 +- .../recipe/electrum_plate_recycling.json | 4 +- .../recipe/electrum_powder_from_small.json | 4 +- .../recipe/electrum_powder_smelting.json | 4 +- .../recipe/electrum_pressure_plate.json | 4 +- .../electrum_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/electrum_rod.json | 4 +- .../recipe/electrum_rod_recycling.json | 4 +- .../basemetals/recipe/electrum_scythe.json | 8 +- .../basemetals/recipe/electrum_shears.json | 4 +- .../recipe/electrum_shears_recycling.json | 4 +- .../basemetals/recipe/electrum_shield.json | 8 +- .../recipe/electrum_shield_plate_repair.json | 4 +- .../basemetals/recipe/electrum_shovel.json | 8 +- .../recipe/electrum_shovel_recycling.json | 4 +- .../data/basemetals/recipe/electrum_slab.json | 4 +- .../recipe/electrum_slab_recycling.json | 4 +- .../recipe/electrum_smallblend.json | 4 +- .../recipe/electrum_smallblend_smelting.json | 4 +- .../recipe/electrum_smallpowder.json | 4 +- .../recipe/electrum_smallpowder_smelting.json | 4 +- .../basemetals/recipe/electrum_stairs.json | 4 +- .../basemetals/recipe/electrum_sword.json | 8 +- .../recipe/electrum_sword_recycling.json | 4 +- .../basemetals/recipe/electrum_trapdoor.json | 4 +- .../recipe/electrum_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/electrum_wall.json | 4 +- .../recipe/electrum_wall_recycling.json | 4 +- .../data/basemetals/recipe/emerald_arrow.json | 12 +- .../recipe/emerald_arrow_recycling.json | 4 +- .../data/basemetals/recipe/emerald_axe.json | 8 +- .../recipe/emerald_axe_recycling.json | 4 +- .../data/basemetals/recipe/emerald_bars.json | 4 +- .../basemetals/recipe/emerald_bars_2.json | 4 +- .../recipe/emerald_bars_recycling.json | 4 +- .../recipe/emerald_block_crushing.json | 4 +- .../data/basemetals/recipe/emerald_bolt.json | 8 +- .../recipe/emerald_bolt_recycling.json | 4 +- .../data/basemetals/recipe/emerald_boots.json | 4 +- .../recipe/emerald_boots_plate_repair.json | 4 +- .../recipe/emerald_boots_recycling.json | 4 +- .../data/basemetals/recipe/emerald_bow.json | 8 +- .../recipe/emerald_bow_recycling.json | 4 +- .../basemetals/recipe/emerald_button.json | 4 +- .../recipe/emerald_button_recycling.json | 4 +- .../basemetals/recipe/emerald_chestplate.json | 4 +- .../emerald_chestplate_plate_repair.json | 4 +- .../recipe/emerald_chestplate_recycling.json | 4 +- .../recipe/emerald_crackhammer.json | 8 +- .../recipe/emerald_crackhammer_recycling.json | 4 +- .../basemetals/recipe/emerald_crossbow.json | 12 +- .../recipe/emerald_crossbow_recycling.json | 4 +- .../basemetals/recipe/emerald_crushing.json | 4 +- .../data/basemetals/recipe/emerald_door.json | 4 +- .../recipe/emerald_door_recycling.json | 4 +- .../basemetals/recipe/emerald_fishingrod.json | 8 +- .../data/basemetals/recipe/emerald_gear.json | 8 +- .../recipe/emerald_gear_recycling.json | 4 +- .../basemetals/recipe/emerald_helmet.json | 4 +- .../recipe/emerald_helmet_plate_repair.json | 4 +- .../recipe/emerald_helmet_recycling.json | 4 +- .../data/basemetals/recipe/emerald_hoe.json | 8 +- .../recipe/emerald_hoe_recycling.json | 4 +- .../basemetals/recipe/emerald_horsearmor.json | 8 +- .../basemetals/recipe/emerald_leggings.json | 4 +- .../recipe/emerald_leggings_plate_repair.json | 4 +- .../recipe/emerald_leggings_recycling.json | 4 +- .../data/basemetals/recipe/emerald_lever.json | 8 +- .../recipe/emerald_lever_recycling.json | 4 +- .../recipe/emerald_nugget_crushing.json | 4 +- .../recipe/emerald_ore_crushing.json | 4 +- .../basemetals/recipe/emerald_pickaxe.json | 8 +- .../recipe/emerald_pickaxe_recycling.json | 4 +- .../recipe/emerald_powder_from_small.json | 4 +- .../recipe/emerald_powder_smelting.json | 4 +- .../recipe/emerald_pressure_plate.json | 4 +- .../emerald_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/emerald_rod.json | 4 +- .../recipe/emerald_rod_recycling.json | 4 +- .../basemetals/recipe/emerald_scythe.json | 8 +- .../basemetals/recipe/emerald_shears.json | 4 +- .../recipe/emerald_shears_recycling.json | 4 +- .../basemetals/recipe/emerald_shield.json | 8 +- .../recipe/emerald_shield_plate_repair.json | 4 +- .../basemetals/recipe/emerald_shovel.json | 8 +- .../recipe/emerald_shovel_recycling.json | 4 +- .../data/basemetals/recipe/emerald_slab.json | 4 +- .../recipe/emerald_slab_recycling.json | 4 +- .../recipe/emerald_smallpowder.json | 4 +- .../recipe/emerald_smallpowder_smelting.json | 4 +- .../basemetals/recipe/emerald_stairs.json | 4 +- .../data/basemetals/recipe/emerald_sword.json | 8 +- .../recipe/emerald_sword_recycling.json | 4 +- .../basemetals/recipe/emerald_trapdoor.json | 4 +- .../recipe/emerald_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/emerald_wall.json | 4 +- .../recipe/emerald_wall_recycling.json | 4 +- .../basemetals/recipe/flint_and_steel.json | 8 +- .../basemetals/recipe/glass_crushing.json | 4 +- .../basemetals/recipe/glowstone_crushing.json | 4 +- .../data/basemetals/recipe/gold_arrow.json | 12 +- .../recipe/gold_arrow_recycling.json | 4 +- .../data/basemetals/recipe/gold_bars.json | 4 +- .../data/basemetals/recipe/gold_bars_2.json | 4 +- .../recipe/gold_bars_recycling.json | 4 +- .../recipe/gold_block_crushing.json | 4 +- .../data/basemetals/recipe/gold_bolt.json | 8 +- .../recipe/gold_bolt_recycling.json | 4 +- .../recipe/gold_boots_plate_repair.json | 4 +- .../data/basemetals/recipe/gold_bow.json | 8 +- .../basemetals/recipe/gold_bow_recycling.json | 4 +- .../data/basemetals/recipe/gold_button.json | 4 +- .../recipe/gold_button_recycling.json | 4 +- .../recipe/gold_chestplate_plate_repair.json | 4 +- .../basemetals/recipe/gold_crackhammer.json | 8 +- .../recipe/gold_crackhammer_recycling.json | 4 +- .../data/basemetals/recipe/gold_crossbow.json | 12 +- .../recipe/gold_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/gold_door.json | 4 +- .../recipe/gold_door_recycling.json | 4 +- .../basemetals/recipe/gold_fishingrod.json | 8 +- .../data/basemetals/recipe/gold_gear.json | 8 +- .../recipe/gold_gear_recycling.json | 4 +- .../recipe/gold_helmet_plate_repair.json | 4 +- .../recipe/gold_ingot_crushing.json | 4 +- .../recipe/gold_leggings_plate_repair.json | 4 +- .../data/basemetals/recipe/gold_lever.json | 8 +- .../recipe/gold_lever_recycling.json | 4 +- .../recipe/gold_nugget_crushing.json | 4 +- .../basemetals/recipe/gold_ore_crushing.json | 4 +- .../data/basemetals/recipe/gold_plate.json | 4 +- .../recipe/gold_plate_recycling.json | 4 +- .../recipe/gold_powder_from_small.json | 4 +- .../recipe/gold_powder_smelting.json | 4 +- .../basemetals/recipe/gold_raw_crushing.json | 4 +- .../data/basemetals/recipe/gold_rod.json | 4 +- .../basemetals/recipe/gold_rod_recycling.json | 4 +- .../data/basemetals/recipe/gold_scythe.json | 8 +- .../data/basemetals/recipe/gold_shears.json | 4 +- .../recipe/gold_shears_recycling.json | 4 +- .../data/basemetals/recipe/gold_shield.json | 8 +- .../recipe/gold_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/gold_slab.json | 4 +- .../recipe/gold_slab_recycling.json | 4 +- .../recipe/gold_smallblend_smelting.json | 4 +- .../basemetals/recipe/gold_smallpowder.json | 4 +- .../recipe/gold_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/gold_stairs.json | 4 +- .../data/basemetals/recipe/gold_trapdoor.json | 4 +- .../recipe/gold_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/gold_wall.json | 4 +- .../recipe/gold_wall_recycling.json | 4 +- .../basemetals/recipe/gravel_crushing.json | 4 +- .../basemetals/recipe/human_detector.json | 8 +- .../data/basemetals/recipe/invar_arrow.json | 12 +- .../recipe/invar_arrow_recycling.json | 4 +- .../data/basemetals/recipe/invar_axe.json | 8 +- .../recipe/invar_axe_recycling.json | 4 +- .../data/basemetals/recipe/invar_bars.json | 4 +- .../data/basemetals/recipe/invar_bars_2.json | 4 +- .../recipe/invar_bars_recycling.json | 4 +- .../data/basemetals/recipe/invar_blend.json | 12 +- .../recipe/invar_blend_from_small.json | 4 +- .../recipe/invar_blend_smelting.json | 4 +- .../data/basemetals/recipe/invar_block.json | 4 +- .../recipe/invar_block_crushing.json | 4 +- .../basemetals/recipe/invar_block_ingot.json | 4 +- .../data/basemetals/recipe/invar_bolt.json | 8 +- .../recipe/invar_bolt_recycling.json | 4 +- .../data/basemetals/recipe/invar_boots.json | 4 +- .../recipe/invar_boots_recycling.json | 4 +- .../data/basemetals/recipe/invar_bow.json | 8 +- .../recipe/invar_bow_recycling.json | 4 +- .../data/basemetals/recipe/invar_button.json | 4 +- .../recipe/invar_button_recycling.json | 4 +- .../basemetals/recipe/invar_chestplate.json | 4 +- .../recipe/invar_chestplate_recycling.json | 4 +- .../basemetals/recipe/invar_crackhammer.json | 8 +- .../recipe/invar_crackhammer_recycling.json | 4 +- .../basemetals/recipe/invar_crossbow.json | 12 +- .../recipe/invar_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/invar_door.json | 4 +- .../recipe/invar_door_recycling.json | 4 +- .../basemetals/recipe/invar_fishingrod.json | 8 +- .../data/basemetals/recipe/invar_gear.json | 8 +- .../recipe/invar_gear_recycling.json | 4 +- .../data/basemetals/recipe/invar_helmet.json | 4 +- .../recipe/invar_helmet_recycling.json | 4 +- .../data/basemetals/recipe/invar_hoe.json | 8 +- .../recipe/invar_hoe_recycling.json | 4 +- .../basemetals/recipe/invar_horsearmor.json | 8 +- .../recipe/invar_ingot_crushing.json | 4 +- .../recipe/invar_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/invar_leggings.json | 4 +- .../recipe/invar_leggings_recycling.json | 4 +- .../data/basemetals/recipe/invar_lever.json | 8 +- .../recipe/invar_lever_recycling.json | 4 +- .../recipe/invar_nugget_crushing.json | 4 +- .../data/basemetals/recipe/invar_nuggets.json | 4 +- .../data/basemetals/recipe/invar_pickaxe.json | 8 +- .../recipe/invar_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/invar_plate.json | 4 +- .../recipe/invar_plate_recycling.json | 4 +- .../recipe/invar_powder_from_small.json | 4 +- .../recipe/invar_powder_smelting.json | 4 +- .../recipe/invar_pressure_plate.json | 4 +- .../invar_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/invar_rod.json | 4 +- .../recipe/invar_rod_recycling.json | 4 +- .../data/basemetals/recipe/invar_scythe.json | 8 +- .../data/basemetals/recipe/invar_shears.json | 4 +- .../recipe/invar_shears_recycling.json | 4 +- .../data/basemetals/recipe/invar_shield.json | 8 +- .../data/basemetals/recipe/invar_shovel.json | 8 +- .../recipe/invar_shovel_recycling.json | 4 +- .../data/basemetals/recipe/invar_slab.json | 4 +- .../recipe/invar_slab_recycling.json | 4 +- .../basemetals/recipe/invar_smallblend.json | 4 +- .../recipe/invar_smallblend_smelting.json | 4 +- .../basemetals/recipe/invar_smallpowder.json | 4 +- .../recipe/invar_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/invar_stairs.json | 4 +- .../data/basemetals/recipe/invar_sword.json | 8 +- .../recipe/invar_sword_recycling.json | 4 +- .../basemetals/recipe/invar_trapdoor.json | 4 +- .../recipe/invar_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/invar_wall.json | 4 +- .../recipe/invar_wall_recycling.json | 4 +- .../data/basemetals/recipe/iron_arrow.json | 12 +- .../recipe/iron_arrow_recycling.json | 4 +- .../data/basemetals/recipe/iron_bars_2.json | 4 +- .../recipe/iron_block_crushing.json | 4 +- .../data/basemetals/recipe/iron_bolt.json | 8 +- .../recipe/iron_bolt_recycling.json | 4 +- .../recipe/iron_boots_plate_repair.json | 4 +- .../data/basemetals/recipe/iron_bow.json | 8 +- .../basemetals/recipe/iron_bow_recycling.json | 4 +- .../data/basemetals/recipe/iron_button.json | 4 +- .../recipe/iron_button_recycling.json | 4 +- .../recipe/iron_chestplate_plate_repair.json | 4 +- .../basemetals/recipe/iron_crackhammer.json | 8 +- .../recipe/iron_crackhammer_recycling.json | 4 +- .../data/basemetals/recipe/iron_crossbow.json | 12 +- .../recipe/iron_crossbow_recycling.json | 4 +- .../basemetals/recipe/iron_fishingrod.json | 8 +- .../data/basemetals/recipe/iron_gear.json | 8 +- .../recipe/iron_gear_recycling.json | 4 +- .../recipe/iron_helmet_plate_repair.json | 4 +- .../recipe/iron_ingot_crushing.json | 4 +- .../recipe/iron_leggings_plate_repair.json | 4 +- .../data/basemetals/recipe/iron_lever.json | 8 +- .../recipe/iron_lever_recycling.json | 4 +- .../recipe/iron_nugget_crushing.json | 4 +- .../basemetals/recipe/iron_ore_crushing.json | 4 +- .../data/basemetals/recipe/iron_plate.json | 4 +- .../recipe/iron_plate_recycling.json | 4 +- .../recipe/iron_powder_from_small.json | 4 +- .../recipe/iron_powder_smelting.json | 4 +- .../basemetals/recipe/iron_raw_crushing.json | 4 +- .../data/basemetals/recipe/iron_rod.json | 4 +- .../basemetals/recipe/iron_rod_recycling.json | 4 +- .../data/basemetals/recipe/iron_scythe.json | 8 +- .../data/basemetals/recipe/iron_shield.json | 8 +- .../recipe/iron_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/iron_slab.json | 4 +- .../recipe/iron_slab_recycling.json | 4 +- .../recipe/iron_smallblend_smelting.json | 4 +- .../basemetals/recipe/iron_smallpowder.json | 4 +- .../recipe/iron_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/iron_stairs.json | 4 +- .../data/basemetals/recipe/iron_wall.json | 4 +- .../recipe/iron_wall_recycling.json | 4 +- .../recipe/lapis_block_crushing.json | 4 +- .../basemetals/recipe/lapis_ore_crushing.json | 4 +- .../data/basemetals/recipe/lead_arrow.json | 12 +- .../recipe/lead_arrow_recycling.json | 4 +- .../data/basemetals/recipe/lead_axe.json | 8 +- .../basemetals/recipe/lead_axe_recycling.json | 4 +- .../data/basemetals/recipe/lead_bars.json | 4 +- .../data/basemetals/recipe/lead_bars_2.json | 4 +- .../recipe/lead_bars_recycling.json | 4 +- .../data/basemetals/recipe/lead_block.json | 4 +- .../recipe/lead_block_crushing.json | 4 +- .../basemetals/recipe/lead_block_ingot.json | 4 +- .../data/basemetals/recipe/lead_bolt.json | 8 +- .../recipe/lead_bolt_recycling.json | 4 +- .../data/basemetals/recipe/lead_boots.json | 4 +- .../recipe/lead_boots_plate_repair.json | 4 +- .../recipe/lead_boots_recycling.json | 4 +- .../data/basemetals/recipe/lead_bow.json | 8 +- .../basemetals/recipe/lead_bow_recycling.json | 4 +- .../data/basemetals/recipe/lead_button.json | 4 +- .../recipe/lead_button_recycling.json | 4 +- .../basemetals/recipe/lead_chestplate.json | 4 +- .../recipe/lead_chestplate_plate_repair.json | 4 +- .../recipe/lead_chestplate_recycling.json | 4 +- .../basemetals/recipe/lead_crackhammer.json | 8 +- .../recipe/lead_crackhammer_recycling.json | 4 +- .../data/basemetals/recipe/lead_crossbow.json | 12 +- .../recipe/lead_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/lead_door.json | 4 +- .../recipe/lead_door_recycling.json | 4 +- .../basemetals/recipe/lead_fishingrod.json | 8 +- .../data/basemetals/recipe/lead_gear.json | 8 +- .../recipe/lead_gear_recycling.json | 4 +- .../data/basemetals/recipe/lead_helmet.json | 4 +- .../recipe/lead_helmet_plate_repair.json | 4 +- .../recipe/lead_helmet_recycling.json | 4 +- .../data/basemetals/recipe/lead_hoe.json | 8 +- .../basemetals/recipe/lead_hoe_recycling.json | 4 +- .../basemetals/recipe/lead_horsearmor.json | 8 +- .../recipe/lead_ingot_crushing.json | 4 +- .../recipe/lead_ingot_from_nuggets.json | 4 +- .../data/basemetals/recipe/lead_leggings.json | 4 +- .../recipe/lead_leggings_plate_repair.json | 4 +- .../recipe/lead_leggings_recycling.json | 4 +- .../data/basemetals/recipe/lead_lever.json | 8 +- .../recipe/lead_lever_recycling.json | 4 +- .../recipe/lead_nugget_crushing.json | 4 +- .../data/basemetals/recipe/lead_nuggets.json | 4 +- .../basemetals/recipe/lead_ore_blasting.json | 4 +- .../basemetals/recipe/lead_ore_crushing.json | 4 +- .../basemetals/recipe/lead_ore_smelting.json | 4 +- .../data/basemetals/recipe/lead_pickaxe.json | 8 +- .../recipe/lead_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/lead_plate.json | 4 +- .../recipe/lead_plate_recycling.json | 4 +- .../recipe/lead_powder_from_small.json | 4 +- .../recipe/lead_powder_smelting.json | 4 +- .../recipe/lead_pressure_plate.json | 4 +- .../recipe/lead_pressure_plate_recycling.json | 4 +- .../basemetals/recipe/lead_raw_blasting.json | 4 +- .../basemetals/recipe/lead_raw_crushing.json | 4 +- .../basemetals/recipe/lead_raw_smelting.json | 4 +- .../data/basemetals/recipe/lead_rod.json | 4 +- .../basemetals/recipe/lead_rod_recycling.json | 4 +- .../data/basemetals/recipe/lead_scythe.json | 8 +- .../data/basemetals/recipe/lead_shears.json | 4 +- .../recipe/lead_shears_recycling.json | 4 +- .../data/basemetals/recipe/lead_shield.json | 8 +- .../recipe/lead_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/lead_shovel.json | 8 +- .../recipe/lead_shovel_recycling.json | 4 +- .../data/basemetals/recipe/lead_slab.json | 4 +- .../recipe/lead_slab_recycling.json | 4 +- .../basemetals/recipe/lead_smallpowder.json | 4 +- .../recipe/lead_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/lead_stairs.json | 4 +- .../data/basemetals/recipe/lead_sword.json | 8 +- .../recipe/lead_sword_recycling.json | 4 +- .../data/basemetals/recipe/lead_trapdoor.json | 4 +- .../recipe/lead_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/lead_wall.json | 4 +- .../recipe/lead_wall_recycling.json | 4 +- .../recipe/mercury_ingot_crushing.json | 4 +- .../recipe/mercury_ingot_from_nuggets.json | 4 +- .../recipe/mercury_nugget_crushing.json | 4 +- .../basemetals/recipe/mercury_nuggets.json | 4 +- .../recipe/mercury_ore_blasting.json | 4 +- .../recipe/mercury_ore_crushing.json | 4 +- .../recipe/mercury_ore_smelting.json | 4 +- .../recipe/mercury_powder_from_small.json | 4 +- .../recipe/mercury_powder_smelting.json | 4 +- .../recipe/mercury_raw_blasting.json | 4 +- .../recipe/mercury_raw_crushing.json | 4 +- .../recipe/mercury_raw_smelting.json | 4 +- .../recipe/mercury_smallpowder.json | 4 +- .../recipe/mercury_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/minecart.json | 4 +- .../data/basemetals/recipe/mithril_arrow.json | 12 +- .../recipe/mithril_arrow_recycling.json | 4 +- .../data/basemetals/recipe/mithril_axe.json | 8 +- .../recipe/mithril_axe_recycling.json | 4 +- .../data/basemetals/recipe/mithril_bars.json | 4 +- .../basemetals/recipe/mithril_bars_2.json | 4 +- .../recipe/mithril_bars_recycling.json | 4 +- .../data/basemetals/recipe/mithril_blend.json | 16 +- .../recipe/mithril_blend_from_small.json | 4 +- .../recipe/mithril_blend_smelting.json | 4 +- .../data/basemetals/recipe/mithril_block.json | 4 +- .../recipe/mithril_block_crushing.json | 4 +- .../recipe/mithril_block_ingot.json | 4 +- .../data/basemetals/recipe/mithril_bolt.json | 8 +- .../recipe/mithril_bolt_recycling.json | 4 +- .../data/basemetals/recipe/mithril_boots.json | 4 +- .../recipe/mithril_boots_recycling.json | 4 +- .../data/basemetals/recipe/mithril_bow.json | 8 +- .../recipe/mithril_bow_recycling.json | 4 +- .../basemetals/recipe/mithril_button.json | 4 +- .../recipe/mithril_button_recycling.json | 4 +- .../basemetals/recipe/mithril_chestplate.json | 4 +- .../recipe/mithril_chestplate_recycling.json | 4 +- .../recipe/mithril_crackhammer.json | 8 +- .../recipe/mithril_crackhammer_recycling.json | 4 +- .../basemetals/recipe/mithril_crossbow.json | 12 +- .../recipe/mithril_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/mithril_door.json | 4 +- .../recipe/mithril_door_recycling.json | 4 +- .../basemetals/recipe/mithril_fishingrod.json | 8 +- .../data/basemetals/recipe/mithril_gear.json | 8 +- .../recipe/mithril_gear_recycling.json | 4 +- .../basemetals/recipe/mithril_helmet.json | 4 +- .../recipe/mithril_helmet_recycling.json | 4 +- .../data/basemetals/recipe/mithril_hoe.json | 8 +- .../recipe/mithril_hoe_recycling.json | 4 +- .../basemetals/recipe/mithril_horsearmor.json | 8 +- .../recipe/mithril_ingot_crushing.json | 4 +- .../recipe/mithril_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/mithril_leggings.json | 4 +- .../recipe/mithril_leggings_recycling.json | 4 +- .../data/basemetals/recipe/mithril_lever.json | 8 +- .../recipe/mithril_lever_recycling.json | 4 +- .../recipe/mithril_nugget_crushing.json | 4 +- .../basemetals/recipe/mithril_nuggets.json | 4 +- .../basemetals/recipe/mithril_pickaxe.json | 8 +- .../recipe/mithril_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/mithril_plate.json | 4 +- .../recipe/mithril_plate_recycling.json | 4 +- .../recipe/mithril_powder_from_small.json | 4 +- .../recipe/mithril_powder_smelting.json | 4 +- .../recipe/mithril_pressure_plate.json | 4 +- .../mithril_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/mithril_rod.json | 4 +- .../recipe/mithril_rod_recycling.json | 4 +- .../basemetals/recipe/mithril_scythe.json | 8 +- .../basemetals/recipe/mithril_shears.json | 4 +- .../recipe/mithril_shears_recycling.json | 4 +- .../basemetals/recipe/mithril_shield.json | 8 +- .../basemetals/recipe/mithril_shovel.json | 8 +- .../recipe/mithril_shovel_recycling.json | 4 +- .../data/basemetals/recipe/mithril_slab.json | 4 +- .../recipe/mithril_slab_recycling.json | 4 +- .../basemetals/recipe/mithril_smallblend.json | 4 +- .../recipe/mithril_smallblend_smelting.json | 4 +- .../recipe/mithril_smallpowder.json | 4 +- .../recipe/mithril_smallpowder_smelting.json | 4 +- .../basemetals/recipe/mithril_stairs.json | 4 +- .../data/basemetals/recipe/mithril_sword.json | 8 +- .../recipe/mithril_sword_recycling.json | 4 +- .../basemetals/recipe/mithril_trapdoor.json | 4 +- .../recipe/mithril_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/mithril_wall.json | 4 +- .../recipe/mithril_wall_recycling.json | 4 +- .../recipe/mossy_cobblestone_crushing.json | 4 +- .../mossy_cobblestone_wall_crushing.json | 4 +- .../data/basemetals/recipe/nickel_arrow.json | 12 +- .../recipe/nickel_arrow_recycling.json | 4 +- .../data/basemetals/recipe/nickel_axe.json | 8 +- .../recipe/nickel_axe_recycling.json | 4 +- .../data/basemetals/recipe/nickel_bars.json | 4 +- .../data/basemetals/recipe/nickel_bars_2.json | 4 +- .../recipe/nickel_bars_recycling.json | 4 +- .../data/basemetals/recipe/nickel_block.json | 4 +- .../recipe/nickel_block_crushing.json | 4 +- .../basemetals/recipe/nickel_block_ingot.json | 4 +- .../data/basemetals/recipe/nickel_bolt.json | 8 +- .../recipe/nickel_bolt_recycling.json | 4 +- .../data/basemetals/recipe/nickel_boots.json | 4 +- .../recipe/nickel_boots_plate_repair.json | 4 +- .../recipe/nickel_boots_recycling.json | 4 +- .../data/basemetals/recipe/nickel_bow.json | 8 +- .../recipe/nickel_bow_recycling.json | 4 +- .../data/basemetals/recipe/nickel_button.json | 4 +- .../recipe/nickel_button_recycling.json | 4 +- .../basemetals/recipe/nickel_chestplate.json | 4 +- .../nickel_chestplate_plate_repair.json | 4 +- .../recipe/nickel_chestplate_recycling.json | 4 +- .../basemetals/recipe/nickel_crackhammer.json | 8 +- .../recipe/nickel_crackhammer_recycling.json | 4 +- .../basemetals/recipe/nickel_crossbow.json | 12 +- .../recipe/nickel_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/nickel_door.json | 4 +- .../recipe/nickel_door_recycling.json | 4 +- .../basemetals/recipe/nickel_fishingrod.json | 8 +- .../data/basemetals/recipe/nickel_gear.json | 8 +- .../recipe/nickel_gear_recycling.json | 4 +- .../data/basemetals/recipe/nickel_helmet.json | 4 +- .../recipe/nickel_helmet_plate_repair.json | 4 +- .../recipe/nickel_helmet_recycling.json | 4 +- .../data/basemetals/recipe/nickel_hoe.json | 8 +- .../recipe/nickel_hoe_recycling.json | 4 +- .../basemetals/recipe/nickel_horsearmor.json | 8 +- .../recipe/nickel_ingot_crushing.json | 4 +- .../recipe/nickel_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/nickel_leggings.json | 4 +- .../recipe/nickel_leggings_plate_repair.json | 4 +- .../recipe/nickel_leggings_recycling.json | 4 +- .../data/basemetals/recipe/nickel_lever.json | 8 +- .../recipe/nickel_lever_recycling.json | 4 +- .../recipe/nickel_nugget_crushing.json | 4 +- .../basemetals/recipe/nickel_nuggets.json | 4 +- .../recipe/nickel_ore_blasting.json | 4 +- .../recipe/nickel_ore_crushing.json | 4 +- .../recipe/nickel_ore_smelting.json | 4 +- .../basemetals/recipe/nickel_pickaxe.json | 8 +- .../recipe/nickel_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/nickel_plate.json | 4 +- .../recipe/nickel_plate_recycling.json | 4 +- .../recipe/nickel_powder_from_small.json | 4 +- .../recipe/nickel_powder_smelting.json | 4 +- .../recipe/nickel_pressure_plate.json | 4 +- .../nickel_pressure_plate_recycling.json | 4 +- .../recipe/nickel_raw_blasting.json | 4 +- .../recipe/nickel_raw_crushing.json | 4 +- .../recipe/nickel_raw_smelting.json | 4 +- .../data/basemetals/recipe/nickel_rod.json | 4 +- .../recipe/nickel_rod_recycling.json | 4 +- .../data/basemetals/recipe/nickel_scythe.json | 8 +- .../data/basemetals/recipe/nickel_shears.json | 4 +- .../recipe/nickel_shears_recycling.json | 4 +- .../data/basemetals/recipe/nickel_shield.json | 8 +- .../recipe/nickel_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/nickel_shovel.json | 8 +- .../recipe/nickel_shovel_recycling.json | 4 +- .../data/basemetals/recipe/nickel_slab.json | 4 +- .../recipe/nickel_slab_recycling.json | 4 +- .../basemetals/recipe/nickel_smallpowder.json | 4 +- .../recipe/nickel_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/nickel_stairs.json | 4 +- .../data/basemetals/recipe/nickel_sword.json | 8 +- .../recipe/nickel_sword_recycling.json | 4 +- .../basemetals/recipe/nickel_trapdoor.json | 4 +- .../recipe/nickel_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/nickel_wall.json | 4 +- .../recipe/nickel_wall_recycling.json | 4 +- .../basemetals/recipe/obsidian_arrow.json | 12 +- .../recipe/obsidian_arrow_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_axe.json | 8 +- .../recipe/obsidian_axe_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_bars.json | 4 +- .../basemetals/recipe/obsidian_bars_2.json | 4 +- .../recipe/obsidian_bars_recycling.json | 4 +- .../basemetals/recipe/obsidian_block.json | 4 +- .../data/basemetals/recipe/obsidian_bolt.json | 8 +- .../recipe/obsidian_bolt_recycling.json | 4 +- .../basemetals/recipe/obsidian_boots.json | 4 +- .../recipe/obsidian_boots_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_bow.json | 8 +- .../recipe/obsidian_bow_recycling.json | 4 +- .../basemetals/recipe/obsidian_button.json | 4 +- .../recipe/obsidian_button_recycling.json | 4 +- .../recipe/obsidian_chestplate.json | 4 +- .../recipe/obsidian_chestplate_recycling.json | 4 +- .../recipe/obsidian_crackhammer.json | 8 +- .../obsidian_crackhammer_recycling.json | 4 +- .../basemetals/recipe/obsidian_crossbow.json | 12 +- .../recipe/obsidian_crossbow_recycling.json | 4 +- .../basemetals/recipe/obsidian_crushing.json | 4 +- .../data/basemetals/recipe/obsidian_door.json | 4 +- .../recipe/obsidian_door_recycling.json | 4 +- .../recipe/obsidian_fishingrod.json | 8 +- .../data/basemetals/recipe/obsidian_gear.json | 8 +- .../recipe/obsidian_gear_recycling.json | 4 +- .../basemetals/recipe/obsidian_helmet.json | 4 +- .../recipe/obsidian_helmet_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_hoe.json | 8 +- .../recipe/obsidian_hoe_recycling.json | 4 +- .../recipe/obsidian_horsearmor.json | 8 +- .../basemetals/recipe/obsidian_ingot.json | 4 +- .../recipe/obsidian_ingot_crushing.json | 4 +- .../basemetals/recipe/obsidian_leggings.json | 4 +- .../recipe/obsidian_leggings_recycling.json | 4 +- .../basemetals/recipe/obsidian_lever.json | 8 +- .../recipe/obsidian_lever_recycling.json | 4 +- .../basemetals/recipe/obsidian_nugget.json | 4 +- .../recipe/obsidian_nugget_crushing.json | 4 +- .../basemetals/recipe/obsidian_pickaxe.json | 8 +- .../recipe/obsidian_pickaxe_recycling.json | 4 +- .../recipe/obsidian_powder_from_small.json | 4 +- .../recipe/obsidian_powder_smelting.json | 4 +- .../recipe/obsidian_pressure_plate.json | 4 +- .../obsidian_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_rod.json | 4 +- .../recipe/obsidian_rod_recycling.json | 4 +- .../basemetals/recipe/obsidian_scythe.json | 8 +- .../basemetals/recipe/obsidian_shears.json | 4 +- .../recipe/obsidian_shears_recycling.json | 4 +- .../basemetals/recipe/obsidian_shield.json | 8 +- .../basemetals/recipe/obsidian_shovel.json | 8 +- .../recipe/obsidian_shovel_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_slab.json | 4 +- .../recipe/obsidian_slab_recycling.json | 4 +- .../recipe/obsidian_smallpowder.json | 4 +- .../recipe/obsidian_smallpowder_smelting.json | 4 +- .../basemetals/recipe/obsidian_stairs.json | 4 +- .../basemetals/recipe/obsidian_sword.json | 8 +- .../recipe/obsidian_sword_recycling.json | 4 +- .../basemetals/recipe/obsidian_trapdoor.json | 4 +- .../recipe/obsidian_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/obsidian_wall.json | 4 +- .../recipe/obsidian_wall_recycling.json | 4 +- .../data/basemetals/recipe/pewter_arrow.json | 12 +- .../recipe/pewter_arrow_recycling.json | 4 +- .../data/basemetals/recipe/pewter_axe.json | 8 +- .../recipe/pewter_axe_recycling.json | 4 +- .../data/basemetals/recipe/pewter_bars.json | 4 +- .../data/basemetals/recipe/pewter_bars_2.json | 4 +- .../recipe/pewter_bars_recycling.json | 4 +- .../data/basemetals/recipe/pewter_blend.json | 12 +- .../recipe/pewter_blend_from_small.json | 4 +- .../recipe/pewter_blend_smelting.json | 4 +- .../data/basemetals/recipe/pewter_block.json | 4 +- .../recipe/pewter_block_crushing.json | 4 +- .../basemetals/recipe/pewter_block_ingot.json | 4 +- .../data/basemetals/recipe/pewter_bolt.json | 8 +- .../recipe/pewter_bolt_recycling.json | 4 +- .../data/basemetals/recipe/pewter_boots.json | 4 +- .../recipe/pewter_boots_plate_repair.json | 4 +- .../recipe/pewter_boots_recycling.json | 4 +- .../data/basemetals/recipe/pewter_bow.json | 8 +- .../recipe/pewter_bow_recycling.json | 4 +- .../data/basemetals/recipe/pewter_button.json | 4 +- .../recipe/pewter_button_recycling.json | 4 +- .../basemetals/recipe/pewter_chestplate.json | 4 +- .../pewter_chestplate_plate_repair.json | 4 +- .../recipe/pewter_chestplate_recycling.json | 4 +- .../basemetals/recipe/pewter_crackhammer.json | 8 +- .../recipe/pewter_crackhammer_recycling.json | 4 +- .../basemetals/recipe/pewter_crossbow.json | 12 +- .../recipe/pewter_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/pewter_door.json | 4 +- .../recipe/pewter_door_recycling.json | 4 +- .../basemetals/recipe/pewter_fishingrod.json | 8 +- .../data/basemetals/recipe/pewter_gear.json | 8 +- .../recipe/pewter_gear_recycling.json | 4 +- .../data/basemetals/recipe/pewter_helmet.json | 4 +- .../recipe/pewter_helmet_plate_repair.json | 4 +- .../recipe/pewter_helmet_recycling.json | 4 +- .../data/basemetals/recipe/pewter_hoe.json | 8 +- .../recipe/pewter_hoe_recycling.json | 4 +- .../basemetals/recipe/pewter_horsearmor.json | 8 +- .../recipe/pewter_ingot_crushing.json | 4 +- .../recipe/pewter_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/pewter_leggings.json | 4 +- .../recipe/pewter_leggings_plate_repair.json | 4 +- .../recipe/pewter_leggings_recycling.json | 4 +- .../data/basemetals/recipe/pewter_lever.json | 8 +- .../recipe/pewter_lever_recycling.json | 4 +- .../recipe/pewter_nugget_crushing.json | 4 +- .../basemetals/recipe/pewter_nuggets.json | 4 +- .../basemetals/recipe/pewter_pickaxe.json | 8 +- .../recipe/pewter_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/pewter_plate.json | 4 +- .../recipe/pewter_plate_recycling.json | 4 +- .../recipe/pewter_powder_from_small.json | 4 +- .../recipe/pewter_powder_smelting.json | 4 +- .../recipe/pewter_pressure_plate.json | 4 +- .../pewter_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/pewter_rod.json | 4 +- .../recipe/pewter_rod_recycling.json | 4 +- .../data/basemetals/recipe/pewter_scythe.json | 8 +- .../data/basemetals/recipe/pewter_shears.json | 4 +- .../recipe/pewter_shears_recycling.json | 4 +- .../data/basemetals/recipe/pewter_shield.json | 8 +- .../recipe/pewter_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/pewter_shovel.json | 8 +- .../recipe/pewter_shovel_recycling.json | 4 +- .../data/basemetals/recipe/pewter_slab.json | 4 +- .../recipe/pewter_slab_recycling.json | 4 +- .../basemetals/recipe/pewter_smallblend.json | 4 +- .../recipe/pewter_smallblend_smelting.json | 4 +- .../basemetals/recipe/pewter_smallpowder.json | 4 +- .../recipe/pewter_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/pewter_stairs.json | 4 +- .../data/basemetals/recipe/pewter_sword.json | 8 +- .../recipe/pewter_sword_recycling.json | 4 +- .../basemetals/recipe/pewter_trapdoor.json | 4 +- .../recipe/pewter_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/pewter_wall.json | 4 +- .../recipe/pewter_wall_recycling.json | 4 +- .../data/basemetals/recipe/piston.json | 16 +- .../basemetals/recipe/platinum_arrow.json | 12 +- .../recipe/platinum_arrow_recycling.json | 4 +- .../data/basemetals/recipe/platinum_axe.json | 8 +- .../recipe/platinum_axe_recycling.json | 4 +- .../data/basemetals/recipe/platinum_bars.json | 4 +- .../basemetals/recipe/platinum_bars_2.json | 4 +- .../recipe/platinum_bars_recycling.json | 4 +- .../basemetals/recipe/platinum_block.json | 4 +- .../recipe/platinum_block_crushing.json | 4 +- .../recipe/platinum_block_ingot.json | 4 +- .../data/basemetals/recipe/platinum_bolt.json | 8 +- .../recipe/platinum_bolt_recycling.json | 4 +- .../basemetals/recipe/platinum_boots.json | 4 +- .../recipe/platinum_boots_plate_repair.json | 4 +- .../recipe/platinum_boots_recycling.json | 4 +- .../data/basemetals/recipe/platinum_bow.json | 8 +- .../recipe/platinum_bow_recycling.json | 4 +- .../basemetals/recipe/platinum_button.json | 4 +- .../recipe/platinum_button_recycling.json | 4 +- .../recipe/platinum_chestplate.json | 4 +- .../platinum_chestplate_plate_repair.json | 4 +- .../recipe/platinum_chestplate_recycling.json | 4 +- .../recipe/platinum_crackhammer.json | 8 +- .../platinum_crackhammer_recycling.json | 4 +- .../basemetals/recipe/platinum_crossbow.json | 12 +- .../recipe/platinum_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/platinum_door.json | 4 +- .../recipe/platinum_door_recycling.json | 4 +- .../recipe/platinum_fishingrod.json | 8 +- .../data/basemetals/recipe/platinum_gear.json | 8 +- .../recipe/platinum_gear_recycling.json | 4 +- .../basemetals/recipe/platinum_helmet.json | 4 +- .../recipe/platinum_helmet_plate_repair.json | 4 +- .../recipe/platinum_helmet_recycling.json | 4 +- .../data/basemetals/recipe/platinum_hoe.json | 8 +- .../recipe/platinum_hoe_recycling.json | 4 +- .../recipe/platinum_horsearmor.json | 8 +- .../recipe/platinum_ingot_crushing.json | 4 +- .../recipe/platinum_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/platinum_leggings.json | 4 +- .../platinum_leggings_plate_repair.json | 4 +- .../recipe/platinum_leggings_recycling.json | 4 +- .../basemetals/recipe/platinum_lever.json | 8 +- .../recipe/platinum_lever_recycling.json | 4 +- .../recipe/platinum_nugget_crushing.json | 4 +- .../basemetals/recipe/platinum_nuggets.json | 4 +- .../recipe/platinum_ore_blasting.json | 4 +- .../recipe/platinum_ore_crushing.json | 4 +- .../recipe/platinum_ore_smelting.json | 4 +- .../basemetals/recipe/platinum_pickaxe.json | 8 +- .../recipe/platinum_pickaxe_recycling.json | 4 +- .../basemetals/recipe/platinum_plate.json | 4 +- .../recipe/platinum_plate_recycling.json | 4 +- .../recipe/platinum_powder_from_small.json | 4 +- .../recipe/platinum_powder_smelting.json | 4 +- .../recipe/platinum_pressure_plate.json | 4 +- .../platinum_pressure_plate_recycling.json | 4 +- .../recipe/platinum_raw_blasting.json | 4 +- .../recipe/platinum_raw_crushing.json | 4 +- .../recipe/platinum_raw_smelting.json | 4 +- .../data/basemetals/recipe/platinum_rod.json | 4 +- .../recipe/platinum_rod_recycling.json | 4 +- .../basemetals/recipe/platinum_scythe.json | 8 +- .../basemetals/recipe/platinum_shears.json | 4 +- .../recipe/platinum_shears_recycling.json | 4 +- .../basemetals/recipe/platinum_shield.json | 8 +- .../recipe/platinum_shield_plate_repair.json | 4 +- .../basemetals/recipe/platinum_shovel.json | 8 +- .../recipe/platinum_shovel_recycling.json | 4 +- .../data/basemetals/recipe/platinum_slab.json | 4 +- .../recipe/platinum_slab_recycling.json | 4 +- .../recipe/platinum_smallpowder.json | 4 +- .../recipe/platinum_smallpowder_smelting.json | 4 +- .../basemetals/recipe/platinum_stairs.json | 4 +- .../basemetals/recipe/platinum_sword.json | 8 +- .../recipe/platinum_sword_recycling.json | 4 +- .../basemetals/recipe/platinum_trapdoor.json | 4 +- .../recipe/platinum_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/platinum_wall.json | 4 +- .../recipe/platinum_wall_recycling.json | 4 +- .../recipe/prismarine_bricks_crushing.json | 4 +- .../recipe/prismarine_crushing.json | 4 +- .../data/basemetals/recipe/quartz_arrow.json | 12 +- .../recipe/quartz_arrow_recycling.json | 4 +- .../data/basemetals/recipe/quartz_axe.json | 8 +- .../recipe/quartz_axe_recycling.json | 4 +- .../data/basemetals/recipe/quartz_bars.json | 4 +- .../data/basemetals/recipe/quartz_bars_2.json | 4 +- .../recipe/quartz_bars_recycling.json | 4 +- .../recipe/quartz_block_crushing.json | 4 +- .../data/basemetals/recipe/quartz_bolt.json | 8 +- .../recipe/quartz_bolt_recycling.json | 4 +- .../data/basemetals/recipe/quartz_boots.json | 4 +- .../recipe/quartz_boots_recycling.json | 4 +- .../data/basemetals/recipe/quartz_bow.json | 8 +- .../recipe/quartz_bow_recycling.json | 4 +- .../data/basemetals/recipe/quartz_button.json | 4 +- .../recipe/quartz_button_recycling.json | 4 +- .../basemetals/recipe/quartz_chestplate.json | 4 +- .../recipe/quartz_chestplate_recycling.json | 4 +- .../basemetals/recipe/quartz_crackhammer.json | 8 +- .../recipe/quartz_crackhammer_recycling.json | 4 +- .../basemetals/recipe/quartz_crossbow.json | 12 +- .../recipe/quartz_crossbow_recycling.json | 4 +- .../basemetals/recipe/quartz_crushing.json | 4 +- .../data/basemetals/recipe/quartz_door.json | 4 +- .../recipe/quartz_door_recycling.json | 4 +- .../basemetals/recipe/quartz_fishingrod.json | 8 +- .../data/basemetals/recipe/quartz_gear.json | 8 +- .../recipe/quartz_gear_recycling.json | 4 +- .../data/basemetals/recipe/quartz_helmet.json | 4 +- .../recipe/quartz_helmet_recycling.json | 4 +- .../data/basemetals/recipe/quartz_hoe.json | 8 +- .../recipe/quartz_hoe_recycling.json | 4 +- .../basemetals/recipe/quartz_horsearmor.json | 8 +- .../data/basemetals/recipe/quartz_ingot.json | 4 +- .../basemetals/recipe/quartz_leggings.json | 4 +- .../recipe/quartz_leggings_recycling.json | 4 +- .../data/basemetals/recipe/quartz_lever.json | 8 +- .../recipe/quartz_lever_recycling.json | 4 +- .../data/basemetals/recipe/quartz_nugget.json | 4 +- .../recipe/quartz_nugget_crushing.json | 4 +- .../recipe/quartz_ore_crushing.json | 4 +- .../basemetals/recipe/quartz_pickaxe.json | 8 +- .../recipe/quartz_pickaxe_recycling.json | 4 +- .../recipe/quartz_powder_from_small.json | 4 +- .../recipe/quartz_powder_smelting.json | 4 +- .../recipe/quartz_pressure_plate.json | 4 +- .../quartz_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/quartz_rod.json | 4 +- .../recipe/quartz_rod_recycling.json | 4 +- .../data/basemetals/recipe/quartz_scythe.json | 8 +- .../data/basemetals/recipe/quartz_shears.json | 4 +- .../recipe/quartz_shears_recycling.json | 4 +- .../data/basemetals/recipe/quartz_shield.json | 8 +- .../data/basemetals/recipe/quartz_shovel.json | 8 +- .../recipe/quartz_shovel_recycling.json | 4 +- .../recipe/quartz_slab_crushing.json | 4 +- .../basemetals/recipe/quartz_smallpowder.json | 4 +- .../recipe/quartz_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/quartz_sword.json | 8 +- .../recipe/quartz_sword_recycling.json | 4 +- .../basemetals/recipe/quartz_trapdoor.json | 4 +- .../recipe/quartz_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/quartz_wall.json | 4 +- .../recipe/quartz_wall_recycling.json | 4 +- .../data/basemetals/recipe/rail.json | 8 +- .../recipe/red_sandstone_crushing.json | 4 +- .../recipe/red_sandstone_slab_crushing.json | 4 +- .../recipe/redstone_block_crushing.json | 4 +- .../recipe/redstone_from_smallpowder.json | 4 +- .../recipe/redstone_ore_crushing.json | 4 +- .../recipe/redstone_smallpowder.json | 4 +- .../basemetals/recipe/sandstone_crushing.json | 4 +- .../recipe/sandstone_slab_crushing.json | 4 +- .../recipe/sea_lantern_crushing.json | 4 +- .../data/basemetals/recipe/silver_arrow.json | 12 +- .../recipe/silver_arrow_recycling.json | 4 +- .../data/basemetals/recipe/silver_axe.json | 8 +- .../recipe/silver_axe_recycling.json | 4 +- .../data/basemetals/recipe/silver_bars.json | 4 +- .../data/basemetals/recipe/silver_bars_2.json | 4 +- .../recipe/silver_bars_recycling.json | 4 +- .../data/basemetals/recipe/silver_block.json | 4 +- .../recipe/silver_block_crushing.json | 4 +- .../basemetals/recipe/silver_block_ingot.json | 4 +- .../data/basemetals/recipe/silver_bolt.json | 8 +- .../recipe/silver_bolt_recycling.json | 4 +- .../data/basemetals/recipe/silver_boots.json | 4 +- .../recipe/silver_boots_plate_repair.json | 4 +- .../recipe/silver_boots_recycling.json | 4 +- .../data/basemetals/recipe/silver_bow.json | 8 +- .../recipe/silver_bow_recycling.json | 4 +- .../data/basemetals/recipe/silver_button.json | 4 +- .../recipe/silver_button_recycling.json | 4 +- .../basemetals/recipe/silver_chestplate.json | 4 +- .../silver_chestplate_plate_repair.json | 4 +- .../recipe/silver_chestplate_recycling.json | 4 +- .../basemetals/recipe/silver_crackhammer.json | 8 +- .../recipe/silver_crackhammer_recycling.json | 4 +- .../basemetals/recipe/silver_crossbow.json | 12 +- .../recipe/silver_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/silver_door.json | 4 +- .../recipe/silver_door_recycling.json | 4 +- .../basemetals/recipe/silver_fishingrod.json | 8 +- .../data/basemetals/recipe/silver_gear.json | 8 +- .../recipe/silver_gear_recycling.json | 4 +- .../data/basemetals/recipe/silver_helmet.json | 4 +- .../recipe/silver_helmet_plate_repair.json | 4 +- .../recipe/silver_helmet_recycling.json | 4 +- .../data/basemetals/recipe/silver_hoe.json | 8 +- .../recipe/silver_hoe_recycling.json | 4 +- .../basemetals/recipe/silver_horsearmor.json | 8 +- .../recipe/silver_ingot_crushing.json | 4 +- .../recipe/silver_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/silver_leggings.json | 4 +- .../recipe/silver_leggings_plate_repair.json | 4 +- .../recipe/silver_leggings_recycling.json | 4 +- .../data/basemetals/recipe/silver_lever.json | 8 +- .../recipe/silver_lever_recycling.json | 4 +- .../recipe/silver_nugget_crushing.json | 4 +- .../basemetals/recipe/silver_nuggets.json | 4 +- .../recipe/silver_ore_blasting.json | 4 +- .../recipe/silver_ore_crushing.json | 4 +- .../recipe/silver_ore_smelting.json | 4 +- .../basemetals/recipe/silver_pickaxe.json | 8 +- .../recipe/silver_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/silver_plate.json | 4 +- .../recipe/silver_plate_recycling.json | 4 +- .../recipe/silver_powder_from_small.json | 4 +- .../recipe/silver_powder_smelting.json | 4 +- .../recipe/silver_pressure_plate.json | 4 +- .../silver_pressure_plate_recycling.json | 4 +- .../recipe/silver_raw_blasting.json | 4 +- .../recipe/silver_raw_crushing.json | 4 +- .../recipe/silver_raw_smelting.json | 4 +- .../data/basemetals/recipe/silver_rod.json | 4 +- .../recipe/silver_rod_recycling.json | 4 +- .../data/basemetals/recipe/silver_scythe.json | 8 +- .../data/basemetals/recipe/silver_shears.json | 4 +- .../recipe/silver_shears_recycling.json | 4 +- .../data/basemetals/recipe/silver_shield.json | 8 +- .../recipe/silver_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/silver_shovel.json | 8 +- .../recipe/silver_shovel_recycling.json | 4 +- .../data/basemetals/recipe/silver_slab.json | 4 +- .../recipe/silver_slab_recycling.json | 4 +- .../basemetals/recipe/silver_smallpowder.json | 4 +- .../recipe/silver_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/silver_stairs.json | 4 +- .../data/basemetals/recipe/silver_sword.json | 8 +- .../recipe/silver_sword_recycling.json | 4 +- .../basemetals/recipe/silver_trapdoor.json | 4 +- .../recipe/silver_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/silver_wall.json | 4 +- .../recipe/silver_wall_recycling.json | 4 +- .../recipe/slime_block_crushing.json | 4 +- .../basemetals/recipe/starsteel_arrow.json | 12 +- .../recipe/starsteel_arrow_recycling.json | 4 +- .../data/basemetals/recipe/starsteel_axe.json | 8 +- .../recipe/starsteel_axe_recycling.json | 4 +- .../basemetals/recipe/starsteel_bars.json | 4 +- .../basemetals/recipe/starsteel_bars_2.json | 4 +- .../recipe/starsteel_bars_recycling.json | 4 +- .../basemetals/recipe/starsteel_block.json | 4 +- .../recipe/starsteel_block_crushing.json | 4 +- .../recipe/starsteel_block_ingot.json | 4 +- .../basemetals/recipe/starsteel_bolt.json | 8 +- .../recipe/starsteel_bolt_recycling.json | 4 +- .../basemetals/recipe/starsteel_boots.json | 4 +- .../recipe/starsteel_boots_plate_repair.json | 4 +- .../recipe/starsteel_boots_recycling.json | 4 +- .../data/basemetals/recipe/starsteel_bow.json | 8 +- .../recipe/starsteel_bow_recycling.json | 4 +- .../basemetals/recipe/starsteel_button.json | 4 +- .../recipe/starsteel_button_recycling.json | 4 +- .../recipe/starsteel_chestplate.json | 4 +- .../starsteel_chestplate_plate_repair.json | 4 +- .../starsteel_chestplate_recycling.json | 4 +- .../recipe/starsteel_crackhammer.json | 8 +- .../starsteel_crackhammer_recycling.json | 4 +- .../basemetals/recipe/starsteel_crossbow.json | 12 +- .../recipe/starsteel_crossbow_recycling.json | 4 +- .../basemetals/recipe/starsteel_door.json | 4 +- .../recipe/starsteel_door_recycling.json | 4 +- .../recipe/starsteel_fishingrod.json | 8 +- .../basemetals/recipe/starsteel_gear.json | 8 +- .../recipe/starsteel_gear_recycling.json | 4 +- .../basemetals/recipe/starsteel_helmet.json | 4 +- .../recipe/starsteel_helmet_plate_repair.json | 4 +- .../recipe/starsteel_helmet_recycling.json | 4 +- .../data/basemetals/recipe/starsteel_hoe.json | 8 +- .../recipe/starsteel_hoe_recycling.json | 4 +- .../recipe/starsteel_horsearmor.json | 8 +- .../recipe/starsteel_ingot_crushing.json | 4 +- .../recipe/starsteel_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/starsteel_leggings.json | 4 +- .../starsteel_leggings_plate_repair.json | 4 +- .../recipe/starsteel_leggings_recycling.json | 4 +- .../basemetals/recipe/starsteel_lever.json | 8 +- .../recipe/starsteel_lever_recycling.json | 4 +- .../recipe/starsteel_nugget_crushing.json | 4 +- .../basemetals/recipe/starsteel_nuggets.json | 4 +- .../recipe/starsteel_ore_blasting.json | 4 +- .../recipe/starsteel_ore_crushing.json | 4 +- .../recipe/starsteel_ore_smelting.json | 4 +- .../basemetals/recipe/starsteel_pickaxe.json | 8 +- .../recipe/starsteel_pickaxe_recycling.json | 4 +- .../basemetals/recipe/starsteel_plate.json | 4 +- .../recipe/starsteel_plate_recycling.json | 4 +- .../recipe/starsteel_powder_from_small.json | 4 +- .../recipe/starsteel_powder_smelting.json | 4 +- .../recipe/starsteel_pressure_plate.json | 4 +- .../starsteel_pressure_plate_recycling.json | 4 +- .../recipe/starsteel_raw_blasting.json | 4 +- .../recipe/starsteel_raw_crushing.json | 4 +- .../recipe/starsteel_raw_smelting.json | 4 +- .../data/basemetals/recipe/starsteel_rod.json | 4 +- .../recipe/starsteel_rod_recycling.json | 4 +- .../basemetals/recipe/starsteel_scythe.json | 8 +- .../basemetals/recipe/starsteel_shears.json | 4 +- .../recipe/starsteel_shears_recycling.json | 4 +- .../basemetals/recipe/starsteel_shield.json | 8 +- .../recipe/starsteel_shield_plate_repair.json | 4 +- .../basemetals/recipe/starsteel_shovel.json | 8 +- .../recipe/starsteel_shovel_recycling.json | 4 +- .../basemetals/recipe/starsteel_slab.json | 4 +- .../recipe/starsteel_slab_recycling.json | 4 +- .../recipe/starsteel_smallpowder.json | 4 +- .../starsteel_smallpowder_smelting.json | 4 +- .../basemetals/recipe/starsteel_stairs.json | 4 +- .../basemetals/recipe/starsteel_sword.json | 8 +- .../recipe/starsteel_sword_recycling.json | 4 +- .../basemetals/recipe/starsteel_trapdoor.json | 4 +- .../recipe/starsteel_trapdoor_recycling.json | 4 +- .../basemetals/recipe/starsteel_wall.json | 4 +- .../recipe/starsteel_wall_recycling.json | 4 +- .../data/basemetals/recipe/steel_anvil.json | 8 +- .../data/basemetals/recipe/steel_arrow.json | 12 +- .../recipe/steel_arrow_recycling.json | 4 +- .../data/basemetals/recipe/steel_axe.json | 8 +- .../recipe/steel_axe_recycling.json | 4 +- .../data/basemetals/recipe/steel_bars.json | 4 +- .../data/basemetals/recipe/steel_bars_2.json | 4 +- .../recipe/steel_bars_recycling.json | 4 +- .../data/basemetals/recipe/steel_blend.json | 36 +- .../recipe/steel_blend_from_small.json | 4 +- .../recipe/steel_blend_smelting.json | 4 +- .../data/basemetals/recipe/steel_block.json | 4 +- .../recipe/steel_block_crushing.json | 4 +- .../basemetals/recipe/steel_block_ingot.json | 4 +- .../data/basemetals/recipe/steel_bolt.json | 8 +- .../recipe/steel_bolt_recycling.json | 4 +- .../data/basemetals/recipe/steel_boots.json | 4 +- .../recipe/steel_boots_plate_repair.json | 4 +- .../recipe/steel_boots_recycling.json | 4 +- .../data/basemetals/recipe/steel_bow.json | 8 +- .../recipe/steel_bow_recycling.json | 4 +- .../data/basemetals/recipe/steel_button.json | 4 +- .../recipe/steel_button_recycling.json | 4 +- .../basemetals/recipe/steel_chestplate.json | 4 +- .../recipe/steel_chestplate_plate_repair.json | 4 +- .../recipe/steel_chestplate_recycling.json | 4 +- .../basemetals/recipe/steel_crackhammer.json | 8 +- .../recipe/steel_crackhammer_recycling.json | 4 +- .../basemetals/recipe/steel_crossbow.json | 12 +- .../recipe/steel_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/steel_door.json | 4 +- .../recipe/steel_door_recycling.json | 4 +- .../basemetals/recipe/steel_fishingrod.json | 8 +- .../data/basemetals/recipe/steel_gear.json | 8 +- .../recipe/steel_gear_recycling.json | 4 +- .../data/basemetals/recipe/steel_helmet.json | 4 +- .../recipe/steel_helmet_plate_repair.json | 4 +- .../recipe/steel_helmet_recycling.json | 4 +- .../data/basemetals/recipe/steel_hoe.json | 8 +- .../recipe/steel_hoe_recycling.json | 4 +- .../basemetals/recipe/steel_horsearmor.json | 8 +- .../recipe/steel_ingot_crushing.json | 4 +- .../recipe/steel_ingot_from_nuggets.json | 4 +- .../basemetals/recipe/steel_leggings.json | 4 +- .../recipe/steel_leggings_plate_repair.json | 4 +- .../recipe/steel_leggings_recycling.json | 4 +- .../data/basemetals/recipe/steel_lever.json | 8 +- .../recipe/steel_lever_recycling.json | 4 +- .../recipe/steel_nugget_crushing.json | 4 +- .../data/basemetals/recipe/steel_nuggets.json | 4 +- .../data/basemetals/recipe/steel_pickaxe.json | 8 +- .../recipe/steel_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/steel_plate.json | 4 +- .../recipe/steel_plate_recycling.json | 4 +- .../recipe/steel_powder_from_small.json | 4 +- .../recipe/steel_powder_smelting.json | 4 +- .../recipe/steel_pressure_plate.json | 4 +- .../steel_pressure_plate_recycling.json | 4 +- .../data/basemetals/recipe/steel_rod.json | 4 +- .../recipe/steel_rod_recycling.json | 4 +- .../data/basemetals/recipe/steel_scythe.json | 8 +- .../data/basemetals/recipe/steel_shears.json | 4 +- .../recipe/steel_shears_recycling.json | 4 +- .../data/basemetals/recipe/steel_shield.json | 8 +- .../recipe/steel_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/steel_shovel.json | 8 +- .../recipe/steel_shovel_recycling.json | 4 +- .../data/basemetals/recipe/steel_slab.json | 4 +- .../recipe/steel_slab_recycling.json | 4 +- .../basemetals/recipe/steel_smallblend.json | 4 +- .../recipe/steel_smallblend_smelting.json | 4 +- .../basemetals/recipe/steel_smallpowder.json | 4 +- .../recipe/steel_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/steel_stairs.json | 4 +- .../data/basemetals/recipe/steel_sword.json | 8 +- .../recipe/steel_sword_recycling.json | 4 +- .../basemetals/recipe/steel_trapdoor.json | 4 +- .../recipe/steel_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/steel_wall.json | 4 +- .../recipe/steel_wall_recycling.json | 4 +- .../data/basemetals/recipe/stone_anvil.json | 12 +- .../recipe/stone_brick_slab_crushing.json | 4 +- .../recipe/stone_bricks_crushing.json | 4 +- .../basemetals/recipe/stone_crackhammer.json | 8 +- .../basemetals/recipe/stone_crushing.json | 4 +- .../data/basemetals/recipe/stone_scythe.json | 8 +- .../recipe/stone_slab_crushing.json | 4 +- .../recipe/sugar_cane_crushing.json | 4 +- .../data/basemetals/recipe/tin_arrow.json | 12 +- .../recipe/tin_arrow_recycling.json | 4 +- .../data/basemetals/recipe/tin_axe.json | 8 +- .../basemetals/recipe/tin_axe_recycling.json | 4 +- .../data/basemetals/recipe/tin_bars.json | 4 +- .../data/basemetals/recipe/tin_bars_2.json | 4 +- .../basemetals/recipe/tin_bars_recycling.json | 4 +- .../data/basemetals/recipe/tin_block.json | 4 +- .../basemetals/recipe/tin_block_crushing.json | 4 +- .../basemetals/recipe/tin_block_ingot.json | 4 +- .../data/basemetals/recipe/tin_bolt.json | 8 +- .../basemetals/recipe/tin_bolt_recycling.json | 4 +- .../data/basemetals/recipe/tin_boots.json | 4 +- .../recipe/tin_boots_plate_repair.json | 4 +- .../recipe/tin_boots_recycling.json | 4 +- .../data/basemetals/recipe/tin_bow.json | 8 +- .../basemetals/recipe/tin_bow_recycling.json | 4 +- .../data/basemetals/recipe/tin_button.json | 4 +- .../recipe/tin_button_recycling.json | 4 +- .../basemetals/recipe/tin_chestplate.json | 4 +- .../recipe/tin_chestplate_plate_repair.json | 4 +- .../recipe/tin_chestplate_recycling.json | 4 +- .../basemetals/recipe/tin_crackhammer.json | 8 +- .../recipe/tin_crackhammer_recycling.json | 4 +- .../data/basemetals/recipe/tin_crossbow.json | 12 +- .../recipe/tin_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/tin_door.json | 4 +- .../basemetals/recipe/tin_door_recycling.json | 4 +- .../basemetals/recipe/tin_fishingrod.json | 8 +- .../data/basemetals/recipe/tin_gear.json | 8 +- .../basemetals/recipe/tin_gear_recycling.json | 4 +- .../data/basemetals/recipe/tin_helmet.json | 4 +- .../recipe/tin_helmet_plate_repair.json | 4 +- .../recipe/tin_helmet_recycling.json | 4 +- .../data/basemetals/recipe/tin_hoe.json | 8 +- .../basemetals/recipe/tin_hoe_recycling.json | 4 +- .../basemetals/recipe/tin_horsearmor.json | 8 +- .../basemetals/recipe/tin_ingot_crushing.json | 4 +- .../recipe/tin_ingot_from_nuggets.json | 4 +- .../data/basemetals/recipe/tin_leggings.json | 4 +- .../recipe/tin_leggings_plate_repair.json | 4 +- .../recipe/tin_leggings_recycling.json | 4 +- .../data/basemetals/recipe/tin_lever.json | 8 +- .../recipe/tin_lever_recycling.json | 4 +- .../recipe/tin_nugget_crushing.json | 4 +- .../data/basemetals/recipe/tin_nuggets.json | 4 +- .../basemetals/recipe/tin_ore_blasting.json | 4 +- .../basemetals/recipe/tin_ore_crushing.json | 4 +- .../basemetals/recipe/tin_ore_smelting.json | 4 +- .../data/basemetals/recipe/tin_pickaxe.json | 8 +- .../recipe/tin_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/tin_plate.json | 4 +- .../recipe/tin_plate_recycling.json | 4 +- .../recipe/tin_powder_from_small.json | 4 +- .../recipe/tin_powder_smelting.json | 4 +- .../basemetals/recipe/tin_pressure_plate.json | 4 +- .../recipe/tin_pressure_plate_recycling.json | 4 +- .../basemetals/recipe/tin_raw_blasting.json | 4 +- .../basemetals/recipe/tin_raw_crushing.json | 4 +- .../basemetals/recipe/tin_raw_smelting.json | 4 +- .../data/basemetals/recipe/tin_rod.json | 4 +- .../basemetals/recipe/tin_rod_recycling.json | 4 +- .../data/basemetals/recipe/tin_scythe.json | 8 +- .../data/basemetals/recipe/tin_shears.json | 4 +- .../recipe/tin_shears_recycling.json | 4 +- .../data/basemetals/recipe/tin_shield.json | 8 +- .../recipe/tin_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/tin_shovel.json | 8 +- .../recipe/tin_shovel_recycling.json | 4 +- .../data/basemetals/recipe/tin_slab.json | 4 +- .../basemetals/recipe/tin_slab_recycling.json | 4 +- .../basemetals/recipe/tin_smallpowder.json | 4 +- .../recipe/tin_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/tin_stairs.json | 4 +- .../data/basemetals/recipe/tin_sword.json | 8 +- .../recipe/tin_sword_recycling.json | 4 +- .../data/basemetals/recipe/tin_trapdoor.json | 4 +- .../recipe/tin_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/tin_wall.json | 4 +- .../basemetals/recipe/tin_wall_recycling.json | 4 +- .../data/basemetals/recipe/tripwire_hook.json | 12 +- .../vanilla_copper_trapdoor_recycling.json | 4 +- .../basemetals/recipe/wood_crackhammer.json | 8 +- .../data/basemetals/recipe/wood_scythe.json | 8 +- .../data/basemetals/recipe/zinc_arrow.json | 12 +- .../recipe/zinc_arrow_recycling.json | 4 +- .../data/basemetals/recipe/zinc_axe.json | 8 +- .../basemetals/recipe/zinc_axe_recycling.json | 4 +- .../data/basemetals/recipe/zinc_bars.json | 4 +- .../data/basemetals/recipe/zinc_bars_2.json | 4 +- .../recipe/zinc_bars_recycling.json | 4 +- .../data/basemetals/recipe/zinc_block.json | 4 +- .../recipe/zinc_block_crushing.json | 4 +- .../basemetals/recipe/zinc_block_ingot.json | 4 +- .../data/basemetals/recipe/zinc_bolt.json | 8 +- .../recipe/zinc_bolt_recycling.json | 4 +- .../data/basemetals/recipe/zinc_boots.json | 4 +- .../recipe/zinc_boots_plate_repair.json | 4 +- .../recipe/zinc_boots_recycling.json | 4 +- .../data/basemetals/recipe/zinc_bow.json | 8 +- .../basemetals/recipe/zinc_bow_recycling.json | 4 +- .../data/basemetals/recipe/zinc_button.json | 4 +- .../recipe/zinc_button_recycling.json | 4 +- .../basemetals/recipe/zinc_chestplate.json | 4 +- .../recipe/zinc_chestplate_plate_repair.json | 4 +- .../recipe/zinc_chestplate_recycling.json | 4 +- .../basemetals/recipe/zinc_crackhammer.json | 8 +- .../recipe/zinc_crackhammer_recycling.json | 4 +- .../data/basemetals/recipe/zinc_crossbow.json | 12 +- .../recipe/zinc_crossbow_recycling.json | 4 +- .../data/basemetals/recipe/zinc_door.json | 4 +- .../recipe/zinc_door_recycling.json | 4 +- .../basemetals/recipe/zinc_fishingrod.json | 8 +- .../data/basemetals/recipe/zinc_gear.json | 8 +- .../recipe/zinc_gear_recycling.json | 4 +- .../data/basemetals/recipe/zinc_helmet.json | 4 +- .../recipe/zinc_helmet_plate_repair.json | 4 +- .../recipe/zinc_helmet_recycling.json | 4 +- .../data/basemetals/recipe/zinc_hoe.json | 8 +- .../basemetals/recipe/zinc_hoe_recycling.json | 4 +- .../basemetals/recipe/zinc_horsearmor.json | 8 +- .../recipe/zinc_ingot_crushing.json | 4 +- .../recipe/zinc_ingot_from_nuggets.json | 4 +- .../data/basemetals/recipe/zinc_leggings.json | 4 +- .../recipe/zinc_leggings_plate_repair.json | 4 +- .../recipe/zinc_leggings_recycling.json | 4 +- .../data/basemetals/recipe/zinc_lever.json | 8 +- .../recipe/zinc_lever_recycling.json | 4 +- .../recipe/zinc_nugget_crushing.json | 4 +- .../data/basemetals/recipe/zinc_nuggets.json | 4 +- .../basemetals/recipe/zinc_ore_blasting.json | 4 +- .../basemetals/recipe/zinc_ore_crushing.json | 4 +- .../basemetals/recipe/zinc_ore_smelting.json | 4 +- .../data/basemetals/recipe/zinc_pickaxe.json | 8 +- .../recipe/zinc_pickaxe_recycling.json | 4 +- .../data/basemetals/recipe/zinc_plate.json | 4 +- .../recipe/zinc_plate_recycling.json | 4 +- .../recipe/zinc_powder_from_small.json | 4 +- .../recipe/zinc_powder_smelting.json | 4 +- .../recipe/zinc_pressure_plate.json | 4 +- .../recipe/zinc_pressure_plate_recycling.json | 4 +- .../basemetals/recipe/zinc_raw_blasting.json | 4 +- .../basemetals/recipe/zinc_raw_crushing.json | 4 +- .../basemetals/recipe/zinc_raw_smelting.json | 4 +- .../data/basemetals/recipe/zinc_rod.json | 4 +- .../basemetals/recipe/zinc_rod_recycling.json | 4 +- .../data/basemetals/recipe/zinc_scythe.json | 8 +- .../data/basemetals/recipe/zinc_shears.json | 4 +- .../recipe/zinc_shears_recycling.json | 4 +- .../data/basemetals/recipe/zinc_shield.json | 8 +- .../recipe/zinc_shield_plate_repair.json | 4 +- .../data/basemetals/recipe/zinc_shovel.json | 8 +- .../recipe/zinc_shovel_recycling.json | 4 +- .../data/basemetals/recipe/zinc_slab.json | 4 +- .../recipe/zinc_slab_recycling.json | 4 +- .../basemetals/recipe/zinc_smallpowder.json | 4 +- .../recipe/zinc_smallpowder_smelting.json | 4 +- .../data/basemetals/recipe/zinc_stairs.json | 4 +- .../data/basemetals/recipe/zinc_sword.json | 8 +- .../recipe/zinc_sword_recycling.json | 4 +- .../data/basemetals/recipe/zinc_trapdoor.json | 4 +- .../recipe/zinc_trapdoor_recycling.json | 4 +- .../data/basemetals/recipe/zinc_wall.json | 4 +- .../recipe/zinc_wall_recycling.json | 4 +- .../data/basemetals/registry_manifest.json | 2 +- .../tags/block/crackhammer_crushable.json | 70 ++-- .../data/forge/tags/block/bars/copper.json | 7 + .../data/forge/tags/fluid/molten_invar.json | 4 +- .../data/forge/tags/fluid/molten_lead.json | 4 +- .../data/forge/tags/fluid/molten_mercury.json | 4 +- .../data/forge/tags/fluid/molten_mithril.json | 4 +- .../data/forge/tags/fluid/molten_nickel.json | 4 +- .../data/forge/tags/fluid/molten_pewter.json | 4 +- .../forge/tags/fluid/molten_platinum.json | 4 +- .../data/forge/tags/fluid/molten_silver.json | 4 +- .../forge/tags/fluid/molten_starsteel.json | 4 +- .../data/forge/tags/fluid/molten_steel.json | 4 +- .../data/forge/tags/fluid/molten_tin.json | 4 +- .../data/forge/tags/fluid/molten_zinc.json | 4 +- .../forge/tags/item/armors/boots/copper.json | 7 + .../tags/item/armors/chestplates/copper.json | 7 + .../tags/item/armors/helmets/copper.json | 7 + .../forge/tags/item/armors/horse/copper.json | 7 + .../tags/item/armors/leggings/copper.json | 7 + .../data/forge/tags/item/bars/copper.json | 7 + .../resources/data/forge/tags/item/gears.json | 18 +- .../data/forge/tags/item/nuggets/copper.json | 3 +- .../data/forge/tags/item/plates.json | 10 +- .../data/forge/tags/item/raw_materials.json | 6 +- .../resources/data/forge/tags/item/rods.json | 14 +- .../forge/tags/item/tools/axes/copper.json | 7 + .../forge/tags/item/tools/hoes/copper.json | 7 + .../tags/item/tools/pickaxes/copper.json | 7 + .../forge/tags/item/tools/shovels/copper.json | 7 + .../forge/tags/item/tools/swords/copper.json | 7 + .../tags/block/beacon_base_blocks.json | 4 +- .../tags/block/mineable/pickaxe.json | 394 +++++++++--------- .../data/minecraft/tags/item/arrows.json | 14 +- .../tags/item/copper_tool_materials.json | 6 + .../tags/item/repairs_copper_armor.json | 6 + .../basemetals/smoke/ConfigScreenSmoke.java | 16 +- .../smoke/IntegratedWorldSmoke.java | 140 +++++-- .../zone/moddev/mc/basemetals/BaseMetals.java | 16 +- .../mc/basemetals/BaseMetalsAdvancements.java | 18 +- .../mc/basemetals/BaseMetalsEvents.java | 74 ++-- .../moddev/mc/basemetals/MissingMappings.java | 26 +- .../zone/moddev/mc/basemetals/ModTabs.java | 4 +- .../zone/moddev/mc/basemetals/ModTags.java | 6 +- .../client/BaseMetalsConfigScreen.java | 41 +- .../mc/basemetals/client/ClientSetup.java | 57 +-- .../client/MaterialProjectileRenderer.java | 74 ++-- .../mc/basemetals/compat/VanillaCopper.java | 52 ++- .../basemetals/content/BaseMetalAmmoItem.java | 2 +- .../content/BaseMetalAnvilBlock.java | 31 -- .../content/BaseMetalBucketItem.java | 15 +- .../basemetals/content/CrackhammerItem.java | 21 +- .../mc/basemetals/content/MaterialArmor.java | 48 +-- .../mc/basemetals/content/MaterialBacked.java | 4 +- .../mc/basemetals/content/MaterialItems.java | 154 ++++--- .../mc/basemetals/content/MaterialTier.java | 28 +- .../mc/basemetals/content/MetalFluidType.java | 16 +- .../mc/basemetals/content/ModContent.java | 201 ++++----- .../basemetals/content/MoltenMetalBlock.java | 9 +- .../mc/basemetals/content/PlateBlock.java | 4 +- .../mc/basemetals/content/ScytheItem.java | 14 +- .../basemetals/entity/MaterialProjectile.java | 35 +- .../mc/basemetals/entity/ModEntities.java | 8 +- .../loot/AppendLootTableModifier.java | 13 +- .../moddev/mc/basemetals/loot/ModLoot.java | 4 +- .../migration/Legacy112WorldMigrator.java | 110 ++--- .../migration/LegacyWorldCapabilityCodec.java | 33 ++ .../migration/LegacyWorldDataHook.java | 204 ++++----- .../mc/basemetals/migration/NbtCompat.java | 15 + .../mc/basemetals/mixin/AnvilBlockMixin.java | 22 + .../mc/basemetals/mixin/AnvilMenuMixin.java | 23 + .../basemetals/mixin/BlockStateDataMixin.java | 29 ++ .../mixin/LevelCapabilityDataMixin.java | 22 + .../mixin/LevelStorageSourceMixin.java | 25 ++ .../OreSpawnEarlyTagCompatibilityMixin.java | 37 ++ .../mixin/SimpleRegionStorageMixin.java | 27 ++ .../basemetals/mixin/WorldGenRegionMixin.java | 20 + .../network/ContentModeNetwork.java | 5 +- .../recipe/ContentCraftingRecipe.java | 151 ++++--- .../mc/basemetals/recipe/CrushingRecipe.java | 22 +- .../recipe/LegacySmeltingRecipe.java | 32 +- .../basemetals/recipe/PlateRepairRecipe.java | 26 +- .../mc/basemetals/trade/BaseMetalsTrades.java | 8 +- src/main/resources/META-INF/coremods.json | 3 - src/main/resources/META-INF/mods.toml | 2 +- .../basemetals/models/item/door_item.json | 1 + .../assets/basemetals/models/item/shield.json | 3 +- .../models/item/shield_blocking.json | 3 +- .../assets/minecraft/atlases/blocks.json | 19 + src/main/resources/basemetals.mixins.json | 19 + .../coremods/basemetals_118_compatibility.js | 109 ----- src/main/resources/pack.mcmeta | 4 +- .../smoke/PackagedClientSmokeMod.java | 6 +- .../mc/basemetals/smoke/RemoteLoginSmoke.java | 18 +- .../packaged-resources/META-INF/mods.toml | 4 +- .../basemetals/smoke/PackagedServerSmoke.java | 100 ++++- .../smoke/SavedWorldCapabilitySmoke.java | 68 +++ .../packaged-resources/META-INF/mods.toml | 4 +- src/smoke/datapack/pack.mcmeta | 3 +- .../mc/basemetals/MechanicsContractTest.java | 2 +- .../data/CopperCompatibilityTest.java | 12 +- .../data/Minecraft1211ResourceTest.java | 13 +- .../data/NativeAssetDefinitionTest.java | 90 ++++ .../basemetals/data/OreOverlayModelTest.java | 5 +- .../basemetals/data/RecipeDataSemantics.java | 44 ++ .../basemetals/data/RecipeRegressionTest.java | 2 +- .../data/ResourceIntegrityTest.java | 26 +- .../migration/LegacyMigrationSafetyTest.java | 18 +- .../LegacyWorldCapabilityCodecTest.java | 43 ++ .../migration/LegacyWorldDataHookTest.java | 59 ++- .../migration/NativeMigrationHooksTest.java | 77 ++++ .../network/ConnectionReadInterestTest.java | 5 +- .../basemetals/smoke/UpgradeWorldSmoke.java | 49 ++- tools/validation/README.md | 6 +- tools/validation/compare_current_world.py | 45 +- tools/validation/compare_world_terrain.py | 37 +- tools/validation/test_component_comparison.py | 33 +- tools/validation/test_content_modes.js | 6 +- tools/validation/test_legacy_worlds.js | 15 +- tools/validation/test_world_terrain.py | 35 ++ 3535 files changed, 17037 insertions(+), 9922 deletions(-) create mode 100644 src/dataGenerator/resources/datagen/templates/block/bars_post_ends.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_bottom_left.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_bottom_left_open.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_bottom_right.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_bottom_right_open.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_top_left.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_top_left_open.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_top_right.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/door_top_right_open.json create mode 100644 src/dataGenerator/resources/datagen/templates/block/wall_side_tall.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/anvil.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/bars.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/block.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/button.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/door.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/human_detector.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/lever.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/plate.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/pressure_plate.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/slab.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/stairs.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/trapdoor.json create mode 100644 src/dataGenerator/resources/datagen/templates/blockstates/wall.json create mode 100644 src/gametest/java/zone/moddev/mc/basemetals/GameTestRegistration.java create mode 100644 src/gametest/java/zone/moddev/mc/basemetals/content/RuntimeTestData.java create mode 100644 src/generated/resources/assets/basemetals/equipment/adamantine.json create mode 100644 src/generated/resources/assets/basemetals/equipment/antimony.json create mode 100644 src/generated/resources/assets/basemetals/equipment/aquarium.json create mode 100644 src/generated/resources/assets/basemetals/equipment/bismuth.json create mode 100644 src/generated/resources/assets/basemetals/equipment/brass.json create mode 100644 src/generated/resources/assets/basemetals/equipment/bronze.json create mode 100644 src/generated/resources/assets/basemetals/equipment/coldiron.json create mode 100644 src/generated/resources/assets/basemetals/equipment/copper.json create mode 100644 src/generated/resources/assets/basemetals/equipment/cupronickel.json create mode 100644 src/generated/resources/assets/basemetals/equipment/electrum.json create mode 100644 src/generated/resources/assets/basemetals/equipment/emerald.json create mode 100644 src/generated/resources/assets/basemetals/equipment/invar.json create mode 100644 src/generated/resources/assets/basemetals/equipment/lead.json create mode 100644 src/generated/resources/assets/basemetals/equipment/mithril.json create mode 100644 src/generated/resources/assets/basemetals/equipment/nickel.json create mode 100644 src/generated/resources/assets/basemetals/equipment/obsidian.json create mode 100644 src/generated/resources/assets/basemetals/equipment/pewter.json create mode 100644 src/generated/resources/assets/basemetals/equipment/platinum.json create mode 100644 src/generated/resources/assets/basemetals/equipment/quartz.json create mode 100644 src/generated/resources/assets/basemetals/equipment/silver.json create mode 100644 src/generated/resources/assets/basemetals/equipment/starsteel.json create mode 100644 src/generated/resources/assets/basemetals/equipment/steel.json create mode 100644 src/generated/resources/assets/basemetals/equipment/tin.json create mode 100644 src/generated/resources/assets/basemetals/equipment/zinc.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_anvil.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_block.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_button.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_door.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/adamantine_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_block.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_button.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_door.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/antimony_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_block.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_button.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_door.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/aquarium_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_block.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_button.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_door.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/bismuth_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/brass.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_block.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_button.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_door.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/brass_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_block.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_button.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_door.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/bronze_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal_block.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/charcoal_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/coal.json create mode 100644 src/generated/resources/assets/basemetals/items/coal_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/coal_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/coal_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/coal_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_block.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_button.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_door.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/coldiron_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/copper.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_block.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_button.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_door.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/copper_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_block.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_button.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_door.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/cupronickel_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_button.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_door.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/diamond_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_block.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_button.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_door.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/electrum_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_button.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_door.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/emerald_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/ender.json create mode 100644 src/generated/resources/assets/basemetals/items/ender_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/gold.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_button.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_door.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/gold_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/human_detector.json create mode 100644 src/generated/resources/assets/basemetals/items/invar.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_block.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_button.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_door.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/invar_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/iron.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_button.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/iron_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/lapis.json create mode 100644 src/generated/resources/assets/basemetals/items/lapis_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/lapis_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/lead.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_block.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_button.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_door.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/lead_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/mercury_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_block.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_button.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_door.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/mithril_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_block.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_button.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_door.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/nickel_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_button.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_door.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/obsidian_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_block.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_button.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_door.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/pewter_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_block.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_button.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_door.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/platinum_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/prismarine.json create mode 100644 src/generated/resources/assets/basemetals/items/prismarine_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_button.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_door.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/quartz_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/redstone.json create mode 100644 src/generated/resources/assets/basemetals/items/redstone_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/redstone_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/redstone_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/silver.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_block.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_button.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_door.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/silver_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_block.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_button.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_door.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/starsteel_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/steel.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_anvil.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_blend.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_block.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_button.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_door.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_smallblend.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/steel_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/stone.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_anvil.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/stone_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/tin.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_block.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_button.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_door.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/tin_wall.json create mode 100644 src/generated/resources/assets/basemetals/items/wood.json create mode 100644 src/generated/resources/assets/basemetals/items/wood_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/wood_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/wood_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/wood_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_arrow.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_axe.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_bars.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_block.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_bolt.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_boots.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_bow.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_bucket.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_button.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_casing.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_chestplate.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_clump.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_crackhammer.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_crossbow.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_crushed.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_crushed_purified.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_crystal.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_dense_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_door.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_fishing_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_gear.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_helmet.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_hoe.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_horse_armor.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_ingot.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_leggings.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_lever.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_nugget.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_ore.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_pickaxe.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_powder.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_powder_dirty.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_pressure_plate.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_raw.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_rod.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_scythe.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_shard.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_shears.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_shield.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_shovel.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_slab.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_smallpowder.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_stairs.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_sword.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_trapdoor.json create mode 100644 src/generated/resources/assets/basemetals/items/zinc_wall.json create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/adamantine.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/antimony.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/aquarium.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/bismuth.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/brass.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/bronze.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/coldiron.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/copper.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/cupronickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/electrum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/emerald.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/invar.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/lead.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/mithril.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/nickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/obsidian.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/pewter.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/platinum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/quartz.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/silver.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/starsteel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/steel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/tin.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/zinc.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/adamantine.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/antimony.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/aquarium.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/bismuth.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/brass.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/bronze.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/coldiron.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/copper.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/cupronickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/electrum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/emerald.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/invar.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/lead.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/mithril.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/nickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/obsidian.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/pewter.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/platinum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/quartz.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/silver.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/starsteel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/steel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/tin.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/zinc.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/adamantine.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/antimony.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/aquarium.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/bismuth.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/brass.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/bronze.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/coldiron.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/copper.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/cupronickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/electrum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/emerald.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/invar.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/lead.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/mithril.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/nickel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/obsidian.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/pewter.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/platinum.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/quartz.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/silver.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/starsteel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/steel.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/tin.png create mode 100644 src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/zinc.png create mode 100644 src/generated/resources/data/forge/tags/block/bars/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/armors/boots/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/armors/chestplates/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/armors/helmets/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/armors/horse/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/armors/leggings/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/bars/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/tools/axes/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/tools/hoes/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/tools/pickaxes/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/tools/shovels/copper.json create mode 100644 src/generated/resources/data/forge/tags/item/tools/swords/copper.json create mode 100644 src/generated/resources/data/minecraft/tags/item/copper_tool_materials.json create mode 100644 src/generated/resources/data/minecraft/tags/item/repairs_copper_armor.json create mode 100644 src/main/java/zone/moddev/mc/basemetals/migration/LegacyWorldCapabilityCodec.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/migration/NbtCompat.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/AnvilBlockMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/AnvilMenuMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/BlockStateDataMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/LevelCapabilityDataMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/LevelStorageSourceMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/OreSpawnEarlyTagCompatibilityMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/SimpleRegionStorageMixin.java create mode 100644 src/main/java/zone/moddev/mc/basemetals/mixin/WorldGenRegionMixin.java delete mode 100644 src/main/resources/META-INF/coremods.json create mode 100644 src/main/resources/assets/minecraft/atlases/blocks.json create mode 100644 src/main/resources/basemetals.mixins.json delete mode 100644 src/main/resources/coremods/basemetals_118_compatibility.js create mode 100644 src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/SavedWorldCapabilitySmoke.java create mode 100644 src/test/java/zone/moddev/mc/basemetals/data/NativeAssetDefinitionTest.java create mode 100644 src/test/java/zone/moddev/mc/basemetals/data/RecipeDataSemantics.java create mode 100644 src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldCapabilityCodecTest.java create mode 100644 src/test/java/zone/moddev/mc/basemetals/migration/NativeMigrationHooksTest.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46c717cf3..937c56bcb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,19 +1,19 @@ -name: Base Metals 1.21.1 CI +name: Base Metals 1.21.11 CI on: push: branches: - - master-1.21.1 + - master-1.21.11 - 'feature/**' pull_request: branches: - - master-1.21.1 + - master-1.21.11 permissions: contents: read concurrency: - group: basemetals-1.21.1-${{ github.workflow }}-${{ github.ref }} + group: basemetals-1.21.11-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: @@ -71,9 +71,9 @@ jobs: --no-daemon --stacktrace first="$RUNNER_TEMP/basemetals-first" mkdir -p "$first" - cp build/libs/BaseMetals-3.1.1.121011.jar "$first/" - cp build/libs/BaseMetals-3.1.1.121011-sources.jar "$first/" - cp build/libs/BaseMetals-3.1.1.121011-javadoc.jar "$first/" + cp build/libs/BaseMetals-3.1.1.121111.jar "$first/" + cp build/libs/BaseMetals-3.1.1.121111-sources.jar "$first/" + cp build/libs/BaseMetals-3.1.1.121111-javadoc.jar "$first/" cp build/release/SHA256SUMS "$first/" - name: Rebuild and prove byte-identical archives @@ -81,9 +81,9 @@ jobs: ./gradlew clean assemble verifyReleaseArtifacts writeReleaseChecksums \ -PorespawnVerificationRepository="${{ steps.orespawn.outputs.repository }}" \ --no-daemon --stacktrace - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121011.jar" build/libs/BaseMetals-3.1.1.121011.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121011-sources.jar" build/libs/BaseMetals-3.1.1.121011-sources.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121011-javadoc.jar" build/libs/BaseMetals-3.1.1.121011-javadoc.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121111.jar" build/libs/BaseMetals-3.1.1.121111.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121111-sources.jar" build/libs/BaseMetals-3.1.1.121111-sources.jar + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.1.1.121111-javadoc.jar" build/libs/BaseMetals-3.1.1.121111-javadoc.jar cmp "$RUNNER_TEMP/basemetals-first/SHA256SUMS" build/release/SHA256SUMS - name: Run all required GameTests @@ -95,14 +95,14 @@ jobs: - name: Install official Forge packaged runtimes id: forge-runtimes run: | - server_runtime="$RUNNER_TEMP/forge-1.21.1-52.1.0-server" - client_runtime="$RUNNER_TEMP/forge-1.21.1-52.1.0-client" - installer="$RUNNER_TEMP/forge-1.21.1-52.1.0-installer.jar" + server_runtime="$RUNNER_TEMP/forge-1.21.11-61.1.0-server" + client_runtime="$RUNNER_TEMP/forge-1.21.11-61.1.0-client" + installer="$RUNNER_TEMP/forge-1.21.11-61.1.0-installer.jar" mkdir -p "$server_runtime" "$client_runtime" curl --fail --location --retry 3 \ --output "$installer" \ - https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.0/forge-1.21.1-52.1.0-installer.jar - echo "F1B620F2879AD6A5BBE15DABA4D8F81EAB9F5E08004967604960B98996BDEBC4 $installer" | sha256sum --check --strict + https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.1.0/forge-1.21.11-61.1.0-installer.jar + echo "8BD1724EAEAF26F51DACFB7FDC46D79E9B640705B70D5F0019ED38907145EB48 $installer" | sha256sum --check --strict ( cd "$server_runtime" java -jar "$installer" --installServer @@ -147,13 +147,13 @@ jobs: - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMetals-1.21.1-${{ github.sha }} + name: BaseMetals-1.21.11-${{ github.sha }} if-no-files-found: error retention-days: 30 path: | - build/libs/BaseMetals-3.1.1.121011.jar - build/libs/BaseMetals-3.1.1.121011-sources.jar - build/libs/BaseMetals-3.1.1.121011-javadoc.jar + build/libs/BaseMetals-3.1.1.121111.jar + build/libs/BaseMetals-3.1.1.121111-sources.jar + build/libs/BaseMetals-3.1.1.121111-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt @@ -161,7 +161,7 @@ jobs: if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMetals-1.21.1-diagnostics-${{ github.sha }} + name: BaseMetals-1.21.11-diagnostics-${{ github.sha }} if-no-files-found: ignore retention-days: 14 path: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 39f539a7d..a8f9d82b7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,11 +3,11 @@ name: CodeQL on: push: branches: - - master-1.21.1 + - master-1.21.11 - 'feature/**' pull_request: branches: - - master-1.21.1 + - master-1.21.11 permissions: actions: read diff --git a/.github/workflows/validate-gradle-build.yml b/.github/workflows/validate-gradle-build.yml index 2f2c732be..b37dfc947 100644 --- a/.github/workflows/validate-gradle-build.yml +++ b/.github/workflows/validate-gradle-build.yml @@ -3,11 +3,11 @@ name: Validate Gradle Wrapper on: push: branches: - - master-1.21.1 + - master-1.21.11 - 'feature/**' pull_request: branches: - - master-1.21.1 + - master-1.21.11 permissions: contents: read diff --git a/CHANGELOG.txt b/CHANGELOG.txt index cca6c2cd9..dd4450ea3 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,15 @@ +Base Metals 3.1.1.121111 + +- Port the released 1.21.1 version to Minecraft 1.21.11 and Forge 61, keeping Java 21. +- Keep the existing gameplay, raw metals, ore overlays, filled buckets and High/Low Fantasy modes. +- Update equipment, recipes, projectiles, configuration screens and item models for the newer Minecraft APIs. +- Use vanilla copper nuggets, tools, armour, horse armour and bars for new crafting outputs. Keep old Base Metals items valid and accept both versions in shared ingredients. +- Replace the old JavaScript migration hooks with required Mixins, keeping the checks which protect modern worlds and current player data. +- Use the published OreSpawn 4.1.0.121111 release with the same eleven ore rules and copper defaults. +- Let OreSpawn defer early ore-host tag lookups until Minecraft has loaded the world's tags. +- Keep older Forge world-capability data readable after the saved-data format change. +- Keep filled-bucket textures together on the new texture atlases, including resource-pack replacements. + Base Metals 3.1.1.121011 - Fix startup failures when Base Metals is added to an existing modern world, including worlds with LZ4-compressed chunks, external chunks or empty region files. diff --git a/README.md b/README.md index 1fe869cdd..b01a4f3a9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Discord](https://img.shields.io/badge/Discord-MMD-green.svg?style=flat&logo=Discord)](https://discord.moddev.zone) [![CurseForge downloads](https://cf.way2muchnoise.eu/full_base-metals_downloads.svg)](https://www.curseforge.com/minecraft/mc-mods/base-metals) [![Supported Minecraft versions](https://cf.way2muchnoise.eu/versions/Minecraft_base-metals_all.svg)](https://www.curseforge.com/minecraft/mc-mods/base-metals) -[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml/badge.svg?branch=master-1.21.1)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-1.21.1) +[![Build, test, and audit](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml/badge.svg?branch=master-1.21.11)](https://github.com/MinecraftModDevelopmentMods/BaseMetals/actions/workflows/ci.yml?query=branch%3Amaster-1.21.11) # Base Metals @@ -12,21 +12,23 @@ shields, bows, crossbows, arrows, and bolts. The mod also includes Crack Hammers, scythes, metal anvils, the human detector, villager trades, advancements, and structure loot. -This is the Minecraft 1.21.1 Forge version, `3.1.1.121011`. It keeps the -fixes and features from the released 1.20.6 version, including raw metals, ore texture -overlays and High/Low Fantasy modes. Existing Base Metals items and blocks keep -their registry IDs. OreSpawn handles ore generation; MMDLib and Additional Loot -Tables are no longer needed. +This is the Minecraft 1.21.11 Forge version, `3.1.1.121111`. It keeps the +fixes and features from the released 1.21.1 version, including raw metals, ore +texture overlays and High/Low Fantasy modes. Existing Base Metals items and +blocks keep their registry IDs. OreSpawn handles ore generation; MMDLib and +Additional Loot Tables are no longer needed. ## Requirements -- Minecraft `1.21.1` -- Forge `52.1.0` or newer in the Minecraft 1.21.1 Forge 52 line +- Minecraft `1.21.11` +- Forge `61.1.0` or newer in the Minecraft 1.21.11 Forge 61 line - A current Java 21 runtime -- OreSpawn `[4.1.0.121011,5.0.0)` on both client and server +- OreSpawn `[4.1.0.121111,5.0.0)` on both client and server -This version uses OreSpawn `4.1.0.121011`. Put -`BaseMetals-3.1.1.121011.jar` and a compatible OreSpawn JAR in the `mods` +The port has also been checked against Forge `61.2.4`. + +This version uses OreSpawn `4.1.0.121111`. Put +`BaseMetals-3.1.1.121111.jar` and a compatible OreSpawn JAR in the `mods` directory. MMDLib and Additional Loot Tables must not be carried forward from an older installation. Mineralogy is optional. @@ -45,10 +47,12 @@ ingots, powders, plates, rods, gears and other components from different mods can be used together. Where vanilla has the same copper forms, recipes now produce vanilla ingots, -blocks, doors, trapdoors, cut-copper slabs and stairs. The old Base Metals items -and blocks stay registered and continue working in existing saves. Shared -ingredient tags accept both versions, so older items and the rest of the copper -recipe chains remain usable. Other Base Metals copper equipment is unchanged. +blocks, nuggets, tools, armour, horse armour, bars, doors, trapdoors, cut-copper +slabs and stairs. The old Base Metals items and blocks stay registered and +continue working in existing saves. Shared ingredient tags accept both versions, +so older items and the rest of the copper recipe chains remain usable. +Existing Base Metals copper equipment keeps its +original behaviour. Notable mechanics include: @@ -146,7 +150,7 @@ Forge item, block, and fluid tags are Base Metals' public compatibility API. Compatible tags and the existing recipe data for Mekanism, Thermal, Tinkers' Construct and Ender IO are retained, but their Java integrations are not enabled -in this Forge 1.21.1 port. Do not add jars made for older Minecraft versions or +in this Forge 1.21.11 port. Do not add jars made for older Minecraft versions or NeoForge to this instance. No optional integration API is required to compile or launch Base Metals. @@ -199,7 +203,7 @@ early splash window. Minecraft still opens its game window and runs the full world check. Ordinary client launches keep the normal splash screen. Release artifacts use Maven coordinate -`zone.moddev.mc.basemetals:BaseMetals:3.1.1.121011`. +`zone.moddev.mc.basemetals:BaseMetals:3.1.1.121111`. Report defects and compatibility problems through the [Base Metals issue tracker](https://github.com/MinecraftModDevelopmentMods/BaseMetals/issues). diff --git a/build.gradle b/build.gradle index eed2f0646..a03e8b10a 100644 --- a/build.gradle +++ b/build.gradle @@ -9,13 +9,14 @@ plugins { ext.mavenizerCompatibilityJar = layout.projectDirectory.file( 'ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar') ext.mavenizerCompatibilitySha256 = - '019032A4A26ECB473D403EF017054D5892CE59A9904E8831B452287CD756397E' + 'B36CA046DB72E30F27BD38E02B4AE34274ADB51AE1D65BAF9E1D07763755682E' ext.mavenizerFixtureChecksums = [ 'minecraft-mavenizer-0.5.21-orespawn-compat.jar': mavenizerCompatibilitySha256, - 'minecraft-source-compatibility.json': '7F669F225520D0382E76991A8A3E5E4020840F0FA975F7DCB86681D7E7C3F766', - 'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '84FEA234619CC2D1931E609B22B6E5D96F59366F7D6C2783C3BEE0F726F3E876', - 'LICENSE-MAVENIZER.txt': '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331' + 'minecraft-source-compatibility.json': '88F2EE4C6B7C903EB1C7D693C0BEEFC0EFC601C1023FB197F7CBA187B1142DB7', + 'minecraft-mavenizer-0.5.21-orespawn-compat.patch': '88F9035C8545CF1CBC7342C14F2F95076C4E415EDB7A74D585409CFC3F1BDD5C', + 'LICENSE-MAVENIZER.txt': '20C17D8B8C48A600800DFD14F95D5CB9FF47066A9641DDEAB48DC54AEC96E331', + 'README.md': 'A097E126C606BDC86B34F5DDFB9580228A7C5BC866C6509C6BB362152EBACED7' ] // Mavenizer runs during configuration, so verify its inputs before configuring Forge. mavenizerFixtureChecksums.each { name, expected -> @@ -26,7 +27,7 @@ mavenizerFixtureChecksums.each { name, expected -> } } -// Forge 52 needs no source repairs. The sealed fixture records that result +// Forge 61 needs no source repairs. The sealed fixture records that result // and stays separate from the mod and its runtime dependencies. fgtools.configure('mavenizer') { classpath.from(mavenizerCompatibilityJar) @@ -117,7 +118,7 @@ sourceSets { } dataGenerator { java.srcDir 'src/dataGenerator/java' - resources.setSrcDirs([]) + resources.setSrcDirs(['src/dataGenerator/resources']) compileClasspath += sourceSets.main.output runtimeClasspath += sourceSets.main.output } @@ -191,6 +192,7 @@ minecraft { workingDir.set(layout.projectDirectory.dir('run-optional-mods')) } jvmArgs '--add-opens', 'java.base/java.lang.invoke=ALL-UNNAMED' + args '--mixin', 'basemetals.mixins.json' // Keep registry diagnostics available in development logs. systemProperty 'forge.logging.markers', 'REGISTRIES' diff --git a/ci-fixtures/tools/README.md b/ci-fixtures/tools/README.md index 62708bcbe..c115eb9e7 100644 --- a/ci-fixtures/tools/README.md +++ b/ci-fixtures/tools/README.md @@ -2,8 +2,8 @@ This directory contains a build-only derivative of MinecraftForge's MinecraftMavenizer `0.5.21`. It is used only while ForgeGradle prepares the -exact Forge `1.21.1-52.1.0` development dependency and is excluded from every -Base Metals publication artifact. +exact Forge `1.21.11-61.1.0` development dependency and is excluded from every +OreSpawn publication artifact. ## Provenance and licence @@ -21,14 +21,14 @@ declaration and one accessor in that record. Missing, partial, duplicate or ambiguous states fail preparation. Targets without an explicit rule set are left unchanged. -Forge `1.21.1-52.1.0` compiles without source compatibility edits. Its explicit +Forge `1.21.11-61.1.0` compiles without source compatibility edits. Its explicit zero-rule entry proves that result is intentional and target-qualified rather than an accidental fall-through. A marker beside Mavenizer's output records the target and manifest SHA-256. Reprocessing the same source is idempotent. The derivative also propagates Gradle offline mode when the build sets -`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer itself runs on Java 25; Base Metals -and Minecraft 1.21.1 continue to compile for Java 21. +`ORESPAWN_MAVENIZER_OFFLINE=true`. Mavenizer itself runs on Java 25; OreSpawn +and Minecraft 1.21.11 continue to compile for Java 21. ## Rebuild @@ -39,7 +39,7 @@ and Minecraft 1.21.1 continue to compile for Java 21. 4. Run `./gradlew clean build --no-daemon` (or `gradlew.bat` on Windows). 5. Copy `build/libs/minecraft-mavenizer-0.5.21.jar` to `minecraft-mavenizer-0.5.21-orespawn-compat.jar`. -6. Run Base Metals' `verifyMavenizerCompatibilityFixture` task. The build script +6. Run OreSpawn's `verifyMavenizerCompatibilityFixture` task. The build script contains the authoritative checksums and also verifies the embedded manifest, Java class version and licence/provenance files. diff --git a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.jar index 3bc4e389f962c53426476d6a9612bab3f9570c5d..06743774719cc51805bf6cdae6accf0aaf3c1c1d 100644 GIT binary patch delta 25811 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 delta 25252 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

?js~|u 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 Op+?+Vb{O!VN&FwoG9woN diff --git a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch index a8739436d..067736433 100644 --- a/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch +++ b/ci-fixtures/tools/minecraft-mavenizer-0.5.21-orespawn-compat.patch @@ -371,7 +371,7 @@ index 0000000..702d759 +{ + "schema": 1, + "targets": { -+ "net.minecraftforge:forge:1.21.1-52.1.0": { ++ "net.minecraftforge:forge:1.21.11-61.1.0": { + "expectedApplications": 0, + "rules": [] + } diff --git a/ci-fixtures/tools/minecraft-source-compatibility.json b/ci-fixtures/tools/minecraft-source-compatibility.json index 7070e4993..4d6c9e88a 100644 --- a/ci-fixtures/tools/minecraft-source-compatibility.json +++ b/ci-fixtures/tools/minecraft-source-compatibility.json @@ -1,7 +1,7 @@ { "schema": 1, "targets": { - "net.minecraftforge:forge:1.21.1-52.1.0": { + "net.minecraftforge:forge:1.21.11-61.1.0": { "expectedApplications": 0, "rules": [] } diff --git a/docs/COMPATIBILITY.md b/docs/COMPATIBILITY.md index a602dbacc..d83e52bf7 100644 --- a/docs/COMPATIBILITY.md +++ b/docs/COMPATIBILITY.md @@ -7,7 +7,8 @@ shards, clumps, dirty dusts, and molten fluids. Adamantite, Adamantium, Adamant, Quicksilver, and steel-sprocket names are forwarding tags. Copper-consuming recipes accept `forge:ingots/copper`. -Copper ingots, storage blocks, doors, trapdoors, slabs and stairs use their +Copper ingots, nuggets, tools, armour, horse armour, bars, storage blocks, doors, +trapdoors, slabs and stairs use their vanilla equivalents as new recipe outputs. The old Base Metals IDs remain registered; their ingredient tags include both versions. Copper ore and powders smelt to vanilla copper ingots. Existing copper equipment remains usable. @@ -19,7 +20,7 @@ recycling recipes also accept the appropriate vanilla equivalent. The tags and existing integration data for Mekanism, Thermal, Tinkers' Construct and Ender IO remain available for future compatibility work. Their Java API hooks -and runtime jars are not included in this Forge 1.21.1 port. Do not substitute +and runtime jars are not included in this Forge 1.21.11 port. Do not substitute jars made for older Minecraft versions or NeoForge. Other processors can use the shared Forge tags without a direct Java integration. diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md index 5d12b5b0b..bd944f13c 100644 --- a/docs/MIGRATION.md +++ b/docs/MIGRATION.md @@ -1,8 +1,8 @@ # Migrating from Base Metals 1.10 or 1.12 Always upgrade a copy and retain the original legacy world. Install Base Metals -3.1.0 and OreSpawn 4.1.0, but do not carry MMDLib, Additional Loot Tables, the -OreSpawn 3 plugin, or the old native fallback generator into the 1.21.1 instance. +3.1.1 and OreSpawn 4.1.0, but do not carry MMDLib, Additional Loot Tables, the +OreSpawn 3 plugin, or the old native fallback generator into the 1.21.11 instance. Minecraft's data fixer cannot identify third-party numeric block IDs from before the 1.13 flattening. Base Metals snapshots those positions, runs @@ -12,17 +12,18 @@ Any vanilla block entities which Mojang's fixer inferred from a reused mod numeric ID are removed at those positions. Vanilla's context-sensitive block, block-entity, entity, inventory, map, statistics, objective, jukebox, spawn egg, banner, and villager fixes still run everywhere else. The migrator reads -the exact numeric map from an untouched legacy `level.dat`, `level.dat_old`, -or the `basemetals-legacy-registry.dat` snapshot -when available. If neither retains a legacy map, it uses the map captured from +the numeric map captured from the current legacy `level.dat` or the world-local +`basemetals-legacy-registry.dat` snapshot. An old backup is never used to start +conversion. If a proven legacy save has no registry map, it uses the map captured from the public Base Metals 2.5.0-rc2.332 and MMDLib 1.0.0-rc2.36 runtime. Before replacing any region file, `level.dat`, or playerdata file, the migrator copies the original to `basemetals-1.12-region-backup` inside the world. Region replacements are transactional. A completed scan writes -`BASEMETALS_1_12_BLOCK_MIGRATION_COMPLETE.txt`, recording either the conversion -summary or that no legacy content was present; subsequent starts do nothing. +`BASEMETALS_1_12_BLOCK_MIGRATION_COMPLETE.txt` with a conversion summary. +Later starts do not repeat the completed scan. Modern worlds do not +receive a legacy conversion marker or backup. The packaged fallback map covers the exact public 1.12 runtime. With a saved legacy registry map, blocks from the world's other 1.10/1.12 mods also retain @@ -32,14 +33,14 @@ state. Base Metals and historical `mmdlib:*` states retain their old metadata semantics, including complete paired-door state. If neither legacy level file contains an ID used by a numeric chunk, migration stops instead of guessing or deleting it. Restore the backed-up regions and recover the world's original -`level.dat_old` before retrying. Forge normally creates that file before Base -Metals' migration hook runs; keep it beside `level.dat` for the first upgrade. +world metadata before retrying. Do not replace the current metadata with an +unrelated or stale backup. This supports both the original Cyano Base Metals 2.4 line and the later MMD Base Metals 2.5 line. Registry paths containing uppercase characters, which Minecraft 1.10 still allowed, are normalized to the lowercase form required by modern Minecraft. -Base Metals 3.1.0 preserves historical `basemetals:*` IDs, including hidden +This version preserves historical `basemetals:*` IDs, including hidden `double__slab` blocks and molten-fluid block IDs such as `basemetals:adamantine`. Dedicated bucket items and flowing-fluid registry entries are new. Legacy `forge:bucketfilled` stacks containing Base Metals @@ -86,12 +87,18 @@ Old inventories remain valid in either content mode. A configuration without `contentMode` starts in High Fantasy; Low Fantasy only restricts new acquisition. The mode is a server or modpack setting, not a setting stored in each world. -## Moving from 1.20.1 +## Moving from 1.20.1 through 1.21.1 -Minecraft 1.21.1 stores item properties as components rather than the older item -tag. Base Metals keeps names, enchantments, durability and custom data during +Minecraft stores item properties as components rather than the older item tag, +and newer versions also store worn equipment differently. Base Metals keeps +names, enchantments, durability and custom data during that conversion. Saved arrows and bolts also retain their ammunition. +Forge 61 adds another wrapper to saved world-capability data. Base Metals reads +both the older payload and the current wrapper, so installed mods receive their +saved data rather than an empty replacement. New saves use Forge's current +format. This does not enable legacy block conversion in a modern world. + Make the first upgrade on a copy, then check stored equipment and inventories before using the upgraded world normally. Keep the original: a converted world must not be opened in an older Minecraft version. diff --git a/docs/VERSIONS.md b/docs/VERSIONS.md index 06049ee31..04a6d99b7 100644 --- a/docs/VERSIONS.md +++ b/docs/VERSIONS.md @@ -1,17 +1,22 @@ # Supported versions -Base Metals `3.1.1.121011` targets Minecraft 1.21.1, Forge 52.1.0 and Java 21. -OreSpawn `4.1.0.121011` is the exact build and test dependency. Clients and -servers need OreSpawn `[4.1.0.121011,5.0.0)`. +Base Metals `3.1.1.121111` targets Minecraft 1.21.11, Forge 61.1.0 and Java 21. +Packaged client, server and save-upgrade checks also pass on Forge 61.2.4. +OreSpawn `4.1.0.121111` is the exact build and test dependency. Clients and +servers need OreSpawn `[4.1.0.121111,5.0.0)`. -The pinned CurseForge artifact is project 245586, file 9189594: -`curse.maven:mmd-orespawn-245586:9189594`. +The pinned CurseForge artifact is project 245586, file 9268464: +`curse.maven:mmd-orespawn-245586:9268464`. Its SHA-256 is -`EB369B7D7CE6D6C453658347A420C2F0783B7F4D1AC7383C87176AC05192B5A0`. +`DE39929057288CEA110196C9E9D708E129B80BC360A2E53976337FFA6A84A67B`. Release artifacts use Maven coordinate -`zone.moddev.mc.basemetals:BaseMetals:3.1.1.121011`. +`zone.moddev.mc.basemetals:BaseMetals:3.1.1.121111`. The provider remains schema 3, revision 1. OreSpawn 4.1 is needed for the configuration-screen API; the provider's eleven rule IDs and 1.18 distributions have not changed. + +The data pack uses format `94.1`. Forge wraps client mod resources with the +native resource-pack format `75.0`. The resource metadata retains the minor +version rather than rounding the data format down to `94`. diff --git a/docs/WORLDGEN.md b/docs/WORLDGEN.md index e743dd03c..a6e565cb5 100644 --- a/docs/WORLDGEN.md +++ b/docs/WORLDGEN.md @@ -1,8 +1,8 @@ # OreSpawn world generation -Base Metals requires OreSpawn `[4.1.0.121011,5.0.0)` and packages provider schema 3, +Base Metals requires OreSpawn `[4.1.0.121111,5.0.0)` and packages provider schema 3, revision 1 at `data/basemetals/orespawn/provider.json`. Builds and tests use the -published OreSpawn `4.1.0.121011` release. The provider is checked against the +published OreSpawn `4.1.0.121111` release. The provider is checked against the included 4.1.0 schema. The provider declares ores only: it has no rocks, geomes, biome rules, terrain diff --git a/docs/schemas/orespawn-4.1.0/README.md b/docs/schemas/orespawn-4.1.0/README.md index 05b3e92d9..7629b7b74 100644 --- a/docs/schemas/orespawn-4.1.0/README.md +++ b/docs/schemas/orespawn-4.1.0/README.md @@ -1,9 +1,9 @@ # OreSpawn 4.1.0 schemas -These public schemas match OreSpawn 4.1.0.121011. The Base Metals provider +These public schemas match OreSpawn 4.1.0.121111. The Base Metals provider still uses schema 3 and revision 1; its ore rules have not changed. The build validates the provider against this snapshot. OreSpawn 4.1 is also needed for the Base Metals configuration button in its world-creation screen. -Source: [OreSpawn 4.1.0.121011](https://github.com/MinecraftModDevelopmentMods/OreSpawn/releases/tag/4.1.0.121011). +Source: [OreSpawn 4.1.0.121111](https://github.com/MinecraftModDevelopmentMods/OreSpawn/releases/tag/4.1.0.121111). diff --git a/gradle.properties b/gradle.properties index fd47631bf..db7f0b26c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,14 +11,14 @@ net.minecraftforge.gradle.merge-source-sets=false ## Environment Properties # The Minecraft version must agree with the Forge version to get a valid artifact -minecraft_version=1.21.1 +minecraft_version=1.21.11 # The Minecraft version range can use any release version of Minecraft as bounds. # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # as they do not follow standard versioning conventions. -minecraft_version_range=[1.21.1,1.21.2) +minecraft_version_range=[1.21.11,1.22) # The Forge version must agree with the Minecraft version to get a valid artifact -forge_version=52.1.0 -forge_installer_sha256=F1B620F2879AD6A5BBE15DABA4D8F81EAB9F5E08004967604960B98996BDEBC4 +forge_version=61.1.0 +forge_installer_sha256=8BD1724EAEAF26F51DACFB7FDC46D79E9B640705B70D5F0019ED38907145EB48 # Release metadata consumed by the generic dispatcher. loader_name=forge loader_code=1 @@ -29,14 +29,14 @@ curseforge_project_id=240967 # Exact released OreSpawn used for development and qualification. Runtime # metadata intentionally remains compatible with supported OreSpawn 4 builds. -orespawn_version=4.1.0.121011 +orespawn_version=4.1.0.121111 orespawn_curse_project_id=245586 -orespawn_curse_file_id=9189594 -orespawn_sha256=EB369B7D7CE6D6C453658347A420C2F0783B7F4D1AC7383C87176AC05192B5A0 +orespawn_curse_file_id=9268464 +orespawn_sha256=DE39929057288CEA110196C9E9D708E129B80BC360A2E53976337FFA6A84A67B # The Forge version range can use any version of Forge as bounds or match the loader version range -forge_version_range=[52.1.0,53) +forge_version_range=[61.1.0,62) # The loader version range can only use the major version of Forge/FML as bounds -loader_version_range=[52,53) +loader_version_range=[61,62) # The mapping channel to use for mappings. # The default set of supported mapping channels are ["official", "snapshot", "snapshot_nodoc", "stable", "stable_nodoc"]. # Additional mapping channels can be registered through the "channelProviders" extension in a Gradle plugin. @@ -54,7 +54,7 @@ loader_version_range=[52,53) mapping_channel=official # The mapping version to query from the mapping channel. # This must match the format required by the mapping channel. -mapping_version=1.21.1 +mapping_version=1.21.11 ## Mod Properties @@ -67,7 +67,7 @@ mod_name=Base Metals # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-2.1 # The mod version. See https://semver.org/ -mod_version=3.1.1.121011 +mod_version=3.1.1.121111 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -77,7 +77,7 @@ mod_authors=Cyanobacterium, jriwanek, dshadowwolf, GetDizzy611, SkyBlade1978, th # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=Adds historically common metals, fantasy metals, alloys, tools, armour, and OreSpawn-powered deposits. -# Forge 52 uses official runtime names. +# Forge 61 uses official runtime names. reobf=false -mcp_version=20240808.132146 +mcp_version=20251223.124241 java_setup_version=21.0.7+6.0.LTS diff --git a/gradle/README.md b/gradle/README.md index 83435058a..977083dfa 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -20,6 +20,7 @@ Keep machine-specific paths in Gradle properties, never in these scripts. Model and data providers live in the separate `dataGenerator` source set. Use `generateResources` after changing them to update the committed resources. +Run it before starting a separate build, so resource processing sees the new files. `check` generates a temporary copy and reports differences without changing source files. Neither the providers nor test probes enter ordinary game launches or public jars. @@ -30,10 +31,14 @@ flower, sapling and leaf tags include suitable new plants. Normal client and server launches load only Base Metals and OreSpawn. The optional-mod profile has its own run folder, but no optional integration mods -are pinned for Forge 1.21.1. The Mekanism, Tinkers, Thermal and Ender IO Java +are pinned for Forge 1.21.11. The Mekanism, Tinkers, Thermal and Ender IO Java integrations are not enabled here; their dormant data remains available for future integration work. +Filled buckets use three atlas aliases from the vanilla bucket and Forge masks. +They keep the bucket and molten fluid on the block atlas without copying those +textures, so resource packs can still replace them. + Run `prepareEclipse` after importing the project or refreshing Gradle. It generates the launches, copies processed resources and checks that ordinary runs cannot see tests or probes. Client launches explicitly select the client diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index fa94d843d..ef3387683 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -54,12 +54,12 @@ dependencies { implementation minecraft.dependency("net.minecraftforge:forge:${minecraft_version}-${forge_version}") // OreSpawn remains an ordinary hard mod dependency in metadata and is - // never shaded into Base Metals. Use the published 1.21.1 release in + // never shaded into Base Metals. Use the published 1.21.11 release in // development so clean checkouts exercise the same artifact as players. implementation "curse.maven:mmd-orespawn-${orespawn_curse_project_id}:${orespawn_curse_file_id}" orespawnRelease "curse.maven:mmd-orespawn-${orespawn_curse_project_id}:${orespawn_curse_file_id}" - // Optional Java integrations are not enabled in this Forge 1.21.1 port. + // Optional Java integrations are not enabled in this Forge 1.21.11 port. testImplementation platform('org.junit:junit-bom:5.10.2') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2' diff --git a/gradle/ide/eclipse.gradle b/gradle/ide/eclipse.gradle index 581d83fb9..e7442b776 100644 --- a/gradle/ide/eclipse.gradle +++ b/gradle/ide/eclipse.gradle @@ -73,7 +73,7 @@ def verifyDevelopmentRunProfiles = tasks.register('verifyDevelopmentRunProfiles' || optionalDevelopmentArtifacts.any { expected -> !optionalClient.classpath.files.any { it.name.contains("${expected.module}-${expected.file}") } }) { - throw new GradleException('The optional client must load the pinned 1.21.1 dependencies') + throw new GradleException('The optional client must load the pinned 1.21.11 dependencies') } } } @@ -317,7 +317,7 @@ def verifyEclipseProductionClasspath = tasks.register('verifyEclipseProductionCl } } String metadata = new File(projectDir, 'bin/main/META-INF/mods.toml').getText('UTF-8') - if (metadata.contains('${') || !metadata.contains('version="3.1.1.121011"')) { + if (metadata.contains('${') || !metadata.contains('version="3.1.1.121111"')) { throw new GradleException('Eclipse output contains unresolved or invalid Base Metals version metadata') } } diff --git a/gradle/release/artifacts.gradle b/gradle/release/artifacts.gradle index 70e124417..83ddede2b 100644 --- a/gradle/release/artifacts.gradle +++ b/gradle/release/artifacts.gradle @@ -53,6 +53,7 @@ tasks.named('jar', Jar) { manifest { attributes([ 'Maven-Artifact' : expectedMavenCoordinate, + 'MixinConfigs' : 'basemetals.mixins.json', 'Specification-Title' : 'Base Metals', 'Specification-Vendor' : project.mod_authors, 'Specification-Version' : '1', @@ -183,7 +184,7 @@ tasks.register('verifyMavenCoordinates') { tasks.register('verifyMavenizerCompatibilityFixture') { group = 'verification' - description = 'Verifies the checksum-sealed Forge 1.21.1 Mavenizer compatibility fixture.' + description = 'Verifies the checksum-sealed Forge 1.21.11 Mavenizer compatibility fixture.' inputs.file project.ext.mavenizerCompatibilityJar doLast { File fixture = project.ext.mavenizerCompatibilityJar.asFile @@ -197,23 +198,23 @@ tasks.register('verifyMavenizerCompatibilityFixture') { tasks.register('verifyReleaseConfiguration') { group = 'verification' - description = 'Verifies the exact Base Metals 1.21.1 release identity.' + description = 'Verifies the exact Base Metals 1.21.11 release identity.' dependsOn tasks.named('verifyMavenizerCompatibilityFixture') dependsOn tasks.named('verifyJava21Toolchain') doLast { - if (configuredReleaseIdentity.modVersion != '3.1.1.121011' + if (configuredReleaseIdentity.modVersion != '3.1.1.121111' || configuredReleaseIdentity.modGroup != expectedMavenGroup - || configuredReleaseIdentity.minecraftVersion != '1.21.1' - || configuredReleaseIdentity.forgeVersion != '52.1.0' - || configuredReleaseIdentity.forgeInstallerSha256 != 'F1B620F2879AD6A5BBE15DABA4D8F81EAB9F5E08004967604960B98996BDEBC4' + || configuredReleaseIdentity.minecraftVersion != '1.21.11' + || configuredReleaseIdentity.forgeVersion != '61.1.0' + || configuredReleaseIdentity.forgeInstallerSha256 != '8BD1724EAEAF26F51DACFB7FDC46D79E9B640705B70D5F0019ED38907145EB48' || configuredReleaseIdentity.mappingChannel != 'official' - || configuredReleaseIdentity.mappingVersion != '1.21.1' + || configuredReleaseIdentity.mappingVersion != '1.21.11' || configuredReleaseIdentity.loaderName != 'forge' || configuredReleaseIdentity.loaderCode != '1' || configuredReleaseIdentity.javaVersion != '21' || configuredReleaseIdentity.gradleJavaVersion != '21' || configuredReleaseIdentity.curseForgeProjectId != '240967') { - throw new GradleException('Unexpected Base Metals 1.21.1 release identity') + throw new GradleException('Unexpected Base Metals 1.21.11 release identity') } } } @@ -222,10 +223,10 @@ tasks.register('verifyReleaseDependencies') { group = 'verification' description = 'Resolves and verifies the exact released OreSpawn qualification dependency.' doLast { - if (configuredOreSpawnIdentity.version != '4.1.0.121011' + if (configuredOreSpawnIdentity.version != '4.1.0.121111' || configuredOreSpawnIdentity.curseProjectId != '245586' - || configuredOreSpawnIdentity.curseFileId != '9189594' - || configuredOreSpawnIdentity.sha256 != 'EB369B7D7CE6D6C453658347A420C2F0783B7F4D1AC7383C87176AC05192B5A0') { + || configuredOreSpawnIdentity.curseFileId != '9268464' + || configuredOreSpawnIdentity.sha256 != 'DE39929057288CEA110196C9E9D708E129B80BC360A2E53976337FFA6A84A67B') { throw new GradleException('Unexpected OreSpawn release coordinates') } File artifact = configurations.orespawnRelease.resolvedConfiguration.resolvedArtifacts @@ -300,6 +301,7 @@ tasks.register('verifyReleaseArtifacts') { [ 'META-INF/mods.toml', 'META-INF/MANIFEST.MF', + 'basemetals.mixins.json', 'pack.mcmeta', 'data/basemetals/orespawn/provider.json', 'data/basemetals/recipe/stone_crackhammer.json', @@ -311,17 +313,21 @@ tasks.register('verifyReleaseArtifacts') { if (!names.contains(required)) throw new GradleException("Release jar is missing ${required}") } def manifest = new java.util.jar.Manifest(zip.getInputStream(zip.getEntry('META-INF/MANIFEST.MF'))) + if (manifest.mainAttributes.getValue('MixinConfigs') != 'basemetals.mixins.json' + || names.contains('META-INF/coremods.json') || names.any { it.startsWith('coremods/') }) { + throw new GradleException('Release jar must use the required native Mixins, not JavaScript coremods') + } if (manifest.mainAttributes.getValue('Maven-Artifact') != expectedMavenCoordinate) { throw new GradleException('Release manifest contains the wrong Maven coordinate') } - String expectedBuildTarget = 'minecraft-1.21.1-forge-52.1.0-java-21' + String expectedBuildTarget = 'minecraft-1.21.11-forge-61.1.0-java-21' if (manifest.mainAttributes.getValue('Build-Target') != expectedBuildTarget) { throw new GradleException('Release manifest contains the wrong stable build target') } String modsToml = zip.getInputStream(zip.getEntry('META-INF/mods.toml')).getText('UTF-8') if (modsToml.contains('${') - || !modsToml.contains('version="3.1.1.121011"') - || !modsToml.contains('versionRange="[4.1.0.121011,5.0.0)"')) { + || !modsToml.contains('version="3.1.1.121111"') + || !modsToml.contains('versionRange="[4.1.0.121111,5.0.0)"')) { throw new GradleException('Release mods.toml contains unresolved or incompatible metadata') } def provider = new JsonSlurper().parse(zip.getInputStream( diff --git a/gradle/verification/packaged-runtime.gradle b/gradle/verification/packaged-runtime.gradle index 3d0566966..ad9aa2aa4 100644 --- a/gradle/verification/packaged-runtime.gradle +++ b/gradle/verification/packaged-runtime.gradle @@ -134,8 +134,8 @@ def packagedServerStartupSmoke = tasks.register('packagedServerStartupSmoke', Ex doFirst { File runtime = requireRuntimeDirectory(packagedForgeServerRuntime, 'packagedForgeServerRuntime') File libraries = new File(runtime, 'libraries') - File forgeDirectory = new File(libraries, 'net/minecraftforge/forge/1.21.1-52.1.0') - File launcher = new File(forgeDirectory, 'forge-1.21.1-52.1.0-server.jar') + File forgeDirectory = new File(libraries, 'net/minecraftforge/forge/1.21.11-61.1.0') + File launcher = new File(forgeDirectory, 'forge-1.21.11-61.1.0-server.jar') File sourceArguments = new File(forgeDirectory, System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows') ? 'win_args.txt' : 'unix_args.txt') @@ -174,9 +174,9 @@ def packagedServerStartupSmoke = tasks.register('packagedServerStartupSmoke', Ex if (!marker.isFile()) throw new GradleException('Packaged dedicated-server completion marker is missing') Properties values = new Properties() marker.withInputStream { values.load(it) } - if (values.getProperty('basemetals') != '3.1.1.121011' - || values.getProperty('orespawn') != '4.1.0.121011' - || values.getProperty('forge') != '52.1.0') { + if (values.getProperty('basemetals') != '3.1.1.121111' + || values.getProperty('orespawn') != '4.1.0.121111' + || values.getProperty('forge') != '61.1.0') { throw new GradleException("Packaged dedicated-server versions are wrong: ${values}") } verifyPackagedLog(runDirectory, 'BASEMETALS_PACKAGED_SERVER_SMOKE PASS', @@ -219,11 +219,11 @@ def preparePackagedClientSmoke = tasks.register('preparePackagedClientSmoke') { File hostPack = new File(runDirectory, 'resourcepacks/basemetals-host-test') File texture = new File(hostPack, 'assets/minecraft/textures/block/stone.png') texture.parentFile.mkdirs() - new java.util.zip.ZipFile(new File(runtime, 'versions/1.21.1/1.21.1.jar')).withCloseable { zip -> + new java.util.zip.ZipFile(new File(runtime, 'versions/1.21.11/1.21.11.jar')).withCloseable { zip -> texture.bytes = zip.getInputStream(zip.getEntry('assets/minecraft/textures/block/dirt.png')).bytes } new File(hostPack, 'pack.mcmeta').setText( - '{"pack":{"pack_format":32,"description":"Ore host replacement test"}}\n', 'UTF-8') + '{"pack":{"min_format":[75,0],"max_format":[75,0],"description":"Ore host replacement test"}}\n', 'UTF-8') new File(runDirectory, 'options.txt').append( 'resourcePacks:["vanilla","mod_resources","file/basemetals-host-test"]\n', 'UTF-8') } @@ -243,13 +243,13 @@ def packagedClientStartupSmoke = tasks.register('packagedClientStartupSmoke', Ex dependsOn preparePackagedClientSmoke doFirst { File runtime = requireRuntimeDirectory(packagedForgeClientRuntime, 'packagedForgeClientRuntime') - String forgeVersionId = ['1.21.1-forge-52.1.0', 'forge-52.1.0'].find { candidate -> + String forgeVersionId = ['1.21.11-forge-61.1.0', 'forge-61.1.0'].find { candidate -> new File(runtime, "versions/${candidate}/${candidate}.json").isFile() } - if (forgeVersionId == null) throw new GradleException('Official client runtime has no Forge 52.1.0 profile') + if (forgeVersionId == null) throw new GradleException('Official client runtime has no Forge 61.1.0 profile') File forgeJsonFile = new File(runtime, "versions/${forgeVersionId}/${forgeVersionId}.json") - File baseJsonFile = new File(runtime, 'versions/1.21.1/1.21.1.json') - File baseJar = new File(runtime, 'versions/1.21.1/1.21.1.jar') + File baseJsonFile = new File(runtime, 'versions/1.21.11/1.21.11.json') + File baseJar = new File(runtime, 'versions/1.21.11/1.21.11.jar') File nativesDirectory = new File(runtime, "natives/${forgeVersionId}") [forgeJsonFile, baseJsonFile, baseJar, new File(runtime, 'libraries'), new File(runtime, 'assets'), nativesDirectory].each { diff --git a/gradle/verification/support.gradle b/gradle/verification/support.gradle index f9ddd9783..87562d3e5 100644 --- a/gradle/verification/support.gradle +++ b/gradle/verification/support.gradle @@ -90,6 +90,11 @@ tasks.register('generateResources', Sync) { into generatedResourcesDir } +// Honour an explicit resource refresh without making ordinary builds rewrite it. +tasks.named('sourcesJar').configure { + mustRunAfter tasks.named('generateResources') +} + def verifyGeneratedData = tasks.register('verifyGeneratedData') { group = 'verification' description = 'Compares native datagen output with checked-in resources without modifying them.' @@ -118,6 +123,7 @@ def prepareGameTestStructures = tasks.register('prepareGameTestStructures') { group = 'verification' description = 'Creates the empty structure used by the isolated GameTests.' outputs.dir gameTestResources + inputs.files(fileTree('src/gametest/java') { include '**/*.java' }) doLast { File structure = new File(gameTestResources.get().asFile, 'data/basemetals/structure/empty.nbt') structure.parentFile.mkdirs() @@ -135,6 +141,34 @@ def prepareGameTestStructures = tasks.register('prepareGameTestStructures') { nbt.writeByte(0) } } + + File instances = new File(gameTestResources.get().asFile, 'data/basemetals/test_instance') + delete instances + instances.mkdirs() + int count = 0 + + fileTree('src/gametest/java').matching { include '**/*.java' }.files.sort().each { source -> + def methods = source.getText('UTF-8') =~ /(?s)@GameTest\((.*?)\)\s+public static void (\w+)\(/ + + methods.each { match -> + String annotation = match[1] + String name = match[2].replaceAll(/([A-Z])/, '_$1').toLowerCase(Locale.ROOT) + def maxTicks = annotation =~ /maxTicks\s*=\s*(\d+)/ + def setupTicks = annotation =~ /setupTicks\s*=\s*(\d+)/ + Map data = [type: 'minecraft:function', function: "basemetals:${name}", + environment: 'minecraft:default', structure: 'basemetals:empty', + max_ticks: maxTicks.find() ? maxTicks.group(1).toInteger() : 100, + setup_ticks: setupTicks.find() ? setupTicks.group(1).toInteger() : 0] + + new File(instances, "${name}.json").setText( + groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(data)) + '\n', 'UTF-8') + count++ + } + } + + if (count != 46) { + throw new GradleException("Expected 46 native GameTest instances, found ${count}") + } } } @@ -147,6 +181,7 @@ tasks.matching { it.name == 'prepareRunGameTestServer' }.configureEach { tasks.matching { it.name == 'runGameTestServer' }.configureEach { dependsOn prepareGameTestStructures + args '--tests', 'basemetals:*' doFirst { File runDirectory = layout.projectDirectory.dir('run-gametest').asFile runDirectory.mkdirs() @@ -163,7 +198,7 @@ tasks.matching { it.name == 'runGameTestServer' }.configureEach { doLast { File log = layout.projectDirectory.file('run-gametest/logs/latest.log').asFile String text = log.isFile() ? log.getText('UTF-8') : '' - if (!(text =~ /All 43 required tests passed/).find()) { + if (!(text =~ /All 46 required tests passed/).find()) { throw new GradleException('GameTests did not report a completed, passing suite. See run-gametest/logs/latest.log.') } if (text =~ /(?i)(ERROR|FATAL)\]/) { diff --git a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java index bfdb9a559..4e76b1885 100644 --- a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java +++ b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java @@ -1,80 +1,100 @@ package zone.moddev.mc.basemetals.data; -import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.generators.BlockModelBuilder; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.fml.common.Mod; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; import zone.moddev.mc.basemetals.content.ModContent; import zone.moddev.mc.basemetals.material.MaterialCatalogue; -import zone.moddev.mc.basemetals.material.MaterialDefinition; + +import static zone.moddev.mc.basemetals.data.BaseMetalsDataGenerators.object; /** - * Builds ores from a vanilla host texture and a transparent ore overlay. + * Builds ores from a vanilla host and a transparent overlay. * * @author KiriCattus (Kiri), original two-layer model */ @Mod.EventBusSubscriber(modid = "basemetals", bus = Mod.EventBusSubscriber.Bus.MOD) -public final class BMBlockStateProvider extends BlockStateProvider { +public final class BMBlockStateProvider implements DataProvider { private static final float OVERLAY_OFFSET = 0.05F; + private final java.nio.file.Path output; + private final List> writes = new ArrayList<>(); - public BMBlockStateProvider(net.minecraft.data.PackOutput generator, ExistingFileHelper existingFiles) { - super(generator, "basemetals", existingFiles); + public BMBlockStateProvider(PackOutput output) { + this.output = output.getOutputFolder(); } - @Override - public String getName() { return "Ore overlays: basemetals"; } - @SubscribeEvent public static void gatherData(GatherDataEvent event) { if (event.includeClient()) { - event.getGenerator().addProvider(true, new BMBlockStateProvider( - event.getGenerator().getPackOutput(), event.getExistingFileHelper())); + event.getGenerator().addProvider(true, new BMBlockStateProvider(event.getGenerator().getPackOutput())); } } @Override - protected void registerStatesAndModels() { - for (MaterialDefinition material : MaterialCatalogue.ALL) { + public CompletableFuture run(CachedOutput cache) { + writes.clear(); + for (var material : MaterialCatalogue.ALL) { if (!material.hasOre()) continue; - Block block = ModContent.blocksById().get(material.name() + "_ore").get(); - String host = "stone"; - if (material.name().equals("adamantine") || material.name().equals("coldiron")) { - host = "netherrack"; - } else if (material.name().equals("starsteel")) { - host = "end_stone"; - } - - createOverlayOre(block, mcLoc("block/" + host), - modLoc("block/ore_overlays/" + material.name() + "_ore")); + String host = switch (material.name()) { + case "adamantine", "coldiron" -> "netherrack"; + case "starsteel" -> "end_stone"; + default -> "stone"; + }; + createOverlayOre(cache, ModContent.blocksById().get(material.name() + "_ore").get(), + Identifier.withDefaultNamespace("block/" + host), + Identifier.fromNamespaceAndPath("basemetals", "block/ore_overlays/" + material.name() + "_ore")); } + + return CompletableFuture.allOf(writes.toArray(CompletableFuture[]::new)); } - private void createOverlayOre(Block block, ResourceLocation baseTexture, ResourceLocation overlayTexture) { + private void createOverlayOre(CachedOutput cache, Block block, Identifier baseTexture, Identifier overlayTexture) { String blockName = ForgeRegistries.BLOCKS.getKey(block).getPath(); + JsonObject textures = object("particle", baseTexture, "base", baseTexture, "overlay", overlayTexture); + JsonArray elements = new JsonArray(); + elements.add(cube(0, 16, "#base")); + // Keep the overlay clear of the host, including distant mip levels. + elements.add(cube(-OVERLAY_OFFSET, 16 + OVERLAY_OFFSET, "#overlay")); - BlockModelBuilder builder = models().withExistingParent(blockName, mcLoc("block/block")) - .texture("particle", baseTexture) - .texture("base", baseTexture) - .texture("overlay", overlayTexture) - .element() - .from(0, 0, 0) - .to(16, 16, 16) - .allFaces((direction, face) -> face.texture("#base").cullface(direction)) - .end() - // Keep the overlay clear of the host, including distant mip levels. - .element() - .from(-OVERLAY_OFFSET, -OVERLAY_OFFSET, -OVERLAY_OFFSET) - .to(16 + OVERLAY_OFFSET, 16 + OVERLAY_OFFSET, 16 + OVERLAY_OFFSET) - .allFaces((direction, face) -> face.texture("#overlay").cullface(direction)) - .end(); + JsonObject model = object("parent", "minecraft:block/block", "textures", textures, "elements", elements); + writes.add(DataProvider.saveStable(cache, model, + output.resolve("assets/basemetals/models/block/" + blockName + ".json"))); + writes.add(DataProvider.saveStable(cache, + object("variants", object("", object("model", "basemetals:block/" + blockName))), + output.resolve("assets/basemetals/blockstates/" + blockName + ".json"))); + } + + private static JsonObject cube(float from, float to, String texture) { + JsonArray start = new JsonArray(); + JsonArray end = new JsonArray(); + for (int axis = 0; axis < 3; axis++) { + start.add(from); + end.add(to); + } + + JsonObject faces = new JsonObject(); + for (String direction : List.of("down", "up", "north", "south", "west", "east")) { + faces.add(direction, object("texture", texture, "cullface", direction)); + } + + return object("from", start, "to", end, "faces", faces); + } - simpleBlock(block, builder); + @Override + public String getName() { + return "Base Metals ore overlays"; } } diff --git a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BaseMetalsDataGenerators.java b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BaseMetalsDataGenerators.java index b3c145130..a741b2b55 100644 --- a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BaseMetalsDataGenerators.java +++ b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/BaseMetalsDataGenerators.java @@ -1,234 +1,248 @@ package zone.moddev.mc.basemetals.data; -import zone.moddev.mc.basemetals.BaseMetals; - -import net.minecraft.core.Direction; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import net.minecraft.core.component.DataComponents; +import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.loaders.DynamicFluidContainerModelBuilder; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.*; import net.minecraftforge.data.event.GatherDataEvent; - -import zone.moddev.mc.basemetals.content.CompatibilityDoubleSlabBlock; -import zone.moddev.mc.basemetals.content.BaseMetalAnvilBlock; -import zone.moddev.mc.basemetals.content.HumanDetectorBlock; -import zone.moddev.mc.basemetals.content.ModContent; -import zone.moddev.mc.basemetals.content.PlateBlock; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import zone.moddev.mc.basemetals.BaseMetals; +import zone.moddev.mc.basemetals.content.*; import zone.moddev.mc.basemetals.material.MaterialCatalogue; -import net.minecraft.world.level.block.AnvilBlock; -import net.minecraft.world.level.block.ButtonBlock; -import net.minecraft.world.level.block.DoorBlock; -import net.minecraft.world.level.block.IronBarsBlock; -import net.minecraft.world.level.block.LeverBlock; -import net.minecraft.world.level.block.LiquidBlock; -import net.minecraft.world.level.block.PressurePlateBlock; -import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.level.block.StairBlock; -import net.minecraft.world.level.block.TrapDoorBlock; -import net.minecraft.world.level.block.WallBlock; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - +/** Material-independent shapes are shared templates; item definitions use native model properties. */ @Mod.EventBusSubscriber(modid = BaseMetals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) -public final class BaseMetalsDataGenerators { - private BaseMetalsDataGenerators() {} +public final class BaseMetalsDataGenerators implements DataProvider { + private final Path output; + private final List> writes = new ArrayList<>(); + + private BaseMetalsDataGenerators(PackOutput output) { + this.output = output.getOutputFolder(); + } @SubscribeEvent public static void gather(GatherDataEvent event) { DataGenerator generator = event.getGenerator(); if (event.includeClient()) { - generator.addProvider(true, new States(generator.getPackOutput(), event.getExistingFileHelper())); - generator.addProvider(true, new Items(generator.getPackOutput(), event.getExistingFileHelper())); + generator.addProvider(true, new BaseMetalsDataGenerators(generator.getPackOutput())); } generator.addProvider(true, new GeneratedData(generator.getPackOutput())); } - private static final class States extends BlockStateProvider { - private States(net.minecraft.data.PackOutput generator, ExistingFileHelper helper) { - super(generator, BaseMetals.MOD_ID, helper); - } + @Override + public CompletableFuture run(CachedOutput cache) { + writes.clear(); - @Override - protected void registerStatesAndModels() { - ModContent.blocksById().forEach((id, object) -> { - net.minecraft.world.level.block.Block block = object.get(); - if (block instanceof LiquidBlock || id.endsWith("_ore")) return; - if (block instanceof PlateBlock) { - plateBlock(block, existing(id)); - } else if (block instanceof IronBarsBlock bars) { - barsBlock(bars, id); - } else if (block instanceof DoorBlock door) { - doorBlock(door, modLoc("block/" + id + "_lower"), modLoc("block/" + id + "_upper")); - } else if (block instanceof TrapDoorBlock trapdoor) { - trapdoorBlock(trapdoor, existing(id + "_bottom"), existing(id + "_top"), - existing(id + "_open"), true); - } else if (block instanceof ButtonBlock button) { - buttonBlock(button, existing(id), existing(id + "_pressed")); - } else if (block instanceof SlabBlock slab) { - String base = id.startsWith("double_") ? id.substring(7, id.length() - 5) : id.substring(0, id.length() - 5); - slabBlock(slab, existing("half_slab_" + base), existing("upper_slab_" + base), - fullBlockModel(base)); - } else if (block instanceof PressurePlateBlock plate) { - pressurePlateBlock(plate, existing(id + "_up"), existing(id + "_down")); - } else if (block instanceof StairBlock stairs) { - stairsBlock(stairs, existing(id), existing(baseName(id) + "_inner_stairs"), - existing(baseName(id) + "_outer_stairs")); - } else if (block instanceof WallBlock wall) { - wallBlock(wall, existing(id + "_post"), existing(id + "_side"), - models().wallSideTall(id + "_side_tall", fullBlockTexture(id.substring(0, id.length() - 5)))); - } else if (block instanceof LeverBlock lever) { - getVariantBuilder(lever).forAllStates(state -> ConfiguredModel.builder() - .modelFile(existing(state.getValue(BlockStateProperties.POWERED) ? id : id + "_off")).build()); - } else if (block instanceof HumanDetectorBlock detector) { - pressurePlateBlock(detector, existing("human_detector_up"), existing("human_detector_down")); - } else if (block instanceof BaseMetalAnvilBlock anvil) { - getVariantBuilder(anvil).forAllStates(state -> ConfiguredModel.builder() - .modelFile(existing(id + switch (state.getValue(BaseMetalAnvilBlock.DAMAGE)) { - case 0 -> "_undamaged"; - case 1 -> "_slightly_damaged"; - default -> "_very_damaged"; - })) - .rotationY(switch (state.getValue(AnvilBlock.FACING)) { - case SOUTH -> 0; - case WEST -> 90; - case NORTH -> 180; - case EAST -> 270; - default -> 0; - }).build()); - } else { - simpleBlock(block, existing(id)); - } - }); + try { + writeBlockAssets(cache); + writeItemAssets(cache); + writeEquipment(cache); + } catch (IOException exception) { + return CompletableFuture.failedFuture(exception); } - private void plateBlock(net.minecraft.world.level.block.Block block, ModelFile model) { - getVariantBuilder(block).forAllStates(state -> { - Direction facing = state.getValue(PlateBlock.FACING); - int x = switch (facing) { - case DOWN -> 90; - case UP -> 270; - default -> 0; - }; - int y = switch (facing) { - case EAST -> 90; - case SOUTH -> 180; - case WEST -> 270; - default -> 0; - }; - return ConfiguredModel.builder() - .modelFile(model) - .rotationX(x) - .rotationY(y) - .build(); - }); - } + return CompletableFuture.allOf(writes.toArray(CompletableFuture[]::new)); + } - private ModelFile existing(String name) { - return models().getExistingFile(modLoc("block/" + name)); + private void writeBlockAssets(CachedOutput cache) throws IOException { + for (var entry : ModContent.blocksById().entrySet()) { + String id = entry.getKey(); + Block block = entry.getValue().get(); + if (block instanceof LiquidBlock || id.endsWith("_ore")) continue; + + String shape = block instanceof PlateBlock ? "plate" + : block instanceof IronBarsBlock ? "bars" + : block instanceof DoorBlock ? "door" + : block instanceof TrapDoorBlock ? "trapdoor" + : block instanceof ButtonBlock ? "button" + : block instanceof SlabBlock ? "slab" + : block instanceof HumanDetectorBlock ? "human_detector" + : block instanceof PressurePlateBlock ? "pressure_plate" + : block instanceof StairBlock ? "stairs" + : block instanceof WallBlock ? "wall" + : block instanceof LeverBlock ? "lever" + : block instanceof BaseMetalAnvilBlock ? "anvil" : "block"; + String material = id.startsWith("double_") ? id.substring(7, id.length() - 5) + : shape.equals("human_detector") ? "" : id.substring(0, id.length() - shape.length() - 1); + + save(cache, template("blockstates/" + shape, material, id), + "blockstates/" + id + ".json"); + + if (shape.equals("door")) { + for (String half : List.of("bottom", "top")) { + for (String side : List.of("left", "right")) { + for (String open : List.of("", "_open")) { + String part = "door_" + half + "_" + side + open; + save(cache, template("block/" + part, material, id), + "models/block/" + material + "_" + part + ".json"); + } + } + } + } else if (shape.equals("wall") || shape.equals("bars")) { + String part = shape.equals("wall") ? "wall_side_tall" : "bars_post_ends"; + save(cache, template("block/" + part, material, id), + "models/block/" + material + "_" + part + ".json"); + } } + } - private ModelFile fullBlockModel(String material) { - return MaterialCatalogue.BY_NAME.containsKey(material) - ? existing(material + "_block") - : models().getExistingFile(mcLoc("block/" + (material.equals("obsidian") - ? "obsidian" : material + "_block"))); - } + private static JsonObject template(String name, String material, String id) throws IOException { + try (InputStream stream = BaseMetalsDataGenerators.class.getResourceAsStream( + "/datagen/templates/" + name + ".json")) { + if (stream == null) throw new IOException("Missing model template " + name); + + String fullBlock = name.equals("blockstates/block") || MaterialCatalogue.BY_NAME.containsKey(material) + ? "basemetals:block/" + material + "_block" + : "minecraft:block/" + (material.equals("obsidian") ? "obsidian" : material + "_block"); + if (name.equals("block/wall_side_tall") && material.equals("quartz")) { + fullBlock = "minecraft:block/quartz_block_side"; + } + String json = new String(stream.readAllBytes(), StandardCharsets.UTF_8) + .replace("basemetals:block/copper_block", fullBlock) + .replace("copper", material).replace("steel_anvil", id); - private net.minecraft.resources.ResourceLocation fullBlockTexture(String material) { - return MaterialCatalogue.BY_NAME.containsKey(material) - ? modLoc("block/" + material + "_block") - : mcLoc("block/" + switch (material) { - case "obsidian" -> "obsidian"; - case "quartz" -> "quartz_block_side"; - default -> material + "_block"; - }); + return JsonParser.parseString(json).getAsJsonObject(); } + } - private void barsBlock(IronBarsBlock bars, String id) { - var ends = models().getBuilder(id + "_post_ends").ao(false) - .texture("particle", modLoc("block/" + id)) - .texture("edge", modLoc("block/" + id)); + private void writeItemAssets(CachedOutput cache) throws IOException { + for (var entry : ModContent.itemsById().entrySet()) { + String id = entry.getKey(); + var item = entry.getValue().get(); + + if (id.endsWith("_raw") || id.endsWith("_blend") || id.endsWith("_smallblend")) { + String texture = id.endsWith("_smallblend") ? id.replace("_smallblend", "_smallpowder") + : id.endsWith("_blend") ? id.replace("_blend", "_powder") : id; + if (id.endsWith("_raw") || id.startsWith("diamond_") || id.startsWith("gold_") || id.startsWith("iron_")) { + save(cache, object("parent", "minecraft:item/generated", + "textures", object("layer0", "basemetals:item/" + texture)), + "models/item/" + id + ".json"); + } + } - for (float height : new float[] {0.001F, 15.999F}) { - ends.element().from(7, height, 7).to(9, height, 9) - .face(Direction.DOWN).uvs(7, 7, 9, 9).texture("#edge").end() - .face(Direction.UP).uvs(7, 7, 9, 9).texture("#edge").end() - .end(); + JsonObject model = model(id); + if (item instanceof MaterialItems.Bow || item instanceof MaterialItems.Crossbow) { + JsonArray entries = new JsonArray(); + entries.add(object("threshold", 0.65, "model", model(id + "_pulling_1"))); + entries.add(object("threshold", 0.9, "model", model(id + "_pulling_2"))); + JsonObject draw = object("type", "minecraft:range_dispatch", "property", "minecraft:use_duration", + "scale", 0.05, "fallback", model(id + "_pulling_0"), "entries", entries); + model = condition("minecraft:using_item", draw, model); + } else if (item instanceof MaterialItems.FishingRod) { + model = condition("minecraft:fishing_rod/cast", model(id + "_cast"), model); + } else if (item instanceof MaterialItems.Shield) { + model = condition("minecraft:using_item", model(id + "_blocking"), model); } - var properties = java.util.Map.of( - Direction.NORTH, BlockStateProperties.NORTH, - Direction.EAST, BlockStateProperties.EAST, - Direction.SOUTH, BlockStateProperties.SOUTH, - Direction.WEST, BlockStateProperties.WEST); - var directions = java.util.List.of(Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST); - var builder = getMultipartBuilder(bars); - builder.part().modelFile(ends).addModel().end(); - - // Iron bars use a centre post only when isolated, and a cap only at a loose end. - // The generic pane layout draws these faces over the connecting sides. - var isolatedPost = builder.part().modelFile(existing(id + "_post")).addModel(); - for (Direction direction : directions) { - isolatedPost.condition(properties.get(direction), false); + if (ModContent.fluids().containsKey(id)) { + String texture = id.equals("mercury") ? "mercury_still" : "molten_metal_still"; + save(cache, object("parent", "minecraft:item/generated", + "textures", object("layer0", "basemetals:block/" + texture)), + "models/item/" + id + ".json"); } - isolatedPost.end(); - for (Direction direction : directions) { - boolean alternate = direction == Direction.SOUTH || direction == Direction.WEST; - int rotation = direction.getAxis() == Direction.Axis.X ? 90 : 0; - var cap = builder.part().modelFile(existing(id + (alternate ? "_cap_alt" : "_cap"))) - .rotationY(rotation).addModel(); + if (id.endsWith("_bucket")) { + String fluidName = id.substring(0, id.length() - 7); + + // Keep the bucket and its fluid on one atlas. The aliases still use resource-pack textures. + save(cache, object("parent", "forge:item/bucket", "fluid", "basemetals:" + fluidName, + "loader", "forge:fluid_container", "textures", object( + "base", "basemetals:block/bucket_base", + "fluid", "basemetals:block/bucket_fluid", + "cover", "basemetals:block/bucket_cover", + "particle", "#base")), "models/item/" + id + ".json"); + int colour = ((MetalFluidType) ModContent.fluids().get(fluidName) + .source().get().getFluidType()).colour(); + JsonArray tints = new JsonArray(); + tints.add(object("type", "minecraft:constant", "value", -1)); + tints.add(object("type", "minecraft:constant", "value", 0xFF000000 | colour)); + tints.add(object("type", "minecraft:constant", "value", -1)); + model.add("tints", tints); + } - for (Direction connection : directions) { - cap.condition(properties.get(connection), connection == direction); - } - cap.end(); + save(cache, object("model", model), "items/" + id + ".json"); + } + } - builder.part().modelFile(existing(id + (alternate ? "_side_alt" : "_side"))) - .rotationY(rotation).addModel() - .condition(properties.get(direction), true).end(); + private void writeEquipment(CachedOutput cache) throws IOException { + var materials = new java.util.TreeSet(); + for (var entry : ModContent.itemsById().values()) { + if (entry.get() instanceof MaterialItems.Armor armor) { + materials.add(armor.baseMetalsMaterial().name()); } } - private static String baseName(String stairs) { - return stairs.substring(0, stairs.length() - "_stairs".length()); + for (String material : materials) { + JsonArray humanoid = new JsonArray(); + humanoid.add(object("texture", "basemetals:" + material)); + JsonArray leggings = new JsonArray(); + leggings.add(object("texture", "basemetals:" + material)); + JsonArray horse = new JsonArray(); + horse.add(object("texture", "basemetals:" + material)); + save(cache, object("layers", object("humanoid", humanoid, + "humanoid_leggings", leggings, "horse_body", horse)), + "equipment/" + material + ".json"); + + copyTexture(cache, "models/armor/" + material + "_layer_1.png", + "entity/equipment/humanoid/" + material + ".png"); + copyTexture(cache, "models/armor/" + material + "_layer_2.png", + "entity/equipment/humanoid_leggings/" + material + ".png"); + copyTexture(cache, "entity/horse/armor/horse_armor_" + material + ".png", + "entity/equipment/horse_body/" + material + ".png"); } } - /** Models for the few new/forwarded IDs not already present in the 1.12 assets. */ - private static final class Items extends ItemModelProvider { - private Items(net.minecraft.data.PackOutput generator, ExistingFileHelper helper) { - super(generator, BaseMetals.MOD_ID, helper); - } + private void copyTexture(CachedOutput cache, String source, String destination) throws IOException { + Path root = Path.of(System.getProperty("basemetals.projectDir")); + byte[] bytes = Files.readAllBytes(root.resolve("src/main/resources/assets/basemetals/textures/" + source)); + cache.writeIfNeeded(output.resolve("assets/basemetals/textures/" + destination), + bytes, com.google.common.hash.Hashing.sha1().hashBytes(bytes)); + } - @Override - protected void registerModels() { - MaterialCatalogue.ALL.stream().filter(material -> material.hasOre() && !material.name().equals("copper")) - .forEach(material -> basicFromTexture(material.name() + "_raw", material.name() + "_raw")); - for (String material : java.util.List.of("diamond", "gold", "iron")) { - basicFromTexture(material + "_blend", material + "_powder"); - basicFromTexture(material + "_smallblend", material + "_smallpowder"); - } + private static JsonObject model(String id) { + return object("type", "minecraft:model", "model", "basemetals:item/" + id); + } - ModContent.fluids().forEach((name, fluid) -> getBuilder(name + "_bucket") - .parent(getExistingFile(net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("forge", "item/bucket"))) - .customLoader(DynamicFluidContainerModelBuilder::begin) - .fluid(fluid.source().get())); + private static JsonObject condition(String property, JsonObject yes, JsonObject no) { + return object("type", "minecraft:condition", "property", property, "on_true", yes, "on_false", no); + } - ModContent.fluids().forEach((name, fluid) -> getBuilder(name) - .parent(getExistingFile(mcLoc("item/generated"))) - .texture("layer0", modLoc("block/" + (name.equals("mercury") - ? "mercury_still" : "molten_metal_still")))); - } + private void save(CachedOutput cache, JsonObject json, String path) { + writes.add(DataProvider.saveStable(cache, json, output.resolve("assets/basemetals/" + path))); + } - private void basicFromTexture(String id, String texture) { - getBuilder(id).parent(getExistingFile(mcLoc("item/generated"))) - .texture("layer0", modLoc("item/" + texture)); + static JsonObject object(Object... entries) { + JsonObject result = new JsonObject(); + for (int index = 0; index < entries.length; index += 2) { + String name = (String) entries[index]; + Object value = entries[index + 1]; + if (value instanceof com.google.gson.JsonElement json) result.add(name, json); + else if (value instanceof Number number) result.addProperty(name, number); + else if (value instanceof Boolean bool) result.addProperty(name, bool); + else result.addProperty(name, value.toString()); } + + return result; + } + + @Override + public String getName() { + return "Base Metals block and equipment assets"; } } diff --git a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java index 7191e70c6..b2eb923fe 100644 --- a/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java +++ b/src/dataGenerator/java/zone/moddev/mc/basemetals/data/GeneratedData.java @@ -26,17 +26,13 @@ import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; import net.minecraft.data.CachedOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ArmorItem; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.BowItem; -import net.minecraft.world.item.DiggerItem; import net.minecraft.world.item.FishingRodItem; import net.minecraft.world.item.HoeItem; -import net.minecraft.world.item.PickaxeItem; import net.minecraft.world.item.ShearsItem; import net.minecraft.world.item.ShovelItem; -import net.minecraft.world.item.SwordItem; /** Small catalogue-driven generator for server data and compatibility manifests. */ final class GeneratedData implements DataProvider { @@ -71,6 +67,7 @@ final class GeneratedData implements DataProvider { private final Path output; private final Path legacyReference; private final List> pendingWrites = new ArrayList<>(); + private final Map scheduledResources = new LinkedHashMap<>(); GeneratedData(net.minecraft.data.PackOutput generator) { this.output = generator.getOutputFolder(); @@ -80,6 +77,7 @@ final class GeneratedData implements DataProvider { @Override public java.util.concurrent.CompletableFuture run(CachedOutput cache) { pendingWrites.clear(); + scheduledResources.clear(); try { writeFluidBlockstates(cache); writeLoot(cache); @@ -278,13 +276,13 @@ private void writeEnchantmentTags(CachedOutput cache) throws IOException { var item = registered.get(); String name = "basemetals:" + id; - if (item instanceof SwordItem) addAggregate(families, "swords", name); + if (item instanceof zone.moddev.mc.basemetals.content.MaterialItems.Sword) addAggregate(families, "swords", name); if (item instanceof AxeItem) addAggregate(families, "axes", name); - if (item instanceof PickaxeItem) addAggregate(families, "pickaxes", name); + if (item instanceof zone.moddev.mc.basemetals.content.MaterialItems.Pickaxe) addAggregate(families, "pickaxes", name); if (item instanceof ShovelItem) addAggregate(families, "shovels", name); if (item instanceof HoeItem) addAggregate(families, "hoes", name); - if (item instanceof DiggerItem) { + if (item instanceof zone.moddev.mc.basemetals.content.CrackhammerItem || item instanceof zone.moddev.mc.basemetals.content.ScytheItem || item instanceof zone.moddev.mc.basemetals.content.MaterialItems.Pickaxe || item instanceof AxeItem || item instanceof ShovelItem || item instanceof HoeItem) { addAggregate(families, "enchantable/mining", name); addAggregate(families, "enchantable/mining_loot", name); } else if (item instanceof ShearsItem) { @@ -298,12 +296,12 @@ private void writeEnchantmentTags(CachedOutput cache) throws IOException { if (item instanceof FishingRodItem) addAggregate(families, "enchantable/fishing", name); if (item.getDefaultInstance().isDamageableItem()) addAggregate(families, "enchantable/durability", name); - if (item instanceof ArmorItem armor) { - String family = switch (armor.getType()) { - case HELMET -> "head_armor"; - case CHESTPLATE -> "chest_armor"; - case LEGGINGS -> "leg_armor"; - case BOOTS -> "foot_armor"; + if (item instanceof zone.moddev.mc.basemetals.content.MaterialItems.Armor) { + String family = switch (item.components().get(net.minecraft.core.component.DataComponents.EQUIPPABLE).slot()) { + case HEAD -> "head_armor"; + case CHEST -> "chest_armor"; + case LEGS -> "leg_armor"; + case FEET -> "foot_armor"; default -> null; }; if (family != null) addAggregate(families, family, name); @@ -413,7 +411,7 @@ private void writeHarvestTierTags(CachedOutput cache) throws IOException { if (level < 1) return; content.blocks().values().stream() .map(net.minecraftforge.registries.RegistryObject::getId) - .map(ResourceLocation::toString) + .map(Identifier::toString) .forEach(byTier.get(level)::add); }); Map vanillaLevels = Map.of( @@ -438,13 +436,16 @@ private void writeHarvestTierTags(CachedOutput cache) throws IOException { } private void writeCompatibilityTags(CachedOutput cache) throws IOException { + tag(cache, "minecraft", "item/copper_tool_materials", List.of("#forge:ingots/copper")); + tag(cache, "minecraft", "item/repairs_copper_armor", List.of("#forge:ingots/copper")); + for (var entry : VanillaCopper.equivalents().entrySet()) { if (entry.getKey().endsWith("_ingot") || entry.getKey().endsWith("_block")) continue; String tag = VanillaCopper.ingredientTag(entry.getKey()).substring("forge:".length()); tag(cache, "forge", "item/" + tag, List.of(entry.getKey(), entry.getValue())); - if (!entry.getKey().endsWith("_ingot")) { + if (ModContent.blocksById().containsKey(entry.getKey().substring("basemetals:".length()))) { tag(cache, "forge", "block/" + tag, List.of(entry.getKey(), entry.getValue())); } } @@ -1613,7 +1614,7 @@ private void writeManifest(CachedOutput cache) throws IOException { JsonObject root = new JsonObject(); root.addProperty("format", 1); - root.addProperty("source", "Base Metals 1.21.1 catalogue"); + root.addProperty("source", "Base Metals 1.21.11 catalogue"); root.add("blocks", array(blocks)); root.add("items", array(items)); root.add("fluids", array(ModContent.fluids().keySet().stream().flatMap(id -> @@ -1654,7 +1655,16 @@ private void blockTag(CachedOutput cache, String family, String material, List values) throws IOException { - JsonObject root = new JsonObject(); root.addProperty("replace", false); root.add("values", array(values)); + var compatible = new java.util.TreeSet<>(values); + for (String value : values) { + if (namespace.equals("forge") && !value.startsWith("#")) { + compatible.add(VanillaCopper.output(value)); + } + } + + JsonObject root = new JsonObject(); + root.addProperty("replace", false); + root.add("values", array(List.copyOf(compatible))); save(cache, root, "data/" + namespace + "/tags/" + path + ".json"); } private void uncheckedTag(CachedOutput cache, String namespace, String path, List values) { @@ -1788,7 +1798,7 @@ private void save(CachedOutput cache, JsonObject value, String relative) throws String id = relative.substring("data/basemetals/recipe/".length(), relative.length() - 5); String result = value.getAsJsonObject("result").get("item").getAsString(); net.minecraft.world.item.Item item = net.minecraftforge.registries.ForgeRegistries.ITEMS - .getValue(ResourceLocation.parse(result)); + .getValue(Identifier.parse(result)); String category = switch (zone.moddev.mc.basemetals.ModTabs.category(item)) { case "blocks" -> "building"; case "tools", "combat" -> "equipment"; @@ -1801,7 +1811,15 @@ private void save(CachedOutput cache, JsonObject value, String relative) throws } if (relative.contains("/recipe/")) normalizeRecipeResults(value); if (relative.contains("/advancement/") || relative.contains("/loot_table/")) normalizePredicates(value); - pendingWrites.add(DataProvider.saveStable(cache, value, output.resolve(relative))); + JsonObject previous = scheduledResources.putIfAbsent(relative, value.deepCopy()); + if (previous != null) { + if (!previous.equals(value)) { + throw new IllegalStateException("Conflicting generated resources: " + relative); + } + return; + } + + pendingWrites.add(DataProvider.saveStable(cache, value.deepCopy(), output.resolve(relative))); } private static JsonElement replaceCopperOutputs(JsonElement value) { @@ -1850,6 +1868,9 @@ private static void normalizeRecipeResults(JsonObject json) { } String type = json.has("type") ? json.get("type").getAsString() : ""; if (!type.startsWith("minecraft:") && !type.startsWith("basemetals:")) return; + for (String field : List.of("ingredient", "ingredients", "key", "plate")) { + if (json.has(field)) json.add(field, nativeIngredient(json.get(field))); + } if (!json.has("result")) return; JsonElement result = json.get("result"); @@ -1861,6 +1882,23 @@ private static void normalizeRecipeResults(JsonObject json) { } } + private static JsonElement nativeIngredient(JsonElement value) { + if (value.isJsonArray()) { + JsonArray result = new JsonArray(); + value.getAsJsonArray().forEach(entry -> result.add(nativeIngredient(entry))); + return result; + } + if (!value.isJsonObject()) return value; + + JsonObject object = value.getAsJsonObject(); + if (object.has("item")) return new com.google.gson.JsonPrimitive(object.get("item").getAsString()); + if (object.has("tag")) return new com.google.gson.JsonPrimitive("#" + object.get("tag").getAsString()); + + JsonObject result = new JsonObject(); + object.entrySet().forEach(entry -> result.add(entry.getKey(), nativeIngredient(entry.getValue()))); + return result; + } + private static void normalizePredicates(JsonElement value) { if (value.isJsonArray()) { value.getAsJsonArray().forEach(GeneratedData::normalizePredicates); diff --git a/src/dataGenerator/resources/datagen/templates/block/bars_post_ends.json b/src/dataGenerator/resources/datagen/templates/block/bars_post_ends.json new file mode 100644 index 000000000..694ac280b --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/bars_post_ends.json @@ -0,0 +1,49 @@ +{ + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "texture": "#edge" + }, + "up": { + "texture": "#edge" + } + }, + "from": [ + 7, + 0.001, + 7 + ], + "to": [ + 9, + 0.001, + 9 + ] + }, + { + "faces": { + "down": { + "texture": "#edge" + }, + "up": { + "texture": "#edge" + } + }, + "from": [ + 7, + 15.999, + 7 + ], + "to": [ + 9, + 15.999, + 9 + ] + } + ], + "textures": { + "edge": "basemetals:block/copper_bars", + "particle": "basemetals:block/copper_bars" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_bottom_left.json b/src/dataGenerator/resources/datagen/templates/block/door_bottom_left.json new file mode 100644 index 000000000..1dc4234dc --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_bottom_left_open.json b/src/dataGenerator/resources/datagen/templates/block/door_bottom_left_open.json new file mode 100644 index 000000000..07b6a22fc --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_bottom_right.json b/src/dataGenerator/resources/datagen/templates/block/door_bottom_right.json new file mode 100644 index 000000000..696a49bc2 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_bottom_right_open.json b/src/dataGenerator/resources/datagen/templates/block/door_bottom_right_open.json new file mode 100644 index 000000000..f419fd8b3 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_top_left.json b/src/dataGenerator/resources/datagen/templates/block/door_top_left.json new file mode 100644 index 000000000..c863f823d --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_top_left_open.json b/src/dataGenerator/resources/datagen/templates/block/door_top_left_open.json new file mode 100644 index 000000000..444a522ed --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_top_right.json b/src/dataGenerator/resources/datagen/templates/block/door_top_right.json new file mode 100644 index 000000000..8dfd64abb --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/door_top_right_open.json b/src/dataGenerator/resources/datagen/templates/block/door_top_right_open.json new file mode 100644 index 000000000..6181b954c --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "basemetals:block/copper_door_lower", + "top": "basemetals:block/copper_door_upper" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/block/wall_side_tall.json b/src/dataGenerator/resources/datagen/templates/block/wall_side_tall.json new file mode 100644 index 000000000..57a78e1e8 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/block/wall_side_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_wall_side_tall", + "textures": { + "wall": "basemetals:block/copper_block" + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/anvil.json b/src/dataGenerator/resources/datagen/templates/blockstates/anvil.json new file mode 100644 index 000000000..5bc15a555 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/anvil.json @@ -0,0 +1,49 @@ +{ + "variants": { + "damage=0,facing=east": { + "model": "basemetals:block/steel_anvil_undamaged", + "y": 270 + }, + "damage=0,facing=north": { + "model": "basemetals:block/steel_anvil_undamaged", + "y": 180 + }, + "damage=0,facing=south": { + "model": "basemetals:block/steel_anvil_undamaged" + }, + "damage=0,facing=west": { + "model": "basemetals:block/steel_anvil_undamaged", + "y": 90 + }, + "damage=1,facing=east": { + "model": "basemetals:block/steel_anvil_slightly_damaged", + "y": 270 + }, + "damage=1,facing=north": { + "model": "basemetals:block/steel_anvil_slightly_damaged", + "y": 180 + }, + "damage=1,facing=south": { + "model": "basemetals:block/steel_anvil_slightly_damaged" + }, + "damage=1,facing=west": { + "model": "basemetals:block/steel_anvil_slightly_damaged", + "y": 90 + }, + "damage=2,facing=east": { + "model": "basemetals:block/steel_anvil_very_damaged", + "y": 270 + }, + "damage=2,facing=north": { + "model": "basemetals:block/steel_anvil_very_damaged", + "y": 180 + }, + "damage=2,facing=south": { + "model": "basemetals:block/steel_anvil_very_damaged" + }, + "damage=2,facing=west": { + "model": "basemetals:block/steel_anvil_very_damaged", + "y": 90 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/bars.json b/src/dataGenerator/resources/datagen/templates/blockstates/bars.json new file mode 100644 index 000000000..3d1d18c7a --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/bars.json @@ -0,0 +1,100 @@ +{ + "multipart": [ + { + "apply": { + "model": "basemetals:block/copper_bars_post_ends" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_post" + }, + "when": { + "east": "false", + "north": "false", + "south": "false", + "west": "false" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_cap" + }, + "when": { + "east": "false", + "north": "true", + "south": "false", + "west": "false" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_side" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_cap", + "y": 90 + }, + "when": { + "east": "true", + "north": "false", + "south": "false", + "west": "false" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_side", + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_cap_alt" + }, + "when": { + "east": "false", + "north": "false", + "south": "true", + "west": "false" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_side_alt" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_cap_alt", + "y": 90 + }, + "when": { + "east": "false", + "north": "false", + "south": "false", + "west": "true" + } + }, + { + "apply": { + "model": "basemetals:block/copper_bars_side_alt", + "y": 90 + }, + "when": { + "west": "true" + } + } + ] +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/block.json b/src/dataGenerator/resources/datagen/templates/blockstates/block.json new file mode 100644 index 000000000..f3a3d11d5 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "basemetals:block/copper_block" + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/button.json b/src/dataGenerator/resources/datagen/templates/blockstates/button.json new file mode 100644 index 000000000..e81a3b00d --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "basemetals:block/copper_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "basemetals:block/copper_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "basemetals:block/copper_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "basemetals:block/copper_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "basemetals:block/copper_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "basemetals:block/copper_button" + }, + "face=floor,facing=north,powered=true": { + "model": "basemetals:block/copper_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "basemetals:block/copper_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "basemetals:block/copper_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "basemetals:block/copper_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "basemetals:block/copper_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "basemetals:block/copper_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "basemetals:block/copper_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "basemetals:block/copper_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/door.json b/src/dataGenerator/resources/datagen/templates/blockstates/door.json new file mode 100644 index 000000000..5ce78a611 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "basemetals:block/copper_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "basemetals:block/copper_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "basemetals:block/copper_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "basemetals:block/copper_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "basemetals:block/copper_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "basemetals:block/copper_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "basemetals:block/copper_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "basemetals:block/copper_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "basemetals:block/copper_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "basemetals:block/copper_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "basemetals:block/copper_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "basemetals:block/copper_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "basemetals:block/copper_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "basemetals:block/copper_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "basemetals:block/copper_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "basemetals:block/copper_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "basemetals:block/copper_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "basemetals:block/copper_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "basemetals:block/copper_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "basemetals:block/copper_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "basemetals:block/copper_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "basemetals:block/copper_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "basemetals:block/copper_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "basemetals:block/copper_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "basemetals:block/copper_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "basemetals:block/copper_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "basemetals:block/copper_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "basemetals:block/copper_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "basemetals:block/copper_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "basemetals:block/copper_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "basemetals:block/copper_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "basemetals:block/copper_door_top_right_open", + "y": 90 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/human_detector.json b/src/dataGenerator/resources/datagen/templates/blockstates/human_detector.json new file mode 100644 index 000000000..b921567b9 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/human_detector.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "basemetals:block/human_detector_up" + }, + "powered=true": { + "model": "basemetals:block/human_detector_down" + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/lever.json b/src/dataGenerator/resources/datagen/templates/blockstates/lever.json new file mode 100644 index 000000000..2e9ee70c9 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/lever.json @@ -0,0 +1,76 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=ceiling,facing=east,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=ceiling,facing=north,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=ceiling,facing=north,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=ceiling,facing=south,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=ceiling,facing=south,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=ceiling,facing=west,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=ceiling,facing=west,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=floor,facing=east,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=floor,facing=east,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=floor,facing=north,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=floor,facing=north,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=floor,facing=south,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=floor,facing=south,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=floor,facing=west,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=floor,facing=west,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=wall,facing=east,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=wall,facing=east,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=wall,facing=north,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=wall,facing=north,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=wall,facing=south,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=wall,facing=south,powered=true": { + "model": "basemetals:block/copper_lever" + }, + "face=wall,facing=west,powered=false": { + "model": "basemetals:block/copper_lever_off" + }, + "face=wall,facing=west,powered=true": { + "model": "basemetals:block/copper_lever" + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/plate.json b/src/dataGenerator/resources/datagen/templates/blockstates/plate.json new file mode 100644 index 000000000..c4d8d98c6 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/plate.json @@ -0,0 +1,27 @@ +{ + "variants": { + "facing=down": { + "model": "basemetals:block/copper_plate", + "x": 90 + }, + "facing=east": { + "model": "basemetals:block/copper_plate", + "y": 90 + }, + "facing=north": { + "model": "basemetals:block/copper_plate" + }, + "facing=south": { + "model": "basemetals:block/copper_plate", + "y": 180 + }, + "facing=up": { + "model": "basemetals:block/copper_plate", + "x": 270 + }, + "facing=west": { + "model": "basemetals:block/copper_plate", + "y": 270 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/pressure_plate.json b/src/dataGenerator/resources/datagen/templates/blockstates/pressure_plate.json new file mode 100644 index 000000000..56379721d --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "basemetals:block/copper_pressure_plate_up" + }, + "powered=true": { + "model": "basemetals:block/copper_pressure_plate_down" + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/slab.json b/src/dataGenerator/resources/datagen/templates/blockstates/slab.json new file mode 100644 index 000000000..5235df141 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "basemetals:block/half_slab_copper" + }, + "type=double": { + "model": "basemetals:block/copper_block" + }, + "type=top": { + "model": "basemetals:block/upper_slab_copper" + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/stairs.json b/src/dataGenerator/resources/datagen/templates/blockstates/stairs.json new file mode 100644 index 000000000..3cdf22cd1 --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs" + }, + "facing=east,half=bottom,shape=straight": { + "model": "basemetals:block/copper_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "basemetals:block/copper_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "basemetals:block/copper_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "basemetals:block/copper_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/trapdoor.json b/src/dataGenerator/resources/datagen/templates/blockstates/trapdoor.json new file mode 100644 index 000000000..53849fadb --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "basemetals:block/copper_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "basemetals:block/copper_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "basemetals:block/copper_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "basemetals:block/copper_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "basemetals:block/copper_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "basemetals:block/copper_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "basemetals:block/copper_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "basemetals:block/copper_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "basemetals:block/copper_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "basemetals:block/copper_trapdoor_open", + "x": 180, + "y": 90 + } + } +} diff --git a/src/dataGenerator/resources/datagen/templates/blockstates/wall.json b/src/dataGenerator/resources/datagen/templates/blockstates/wall.json new file mode 100644 index 000000000..f912646aa --- /dev/null +++ b/src/dataGenerator/resources/datagen/templates/blockstates/wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "apply": { + "model": "basemetals:block/copper_wall_post" + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "low" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side_tall", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "tall" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side", + "uvlock": true + }, + "when": { + "north": "low" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side_tall", + "uvlock": true + }, + "when": { + "north": "tall" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "low" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side_tall", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "tall" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "low" + } + }, + { + "apply": { + "model": "basemetals:block/copper_wall_side_tall", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "tall" + } + } + ] +} diff --git a/src/gametest/java/zone/moddev/mc/basemetals/GameTestRegistration.java b/src/gametest/java/zone/moddev/mc/basemetals/GameTestRegistration.java new file mode 100644 index 000000000..3ba3bbabf --- /dev/null +++ b/src/gametest/java/zone/moddev/mc/basemetals/GameTestRegistration.java @@ -0,0 +1,63 @@ +package zone.moddev.mc.basemetals; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Locale; + +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.resources.Identifier; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.gametest.GameTest; +import net.minecraftforge.registries.RegisterEvent; +import zone.moddev.mc.basemetals.compat.CompatibilityRecipeGameTests; +import zone.moddev.mc.basemetals.content.BaseMetalsGameTests; +import zone.moddev.mc.basemetals.content.ForwardPortGameTests; +import zone.moddev.mc.basemetals.content.NativeComponentGameTests; +import zone.moddev.mc.basemetals.migration.MigrationGameTests; + +/** Registers the isolated tests in Minecraft's native test-function registry. */ +@Mod.EventBusSubscriber(modid = BaseMetals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public final class GameTestRegistration { + private GameTestRegistration() {} + + @SubscribeEvent + public static void register(RegisterEvent event) { + event.register(Registries.TEST_FUNCTION, registry -> { + NativeComponentGameTests.registerCapabilityProbe(); + int count = 0; + + for (Class testClass : List.of(BaseMetalsGameTests.class, ForwardPortGameTests.class, + NativeComponentGameTests.class, MigrationGameTests.class, CompatibilityRecipeGameTests.class)) { + for (Method method : testClass.getDeclaredMethods()) { + if (!method.isAnnotationPresent(GameTest.class)) continue; + + String name = method.getName().replaceAll("([A-Z])", "_$1").toLowerCase(Locale.ROOT); + registry.register(Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, name), + helper -> run(method, helper)); + count++; + } + } + + if (count != 46) { + throw new IllegalStateException("Expected 46 Base Metals GameTests, found " + count); + } + }); + } + + private static void run(Method method, GameTestHelper helper) { + try { + method.invoke(null, helper); + } catch (InvocationTargetException exception) { + Throwable cause = exception.getCause(); + if (cause instanceof RuntimeException failure) throw failure; + if (cause instanceof Error failure) throw failure; + + throw new IllegalStateException("GameTest failed: " + method.getName(), cause); + } catch (ReflectiveOperationException exception) { + throw new IllegalStateException("Could not invoke GameTest " + method.getName(), exception); + } + } +} diff --git a/src/gametest/java/zone/moddev/mc/basemetals/compat/CompatibilityRecipeGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/compat/CompatibilityRecipeGameTests.java index b71f94bf1..48337cb14 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/compat/CompatibilityRecipeGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/compat/CompatibilityRecipeGameTests.java @@ -2,31 +2,31 @@ import zone.moddev.mc.basemetals.BaseMetals; -import net.minecraft.gametest.framework.GameTest; +import net.minecraftforge.gametest.GameTest; import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.gametest.GameTestDontPrefix; import net.minecraftforge.fml.ModList; /** Proves optional-mod serializers accept every packaged compatibility recipe. */ -@GameTestHolder(value = BaseMetals.MOD_ID, namespace = BaseMetals.MOD_ID) +@GameTestNamespace(BaseMetals.MOD_ID) @GameTestDontPrefix public final class CompatibilityRecipeGameTests { - private static final String EMPTY = "empty"; + private static final String EMPTY = "basemetals:empty"; private CompatibilityRecipeGameTests() {} - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void thermalRecipesLoadWhenInstalled(GameTestHelper helper) { requireRecipeCount(helper, "thermal_expansion", "thermal", 130L); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void tinkersConstructRecipesLoadWhenInstalled(GameTestHelper helper) { requireRecipeCount(helper, "tconstruct", "tconstruct", 472L); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void enderIoRecipesLoadWhenInstalled(GameTestHelper helper) { requireRecipeCount(helper, "enderio", "enderio", 44L); } @@ -39,9 +39,9 @@ private static void requireRecipeCount(GameTestHelper helper, String modId, } String pathPrefix = "compat/" + recipeFolder + "/"; - long actual = helper.getLevel().getRecipeManager().getRecipes().stream() - .filter(recipe -> recipe.id().getNamespace().equals(BaseMetals.MOD_ID)) - .filter(recipe -> recipe.id().getPath().startsWith(pathPrefix)) + long actual = helper.getLevel().getServer().getRecipeManager().getRecipes().stream() + .filter(recipe -> recipe.id().identifier().getNamespace().equals(BaseMetals.MOD_ID)) + .filter(recipe -> recipe.id().identifier().getPath().startsWith(pathPrefix)) .count(); if (actual != expected) { helper.fail("Expected " + expected + " live " + modId diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java index 4a1f20b96..e736800f6 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/BaseMetalsGameTests.java @@ -23,12 +23,12 @@ import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.core.Registry; -import net.minecraft.gametest.framework.GameTest; +import net.minecraftforge.gametest.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; @@ -59,8 +59,8 @@ import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.entity.npc.VillagerProfession; -import net.minecraft.world.entity.npc.VillagerTrades.ItemListing; +import net.minecraft.world.entity.npc.villager.VillagerProfession; +import net.minecraft.world.entity.npc.villager.VillagerTrades.ItemListing; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; @@ -77,26 +77,19 @@ import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.village.VillagerTradesEvent; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.gametest.GameTestDontPrefix; import net.minecraftforge.registries.ForgeRegistries; /** Server-lifecycle checks which cannot safely run in a plain JUnit JVM. */ -@GameTestHolder(value = BaseMetals.MOD_ID, namespace = BaseMetals.MOD_ID) +@GameTestNamespace(BaseMetals.MOD_ID) @GameTestDontPrefix public final class BaseMetalsGameTests { - private static final String EMPTY = "empty"; + private static final String EMPTY = "basemetals:empty"; private BaseMetalsGameTests() {} - @net.minecraft.gametest.framework.BeforeBatch(batch = BaseMetals.MOD_ID) - public static void loadServerConfiguration(net.minecraft.server.level.ServerLevel level) { - net.minecraftforge.fml.config.ConfigTracker.INSTANCE.loadConfigs( - net.minecraftforge.fml.config.ModConfig.Type.SERVER, - level.getServer().getWorldPath(new net.minecraft.world.level.storage.LevelResource("serverconfig"))); - } - - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void platesUseTheClickedFaceAndEdge(GameTestHelper helper) { PlateBlock plate = (PlateBlock) ModContent.blocksById().get("copper_plate").get(); Player player = helper.makeMockPlayer(GameType.SURVIVAL); @@ -142,7 +135,7 @@ Direction.WEST, new AABB(15.0D / 16.0D, 0, 0, 1, 1, 1), helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void humanDetectorIgnoresNonPlayers(GameTestHelper helper) { HumanDetectorBlock detector = (HumanDetectorBlock) ModContent.HUMAN_DETECTOR.get(); BlockPos position = helper.absolutePos(new BlockPos(1, 1, 1)); @@ -151,7 +144,7 @@ public static void humanDetectorIgnoresNonPlayers(GameTestHelper helper) { "Human detector responded to a non-player entity"); Player player = helper.makeMockPlayer(GameType.SURVIVAL); - player.moveTo(position.getX() + 0.5D, position.getY() + 0.1D, position.getZ() + 0.5D); + player.snapTo(position.getX() + 0.5D, position.getY() + 0.1D, position.getZ() + 0.5D); helper.getLevel().addFreshEntity(player); require(helper, detector.getSignalStrength(helper.getLevel(), position) == 15, "Human detector did not respond to a player"); @@ -159,30 +152,30 @@ public static void humanDetectorIgnoresNonPlayers(GameTestHelper helper) { helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void compatibilitySlabsStayDoubleAndHidden(GameTestHelper helper) { for (String id : ModContent.hiddenBlocks()) { BlockState state = ModContent.blocksById().get(id).get().defaultBlockState(); require(helper, state.getValue(CompatibilityDoubleSlabBlock.TYPE) == SlabType.DOUBLE, id + " did not default to a double slab"); - require(helper, !ForgeRegistries.ITEMS.containsKey(ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), + require(helper, !ForgeRegistries.ITEMS.containsKey(Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), id + " unexpectedly has a block item"); } helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void everyFluidHasSourceFlowingBlockAndBucket(GameTestHelper helper) { BlockPos position = helper.absolutePos(new BlockPos(2, 1, 2)); ModContent.fluids().forEach((id, fluid) -> { require(helper, ForgeRegistries.FLUIDS.getKey(fluid.source().get()).equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), id + " source fluid is not registered correctly"); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), id + " source fluid is not registered correctly"); require(helper, ForgeRegistries.FLUIDS.getKey(fluid.flowing().get()).equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, "flowing_" + id)), id + " flowing fluid is not registered correctly"); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, "flowing_" + id)), id + " flowing fluid is not registered correctly"); require(helper, ForgeRegistries.BLOCKS.getKey(fluid.block().get()).equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), id + " fluid block is not registered correctly"); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, id)), id + " fluid block is not registered correctly"); require(helper, ForgeRegistries.ITEMS.getKey(fluid.bucket().get()).equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, id + "_bucket")), id + " bucket is not registered correctly"); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, id + "_bucket")), id + " bucket is not registered correctly"); require(helper, fluid.bucket().get() instanceof BaseMetalBucketItem, id + " does not use the visible functional bucket implementation"); @@ -203,7 +196,7 @@ public static void everyFluidHasSourceFlowingBlockAndBucket(GameTestHelper helpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void crushingRecipesLoadAndMatchOre(GameTestHelper helper) { MaterialCatalogue.ALL.stream().filter(material -> material.hasOre()).forEach(material -> assertCrushingRecipe(helper, ModContent.item(material.name() + "_ore").get().getDefaultInstance(), @@ -231,7 +224,7 @@ public static void crushingRecipesLoadAndMatchOre(GameTestHelper helper) { helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void legacyFurnaceRecipesLoadAndRetainCountedOutputs(GameTestHelper helper) { MaterialCatalogue.ALL.forEach(material -> { assertSmeltingRecipeInTag(helper, @@ -267,19 +260,19 @@ public static void legacyFurnaceRecipesLoadAndRetainCountedOutputs(GameTestHelpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void stoneCrackhammerCraftsFromTheLegacyMiddleColumnPattern(GameTestHelper helper) { CraftingContainer crafting = craftingContainer(3, 3); crafting.setItem(1, new ItemStack(Blocks.STONE_BRICKS)); crafting.setItem(4, new ItemStack(Items.STICK)); crafting.setItem(7, new ItemStack(Items.STICK)); - var recipe = helper.getLevel().getRecipeManager().getRecipeFor( + var recipe = helper.getLevel().getServer().getRecipeManager().getRecipeFor( RecipeType.CRAFTING, crafting.asCraftInput(), helper.getLevel()); require(helper, recipe.isPresent(), "Stone bricks above two sticks matched no crafting recipe"); if (recipe.isEmpty()) return; - require(helper, recipe.orElseThrow().id().equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, "stone_crackhammer")), + require(helper, recipe.orElseThrow().id().identifier().equals( + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, "stone_crackhammer")), "The legacy stone crackhammer pattern matched the wrong recipe"); ItemStack output = recipe.orElseThrow().value().assemble(crafting.asCraftInput(), net.minecraft.core.RegistryAccess.EMPTY); require(helper, output.is(ModContent.item("stone_crackhammer").get()), @@ -287,7 +280,7 @@ public static void stoneCrackhammerCraftsFromTheLegacyMiddleColumnPattern(GameTe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY, timeoutTicks = 250) + @GameTest(structure = EMPTY, maxTicks = 250) public static void furnaceProcessesDustAndCountedLegacyRecovery(GameTestHelper helper) { BlockPos ironFurnacePosition = new BlockPos(1, 1, 1); BlockPos recoveryFurnacePosition = new BlockPos(2, 1, 1); @@ -295,12 +288,12 @@ public static void furnaceProcessesDustAndCountedLegacyRecovery(GameTestHelper h helper.setBlock(recoveryFurnacePosition, Blocks.FURNACE); AbstractFurnaceBlockEntity ironFurnace = (AbstractFurnaceBlockEntity) - helper.getBlockEntity(ironFurnacePosition); + helper.getBlockEntity(ironFurnacePosition, AbstractFurnaceBlockEntity.class); ironFurnace.setItem(0, ModContent.item("iron_powder").get().getDefaultInstance()); ironFurnace.setItem(1, new ItemStack(Items.COAL)); AbstractFurnaceBlockEntity recoveryFurnace = (AbstractFurnaceBlockEntity) - helper.getBlockEntity(recoveryFurnacePosition); + helper.getBlockEntity(recoveryFurnacePosition, AbstractFurnaceBlockEntity.class); recoveryFurnace.setItem(0, ModContent.item("tin_crossbow").get().getDefaultInstance()); recoveryFurnace.setItem(1, new ItemStack(Items.COAL)); @@ -313,7 +306,7 @@ public static void furnaceProcessesDustAndCountedLegacyRecovery(GameTestHelper h }); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void crackhammerBreaksOreIntoFixedOutput(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); ItemStack hammer = ModContent.item("stone_crackhammer").get().getDefaultInstance(); @@ -323,17 +316,17 @@ public static void crackhammerBreaksOreIntoFixedOutput(GameTestHelper helper) { helper.setBlock(relativePosition, Blocks.IRON_ORE); BlockState state = helper.getLevel().getBlockState(position); - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(helper.getLevel(), position, state, player); + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(helper.getLevel(), position, state, player, net.minecraftforge.common.util.Result.DEFAULT); new BaseMetalsEvents().onBreak(event); - require(helper, event.isCanceled(), "Crackhammer did not replace the vanilla ore break"); + require(helper, event.getResult().isDenied(), "Crackhammer did not replace the vanilla ore break"); require(helper, helper.getLevel().getBlockState(position).isAir(), "Crackhammer did not remove the ore"); require(helper, hammer.getDamageValue() == 1, "Crackhammer was not damaged exactly once"); requireSingleDrop(helper, position, null, "iron_powder", 2); helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void crackhammerGroundCrushingUsesOneItemPerNormalUse(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); ItemStack hammer = ModContent.item("stone_crackhammer").get().getDefaultInstance(); @@ -357,7 +350,7 @@ public static void crackhammerGroundCrushingUsesOneItemPerNormalUse(GameTestHelp helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void groundHammeringRawMetalsProducesOnePowder(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); BlockPos position = helper.absolutePos(new BlockPos(1, 1, 1)); @@ -390,7 +383,7 @@ public static void groundHammeringRawMetalsProducesOnePowder(GameTestHelper help helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void scytheHarvestsHorizontalThreeByThreeAndPaysDurability(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); ItemStack scythe = ModContent.item("iron_scythe").get().getDefaultInstance(); @@ -420,7 +413,7 @@ public static void scytheHarvestsHorizontalThreeByThreeAndPaysDurability(GameTes helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void legacyToolAttributesAndFuelValuesSurviveThePort(GameTestHelper helper) { var bronze = MaterialCatalogue.get("bronze"); ItemStack hoe = ModContent.item("bronze_hoe").get().getDefaultInstance(); @@ -466,7 +459,7 @@ public static void legacyToolAttributesAndFuelValuesSurviveThePort(GameTestHelpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void crackhammerUsesLegacySpeedForEveryHarvestableCrushingInput(GameTestHelper helper) { ItemStack stoneHammer = ModContent.item("stone_crackhammer").get().getDefaultInstance(); float expected = ((MaterialBacked) stoneHammer.getItem()).baseMetalsMaterial() @@ -482,7 +475,7 @@ public static void crackhammerUsesLegacySpeedForEveryHarvestableCrushingInput(Ga helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void legacyBlockCapabilitiesSoundsAndQuartzInteractionSurvive(GameTestHelper helper) { MaterialCatalogue.ALL.stream().filter(material -> material.hasEquipment()).forEach(material -> require(helper, ModContent.blocksById().get(material.name() + "_block").get() @@ -526,12 +519,12 @@ public static void legacyBlockCapabilitiesSoundsAndQuartzInteractionSurvive(Game helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void customAnvilMenusRemainValidWithoutTheVanillaAnvilTag(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); BlockPos relative = new BlockPos(1, 1, 3); BlockPos position = helper.absolutePos(relative); - player.moveTo(position, 0.0F, 0.0F); + player.snapTo(position, 0.0F, 0.0F); int containerId = 1; for (String id : List.of("stone_anvil", "steel_anvil", "adamantine_anvil")) { @@ -560,14 +553,54 @@ public static void customAnvilMenusRemainValidWithoutTheVanillaAnvilTag(GameTest helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) + public static void customAnvilsWearWithoutChangingTheirSavedIdentity(GameTestHelper helper) { + ServerPlayer player = survivalPlayer(helper); + BlockPos relative = new BlockPos(1, 1, 1); + BlockPos position = helper.absolutePos(relative); + helper.setBlock(relative.below(), Blocks.STONE); + + for (String id : List.of("stone_anvil", "steel_anvil", "adamantine_anvil")) { + var anvil = (BaseMetalAnvilBlock) ModContent.blocksById().get(id).get(); + + for (int damage = 0; damage < 3; damage++) { + BlockState before = anvil.defaultBlockState().setValue(BaseMetalAnvilBlock.DAMAGE, damage); + helper.getLevel().setBlock(position, before, 3); + var menu = anvil.getMenuProvider(before, helper.getLevel(), position) + .createMenu(1, player.getInventory(), player); + ItemStack sword = Items.IRON_SWORD.getDefaultInstance(); + sword.setDamageValue(80); + menu.getSlot(0).set(sword); + menu.getSlot(1).set(Items.IRON_INGOT.getDefaultInstance()); + ItemStack repaired = menu.getSlot(2).getItem().copy(); + require(helper, !repaired.isEmpty(), "No anvil repair result for " + id); + + // Use a known wear roll rather than waiting for a random break. + player.getRandom().setSeed(4096L); + require(helper, player.getRandom().nextFloat() < 0.12F, "The fixed anvil roll changed"); + player.getRandom().setSeed(4096L); + player.experienceLevel = 1000; + menu.getSlot(2).onTake(player, repaired); + + BlockState after = helper.getLevel().getBlockState(position); + require(helper, damage == 2 ? after.isAir() + : after.is(anvil) && after.getValue(BaseMetalAnvilBlock.DAMAGE) == damage + 1, + id + " did not advance its saved damage state from " + damage); + menu.removed(player); + } + } + + helper.succeed(); + } + + @GameTest(structure = EMPTY) public static void smithsRetainTheLegacyMercuryIngotSale(GameTestHelper helper) { Int2ObjectOpenHashMap> trades = new Int2ObjectOpenHashMap<>(); for (int level = 1; level <= 5; level++) trades.put(level, new ArrayList<>()); BaseMetalsTrades.add(new VillagerTradesEvent(trades, VillagerProfession.ARMORER)); - var trader = EntityType.VILLAGER.create(helper.getLevel()); + var trader = EntityType.VILLAGER.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); boolean found = trades.values().stream().flatMap(List::stream) - .map(listing -> listing.getOffer(trader, net.minecraft.util.RandomSource.create(0L))) + .map(listing -> listing.getOffer(helper.getLevel(), trader, net.minecraft.util.RandomSource.create(0L))) .anyMatch(offer -> offer != null && offer.getResult().is(ModContent.item("mercury_ingot").get()) && offer.getResult().getCount() == 12); @@ -575,7 +608,7 @@ public static void smithsRetainTheLegacyMercuryIngotSale(GameTestHelper helper) helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void creativeTabsRetainTheirLegacyStarsteelIcons(GameTestHelper helper) { require(helper, ModTabs.BLOCKS.get().getIconItem().is(ModContent.item("starsteel_block").get()), "Blocks tab did not retain the Starsteel block icon"); @@ -588,10 +621,12 @@ public static void creativeTabsRetainTheirLegacyStarsteelIcons(GameTestHelper he helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void plateRepairKeepsAllItemDataAndResetsDamage(GameTestHelper helper) { - var recipe = helper.getLevel().getRecipeManager().byKey( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, "adamantine_chestplate_plate_repair")); + var recipeKey = net.minecraft.resources.ResourceKey.create( + net.minecraft.core.registries.Registries.RECIPE, + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, "adamantine_chestplate_plate_repair")); + var recipe = helper.getLevel().getServer().getRecipeManager().byKey(recipeKey); require(helper, recipe.isPresent(), "Adamantine chestplate plate-repair recipe did not load"); if (recipe.isEmpty()) return; @@ -618,12 +653,12 @@ public static void plateRepairKeepsAllItemDataAndResetsDamage(GameTestHelper hel enchantment(helper, Enchantments.PROTECTION), output) == 2, "Plate repair lost enchantments"); require(helper, output.has(net.minecraft.core.component.DataComponents.CUSTOM_NAME), "Plate repair lost the custom name"); - require(helper, output.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getBoolean("LegacyCustomData"), + require(helper, output.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getBooleanOr("LegacyCustomData", false), "Plate repair lost custom item data"); helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void shieldUpgradeSupportsVanillaBitsPlatesAndKeepsItemData(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); ItemStack shield = ModContent.item("copper_shield").get().getDefaultInstance(); @@ -652,7 +687,7 @@ public static void shieldUpgradeSupportsVanillaBitsPlatesAndKeepsItemData(GameTe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void bowsAndLegacyCrossbowsUseOnlyTheirOwnAmmunition(GameTestHelper helper) { MaterialItems.Bow bow = (MaterialItems.Bow) ModContent.item("tin_bow").get(); MaterialItems.Crossbow crossbow = (MaterialItems.Crossbow) ModContent.item("tin_crossbow").get(); @@ -670,7 +705,7 @@ public static void bowsAndLegacyCrossbowsUseOnlyTheirOwnAmmunition(GameTestHelpe "Legacy crossbow accepted an arrow"); ServerPlayer player = survivalPlayer(helper); - player.moveTo(helper.absolutePos(new BlockPos(1, 2, 1)), 0.0F, 0.0F); + player.snapTo(helper.absolutePos(new BlockPos(1, 2, 1)), 0.0F, 0.0F); ItemStack weapon = crossbow.getDefaultInstance(); player.setItemInHand(InteractionHand.MAIN_HAND, weapon); player.getInventory().setItem(1, bolt.copy()); @@ -702,7 +737,7 @@ public static void bowsAndLegacyCrossbowsUseOnlyTheirOwnAmmunition(GameTestHelpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void vanillaBitsEquipmentUsesItsActualMaterialForAnvilRepair(GameTestHelper helper) { ItemStack diamondBow = ModContent.item("diamond_bow").get().getDefaultInstance(); ItemStack emeraldSword = ModContent.item("emerald_sword").get().getDefaultInstance(); @@ -710,32 +745,32 @@ public static void vanillaBitsEquipmentUsesItsActualMaterialForAnvilRepair(GameT ItemStack stoneScythe = ModContent.item("stone_scythe").get().getDefaultInstance(); ItemStack woodScythe = ModContent.item("wood_scythe").get().getDefaultInstance(); - require(helper, diamondBow.getItem().isValidRepairItem(diamondBow, new ItemStack(Items.DIAMOND)), + require(helper, diamondBow.isValidRepairItem(new ItemStack(Items.DIAMOND)), "Diamond bow rejected a diamond repair ingredient"); - require(helper, emeraldSword.getItem().isValidRepairItem(emeraldSword, new ItemStack(Items.EMERALD)), + require(helper, emeraldSword.isValidRepairItem(new ItemStack(Items.EMERALD)), "Emerald sword rejected an emerald repair ingredient"); - require(helper, quartzArmor.getItem().isValidRepairItem(quartzArmor, new ItemStack(Items.QUARTZ)), + require(helper, quartzArmor.isValidRepairItem(new ItemStack(Items.QUARTZ)), "Quartz armor rejected a quartz repair ingredient"); - require(helper, stoneScythe.getItem().isValidRepairItem(stoneScythe, new ItemStack(Blocks.STONE)), + require(helper, stoneScythe.isValidRepairItem(new ItemStack(Blocks.STONE)), "Stone scythe rejected a stone repair ingredient"); - require(helper, woodScythe.getItem().isValidRepairItem(woodScythe, new ItemStack(Blocks.OAK_PLANKS)), + require(helper, woodScythe.isValidRepairItem(new ItemStack(Blocks.OAK_PLANKS)), "Wood scythe rejected a plank repair ingredient"); - require(helper, !diamondBow.getItem().isValidRepairItem(diamondBow, new ItemStack(Items.IRON_INGOT)), + require(helper, !diamondBow.isValidRepairItem(new ItemStack(Items.IRON_INGOT)), "Diamond bow accepted an unrelated ingot"); helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void armorToolEffectsAndStarsteelRegenerationAreServerAuthoritative(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); equip(player, "adamantine"); player.tickCount = 20; BaseMetalsEvents events = new BaseMetalsEvents(); events.onPlayerTick(new TickEvent.PlayerTickEvent.Post(player)); - require(helper, player.getEffect(MobEffects.DAMAGE_RESISTANCE) != null - && player.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() == 1, + require(helper, player.getEffect(MobEffects.RESISTANCE) != null + && player.getEffect(MobEffects.RESISTANCE).getAmplifier() == 1, "Four Adamantine pieces did not grant Resistance II"); - require(helper, player.getEffect(MobEffects.DAMAGE_RESISTANCE).getDuration() == 45, + require(helper, player.getEffect(MobEffects.RESISTANCE).getDuration() == 45, "Armor effects linger far beyond the legacy refresh window"); ItemStack starsteel = ModContent.item("starsteel_pickaxe").get().getDefaultInstance(); @@ -761,7 +796,7 @@ public static void armorToolEffectsAndStarsteelRegenerationAreServerAuthoritativ helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void remainingLegacyArmorEffectsUseTheCorrectPieceCounts(GameTestHelper helper) { BaseMetalsEvents events = new BaseMetalsEvents(); @@ -769,13 +804,13 @@ public static void remainingLegacyArmorEffectsUseTheCorrectPieceCounts(GameTestH equip(adamantine, "adamantine"); adamantine.setItemSlot(EquipmentSlot.FEET, ItemStack.EMPTY); tickEffects(events, adamantine); - require(helper, effectAmplifier(adamantine, MobEffects.DAMAGE_RESISTANCE) == 0, + require(helper, effectAmplifier(adamantine, MobEffects.RESISTANCE) == 0, "Three Adamantine pieces did not grant Resistance I"); ServerPlayer lead = survivalPlayer(helper); equip(lead, "lead"); tickEffects(events, lead); - require(helper, effectAmplifier(lead, MobEffects.MOVEMENT_SLOWDOWN) == 1, + require(helper, effectAmplifier(lead, MobEffects.SLOWNESS) == 1, "Four Lead pieces did not grant Slowness II"); ServerPlayer coldiron = survivalPlayer(helper); @@ -794,14 +829,14 @@ public static void remainingLegacyArmorEffectsUseTheCorrectPieceCounts(GameTestH ServerPlayer starsteel = survivalPlayer(helper); equip(starsteel, "starsteel"); tickEffects(events, starsteel); - require(helper, effectAmplifier(starsteel, MobEffects.JUMP) == 3, + require(helper, effectAmplifier(starsteel, MobEffects.JUMP_BOOST) == 3, "Four Starsteel pieces did not grant Jump Boost IV"); - require(helper, effectAmplifier(starsteel, MobEffects.MOVEMENT_SPEED) == 2, + require(helper, effectAmplifier(starsteel, MobEffects.SPEED) == 2, "Four Starsteel pieces did not grant Speed III"); helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void remainingLegacyMeleeEffectsUseTargetIdentity(GameTestHelper helper) { BaseMetalsEvents events = new BaseMetalsEvents(); ServerPlayer player = survivalPlayer(helper); @@ -837,12 +872,9 @@ public static void remainingLegacyMeleeEffectsUseTargetIdentity(GameTestHelper h helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void eventBackedAdvancementsAwardForActualLegacyActions(GameTestHelper helper) { - ServerPlayer player = new ServerPlayer(helper.getLevel().getServer(), helper.getLevel(), - new GameProfile(UUID.randomUUID(), "basemetals-advancement-test"), - net.minecraft.server.level.ClientInformation.createDefault()); - player.setGameMode(GameType.SURVIVAL); + ServerPlayer player = survivalPlayer(helper); BaseMetalsEvents events = new BaseMetalsEvents(); events.onItemCrafted(new PlayerEvent.ItemCraftedEvent(player, ModContent.item("iron_crackhammer").get().getDefaultInstance(), new SimpleContainer(0))); @@ -852,8 +884,8 @@ public static void eventBackedAdvancementsAwardForActualLegacyActions(GameTestHe ModContent.item("bronze_ingot").get().getDefaultInstance())); for (String advancement : new String[] {"geologist", "metallurgy", "this_is_new", "bronze_maker"}) { - var definition = player.getServer().getAdvancements().get( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, advancement)); + var definition = player.level().getServer().getAdvancements().get( + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, advancement)); require(helper, definition != null && player.getAdvancements().getOrStartProgress(definition).isDone(), "Legacy action did not award advancement " + advancement); @@ -863,14 +895,14 @@ public static void eventBackedAdvancementsAwardForActualLegacyActions(GameTestHe private static void assertCrushingRecipe(GameTestHelper helper, ItemStack input, String expectedItem, int expectedCount) { - var recipe = helper.getLevel().getRecipeManager().getRecipeFor( + var recipe = helper.getLevel().getServer().getRecipeManager().getRecipeFor( CrushingRecipe.TYPE.get(), new net.minecraft.world.item.crafting.SingleRecipeInput(input), helper.getLevel()); require(helper, recipe.isPresent(), "No crushing recipe loaded for " + input); - ItemStack result = recipe.orElseThrow().value().getResultItem(net.minecraft.core.RegistryAccess.EMPTY); - ResourceLocation expectedId = expectedItem.contains(":") - ? ResourceLocation.parse(expectedItem) - : ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, expectedItem); - require(helper, ForgeRegistries.ITEMS.getKey(recipe.orElseThrow().value().getResultItem(net.minecraft.core.RegistryAccess.EMPTY).getItem()).equals( + ItemStack result = recipe.orElseThrow().value().assemble(new net.minecraft.world.item.crafting.SingleRecipeInput(ItemStack.EMPTY), helper.getLevel().registryAccess()); + Identifier expectedId = expectedItem.contains(":") + ? Identifier.parse(expectedItem) + : Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, expectedItem); + require(helper, ForgeRegistries.ITEMS.getKey(recipe.orElseThrow().value().assemble(new net.minecraft.world.item.crafting.SingleRecipeInput(ItemStack.EMPTY), helper.getLevel().registryAccess()).getItem()).equals( expectedId), input + " crushed to the wrong output"); require(helper, result.getCount() == expectedCount, input + " crushed to " + result.getCount() + " items instead of " + expectedCount); @@ -888,13 +920,13 @@ private static int effectAmplifier(LivingEntity entity, net.minecraft.core.Holde private static void assertSmeltingRecipe(GameTestHelper helper, ItemStack input, String expectedItem, int expectedCount) { - var recipe = helper.getLevel().getRecipeManager().getRecipeFor( + var recipe = helper.getLevel().getServer().getRecipeManager().getRecipeFor( RecipeType.SMELTING, new net.minecraft.world.item.crafting.SingleRecipeInput(input), helper.getLevel()); require(helper, recipe.isPresent(), "No furnace recipe loaded for " + input); if (recipe.isEmpty()) return; - ItemStack result = recipe.orElseThrow().value().getResultItem(net.minecraft.core.RegistryAccess.EMPTY); - ResourceLocation actualItem = ForgeRegistries.ITEMS.getKey(result.getItem()); - require(helper, actualItem.equals(ResourceLocation.parse(expectedItem)), + ItemStack result = recipe.orElseThrow().value().assemble(new net.minecraft.world.item.crafting.SingleRecipeInput(ItemStack.EMPTY), helper.getLevel().registryAccess()); + Identifier actualItem = ForgeRegistries.ITEMS.getKey(result.getItem()); + require(helper, actualItem.equals(Identifier.parse(expectedItem)), input + " smelted to " + actualItem + " instead of " + expectedItem); require(helper, result.getCount() == expectedCount, input + " smelted to " + result.getCount() + " items instead of " + expectedCount); @@ -902,14 +934,14 @@ private static void assertSmeltingRecipe(GameTestHelper helper, ItemStack input, private static void assertSmeltingRecipeInTag(GameTestHelper helper, ItemStack input, String expectedTag, int expectedCount) { - var recipe = helper.getLevel().getRecipeManager().getRecipeFor( + var recipe = helper.getLevel().getServer().getRecipeManager().getRecipeFor( RecipeType.SMELTING, new net.minecraft.world.item.crafting.SingleRecipeInput(input), helper.getLevel()); require(helper, recipe.isPresent(), "No furnace recipe loaded for " + input); if (recipe.isEmpty()) return; - ItemStack result = recipe.orElseThrow().value().getResultItem(net.minecraft.core.RegistryAccess.EMPTY); + ItemStack result = recipe.orElseThrow().value().assemble(new net.minecraft.world.item.crafting.SingleRecipeInput(ItemStack.EMPTY), helper.getLevel().registryAccess()); TagKey tag = TagKey.create( - net.minecraft.core.registries.Registries.ITEM, ResourceLocation.parse(expectedTag)); - ResourceLocation actualItem = ForgeRegistries.ITEMS.getKey(result.getItem()); + net.minecraft.core.registries.Registries.ITEM, Identifier.parse(expectedTag)); + Identifier actualItem = ForgeRegistries.ITEMS.getKey(result.getItem()); require(helper, result.is(tag), input + " smelted to " + actualItem + ", which is outside #" + expectedTag); require(helper, result.getCount() == expectedCount, @@ -917,7 +949,7 @@ private static void assertSmeltingRecipeInTag(GameTestHelper helper, ItemStack i } private static void assertNoSmeltingRecipe(GameTestHelper helper, ItemStack input) { - var recipe = helper.getLevel().getRecipeManager().getRecipeFor( + var recipe = helper.getLevel().getServer().getRecipeManager().getRecipeFor( RecipeType.SMELTING, new net.minecraft.world.item.crafting.SingleRecipeInput(input), helper.getLevel()); require(helper, recipe.isEmpty(), input + " unexpectedly has a furnace recipe"); } @@ -925,7 +957,7 @@ private static void assertNoSmeltingRecipe(GameTestHelper helper, ItemStack inpu private static void assertItemStack(GameTestHelper helper, ItemStack stack, String expectedItem, int expectedCount, String description) { require(helper, ForgeRegistries.ITEMS.getKey(stack.getItem()).equals( - ResourceLocation.parse(expectedItem)), description + " used the wrong item"); + Identifier.parse(expectedItem)), description + " used the wrong item"); require(helper, stack.getCount() == expectedCount, description + " contained " + stack.getCount() + " items instead of " + expectedCount); } @@ -938,7 +970,7 @@ private static void requireSingleDrop(GameTestHelper helper, BlockPos position, if (drops.size() != 1) return; ItemStack output = drops.get(0).getItem(); require(helper, ForgeRegistries.ITEMS.getKey(output.getItem()).equals( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, expectedItem)), "Crushing produced the wrong item"); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, expectedItem)), "Crushing produced the wrong item"); require(helper, output.getCount() == expectedCount, "Crushing produced " + output.getCount() + " items instead of " + expectedCount); } @@ -955,7 +987,7 @@ private static ServerPlayer survivalPlayer(GameTestHelper helper) { return player; } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void projectilesRetainAmmunitionAcrossSaveAndSpawnData(GameTestHelper helper) { Player shooter = helper.makeMockPlayer(GameType.SURVIVAL); ItemStack ammunition = ModContent.item("starsteel_bolt").get().getDefaultInstance(); @@ -964,9 +996,9 @@ public static void projectilesRetainAmmunitionAcrossSaveAndSpawnData(GameTestHel "Projectile uses the vanilla packet, so Forge ammunition data cannot reach the client"); CompoundTag saved = new CompoundTag(); - original.addAdditionalSaveData(saved); + saved.merge(zone.moddev.mc.basemetals.content.RuntimeTestData.save(original)); MaterialProjectile loaded = new MaterialProjectile(ModEntities.CUSTOM_BOLT.get(), helper.getLevel()); - loaded.readAdditionalSaveData(saved); + zone.moddev.mc.basemetals.content.RuntimeTestData.load(loaded, saved); require(helper, ItemStack.isSameItemSameComponents(ammunition, loaded.getItem()), "Projectile ammunition was not retained through save/load"); @@ -994,7 +1026,7 @@ public boolean stillValid(Player player) { }, width, height); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void oreLootSupportsRawFortuneSilkTouchAndHammering(GameTestHelper helper) { ServerPlayer player = survivalPlayer(helper); ItemStack pickaxe = Items.NETHERITE_PICKAXE.getDefaultInstance(); @@ -1030,26 +1062,29 @@ public static void oreLootSupportsRawFortuneSilkTouchAndHammering(GameTestHelper helper.getLevel().setBlock(position, state, 3); player.setItemInHand(InteractionHand.MAIN_HAND, ModContent.item("adamantine_crackhammer").get().getDefaultInstance()); - var event = new net.minecraftforge.event.level.BlockEvent.BreakEvent(helper.getLevel(), position, state, player); + var event = new net.minecraftforge.event.level.BlockEvent.BreakEvent(helper.getLevel(), position, state, player, net.minecraftforge.common.util.Result.DEFAULT); new BaseMetalsEvents().onBreak(event); - require(helper, event.isCanceled() && helper.getLevel().getBlockState(position).isAir(), material + " hammer did not harvest the ore"); + require(helper, event.getResult().isDenied() && helper.getLevel().getBlockState(position).isAir(), material + " hammer did not harvest the ore"); requireSingleDrop(helper, position, null, material + "_powder", 2); helper.getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(position).inflate(1.0D)).forEach(Entity::discard); } helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = EMPTY) + @GameTest(structure = EMPTY) public static void fullyDrawnWeaponsApplyMaterialDamageBeforePower(GameTestHelper helper) { for (String material : List.of("gold", "steel", "adamantine")) { for (boolean crossbow : List.of(false, true)) { for (int power : List.of(0, 3)) { ServerPlayer player = survivalPlayer(helper); - player.moveTo(helper.absolutePos(new BlockPos(1, 2, 1)), 0.0F, 0.0F); + player.snapTo(helper.absolutePos(new BlockPos(1, 2, 1)), 0.0F, 0.0F); String launcher = material + (crossbow ? "_crossbow" : "_bow"); String ammo = material + (crossbow ? "_bolt" : "_arrow"); ItemStack weapon = ModContent.item(launcher).get().getDefaultInstance(); - if (power > 0) weapon.enchant(enchantment(helper, Enchantments.POWER), power); + if (power > 0) { + weapon.enchant(enchantment(helper, Enchantments.POWER), power); + weapon.enchant(enchantment(helper, Enchantments.FLAME), 1); + } player.setItemInHand(InteractionHand.MAIN_HAND, weapon); player.getInventory().setItem(1, ModContent.item(ammo).get().getDefaultInstance()); player.startUsingItem(InteractionHand.MAIN_HAND); @@ -1059,11 +1094,13 @@ public static void fullyDrawnWeaponsApplyMaterialDamageBeforePower(GameTestHelpe if (entity instanceof MaterialProjectile arrow && arrow.getOwner() == player) projectiles.add(arrow); }); double baseDamage = ((MaterialBacked) weapon.getItem()).baseMetalsMaterial().baseAttackDamage() * 2.0D; - require(helper, projectiles.size() == 1 && close(projectiles.get(0).getBaseDamage(), baseDamage), + require(helper, projectiles.size() == 1 && close(zone.moddev.mc.basemetals.content.RuntimeTestData.damage(projectiles.get(0)), baseDamage), launcher + " did not keep the material base damage=" + baseDamage); MaterialProjectile projectile = projectiles.getFirst(); - var target = EntityType.ZOMBIE.create(helper.getLevel()); + require(helper, projectile.isOnFire() == (power > 0), + launcher + " did not apply Flame at launch"); + var target = EntityType.ZOMBIE.create(helper.getLevel(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); double damage = EnchantmentHelper.modifyDamage(helper.getLevel(), projectile.getWeaponItem(), target, helper.getLevel().damageSources().arrow(projectile, player), (float) baseDamage); var vanilla = ((net.minecraft.world.item.ArrowItem) Items.ARROW) @@ -1098,7 +1135,8 @@ private static net.minecraft.core.Holder "copper_ingot_from_nuggets"; + case "copper_nugget" -> "copper_nuggets"; + case "copper_horse_armor" -> "copper_horsearmor"; + default -> path; + }; + var recipe = level.getServer().getRecipeManager().byKey(net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.RECIPE, Identifier.fromNamespaceAndPath( + BaseMetals.MOD_ID, recipeId))).orElseThrow(); + require(helper, ((net.minecraft.world.item.crafting.CraftingRecipe) recipe.value()).assemble( + net.minecraft.world.item.crafting.CraftingInput.EMPTY, level.registryAccess()).is(vanilla), recipeId + " still crafts the old duplicate item"); } @@ -124,7 +130,7 @@ public static void vanillaCopperKeepsExistingRecipeChainsUsable(GameTestHelper h ModContent.item("copper_ingot").get().getDefaultInstance())) { var input = CraftingInput.of(3, 1, List.of(ingot.copy(), ingot.copy(), ingot.copy())); - var plate = level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, + var plate = level.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, input, level).orElseThrow().value().assemble(input, level.registryAccess()); require(helper, plate.is(ModContent.item("copper_plate").get()) && plate.getCount() == 3, "Copper plate crafting rejected a supported ingot"); @@ -133,7 +139,7 @@ public static void vanillaCopperKeepsExistingRecipeChainsUsable(GameTestHelper h for (var entry : java.util.Map.of(Items.COPPER_TRAPDOOR, 3, ModContent.item("copper_trapdoor").get(), 4).entrySet()) { var input = new SingleRecipeInput(entry.getKey().getDefaultInstance()); - ItemStack recycled = level.getRecipeManager().getRecipeFor(RecipeType.SMELTING, + ItemStack recycled = level.getServer().getRecipeManager().getRecipeFor(RecipeType.SMELTING, input, level).orElseThrow().value().assemble(input, level.registryAccess()); require(helper, recycled.is(Items.COPPER_INGOT) && recycled.getCount() == entry.getValue(), "Copper trapdoor recycling used the wrong material value"); @@ -142,7 +148,7 @@ public static void vanillaCopperKeepsExistingRecipeChainsUsable(GameTestHelper h helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void nativeEnchantmentsStillSupportMaterialEquipment(GameTestHelper helper) { var enchantments = helper.getLevel().registryAccess().lookupOrThrow(Registries.ENCHANTMENT); int checked = 0; @@ -159,7 +165,8 @@ public static void nativeEnchantmentsStillSupportMaterialEquipment(GameTestHelpe require(helper, enchantments.getOrThrow(Enchantments.POWER) .value().canEnchant(stack), "Power no longer supports " + stack); } - if (item instanceof DiggerItem || item instanceof ShearsItem) { + if ((item.components().has(net.minecraft.core.component.DataComponents.TOOL) + && !(item instanceof MaterialItems.Sword)) || item instanceof ShearsItem) { require(helper, enchantments.getOrThrow(Enchantments.EFFICIENCY) .value().canEnchant(stack), "Efficiency no longer supports " + stack); } @@ -167,7 +174,7 @@ public static void nativeEnchantmentsStillSupportMaterialEquipment(GameTestHelpe require(helper, enchantments.getOrThrow(Enchantments.LURE) .value().canEnchant(stack), "Lure no longer supports " + stack); } - if (item instanceof ArmorItem) { + if (item instanceof Armor) { require(helper, enchantments.getOrThrow(Enchantments.PROTECTION) .value().canEnchant(stack), "Protection no longer supports " + stack); } diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java index b80f41883..520d72eee 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/NativeComponentGameTests.java @@ -3,7 +3,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.core.registries.Registries; import net.minecraft.core.component.DataComponents; -import net.minecraft.gametest.framework.GameTest; +import net.minecraftforge.gametest.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -16,31 +16,142 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraftforge.gametest.GameTestDontPrefix; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import zone.moddev.mc.basemetals.BaseMetals; import zone.moddev.mc.basemetals.entity.MaterialProjectile; import zone.moddev.mc.basemetals.entity.ModEntities; -@GameTestHolder(value = BaseMetals.MOD_ID, namespace = BaseMetals.MOD_ID) +@GameTestNamespace(BaseMetals.MOD_ID) @GameTestDontPrefix public final class NativeComponentGameTests { + private static final net.minecraft.resources.Identifier CAPABILITY_ID = + net.minecraft.resources.Identifier.parse("basemetals_tests:world_data"); + private static final java.util.Map CAPABILITIES = + new java.util.WeakHashMap<>(); + private NativeComponentGameTests() {} - @GameTest(batch = BaseMetals.MOD_ID, template = "empty", timeoutTicks = 600) + public static void registerCapabilityProbe() { + net.minecraftforge.event.AttachCapabilitiesEvent.Levels.BUS.addListener(event -> { + var capability = new SavedCapability(); + CAPABILITIES.put(event.getObject(), capability); + event.addCapability(CAPABILITY_ID, capability); + }); + } + + @GameTest(structure = "basemetals:empty") + public static void savedWorldCapabilitiesKeepLegacyAndCurrentPayloads(GameTestHelper helper) { + var codec = net.minecraftforge.common.util.LevelCapabilityData.type(helper.getLevel()).codec(); + var payload = new CompoundTag(); + payload.putString("owner", "Existing world"); + payload.putInt("counter", 37); + payload.putLongArray("custom_array", new long[] {11, 22, 33}); + var legacy = new CompoundTag(); + legacy.put(CAPABILITY_ID.toString(), payload); + + var loaded = codec.parse(net.minecraft.nbt.NbtOps.INSTANCE, legacy); + helper.assertTrue(loaded.isSuccess(), "Forge rejected the old capability payload: " + loaded.error()); + var provider = CAPABILITIES.get(helper.getLevel()); + helper.assertTrue(provider != null && payload.equals(provider.received), + "The legacy capability data did not reach its owner"); + + var encoded = codec.encodeStart(net.minecraft.nbt.NbtOps.INSTANCE, loaded.getOrThrow()).getOrThrow(); + helper.assertTrue(encoded instanceof CompoundTag compound + && payload.equals(compound.getCompoundOrEmpty("data").get(CAPABILITY_ID.toString())), + "New saves did not use Forge's current capability format"); + provider.received = null; + helper.assertTrue(codec.parse(net.minecraft.nbt.NbtOps.INSTANCE, encoded).isSuccess() + && payload.equals(provider.received), "The current capability format did not reload"); + helper.assertTrue(codec.parse(net.minecraft.nbt.NbtOps.INSTANCE, new CompoundTag()).isSuccess(), + "Empty legacy capability data did not load"); + + var malformed = new CompoundTag(); + malformed.putInt("data", 12); + helper.assertTrue(codec.parse(net.minecraft.nbt.NbtOps.INSTANCE, malformed).isError(), + "Malformed current data must not be mistaken for a legacy capability"); + helper.succeed(); + } + + private static final class SavedCapability implements + net.minecraftforge.common.capabilities.ICapabilitySerializable { + private CompoundTag received; + + @Override + public net.minecraftforge.common.util.LazyOptional getCapability( + net.minecraftforge.common.capabilities.Capability capability, net.minecraft.core.Direction side) { + return net.minecraftforge.common.util.LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT(net.minecraft.core.HolderLookup.Provider registries) { + return received == null ? new CompoundTag() : received.copy(); + } + + @Override + public void deserializeNBT(net.minecraft.core.HolderLookup.Provider registries, CompoundTag data) { + received = data.copy(); + } + } + + @GameTest(structure = "basemetals:empty") + public static void oreHostTagsResolveAfterWorldStartup(GameTestHelper helper) throws Exception { + helper.assertTrue(zone.moddev.mc.orespawn.api.OreSpawnApi.getProviderStatus(BaseMetals.MOD_ID) + == zone.moddev.mc.orespawn.api.ProviderStatus.ACTIVE, "The Base Metals provider is not active"); + + var resolver = Class.forName("zone.moddev.mc.orespawn.worldgen.OreSpawnOreGeneration") + .getDeclaredMethod("resolveTag", net.minecraft.tags.TagKey.class); + resolver.setAccessible(true); + + var expected = java.util.Map.of( + "minecraft:stone_ore_replaceables", net.minecraft.world.level.block.Blocks.STONE, + "minecraft:deepslate_ore_replaceables", net.minecraft.world.level.block.Blocks.DEEPSLATE, + "forge:netherrack", net.minecraft.world.level.block.Blocks.NETHERRACK, + "forge:end_stones", net.minecraft.world.level.block.Blocks.END_STONE); + + for (var entry : expected.entrySet()) { + var tag = net.minecraft.tags.TagKey.create(Registries.BLOCK, + net.minecraft.resources.Identifier.parse(entry.getKey())); + var hosts = (java.util.Set) resolver.invoke(null, tag); + + helper.assertTrue(hosts.contains(entry.getValue()), + "OreSpawn did not resolve the loaded host tag " + entry.getKey()); + } + + helper.succeed(); + } + + @GameTest(structure = "basemetals:empty", maxTicks = 600) public static void everyNativeRecipeSurvivesNetworkEncoding(GameTestHelper helper) { int checked = 0; - for (var holder : helper.getLevel().getRecipeManager().getRecipes()) { - if (!holder.id().getNamespace().equals(BaseMetals.MOD_ID)) continue; + for (var holder : helper.getLevel().getServer().getRecipeManager().getRecipes()) { + if (!holder.id().identifier().getNamespace().equals(BaseMetals.MOD_ID)) continue; RegistryFriendlyByteBuf buffer = new RegistryFriendlyByteBuf(Unpooled.buffer(), helper.getLevel().registryAccess()); try { Recipe.STREAM_CODEC.encode(buffer, holder.value()); + byte[] original = new byte[buffer.readableBytes()]; + buffer.getBytes(buffer.readerIndex(), original); Recipe decoded = Recipe.STREAM_CODEC.decode(buffer); helper.assertTrue(decoded.getSerializer() == holder.value().getSerializer(), "Recipe serializer changed: " + holder.id()); - helper.assertTrue(net.minecraft.world.item.ItemStack.matches( - holder.value().getResultItem(helper.getLevel().registryAccess()), - decoded.getResultItem(helper.getLevel().registryAccess())), "Recipe output changed: " + holder.id()); + + // Native shaped recipes discard their source pattern after network decoding. + buffer.clear(); + Recipe.STREAM_CODEC.encode(buffer, decoded); + byte[] encodedAgain = new byte[buffer.readableBytes()]; + buffer.getBytes(buffer.readerIndex(), encodedAgain); + helper.assertTrue(java.util.Arrays.equals(original, encodedAgain), + "Recipe fields changed during network encoding: " + holder.id()); + + var ops = helper.getLevel().registryAccess().createSerializationContext( + com.mojang.serialization.JsonOps.INSTANCE); + var json = Recipe.CODEC.encodeStart(ops, holder.value()).getOrThrow(); + var parsed = Recipe.CODEC.parse(ops, json).getOrThrow(); + helper.assertTrue(json.equals(Recipe.CODEC.encodeStart(ops, parsed).getOrThrow()), + "Recipe fields changed during JSON encoding: " + holder.id()); helper.assertTrue(decoded.isSpecial() == holder.value().isSpecial(), "Recipe discovery changed: " + holder.id()); checked++; + } catch (RuntimeException failure) { + throw new IllegalStateException("Recipe " + holder.id().identifier() + ": " + + failure.getMessage(), failure); } finally { buffer.release(); } @@ -49,7 +160,7 @@ public static void everyNativeRecipeSurvivesNetworkEncoding(GameTestHelper helpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void oldEmbeddedBoltsKeepTheirCustomItemData(GameTestHelper helper) { CompoundTag ammunition = new CompoundTag(); ammunition.putString("id", "basemetals:adamantine_bolt"); @@ -67,27 +178,27 @@ public static void oldEmbeddedBoltsKeepTheirCustomItemData(GameTestHelper helper entity.put("Ammunition", ammunition); MaterialProjectile projectile = new MaterialProjectile(ModEntities.CUSTOM_BOLT.get(), helper.getLevel()); - projectile.readAdditionalSaveData(entity); + zone.moddev.mc.basemetals.content.RuntimeTestData.load(projectile, entity); var item = projectile.getItem(); helper.assertTrue(item.is(ModContent.item("adamantine_bolt").get()), "An old bolt changed its material"); helper.assertTrue(item.getHoverName().getString().equals("An old bolt"), "An old bolt lost its name"); helper.assertTrue(item.get(DataComponents.LORE).lines().getFirst().getString().equals("Saved before components"), "An old bolt lost its lore"); - helper.assertTrue(item.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag().getInt("Proof") == 147, + helper.assertTrue(item.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag().getIntOr("Proof", 0) == 147, "An old bolt lost custom data"); CompoundTag saved = new CompoundTag(); - projectile.addAdditionalSaveData(saved); + saved.merge(zone.moddev.mc.basemetals.content.RuntimeTestData.save(projectile)); MaterialProjectile reloaded = new MaterialProjectile(ModEntities.CUSTOM_BOLT.get(), helper.getLevel()); - reloaded.readAdditionalSaveData(saved); + zone.moddev.mc.basemetals.content.RuntimeTestData.load(reloaded, saved); helper.assertTrue(net.minecraft.world.item.ItemStack.matches(item, reloaded.getItem()), "A converted bolt changed on reload"); helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void projectilesKeepWeaponEnchantmentsAfterReload(GameTestHelper helper) { var level = helper.getLevel(); var enchantments = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT); - var shooter = EntityType.ZOMBIE.create(level); - var target = EntityType.ZOMBIE.create(level); + var shooter = EntityType.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + var target = EntityType.ZOMBIE.create(level, net.minecraft.world.entity.EntitySpawnReason.COMMAND); for (boolean bolt : new boolean[] {false, true}) { ItemStack weapon = ModContent.item("steel_" + (bolt ? "crossbow" : "bow")).get().getDefaultInstance(); @@ -98,12 +209,13 @@ public static void projectilesKeepWeaponEnchantmentsAfterReload(GameTestHelper h ItemStack ammunition = ModContent.item("steel_" + (bolt ? "bolt" : "arrow")).get().getDefaultInstance(); var type = bolt ? ModEntities.CUSTOM_BOLT.get() : ModEntities.CUSTOM_ARROW.get(); MaterialProjectile projectile = new MaterialProjectile(type, level, shooter, ammunition, weapon); + net.minecraft.world.entity.projectile.Projectile.spawnProjectile(projectile, level, ammunition); helper.assertTrue(projectile.isOnFire(), "Flame did not ignite the material projectile"); - CompoundTag saved = projectile.saveWithoutId(new CompoundTag()); + CompoundTag saved = zone.moddev.mc.basemetals.content.RuntimeTestData.save(projectile); MaterialProjectile reloaded = new MaterialProjectile(type, level); - reloaded.load(saved); + zone.moddev.mc.basemetals.content.RuntimeTestData.load(reloaded, saved); helper.assertTrue(ItemStack.matches(weapon, reloaded.getWeaponItem()), "The saved projectile lost its firing weapon or enchantments"); diff --git a/src/gametest/java/zone/moddev/mc/basemetals/content/RuntimeTestData.java b/src/gametest/java/zone/moddev/mc/basemetals/content/RuntimeTestData.java new file mode 100644 index 000000000..af7dbe508 --- /dev/null +++ b/src/gametest/java/zone/moddev/mc/basemetals/content/RuntimeTestData.java @@ -0,0 +1,27 @@ +package zone.moddev.mc.basemetals.content; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.ProblemReporter; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; + +/** Reads the same saved fields that the game uses, rather than private entity fields. */ +public final class RuntimeTestData { + private RuntimeTestData() {} + + public static CompoundTag save(Entity entity) { + TagValueOutput output = TagValueOutput.createWithContext(ProblemReporter.DISCARDING, entity.registryAccess()); + entity.saveWithoutId(output); + return output.buildResult(); + } + + public static void load(Entity entity, CompoundTag saved) { + entity.load(TagValueInput.create(ProblemReporter.DISCARDING, entity.registryAccess(), saved)); + } + + public static double damage(AbstractArrow arrow) { + return save(arrow).getDoubleOr("damage", 2.0D); + } +} diff --git a/src/gametest/java/zone/moddev/mc/basemetals/migration/MigrationGameTests.java b/src/gametest/java/zone/moddev/mc/basemetals/migration/MigrationGameTests.java index 2298c7ec8..ea924fa0a 100644 --- a/src/gametest/java/zone/moddev/mc/basemetals/migration/MigrationGameTests.java +++ b/src/gametest/java/zone/moddev/mc/basemetals/migration/MigrationGameTests.java @@ -6,23 +6,23 @@ import zone.moddev.mc.basemetals.BaseMetals; -import net.minecraft.gametest.framework.GameTest; +import net.minecraftforge.gametest.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.IntArrayTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; -import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.gametest.GameTestDontPrefix; /** Direct coverage of the pre-flattening overlay around Mojang's data fixer. */ -@GameTestHolder(value = BaseMetals.MOD_ID, namespace = BaseMetals.MOD_ID) +@GameTestNamespace(BaseMetals.MOD_ID) @GameTestDontPrefix public final class MigrationGameTests { private MigrationGameTests() {} - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void floorAndCeilingLeversKeepTheirLegacyOrientation(GameTestHelper helper) { var lever = net.minecraft.world.level.block.Blocks.LEVER; for (int metadata : new int[] {0, 5, 6, 7, 8, 13, 14, 15}) { @@ -37,66 +37,66 @@ public static void floorAndCeilingLeversKeepTheirLegacyOrientation(GameTestHelpe helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void vanillaFixesAndMmdlibStatesSurviveTheSameChunkConversion(GameTestHelper helper) { try { CompoundTag converted = Legacy112WorldMigrator.convertChunkForTest(legacyChunk(1_343), legacyIds()); - require(helper, converted.getInt("DataVersion") == 1_456, + require(helper, converted.getIntOr("DataVersion", 0) == 1_456, "Migration did not stop at the safe post-flattening data version"); CompoundTag vanillaLower = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(0, 1, 0)); CompoundTag vanillaUpper = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(0, 2, 0)); - require(helper, vanillaLower.getString("Name").equals("minecraft:oak_door"), + require(helper, vanillaLower.getStringOr("Name", "").equals("minecraft:oak_door"), "Mojang's vanilla wooden-door flattening did not run"); require(helper, hasDoorProperties(vanillaLower) && hasDoorProperties(vanillaUpper), "Mojang's context-sensitive vanilla door fix did not merge both halves"); CompoundTag aliasLower = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(2, 1, 0)); CompoundTag aliasUpper = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(2, 2, 0)); - require(helper, aliasLower.getString("Name").equals("basemetals:quartz_door") - && aliasUpper.getString("Name").equals("basemetals:quartz_door"), + require(helper, aliasLower.getStringOr("Name", "").equals("basemetals:quartz_door") + && aliasUpper.getStringOr("Name", "").equals("basemetals:quartz_door"), "mmdlib block aliases were not restored under Base Metals"); require(helper, hasDoorProperties(aliasLower) && hasDoorProperties(aliasUpper), "Base Metals door halves did not receive a complete modern state"); - require(helper, aliasLower.getCompound("Properties").getString("open").equals("true") - && aliasUpper.getCompound("Properties").getString("hinge").equals("right") - && aliasUpper.getCompound("Properties").getString("powered").equals("true"), + require(helper, aliasLower.getCompoundOrEmpty("Properties").getStringOr("open", "").equals("true") + && aliasUpper.getCompoundOrEmpty("Properties").getStringOr("hinge", "").equals("right") + && aliasUpper.getCompoundOrEmpty("Properties").getStringOr("powered", "").equals("true"), "Base Metals door metadata was not merged across its two halves"); CompoundTag plate = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(4, 1, 0)); - require(helper, plate.getString("Name").equals("basemetals:copper_plate") - && plate.getCompound("Properties").getString("facing").equals("east"), + require(helper, plate.getStringOr("Name", "").equals("basemetals:copper_plate") + && plate.getCompoundOrEmpty("Properties").getStringOr("facing", "").equals("east"), "mmdlib metadata was lost while forwarding a stateful block"); CompoundTag cyanoExternal = Legacy112WorldMigrator.stateAtForTest(converted, 5, index(6, 1, 0)); - require(helper, cyanoExternal.getString("Name").equals("mca:rosegoldore"), + require(helper, cyanoExternal.getStringOr("Name", "").equals("mca:rosegoldore"), "Minecraft 1.10 mixed-case registry paths were not normalized"); - CompoundTag chest = converted.getCompound("Level").getList("TileEntities", Tag.TAG_COMPOUND) - .getCompound(0); - CompoundTag bucket = chest.getList("Items", Tag.TAG_COMPOUND).getCompound(0); - require(helper, bucket.getString("id").equals("basemetals:mercury_bucket"), + CompoundTag chest = converted.getCompoundOrEmpty("Level").getListOrEmpty("TileEntities") + .getCompoundOrEmpty(0); + CompoundTag bucket = chest.getListOrEmpty("Items").getCompoundOrEmpty(0); + require(helper, bucket.getStringOr("id", "").equals("basemetals:mercury_bucket"), "Legacy Forge universal bucket did not become its dedicated Base Metals bucket"); - require(helper, !bucket.contains("tag", Tag.TAG_COMPOUND) - || !bucket.getCompound("tag").contains("FluidName", Tag.TAG_STRING), + require(helper, !zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(bucket, "tag", Tag.TAG_COMPOUND) + || !bucket.getCompoundOrEmpty("tag").getString("FluidName").isPresent(), "Obsolete universal-bucket fluid metadata survived conversion"); - CompoundTag damagedTool = chest.getList("Items", Tag.TAG_COMPOUND).getCompound(1); - require(helper, damagedTool.getCompound("tag").getInt("Damage") == 12, + CompoundTag damagedTool = chest.getListOrEmpty("Items").getCompoundOrEmpty(1); + require(helper, damagedTool.getCompoundOrEmpty("tag").getIntOr("Damage", 0) == 12, "Legacy mod-item damage was consumed as flattening metadata"); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(2) - .getString("id").equals("basemetals:coal_powder"), + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(2) + .getStringOr("id", "").equals("basemetals:coal_powder"), "Cyano carbon-powder item alias was not forwarded"); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(3) - .getString("id").equals("minecraft:iron_nugget"), + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(3) + .getStringOr("id", "").equals("minecraft:iron_nugget"), "Legacy MMDLib iron nugget was not forwarded to vanilla"); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(4) - .getString("id").equals("basemetals:quartz_door"), + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(4) + .getStringOr("id", "").equals("basemetals:quartz_door"), "Legacy MMDLib door-item alias was not forwarded"); CompoundTag cabinet = findBlockEntity(converted, "cfmCabinet"); require(helper, cabinet != null, "Third-party block entity at a restored mod block was discarded"); - require(helper, cabinet.getList("cabinetItems", Tag.TAG_COMPOUND).getCompound(0) - .getString("id").equals("basemetals:coal_powder"), + require(helper, cabinet.getListOrEmpty("cabinetItems").getCompoundOrEmpty(0) + .getStringOr("id", "").equals("basemetals:coal_powder"), "Items inside a restored third-party block entity were not migrated"); } catch (IOException | RuntimeException exception) { helper.fail("Legacy chunk conversion failed: " + exception); @@ -105,30 +105,30 @@ public static void vanillaFixesAndMmdlibStatesSurviveTheSameChunkConversion(Game helper.succeed(); } - @GameTest(batch = BaseMetals.MOD_ID, template = "empty") + @GameTest(structure = "basemetals:empty") public static void mmdForge110ChunksUseTheCompleteFlatteningPath(GameTestHelper helper) { try { CompoundTag converted = Legacy112WorldMigrator.convertChunkForTest(legacyChunk(512), legacyIds()); - require(helper, converted.getInt("DataVersion") == 1_456, + require(helper, converted.getIntOr("DataVersion", 0) == 1_456, "Forge 1.10 chunk did not reach the safe post-flattening data version"); require(helper, Legacy112WorldMigrator.stateAtForTest(converted, 5, index(2, 1, 0)) - .getString("Name").equals("basemetals:quartz_door"), + .getStringOr("Name", "").equals("basemetals:quartz_door"), "Forge 1.10 mmdlib block alias was not restored under Base Metals"); require(helper, Legacy112WorldMigrator.stateAtForTest(converted, 5, index(4, 1, 0)) - .getString("Name").equals("basemetals:copper_plate"), + .getStringOr("Name", "").equals("basemetals:copper_plate"), "Forge 1.10 Base Metals stateful block was not restored"); - CompoundTag chest = converted.getCompound("Level").getList("TileEntities", Tag.TAG_COMPOUND) - .getCompound(0); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(0) - .getString("id").equals("basemetals:mercury_bucket"), + CompoundTag chest = converted.getCompoundOrEmpty("Level").getListOrEmpty("TileEntities") + .getCompoundOrEmpty(0); + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(0) + .getStringOr("id", "").equals("basemetals:mercury_bucket"), "Forge 1.10 universal bucket did not become its dedicated Base Metals bucket"); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(1) - .getCompound("tag").getInt("Damage") == 12, + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(1) + .getCompoundOrEmpty("tag").getIntOr("Damage", 0) == 12, "Forge 1.10 mod-item durability was consumed as flattening metadata"); - require(helper, chest.getList("Items", Tag.TAG_COMPOUND).getCompound(2) - .getString("id").equals("basemetals:coal_powder"), + require(helper, chest.getListOrEmpty("Items").getCompoundOrEmpty(2) + .getStringOr("id", "").equals("basemetals:coal_powder"), "Forge 1.10 Cyano item alias was not forwarded"); } catch (IOException | RuntimeException exception) { helper.fail("Forge 1.10 MMD chunk conversion failed: " + exception); @@ -237,9 +237,9 @@ private static Map legacyIds() { } private static CompoundTag findBlockEntity(CompoundTag chunk, String id) { - for (Tag value : chunk.getCompound("Level").getList("TileEntities", Tag.TAG_COMPOUND)) { + for (Tag value : chunk.getCompoundOrEmpty("Level").getListOrEmpty("TileEntities")) { CompoundTag blockEntity = (CompoundTag) value; - if (blockEntity.getString("id").equals(id)) return blockEntity; + if (blockEntity.getStringOr("id", "").equals(id)) return blockEntity; } return null; } @@ -261,13 +261,13 @@ private static void setNibble(byte[] values, int index, int value) { } private static boolean hasDoorProperties(CompoundTag state) { - if (!state.contains("Properties", Tag.TAG_COMPOUND)) return false; - CompoundTag properties = state.getCompound("Properties"); - return properties.contains("half", Tag.TAG_STRING) - && properties.contains("facing", Tag.TAG_STRING) - && properties.contains("open", Tag.TAG_STRING) - && properties.contains("hinge", Tag.TAG_STRING) - && properties.contains("powered", Tag.TAG_STRING); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(state, "Properties", Tag.TAG_COMPOUND)) return false; + CompoundTag properties = state.getCompoundOrEmpty("Properties"); + return zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(properties, "half", Tag.TAG_STRING) + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(properties, "facing", Tag.TAG_STRING) + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(properties, "open", Tag.TAG_STRING) + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(properties, "hinge", Tag.TAG_STRING) + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(properties, "powered", Tag.TAG_STRING); } private static void require(GameTestHelper helper, boolean condition, String message) { diff --git a/src/generated/resources/assets/basemetals/equipment/adamantine.json b/src/generated/resources/assets/basemetals/equipment/adamantine.json new file mode 100644 index 000000000..d3378730c --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/adamantine.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:adamantine" + } + ], + "humanoid": [ + { + "texture": "basemetals:adamantine" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:adamantine" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/antimony.json b/src/generated/resources/assets/basemetals/equipment/antimony.json new file mode 100644 index 000000000..cb8b83459 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/antimony.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:antimony" + } + ], + "humanoid": [ + { + "texture": "basemetals:antimony" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:antimony" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/aquarium.json b/src/generated/resources/assets/basemetals/equipment/aquarium.json new file mode 100644 index 000000000..925154290 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/aquarium.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:aquarium" + } + ], + "humanoid": [ + { + "texture": "basemetals:aquarium" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:aquarium" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/bismuth.json b/src/generated/resources/assets/basemetals/equipment/bismuth.json new file mode 100644 index 000000000..25cfec98a --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/bismuth.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:bismuth" + } + ], + "humanoid": [ + { + "texture": "basemetals:bismuth" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:bismuth" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/brass.json b/src/generated/resources/assets/basemetals/equipment/brass.json new file mode 100644 index 000000000..edb7648d0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/brass.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:brass" + } + ], + "humanoid": [ + { + "texture": "basemetals:brass" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:brass" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/bronze.json b/src/generated/resources/assets/basemetals/equipment/bronze.json new file mode 100644 index 000000000..9cc399613 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/bronze.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:bronze" + } + ], + "humanoid": [ + { + "texture": "basemetals:bronze" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:bronze" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/coldiron.json b/src/generated/resources/assets/basemetals/equipment/coldiron.json new file mode 100644 index 000000000..0c1a7a028 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/coldiron.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:coldiron" + } + ], + "humanoid": [ + { + "texture": "basemetals:coldiron" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:coldiron" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/copper.json b/src/generated/resources/assets/basemetals/equipment/copper.json new file mode 100644 index 000000000..0689c02fe --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/copper.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:copper" + } + ], + "humanoid": [ + { + "texture": "basemetals:copper" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:copper" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/cupronickel.json b/src/generated/resources/assets/basemetals/equipment/cupronickel.json new file mode 100644 index 000000000..cc81648c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/cupronickel.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:cupronickel" + } + ], + "humanoid": [ + { + "texture": "basemetals:cupronickel" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:cupronickel" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/electrum.json b/src/generated/resources/assets/basemetals/equipment/electrum.json new file mode 100644 index 000000000..5d321bf6f --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/electrum.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:electrum" + } + ], + "humanoid": [ + { + "texture": "basemetals:electrum" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:electrum" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/emerald.json b/src/generated/resources/assets/basemetals/equipment/emerald.json new file mode 100644 index 000000000..745e0d6d8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/emerald.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:emerald" + } + ], + "humanoid": [ + { + "texture": "basemetals:emerald" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:emerald" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/invar.json b/src/generated/resources/assets/basemetals/equipment/invar.json new file mode 100644 index 000000000..5ea44998a --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/invar.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:invar" + } + ], + "humanoid": [ + { + "texture": "basemetals:invar" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:invar" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/lead.json b/src/generated/resources/assets/basemetals/equipment/lead.json new file mode 100644 index 000000000..8f2cc4eeb --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/lead.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:lead" + } + ], + "humanoid": [ + { + "texture": "basemetals:lead" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:lead" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/mithril.json b/src/generated/resources/assets/basemetals/equipment/mithril.json new file mode 100644 index 000000000..ec38ce224 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/mithril.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:mithril" + } + ], + "humanoid": [ + { + "texture": "basemetals:mithril" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:mithril" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/nickel.json b/src/generated/resources/assets/basemetals/equipment/nickel.json new file mode 100644 index 000000000..d450121fa --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/nickel.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:nickel" + } + ], + "humanoid": [ + { + "texture": "basemetals:nickel" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:nickel" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/obsidian.json b/src/generated/resources/assets/basemetals/equipment/obsidian.json new file mode 100644 index 000000000..1cac327c3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/obsidian.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:obsidian" + } + ], + "humanoid": [ + { + "texture": "basemetals:obsidian" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:obsidian" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/pewter.json b/src/generated/resources/assets/basemetals/equipment/pewter.json new file mode 100644 index 000000000..b70f0a304 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/pewter.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:pewter" + } + ], + "humanoid": [ + { + "texture": "basemetals:pewter" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:pewter" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/platinum.json b/src/generated/resources/assets/basemetals/equipment/platinum.json new file mode 100644 index 000000000..ef3f9caaf --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/platinum.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:platinum" + } + ], + "humanoid": [ + { + "texture": "basemetals:platinum" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:platinum" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/quartz.json b/src/generated/resources/assets/basemetals/equipment/quartz.json new file mode 100644 index 000000000..35b14b5d2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/quartz.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:quartz" + } + ], + "humanoid": [ + { + "texture": "basemetals:quartz" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:quartz" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/silver.json b/src/generated/resources/assets/basemetals/equipment/silver.json new file mode 100644 index 000000000..daa17dca5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/silver.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:silver" + } + ], + "humanoid": [ + { + "texture": "basemetals:silver" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:silver" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/starsteel.json b/src/generated/resources/assets/basemetals/equipment/starsteel.json new file mode 100644 index 000000000..c7a7d2cbc --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/starsteel.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:starsteel" + } + ], + "humanoid": [ + { + "texture": "basemetals:starsteel" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:starsteel" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/steel.json b/src/generated/resources/assets/basemetals/equipment/steel.json new file mode 100644 index 000000000..6b2473955 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/steel.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:steel" + } + ], + "humanoid": [ + { + "texture": "basemetals:steel" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:steel" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/tin.json b/src/generated/resources/assets/basemetals/equipment/tin.json new file mode 100644 index 000000000..97d02216f --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/tin.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:tin" + } + ], + "humanoid": [ + { + "texture": "basemetals:tin" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:tin" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/equipment/zinc.json b/src/generated/resources/assets/basemetals/equipment/zinc.json new file mode 100644 index 000000000..00737f4e5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/equipment/zinc.json @@ -0,0 +1,19 @@ +{ + "layers": { + "horse_body": [ + { + "texture": "basemetals:zinc" + } + ], + "humanoid": [ + { + "texture": "basemetals:zinc" + } + ], + "humanoid_leggings": [ + { + "texture": "basemetals:zinc" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine.json b/src/generated/resources/assets/basemetals/items/adamantine.json new file mode 100644 index 000000000..d8e977f0e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_anvil.json b/src/generated/resources/assets/basemetals/items/adamantine_anvil.json new file mode 100644 index 000000000..6445dce67 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_anvil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_arrow.json b/src/generated/resources/assets/basemetals/items/adamantine_arrow.json new file mode 100644 index 000000000..b8b22f8ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_axe.json b/src/generated/resources/assets/basemetals/items/adamantine_axe.json new file mode 100644 index 000000000..7beaa256a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_bars.json b/src/generated/resources/assets/basemetals/items/adamantine_bars.json new file mode 100644 index 000000000..1adb750eb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_block.json b/src/generated/resources/assets/basemetals/items/adamantine_block.json new file mode 100644 index 000000000..d308f32f2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_bolt.json b/src/generated/resources/assets/basemetals/items/adamantine_bolt.json new file mode 100644 index 000000000..5f5fefa4e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_boots.json b/src/generated/resources/assets/basemetals/items/adamantine_boots.json new file mode 100644 index 000000000..ce9100369 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_bow.json b/src/generated/resources/assets/basemetals/items/adamantine_bow.json new file mode 100644 index 000000000..f379861b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_bucket.json b/src/generated/resources/assets/basemetals/items/adamantine_bucket.json new file mode 100644 index 000000000..8d9334925 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -11323073 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_button.json b/src/generated/resources/assets/basemetals/items/adamantine_button.json new file mode 100644 index 000000000..ccdc90dde --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_casing.json b/src/generated/resources/assets/basemetals/items/adamantine_casing.json new file mode 100644 index 000000000..952b1a207 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_chestplate.json b/src/generated/resources/assets/basemetals/items/adamantine_chestplate.json new file mode 100644 index 000000000..d64f4df19 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_clump.json b/src/generated/resources/assets/basemetals/items/adamantine_clump.json new file mode 100644 index 000000000..ca77ae815 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_crackhammer.json b/src/generated/resources/assets/basemetals/items/adamantine_crackhammer.json new file mode 100644 index 000000000..2de0ce295 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_crossbow.json b/src/generated/resources/assets/basemetals/items/adamantine_crossbow.json new file mode 100644 index 000000000..5a33ea315 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_crushed.json b/src/generated/resources/assets/basemetals/items/adamantine_crushed.json new file mode 100644 index 000000000..28b465c8e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_crushed_purified.json b/src/generated/resources/assets/basemetals/items/adamantine_crushed_purified.json new file mode 100644 index 000000000..e45f7452e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_crystal.json b/src/generated/resources/assets/basemetals/items/adamantine_crystal.json new file mode 100644 index 000000000..686701d96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_dense_plate.json b/src/generated/resources/assets/basemetals/items/adamantine_dense_plate.json new file mode 100644 index 000000000..80e0a4c4f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_door.json b/src/generated/resources/assets/basemetals/items/adamantine_door.json new file mode 100644 index 000000000..b5f5389ff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_fishing_rod.json b/src/generated/resources/assets/basemetals/items/adamantine_fishing_rod.json new file mode 100644 index 000000000..8e02b070e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_gear.json b/src/generated/resources/assets/basemetals/items/adamantine_gear.json new file mode 100644 index 000000000..52e4995d0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_helmet.json b/src/generated/resources/assets/basemetals/items/adamantine_helmet.json new file mode 100644 index 000000000..e59edd888 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_hoe.json b/src/generated/resources/assets/basemetals/items/adamantine_hoe.json new file mode 100644 index 000000000..4c2a727ce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_horse_armor.json b/src/generated/resources/assets/basemetals/items/adamantine_horse_armor.json new file mode 100644 index 000000000..765635652 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_ingot.json b/src/generated/resources/assets/basemetals/items/adamantine_ingot.json new file mode 100644 index 000000000..c0f8906bb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_leggings.json b/src/generated/resources/assets/basemetals/items/adamantine_leggings.json new file mode 100644 index 000000000..9b051ae05 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_lever.json b/src/generated/resources/assets/basemetals/items/adamantine_lever.json new file mode 100644 index 000000000..43917b7bc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_nugget.json b/src/generated/resources/assets/basemetals/items/adamantine_nugget.json new file mode 100644 index 000000000..0754cb150 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_ore.json b/src/generated/resources/assets/basemetals/items/adamantine_ore.json new file mode 100644 index 000000000..1f8a4449f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_pickaxe.json b/src/generated/resources/assets/basemetals/items/adamantine_pickaxe.json new file mode 100644 index 000000000..b8aa2d6f9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_plate.json b/src/generated/resources/assets/basemetals/items/adamantine_plate.json new file mode 100644 index 000000000..e0bd02763 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_powder.json b/src/generated/resources/assets/basemetals/items/adamantine_powder.json new file mode 100644 index 000000000..2b724723e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_powder_dirty.json b/src/generated/resources/assets/basemetals/items/adamantine_powder_dirty.json new file mode 100644 index 000000000..0c054c6de --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_pressure_plate.json b/src/generated/resources/assets/basemetals/items/adamantine_pressure_plate.json new file mode 100644 index 000000000..02fd60f50 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_raw.json b/src/generated/resources/assets/basemetals/items/adamantine_raw.json new file mode 100644 index 000000000..e64ac86d6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_rod.json b/src/generated/resources/assets/basemetals/items/adamantine_rod.json new file mode 100644 index 000000000..4b5e729f0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_scythe.json b/src/generated/resources/assets/basemetals/items/adamantine_scythe.json new file mode 100644 index 000000000..3a8f3fb6c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_shard.json b/src/generated/resources/assets/basemetals/items/adamantine_shard.json new file mode 100644 index 000000000..8e16b7d44 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_shears.json b/src/generated/resources/assets/basemetals/items/adamantine_shears.json new file mode 100644 index 000000000..4f65eddab --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_shield.json b/src/generated/resources/assets/basemetals/items/adamantine_shield.json new file mode 100644 index 000000000..c96e1e398 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_shovel.json b/src/generated/resources/assets/basemetals/items/adamantine_shovel.json new file mode 100644 index 000000000..b8ac61ee7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_slab.json b/src/generated/resources/assets/basemetals/items/adamantine_slab.json new file mode 100644 index 000000000..4fbbd6be1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_smallpowder.json b/src/generated/resources/assets/basemetals/items/adamantine_smallpowder.json new file mode 100644 index 000000000..ca122e93b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_stairs.json b/src/generated/resources/assets/basemetals/items/adamantine_stairs.json new file mode 100644 index 000000000..24647f268 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_sword.json b/src/generated/resources/assets/basemetals/items/adamantine_sword.json new file mode 100644 index 000000000..3c147fc96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_trapdoor.json b/src/generated/resources/assets/basemetals/items/adamantine_trapdoor.json new file mode 100644 index 000000000..f6fd5d8ff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/adamantine_wall.json b/src/generated/resources/assets/basemetals/items/adamantine_wall.json new file mode 100644 index 000000000..2ec55a008 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/adamantine_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/adamantine_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony.json b/src/generated/resources/assets/basemetals/items/antimony.json new file mode 100644 index 000000000..b239daf46 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_arrow.json b/src/generated/resources/assets/basemetals/items/antimony_arrow.json new file mode 100644 index 000000000..73725e486 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_axe.json b/src/generated/resources/assets/basemetals/items/antimony_axe.json new file mode 100644 index 000000000..9d36ed9fc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_bars.json b/src/generated/resources/assets/basemetals/items/antimony_bars.json new file mode 100644 index 000000000..d225bd2e0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_block.json b/src/generated/resources/assets/basemetals/items/antimony_block.json new file mode 100644 index 000000000..47aa2edcf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_bolt.json b/src/generated/resources/assets/basemetals/items/antimony_bolt.json new file mode 100644 index 000000000..8fa513620 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_boots.json b/src/generated/resources/assets/basemetals/items/antimony_boots.json new file mode 100644 index 000000000..b94df9c2f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_bow.json b/src/generated/resources/assets/basemetals/items/antimony_bow.json new file mode 100644 index 000000000..8d7659694 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_bucket.json b/src/generated/resources/assets/basemetals/items/antimony_bucket.json new file mode 100644 index 000000000..64b11169e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2563106 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_button.json b/src/generated/resources/assets/basemetals/items/antimony_button.json new file mode 100644 index 000000000..fd2166858 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_casing.json b/src/generated/resources/assets/basemetals/items/antimony_casing.json new file mode 100644 index 000000000..520936841 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_chestplate.json b/src/generated/resources/assets/basemetals/items/antimony_chestplate.json new file mode 100644 index 000000000..af64f5638 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_clump.json b/src/generated/resources/assets/basemetals/items/antimony_clump.json new file mode 100644 index 000000000..1808ae9e8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_crackhammer.json b/src/generated/resources/assets/basemetals/items/antimony_crackhammer.json new file mode 100644 index 000000000..be873c031 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_crossbow.json b/src/generated/resources/assets/basemetals/items/antimony_crossbow.json new file mode 100644 index 000000000..895b7b786 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_crushed.json b/src/generated/resources/assets/basemetals/items/antimony_crushed.json new file mode 100644 index 000000000..b79755a13 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_crushed_purified.json b/src/generated/resources/assets/basemetals/items/antimony_crushed_purified.json new file mode 100644 index 000000000..78c826043 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_crystal.json b/src/generated/resources/assets/basemetals/items/antimony_crystal.json new file mode 100644 index 000000000..2c9e4e774 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_dense_plate.json b/src/generated/resources/assets/basemetals/items/antimony_dense_plate.json new file mode 100644 index 000000000..62f411890 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_door.json b/src/generated/resources/assets/basemetals/items/antimony_door.json new file mode 100644 index 000000000..ea953564c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_fishing_rod.json b/src/generated/resources/assets/basemetals/items/antimony_fishing_rod.json new file mode 100644 index 000000000..801510456 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_gear.json b/src/generated/resources/assets/basemetals/items/antimony_gear.json new file mode 100644 index 000000000..7c412d634 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_helmet.json b/src/generated/resources/assets/basemetals/items/antimony_helmet.json new file mode 100644 index 000000000..26260a88e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_hoe.json b/src/generated/resources/assets/basemetals/items/antimony_hoe.json new file mode 100644 index 000000000..222472f26 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_horse_armor.json b/src/generated/resources/assets/basemetals/items/antimony_horse_armor.json new file mode 100644 index 000000000..268f7064c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_ingot.json b/src/generated/resources/assets/basemetals/items/antimony_ingot.json new file mode 100644 index 000000000..4d0dd6172 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_leggings.json b/src/generated/resources/assets/basemetals/items/antimony_leggings.json new file mode 100644 index 000000000..01bbaeb74 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_lever.json b/src/generated/resources/assets/basemetals/items/antimony_lever.json new file mode 100644 index 000000000..97833261f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_nugget.json b/src/generated/resources/assets/basemetals/items/antimony_nugget.json new file mode 100644 index 000000000..45df4c6a5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_ore.json b/src/generated/resources/assets/basemetals/items/antimony_ore.json new file mode 100644 index 000000000..fb0766edd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_pickaxe.json b/src/generated/resources/assets/basemetals/items/antimony_pickaxe.json new file mode 100644 index 000000000..822c8c551 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_plate.json b/src/generated/resources/assets/basemetals/items/antimony_plate.json new file mode 100644 index 000000000..f4dfcdff2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_powder.json b/src/generated/resources/assets/basemetals/items/antimony_powder.json new file mode 100644 index 000000000..3821cdc42 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_powder_dirty.json b/src/generated/resources/assets/basemetals/items/antimony_powder_dirty.json new file mode 100644 index 000000000..a6240bb01 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_pressure_plate.json b/src/generated/resources/assets/basemetals/items/antimony_pressure_plate.json new file mode 100644 index 000000000..4eb1be0d7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_raw.json b/src/generated/resources/assets/basemetals/items/antimony_raw.json new file mode 100644 index 000000000..df316114a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_rod.json b/src/generated/resources/assets/basemetals/items/antimony_rod.json new file mode 100644 index 000000000..24ccb6308 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_scythe.json b/src/generated/resources/assets/basemetals/items/antimony_scythe.json new file mode 100644 index 000000000..e5be37aff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_shard.json b/src/generated/resources/assets/basemetals/items/antimony_shard.json new file mode 100644 index 000000000..f482671a4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_shears.json b/src/generated/resources/assets/basemetals/items/antimony_shears.json new file mode 100644 index 000000000..9ed434095 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_shield.json b/src/generated/resources/assets/basemetals/items/antimony_shield.json new file mode 100644 index 000000000..4ed8ee2f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_shovel.json b/src/generated/resources/assets/basemetals/items/antimony_shovel.json new file mode 100644 index 000000000..3c25b045e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_slab.json b/src/generated/resources/assets/basemetals/items/antimony_slab.json new file mode 100644 index 000000000..f2b8dfef7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_smallpowder.json b/src/generated/resources/assets/basemetals/items/antimony_smallpowder.json new file mode 100644 index 000000000..48f558dda --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_stairs.json b/src/generated/resources/assets/basemetals/items/antimony_stairs.json new file mode 100644 index 000000000..7f5eeebcc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_sword.json b/src/generated/resources/assets/basemetals/items/antimony_sword.json new file mode 100644 index 000000000..f9139a9e8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_trapdoor.json b/src/generated/resources/assets/basemetals/items/antimony_trapdoor.json new file mode 100644 index 000000000..408956dfa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/antimony_wall.json b/src/generated/resources/assets/basemetals/items/antimony_wall.json new file mode 100644 index 000000000..49adf69ff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/antimony_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/antimony_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium.json b/src/generated/resources/assets/basemetals/items/aquarium.json new file mode 100644 index 000000000..0c76e723a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_arrow.json b/src/generated/resources/assets/basemetals/items/aquarium_arrow.json new file mode 100644 index 000000000..7b4889dd3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_axe.json b/src/generated/resources/assets/basemetals/items/aquarium_axe.json new file mode 100644 index 000000000..b738728b8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_bars.json b/src/generated/resources/assets/basemetals/items/aquarium_bars.json new file mode 100644 index 000000000..f30f101be --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_blend.json b/src/generated/resources/assets/basemetals/items/aquarium_blend.json new file mode 100644 index 000000000..cde3dd9a3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_block.json b/src/generated/resources/assets/basemetals/items/aquarium_block.json new file mode 100644 index 000000000..d52ebfa40 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_bolt.json b/src/generated/resources/assets/basemetals/items/aquarium_bolt.json new file mode 100644 index 000000000..5d4d6d702 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_boots.json b/src/generated/resources/assets/basemetals/items/aquarium_boots.json new file mode 100644 index 000000000..4a38019fc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_bow.json b/src/generated/resources/assets/basemetals/items/aquarium_bow.json new file mode 100644 index 000000000..73b8fd742 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_bucket.json b/src/generated/resources/assets/basemetals/items/aquarium_bucket.json new file mode 100644 index 000000000..57bcf3448 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -16776961 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_button.json b/src/generated/resources/assets/basemetals/items/aquarium_button.json new file mode 100644 index 000000000..2f9b6444a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_chestplate.json b/src/generated/resources/assets/basemetals/items/aquarium_chestplate.json new file mode 100644 index 000000000..62ce382c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_crackhammer.json b/src/generated/resources/assets/basemetals/items/aquarium_crackhammer.json new file mode 100644 index 000000000..2bc219bcd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_crossbow.json b/src/generated/resources/assets/basemetals/items/aquarium_crossbow.json new file mode 100644 index 000000000..09fb166f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_door.json b/src/generated/resources/assets/basemetals/items/aquarium_door.json new file mode 100644 index 000000000..1f6910178 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_fishing_rod.json b/src/generated/resources/assets/basemetals/items/aquarium_fishing_rod.json new file mode 100644 index 000000000..2cfa24848 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_gear.json b/src/generated/resources/assets/basemetals/items/aquarium_gear.json new file mode 100644 index 000000000..0db42cf85 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_helmet.json b/src/generated/resources/assets/basemetals/items/aquarium_helmet.json new file mode 100644 index 000000000..f27250084 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_hoe.json b/src/generated/resources/assets/basemetals/items/aquarium_hoe.json new file mode 100644 index 000000000..f0d100f7d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_horse_armor.json b/src/generated/resources/assets/basemetals/items/aquarium_horse_armor.json new file mode 100644 index 000000000..7dc715ba0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_ingot.json b/src/generated/resources/assets/basemetals/items/aquarium_ingot.json new file mode 100644 index 000000000..290f81196 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_leggings.json b/src/generated/resources/assets/basemetals/items/aquarium_leggings.json new file mode 100644 index 000000000..afe78597d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_lever.json b/src/generated/resources/assets/basemetals/items/aquarium_lever.json new file mode 100644 index 000000000..0ac22d366 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_nugget.json b/src/generated/resources/assets/basemetals/items/aquarium_nugget.json new file mode 100644 index 000000000..bc832467d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_pickaxe.json b/src/generated/resources/assets/basemetals/items/aquarium_pickaxe.json new file mode 100644 index 000000000..48137f32a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_plate.json b/src/generated/resources/assets/basemetals/items/aquarium_plate.json new file mode 100644 index 000000000..53414cb70 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_powder.json b/src/generated/resources/assets/basemetals/items/aquarium_powder.json new file mode 100644 index 000000000..b4cc8618b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_pressure_plate.json b/src/generated/resources/assets/basemetals/items/aquarium_pressure_plate.json new file mode 100644 index 000000000..1d8b8e76c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_rod.json b/src/generated/resources/assets/basemetals/items/aquarium_rod.json new file mode 100644 index 000000000..08e35057a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_scythe.json b/src/generated/resources/assets/basemetals/items/aquarium_scythe.json new file mode 100644 index 000000000..dd95a42e2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_shears.json b/src/generated/resources/assets/basemetals/items/aquarium_shears.json new file mode 100644 index 000000000..89dab11de --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_shield.json b/src/generated/resources/assets/basemetals/items/aquarium_shield.json new file mode 100644 index 000000000..f7824c48c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_shovel.json b/src/generated/resources/assets/basemetals/items/aquarium_shovel.json new file mode 100644 index 000000000..419841d50 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_slab.json b/src/generated/resources/assets/basemetals/items/aquarium_slab.json new file mode 100644 index 000000000..4a6977452 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_smallblend.json b/src/generated/resources/assets/basemetals/items/aquarium_smallblend.json new file mode 100644 index 000000000..413492edf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_smallpowder.json b/src/generated/resources/assets/basemetals/items/aquarium_smallpowder.json new file mode 100644 index 000000000..77fb6a82e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_stairs.json b/src/generated/resources/assets/basemetals/items/aquarium_stairs.json new file mode 100644 index 000000000..ecebab46e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_sword.json b/src/generated/resources/assets/basemetals/items/aquarium_sword.json new file mode 100644 index 000000000..952f9600f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_trapdoor.json b/src/generated/resources/assets/basemetals/items/aquarium_trapdoor.json new file mode 100644 index 000000000..41ba2ea50 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/aquarium_wall.json b/src/generated/resources/assets/basemetals/items/aquarium_wall.json new file mode 100644 index 000000000..bbf374830 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/aquarium_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/aquarium_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth.json b/src/generated/resources/assets/basemetals/items/bismuth.json new file mode 100644 index 000000000..e11f1fcec --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_arrow.json b/src/generated/resources/assets/basemetals/items/bismuth_arrow.json new file mode 100644 index 000000000..2ace5412a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_axe.json b/src/generated/resources/assets/basemetals/items/bismuth_axe.json new file mode 100644 index 000000000..6e77d0321 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_bars.json b/src/generated/resources/assets/basemetals/items/bismuth_bars.json new file mode 100644 index 000000000..efccb66d2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_block.json b/src/generated/resources/assets/basemetals/items/bismuth_block.json new file mode 100644 index 000000000..16e196645 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_bolt.json b/src/generated/resources/assets/basemetals/items/bismuth_bolt.json new file mode 100644 index 000000000..3c2458d01 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_boots.json b/src/generated/resources/assets/basemetals/items/bismuth_boots.json new file mode 100644 index 000000000..720bdba4b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_bow.json b/src/generated/resources/assets/basemetals/items/bismuth_bow.json new file mode 100644 index 000000000..2eade5307 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_bucket.json b/src/generated/resources/assets/basemetals/items/bismuth_bucket.json new file mode 100644 index 000000000..b1c307921 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2238517 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_button.json b/src/generated/resources/assets/basemetals/items/bismuth_button.json new file mode 100644 index 000000000..a944d5a7f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_casing.json b/src/generated/resources/assets/basemetals/items/bismuth_casing.json new file mode 100644 index 000000000..d34630e2f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_chestplate.json b/src/generated/resources/assets/basemetals/items/bismuth_chestplate.json new file mode 100644 index 000000000..2e4bbc4cf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_clump.json b/src/generated/resources/assets/basemetals/items/bismuth_clump.json new file mode 100644 index 000000000..7a98d5a76 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_crackhammer.json b/src/generated/resources/assets/basemetals/items/bismuth_crackhammer.json new file mode 100644 index 000000000..fd22fc86f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_crossbow.json b/src/generated/resources/assets/basemetals/items/bismuth_crossbow.json new file mode 100644 index 000000000..b9112116c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_crushed.json b/src/generated/resources/assets/basemetals/items/bismuth_crushed.json new file mode 100644 index 000000000..103d06797 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_crushed_purified.json b/src/generated/resources/assets/basemetals/items/bismuth_crushed_purified.json new file mode 100644 index 000000000..94107a6a7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_crystal.json b/src/generated/resources/assets/basemetals/items/bismuth_crystal.json new file mode 100644 index 000000000..0fa75b50f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_dense_plate.json b/src/generated/resources/assets/basemetals/items/bismuth_dense_plate.json new file mode 100644 index 000000000..e34c5898b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_door.json b/src/generated/resources/assets/basemetals/items/bismuth_door.json new file mode 100644 index 000000000..7935f90c1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_fishing_rod.json b/src/generated/resources/assets/basemetals/items/bismuth_fishing_rod.json new file mode 100644 index 000000000..60dbcdd79 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_gear.json b/src/generated/resources/assets/basemetals/items/bismuth_gear.json new file mode 100644 index 000000000..124dbd01c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_helmet.json b/src/generated/resources/assets/basemetals/items/bismuth_helmet.json new file mode 100644 index 000000000..4b9674e09 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_hoe.json b/src/generated/resources/assets/basemetals/items/bismuth_hoe.json new file mode 100644 index 000000000..5036aa5a8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_horse_armor.json b/src/generated/resources/assets/basemetals/items/bismuth_horse_armor.json new file mode 100644 index 000000000..07400d89d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_ingot.json b/src/generated/resources/assets/basemetals/items/bismuth_ingot.json new file mode 100644 index 000000000..9c12a8573 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_leggings.json b/src/generated/resources/assets/basemetals/items/bismuth_leggings.json new file mode 100644 index 000000000..7966859b8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_lever.json b/src/generated/resources/assets/basemetals/items/bismuth_lever.json new file mode 100644 index 000000000..50f3574bc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_nugget.json b/src/generated/resources/assets/basemetals/items/bismuth_nugget.json new file mode 100644 index 000000000..090d1ee8a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_ore.json b/src/generated/resources/assets/basemetals/items/bismuth_ore.json new file mode 100644 index 000000000..4e0f46f50 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_pickaxe.json b/src/generated/resources/assets/basemetals/items/bismuth_pickaxe.json new file mode 100644 index 000000000..3ce16cb44 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_plate.json b/src/generated/resources/assets/basemetals/items/bismuth_plate.json new file mode 100644 index 000000000..229b0ede5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_powder.json b/src/generated/resources/assets/basemetals/items/bismuth_powder.json new file mode 100644 index 000000000..6ce17e9d9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_powder_dirty.json b/src/generated/resources/assets/basemetals/items/bismuth_powder_dirty.json new file mode 100644 index 000000000..e391afa07 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_pressure_plate.json b/src/generated/resources/assets/basemetals/items/bismuth_pressure_plate.json new file mode 100644 index 000000000..a3f752da2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_raw.json b/src/generated/resources/assets/basemetals/items/bismuth_raw.json new file mode 100644 index 000000000..b58519ce2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_rod.json b/src/generated/resources/assets/basemetals/items/bismuth_rod.json new file mode 100644 index 000000000..6b6339e03 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_scythe.json b/src/generated/resources/assets/basemetals/items/bismuth_scythe.json new file mode 100644 index 000000000..23528afec --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_shard.json b/src/generated/resources/assets/basemetals/items/bismuth_shard.json new file mode 100644 index 000000000..bfefa1f33 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_shears.json b/src/generated/resources/assets/basemetals/items/bismuth_shears.json new file mode 100644 index 000000000..de17ff729 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_shield.json b/src/generated/resources/assets/basemetals/items/bismuth_shield.json new file mode 100644 index 000000000..2174efefa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_shovel.json b/src/generated/resources/assets/basemetals/items/bismuth_shovel.json new file mode 100644 index 000000000..cb489878d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_slab.json b/src/generated/resources/assets/basemetals/items/bismuth_slab.json new file mode 100644 index 000000000..94e3a93e1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_smallpowder.json b/src/generated/resources/assets/basemetals/items/bismuth_smallpowder.json new file mode 100644 index 000000000..a0130cc89 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_stairs.json b/src/generated/resources/assets/basemetals/items/bismuth_stairs.json new file mode 100644 index 000000000..e3480c224 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_sword.json b/src/generated/resources/assets/basemetals/items/bismuth_sword.json new file mode 100644 index 000000000..154381e61 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_trapdoor.json b/src/generated/resources/assets/basemetals/items/bismuth_trapdoor.json new file mode 100644 index 000000000..baf353776 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bismuth_wall.json b/src/generated/resources/assets/basemetals/items/bismuth_wall.json new file mode 100644 index 000000000..12ba692e6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bismuth_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bismuth_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass.json b/src/generated/resources/assets/basemetals/items/brass.json new file mode 100644 index 000000000..a36604ab4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_arrow.json b/src/generated/resources/assets/basemetals/items/brass_arrow.json new file mode 100644 index 000000000..12ca5e654 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_axe.json b/src/generated/resources/assets/basemetals/items/brass_axe.json new file mode 100644 index 000000000..5962f3a96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_bars.json b/src/generated/resources/assets/basemetals/items/brass_bars.json new file mode 100644 index 000000000..c261f0ec8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_blend.json b/src/generated/resources/assets/basemetals/items/brass_blend.json new file mode 100644 index 000000000..1deee79fd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_block.json b/src/generated/resources/assets/basemetals/items/brass_block.json new file mode 100644 index 000000000..8ffd038ff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_bolt.json b/src/generated/resources/assets/basemetals/items/brass_bolt.json new file mode 100644 index 000000000..06746d1bc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_boots.json b/src/generated/resources/assets/basemetals/items/brass_boots.json new file mode 100644 index 000000000..6ce242b94 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_bow.json b/src/generated/resources/assets/basemetals/items/brass_bow.json new file mode 100644 index 000000000..47cee62f0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_bucket.json b/src/generated/resources/assets/basemetals/items/brass_bucket.json new file mode 100644 index 000000000..2f74b6d27 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -7308 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_button.json b/src/generated/resources/assets/basemetals/items/brass_button.json new file mode 100644 index 000000000..6cb71c561 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_chestplate.json b/src/generated/resources/assets/basemetals/items/brass_chestplate.json new file mode 100644 index 000000000..e1c93e784 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_crackhammer.json b/src/generated/resources/assets/basemetals/items/brass_crackhammer.json new file mode 100644 index 000000000..476de1625 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_crossbow.json b/src/generated/resources/assets/basemetals/items/brass_crossbow.json new file mode 100644 index 000000000..c5e35b751 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/brass_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/brass_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_door.json b/src/generated/resources/assets/basemetals/items/brass_door.json new file mode 100644 index 000000000..c85571be3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_fishing_rod.json b/src/generated/resources/assets/basemetals/items/brass_fishing_rod.json new file mode 100644 index 000000000..13745b3ce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/brass_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/brass_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_gear.json b/src/generated/resources/assets/basemetals/items/brass_gear.json new file mode 100644 index 000000000..f803a318c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_helmet.json b/src/generated/resources/assets/basemetals/items/brass_helmet.json new file mode 100644 index 000000000..8df953b73 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_hoe.json b/src/generated/resources/assets/basemetals/items/brass_hoe.json new file mode 100644 index 000000000..92c0070af --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_horse_armor.json b/src/generated/resources/assets/basemetals/items/brass_horse_armor.json new file mode 100644 index 000000000..2202339fa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_ingot.json b/src/generated/resources/assets/basemetals/items/brass_ingot.json new file mode 100644 index 000000000..ba951cb3f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_leggings.json b/src/generated/resources/assets/basemetals/items/brass_leggings.json new file mode 100644 index 000000000..9806e2f61 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_lever.json b/src/generated/resources/assets/basemetals/items/brass_lever.json new file mode 100644 index 000000000..42b195c54 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_nugget.json b/src/generated/resources/assets/basemetals/items/brass_nugget.json new file mode 100644 index 000000000..b87f77707 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_pickaxe.json b/src/generated/resources/assets/basemetals/items/brass_pickaxe.json new file mode 100644 index 000000000..6f07dfe96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_plate.json b/src/generated/resources/assets/basemetals/items/brass_plate.json new file mode 100644 index 000000000..e8f7fa9fe --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_powder.json b/src/generated/resources/assets/basemetals/items/brass_powder.json new file mode 100644 index 000000000..a42e7a7e7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_pressure_plate.json b/src/generated/resources/assets/basemetals/items/brass_pressure_plate.json new file mode 100644 index 000000000..077297968 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_rod.json b/src/generated/resources/assets/basemetals/items/brass_rod.json new file mode 100644 index 000000000..9fbacd758 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_scythe.json b/src/generated/resources/assets/basemetals/items/brass_scythe.json new file mode 100644 index 000000000..4baa6dd55 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_shears.json b/src/generated/resources/assets/basemetals/items/brass_shears.json new file mode 100644 index 000000000..0888e440b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_shield.json b/src/generated/resources/assets/basemetals/items/brass_shield.json new file mode 100644 index 000000000..ee5637ed0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/brass_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/brass_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_shovel.json b/src/generated/resources/assets/basemetals/items/brass_shovel.json new file mode 100644 index 000000000..4753c539b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_slab.json b/src/generated/resources/assets/basemetals/items/brass_slab.json new file mode 100644 index 000000000..a20e9f27b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_smallblend.json b/src/generated/resources/assets/basemetals/items/brass_smallblend.json new file mode 100644 index 000000000..fec55812a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_smallpowder.json b/src/generated/resources/assets/basemetals/items/brass_smallpowder.json new file mode 100644 index 000000000..3ccd88a15 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_stairs.json b/src/generated/resources/assets/basemetals/items/brass_stairs.json new file mode 100644 index 000000000..23e1c84f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_sword.json b/src/generated/resources/assets/basemetals/items/brass_sword.json new file mode 100644 index 000000000..d790c5948 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_trapdoor.json b/src/generated/resources/assets/basemetals/items/brass_trapdoor.json new file mode 100644 index 000000000..b1116181c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/brass_wall.json b/src/generated/resources/assets/basemetals/items/brass_wall.json new file mode 100644 index 000000000..f86280531 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/brass_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/brass_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze.json b/src/generated/resources/assets/basemetals/items/bronze.json new file mode 100644 index 000000000..2be37a989 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_arrow.json b/src/generated/resources/assets/basemetals/items/bronze_arrow.json new file mode 100644 index 000000000..d09f20bb9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_axe.json b/src/generated/resources/assets/basemetals/items/bronze_axe.json new file mode 100644 index 000000000..0d589233e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_bars.json b/src/generated/resources/assets/basemetals/items/bronze_bars.json new file mode 100644 index 000000000..8432d97b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_blend.json b/src/generated/resources/assets/basemetals/items/bronze_blend.json new file mode 100644 index 000000000..f2d724410 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_block.json b/src/generated/resources/assets/basemetals/items/bronze_block.json new file mode 100644 index 000000000..b9ae82fd4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_bolt.json b/src/generated/resources/assets/basemetals/items/bronze_bolt.json new file mode 100644 index 000000000..02e960239 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_boots.json b/src/generated/resources/assets/basemetals/items/bronze_boots.json new file mode 100644 index 000000000..e40647328 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_bow.json b/src/generated/resources/assets/basemetals/items/bronze_bow.json new file mode 100644 index 000000000..955d9e808 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_bucket.json b/src/generated/resources/assets/basemetals/items/bronze_bucket.json new file mode 100644 index 000000000..0c899545e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -547505 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_button.json b/src/generated/resources/assets/basemetals/items/bronze_button.json new file mode 100644 index 000000000..e7af056d6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_chestplate.json b/src/generated/resources/assets/basemetals/items/bronze_chestplate.json new file mode 100644 index 000000000..5c16ae305 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_crackhammer.json b/src/generated/resources/assets/basemetals/items/bronze_crackhammer.json new file mode 100644 index 000000000..a77749954 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_crossbow.json b/src/generated/resources/assets/basemetals/items/bronze_crossbow.json new file mode 100644 index 000000000..a205b5bce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_door.json b/src/generated/resources/assets/basemetals/items/bronze_door.json new file mode 100644 index 000000000..7632f3744 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_fishing_rod.json b/src/generated/resources/assets/basemetals/items/bronze_fishing_rod.json new file mode 100644 index 000000000..87a2fa780 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_gear.json b/src/generated/resources/assets/basemetals/items/bronze_gear.json new file mode 100644 index 000000000..bfb84e803 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_helmet.json b/src/generated/resources/assets/basemetals/items/bronze_helmet.json new file mode 100644 index 000000000..cf8a3cc7e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_hoe.json b/src/generated/resources/assets/basemetals/items/bronze_hoe.json new file mode 100644 index 000000000..125dd1500 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_horse_armor.json b/src/generated/resources/assets/basemetals/items/bronze_horse_armor.json new file mode 100644 index 000000000..7d5b4d2c6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_ingot.json b/src/generated/resources/assets/basemetals/items/bronze_ingot.json new file mode 100644 index 000000000..d59cb4caa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_leggings.json b/src/generated/resources/assets/basemetals/items/bronze_leggings.json new file mode 100644 index 000000000..549c36b4a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_lever.json b/src/generated/resources/assets/basemetals/items/bronze_lever.json new file mode 100644 index 000000000..288c4398f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_nugget.json b/src/generated/resources/assets/basemetals/items/bronze_nugget.json new file mode 100644 index 000000000..93d77e18b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_pickaxe.json b/src/generated/resources/assets/basemetals/items/bronze_pickaxe.json new file mode 100644 index 000000000..41c35d00b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_plate.json b/src/generated/resources/assets/basemetals/items/bronze_plate.json new file mode 100644 index 000000000..0335911ca --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_powder.json b/src/generated/resources/assets/basemetals/items/bronze_powder.json new file mode 100644 index 000000000..4456c9ea5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_pressure_plate.json b/src/generated/resources/assets/basemetals/items/bronze_pressure_plate.json new file mode 100644 index 000000000..ea6d6b0d7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_rod.json b/src/generated/resources/assets/basemetals/items/bronze_rod.json new file mode 100644 index 000000000..ffa71d84f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_scythe.json b/src/generated/resources/assets/basemetals/items/bronze_scythe.json new file mode 100644 index 000000000..f512101de --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_shears.json b/src/generated/resources/assets/basemetals/items/bronze_shears.json new file mode 100644 index 000000000..2ca4424bb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_shield.json b/src/generated/resources/assets/basemetals/items/bronze_shield.json new file mode 100644 index 000000000..5c81cb8b2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_shovel.json b/src/generated/resources/assets/basemetals/items/bronze_shovel.json new file mode 100644 index 000000000..e633f5170 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_slab.json b/src/generated/resources/assets/basemetals/items/bronze_slab.json new file mode 100644 index 000000000..167f34f28 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_smallblend.json b/src/generated/resources/assets/basemetals/items/bronze_smallblend.json new file mode 100644 index 000000000..7a44be573 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_smallpowder.json b/src/generated/resources/assets/basemetals/items/bronze_smallpowder.json new file mode 100644 index 000000000..b8b8927b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_stairs.json b/src/generated/resources/assets/basemetals/items/bronze_stairs.json new file mode 100644 index 000000000..2c0394a8b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_sword.json b/src/generated/resources/assets/basemetals/items/bronze_sword.json new file mode 100644 index 000000000..96737780e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_trapdoor.json b/src/generated/resources/assets/basemetals/items/bronze_trapdoor.json new file mode 100644 index 000000000..0f09f3c00 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/bronze_wall.json b/src/generated/resources/assets/basemetals/items/bronze_wall.json new file mode 100644 index 000000000..a3a1a9e04 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/bronze_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/bronze_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal.json b/src/generated/resources/assets/basemetals/items/charcoal.json new file mode 100644 index 000000000..dee028e93 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal_block.json b/src/generated/resources/assets/basemetals/items/charcoal_block.json new file mode 100644 index 000000000..d3f3db00b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal_bucket.json b/src/generated/resources/assets/basemetals/items/charcoal_bucket.json new file mode 100644 index 000000000..4277a4926 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -14475496 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal_nugget.json b/src/generated/resources/assets/basemetals/items/charcoal_nugget.json new file mode 100644 index 000000000..1937a7f65 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal_powder.json b/src/generated/resources/assets/basemetals/items/charcoal_powder.json new file mode 100644 index 000000000..4c9b467b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/charcoal_smallpowder.json b/src/generated/resources/assets/basemetals/items/charcoal_smallpowder.json new file mode 100644 index 000000000..7551400e7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/charcoal_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/charcoal_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coal.json b/src/generated/resources/assets/basemetals/items/coal.json new file mode 100644 index 000000000..b1e4b58e1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coal_bucket.json b/src/generated/resources/assets/basemetals/items/coal_bucket.json new file mode 100644 index 000000000..9e0c42f66 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coal_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coal_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -15395563 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coal_nugget.json b/src/generated/resources/assets/basemetals/items/coal_nugget.json new file mode 100644 index 000000000..f118e8b3d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coal_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coal_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coal_powder.json b/src/generated/resources/assets/basemetals/items/coal_powder.json new file mode 100644 index 000000000..806b2b92b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coal_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coal_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coal_smallpowder.json b/src/generated/resources/assets/basemetals/items/coal_smallpowder.json new file mode 100644 index 000000000..1282415f8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coal_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coal_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron.json b/src/generated/resources/assets/basemetals/items/coldiron.json new file mode 100644 index 000000000..5e846c54d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_arrow.json b/src/generated/resources/assets/basemetals/items/coldiron_arrow.json new file mode 100644 index 000000000..139da8099 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_axe.json b/src/generated/resources/assets/basemetals/items/coldiron_axe.json new file mode 100644 index 000000000..2382b6c46 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_bars.json b/src/generated/resources/assets/basemetals/items/coldiron_bars.json new file mode 100644 index 000000000..61f382e18 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_block.json b/src/generated/resources/assets/basemetals/items/coldiron_block.json new file mode 100644 index 000000000..02d8b7247 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_bolt.json b/src/generated/resources/assets/basemetals/items/coldiron_bolt.json new file mode 100644 index 000000000..515c3e8bd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_boots.json b/src/generated/resources/assets/basemetals/items/coldiron_boots.json new file mode 100644 index 000000000..083b6c48e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_bow.json b/src/generated/resources/assets/basemetals/items/coldiron_bow.json new file mode 100644 index 000000000..3c01b285d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_bucket.json b/src/generated/resources/assets/basemetals/items/coldiron_bucket.json new file mode 100644 index 000000000..cbacbe810 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -3682576 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_button.json b/src/generated/resources/assets/basemetals/items/coldiron_button.json new file mode 100644 index 000000000..fd75b8a06 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_casing.json b/src/generated/resources/assets/basemetals/items/coldiron_casing.json new file mode 100644 index 000000000..93df05fdb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_chestplate.json b/src/generated/resources/assets/basemetals/items/coldiron_chestplate.json new file mode 100644 index 000000000..0ee73a83c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_clump.json b/src/generated/resources/assets/basemetals/items/coldiron_clump.json new file mode 100644 index 000000000..5ee5e9777 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_crackhammer.json b/src/generated/resources/assets/basemetals/items/coldiron_crackhammer.json new file mode 100644 index 000000000..16828958e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_crossbow.json b/src/generated/resources/assets/basemetals/items/coldiron_crossbow.json new file mode 100644 index 000000000..9c9efb29d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_crushed.json b/src/generated/resources/assets/basemetals/items/coldiron_crushed.json new file mode 100644 index 000000000..a5d547160 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_crushed_purified.json b/src/generated/resources/assets/basemetals/items/coldiron_crushed_purified.json new file mode 100644 index 000000000..b5298f742 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_crystal.json b/src/generated/resources/assets/basemetals/items/coldiron_crystal.json new file mode 100644 index 000000000..40ae0b39d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_dense_plate.json b/src/generated/resources/assets/basemetals/items/coldiron_dense_plate.json new file mode 100644 index 000000000..daa65a014 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_door.json b/src/generated/resources/assets/basemetals/items/coldiron_door.json new file mode 100644 index 000000000..cca69fb16 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_fishing_rod.json b/src/generated/resources/assets/basemetals/items/coldiron_fishing_rod.json new file mode 100644 index 000000000..59861616b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_gear.json b/src/generated/resources/assets/basemetals/items/coldiron_gear.json new file mode 100644 index 000000000..50ae4dc0a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_helmet.json b/src/generated/resources/assets/basemetals/items/coldiron_helmet.json new file mode 100644 index 000000000..f8433b178 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_hoe.json b/src/generated/resources/assets/basemetals/items/coldiron_hoe.json new file mode 100644 index 000000000..c6299fd75 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_horse_armor.json b/src/generated/resources/assets/basemetals/items/coldiron_horse_armor.json new file mode 100644 index 000000000..295509a1a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_ingot.json b/src/generated/resources/assets/basemetals/items/coldiron_ingot.json new file mode 100644 index 000000000..c71ee07c6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_leggings.json b/src/generated/resources/assets/basemetals/items/coldiron_leggings.json new file mode 100644 index 000000000..5ab613798 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_lever.json b/src/generated/resources/assets/basemetals/items/coldiron_lever.json new file mode 100644 index 000000000..e195c45c9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_nugget.json b/src/generated/resources/assets/basemetals/items/coldiron_nugget.json new file mode 100644 index 000000000..08ac5981b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_ore.json b/src/generated/resources/assets/basemetals/items/coldiron_ore.json new file mode 100644 index 000000000..928911f96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_pickaxe.json b/src/generated/resources/assets/basemetals/items/coldiron_pickaxe.json new file mode 100644 index 000000000..ad472d385 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_plate.json b/src/generated/resources/assets/basemetals/items/coldiron_plate.json new file mode 100644 index 000000000..fefb3f607 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_powder.json b/src/generated/resources/assets/basemetals/items/coldiron_powder.json new file mode 100644 index 000000000..8e9715ffd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_powder_dirty.json b/src/generated/resources/assets/basemetals/items/coldiron_powder_dirty.json new file mode 100644 index 000000000..750174766 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_pressure_plate.json b/src/generated/resources/assets/basemetals/items/coldiron_pressure_plate.json new file mode 100644 index 000000000..33af95f09 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_raw.json b/src/generated/resources/assets/basemetals/items/coldiron_raw.json new file mode 100644 index 000000000..ca383dbc6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_rod.json b/src/generated/resources/assets/basemetals/items/coldiron_rod.json new file mode 100644 index 000000000..4c5bb6cf4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_scythe.json b/src/generated/resources/assets/basemetals/items/coldiron_scythe.json new file mode 100644 index 000000000..cc6fd0553 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_shard.json b/src/generated/resources/assets/basemetals/items/coldiron_shard.json new file mode 100644 index 000000000..f2832b8a5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_shears.json b/src/generated/resources/assets/basemetals/items/coldiron_shears.json new file mode 100644 index 000000000..1af6381d6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_shield.json b/src/generated/resources/assets/basemetals/items/coldiron_shield.json new file mode 100644 index 000000000..3b9f3c9e1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_shovel.json b/src/generated/resources/assets/basemetals/items/coldiron_shovel.json new file mode 100644 index 000000000..473bae42d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_slab.json b/src/generated/resources/assets/basemetals/items/coldiron_slab.json new file mode 100644 index 000000000..c84a01eb6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_smallpowder.json b/src/generated/resources/assets/basemetals/items/coldiron_smallpowder.json new file mode 100644 index 000000000..f63e05e8c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_stairs.json b/src/generated/resources/assets/basemetals/items/coldiron_stairs.json new file mode 100644 index 000000000..5ddb1f495 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_sword.json b/src/generated/resources/assets/basemetals/items/coldiron_sword.json new file mode 100644 index 000000000..af3a75722 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_trapdoor.json b/src/generated/resources/assets/basemetals/items/coldiron_trapdoor.json new file mode 100644 index 000000000..edf559508 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/coldiron_wall.json b/src/generated/resources/assets/basemetals/items/coldiron_wall.json new file mode 100644 index 000000000..ca76e9ccb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/coldiron_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/coldiron_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper.json b/src/generated/resources/assets/basemetals/items/copper.json new file mode 100644 index 000000000..e3a343847 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_arrow.json b/src/generated/resources/assets/basemetals/items/copper_arrow.json new file mode 100644 index 000000000..58c9df21a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_axe.json b/src/generated/resources/assets/basemetals/items/copper_axe.json new file mode 100644 index 000000000..fdf8e19aa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_bars.json b/src/generated/resources/assets/basemetals/items/copper_bars.json new file mode 100644 index 000000000..38fa390b1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_block.json b/src/generated/resources/assets/basemetals/items/copper_block.json new file mode 100644 index 000000000..2136a1190 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_bolt.json b/src/generated/resources/assets/basemetals/items/copper_bolt.json new file mode 100644 index 000000000..7058ee3c5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_boots.json b/src/generated/resources/assets/basemetals/items/copper_boots.json new file mode 100644 index 000000000..a9046282e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_bow.json b/src/generated/resources/assets/basemetals/items/copper_bow.json new file mode 100644 index 000000000..d03e44ba5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_bucket.json b/src/generated/resources/assets/basemetals/items/copper_bucket.json new file mode 100644 index 000000000..349c530c3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -24712 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_button.json b/src/generated/resources/assets/basemetals/items/copper_button.json new file mode 100644 index 000000000..62d7de8a1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_chestplate.json b/src/generated/resources/assets/basemetals/items/copper_chestplate.json new file mode 100644 index 000000000..324477b9a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_crackhammer.json b/src/generated/resources/assets/basemetals/items/copper_crackhammer.json new file mode 100644 index 000000000..61ee315f6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_crossbow.json b/src/generated/resources/assets/basemetals/items/copper_crossbow.json new file mode 100644 index 000000000..db0a3f289 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/copper_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/copper_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_door.json b/src/generated/resources/assets/basemetals/items/copper_door.json new file mode 100644 index 000000000..7d1fe03ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_fishing_rod.json b/src/generated/resources/assets/basemetals/items/copper_fishing_rod.json new file mode 100644 index 000000000..a387e2e22 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/copper_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/copper_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_gear.json b/src/generated/resources/assets/basemetals/items/copper_gear.json new file mode 100644 index 000000000..b48756586 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_helmet.json b/src/generated/resources/assets/basemetals/items/copper_helmet.json new file mode 100644 index 000000000..58556fd3f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_hoe.json b/src/generated/resources/assets/basemetals/items/copper_hoe.json new file mode 100644 index 000000000..ec697d594 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_horse_armor.json b/src/generated/resources/assets/basemetals/items/copper_horse_armor.json new file mode 100644 index 000000000..1ad84b555 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_ingot.json b/src/generated/resources/assets/basemetals/items/copper_ingot.json new file mode 100644 index 000000000..575f56efc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_leggings.json b/src/generated/resources/assets/basemetals/items/copper_leggings.json new file mode 100644 index 000000000..c930212e3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_lever.json b/src/generated/resources/assets/basemetals/items/copper_lever.json new file mode 100644 index 000000000..a350bd2e7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_nugget.json b/src/generated/resources/assets/basemetals/items/copper_nugget.json new file mode 100644 index 000000000..bf3750327 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_ore.json b/src/generated/resources/assets/basemetals/items/copper_ore.json new file mode 100644 index 000000000..9edf57750 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_pickaxe.json b/src/generated/resources/assets/basemetals/items/copper_pickaxe.json new file mode 100644 index 000000000..ad39c95a3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_plate.json b/src/generated/resources/assets/basemetals/items/copper_plate.json new file mode 100644 index 000000000..03b3a20f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_powder.json b/src/generated/resources/assets/basemetals/items/copper_powder.json new file mode 100644 index 000000000..1b14ef8bd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_pressure_plate.json b/src/generated/resources/assets/basemetals/items/copper_pressure_plate.json new file mode 100644 index 000000000..906f53f37 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_rod.json b/src/generated/resources/assets/basemetals/items/copper_rod.json new file mode 100644 index 000000000..fe5ae1580 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_scythe.json b/src/generated/resources/assets/basemetals/items/copper_scythe.json new file mode 100644 index 000000000..00314976d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_shears.json b/src/generated/resources/assets/basemetals/items/copper_shears.json new file mode 100644 index 000000000..1ddb40c3b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_shield.json b/src/generated/resources/assets/basemetals/items/copper_shield.json new file mode 100644 index 000000000..5ea111b21 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/copper_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/copper_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_shovel.json b/src/generated/resources/assets/basemetals/items/copper_shovel.json new file mode 100644 index 000000000..4ba3b50e3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_slab.json b/src/generated/resources/assets/basemetals/items/copper_slab.json new file mode 100644 index 000000000..48022d268 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_smallpowder.json b/src/generated/resources/assets/basemetals/items/copper_smallpowder.json new file mode 100644 index 000000000..61fbb7c69 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_stairs.json b/src/generated/resources/assets/basemetals/items/copper_stairs.json new file mode 100644 index 000000000..493be6e25 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_sword.json b/src/generated/resources/assets/basemetals/items/copper_sword.json new file mode 100644 index 000000000..f9933c7af --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_trapdoor.json b/src/generated/resources/assets/basemetals/items/copper_trapdoor.json new file mode 100644 index 000000000..43a2294f4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/copper_wall.json b/src/generated/resources/assets/basemetals/items/copper_wall.json new file mode 100644 index 000000000..0dbb59ff6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/copper_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/copper_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel.json b/src/generated/resources/assets/basemetals/items/cupronickel.json new file mode 100644 index 000000000..eff433300 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_arrow.json b/src/generated/resources/assets/basemetals/items/cupronickel_arrow.json new file mode 100644 index 000000000..e841363b6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_axe.json b/src/generated/resources/assets/basemetals/items/cupronickel_axe.json new file mode 100644 index 000000000..d1a531a7d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_bars.json b/src/generated/resources/assets/basemetals/items/cupronickel_bars.json new file mode 100644 index 000000000..a4c91baed --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_blend.json b/src/generated/resources/assets/basemetals/items/cupronickel_blend.json new file mode 100644 index 000000000..34a18a0fd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_block.json b/src/generated/resources/assets/basemetals/items/cupronickel_block.json new file mode 100644 index 000000000..e00a7a3f4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_bolt.json b/src/generated/resources/assets/basemetals/items/cupronickel_bolt.json new file mode 100644 index 000000000..7b0526f9f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_boots.json b/src/generated/resources/assets/basemetals/items/cupronickel_boots.json new file mode 100644 index 000000000..a0921587c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_bow.json b/src/generated/resources/assets/basemetals/items/cupronickel_bow.json new file mode 100644 index 000000000..ad768aa54 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_bucket.json b/src/generated/resources/assets/basemetals/items/cupronickel_bucket.json new file mode 100644 index 000000000..aac5555e6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -3626129 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_button.json b/src/generated/resources/assets/basemetals/items/cupronickel_button.json new file mode 100644 index 000000000..3fa359c01 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_chestplate.json b/src/generated/resources/assets/basemetals/items/cupronickel_chestplate.json new file mode 100644 index 000000000..9eea17bb4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_crackhammer.json b/src/generated/resources/assets/basemetals/items/cupronickel_crackhammer.json new file mode 100644 index 000000000..8a56b2591 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_crossbow.json b/src/generated/resources/assets/basemetals/items/cupronickel_crossbow.json new file mode 100644 index 000000000..cd6ea1a8f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_door.json b/src/generated/resources/assets/basemetals/items/cupronickel_door.json new file mode 100644 index 000000000..e48224c80 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_fishing_rod.json b/src/generated/resources/assets/basemetals/items/cupronickel_fishing_rod.json new file mode 100644 index 000000000..3542703f8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_gear.json b/src/generated/resources/assets/basemetals/items/cupronickel_gear.json new file mode 100644 index 000000000..d4d46b79f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_helmet.json b/src/generated/resources/assets/basemetals/items/cupronickel_helmet.json new file mode 100644 index 000000000..115ea0286 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_hoe.json b/src/generated/resources/assets/basemetals/items/cupronickel_hoe.json new file mode 100644 index 000000000..8a68e4757 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_horse_armor.json b/src/generated/resources/assets/basemetals/items/cupronickel_horse_armor.json new file mode 100644 index 000000000..b2dbffbbb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_ingot.json b/src/generated/resources/assets/basemetals/items/cupronickel_ingot.json new file mode 100644 index 000000000..7b03482cf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_leggings.json b/src/generated/resources/assets/basemetals/items/cupronickel_leggings.json new file mode 100644 index 000000000..5fe2bd32e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_lever.json b/src/generated/resources/assets/basemetals/items/cupronickel_lever.json new file mode 100644 index 000000000..5577ee5cf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_nugget.json b/src/generated/resources/assets/basemetals/items/cupronickel_nugget.json new file mode 100644 index 000000000..ddc7254ef --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_pickaxe.json b/src/generated/resources/assets/basemetals/items/cupronickel_pickaxe.json new file mode 100644 index 000000000..59d39f08f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_plate.json b/src/generated/resources/assets/basemetals/items/cupronickel_plate.json new file mode 100644 index 000000000..858b8a921 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_powder.json b/src/generated/resources/assets/basemetals/items/cupronickel_powder.json new file mode 100644 index 000000000..f344ebcac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_pressure_plate.json b/src/generated/resources/assets/basemetals/items/cupronickel_pressure_plate.json new file mode 100644 index 000000000..ee36dfc2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_rod.json b/src/generated/resources/assets/basemetals/items/cupronickel_rod.json new file mode 100644 index 000000000..6e47d3627 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_scythe.json b/src/generated/resources/assets/basemetals/items/cupronickel_scythe.json new file mode 100644 index 000000000..9f0a6994d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_shears.json b/src/generated/resources/assets/basemetals/items/cupronickel_shears.json new file mode 100644 index 000000000..76938f664 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_shield.json b/src/generated/resources/assets/basemetals/items/cupronickel_shield.json new file mode 100644 index 000000000..1014f8c43 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_shovel.json b/src/generated/resources/assets/basemetals/items/cupronickel_shovel.json new file mode 100644 index 000000000..c19d51e4e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_slab.json b/src/generated/resources/assets/basemetals/items/cupronickel_slab.json new file mode 100644 index 000000000..6977f5819 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_smallblend.json b/src/generated/resources/assets/basemetals/items/cupronickel_smallblend.json new file mode 100644 index 000000000..c8a299ff0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_smallpowder.json b/src/generated/resources/assets/basemetals/items/cupronickel_smallpowder.json new file mode 100644 index 000000000..9e482fc35 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_stairs.json b/src/generated/resources/assets/basemetals/items/cupronickel_stairs.json new file mode 100644 index 000000000..89871ae2b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_sword.json b/src/generated/resources/assets/basemetals/items/cupronickel_sword.json new file mode 100644 index 000000000..a5d143bff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_trapdoor.json b/src/generated/resources/assets/basemetals/items/cupronickel_trapdoor.json new file mode 100644 index 000000000..f43b2b73f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/cupronickel_wall.json b/src/generated/resources/assets/basemetals/items/cupronickel_wall.json new file mode 100644 index 000000000..3e9a268e9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/cupronickel_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/cupronickel_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond.json b/src/generated/resources/assets/basemetals/items/diamond.json new file mode 100644 index 000000000..2c0a8dad1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_arrow.json b/src/generated/resources/assets/basemetals/items/diamond_arrow.json new file mode 100644 index 000000000..1fd1b6701 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_bars.json b/src/generated/resources/assets/basemetals/items/diamond_bars.json new file mode 100644 index 000000000..f8e7846ff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_blend.json b/src/generated/resources/assets/basemetals/items/diamond_blend.json new file mode 100644 index 000000000..c16d2b961 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_bolt.json b/src/generated/resources/assets/basemetals/items/diamond_bolt.json new file mode 100644 index 000000000..8dc16279c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_bow.json b/src/generated/resources/assets/basemetals/items/diamond_bow.json new file mode 100644 index 000000000..ef732dcf0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_bucket.json b/src/generated/resources/assets/basemetals/items/diamond_bucket.json new file mode 100644 index 000000000..3a385e307 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -7539487 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_button.json b/src/generated/resources/assets/basemetals/items/diamond_button.json new file mode 100644 index 000000000..9b2396ac8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_crackhammer.json b/src/generated/resources/assets/basemetals/items/diamond_crackhammer.json new file mode 100644 index 000000000..ef2081aba --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_crossbow.json b/src/generated/resources/assets/basemetals/items/diamond_crossbow.json new file mode 100644 index 000000000..5bd67a624 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_door.json b/src/generated/resources/assets/basemetals/items/diamond_door.json new file mode 100644 index 000000000..ae440b907 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_fishing_rod.json b/src/generated/resources/assets/basemetals/items/diamond_fishing_rod.json new file mode 100644 index 000000000..d79831038 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_gear.json b/src/generated/resources/assets/basemetals/items/diamond_gear.json new file mode 100644 index 000000000..bdec81b78 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_lever.json b/src/generated/resources/assets/basemetals/items/diamond_lever.json new file mode 100644 index 000000000..2a61a841e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_nugget.json b/src/generated/resources/assets/basemetals/items/diamond_nugget.json new file mode 100644 index 000000000..072a80f54 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_powder.json b/src/generated/resources/assets/basemetals/items/diamond_powder.json new file mode 100644 index 000000000..4907eb598 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_pressure_plate.json b/src/generated/resources/assets/basemetals/items/diamond_pressure_plate.json new file mode 100644 index 000000000..af26ec2b1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_rod.json b/src/generated/resources/assets/basemetals/items/diamond_rod.json new file mode 100644 index 000000000..bb6487bbd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_scythe.json b/src/generated/resources/assets/basemetals/items/diamond_scythe.json new file mode 100644 index 000000000..e484c83d9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_shears.json b/src/generated/resources/assets/basemetals/items/diamond_shears.json new file mode 100644 index 000000000..1fb8571bf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_shield.json b/src/generated/resources/assets/basemetals/items/diamond_shield.json new file mode 100644 index 000000000..99a78ad9c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_slab.json b/src/generated/resources/assets/basemetals/items/diamond_slab.json new file mode 100644 index 000000000..7016d67e9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_smallblend.json b/src/generated/resources/assets/basemetals/items/diamond_smallblend.json new file mode 100644 index 000000000..29d92e958 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_smallpowder.json b/src/generated/resources/assets/basemetals/items/diamond_smallpowder.json new file mode 100644 index 000000000..7dcb6ba1f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_stairs.json b/src/generated/resources/assets/basemetals/items/diamond_stairs.json new file mode 100644 index 000000000..bfdc8ec10 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_trapdoor.json b/src/generated/resources/assets/basemetals/items/diamond_trapdoor.json new file mode 100644 index 000000000..748e49154 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/diamond_wall.json b/src/generated/resources/assets/basemetals/items/diamond_wall.json new file mode 100644 index 000000000..08302031b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/diamond_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/diamond_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum.json b/src/generated/resources/assets/basemetals/items/electrum.json new file mode 100644 index 000000000..6063c1396 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_arrow.json b/src/generated/resources/assets/basemetals/items/electrum_arrow.json new file mode 100644 index 000000000..0d8c361e2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_axe.json b/src/generated/resources/assets/basemetals/items/electrum_axe.json new file mode 100644 index 000000000..46a92ddc2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_bars.json b/src/generated/resources/assets/basemetals/items/electrum_bars.json new file mode 100644 index 000000000..58a4d3357 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_blend.json b/src/generated/resources/assets/basemetals/items/electrum_blend.json new file mode 100644 index 000000000..243c59948 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_block.json b/src/generated/resources/assets/basemetals/items/electrum_block.json new file mode 100644 index 000000000..f759e7864 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_bolt.json b/src/generated/resources/assets/basemetals/items/electrum_bolt.json new file mode 100644 index 000000000..c2f1113e0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_boots.json b/src/generated/resources/assets/basemetals/items/electrum_boots.json new file mode 100644 index 000000000..b3e7eaca4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_bow.json b/src/generated/resources/assets/basemetals/items/electrum_bow.json new file mode 100644 index 000000000..84c2305c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_bucket.json b/src/generated/resources/assets/basemetals/items/electrum_bucket.json new file mode 100644 index 000000000..d810c1a9b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -3405 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_button.json b/src/generated/resources/assets/basemetals/items/electrum_button.json new file mode 100644 index 000000000..2089e046f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_chestplate.json b/src/generated/resources/assets/basemetals/items/electrum_chestplate.json new file mode 100644 index 000000000..25b46a551 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_crackhammer.json b/src/generated/resources/assets/basemetals/items/electrum_crackhammer.json new file mode 100644 index 000000000..38fd49d3b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_crossbow.json b/src/generated/resources/assets/basemetals/items/electrum_crossbow.json new file mode 100644 index 000000000..8d40e9a9a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_door.json b/src/generated/resources/assets/basemetals/items/electrum_door.json new file mode 100644 index 000000000..82b0cec4d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_fishing_rod.json b/src/generated/resources/assets/basemetals/items/electrum_fishing_rod.json new file mode 100644 index 000000000..28f940469 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_gear.json b/src/generated/resources/assets/basemetals/items/electrum_gear.json new file mode 100644 index 000000000..f28aad5c0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_helmet.json b/src/generated/resources/assets/basemetals/items/electrum_helmet.json new file mode 100644 index 000000000..a05c0a872 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_hoe.json b/src/generated/resources/assets/basemetals/items/electrum_hoe.json new file mode 100644 index 000000000..e62152fea --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_horse_armor.json b/src/generated/resources/assets/basemetals/items/electrum_horse_armor.json new file mode 100644 index 000000000..34951292c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_ingot.json b/src/generated/resources/assets/basemetals/items/electrum_ingot.json new file mode 100644 index 000000000..eb9930353 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_leggings.json b/src/generated/resources/assets/basemetals/items/electrum_leggings.json new file mode 100644 index 000000000..9bfe7fdca --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_lever.json b/src/generated/resources/assets/basemetals/items/electrum_lever.json new file mode 100644 index 000000000..2e18ee649 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_nugget.json b/src/generated/resources/assets/basemetals/items/electrum_nugget.json new file mode 100644 index 000000000..f9501c09f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_pickaxe.json b/src/generated/resources/assets/basemetals/items/electrum_pickaxe.json new file mode 100644 index 000000000..f6aa90203 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_plate.json b/src/generated/resources/assets/basemetals/items/electrum_plate.json new file mode 100644 index 000000000..fda4e63b1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_powder.json b/src/generated/resources/assets/basemetals/items/electrum_powder.json new file mode 100644 index 000000000..16122ae5d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_pressure_plate.json b/src/generated/resources/assets/basemetals/items/electrum_pressure_plate.json new file mode 100644 index 000000000..408f5bf9b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_rod.json b/src/generated/resources/assets/basemetals/items/electrum_rod.json new file mode 100644 index 000000000..d3057f3a4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_scythe.json b/src/generated/resources/assets/basemetals/items/electrum_scythe.json new file mode 100644 index 000000000..9d297a495 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_shears.json b/src/generated/resources/assets/basemetals/items/electrum_shears.json new file mode 100644 index 000000000..eee339209 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_shield.json b/src/generated/resources/assets/basemetals/items/electrum_shield.json new file mode 100644 index 000000000..e643ec67d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_shovel.json b/src/generated/resources/assets/basemetals/items/electrum_shovel.json new file mode 100644 index 000000000..3ebc47579 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_slab.json b/src/generated/resources/assets/basemetals/items/electrum_slab.json new file mode 100644 index 000000000..0622a6133 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_smallblend.json b/src/generated/resources/assets/basemetals/items/electrum_smallblend.json new file mode 100644 index 000000000..c43f27d30 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_smallpowder.json b/src/generated/resources/assets/basemetals/items/electrum_smallpowder.json new file mode 100644 index 000000000..df64b5eb7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_stairs.json b/src/generated/resources/assets/basemetals/items/electrum_stairs.json new file mode 100644 index 000000000..c5b2d372c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_sword.json b/src/generated/resources/assets/basemetals/items/electrum_sword.json new file mode 100644 index 000000000..44ebdeca2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_trapdoor.json b/src/generated/resources/assets/basemetals/items/electrum_trapdoor.json new file mode 100644 index 000000000..266f59f95 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/electrum_wall.json b/src/generated/resources/assets/basemetals/items/electrum_wall.json new file mode 100644 index 000000000..563f2250a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/electrum_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/electrum_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald.json b/src/generated/resources/assets/basemetals/items/emerald.json new file mode 100644 index 000000000..e52df72a8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_arrow.json b/src/generated/resources/assets/basemetals/items/emerald_arrow.json new file mode 100644 index 000000000..94f6350bc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_axe.json b/src/generated/resources/assets/basemetals/items/emerald_axe.json new file mode 100644 index 000000000..379b913d4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_bars.json b/src/generated/resources/assets/basemetals/items/emerald_bars.json new file mode 100644 index 000000000..75ba4498a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_bolt.json b/src/generated/resources/assets/basemetals/items/emerald_bolt.json new file mode 100644 index 000000000..9eadf74f8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_boots.json b/src/generated/resources/assets/basemetals/items/emerald_boots.json new file mode 100644 index 000000000..a6b87714b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_bow.json b/src/generated/resources/assets/basemetals/items/emerald_bow.json new file mode 100644 index 000000000..9ce445a8a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_bucket.json b/src/generated/resources/assets/basemetals/items/emerald_bucket.json new file mode 100644 index 000000000..f14da9e0a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -8194388 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_button.json b/src/generated/resources/assets/basemetals/items/emerald_button.json new file mode 100644 index 000000000..df4dcf147 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_chestplate.json b/src/generated/resources/assets/basemetals/items/emerald_chestplate.json new file mode 100644 index 000000000..c8373f5b6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_crackhammer.json b/src/generated/resources/assets/basemetals/items/emerald_crackhammer.json new file mode 100644 index 000000000..def93a9b9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_crossbow.json b/src/generated/resources/assets/basemetals/items/emerald_crossbow.json new file mode 100644 index 000000000..47303ac81 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_door.json b/src/generated/resources/assets/basemetals/items/emerald_door.json new file mode 100644 index 000000000..d9b495605 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_fishing_rod.json b/src/generated/resources/assets/basemetals/items/emerald_fishing_rod.json new file mode 100644 index 000000000..c8a87d281 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_gear.json b/src/generated/resources/assets/basemetals/items/emerald_gear.json new file mode 100644 index 000000000..87d95dc4a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_helmet.json b/src/generated/resources/assets/basemetals/items/emerald_helmet.json new file mode 100644 index 000000000..212af29cb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_hoe.json b/src/generated/resources/assets/basemetals/items/emerald_hoe.json new file mode 100644 index 000000000..67839688c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_horse_armor.json b/src/generated/resources/assets/basemetals/items/emerald_horse_armor.json new file mode 100644 index 000000000..b1956966b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_leggings.json b/src/generated/resources/assets/basemetals/items/emerald_leggings.json new file mode 100644 index 000000000..3b0e29c09 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_lever.json b/src/generated/resources/assets/basemetals/items/emerald_lever.json new file mode 100644 index 000000000..506b8f698 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_nugget.json b/src/generated/resources/assets/basemetals/items/emerald_nugget.json new file mode 100644 index 000000000..952dc1242 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_pickaxe.json b/src/generated/resources/assets/basemetals/items/emerald_pickaxe.json new file mode 100644 index 000000000..7df0ce5ed --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_powder.json b/src/generated/resources/assets/basemetals/items/emerald_powder.json new file mode 100644 index 000000000..df99f36ec --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_pressure_plate.json b/src/generated/resources/assets/basemetals/items/emerald_pressure_plate.json new file mode 100644 index 000000000..cc3e3ffb7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_rod.json b/src/generated/resources/assets/basemetals/items/emerald_rod.json new file mode 100644 index 000000000..d2172d0e9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_scythe.json b/src/generated/resources/assets/basemetals/items/emerald_scythe.json new file mode 100644 index 000000000..409c55e72 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_shears.json b/src/generated/resources/assets/basemetals/items/emerald_shears.json new file mode 100644 index 000000000..3534fdfed --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_shield.json b/src/generated/resources/assets/basemetals/items/emerald_shield.json new file mode 100644 index 000000000..74dff9490 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_shovel.json b/src/generated/resources/assets/basemetals/items/emerald_shovel.json new file mode 100644 index 000000000..920c02104 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_slab.json b/src/generated/resources/assets/basemetals/items/emerald_slab.json new file mode 100644 index 000000000..a34a18b12 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_smallpowder.json b/src/generated/resources/assets/basemetals/items/emerald_smallpowder.json new file mode 100644 index 000000000..257439ddd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_stairs.json b/src/generated/resources/assets/basemetals/items/emerald_stairs.json new file mode 100644 index 000000000..0a261db91 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_sword.json b/src/generated/resources/assets/basemetals/items/emerald_sword.json new file mode 100644 index 000000000..70db5644f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_trapdoor.json b/src/generated/resources/assets/basemetals/items/emerald_trapdoor.json new file mode 100644 index 000000000..51381eb01 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/emerald_wall.json b/src/generated/resources/assets/basemetals/items/emerald_wall.json new file mode 100644 index 000000000..4b611f32c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/emerald_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/emerald_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/ender.json b/src/generated/resources/assets/basemetals/items/ender.json new file mode 100644 index 000000000..07f086e18 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/ender.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/ender" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/ender_bucket.json b/src/generated/resources/assets/basemetals/items/ender_bucket.json new file mode 100644 index 000000000..32b6e86a8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/ender_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/ender_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold.json b/src/generated/resources/assets/basemetals/items/gold.json new file mode 100644 index 000000000..8dfe069b5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_arrow.json b/src/generated/resources/assets/basemetals/items/gold_arrow.json new file mode 100644 index 000000000..de03e6c93 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_bars.json b/src/generated/resources/assets/basemetals/items/gold_bars.json new file mode 100644 index 000000000..9154e0cb7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_blend.json b/src/generated/resources/assets/basemetals/items/gold_blend.json new file mode 100644 index 000000000..4909681ab --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_bolt.json b/src/generated/resources/assets/basemetals/items/gold_bolt.json new file mode 100644 index 000000000..98a4af447 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_bow.json b/src/generated/resources/assets/basemetals/items/gold_bow.json new file mode 100644 index 000000000..71830c602 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_bucket.json b/src/generated/resources/assets/basemetals/items/gold_bucket.json new file mode 100644 index 000000000..1e0ac55a7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -117 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_button.json b/src/generated/resources/assets/basemetals/items/gold_button.json new file mode 100644 index 000000000..289c3a8c1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_crackhammer.json b/src/generated/resources/assets/basemetals/items/gold_crackhammer.json new file mode 100644 index 000000000..180957c49 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_crossbow.json b/src/generated/resources/assets/basemetals/items/gold_crossbow.json new file mode 100644 index 000000000..0e866d8f1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/gold_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/gold_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_door.json b/src/generated/resources/assets/basemetals/items/gold_door.json new file mode 100644 index 000000000..12a429fd5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_fishing_rod.json b/src/generated/resources/assets/basemetals/items/gold_fishing_rod.json new file mode 100644 index 000000000..3abb3d7da --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/gold_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/gold_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_gear.json b/src/generated/resources/assets/basemetals/items/gold_gear.json new file mode 100644 index 000000000..70eed1e2b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_lever.json b/src/generated/resources/assets/basemetals/items/gold_lever.json new file mode 100644 index 000000000..6671bd98c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_plate.json b/src/generated/resources/assets/basemetals/items/gold_plate.json new file mode 100644 index 000000000..ef07fda46 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_powder.json b/src/generated/resources/assets/basemetals/items/gold_powder.json new file mode 100644 index 000000000..e15446c78 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_rod.json b/src/generated/resources/assets/basemetals/items/gold_rod.json new file mode 100644 index 000000000..1c20e67c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_scythe.json b/src/generated/resources/assets/basemetals/items/gold_scythe.json new file mode 100644 index 000000000..dd4115da1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_shears.json b/src/generated/resources/assets/basemetals/items/gold_shears.json new file mode 100644 index 000000000..caed8126f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_shield.json b/src/generated/resources/assets/basemetals/items/gold_shield.json new file mode 100644 index 000000000..9617549da --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/gold_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/gold_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_slab.json b/src/generated/resources/assets/basemetals/items/gold_slab.json new file mode 100644 index 000000000..d8e32591d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_smallblend.json b/src/generated/resources/assets/basemetals/items/gold_smallblend.json new file mode 100644 index 000000000..bce5527b3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_smallpowder.json b/src/generated/resources/assets/basemetals/items/gold_smallpowder.json new file mode 100644 index 000000000..bccb8e459 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_stairs.json b/src/generated/resources/assets/basemetals/items/gold_stairs.json new file mode 100644 index 000000000..ab1a97e13 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_trapdoor.json b/src/generated/resources/assets/basemetals/items/gold_trapdoor.json new file mode 100644 index 000000000..fab73b014 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/gold_wall.json b/src/generated/resources/assets/basemetals/items/gold_wall.json new file mode 100644 index 000000000..eac5f0788 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/gold_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/gold_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/human_detector.json b/src/generated/resources/assets/basemetals/items/human_detector.json new file mode 100644 index 000000000..7ced16803 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/human_detector.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/human_detector" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar.json b/src/generated/resources/assets/basemetals/items/invar.json new file mode 100644 index 000000000..e336c8d66 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_arrow.json b/src/generated/resources/assets/basemetals/items/invar_arrow.json new file mode 100644 index 000000000..3de74d5a9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_axe.json b/src/generated/resources/assets/basemetals/items/invar_axe.json new file mode 100644 index 000000000..0e6b44754 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_bars.json b/src/generated/resources/assets/basemetals/items/invar_bars.json new file mode 100644 index 000000000..0690da24a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_blend.json b/src/generated/resources/assets/basemetals/items/invar_blend.json new file mode 100644 index 000000000..dcadf758c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_block.json b/src/generated/resources/assets/basemetals/items/invar_block.json new file mode 100644 index 000000000..f483a676e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_bolt.json b/src/generated/resources/assets/basemetals/items/invar_bolt.json new file mode 100644 index 000000000..97349d22b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_boots.json b/src/generated/resources/assets/basemetals/items/invar_boots.json new file mode 100644 index 000000000..40114d6a2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_bow.json b/src/generated/resources/assets/basemetals/items/invar_bow.json new file mode 100644 index 000000000..2019069cc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_bucket.json b/src/generated/resources/assets/basemetals/items/invar_bucket.json new file mode 100644 index 000000000..48db042fb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2961992 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_button.json b/src/generated/resources/assets/basemetals/items/invar_button.json new file mode 100644 index 000000000..a9d3ad1ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_chestplate.json b/src/generated/resources/assets/basemetals/items/invar_chestplate.json new file mode 100644 index 000000000..927287378 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_crackhammer.json b/src/generated/resources/assets/basemetals/items/invar_crackhammer.json new file mode 100644 index 000000000..a9f85fffd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_crossbow.json b/src/generated/resources/assets/basemetals/items/invar_crossbow.json new file mode 100644 index 000000000..b14d14a19 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/invar_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/invar_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_door.json b/src/generated/resources/assets/basemetals/items/invar_door.json new file mode 100644 index 000000000..7a31b3d1a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_fishing_rod.json b/src/generated/resources/assets/basemetals/items/invar_fishing_rod.json new file mode 100644 index 000000000..d80ca3c74 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/invar_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/invar_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_gear.json b/src/generated/resources/assets/basemetals/items/invar_gear.json new file mode 100644 index 000000000..3921947a6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_helmet.json b/src/generated/resources/assets/basemetals/items/invar_helmet.json new file mode 100644 index 000000000..d9cff5083 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_hoe.json b/src/generated/resources/assets/basemetals/items/invar_hoe.json new file mode 100644 index 000000000..676b79984 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_horse_armor.json b/src/generated/resources/assets/basemetals/items/invar_horse_armor.json new file mode 100644 index 000000000..451b83d50 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_ingot.json b/src/generated/resources/assets/basemetals/items/invar_ingot.json new file mode 100644 index 000000000..5a8996df9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_leggings.json b/src/generated/resources/assets/basemetals/items/invar_leggings.json new file mode 100644 index 000000000..1fc43b162 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_lever.json b/src/generated/resources/assets/basemetals/items/invar_lever.json new file mode 100644 index 000000000..ff52c177a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_nugget.json b/src/generated/resources/assets/basemetals/items/invar_nugget.json new file mode 100644 index 000000000..cc1b91f46 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_pickaxe.json b/src/generated/resources/assets/basemetals/items/invar_pickaxe.json new file mode 100644 index 000000000..86c96a2e4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_plate.json b/src/generated/resources/assets/basemetals/items/invar_plate.json new file mode 100644 index 000000000..77f9f7db3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_powder.json b/src/generated/resources/assets/basemetals/items/invar_powder.json new file mode 100644 index 000000000..15a6df3f1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_pressure_plate.json b/src/generated/resources/assets/basemetals/items/invar_pressure_plate.json new file mode 100644 index 000000000..e7cdfdedd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_rod.json b/src/generated/resources/assets/basemetals/items/invar_rod.json new file mode 100644 index 000000000..8604cdc2c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_scythe.json b/src/generated/resources/assets/basemetals/items/invar_scythe.json new file mode 100644 index 000000000..016ef5857 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_shears.json b/src/generated/resources/assets/basemetals/items/invar_shears.json new file mode 100644 index 000000000..eea9ea16d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_shield.json b/src/generated/resources/assets/basemetals/items/invar_shield.json new file mode 100644 index 000000000..c5311612b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/invar_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/invar_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_shovel.json b/src/generated/resources/assets/basemetals/items/invar_shovel.json new file mode 100644 index 000000000..83769a866 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_slab.json b/src/generated/resources/assets/basemetals/items/invar_slab.json new file mode 100644 index 000000000..52f40c2e1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_smallblend.json b/src/generated/resources/assets/basemetals/items/invar_smallblend.json new file mode 100644 index 000000000..6c33eafa9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_smallpowder.json b/src/generated/resources/assets/basemetals/items/invar_smallpowder.json new file mode 100644 index 000000000..16a01b0b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_stairs.json b/src/generated/resources/assets/basemetals/items/invar_stairs.json new file mode 100644 index 000000000..0bd5c2e84 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_sword.json b/src/generated/resources/assets/basemetals/items/invar_sword.json new file mode 100644 index 000000000..6993677f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_trapdoor.json b/src/generated/resources/assets/basemetals/items/invar_trapdoor.json new file mode 100644 index 000000000..6798e02af --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/invar_wall.json b/src/generated/resources/assets/basemetals/items/invar_wall.json new file mode 100644 index 000000000..45472b9f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/invar_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/invar_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron.json b/src/generated/resources/assets/basemetals/items/iron.json new file mode 100644 index 000000000..a507804f1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_arrow.json b/src/generated/resources/assets/basemetals/items/iron_arrow.json new file mode 100644 index 000000000..d3389fe6b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_blend.json b/src/generated/resources/assets/basemetals/items/iron_blend.json new file mode 100644 index 000000000..8494baa59 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_bolt.json b/src/generated/resources/assets/basemetals/items/iron_bolt.json new file mode 100644 index 000000000..6fde389da --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_bow.json b/src/generated/resources/assets/basemetals/items/iron_bow.json new file mode 100644 index 000000000..976d328a6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_bucket.json b/src/generated/resources/assets/basemetals/items/iron_bucket.json new file mode 100644 index 000000000..52bb608b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2565928 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_button.json b/src/generated/resources/assets/basemetals/items/iron_button.json new file mode 100644 index 000000000..d77ed4af4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_crackhammer.json b/src/generated/resources/assets/basemetals/items/iron_crackhammer.json new file mode 100644 index 000000000..4fdc79964 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_crossbow.json b/src/generated/resources/assets/basemetals/items/iron_crossbow.json new file mode 100644 index 000000000..b7c61bb4d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/iron_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/iron_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_fishing_rod.json b/src/generated/resources/assets/basemetals/items/iron_fishing_rod.json new file mode 100644 index 000000000..b19cf5c23 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/iron_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/iron_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_gear.json b/src/generated/resources/assets/basemetals/items/iron_gear.json new file mode 100644 index 000000000..ef2cc339e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_lever.json b/src/generated/resources/assets/basemetals/items/iron_lever.json new file mode 100644 index 000000000..e733e6936 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_plate.json b/src/generated/resources/assets/basemetals/items/iron_plate.json new file mode 100644 index 000000000..1497fe2fc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_powder.json b/src/generated/resources/assets/basemetals/items/iron_powder.json new file mode 100644 index 000000000..8fb6684bb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_rod.json b/src/generated/resources/assets/basemetals/items/iron_rod.json new file mode 100644 index 000000000..60fc607e4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_scythe.json b/src/generated/resources/assets/basemetals/items/iron_scythe.json new file mode 100644 index 000000000..39fac0fb8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_shield.json b/src/generated/resources/assets/basemetals/items/iron_shield.json new file mode 100644 index 000000000..c56f07aaa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/iron_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/iron_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_slab.json b/src/generated/resources/assets/basemetals/items/iron_slab.json new file mode 100644 index 000000000..c2883ed17 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_smallblend.json b/src/generated/resources/assets/basemetals/items/iron_smallblend.json new file mode 100644 index 000000000..82be7ead7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_smallpowder.json b/src/generated/resources/assets/basemetals/items/iron_smallpowder.json new file mode 100644 index 000000000..d60393e6b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_stairs.json b/src/generated/resources/assets/basemetals/items/iron_stairs.json new file mode 100644 index 000000000..7854cf2dc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/iron_wall.json b/src/generated/resources/assets/basemetals/items/iron_wall.json new file mode 100644 index 000000000..e91fe1751 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/iron_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/iron_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lapis.json b/src/generated/resources/assets/basemetals/items/lapis.json new file mode 100644 index 000000000..39c64a96b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lapis.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lapis" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lapis_bucket.json b/src/generated/resources/assets/basemetals/items/lapis_bucket.json new file mode 100644 index 000000000..98a900d0a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lapis_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lapis_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -14261860 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lapis_smallpowder.json b/src/generated/resources/assets/basemetals/items/lapis_smallpowder.json new file mode 100644 index 000000000..6ea3fffec --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lapis_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lapis_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead.json b/src/generated/resources/assets/basemetals/items/lead.json new file mode 100644 index 000000000..638ba5567 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_arrow.json b/src/generated/resources/assets/basemetals/items/lead_arrow.json new file mode 100644 index 000000000..ffcd1008c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_axe.json b/src/generated/resources/assets/basemetals/items/lead_axe.json new file mode 100644 index 000000000..6427a7511 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_bars.json b/src/generated/resources/assets/basemetals/items/lead_bars.json new file mode 100644 index 000000000..434c54779 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_block.json b/src/generated/resources/assets/basemetals/items/lead_block.json new file mode 100644 index 000000000..21d72fb2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_bolt.json b/src/generated/resources/assets/basemetals/items/lead_bolt.json new file mode 100644 index 000000000..0218bd30c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_boots.json b/src/generated/resources/assets/basemetals/items/lead_boots.json new file mode 100644 index 000000000..7cc42e4db --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_bow.json b/src/generated/resources/assets/basemetals/items/lead_bow.json new file mode 100644 index 000000000..b00581b2e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_bucket.json b/src/generated/resources/assets/basemetals/items/lead_bucket.json new file mode 100644 index 000000000..136b7b32b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -8684677 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_button.json b/src/generated/resources/assets/basemetals/items/lead_button.json new file mode 100644 index 000000000..05b18b0c0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_chestplate.json b/src/generated/resources/assets/basemetals/items/lead_chestplate.json new file mode 100644 index 000000000..9afc08fbd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_crackhammer.json b/src/generated/resources/assets/basemetals/items/lead_crackhammer.json new file mode 100644 index 000000000..39813e5b2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_crossbow.json b/src/generated/resources/assets/basemetals/items/lead_crossbow.json new file mode 100644 index 000000000..18c5fc1cc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/lead_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/lead_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_door.json b/src/generated/resources/assets/basemetals/items/lead_door.json new file mode 100644 index 000000000..9bca24cd1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_fishing_rod.json b/src/generated/resources/assets/basemetals/items/lead_fishing_rod.json new file mode 100644 index 000000000..d0cd371b2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/lead_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/lead_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_gear.json b/src/generated/resources/assets/basemetals/items/lead_gear.json new file mode 100644 index 000000000..efd94463d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_helmet.json b/src/generated/resources/assets/basemetals/items/lead_helmet.json new file mode 100644 index 000000000..decfbe643 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_hoe.json b/src/generated/resources/assets/basemetals/items/lead_hoe.json new file mode 100644 index 000000000..db6b36e65 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_horse_armor.json b/src/generated/resources/assets/basemetals/items/lead_horse_armor.json new file mode 100644 index 000000000..e71a16825 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_ingot.json b/src/generated/resources/assets/basemetals/items/lead_ingot.json new file mode 100644 index 000000000..83115a4e9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_leggings.json b/src/generated/resources/assets/basemetals/items/lead_leggings.json new file mode 100644 index 000000000..cf79bb669 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_lever.json b/src/generated/resources/assets/basemetals/items/lead_lever.json new file mode 100644 index 000000000..69edd690e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_nugget.json b/src/generated/resources/assets/basemetals/items/lead_nugget.json new file mode 100644 index 000000000..678829ad2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_ore.json b/src/generated/resources/assets/basemetals/items/lead_ore.json new file mode 100644 index 000000000..d13233a46 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_pickaxe.json b/src/generated/resources/assets/basemetals/items/lead_pickaxe.json new file mode 100644 index 000000000..6d5e2ade8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_plate.json b/src/generated/resources/assets/basemetals/items/lead_plate.json new file mode 100644 index 000000000..233620f6c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_powder.json b/src/generated/resources/assets/basemetals/items/lead_powder.json new file mode 100644 index 000000000..75eafffe8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_pressure_plate.json b/src/generated/resources/assets/basemetals/items/lead_pressure_plate.json new file mode 100644 index 000000000..b8f308330 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_raw.json b/src/generated/resources/assets/basemetals/items/lead_raw.json new file mode 100644 index 000000000..3a29ff047 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_rod.json b/src/generated/resources/assets/basemetals/items/lead_rod.json new file mode 100644 index 000000000..686d0fc21 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_scythe.json b/src/generated/resources/assets/basemetals/items/lead_scythe.json new file mode 100644 index 000000000..073c2fe4c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_shears.json b/src/generated/resources/assets/basemetals/items/lead_shears.json new file mode 100644 index 000000000..078bef1b1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_shield.json b/src/generated/resources/assets/basemetals/items/lead_shield.json new file mode 100644 index 000000000..f14e7e6da --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/lead_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/lead_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_shovel.json b/src/generated/resources/assets/basemetals/items/lead_shovel.json new file mode 100644 index 000000000..876021ece --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_slab.json b/src/generated/resources/assets/basemetals/items/lead_slab.json new file mode 100644 index 000000000..ece2bd538 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_smallpowder.json b/src/generated/resources/assets/basemetals/items/lead_smallpowder.json new file mode 100644 index 000000000..5d395b72a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_stairs.json b/src/generated/resources/assets/basemetals/items/lead_stairs.json new file mode 100644 index 000000000..5aedc2442 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_sword.json b/src/generated/resources/assets/basemetals/items/lead_sword.json new file mode 100644 index 000000000..023008312 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_trapdoor.json b/src/generated/resources/assets/basemetals/items/lead_trapdoor.json new file mode 100644 index 000000000..38c57b701 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/lead_wall.json b/src/generated/resources/assets/basemetals/items/lead_wall.json new file mode 100644 index 000000000..b57aed429 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/lead_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/lead_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury.json b/src/generated/resources/assets/basemetals/items/mercury.json new file mode 100644 index 000000000..4f903098d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_bucket.json b/src/generated/resources/assets/basemetals/items/mercury_bucket.json new file mode 100644 index 000000000..59011d157 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1907998 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_ingot.json b/src/generated/resources/assets/basemetals/items/mercury_ingot.json new file mode 100644 index 000000000..fea354111 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_nugget.json b/src/generated/resources/assets/basemetals/items/mercury_nugget.json new file mode 100644 index 000000000..f6b0a2cba --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_ore.json b/src/generated/resources/assets/basemetals/items/mercury_ore.json new file mode 100644 index 000000000..ad779496f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_powder.json b/src/generated/resources/assets/basemetals/items/mercury_powder.json new file mode 100644 index 000000000..2af0c82ce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_raw.json b/src/generated/resources/assets/basemetals/items/mercury_raw.json new file mode 100644 index 000000000..d0f50cc81 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mercury_smallpowder.json b/src/generated/resources/assets/basemetals/items/mercury_smallpowder.json new file mode 100644 index 000000000..b94bb5f1a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mercury_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mercury_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril.json b/src/generated/resources/assets/basemetals/items/mithril.json new file mode 100644 index 000000000..2b8d1aef5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_arrow.json b/src/generated/resources/assets/basemetals/items/mithril_arrow.json new file mode 100644 index 000000000..cd858882d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_axe.json b/src/generated/resources/assets/basemetals/items/mithril_axe.json new file mode 100644 index 000000000..352acc9be --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_bars.json b/src/generated/resources/assets/basemetals/items/mithril_bars.json new file mode 100644 index 000000000..6e808def4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_blend.json b/src/generated/resources/assets/basemetals/items/mithril_blend.json new file mode 100644 index 000000000..f7688a335 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_block.json b/src/generated/resources/assets/basemetals/items/mithril_block.json new file mode 100644 index 000000000..4a538bce3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_bolt.json b/src/generated/resources/assets/basemetals/items/mithril_bolt.json new file mode 100644 index 000000000..f0ead74b4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_boots.json b/src/generated/resources/assets/basemetals/items/mithril_boots.json new file mode 100644 index 000000000..da291f157 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_bow.json b/src/generated/resources/assets/basemetals/items/mithril_bow.json new file mode 100644 index 000000000..c14dedeb2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_bucket.json b/src/generated/resources/assets/basemetals/items/mithril_bucket.json new file mode 100644 index 000000000..46bd95874 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -720897 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_button.json b/src/generated/resources/assets/basemetals/items/mithril_button.json new file mode 100644 index 000000000..2498c7179 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_chestplate.json b/src/generated/resources/assets/basemetals/items/mithril_chestplate.json new file mode 100644 index 000000000..376f71511 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_crackhammer.json b/src/generated/resources/assets/basemetals/items/mithril_crackhammer.json new file mode 100644 index 000000000..b64bc1cf1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_crossbow.json b/src/generated/resources/assets/basemetals/items/mithril_crossbow.json new file mode 100644 index 000000000..c5186f1bf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_door.json b/src/generated/resources/assets/basemetals/items/mithril_door.json new file mode 100644 index 000000000..e411f9347 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_fishing_rod.json b/src/generated/resources/assets/basemetals/items/mithril_fishing_rod.json new file mode 100644 index 000000000..c0f11bb2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_gear.json b/src/generated/resources/assets/basemetals/items/mithril_gear.json new file mode 100644 index 000000000..d34583922 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_helmet.json b/src/generated/resources/assets/basemetals/items/mithril_helmet.json new file mode 100644 index 000000000..795ad078b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_hoe.json b/src/generated/resources/assets/basemetals/items/mithril_hoe.json new file mode 100644 index 000000000..e1f1fa3a3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_horse_armor.json b/src/generated/resources/assets/basemetals/items/mithril_horse_armor.json new file mode 100644 index 000000000..582d042f4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_ingot.json b/src/generated/resources/assets/basemetals/items/mithril_ingot.json new file mode 100644 index 000000000..c4aca99e4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_leggings.json b/src/generated/resources/assets/basemetals/items/mithril_leggings.json new file mode 100644 index 000000000..a1a4c098e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_lever.json b/src/generated/resources/assets/basemetals/items/mithril_lever.json new file mode 100644 index 000000000..16b7751ce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_nugget.json b/src/generated/resources/assets/basemetals/items/mithril_nugget.json new file mode 100644 index 000000000..6effcc8c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_pickaxe.json b/src/generated/resources/assets/basemetals/items/mithril_pickaxe.json new file mode 100644 index 000000000..34af4bcc9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_plate.json b/src/generated/resources/assets/basemetals/items/mithril_plate.json new file mode 100644 index 000000000..34445772b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_powder.json b/src/generated/resources/assets/basemetals/items/mithril_powder.json new file mode 100644 index 000000000..bbad66822 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_pressure_plate.json b/src/generated/resources/assets/basemetals/items/mithril_pressure_plate.json new file mode 100644 index 000000000..612398d49 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_rod.json b/src/generated/resources/assets/basemetals/items/mithril_rod.json new file mode 100644 index 000000000..1864cc264 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_scythe.json b/src/generated/resources/assets/basemetals/items/mithril_scythe.json new file mode 100644 index 000000000..576d6c53f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_shears.json b/src/generated/resources/assets/basemetals/items/mithril_shears.json new file mode 100644 index 000000000..319754ede --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_shield.json b/src/generated/resources/assets/basemetals/items/mithril_shield.json new file mode 100644 index 000000000..767808b1a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_shovel.json b/src/generated/resources/assets/basemetals/items/mithril_shovel.json new file mode 100644 index 000000000..c1e53f42b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_slab.json b/src/generated/resources/assets/basemetals/items/mithril_slab.json new file mode 100644 index 000000000..df14a2534 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_smallblend.json b/src/generated/resources/assets/basemetals/items/mithril_smallblend.json new file mode 100644 index 000000000..ab1463249 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_smallpowder.json b/src/generated/resources/assets/basemetals/items/mithril_smallpowder.json new file mode 100644 index 000000000..b162dc0f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_stairs.json b/src/generated/resources/assets/basemetals/items/mithril_stairs.json new file mode 100644 index 000000000..a7c1badc8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_sword.json b/src/generated/resources/assets/basemetals/items/mithril_sword.json new file mode 100644 index 000000000..653fe8684 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_trapdoor.json b/src/generated/resources/assets/basemetals/items/mithril_trapdoor.json new file mode 100644 index 000000000..649a0f572 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/mithril_wall.json b/src/generated/resources/assets/basemetals/items/mithril_wall.json new file mode 100644 index 000000000..06fb28fea --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/mithril_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/mithril_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel.json b/src/generated/resources/assets/basemetals/items/nickel.json new file mode 100644 index 000000000..5516ba5db --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_arrow.json b/src/generated/resources/assets/basemetals/items/nickel_arrow.json new file mode 100644 index 000000000..1ab64cccf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_axe.json b/src/generated/resources/assets/basemetals/items/nickel_axe.json new file mode 100644 index 000000000..b3b5c6ebb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_bars.json b/src/generated/resources/assets/basemetals/items/nickel_bars.json new file mode 100644 index 000000000..a52ea3db1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_block.json b/src/generated/resources/assets/basemetals/items/nickel_block.json new file mode 100644 index 000000000..b507fecf7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_bolt.json b/src/generated/resources/assets/basemetals/items/nickel_bolt.json new file mode 100644 index 000000000..bfc636308 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_boots.json b/src/generated/resources/assets/basemetals/items/nickel_boots.json new file mode 100644 index 000000000..24a1b739a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_bow.json b/src/generated/resources/assets/basemetals/items/nickel_bow.json new file mode 100644 index 000000000..8894e1c78 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_bucket.json b/src/generated/resources/assets/basemetals/items/nickel_bucket.json new file mode 100644 index 000000000..32737baef --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1114133 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_button.json b/src/generated/resources/assets/basemetals/items/nickel_button.json new file mode 100644 index 000000000..d746aec36 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_casing.json b/src/generated/resources/assets/basemetals/items/nickel_casing.json new file mode 100644 index 000000000..8b092c4e9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_chestplate.json b/src/generated/resources/assets/basemetals/items/nickel_chestplate.json new file mode 100644 index 000000000..53aa87ad1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_clump.json b/src/generated/resources/assets/basemetals/items/nickel_clump.json new file mode 100644 index 000000000..1e44a32d5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_crackhammer.json b/src/generated/resources/assets/basemetals/items/nickel_crackhammer.json new file mode 100644 index 000000000..75e4e3530 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_crossbow.json b/src/generated/resources/assets/basemetals/items/nickel_crossbow.json new file mode 100644 index 000000000..8d49ac65f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_crushed.json b/src/generated/resources/assets/basemetals/items/nickel_crushed.json new file mode 100644 index 000000000..3d02303df --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_crushed_purified.json b/src/generated/resources/assets/basemetals/items/nickel_crushed_purified.json new file mode 100644 index 000000000..617c12e34 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_crystal.json b/src/generated/resources/assets/basemetals/items/nickel_crystal.json new file mode 100644 index 000000000..303c4855d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_dense_plate.json b/src/generated/resources/assets/basemetals/items/nickel_dense_plate.json new file mode 100644 index 000000000..29652aa1a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_door.json b/src/generated/resources/assets/basemetals/items/nickel_door.json new file mode 100644 index 000000000..f9aa62251 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_fishing_rod.json b/src/generated/resources/assets/basemetals/items/nickel_fishing_rod.json new file mode 100644 index 000000000..250e818b9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_gear.json b/src/generated/resources/assets/basemetals/items/nickel_gear.json new file mode 100644 index 000000000..ef10e5056 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_helmet.json b/src/generated/resources/assets/basemetals/items/nickel_helmet.json new file mode 100644 index 000000000..74f1aa9c6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_hoe.json b/src/generated/resources/assets/basemetals/items/nickel_hoe.json new file mode 100644 index 000000000..6bcfec847 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_horse_armor.json b/src/generated/resources/assets/basemetals/items/nickel_horse_armor.json new file mode 100644 index 000000000..75c902542 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_ingot.json b/src/generated/resources/assets/basemetals/items/nickel_ingot.json new file mode 100644 index 000000000..a4a648533 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_leggings.json b/src/generated/resources/assets/basemetals/items/nickel_leggings.json new file mode 100644 index 000000000..a5ef2776c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_lever.json b/src/generated/resources/assets/basemetals/items/nickel_lever.json new file mode 100644 index 000000000..b8bc89e43 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_nugget.json b/src/generated/resources/assets/basemetals/items/nickel_nugget.json new file mode 100644 index 000000000..3b9360d6d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_ore.json b/src/generated/resources/assets/basemetals/items/nickel_ore.json new file mode 100644 index 000000000..7b33859f6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_pickaxe.json b/src/generated/resources/assets/basemetals/items/nickel_pickaxe.json new file mode 100644 index 000000000..e5b54326e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_plate.json b/src/generated/resources/assets/basemetals/items/nickel_plate.json new file mode 100644 index 000000000..d934d85f5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_powder.json b/src/generated/resources/assets/basemetals/items/nickel_powder.json new file mode 100644 index 000000000..bf1352b70 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_powder_dirty.json b/src/generated/resources/assets/basemetals/items/nickel_powder_dirty.json new file mode 100644 index 000000000..34fea890a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_pressure_plate.json b/src/generated/resources/assets/basemetals/items/nickel_pressure_plate.json new file mode 100644 index 000000000..88ab1d067 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_raw.json b/src/generated/resources/assets/basemetals/items/nickel_raw.json new file mode 100644 index 000000000..595af55cb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_rod.json b/src/generated/resources/assets/basemetals/items/nickel_rod.json new file mode 100644 index 000000000..7b87975ca --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_scythe.json b/src/generated/resources/assets/basemetals/items/nickel_scythe.json new file mode 100644 index 000000000..e126cf45d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_shard.json b/src/generated/resources/assets/basemetals/items/nickel_shard.json new file mode 100644 index 000000000..3c71efec0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_shears.json b/src/generated/resources/assets/basemetals/items/nickel_shears.json new file mode 100644 index 000000000..18efe321e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_shield.json b/src/generated/resources/assets/basemetals/items/nickel_shield.json new file mode 100644 index 000000000..91c1920c3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_shovel.json b/src/generated/resources/assets/basemetals/items/nickel_shovel.json new file mode 100644 index 000000000..516df51cd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_slab.json b/src/generated/resources/assets/basemetals/items/nickel_slab.json new file mode 100644 index 000000000..99f917db1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_smallpowder.json b/src/generated/resources/assets/basemetals/items/nickel_smallpowder.json new file mode 100644 index 000000000..7c342f0df --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_stairs.json b/src/generated/resources/assets/basemetals/items/nickel_stairs.json new file mode 100644 index 000000000..ad457a966 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_sword.json b/src/generated/resources/assets/basemetals/items/nickel_sword.json new file mode 100644 index 000000000..875a4e930 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_trapdoor.json b/src/generated/resources/assets/basemetals/items/nickel_trapdoor.json new file mode 100644 index 000000000..b4910eb2b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/nickel_wall.json b/src/generated/resources/assets/basemetals/items/nickel_wall.json new file mode 100644 index 000000000..f8d9f2684 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/nickel_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/nickel_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian.json b/src/generated/resources/assets/basemetals/items/obsidian.json new file mode 100644 index 000000000..161fa3551 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_arrow.json b/src/generated/resources/assets/basemetals/items/obsidian_arrow.json new file mode 100644 index 000000000..f3567a37c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_axe.json b/src/generated/resources/assets/basemetals/items/obsidian_axe.json new file mode 100644 index 000000000..6788a6149 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_bars.json b/src/generated/resources/assets/basemetals/items/obsidian_bars.json new file mode 100644 index 000000000..3aab6ba5a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_bolt.json b/src/generated/resources/assets/basemetals/items/obsidian_bolt.json new file mode 100644 index 000000000..289bbfb91 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_boots.json b/src/generated/resources/assets/basemetals/items/obsidian_boots.json new file mode 100644 index 000000000..f4057386f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_bow.json b/src/generated/resources/assets/basemetals/items/obsidian_bow.json new file mode 100644 index 000000000..f56770b99 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_bucket.json b/src/generated/resources/assets/basemetals/items/obsidian_bucket.json new file mode 100644 index 000000000..dd29d55a6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -15724519 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_button.json b/src/generated/resources/assets/basemetals/items/obsidian_button.json new file mode 100644 index 000000000..929c51c3c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_chestplate.json b/src/generated/resources/assets/basemetals/items/obsidian_chestplate.json new file mode 100644 index 000000000..683b0fbec --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_crackhammer.json b/src/generated/resources/assets/basemetals/items/obsidian_crackhammer.json new file mode 100644 index 000000000..53bb0a7c4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_crossbow.json b/src/generated/resources/assets/basemetals/items/obsidian_crossbow.json new file mode 100644 index 000000000..8c297fdcd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_door.json b/src/generated/resources/assets/basemetals/items/obsidian_door.json new file mode 100644 index 000000000..b7716e2e2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_fishing_rod.json b/src/generated/resources/assets/basemetals/items/obsidian_fishing_rod.json new file mode 100644 index 000000000..bd218a392 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_gear.json b/src/generated/resources/assets/basemetals/items/obsidian_gear.json new file mode 100644 index 000000000..814bc791e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_helmet.json b/src/generated/resources/assets/basemetals/items/obsidian_helmet.json new file mode 100644 index 000000000..47da716f3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_hoe.json b/src/generated/resources/assets/basemetals/items/obsidian_hoe.json new file mode 100644 index 000000000..275193606 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_horse_armor.json b/src/generated/resources/assets/basemetals/items/obsidian_horse_armor.json new file mode 100644 index 000000000..4c35221d5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_ingot.json b/src/generated/resources/assets/basemetals/items/obsidian_ingot.json new file mode 100644 index 000000000..f24dddd69 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_leggings.json b/src/generated/resources/assets/basemetals/items/obsidian_leggings.json new file mode 100644 index 000000000..df429282d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_lever.json b/src/generated/resources/assets/basemetals/items/obsidian_lever.json new file mode 100644 index 000000000..789da2456 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_nugget.json b/src/generated/resources/assets/basemetals/items/obsidian_nugget.json new file mode 100644 index 000000000..3faea21a0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_pickaxe.json b/src/generated/resources/assets/basemetals/items/obsidian_pickaxe.json new file mode 100644 index 000000000..7202b76fe --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_powder.json b/src/generated/resources/assets/basemetals/items/obsidian_powder.json new file mode 100644 index 000000000..36fd0aa06 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_pressure_plate.json b/src/generated/resources/assets/basemetals/items/obsidian_pressure_plate.json new file mode 100644 index 000000000..a0c48344c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_rod.json b/src/generated/resources/assets/basemetals/items/obsidian_rod.json new file mode 100644 index 000000000..b91eddeb2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_scythe.json b/src/generated/resources/assets/basemetals/items/obsidian_scythe.json new file mode 100644 index 000000000..46134b026 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_shears.json b/src/generated/resources/assets/basemetals/items/obsidian_shears.json new file mode 100644 index 000000000..bca5aeee9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_shield.json b/src/generated/resources/assets/basemetals/items/obsidian_shield.json new file mode 100644 index 000000000..7ab03dcee --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_shovel.json b/src/generated/resources/assets/basemetals/items/obsidian_shovel.json new file mode 100644 index 000000000..e269ede9b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_slab.json b/src/generated/resources/assets/basemetals/items/obsidian_slab.json new file mode 100644 index 000000000..9cffa3126 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_smallpowder.json b/src/generated/resources/assets/basemetals/items/obsidian_smallpowder.json new file mode 100644 index 000000000..6fadef9a8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_stairs.json b/src/generated/resources/assets/basemetals/items/obsidian_stairs.json new file mode 100644 index 000000000..0c3a92499 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_sword.json b/src/generated/resources/assets/basemetals/items/obsidian_sword.json new file mode 100644 index 000000000..8725fc02d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_trapdoor.json b/src/generated/resources/assets/basemetals/items/obsidian_trapdoor.json new file mode 100644 index 000000000..7207aa254 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/obsidian_wall.json b/src/generated/resources/assets/basemetals/items/obsidian_wall.json new file mode 100644 index 000000000..dc75f8a3a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/obsidian_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/obsidian_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter.json b/src/generated/resources/assets/basemetals/items/pewter.json new file mode 100644 index 000000000..ef2393940 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_arrow.json b/src/generated/resources/assets/basemetals/items/pewter_arrow.json new file mode 100644 index 000000000..2d99ec90e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_axe.json b/src/generated/resources/assets/basemetals/items/pewter_axe.json new file mode 100644 index 000000000..e95f876e1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_bars.json b/src/generated/resources/assets/basemetals/items/pewter_bars.json new file mode 100644 index 000000000..263cf6a3e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_blend.json b/src/generated/resources/assets/basemetals/items/pewter_blend.json new file mode 100644 index 000000000..dc0cdb833 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_block.json b/src/generated/resources/assets/basemetals/items/pewter_block.json new file mode 100644 index 000000000..0bae8d13b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_bolt.json b/src/generated/resources/assets/basemetals/items/pewter_bolt.json new file mode 100644 index 000000000..5be1eeeba --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_boots.json b/src/generated/resources/assets/basemetals/items/pewter_boots.json new file mode 100644 index 000000000..e9b630c6b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_bow.json b/src/generated/resources/assets/basemetals/items/pewter_bow.json new file mode 100644 index 000000000..5dee2b253 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_bucket.json b/src/generated/resources/assets/basemetals/items/pewter_bucket.json new file mode 100644 index 000000000..19b1d4e51 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -7170401 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_button.json b/src/generated/resources/assets/basemetals/items/pewter_button.json new file mode 100644 index 000000000..3af46f637 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_chestplate.json b/src/generated/resources/assets/basemetals/items/pewter_chestplate.json new file mode 100644 index 000000000..5e61da33a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_crackhammer.json b/src/generated/resources/assets/basemetals/items/pewter_crackhammer.json new file mode 100644 index 000000000..1bab68847 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_crossbow.json b/src/generated/resources/assets/basemetals/items/pewter_crossbow.json new file mode 100644 index 000000000..740c787d0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_door.json b/src/generated/resources/assets/basemetals/items/pewter_door.json new file mode 100644 index 000000000..dcd51849d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_fishing_rod.json b/src/generated/resources/assets/basemetals/items/pewter_fishing_rod.json new file mode 100644 index 000000000..cf2ae5ea2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_gear.json b/src/generated/resources/assets/basemetals/items/pewter_gear.json new file mode 100644 index 000000000..26f726ae8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_helmet.json b/src/generated/resources/assets/basemetals/items/pewter_helmet.json new file mode 100644 index 000000000..e0cc23fb9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_hoe.json b/src/generated/resources/assets/basemetals/items/pewter_hoe.json new file mode 100644 index 000000000..50d3fc7f5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_horse_armor.json b/src/generated/resources/assets/basemetals/items/pewter_horse_armor.json new file mode 100644 index 000000000..1e7e9c081 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_ingot.json b/src/generated/resources/assets/basemetals/items/pewter_ingot.json new file mode 100644 index 000000000..dc104fe83 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_leggings.json b/src/generated/resources/assets/basemetals/items/pewter_leggings.json new file mode 100644 index 000000000..cdd9671af --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_lever.json b/src/generated/resources/assets/basemetals/items/pewter_lever.json new file mode 100644 index 000000000..0d0673578 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_nugget.json b/src/generated/resources/assets/basemetals/items/pewter_nugget.json new file mode 100644 index 000000000..d2344ed6e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_pickaxe.json b/src/generated/resources/assets/basemetals/items/pewter_pickaxe.json new file mode 100644 index 000000000..16f3da278 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_plate.json b/src/generated/resources/assets/basemetals/items/pewter_plate.json new file mode 100644 index 000000000..433870f96 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_powder.json b/src/generated/resources/assets/basemetals/items/pewter_powder.json new file mode 100644 index 000000000..3b236642a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_pressure_plate.json b/src/generated/resources/assets/basemetals/items/pewter_pressure_plate.json new file mode 100644 index 000000000..d43462809 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_rod.json b/src/generated/resources/assets/basemetals/items/pewter_rod.json new file mode 100644 index 000000000..57293f6ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_scythe.json b/src/generated/resources/assets/basemetals/items/pewter_scythe.json new file mode 100644 index 000000000..23affdca9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_shears.json b/src/generated/resources/assets/basemetals/items/pewter_shears.json new file mode 100644 index 000000000..98eb463bc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_shield.json b/src/generated/resources/assets/basemetals/items/pewter_shield.json new file mode 100644 index 000000000..2025a7068 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_shovel.json b/src/generated/resources/assets/basemetals/items/pewter_shovel.json new file mode 100644 index 000000000..85f632a58 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_slab.json b/src/generated/resources/assets/basemetals/items/pewter_slab.json new file mode 100644 index 000000000..2d169b740 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_smallblend.json b/src/generated/resources/assets/basemetals/items/pewter_smallblend.json new file mode 100644 index 000000000..fa472a941 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_smallpowder.json b/src/generated/resources/assets/basemetals/items/pewter_smallpowder.json new file mode 100644 index 000000000..f198de4e7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_stairs.json b/src/generated/resources/assets/basemetals/items/pewter_stairs.json new file mode 100644 index 000000000..bd106939e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_sword.json b/src/generated/resources/assets/basemetals/items/pewter_sword.json new file mode 100644 index 000000000..ea28f1bc8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_trapdoor.json b/src/generated/resources/assets/basemetals/items/pewter_trapdoor.json new file mode 100644 index 000000000..2020f444a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/pewter_wall.json b/src/generated/resources/assets/basemetals/items/pewter_wall.json new file mode 100644 index 000000000..b4bf66217 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/pewter_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/pewter_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum.json b/src/generated/resources/assets/basemetals/items/platinum.json new file mode 100644 index 000000000..9aa03fa49 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_arrow.json b/src/generated/resources/assets/basemetals/items/platinum_arrow.json new file mode 100644 index 000000000..fe787fe44 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_axe.json b/src/generated/resources/assets/basemetals/items/platinum_axe.json new file mode 100644 index 000000000..ada5f3163 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_bars.json b/src/generated/resources/assets/basemetals/items/platinum_bars.json new file mode 100644 index 000000000..7e59370b1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_block.json b/src/generated/resources/assets/basemetals/items/platinum_block.json new file mode 100644 index 000000000..04637d7e8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_bolt.json b/src/generated/resources/assets/basemetals/items/platinum_bolt.json new file mode 100644 index 000000000..7231daf92 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_boots.json b/src/generated/resources/assets/basemetals/items/platinum_boots.json new file mode 100644 index 000000000..b0574e9d8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_bow.json b/src/generated/resources/assets/basemetals/items/platinum_bow.json new file mode 100644 index 000000000..70bce5ae1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_bucket.json b/src/generated/resources/assets/basemetals/items/platinum_bucket.json new file mode 100644 index 000000000..0e0c38a19 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -851969 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_button.json b/src/generated/resources/assets/basemetals/items/platinum_button.json new file mode 100644 index 000000000..9c4e4ad69 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_casing.json b/src/generated/resources/assets/basemetals/items/platinum_casing.json new file mode 100644 index 000000000..0d4cb2ed1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_chestplate.json b/src/generated/resources/assets/basemetals/items/platinum_chestplate.json new file mode 100644 index 000000000..aa9b1a7b2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_clump.json b/src/generated/resources/assets/basemetals/items/platinum_clump.json new file mode 100644 index 000000000..a040c6aa8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_crackhammer.json b/src/generated/resources/assets/basemetals/items/platinum_crackhammer.json new file mode 100644 index 000000000..b02d653a5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_crossbow.json b/src/generated/resources/assets/basemetals/items/platinum_crossbow.json new file mode 100644 index 000000000..b3b8591e5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_crushed.json b/src/generated/resources/assets/basemetals/items/platinum_crushed.json new file mode 100644 index 000000000..29716ffee --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_crushed_purified.json b/src/generated/resources/assets/basemetals/items/platinum_crushed_purified.json new file mode 100644 index 000000000..c0e88e8de --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_crystal.json b/src/generated/resources/assets/basemetals/items/platinum_crystal.json new file mode 100644 index 000000000..fda2a6c5b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_dense_plate.json b/src/generated/resources/assets/basemetals/items/platinum_dense_plate.json new file mode 100644 index 000000000..3373cb65f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_door.json b/src/generated/resources/assets/basemetals/items/platinum_door.json new file mode 100644 index 000000000..75fbf0de7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_fishing_rod.json b/src/generated/resources/assets/basemetals/items/platinum_fishing_rod.json new file mode 100644 index 000000000..a557ed302 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_gear.json b/src/generated/resources/assets/basemetals/items/platinum_gear.json new file mode 100644 index 000000000..1f02aca99 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_helmet.json b/src/generated/resources/assets/basemetals/items/platinum_helmet.json new file mode 100644 index 000000000..24fdc99aa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_hoe.json b/src/generated/resources/assets/basemetals/items/platinum_hoe.json new file mode 100644 index 000000000..442e380ab --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_horse_armor.json b/src/generated/resources/assets/basemetals/items/platinum_horse_armor.json new file mode 100644 index 000000000..6ebef5329 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_ingot.json b/src/generated/resources/assets/basemetals/items/platinum_ingot.json new file mode 100644 index 000000000..a79f38585 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_leggings.json b/src/generated/resources/assets/basemetals/items/platinum_leggings.json new file mode 100644 index 000000000..2c10f537f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_lever.json b/src/generated/resources/assets/basemetals/items/platinum_lever.json new file mode 100644 index 000000000..fc6f4c8fb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_nugget.json b/src/generated/resources/assets/basemetals/items/platinum_nugget.json new file mode 100644 index 000000000..57a9c345e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_ore.json b/src/generated/resources/assets/basemetals/items/platinum_ore.json new file mode 100644 index 000000000..62288520d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_pickaxe.json b/src/generated/resources/assets/basemetals/items/platinum_pickaxe.json new file mode 100644 index 000000000..765137182 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_plate.json b/src/generated/resources/assets/basemetals/items/platinum_plate.json new file mode 100644 index 000000000..5a77746a2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_powder.json b/src/generated/resources/assets/basemetals/items/platinum_powder.json new file mode 100644 index 000000000..9597a228f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_powder_dirty.json b/src/generated/resources/assets/basemetals/items/platinum_powder_dirty.json new file mode 100644 index 000000000..27c6d4a36 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_pressure_plate.json b/src/generated/resources/assets/basemetals/items/platinum_pressure_plate.json new file mode 100644 index 000000000..c4ee5282e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_raw.json b/src/generated/resources/assets/basemetals/items/platinum_raw.json new file mode 100644 index 000000000..6700bc73c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_rod.json b/src/generated/resources/assets/basemetals/items/platinum_rod.json new file mode 100644 index 000000000..5847eb5d4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_scythe.json b/src/generated/resources/assets/basemetals/items/platinum_scythe.json new file mode 100644 index 000000000..9e353da14 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_shard.json b/src/generated/resources/assets/basemetals/items/platinum_shard.json new file mode 100644 index 000000000..a1c2b1f11 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_shears.json b/src/generated/resources/assets/basemetals/items/platinum_shears.json new file mode 100644 index 000000000..8df6be84b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_shield.json b/src/generated/resources/assets/basemetals/items/platinum_shield.json new file mode 100644 index 000000000..6731d175e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_shovel.json b/src/generated/resources/assets/basemetals/items/platinum_shovel.json new file mode 100644 index 000000000..1568097d5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_slab.json b/src/generated/resources/assets/basemetals/items/platinum_slab.json new file mode 100644 index 000000000..9bb53e2dc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_smallpowder.json b/src/generated/resources/assets/basemetals/items/platinum_smallpowder.json new file mode 100644 index 000000000..c0387141e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_stairs.json b/src/generated/resources/assets/basemetals/items/platinum_stairs.json new file mode 100644 index 000000000..9ce542367 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_sword.json b/src/generated/resources/assets/basemetals/items/platinum_sword.json new file mode 100644 index 000000000..2b075d84b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_trapdoor.json b/src/generated/resources/assets/basemetals/items/platinum_trapdoor.json new file mode 100644 index 000000000..1ede53681 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/platinum_wall.json b/src/generated/resources/assets/basemetals/items/platinum_wall.json new file mode 100644 index 000000000..b078fd6e8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/platinum_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/platinum_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/prismarine.json b/src/generated/resources/assets/basemetals/items/prismarine.json new file mode 100644 index 000000000..9b0483459 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/prismarine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/prismarine" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/prismarine_bucket.json b/src/generated/resources/assets/basemetals/items/prismarine_bucket.json new file mode 100644 index 000000000..1f03190fa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/prismarine_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/prismarine_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz.json b/src/generated/resources/assets/basemetals/items/quartz.json new file mode 100644 index 000000000..12b106475 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_arrow.json b/src/generated/resources/assets/basemetals/items/quartz_arrow.json new file mode 100644 index 000000000..23885f40e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_axe.json b/src/generated/resources/assets/basemetals/items/quartz_axe.json new file mode 100644 index 000000000..c450b753f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_bars.json b/src/generated/resources/assets/basemetals/items/quartz_bars.json new file mode 100644 index 000000000..59146df62 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_bolt.json b/src/generated/resources/assets/basemetals/items/quartz_bolt.json new file mode 100644 index 000000000..e58eaa226 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_boots.json b/src/generated/resources/assets/basemetals/items/quartz_boots.json new file mode 100644 index 000000000..be8c59f8d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_bow.json b/src/generated/resources/assets/basemetals/items/quartz_bow.json new file mode 100644 index 000000000..1209d6434 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_bucket.json b/src/generated/resources/assets/basemetals/items/quartz_bucket.json new file mode 100644 index 000000000..9088d22e0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1383461 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_button.json b/src/generated/resources/assets/basemetals/items/quartz_button.json new file mode 100644 index 000000000..5f9f1d244 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_chestplate.json b/src/generated/resources/assets/basemetals/items/quartz_chestplate.json new file mode 100644 index 000000000..c826ddb91 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_crackhammer.json b/src/generated/resources/assets/basemetals/items/quartz_crackhammer.json new file mode 100644 index 000000000..0e218320d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_crossbow.json b/src/generated/resources/assets/basemetals/items/quartz_crossbow.json new file mode 100644 index 000000000..b3b6a0fae --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_door.json b/src/generated/resources/assets/basemetals/items/quartz_door.json new file mode 100644 index 000000000..b0f0f4e7e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_fishing_rod.json b/src/generated/resources/assets/basemetals/items/quartz_fishing_rod.json new file mode 100644 index 000000000..a14ea6f1c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_gear.json b/src/generated/resources/assets/basemetals/items/quartz_gear.json new file mode 100644 index 000000000..f8d249f77 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_helmet.json b/src/generated/resources/assets/basemetals/items/quartz_helmet.json new file mode 100644 index 000000000..3247d4718 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_hoe.json b/src/generated/resources/assets/basemetals/items/quartz_hoe.json new file mode 100644 index 000000000..df043f53d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_horse_armor.json b/src/generated/resources/assets/basemetals/items/quartz_horse_armor.json new file mode 100644 index 000000000..0dc0ba187 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_leggings.json b/src/generated/resources/assets/basemetals/items/quartz_leggings.json new file mode 100644 index 000000000..9c1c213f2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_lever.json b/src/generated/resources/assets/basemetals/items/quartz_lever.json new file mode 100644 index 000000000..0ca2bec41 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_nugget.json b/src/generated/resources/assets/basemetals/items/quartz_nugget.json new file mode 100644 index 000000000..9edc2de82 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_pickaxe.json b/src/generated/resources/assets/basemetals/items/quartz_pickaxe.json new file mode 100644 index 000000000..b42f76e7f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_powder.json b/src/generated/resources/assets/basemetals/items/quartz_powder.json new file mode 100644 index 000000000..3e1e69109 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_pressure_plate.json b/src/generated/resources/assets/basemetals/items/quartz_pressure_plate.json new file mode 100644 index 000000000..a3edfec6e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_rod.json b/src/generated/resources/assets/basemetals/items/quartz_rod.json new file mode 100644 index 000000000..dc52ff78d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_scythe.json b/src/generated/resources/assets/basemetals/items/quartz_scythe.json new file mode 100644 index 000000000..503b34943 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_shears.json b/src/generated/resources/assets/basemetals/items/quartz_shears.json new file mode 100644 index 000000000..1eca38b80 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_shield.json b/src/generated/resources/assets/basemetals/items/quartz_shield.json new file mode 100644 index 000000000..c3baf3d2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_shovel.json b/src/generated/resources/assets/basemetals/items/quartz_shovel.json new file mode 100644 index 000000000..4821c97aa --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_smallpowder.json b/src/generated/resources/assets/basemetals/items/quartz_smallpowder.json new file mode 100644 index 000000000..d04665773 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_sword.json b/src/generated/resources/assets/basemetals/items/quartz_sword.json new file mode 100644 index 000000000..7f5d24855 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_trapdoor.json b/src/generated/resources/assets/basemetals/items/quartz_trapdoor.json new file mode 100644 index 000000000..47ec44a40 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/quartz_wall.json b/src/generated/resources/assets/basemetals/items/quartz_wall.json new file mode 100644 index 000000000..ce1e942ea --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/quartz_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/quartz_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/redstone.json b/src/generated/resources/assets/basemetals/items/redstone.json new file mode 100644 index 000000000..a55d0ac04 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/redstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/redstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/redstone_bucket.json b/src/generated/resources/assets/basemetals/items/redstone_bucket.json new file mode 100644 index 000000000..e9e1cfd21 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/redstone_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/redstone_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -9306112 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/redstone_ingot.json b/src/generated/resources/assets/basemetals/items/redstone_ingot.json new file mode 100644 index 000000000..e79bf4428 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/redstone_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/redstone_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/redstone_smallpowder.json b/src/generated/resources/assets/basemetals/items/redstone_smallpowder.json new file mode 100644 index 000000000..87e226e62 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/redstone_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/redstone_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver.json b/src/generated/resources/assets/basemetals/items/silver.json new file mode 100644 index 000000000..bd62085e2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_arrow.json b/src/generated/resources/assets/basemetals/items/silver_arrow.json new file mode 100644 index 000000000..7de04253d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_axe.json b/src/generated/resources/assets/basemetals/items/silver_axe.json new file mode 100644 index 000000000..2dce83a81 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_bars.json b/src/generated/resources/assets/basemetals/items/silver_bars.json new file mode 100644 index 000000000..be3e3bb0e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_block.json b/src/generated/resources/assets/basemetals/items/silver_block.json new file mode 100644 index 000000000..d4cb78422 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_bolt.json b/src/generated/resources/assets/basemetals/items/silver_bolt.json new file mode 100644 index 000000000..f063e5d93 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_boots.json b/src/generated/resources/assets/basemetals/items/silver_boots.json new file mode 100644 index 000000000..22b93e48a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_bow.json b/src/generated/resources/assets/basemetals/items/silver_bow.json new file mode 100644 index 000000000..8c1d5f008 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_bucket.json b/src/generated/resources/assets/basemetals/items/silver_bucket.json new file mode 100644 index 000000000..c20d1faa8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_button.json b/src/generated/resources/assets/basemetals/items/silver_button.json new file mode 100644 index 000000000..25b9b63db --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_chestplate.json b/src/generated/resources/assets/basemetals/items/silver_chestplate.json new file mode 100644 index 000000000..515e756dd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_crackhammer.json b/src/generated/resources/assets/basemetals/items/silver_crackhammer.json new file mode 100644 index 000000000..0f4678f93 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_crossbow.json b/src/generated/resources/assets/basemetals/items/silver_crossbow.json new file mode 100644 index 000000000..4dfb981f6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/silver_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/silver_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_door.json b/src/generated/resources/assets/basemetals/items/silver_door.json new file mode 100644 index 000000000..e1c6de6d6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_fishing_rod.json b/src/generated/resources/assets/basemetals/items/silver_fishing_rod.json new file mode 100644 index 000000000..4d2f76b14 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/silver_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/silver_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_gear.json b/src/generated/resources/assets/basemetals/items/silver_gear.json new file mode 100644 index 000000000..1837c2b4c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_helmet.json b/src/generated/resources/assets/basemetals/items/silver_helmet.json new file mode 100644 index 000000000..1836b7f90 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_hoe.json b/src/generated/resources/assets/basemetals/items/silver_hoe.json new file mode 100644 index 000000000..0c0fef7f4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_horse_armor.json b/src/generated/resources/assets/basemetals/items/silver_horse_armor.json new file mode 100644 index 000000000..8f3517bbc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_ingot.json b/src/generated/resources/assets/basemetals/items/silver_ingot.json new file mode 100644 index 000000000..cd187f80d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_leggings.json b/src/generated/resources/assets/basemetals/items/silver_leggings.json new file mode 100644 index 000000000..84e65d142 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_lever.json b/src/generated/resources/assets/basemetals/items/silver_lever.json new file mode 100644 index 000000000..265f3c069 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_nugget.json b/src/generated/resources/assets/basemetals/items/silver_nugget.json new file mode 100644 index 000000000..8d33b20d8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_ore.json b/src/generated/resources/assets/basemetals/items/silver_ore.json new file mode 100644 index 000000000..9d22e0509 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_pickaxe.json b/src/generated/resources/assets/basemetals/items/silver_pickaxe.json new file mode 100644 index 000000000..cc6d3c00d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_plate.json b/src/generated/resources/assets/basemetals/items/silver_plate.json new file mode 100644 index 000000000..ee73641ab --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_powder.json b/src/generated/resources/assets/basemetals/items/silver_powder.json new file mode 100644 index 000000000..ecd9d3090 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_pressure_plate.json b/src/generated/resources/assets/basemetals/items/silver_pressure_plate.json new file mode 100644 index 000000000..1265b542d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_raw.json b/src/generated/resources/assets/basemetals/items/silver_raw.json new file mode 100644 index 000000000..84afefdaf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_rod.json b/src/generated/resources/assets/basemetals/items/silver_rod.json new file mode 100644 index 000000000..80b11f2f1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_scythe.json b/src/generated/resources/assets/basemetals/items/silver_scythe.json new file mode 100644 index 000000000..0668a3ef7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_shears.json b/src/generated/resources/assets/basemetals/items/silver_shears.json new file mode 100644 index 000000000..0f8b9ec35 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_shield.json b/src/generated/resources/assets/basemetals/items/silver_shield.json new file mode 100644 index 000000000..5d76ccc0e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/silver_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/silver_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_shovel.json b/src/generated/resources/assets/basemetals/items/silver_shovel.json new file mode 100644 index 000000000..b4075a4b4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_slab.json b/src/generated/resources/assets/basemetals/items/silver_slab.json new file mode 100644 index 000000000..a90554c74 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_smallpowder.json b/src/generated/resources/assets/basemetals/items/silver_smallpowder.json new file mode 100644 index 000000000..37886270b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_stairs.json b/src/generated/resources/assets/basemetals/items/silver_stairs.json new file mode 100644 index 000000000..6053d6793 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_sword.json b/src/generated/resources/assets/basemetals/items/silver_sword.json new file mode 100644 index 000000000..abf38e34e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_trapdoor.json b/src/generated/resources/assets/basemetals/items/silver_trapdoor.json new file mode 100644 index 000000000..3cb0b99a4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/silver_wall.json b/src/generated/resources/assets/basemetals/items/silver_wall.json new file mode 100644 index 000000000..aec2b2581 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/silver_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/silver_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel.json b/src/generated/resources/assets/basemetals/items/starsteel.json new file mode 100644 index 000000000..844b9051d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_arrow.json b/src/generated/resources/assets/basemetals/items/starsteel_arrow.json new file mode 100644 index 000000000..3d907715a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_axe.json b/src/generated/resources/assets/basemetals/items/starsteel_axe.json new file mode 100644 index 000000000..8f98ee0a1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_bars.json b/src/generated/resources/assets/basemetals/items/starsteel_bars.json new file mode 100644 index 000000000..3620aab5a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_block.json b/src/generated/resources/assets/basemetals/items/starsteel_block.json new file mode 100644 index 000000000..ad3e0aeaf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_bolt.json b/src/generated/resources/assets/basemetals/items/starsteel_bolt.json new file mode 100644 index 000000000..522a862f8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_boots.json b/src/generated/resources/assets/basemetals/items/starsteel_boots.json new file mode 100644 index 000000000..cfd2f2da2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_bow.json b/src/generated/resources/assets/basemetals/items/starsteel_bow.json new file mode 100644 index 000000000..9ddf6284a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_bucket.json b/src/generated/resources/assets/basemetals/items/starsteel_bucket.json new file mode 100644 index 000000000..404c8f94c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -11323073 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_button.json b/src/generated/resources/assets/basemetals/items/starsteel_button.json new file mode 100644 index 000000000..c48c81330 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_casing.json b/src/generated/resources/assets/basemetals/items/starsteel_casing.json new file mode 100644 index 000000000..1d29a3c1c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_chestplate.json b/src/generated/resources/assets/basemetals/items/starsteel_chestplate.json new file mode 100644 index 000000000..940fafe3d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_clump.json b/src/generated/resources/assets/basemetals/items/starsteel_clump.json new file mode 100644 index 000000000..8e50cb9fe --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_crackhammer.json b/src/generated/resources/assets/basemetals/items/starsteel_crackhammer.json new file mode 100644 index 000000000..5617c49d8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_crossbow.json b/src/generated/resources/assets/basemetals/items/starsteel_crossbow.json new file mode 100644 index 000000000..9c631e50c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_crushed.json b/src/generated/resources/assets/basemetals/items/starsteel_crushed.json new file mode 100644 index 000000000..5775d3b3f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_crushed_purified.json b/src/generated/resources/assets/basemetals/items/starsteel_crushed_purified.json new file mode 100644 index 000000000..67f19525c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_crystal.json b/src/generated/resources/assets/basemetals/items/starsteel_crystal.json new file mode 100644 index 000000000..46c74bc4c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_dense_plate.json b/src/generated/resources/assets/basemetals/items/starsteel_dense_plate.json new file mode 100644 index 000000000..dc02b0157 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_door.json b/src/generated/resources/assets/basemetals/items/starsteel_door.json new file mode 100644 index 000000000..389044976 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_fishing_rod.json b/src/generated/resources/assets/basemetals/items/starsteel_fishing_rod.json new file mode 100644 index 000000000..3cc3cdd4f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_gear.json b/src/generated/resources/assets/basemetals/items/starsteel_gear.json new file mode 100644 index 000000000..9dcc80a17 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_helmet.json b/src/generated/resources/assets/basemetals/items/starsteel_helmet.json new file mode 100644 index 000000000..4a7276740 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_hoe.json b/src/generated/resources/assets/basemetals/items/starsteel_hoe.json new file mode 100644 index 000000000..1443749ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_horse_armor.json b/src/generated/resources/assets/basemetals/items/starsteel_horse_armor.json new file mode 100644 index 000000000..61f645f53 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_ingot.json b/src/generated/resources/assets/basemetals/items/starsteel_ingot.json new file mode 100644 index 000000000..2fbf14110 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_leggings.json b/src/generated/resources/assets/basemetals/items/starsteel_leggings.json new file mode 100644 index 000000000..1d466adce --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_lever.json b/src/generated/resources/assets/basemetals/items/starsteel_lever.json new file mode 100644 index 000000000..3e3ce9f2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_nugget.json b/src/generated/resources/assets/basemetals/items/starsteel_nugget.json new file mode 100644 index 000000000..5c93fbad5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_ore.json b/src/generated/resources/assets/basemetals/items/starsteel_ore.json new file mode 100644 index 000000000..ab760896c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_pickaxe.json b/src/generated/resources/assets/basemetals/items/starsteel_pickaxe.json new file mode 100644 index 000000000..353e35c0f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_plate.json b/src/generated/resources/assets/basemetals/items/starsteel_plate.json new file mode 100644 index 000000000..93ed791d8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_powder.json b/src/generated/resources/assets/basemetals/items/starsteel_powder.json new file mode 100644 index 000000000..5402ca23a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_powder_dirty.json b/src/generated/resources/assets/basemetals/items/starsteel_powder_dirty.json new file mode 100644 index 000000000..128e1c871 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_pressure_plate.json b/src/generated/resources/assets/basemetals/items/starsteel_pressure_plate.json new file mode 100644 index 000000000..4be3a49f8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_raw.json b/src/generated/resources/assets/basemetals/items/starsteel_raw.json new file mode 100644 index 000000000..a355f3fde --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_rod.json b/src/generated/resources/assets/basemetals/items/starsteel_rod.json new file mode 100644 index 000000000..a63640123 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_scythe.json b/src/generated/resources/assets/basemetals/items/starsteel_scythe.json new file mode 100644 index 000000000..88d35b30c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_shard.json b/src/generated/resources/assets/basemetals/items/starsteel_shard.json new file mode 100644 index 000000000..61f2daeb6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_shears.json b/src/generated/resources/assets/basemetals/items/starsteel_shears.json new file mode 100644 index 000000000..fa81c790a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_shield.json b/src/generated/resources/assets/basemetals/items/starsteel_shield.json new file mode 100644 index 000000000..5a2e81652 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_shovel.json b/src/generated/resources/assets/basemetals/items/starsteel_shovel.json new file mode 100644 index 000000000..08fdbef15 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_slab.json b/src/generated/resources/assets/basemetals/items/starsteel_slab.json new file mode 100644 index 000000000..82cb33e27 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_smallpowder.json b/src/generated/resources/assets/basemetals/items/starsteel_smallpowder.json new file mode 100644 index 000000000..1b0a90b16 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_stairs.json b/src/generated/resources/assets/basemetals/items/starsteel_stairs.json new file mode 100644 index 000000000..152fb132a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_sword.json b/src/generated/resources/assets/basemetals/items/starsteel_sword.json new file mode 100644 index 000000000..f660a4152 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_trapdoor.json b/src/generated/resources/assets/basemetals/items/starsteel_trapdoor.json new file mode 100644 index 000000000..9d95d5d40 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/starsteel_wall.json b/src/generated/resources/assets/basemetals/items/starsteel_wall.json new file mode 100644 index 000000000..6ec63ae32 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/starsteel_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/starsteel_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel.json b/src/generated/resources/assets/basemetals/items/steel.json new file mode 100644 index 000000000..8d791eb52 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_anvil.json b/src/generated/resources/assets/basemetals/items/steel_anvil.json new file mode 100644 index 000000000..257713699 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_anvil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_arrow.json b/src/generated/resources/assets/basemetals/items/steel_arrow.json new file mode 100644 index 000000000..69ef25d66 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_axe.json b/src/generated/resources/assets/basemetals/items/steel_axe.json new file mode 100644 index 000000000..5e411d551 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_bars.json b/src/generated/resources/assets/basemetals/items/steel_bars.json new file mode 100644 index 000000000..7c9261659 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_blend.json b/src/generated/resources/assets/basemetals/items/steel_blend.json new file mode 100644 index 000000000..a7b330f2c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_blend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_blend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_block.json b/src/generated/resources/assets/basemetals/items/steel_block.json new file mode 100644 index 000000000..07fb2acd6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_bolt.json b/src/generated/resources/assets/basemetals/items/steel_bolt.json new file mode 100644 index 000000000..28d63a5ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_boots.json b/src/generated/resources/assets/basemetals/items/steel_boots.json new file mode 100644 index 000000000..c47e18158 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_bow.json b/src/generated/resources/assets/basemetals/items/steel_bow.json new file mode 100644 index 000000000..0d1e369b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_bucket.json b/src/generated/resources/assets/basemetals/items/steel_bucket.json new file mode 100644 index 000000000..fb37bee57 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2759707 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_button.json b/src/generated/resources/assets/basemetals/items/steel_button.json new file mode 100644 index 000000000..1e8446807 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_chestplate.json b/src/generated/resources/assets/basemetals/items/steel_chestplate.json new file mode 100644 index 000000000..30fde4c56 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_crackhammer.json b/src/generated/resources/assets/basemetals/items/steel_crackhammer.json new file mode 100644 index 000000000..ce4589713 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_crossbow.json b/src/generated/resources/assets/basemetals/items/steel_crossbow.json new file mode 100644 index 000000000..b761fbdbd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/steel_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/steel_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_door.json b/src/generated/resources/assets/basemetals/items/steel_door.json new file mode 100644 index 000000000..a5c0602e0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_fishing_rod.json b/src/generated/resources/assets/basemetals/items/steel_fishing_rod.json new file mode 100644 index 000000000..dab250748 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/steel_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/steel_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_gear.json b/src/generated/resources/assets/basemetals/items/steel_gear.json new file mode 100644 index 000000000..0f2f3efff --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_helmet.json b/src/generated/resources/assets/basemetals/items/steel_helmet.json new file mode 100644 index 000000000..dd37f5d8a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_hoe.json b/src/generated/resources/assets/basemetals/items/steel_hoe.json new file mode 100644 index 000000000..a867401c6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_horse_armor.json b/src/generated/resources/assets/basemetals/items/steel_horse_armor.json new file mode 100644 index 000000000..b0a5992c6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_ingot.json b/src/generated/resources/assets/basemetals/items/steel_ingot.json new file mode 100644 index 000000000..1ad411bea --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_leggings.json b/src/generated/resources/assets/basemetals/items/steel_leggings.json new file mode 100644 index 000000000..2ed7602fe --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_lever.json b/src/generated/resources/assets/basemetals/items/steel_lever.json new file mode 100644 index 000000000..c66377c0b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_nugget.json b/src/generated/resources/assets/basemetals/items/steel_nugget.json new file mode 100644 index 000000000..36f8a7cd6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_pickaxe.json b/src/generated/resources/assets/basemetals/items/steel_pickaxe.json new file mode 100644 index 000000000..2f07dd550 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_plate.json b/src/generated/resources/assets/basemetals/items/steel_plate.json new file mode 100644 index 000000000..8aa762553 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_powder.json b/src/generated/resources/assets/basemetals/items/steel_powder.json new file mode 100644 index 000000000..ed183869c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_pressure_plate.json b/src/generated/resources/assets/basemetals/items/steel_pressure_plate.json new file mode 100644 index 000000000..7be2183ae --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_rod.json b/src/generated/resources/assets/basemetals/items/steel_rod.json new file mode 100644 index 000000000..f894cab41 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_scythe.json b/src/generated/resources/assets/basemetals/items/steel_scythe.json new file mode 100644 index 000000000..b0086777f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_shears.json b/src/generated/resources/assets/basemetals/items/steel_shears.json new file mode 100644 index 000000000..95e0d2c89 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_shield.json b/src/generated/resources/assets/basemetals/items/steel_shield.json new file mode 100644 index 000000000..344a2a7cf --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/steel_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/steel_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_shovel.json b/src/generated/resources/assets/basemetals/items/steel_shovel.json new file mode 100644 index 000000000..93b11c8a7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_slab.json b/src/generated/resources/assets/basemetals/items/steel_slab.json new file mode 100644 index 000000000..2fdc7eea2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_smallblend.json b/src/generated/resources/assets/basemetals/items/steel_smallblend.json new file mode 100644 index 000000000..b0ba6eee9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_smallblend.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_smallblend" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_smallpowder.json b/src/generated/resources/assets/basemetals/items/steel_smallpowder.json new file mode 100644 index 000000000..7110d12e5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_stairs.json b/src/generated/resources/assets/basemetals/items/steel_stairs.json new file mode 100644 index 000000000..78536be47 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_sword.json b/src/generated/resources/assets/basemetals/items/steel_sword.json new file mode 100644 index 000000000..d95caa81f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_trapdoor.json b/src/generated/resources/assets/basemetals/items/steel_trapdoor.json new file mode 100644 index 000000000..3f1bfdf0f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/steel_wall.json b/src/generated/resources/assets/basemetals/items/steel_wall.json new file mode 100644 index 000000000..57929dde3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/steel_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/steel_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone.json b/src/generated/resources/assets/basemetals/items/stone.json new file mode 100644 index 000000000..25d408549 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_anvil.json b/src/generated/resources/assets/basemetals/items/stone_anvil.json new file mode 100644 index 000000000..7f9f58229 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_anvil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_bucket.json b/src/generated/resources/assets/basemetals/items/stone_bucket.json new file mode 100644 index 000000000..1c643611c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -7368817 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_crackhammer.json b/src/generated/resources/assets/basemetals/items/stone_crackhammer.json new file mode 100644 index 000000000..44afe2eee --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_gear.json b/src/generated/resources/assets/basemetals/items/stone_gear.json new file mode 100644 index 000000000..b7824c288 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_rod.json b/src/generated/resources/assets/basemetals/items/stone_rod.json new file mode 100644 index 000000000..5d2a82e52 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/stone_scythe.json b/src/generated/resources/assets/basemetals/items/stone_scythe.json new file mode 100644 index 000000000..6191f3708 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/stone_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/stone_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin.json b/src/generated/resources/assets/basemetals/items/tin.json new file mode 100644 index 000000000..ebcc741e6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_arrow.json b/src/generated/resources/assets/basemetals/items/tin_arrow.json new file mode 100644 index 000000000..03d6472ca --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_axe.json b/src/generated/resources/assets/basemetals/items/tin_axe.json new file mode 100644 index 000000000..3830ab825 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_bars.json b/src/generated/resources/assets/basemetals/items/tin_bars.json new file mode 100644 index 000000000..5813c2312 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_block.json b/src/generated/resources/assets/basemetals/items/tin_block.json new file mode 100644 index 000000000..a55c7ef41 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_bolt.json b/src/generated/resources/assets/basemetals/items/tin_bolt.json new file mode 100644 index 000000000..6ef5e00cc --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_boots.json b/src/generated/resources/assets/basemetals/items/tin_boots.json new file mode 100644 index 000000000..66b31f00e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_bow.json b/src/generated/resources/assets/basemetals/items/tin_bow.json new file mode 100644 index 000000000..257147f57 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_bucket.json b/src/generated/resources/assets/basemetals/items/tin_bucket.json new file mode 100644 index 000000000..2c33b1415 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -2066 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_button.json b/src/generated/resources/assets/basemetals/items/tin_button.json new file mode 100644 index 000000000..e835ff81d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_chestplate.json b/src/generated/resources/assets/basemetals/items/tin_chestplate.json new file mode 100644 index 000000000..2acfcffda --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_crackhammer.json b/src/generated/resources/assets/basemetals/items/tin_crackhammer.json new file mode 100644 index 000000000..2e4b988af --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_crossbow.json b/src/generated/resources/assets/basemetals/items/tin_crossbow.json new file mode 100644 index 000000000..5302e6ffb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/tin_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/tin_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_door.json b/src/generated/resources/assets/basemetals/items/tin_door.json new file mode 100644 index 000000000..175690881 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_fishing_rod.json b/src/generated/resources/assets/basemetals/items/tin_fishing_rod.json new file mode 100644 index 000000000..99ae36112 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/tin_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/tin_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_gear.json b/src/generated/resources/assets/basemetals/items/tin_gear.json new file mode 100644 index 000000000..4d8d5ab06 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_helmet.json b/src/generated/resources/assets/basemetals/items/tin_helmet.json new file mode 100644 index 000000000..749753fd3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_hoe.json b/src/generated/resources/assets/basemetals/items/tin_hoe.json new file mode 100644 index 000000000..fdd9b144d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_horse_armor.json b/src/generated/resources/assets/basemetals/items/tin_horse_armor.json new file mode 100644 index 000000000..5a2e8f679 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_ingot.json b/src/generated/resources/assets/basemetals/items/tin_ingot.json new file mode 100644 index 000000000..b0ca53ad4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_leggings.json b/src/generated/resources/assets/basemetals/items/tin_leggings.json new file mode 100644 index 000000000..0a92d9abd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_lever.json b/src/generated/resources/assets/basemetals/items/tin_lever.json new file mode 100644 index 000000000..f5a8771a9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_nugget.json b/src/generated/resources/assets/basemetals/items/tin_nugget.json new file mode 100644 index 000000000..24c5b1d99 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_ore.json b/src/generated/resources/assets/basemetals/items/tin_ore.json new file mode 100644 index 000000000..2214edc85 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_pickaxe.json b/src/generated/resources/assets/basemetals/items/tin_pickaxe.json new file mode 100644 index 000000000..8595441c7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_plate.json b/src/generated/resources/assets/basemetals/items/tin_plate.json new file mode 100644 index 000000000..9a8c034ad --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_powder.json b/src/generated/resources/assets/basemetals/items/tin_powder.json new file mode 100644 index 000000000..b3646bf30 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_pressure_plate.json b/src/generated/resources/assets/basemetals/items/tin_pressure_plate.json new file mode 100644 index 000000000..037775435 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_raw.json b/src/generated/resources/assets/basemetals/items/tin_raw.json new file mode 100644 index 000000000..bcd3463b0 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_rod.json b/src/generated/resources/assets/basemetals/items/tin_rod.json new file mode 100644 index 000000000..9a8652f01 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_scythe.json b/src/generated/resources/assets/basemetals/items/tin_scythe.json new file mode 100644 index 000000000..9606a5f15 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_shears.json b/src/generated/resources/assets/basemetals/items/tin_shears.json new file mode 100644 index 000000000..15ae8b731 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_shield.json b/src/generated/resources/assets/basemetals/items/tin_shield.json new file mode 100644 index 000000000..229a63b3e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/tin_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/tin_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_shovel.json b/src/generated/resources/assets/basemetals/items/tin_shovel.json new file mode 100644 index 000000000..56c60bc81 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_slab.json b/src/generated/resources/assets/basemetals/items/tin_slab.json new file mode 100644 index 000000000..c18d4a5ac --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_smallpowder.json b/src/generated/resources/assets/basemetals/items/tin_smallpowder.json new file mode 100644 index 000000000..d9aa8060e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_stairs.json b/src/generated/resources/assets/basemetals/items/tin_stairs.json new file mode 100644 index 000000000..a04fcb121 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_sword.json b/src/generated/resources/assets/basemetals/items/tin_sword.json new file mode 100644 index 000000000..dee808ea4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_trapdoor.json b/src/generated/resources/assets/basemetals/items/tin_trapdoor.json new file mode 100644 index 000000000..14483bf35 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/tin_wall.json b/src/generated/resources/assets/basemetals/items/tin_wall.json new file mode 100644 index 000000000..bacb7f07b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/tin_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/tin_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/wood.json b/src/generated/resources/assets/basemetals/items/wood.json new file mode 100644 index 000000000..fc236e81c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/wood_bucket.json b/src/generated/resources/assets/basemetals/items/wood_bucket.json new file mode 100644 index 000000000..c45840a2a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/wood_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/wood_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -9874381 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/wood_crackhammer.json b/src/generated/resources/assets/basemetals/items/wood_crackhammer.json new file mode 100644 index 000000000..86e1c361a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/wood_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/wood_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/wood_gear.json b/src/generated/resources/assets/basemetals/items/wood_gear.json new file mode 100644 index 000000000..edfd4459e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/wood_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/wood_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/wood_scythe.json b/src/generated/resources/assets/basemetals/items/wood_scythe.json new file mode 100644 index 000000000..ade96aca5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/wood_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/wood_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc.json b/src/generated/resources/assets/basemetals/items/zinc.json new file mode 100644 index 000000000..b69d9f9f7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_arrow.json b/src/generated/resources/assets/basemetals/items/zinc_arrow.json new file mode 100644 index 000000000..dc9933e6c --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_arrow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_axe.json b/src/generated/resources/assets/basemetals/items/zinc_axe.json new file mode 100644 index 000000000..d860ba994 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_bars.json b/src/generated/resources/assets/basemetals/items/zinc_bars.json new file mode 100644 index 000000000..4d8a7b391 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bars" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_block.json b/src/generated/resources/assets/basemetals/items/zinc_block.json new file mode 100644 index 000000000..1f41889eb --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_bolt.json b/src/generated/resources/assets/basemetals/items/zinc_bolt.json new file mode 100644 index 000000000..8b1b2f2b3 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_boots.json b/src/generated/resources/assets/basemetals/items/zinc_boots.json new file mode 100644 index 000000000..e0dde59d5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_boots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_bow.json b/src/generated/resources/assets/basemetals/items/zinc_bow.json new file mode 100644 index 000000000..008327d1d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_bucket.json b/src/generated/resources/assets/basemetals/items/zinc_bucket.json new file mode 100644 index 000000000..4c0e1b53f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_bucket.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_bucket", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:constant", + "value": -4408132 + }, + { + "type": "minecraft:constant", + "value": -1 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_button.json b/src/generated/resources/assets/basemetals/items/zinc_button.json new file mode 100644 index 000000000..9b94ae3a7 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_casing.json b/src/generated/resources/assets/basemetals/items/zinc_casing.json new file mode 100644 index 000000000..4a56ddc38 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_casing.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_chestplate.json b/src/generated/resources/assets/basemetals/items/zinc_chestplate.json new file mode 100644 index 000000000..ff8d611b5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_chestplate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_clump.json b/src/generated/resources/assets/basemetals/items/zinc_clump.json new file mode 100644 index 000000000..fe751cf89 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_clump" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_crackhammer.json b/src/generated/resources/assets/basemetals/items/zinc_crackhammer.json new file mode 100644 index 000000000..15224388e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_crackhammer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crackhammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_crossbow.json b/src/generated/resources/assets/basemetals/items/zinc_crossbow.json new file mode 100644 index 000000000..6f4daae06 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_crossbow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crossbow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crossbow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crossbow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crossbow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_crushed.json b/src/generated/resources/assets/basemetals/items/zinc_crushed.json new file mode 100644 index 000000000..e97fb2a12 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_crushed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crushed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_crushed_purified.json b/src/generated/resources/assets/basemetals/items/zinc_crushed_purified.json new file mode 100644 index 000000000..9229b2e6a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_crushed_purified.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crushed_purified" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_crystal.json b/src/generated/resources/assets/basemetals/items/zinc_crystal.json new file mode 100644 index 000000000..a17d6e303 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_dense_plate.json b/src/generated/resources/assets/basemetals/items/zinc_dense_plate.json new file mode 100644 index 000000000..744630825 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_dense_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_dense_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_door.json b/src/generated/resources/assets/basemetals/items/zinc_door.json new file mode 100644 index 000000000..fa8aba490 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_fishing_rod.json b/src/generated/resources/assets/basemetals/items/zinc_fishing_rod.json new file mode 100644 index 000000000..9c26a1ef8 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_gear.json b/src/generated/resources/assets/basemetals/items/zinc_gear.json new file mode 100644 index 000000000..4ba2c5b27 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_gear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_gear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_helmet.json b/src/generated/resources/assets/basemetals/items/zinc_helmet.json new file mode 100644 index 000000000..bbb369461 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_helmet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_hoe.json b/src/generated/resources/assets/basemetals/items/zinc_hoe.json new file mode 100644 index 000000000..cbcdb43f2 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_horse_armor.json b/src/generated/resources/assets/basemetals/items/zinc_horse_armor.json new file mode 100644 index 000000000..bdedcb810 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_horse_armor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_ingot.json b/src/generated/resources/assets/basemetals/items/zinc_ingot.json new file mode 100644 index 000000000..3ffa035a5 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_leggings.json b/src/generated/resources/assets/basemetals/items/zinc_leggings.json new file mode 100644 index 000000000..84d7dd6fd --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_leggings.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_lever.json b/src/generated/resources/assets/basemetals/items/zinc_lever.json new file mode 100644 index 000000000..fa8ceac00 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_lever" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_nugget.json b/src/generated/resources/assets/basemetals/items/zinc_nugget.json new file mode 100644 index 000000000..a258edc2f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_nugget" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_ore.json b/src/generated/resources/assets/basemetals/items/zinc_ore.json new file mode 100644 index 000000000..7a31a0899 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_pickaxe.json b/src/generated/resources/assets/basemetals/items/zinc_pickaxe.json new file mode 100644 index 000000000..501e6909d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_plate.json b/src/generated/resources/assets/basemetals/items/zinc_plate.json new file mode 100644 index 000000000..97d74edb4 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_powder.json b/src/generated/resources/assets/basemetals/items/zinc_powder.json new file mode 100644 index 000000000..276f0bd4a --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_powder_dirty.json b/src/generated/resources/assets/basemetals/items/zinc_powder_dirty.json new file mode 100644 index 000000000..eceeb8663 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_powder_dirty.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_powder_dirty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_pressure_plate.json b/src/generated/resources/assets/basemetals/items/zinc_pressure_plate.json new file mode 100644 index 000000000..a2024df8e --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_pressure_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_raw.json b/src/generated/resources/assets/basemetals/items/zinc_raw.json new file mode 100644 index 000000000..d4990c1b6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_raw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_raw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_rod.json b/src/generated/resources/assets/basemetals/items/zinc_rod.json new file mode 100644 index 000000000..6c9e3d220 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_scythe.json b/src/generated/resources/assets/basemetals/items/zinc_scythe.json new file mode 100644 index 000000000..1c4d432a1 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_scythe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_scythe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_shard.json b/src/generated/resources/assets/basemetals/items/zinc_shard.json new file mode 100644 index 000000000..9292aa4ee --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_shears.json b/src/generated/resources/assets/basemetals/items/zinc_shears.json new file mode 100644 index 000000000..4c5f05492 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_shears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_shield.json b/src/generated/resources/assets/basemetals/items/zinc_shield.json new file mode 100644 index 000000000..a5f505c0f --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_shield.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_shield" + }, + "on_true": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_shield_blocking" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_shovel.json b/src/generated/resources/assets/basemetals/items/zinc_shovel.json new file mode 100644 index 000000000..e75bcbf1b --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_slab.json b/src/generated/resources/assets/basemetals/items/zinc_slab.json new file mode 100644 index 000000000..e8cc3e875 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_smallpowder.json b/src/generated/resources/assets/basemetals/items/zinc_smallpowder.json new file mode 100644 index 000000000..de8fd3974 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_smallpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_smallpowder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_stairs.json b/src/generated/resources/assets/basemetals/items/zinc_stairs.json new file mode 100644 index 000000000..8a9648d2d --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_sword.json b/src/generated/resources/assets/basemetals/items/zinc_sword.json new file mode 100644 index 000000000..e7f160b58 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_trapdoor.json b/src/generated/resources/assets/basemetals/items/zinc_trapdoor.json new file mode 100644 index 000000000..9be3502e6 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/items/zinc_wall.json b/src/generated/resources/assets/basemetals/items/zinc_wall.json new file mode 100644 index 000000000..b089d5ea9 --- /dev/null +++ b/src/generated/resources/assets/basemetals/items/zinc_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "basemetals:item/zinc_wall" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/block/adamantine_ore.json b/src/generated/resources/assets/basemetals/models/block/adamantine_ore.json index cf478f6b9..38938b06f 100644 --- a/src/generated/resources/assets/basemetals/models/block/adamantine_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/adamantine_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/antimony_ore.json b/src/generated/resources/assets/basemetals/models/block/antimony_ore.json index 2f6c539cf..455751585 100644 --- a/src/generated/resources/assets/basemetals/models/block/antimony_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/antimony_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/bismuth_ore.json b/src/generated/resources/assets/basemetals/models/block/bismuth_ore.json index 04093bf87..a87766ff3 100644 --- a/src/generated/resources/assets/basemetals/models/block/bismuth_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/bismuth_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/coldiron_ore.json b/src/generated/resources/assets/basemetals/models/block/coldiron_ore.json index 7c71a454f..b56f8029a 100644 --- a/src/generated/resources/assets/basemetals/models/block/coldiron_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/coldiron_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/copper_ore.json b/src/generated/resources/assets/basemetals/models/block/copper_ore.json index 204bf5576..362a244c4 100644 --- a/src/generated/resources/assets/basemetals/models/block/copper_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/copper_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/lead_ore.json b/src/generated/resources/assets/basemetals/models/block/lead_ore.json index 2c9af0d61..2ab4c2fd3 100644 --- a/src/generated/resources/assets/basemetals/models/block/lead_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/lead_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/mercury_ore.json b/src/generated/resources/assets/basemetals/models/block/mercury_ore.json index c06f2cf61..b47f3936b 100644 --- a/src/generated/resources/assets/basemetals/models/block/mercury_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/mercury_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/nickel_ore.json b/src/generated/resources/assets/basemetals/models/block/nickel_ore.json index c7ee32be6..ac67f042f 100644 --- a/src/generated/resources/assets/basemetals/models/block/nickel_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/nickel_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/platinum_ore.json b/src/generated/resources/assets/basemetals/models/block/platinum_ore.json index 41a1a2710..5518797ba 100644 --- a/src/generated/resources/assets/basemetals/models/block/platinum_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/platinum_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/silver_ore.json b/src/generated/resources/assets/basemetals/models/block/silver_ore.json index b50402132..58f56a520 100644 --- a/src/generated/resources/assets/basemetals/models/block/silver_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/silver_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/starsteel_ore.json b/src/generated/resources/assets/basemetals/models/block/starsteel_ore.json index f6c6aa897..e01d9c6ac 100644 --- a/src/generated/resources/assets/basemetals/models/block/starsteel_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/starsteel_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/tin_ore.json b/src/generated/resources/assets/basemetals/models/block/tin_ore.json index 5944634dc..28ec4ab66 100644 --- a/src/generated/resources/assets/basemetals/models/block/tin_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/tin_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/block/zinc_ore.json b/src/generated/resources/assets/basemetals/models/block/zinc_ore.json index d45399311..92d25d448 100644 --- a/src/generated/resources/assets/basemetals/models/block/zinc_ore.json +++ b/src/generated/resources/assets/basemetals/models/block/zinc_ore.json @@ -29,14 +29,14 @@ } }, "from": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "to": [ - 16, - 16, - 16 + 16.0, + 16.0, + 16.0 ] }, { diff --git a/src/generated/resources/assets/basemetals/models/item/adamantine_bucket.json b/src/generated/resources/assets/basemetals/models/item/adamantine_bucket.json index b5e4b2da6..6189fbf5b 100644 --- a/src/generated/resources/assets/basemetals/models/item/adamantine_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/adamantine_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:adamantine", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/antimony_bucket.json b/src/generated/resources/assets/basemetals/models/item/antimony_bucket.json index 0e05e23b0..9c801169f 100644 --- a/src/generated/resources/assets/basemetals/models/item/antimony_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/antimony_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:antimony", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/aquarium_bucket.json b/src/generated/resources/assets/basemetals/models/item/aquarium_bucket.json index 437ff7c05..f0f8958a3 100644 --- a/src/generated/resources/assets/basemetals/models/item/aquarium_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/aquarium_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:aquarium", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/bismuth_bucket.json b/src/generated/resources/assets/basemetals/models/item/bismuth_bucket.json index 80db8c69e..faf44cfec 100644 --- a/src/generated/resources/assets/basemetals/models/item/bismuth_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/bismuth_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:bismuth", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/brass_bucket.json b/src/generated/resources/assets/basemetals/models/item/brass_bucket.json index c0742c26b..c1edc4f57 100644 --- a/src/generated/resources/assets/basemetals/models/item/brass_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/brass_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:brass", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/bronze_bucket.json b/src/generated/resources/assets/basemetals/models/item/bronze_bucket.json index 7874aef4c..2fbbf5531 100644 --- a/src/generated/resources/assets/basemetals/models/item/bronze_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/bronze_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:bronze", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/charcoal_bucket.json b/src/generated/resources/assets/basemetals/models/item/charcoal_bucket.json index 6367c584c..02f22ecfc 100644 --- a/src/generated/resources/assets/basemetals/models/item/charcoal_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/charcoal_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:charcoal", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/coal_bucket.json b/src/generated/resources/assets/basemetals/models/item/coal_bucket.json index 6c5c5b407..b63543af1 100644 --- a/src/generated/resources/assets/basemetals/models/item/coal_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/coal_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:coal", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/coldiron_bucket.json b/src/generated/resources/assets/basemetals/models/item/coldiron_bucket.json index 78dd99cf0..a085cf78e 100644 --- a/src/generated/resources/assets/basemetals/models/item/coldiron_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/coldiron_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:coldiron", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/copper_bucket.json b/src/generated/resources/assets/basemetals/models/item/copper_bucket.json index af43d9764..cee2b5830 100644 --- a/src/generated/resources/assets/basemetals/models/item/copper_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/copper_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:copper", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/cupronickel_bucket.json b/src/generated/resources/assets/basemetals/models/item/cupronickel_bucket.json index 35a2f458d..64d0e29e8 100644 --- a/src/generated/resources/assets/basemetals/models/item/cupronickel_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/cupronickel_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:cupronickel", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/diamond_bucket.json b/src/generated/resources/assets/basemetals/models/item/diamond_bucket.json index 9dfdd2df6..e42b1c8c1 100644 --- a/src/generated/resources/assets/basemetals/models/item/diamond_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/diamond_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:diamond", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/electrum_bucket.json b/src/generated/resources/assets/basemetals/models/item/electrum_bucket.json index 23a635be3..10f68ae65 100644 --- a/src/generated/resources/assets/basemetals/models/item/electrum_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/electrum_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:electrum", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/emerald_bucket.json b/src/generated/resources/assets/basemetals/models/item/emerald_bucket.json index 7aa174d57..4819f55d0 100644 --- a/src/generated/resources/assets/basemetals/models/item/emerald_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/emerald_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:emerald", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/ender_bucket.json b/src/generated/resources/assets/basemetals/models/item/ender_bucket.json index c6a9dce6e..98b071e5c 100644 --- a/src/generated/resources/assets/basemetals/models/item/ender_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/ender_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:ender", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/gold_bucket.json b/src/generated/resources/assets/basemetals/models/item/gold_bucket.json index 7b6c03e02..fdfd6b11c 100644 --- a/src/generated/resources/assets/basemetals/models/item/gold_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/gold_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:gold", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/invar_bucket.json b/src/generated/resources/assets/basemetals/models/item/invar_bucket.json index 284faa04a..01ef40419 100644 --- a/src/generated/resources/assets/basemetals/models/item/invar_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/invar_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:invar", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/iron_bucket.json b/src/generated/resources/assets/basemetals/models/item/iron_bucket.json index 83bce0c5b..20b4bbaed 100644 --- a/src/generated/resources/assets/basemetals/models/item/iron_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/iron_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:iron", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/lapis_bucket.json b/src/generated/resources/assets/basemetals/models/item/lapis_bucket.json index 993d7702f..d5b7c1e66 100644 --- a/src/generated/resources/assets/basemetals/models/item/lapis_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/lapis_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:lapis", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/lead_bucket.json b/src/generated/resources/assets/basemetals/models/item/lead_bucket.json index 64751626e..d9b0dafc2 100644 --- a/src/generated/resources/assets/basemetals/models/item/lead_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/lead_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:lead", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/mercury_bucket.json b/src/generated/resources/assets/basemetals/models/item/mercury_bucket.json index 66edc1f81..c3ff8e3be 100644 --- a/src/generated/resources/assets/basemetals/models/item/mercury_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/mercury_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:mercury", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/mithril_bucket.json b/src/generated/resources/assets/basemetals/models/item/mithril_bucket.json index f8edd6ef6..b55870164 100644 --- a/src/generated/resources/assets/basemetals/models/item/mithril_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/mithril_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:mithril", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/nickel_bucket.json b/src/generated/resources/assets/basemetals/models/item/nickel_bucket.json index 302ff9669..93e334d14 100644 --- a/src/generated/resources/assets/basemetals/models/item/nickel_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/nickel_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:nickel", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/obsidian_bucket.json b/src/generated/resources/assets/basemetals/models/item/obsidian_bucket.json index 2649bdecf..3ce26c804 100644 --- a/src/generated/resources/assets/basemetals/models/item/obsidian_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/obsidian_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:obsidian", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/pewter_bucket.json b/src/generated/resources/assets/basemetals/models/item/pewter_bucket.json index 74f89ca49..988591909 100644 --- a/src/generated/resources/assets/basemetals/models/item/pewter_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/pewter_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:pewter", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/platinum_bucket.json b/src/generated/resources/assets/basemetals/models/item/platinum_bucket.json index 05abb94c2..274339b5b 100644 --- a/src/generated/resources/assets/basemetals/models/item/platinum_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/platinum_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:platinum", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/prismarine_bucket.json b/src/generated/resources/assets/basemetals/models/item/prismarine_bucket.json index 4e3834ea3..f966edbb3 100644 --- a/src/generated/resources/assets/basemetals/models/item/prismarine_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/prismarine_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:prismarine", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/quartz_bucket.json b/src/generated/resources/assets/basemetals/models/item/quartz_bucket.json index 14f2bee3e..0748a6cef 100644 --- a/src/generated/resources/assets/basemetals/models/item/quartz_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/quartz_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:quartz", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/redstone_bucket.json b/src/generated/resources/assets/basemetals/models/item/redstone_bucket.json index 2a3a82510..322699fc2 100644 --- a/src/generated/resources/assets/basemetals/models/item/redstone_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/redstone_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:redstone", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/silver_bucket.json b/src/generated/resources/assets/basemetals/models/item/silver_bucket.json index 4545b091e..cc80031fb 100644 --- a/src/generated/resources/assets/basemetals/models/item/silver_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/silver_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:silver", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/starsteel_bucket.json b/src/generated/resources/assets/basemetals/models/item/starsteel_bucket.json index 8e507995a..bf8e559fd 100644 --- a/src/generated/resources/assets/basemetals/models/item/starsteel_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/starsteel_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:starsteel", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/steel_bucket.json b/src/generated/resources/assets/basemetals/models/item/steel_bucket.json index 9cb9720e9..034678326 100644 --- a/src/generated/resources/assets/basemetals/models/item/steel_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/steel_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:steel", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/stone_bucket.json b/src/generated/resources/assets/basemetals/models/item/stone_bucket.json index b84f66231..81ed6d08d 100644 --- a/src/generated/resources/assets/basemetals/models/item/stone_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/stone_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:stone", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/tin_bucket.json b/src/generated/resources/assets/basemetals/models/item/tin_bucket.json index 0b1588db2..b700e66a7 100644 --- a/src/generated/resources/assets/basemetals/models/item/tin_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/tin_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:tin", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/wood_bucket.json b/src/generated/resources/assets/basemetals/models/item/wood_bucket.json index a4dbff0a8..b67b08a9a 100644 --- a/src/generated/resources/assets/basemetals/models/item/wood_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/wood_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:wood", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/models/item/zinc_bucket.json b/src/generated/resources/assets/basemetals/models/item/zinc_bucket.json index a74301dff..3034062b4 100644 --- a/src/generated/resources/assets/basemetals/models/item/zinc_bucket.json +++ b/src/generated/resources/assets/basemetals/models/item/zinc_bucket.json @@ -1,5 +1,11 @@ { "parent": "forge:item/bucket", "fluid": "basemetals:zinc", - "loader": "forge:fluid_container" + "loader": "forge:fluid_container", + "textures": { + "base": "basemetals:block/bucket_base", + "cover": "basemetals:block/bucket_cover", + "fluid": "basemetals:block/bucket_fluid", + "particle": "#base" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/adamantine.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/adamantine.png new file mode 100644 index 0000000000000000000000000000000000000000..a43c0cec40d88e52f9c3a9ac28773c699cf64e5f GIT binary patch literal 3000 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 ANdN!< literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/antimony.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/antimony.png new file mode 100644 index 0000000000000000000000000000000000000000..39290812a8a65787410bea333750d56c83a9e99f GIT binary patch literal 1981 zcmah~X;70{7JY$WLIeav#0DfPSS&6PS!59mf|5oM!Xh||fCQp#STrb&*d2r_y9X7U zH6#$CAPU8zv|R&8K|~hm5Qq>6`N;Bxgs>A36na#cIREBH*Zg?zynEj{b#K+Zb?>ji zL8tXG-(dg%`UHPpq6TT-4q97tufo6mr2%9jJ`fMU%e<{$Vs$h&_Od@Q5P*#R8eR?n z|Nh3G1|SUwz-$Zv?sNclrj)gYcmjav3_cU)ry*=^ZaNZu9u?$2%Fq9;Fu$OrsJ-ir zU`z-r6eDB8j;_uU2EBw)N@tXouuJLe(wVv0_O4E`94?|47to97l}xD|9uq?fm1;q) zR;pAYF~q8SDpx9CrGiykDTG905=c3vT3k|#B+!C-QK3>QrY0w+RFDMf;q`U#dKndE z%nDXn1*@0G?cs5|czukDa*;#~NyI(;K9LlHq~cyaS12A6ehV}y6pg*<>zbLLo0wG4 z%NUb0DrQAFlU3f)*D3$zDP^$A8LYAqkx()LOXRWa)N-?EU%}lGN zrx@kTi7Ay>E)&C&5ol~2mQ1LWkW4Zx622cBktyY>nW_231-VMWtgS3&&?_5i*>z95 zx$oX`-@WPU;k@gnmorP43=|4wY-}unC7zehdLMb)7$;3z0K6r z)W*if%F4>z+`PHHjnmuRH_-p8t+lDGwRfPuU%>Al8f37Tuwnv|jQ8_-#ievQlffJ2 zkIOVEDTak30+EnEI?NLc^$c(;U)GI?A@<8UP3;I72Q-xiC@L{1RD*1GwKNj{eU|2l zhzmIFi`djUDE;q0AeX z9dZxx(9&Zl1>@zl_;I&7DFBlZl=-1X?cE_6zx5$rmZ*og`A+RB4FapEEm}SW%h}o4 zy9eQz7tXYejg8P}upt_W#G^BRI&V0@zHkH1-P7jjME!Kl)}%9TI)LADqroj@ATV{G|t!rNVPY!S(KXt^Sh?ZJEGX*A)X#A6RnwPLPT^4`2hnH1~j|ndQgy zQ&H~Ne^PE?aX7=6Sx{$~<>H-x=k}Gvf?WC1BsaG50Fn{CkEzqVda+Bo*D0Z8d#9Ei zE)B-~QltIChn1k@j71)^c;dC*bEkcKB}KbAW8w2HcUs<-gx#46g||ONdwqHKwdINM z#`VnO#~VCgX!M#Z>Vh_TG>hzX)g!Mv?qhD1cTz__SeWH}R9U20z!|c$*DT2qXAr(2 z_y26N*imzTCEjt@N~oLO(h99c*WpB%!Io@)EP=RSp-ZeO+~r}aUEO!7x_Wy!ufGcK zn$&;SvGhzfkk9j&hIjV<5T$R^M+KN^zzRhX?S>Kie!?Adb8{v=@OCZPC^B|J;2iUH zM8%h(RFhM#gQ3qEn>T4vf9p6D{ZeEk*$_*8YCmr1M2zu1o3!n%UjU{$S;7hu&-_sx zvyrran*63du}>j z7j=Te0^f)EIoRcRW~@H@Y+!2>Zg(ZUuJMKrJE#2I@;mg2li)}Trczl>T!ae zPgBze`ixV5y^;lcQg?7N_U+B9@FY!x$|Kk`e@jxj_c#{~o+tt!W*jnjaf!H%sAtJp zCnXrbW{)BtW;MmPvA%YrVVTmFBO5$-X`R4&ZWHKG#OB+jWq5F1j>7qZUnx$0A>p>x z(GB$-8P19J5@XJaa0?Kx$)#s8NZnTJ@sw#T>${XN{djP#u91nHDJ=%kp){?KLLwoA z%?{DZ)tNjr-;qGc2Il55TDHdv$h%^;EAECpFnNsix%aQ*?5{hW&p-9SJc`fN0$SwT z<7?iC2qQLnEpy(=)V`IxO#5_6;DD_C9v6f*9gS|-g=9w{BJ^o-d-AxuqxL^RBb!lr z#P_@x(MDf`b^e^%>Zi@Ft*@`wq(O6;IeK_w)luu09fYCS?e>?`qeg9NKBxlAI1?AD za*rZtjFjQwtC$GaB!{s#d9#D)L> literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/aquarium.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/aquarium.png new file mode 100644 index 0000000000000000000000000000000000000000..4d104ada6576c4f10759993e2dc1049cb1e86646 GIT binary patch literal 4844 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/brass.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/brass.png new file mode 100644 index 0000000000000000000000000000000000000000..02276865dd7b899a681e42059e92769371344ef7 GIT binary patch literal 2295 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/bronze.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..da264696dea0224ea5194f1fee231b2231fc5fc5 GIT binary patch literal 2552 zcmai$cTm&W7RPT05EcSTo{FwmBEEGg2|Yl71d`A~ZwcTE2n0pYH6SiUKtQDn zi1ZfehyfBCB9D&iE?D5X0=ghg((}vv`RDuN&71k$`<*j$&iT&Vd+y9lcOlwsSJqSp z0BpzG+mK;pep^aNc>g+=D}+Tp)RJHcK^27!}ChU#5p z9p19XXJwr}Py-1nw1A2%g=KcayLN)RcCzV2@c>=iPv_qROc*g@es6l z@SEMC8X}Z$1{Ih~#u%c$5FrdZNHiJ))i^_SL=nqV!1Clbd+=L4#Beuuhh%5E=(gGDCTa5$*EmZ!Vd8vq zF>E?O6Eu536Y&u2%MBBE`3dr{l5qwv7t71R3OaoGO&+{&xNkMN^V)rQ?4T`n(APHa zjRv=k2Ff~2Jq2o`LJ$3=+%Rd6zqFMqggXq-B>gmgE|$*@5sXA{wt7Q7{^AFo!d$E% z7b|M<_*#hD%*JeHVK%Zbt9PuIZ!qvy&M`$8W%B4%Y{do5YTRGTGm~8A;A#S4px1NPr%Q9WdH2sokx^lx5g+lGx zwTs{3E9j$LWE{R6|6}s6M^mpI%St~XsdSW7;Kh}Wd-m)(bm)+dj?TV)`@|J^QMI$E z951dTiRwt=PG1pxfZhJWMpr>SS=iw#8f6IJ3+?t7z;n{*%DZJI>h$5)lldJ!0v1)! z;L6K0 z*spi`?}JBw8-q-w zzzXv7OG{tBF3q4C)WH!V$kEOQA(K1)4h~QZJOPLLsGyBdIT+nLj|V`3jkmFMjh|U5 zyyByd`(e=I-y@fwtv!8tTUi~WN;I+x!+s)Ah8>!ZCG=G^4bPqVh})^=+QmVSA8c)$ zZpu8Cx1f%h?89FAbaxpy^3Fa(*?{or*;s8TFaA&DeC*=NThX9|Is0eP!%O|*M0#lG zy(1;Rsc4_MEdNn$dmF`LZmlc%fjfh~xX)KurP zCfB0}lCQZPy|bp4{_%wi>1;-^;WHenGWa~r$thDY>Jc$xZB1*5%&@Ymx^)2mfvGfiHk5U}%$79s>GnCG zmwrz@j_{^)68LCnYp--5UsI+T^;$+Kz)kAu*>_N`@YIJ=Etke0FUr~ct8}kkBT`NG z=cu8`(pQhHs~mnx?0V_$ZfkSotqS^=Q37wJIAFpdtef}74PRH zmu+hJCm5e;4b_ZPs|}F;-qaMqN~5^+U!g&bsu;c-}CU-OL5XQDy?q4D%X60Uxu|(?%3O(*5F@zJ*?s&37}JDS7W^Qy=usun)>~Ca54m3thx3;T0JfC8#so*R-PM;|)^B zlaONUDhTa7@4o*kFJe=P`Mp0|;p$6yPB4%R56kOTasCmkoPvKbtFPCfB%Q6!<>w{JOw5;zui$F2^J-_vmZaK1P1X%=rC`2}u z##W?jYjz+vz9W)2tUe`18i2K}pF8Lxbfh zj~9MEwmc;e2*B&-L{Ge9W4uX&&{rlFk4&wbLIoWF2N&f>ItM4H`;Q~{-S#p z)~X4Z0F+o?d}rP2mI9fH&sGLSMUMt#di(r-^^q(5eR3msn@V=d-%qXwH+Q_a_MEF> z*iSQ;W>yR-Z_3YG&7O=Hfbw4*F90*Mvp2gBv_I@pH0QZ!SBC2{yNS(lFFJ8M6EBOvZc2+f>D<_uhT$9iPLhO-rt~L_{1W z(zVY<{2LK#m;5->2fee~Sa10F=V2Cz6 zbsYWEaYJKQ^eK~5Xp_^%257Vi8f|dF?XUkTh=>Xar(gQt1zrX#o^Zk5Zw{0wI^$ws l3=LR@Le?ePEr literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/coldiron.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/coldiron.png new file mode 100644 index 0000000000000000000000000000000000000000..af20b99b57133d29b755861b70a5ebe8d56dbb73 GIT binary patch literal 2303 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 Sh1C8^00{CA@vHTX&ioHPiL)L6 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/copper.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/copper.png new file mode 100644 index 0000000000000000000000000000000000000000..417a9892cbaa4683d1528ffa3d32f0e10a27a671 GIT binary patch literal 2489 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 T9Ew)|rvUKw^z~>uLcRDOV8pjo literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/cupronickel.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/cupronickel.png new file mode 100644 index 0000000000000000000000000000000000000000..00edf126d70d2fce79f58a50308c62675a54aa7b GIT binary patch literal 2174 zcmai0c{tQ-8-8cdAX?@ug6aO6_9P)VT@6Nkof>ZFf^`cz~_w&8Fr z*@hWEV;i%X#VlqlV+`4KI>(`iGyVDf@m=3@Jf4omUE}Yd=-=z)! z&_ugAdnyq7y;PMH{V(Z@FA7k;;o$B7K<)F*Yr!fCZWQ9?=?*~rK7}p~fUn>6Qvf_b z0WcE;fOQ@KJEQZ7muvul8+x4gcEMt?8yg!6nWv>?IWCKU%Tn|*Tvi?7wu=}IVh&NvZsAbMrsV?ZV6RlvGc6N{7$3$4d&QhqF`GCo7mj_uvscJy5Hdc@ z$c3`OUJ0jlc4Bat(<-9XPL8n02YWeCk%(5qf$&2dqL5ZI#3i#S#Y0@uxVTRy?qfrE z4yBykQOxQnmT*Z!9Fl}X686=Mi+b5){1BVSp_GpBJ4X1>Fdq{4w}_a{B4(3JOdS(b z*Pi=Y2rj)WM#VpGEF$tAVtr_U8>8F&lI!d_R zRow31WD**Kgrm2;>uXhHL0@Y=ucr!uKxk=ch1l3!KXWF+!6C}YDaO^6PpcWAR_o~K zn3$Lt8XD^9=?NM2JZjYdwMxLK9~po~cw`~7VR)cj+)reX@M2c8i2i}u_HK9p5-=L+ zB)ovpFxcNBX0?du^~|;cA+3(rUBT@p2xzr*5{}nR5YlP|^adflfzgKJc2`J6y;CxQ zVlh5FZ|YJkhgyv11uq4HSNZw*!rAqK6~!5L?c7;s*aqBuL_rWSXm=OHgo-{)WAEZf z%nSf3d(h4f-Wc(G-fAGvN4F;g@sgefQ)kr%9B@38`Rp#uLPy}AzmTog>gv!@Tk&hn zQ;i2ZgHPWv&nljZi6m~W=VtileoIXl&GGhB|E8UDVs*^MEk64`V|D&dvXvDgljrT{ z6W~Mp!TBvWm-zM6!6zG}lARt>a!rmRD30YITEV1+;vxnv#kNB5}`Q z(*tIsJ^_DkAbd;2ewme(^{PRujq`dcm^$K{@z^;G4QZeFjc4&6$$aee*;5#gmLb~g zMDycKIa@G4V>o3`PuRA=k1Y)K-F0_o?t|Ir4pynXHMkh8FP(MRdU}|kA(und{yL{T z3XkBR<5`~74(4%?GWfWhs$~ARRgIoLrj)-2A+|ACzl6M5OG}P@H+sOn_nj?LcKOyrgy33%*ml{q*JdgoIJ%FzigF z(kms=0^}NIhBZ>XhSJqmIcT%|tYdk^PPP<(MWZq#0-Rad_Sbf5nDVw%eSLj5BXo8w zxwUq?TBgD2(%yyH2$iL!-L7^&8AT&wWL*#hNrSFj$ppzchOI`#i1LI9@&4=utnnp; zF*?pjo2$>3ojf_Kd~BUy&-;T{mMmrW0C+MUfAq%VCr>U{7ucGGQ>F%9DB?ceLpAQe z)qT*ENaSk`l@%7)74C&rRxp=^zii&IV@J42SqT)q#dPK85{bxquc5n(xK!l^3_JhO-<|%2+G*tr>nk? z`%~c5^n;b@zx9MUPEKCmyog0!mN%#OGRP^Q>kqma=7XBO3s@@?E8BbFM0s$(v`Z~{?%#9o+t;`g)k(xbHh?7_^l?z7m}k?(1BMfUF} zrk0zcCrSu>ZHVco2__TsR?)de4(Kr4|7auC{xWhVEhr>7JUBVB zb;0vB-0dc)y{R0S5c*gZzD;USlbRm+cw>z|`-_E#u~tSnc=Uc9Z>bW!H5V5V(6*!j zSACY9o92FVTPGqFjrP-COM)N%sGDfD1Ni#wIyb$ZSa0fPj5I!vbk4~-FI%vC-IWpT zG0<gB>*1F`_Pt6;%2Ua+)w_bSf7ITsg6>#EW!5I`I|c{v z9$`9g2XLn{K6rauM=1zsU|}e*2?Dy{{}TypU1=uKRSUWEa~S}@B*w)zCNwxE%sS*= zm;!($%JPUg>bSY3l{e~$^%0cyQ7bbP${K|-i~ULdUxqtTq2bpb{%?by*}Sj9@UQPL tctu^0i3`3L1{^}8u7w$)?*!in^9&0PeR#JoOz|lI0PS+Yx!N%(f literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/electrum.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/electrum.png new file mode 100644 index 0000000000000000000000000000000000000000..741cafe429f376a179887e0af5913a6b64fd89c6 GIT binary patch literal 2458 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/emerald.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/emerald.png new file mode 100644 index 0000000000000000000000000000000000000000..7185f4aedc58a3f0d822fb930205f050dd7bb86c GIT binary patch literal 5478 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/invar.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/invar.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5d58c9716c59567dc81ba1d9a5a6fbe2ca48c4 GIT binary patch literal 2202 zcmai0XHXN^8oeQeE(i-YWC=bxtORhGi0Fp4z(a}@VXdIVU0sn#5mDrYA{JVZ5=5kz z1Wf1wG=>%uLLihtLJ|m3N(jmWcg3-Qyzuk=c=KlN_nkR+&N<(oZ|>Yj{=Oc&)DEZt z0CstKx&_D)yHhGqdH*QM{UQg&-<^G&0cg%q-wcPzIsCF`fDZt7Oy#;X0KV?%mjQ@F z0I(7UfMXE=dod+1PdNdgVB&u=$bCnE#cpqJ8+#fR=A{?rJt!(j$LFV)JbhI1^l?$a z1A2GGzG{oqxAQPXEiFu6;crvk&Oe~N|XJkt=lcSyV?($gyYeq0wUz0~ZeLy$ z%nAmj3j#W=l*{R))5_;16aBPOv4}+?JmGRW`f254!jnl(=j3R|B&S0xl;7hfMksyM z=iHrMIxA!~5ODp}Qa-nv&!zDuXd{EoBh2PuW;1uBqd^`r(k>PbN@m!yC1FEtPJK-_ zu{xVKPU8%vRAv$?GYAzKwG|mP6&cjFVr6Az9UYyiahizFvxOKE zX59&JI>wa)vM8qMS8s^R46#$!;=1y+Lh6@)MRWJ7Yqqs5$gpRhCI;8%R~|cyWta{m z^PC_v`vmoB88_l{4SIUsP4R-19!q-|T_Fp$xB!ZCTs&M0q|b*Lgk{B)lU_d$FD`cc z2tls@Vi2|wEdg<1fgr>+mF=%AQGH{%Uih9^w-%-F=X`G}YeTin7p8=qOb8WK4iz-( zT;s|5fK$vL$CLwd1{D;XL^4}mvXp`W9j3wmT$did5LMTRx!gnjvd{mP>WW??b3UOW z40ybBh=+3%*G{dCr$DHmC)lFQvK+lgdV=Qr$O6*uT5S#p3=HyGtw3F%ejS3hW`9 zGz!JRSd#D~L_%%WR#n*AVogJ#>q?RO`!H=--xRS^+{#B;hth*|j)qqEaXY&wCfJSV zVsZSp_n%HheHGqKoPd;u9K@!spy0SzRMy;hvZ4jZ-2Sedn(At}q$t_AN2-fGzrVHh%{zM|7h2gfGeXdL z$ajx6ZTKn*f!tf7rG~M##O~IH*&cd$DjE0XOV`_DaJPTB1kp#c;@lw*-;Q{!bKyW6 zvL13o1?A;T@6k0+^$$`u`Yp6GeEEpRVZ|tkleHyk$;Iu4c(WI!tZ@LE==CDDS$A7Q z!Th(BY0usEDq%$W#riv8B~aTbD3pmB9<*(u+b|{#QvoH94B|SHW?FO7JdG_MkDKeB zq!LAK)wcaX7x$R=J5<8m4*7>cf3bKrmz}*uB9T5&!Hwo$_^o4RFTOQ>%G;l!xJbQ% z%*Su!YhV9C+u0KQJ1H3ZIr;+7WZHCpSGox^I-sX${!q<19hR{u0owK=cHBrlV_CPw1IhC!mS~B0D1v(kC=jV|MTGFP! zFs1~fRzJX ztb#xI|0Er{sqCSGc`M+1N68;mlUVoA*og30wBzMyv>bpP!p`<5#Lqw39SuU*I@%%} z?T=a^5RM3h)ve%#|1v~IMO?j-@V^abtX4zihW$Ge0;8_P#)n6vfpbLEB{bYCGW>UR Y06IJ(;U)_$|1bdHsg zxWy65HWs->t|?JlMZ}bePJ7z2E4v(WJ7b-{&L3x;Kfd=_&sxv3zV$xudcRNP?R7#! zO@`y|PIO8`Neo11742RfY|78drO8XO$VU@%xLmOvmV zD=SS;7eq(1{QdnY6n`3x77`ND-Q6t~i+z24snoz5H*S=cmfpYLm7JWMl$4Z~mR3?y z($&?~(a}*{TwGLC)Y{t0=kp^YBNGx5;^X5ZA|gm6QcFuqK|w)YUS3mEQ(|IbVPRo& zbMw7>_iAfv1%fmdE2^}##NVGB6%|=hA|{hhUA%bl!i5WLHaj*pHZ3ic$K#1aqO!8G z&dyFEk?7;&bN>8!4u=yL7kBpT+3VM@=j7xlTFc7H%FN7^NF)sn4S|7y-rn8>0)axI z;PLqO_I4_j8Xg|bWHJK+0u+s(K7HED%L|D_>ged0`MDgR{LLchxE0OQnt3uRDoR&Z z*VNS1*x1;>z(5gHOiWBhMn-gWv`{Ei#C7J(na0M({QP`Hm~9nWThmeF61{vC2*l!w zis_0uVV_h%U}3+UaD#`dr!o`-$@Rp$Bmb#v1lztBHo9|AG137~Hy2XU)I#BU;FKTg z;R~gbVjk<&L-QTMGmY*F!IjKuFlmbJ zUX*DV65Wz2!2a|Y$JKm9?r@_b_V0wNXuO7L;XQ$UkeMvL5nNH!&RJi;tHxKmM|EP=0cN3dgMkp>Grt($t$LLsxJ|B z0Xcr;)_62wgbfl)g)KOXA945*hOI|=gg!jCYUDdsN8aI-71ZFYG(Nwg63OGWu6=y< z*Y7_DccxO}c50(nSD!w8QBSJ-P^7+XH?}-t1UA{ODgQnSJF@ZKOeYIqHjLAQwUv}0 zN{#9w{`k1%UVXL7xt#6U5P#yg38nz*T3;s%pmY8G{SbIZeN)+wqUM$_>-(}d*0YZ& z^G{?CPV?TN44W_mp#_&zM|_+Bm`8DeF6%xLWf% z(m-+r)q}C_x78SSI1qjJ@=ack1mEAn=6|D_0Eai7qUl0#P^l-x$_(Vg?FLbjea+H+ zRhKwA^Ylr-Df4B+<7zUai}E3nP9?%-92D)f^IQ_C(yFx@uR#M!qh+u6q-gKxVU;}~ z48DgPGEZsKHNM_8iAxWIw|P~-tBUWrRU1W4uXntswTw&@}t7eNg zv;x-@iwj-a0kdcB0)uIKs}TkJdd2UpF0{L?>ppO*R_4Ii-{#>cf;rsd*0702oJN0( z20~wV|7ZWJ;&X_x#igNnMA8RGYugeBGnE5$>eYy6d+bS%djF18`qQ~0;A5_;1uh4M z02wcu>?ZLl-p8RmSu08DlLs8@9-ezAod|GE*!Tzg@p){;B!C$7df#y)WQhoIX6V}~6u*)X}NKKaY@hug|^?Vnt8^BMSj zQ?7lJ^n*;#hB5)WzlrH`#TN@Xl=5gxZ*tw7Y`S}H43qLCt`6cI# zma&uIn0hF>@Alx{b=?H{{))|6y^y}`5<_(FxKjm8nnf{$5Nx2? z19JpO8TkJs47sdj|Ew2NGyG?P;)yfmy8Ck(p$ZiuP)?f~#~_j3Eyl_vZ*X;3I= literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/mithril.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/mithril.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5ccf74952c932e812bfff99beca1916b973011 GIT binary patch literal 1383 zcma)+eKgc*6vv<6m}y=jQbfvF8X80WC}9XAV#Js*kzURWhQ_^b+|&vVbc-}Bsm?!C@rcxe%K z5&!^NbZ?IUgqa(T(?Ft1Qn-u&9Yyn_0U#{cyvo5KxklTZ< zhr~;3Ym-XlYBNR?V)i=9z64-v1A|q`%jEhtSqQ=FGl3G3uc3|KyEsPAW68T=8Q&2C&;_isFa?*|Q74842E@UaZl zdE52ojcVyRqx|9Co{9E&pA)y%kH#oe<+EwS)}q4(mhdjElD!Ir!ySR9LM0eYBeYz* z_UhFvtBNgidG?@On<<^OhZgz6b0F^H7I=0X1&wI6+uz=!4`)cIG;gvU3xXtFS67@t6@WJ<5vy&%swe*+| zvrgy4TU1t{s+K-7+D^Lk967hJW;qT?PGhc^EFH?=cleO3^~QIJo}$L?vcNfWTr138 zHm&*Mgu#t9XGc0g`r!r9F~5GX)3wc}G1@0dT2Nwa&!L0yP1tU)-`uM&oc&I(8xyIH zqz8hF0f)njCx?EoM!P z4rku!xZ$>5ekuPeTRGu0o%i!i@FKe5^z&N#lKH7kzR;dx2zg{|9Y_vEeH^3g4kUS<1@WwGS*6M}xsd z&bJ+u%ji_n$K~B7_!f&o_D(lq=$QP-EC~c+>U5JztCBSF)i_Q3LaM_h-pExzwc6ZO z(UlDh7d97p3v8VdP}Y?HsVSJ~r4`Z{fr z>99o(u0l(t4UF1?8jaIB#SB`Jqp5CwPlvNMciwq-ubyL3@Z(cSgW2AkF4hffSm9EO zTdL)K)h)99Tw>Xqbm}O+>!&fO#<-jiGqot#lo&pQ%LM<|L{yQh-;?$_)I3B+ww5ID z3=u?d1YBx3pNjz4!nQWnu${H7V-RdZwSlPz94RnNg<(nxOZG28TtWmd^89}bLMbyL vh`?~;hronLK`MvO1+<8SFs=zbjuXWV;Bq3)Cv|c+t{l|AFisgvf7NM%BrS6>nJt#l-io6 zN}il4R`Fq-RH72{<*YVAD@{Odm$XnNq{#)iUngi5G_>(ZeY)-uUH`OE#Z%F_Dw7}E3SP1j!5RC!R+8{C&BCF?BQjG-C2q6t$q~dbq z9fP`Fihx9e+F<=iuT}tQyIGnx=0{LPDmF*nKB()V2#6vLuTLwG8N>qyXw)z~ZBkE~ z)UZL`rxnQ!VlqT(g^0~ilStboG4yaXEUt#h*3j7+8cRd#(suS3xWbQMbF>|F4TY}x zi>CQ&P}>h1hDQx@*dUW?dnr(JkAWvQiDf1+TiY(x_Di*W6o~X()eB9 zszIaC%a$z@8-yEzPJMX1i!}3t2Q@VcMNR*UnP#&> z#2h(%5Mi?L8Z!%YYEWnZdK|R|Ve8b{Y#k2(>U_{a?6LHbnLpm2jy%4)`xzp}-DX#9 z6?s1~7sd~Mn$ok5;ub+j5hu`^o zz|pa+tPmAtxgT9p-*laaxZ>*J!2;*y#6mxmqsDS{;yLoSyUyYyir}Y@Ha_qUL%+6a z+~#15a`v=8TaDW2>0bT#&C45VWZ!{A%P4S%c*y$Jp%}C?CAltQjW9RWZsX*IyXm(1 zwepwSea1HV*l`j5lBwJi`_RE_QRwT}gO^+4>f{Ok{>tv`@^JvB#xGPhhHQRj`5cM+ zy)@yT4Dov~IqA33xI6LXFt+AI!dRodDERktB3H|wM&72!Wn#03LaYZ~$5`%Zj(0&T zGqr*MtD$-6z{NVt#l=IhdCCI;gaFxAaqv`U3LGJmiN6k?tg3FQn?QZCX6WZ_vqSi8 zD^G8`dd~ga`O`%Tgn;tH=D7~CWf4M`H7?`N%TJw742auO=KAcVb|OtOJ>gxPHuH-b zf)O3$%-PAE`HnUozR z__yzqX!O*l zC(}1~8+Vn^6IDB>*C?}2^>(Y1vhS}4`?AtEuO(P0{{?a~%0T{#bV5iT#yTTuX$yz5 zu7z=R7QbN4C@8YX4?n2m^GP@D_}i@PzVt0VTx?G`eu4DgDw!|nIp6(j1W z@^O+Xk`Q;g%u-|_l85wD)>zu2P+Igh8ddeSM zH04!(Uh~~$?ADDAmG$?p5SK5%YvFLYt83@aiVokh+(PTQm44X7z&yd{E8@uCx-iOa z>x%Vdn13c5UR-iqnw*P#Wn6C?UD)Fakhx$fuTaw_eWp) E54;S#HUIzs literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/obsidian.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa17d730f5b25058c4332da007e5c60ece3c6fc GIT binary patch literal 4229 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 K+Eky#CjS>aR2>=s literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/steel.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/steel.png new file mode 100644 index 0000000000000000000000000000000000000000..392087dd6ad9b7d954654467fa7f40deb947b662 GIT binary patch literal 2140 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 YMn^=Yo`#~4FBt%D4?p*(Zj{Ww0k<~^bN~PV literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/zinc.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/horse_body/zinc.png new file mode 100644 index 0000000000000000000000000000000000000000..28c911413edb12d159a2e1850cbc414dfd3cfdd1 GIT binary patch literal 1735 zcmah~dsGr=9{uoznwo2BmKshz%25l=QZOH+W>z2>InHJ+nE04{5>4u~N}8?fBN5TX zRsow;Lr{rTLzomwGr(7=Q=+(pSxu#)&2HtW4E?!(?AhNr-|yag&b{Y5=YD^Df5l>= zEX{YC0{|?ek441lk@Dr38tV72>gvyWFiJt8Q2^Yn+OkeC)@zpw$70a{2q`30(^0KnB%F4?24xacY(eQ|Z zQO{_)&1N^T=H_PQ3b|Y^qu18d*Vn1$RKnhSLSfI$tWqYIDQA>ov3PiRxV^nyC=}ki zcaOnf%*@Pu3CLthrLwoTcXoD`$K$C~Dv?;kYv)c)O(}*I3`U(uBvL38b#;2u%jLBx z6!JPotyC(NNF+TyJ>A{iqoboEBO|r7wRAeYrlzL9zrU}qudAzTU|`_k!-vz;(<~N? zMx!+}G*GG3s;a8Cwl)rj!(=jBTU#GIcu-wk4TVB&Y-|Fv@d#34(3Rxi{Irm(-*t3! zw6wI?+uOUlyTf2GM@Prz=H|}MPKi_^5Zu)dpU)Qv_;fn0si}$0W^=h*eM`-nOI7;5 zOvtgA(|Y`SlM=J`N~33x#1l~w5S@X~oL)f5(dbC%g0VAXi#05!I7t6Ugy;wqE?2q8 zs4RSX)M04;_=)a1WE;(>%#!>TKjH2I?dD>A;>*Hs zu4G1Gr0t7~37Hq&Js)Ro{#3v5(JZzHkSimmQMBd{ANs9cu=eOYW+&ozXHKlVCL+gR0pXXxMv z3toM+r=c;@_umR#_gvMz0sGL$y>pvz+^Kh*AW59rQvFWb!m~Rh z%Q1b6VdLvNQ;8skxw+C9LVfV_dzRBNOZ>M`^0}=r$465hgPJK~?2psw9t&X_FzXy2 zmjLlcPZ07a4|*&M&j;YJF3Emi%<6D=5fCMCa8!!5#(8=1E0lO*CDHMybCN^p6Fl;; zcQG?G>-No?yA5nNubNo2|D1z2-92y#n7;u*N1@7$F-XAXW?vM)RHrG4vEBhp`Y&Kp zEqGIjvo%_T?9jiOOnhtvGPC6m+R!5RK*oyDGk zh>N=#BQL8z2`^*Q?&tk;(mPwZ=sg)ccwplhK785d?SgFDrjZ(p1kz`*Tg?O2&5}YJ z31q+VT#Xh@VRfVh<_Cm?!ulO8JvX?8s8aAY zHpaQ@n-4KeE6&36p82q^!u|4-ZTws(Zfx(li=Gg$**&f43kz+#wy6I+XH3a~Jt{!n zKE~g*+Q>_(uoyg4XGwx&|NGrwKqBPj4oT^)mU)JUZTeAbK3;J1V-|GAHfUn^*#d!G zuJ0iUv|@`O9eJb31o7!DWVWAqDkF}FGN&dfKR@3q$Z(heg9gtVM?yx_8oCN*-*(AI z4Vev<-C^}(?~vFmtT&Jh-Dnkp1KaV3cWSz##yBky$P&csWcq>i&*g1L>{0`rD$jvG zP5k0-FWEC*(Vn;R^tCDbj9LBs*rdbxy4TlnFWgFGdBYwl=HNbC(}F)#^M-PKvi1;b zeyK2IsFKh7E$Y@cBeyWERD^Z=Q>f?o0-~nl-TMe3TH{Lir19>X zF&j5hsVX~7)g~!s0OA6SD8L#RgaK0k`9DH!r40}e@n=V;srCQ>cXDJrIf+0fA}^4L zdH{ZKKVKjCK_5Q^4(^Neg(D9jyx?#o9Pah~nV0_+$jC}cOV0b>fj@dJ#_Iz+zT9v+ pE17(SKq3NEQdT0-B|3wULX0I6lJat7ME&mqKy)M~qT>j@=yyhs8A<>E literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/adamantine.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/adamantine.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb26291bb6ea33102286f94d68632bc5283f23f GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*@$C&U#YA!(SgLE=Ya3XoX%+Z{`kGpM8C&?6ScO|V`I%a~=oxz(Te|6+x*M44$}5?vYI+)3 zco>>_7@7x|+dAtSo2Y0QE2|qSsoH7j+iL1rYv@|3>li7i=_x3?>YD_b+xeT>=qso= z=^8m`8w6R{IqDdOS~&(=+H1)wgjqZO|NsB~>XjFO4q_|`@(X5gcy=QV#7XjYchL*E zEYJ?*u$OrHy0SlIm1X3SKd_M_mw|za%hSa%#N+thkke(i6$DZbWj83fFx(8fsIYw7 zlrJCu@4xPPcj=;ImdiKK;{6`;%uZrAzfGayRJLy~G+a!so%Cm@`FOAFmoS6g4Ldt~ zo(WB7mrBd+cPuwLH}kT3-;3OH2j|PPO8Fh* zEt%5C$oMg3Z+=5rhkmMx%lotDO9k4KjO~~8U0;1#Rd9Js!lj0Ta}FsmY(DF}U*`1m z^I`tIYR5JhEen=Pz0dD7t!~4$EzS%~JMMay<%L?_&z&uvPIl#@4DYn_1}w* z2;^*=)e~s*M5bHTG%)w}npr-VIja71uh#W!e=t|JE`hx_N2Onz`*OXD-~me(m9%ohxU}-MMDn zkzE^(?P*>*_5c6>Pn$Gu18rq23GxeOaCmkj4a7`z%`8F}QkZ?pIf)br8P#WBR=_}HNyzb2@8Rg=TJ05;)G?%{)oPDF6AVlT!+0cS$+l zl~_~y@w3jk?U6xUk3}39^W@#7?ILgX8TiggdgH&E>B6Zk*PquW_PlpITR&&-Va>aC zhc*U_e%->Iw?%&W)~{u=nzwFAPJguRuAi#>x0tDNyB--FlaLAX{*cvUxcIiOqqDrI zyGB<3*FqJBEt1AbGdeB`=5bGW?;_iIKrom4V&T_Dj*3O%DsrcCY$vAdN?y7}dt8IIo?|y&eySF*M!_w2K*Dyj%Q&)GzE%z6R zKX&Og9QVHwy!yl(%g)a`AIvN6`{=0UynXNO+ufgo3;tEvCVhBdzk_{g=3n2>uT~zI zF1beMvDTxzDrQes#Ma(OJ~vY};!9cm`AII<+Bfwos2-7U68nCgM{_CLeACVT{Y7if z+|gWA5S=GnAMiEw|JLq=*frn!4p*li{!!HWhjGmp6)yq7GGO9nP%UwdC`m~yNwrEY zN(E93Mg~TPx(24YMwTH4hE|3KR>qdv1_o9J2HItzPf#@E=BH$)RpQnVrTsPnsDZ)L L)z4*}Q$iB}w@!!1 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/aquarium.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/aquarium.png new file mode 100644 index 0000000000000000000000000000000000000000..96138604e57334610080e55fbf8bc0db5d261c86 GIT binary patch literal 3098 zcmZ`*c{r5c`+g@TVeDceV-ne!p=95NQQ1aGNFg*s82gN5O(A0`Lbk?MDpb}8C7~>X zP>jLkL&lVSOP0QGfBydXUFSOIIoEm4bJqL5&q>1BSn%;k@Bje7clM0gdC(ez8F}a+ zSQZyV#e;?uZ(?l%0I$<{cio}?oE~S+TLZw&695nc`u~7UF)RQGMF9ZY4FGg=06;t- zzsXJ?bR4{9X<-KZ{gMs;oIR> zU4%$H$%E1cf5l6V<-Fz#8|{2BIpjkaDqXP>QCY8b%<7dmz;-a<;g{L0=H|()Yt1KfmeGJj$hG#t8z!kwU>~zUNKjX zqCb#cX-*`0;ZZ&+Y4576+}C|nOKMMIBeYOAeVhoD$b>=SNlH|`#{PD9D5d`JM_1Qk zPs(N%dRhzpMNHHAUEJUkeW#*QPq`s_!r;IkN5qLO7^MoZTJ#Qx6F>X;95(Q3dS->E z{Y5xQRnh4)!J7ZL*SQY{|2$O%6p0@5l9djt6|H_2A#_^P{b2Ixk121H;fH@{+{7H0 zC=LnDgltM}bFnWYidtudz=7ATqXNVPgn5>eRVhke<-~&ac(6K;l2YEtJs#{NmX-ZgS4KMYi@ay~?$6%9unQPwV@e$K#4MNI~aCwPTO9c z^zkIHpd#A-z4o4+iOn?*&nNwjHY4U%fp+~0>UnnitKo`Rxff#oK(`e>vp^^pUs}U% z-*OM)atp9+W97ybg&+8H!idtB!Bp8xoDIv&_^e=HosajD6&r3g*rz}D#Xe=j{Tx4w z`Z;4Qv(fZd8kxlFpCt`NzqvZbL$Z2>k#Y}53O9@QnU@?5f}yjQblrn&+h+<*_S#-v zlVJWuvl>+?TC;ug(;vkxXzixqQ3unfm3HO4r(84tYyHzKfX#;UY^bJDNxy|2j-1Mi za-J;{Oq%`Usp3`Z(ehhQHN|cy6>4N8y7crSg(tW~OBA+yIKRwQ0#SZ-F{YDo`^r<@ zS6yGZ&z34O^y z|NVd|^?GF%w2h`_G!*F!$fsNlu;yTLs@q$)l;2$7_hD>N>-geo)^9ibDV;(r#|cEF zZh36Y+blaguGQkCv7tn%m~KYWJ55)kmC^OxHkcj+hV5@dUviHE7Z=cf#@W**9*1$K)0Q#Ra+y4!IV`?lBdAn>FpxoYLD@`V0s#3NzLQuWB=G74H4z= z=B&XL=O^TTS(zSGjtx|2Fex+%z7zPkLI3uBT$|`z9c44SrlWD9>6O*bihEAP+YRCs z$YOB{W@;vZhQ8NbL;CSiC^M^*;88g0rg#BfR;uw_$uqOCQ&ifZtNfPVZVh)X71WKA z$UF~>yVJ9>6-jRT#ZRn9r>2)Kgi;Dq_NtkMR6M~CGeA!$3felBQ}LmPFuZ-q$C3Py zTGo>@OrPN4-BZFg71uh?|m@c8TMdLmB2i^s#hQO*6G%ka)?3J2R|g8GV_hN_~AkpMEy6lP5=|^d8m}0vwT3* zkIv$Cl!+}*2@jqFCfOpfX(I`hOH-U>Pc)ReuY`;_6CULn*zYWr6m6hGQtdznzISms z;DwikW$U;S2!%0UwKy?roIcJ5)Qe-b4h`)t+TEA4Xx47!eG?!8+`%4n2H(wku0yg&2aygc!;(+>}qNp=RR`#s~LXYhW8B=WgR9~)j*e~k6( z_yGMbG9j6XQNgUn37mSFxID%@D&A<`#yhFB_*A^`exCGI!JSk-k`Z=fW!!OpB0}as z=w`CuxYnVo%g25`&ZgFH#ERb<7_)E-NbO-gtO+k#zFZ=_Qp_iKgTTMujXUkQCh07V znHas}7WW@i+G_C#VWEBC^tK#JUsd?UmvGv28_k166>gfrgJkbGZP=0g@~@=a{?2H~ zPYIvYu+J?}{Jh0rLE7?*8l&!|;hcyMUk#`=KCgrNyka^!g+R&&w0Z*18p!($0fn6& zd8P`&={vGnZ0D}`N>=F}UuD|LaP&BCZxN7imiAaGdfDcrUv8)(*MbpIc)Jf(n)2^j zBkuG5Y0pr27a;kT#>mdAW3IXS?g^}`X5jSnsT<00smj!AZ!x#tgE-OFC#Q$Vp=-Q5 z#!2oW)+W(pQ#Qi<4j(PB+*Rs>djB4hbU(jL+IbvlwFtcVhA6IHK%C?cjGnkG@M^A4 zh?Sb!Q*Jj0H=j@VMkS>tO_VS(^CPzZMk4thHQ%Z#E?!Ur4=INM0mZ6#^_E_U{DIL3 z)(zIt65Oss7a`cNIJGQ0_U!lHz7HoLbV_J3b{BAXHQB%q3UMbY06$agEqKpP;V0u zcgael&jWXA!*~u3C4ES%jJ}cf6Jny}z4ba38u30(Uy}j1ycW$))&L2pI%&KnOK#&D z*^jt(UQZihvn&%m)34C70$o=Xk~JNEn93ldd;uCxK&qm-Uoj>TU?;X}t>T_!tV9cx31{Faq-BJUCR#dSbSvXl2ZrP9o@Zr-=;YSw#+-Qb-~(sja!!W z9NNC<;I@Uw_N>^nq-*2i&JBy&cCMYeWA&u%t0rz-+`e{x^Zw0qkMCW%Zb8eQjk8Yd zTXk~(+Eugb{{R0!|H_lIKwBA0g8YIR9G=}s196hP-Ca}m&(=QW; zrz*LVo|hZMDi!akN$#}lESNWs?E}M)T?c+W?Y7S@z594m$%Q`U6 zCDxRF{H$|sdt^}8V-W|&Jb8C%yU3e;2EKEW-uSO(x^QaC_2;#TJ?|aQ*3a2{So5yk zp^d?!U$=1QZINHT^=sLz=B-!&LJEoQ3Ru15yPBxJ(8KV- zk6n5V$Ng^vuRbxyvh(xK2lI;iK00bSZ{K_ScK7Gtf`3)ENgp2A?_gh=`PcXJtCa_) zORmv*to7)wirJGDv9&jn&&^bg_)=DXev-?z_D#JCsz)T8#J*qW(Ok+l-*mHof6>}A zcQh9jMCS?D2Ye0vzqLCdcFniG!`11Be-yR;VO;Y?#Y;f244AkXR7+eVN>UO_QmvAU zQh^kMk%5t+u7Rnpk!6U1p_QS5m9eF^fq|8Qfp%Hw6BG@(`6-!cmAExTX}^sCYGCkm L^>bP0l+XkK5>bdB literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/brass.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/brass.png new file mode 100644 index 0000000000000000000000000000000000000000..1688458e6cb11aefaa165d9c1052df7a5449ec5d GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*@$C&U#$8#nU(fshFz5e+^#2dD{y(Yu|1kH@o%sI`GXLLC_^8b%ZuI~x_|D@vo|Np%Hg|~qYVk`;r3ubV5 zb|VeMN%D4g(F?gO&<^CVmw5WRvOi^&W#o}Ru#qE|fq{w3)5S5wI<+zh&?uzcH;FCYK!zwUZ>>7rwn%Qw&B{T}noPGUE|O`+mcwr?*qTuiQ=^k=B~ zc(3f2FoWI=J3D)x2~B60O3UqcEH^qg^Rjy1i`;Vu=gYHAVE9$p^71hM{$(nwt~|D2 zKD$d(Y1NVGr;R2pnbOC|_%UT~enVM@eyWPg`?Kat1=^F0?U(gkUwv9taCuC^rG|rZ z4k<8fKI^<+=JfRQVg9{p$2J%(3zkZ~&+jy?Zo{=L&J0XD?uM`Xx9QR5wsqXsX8cSH zW$=1)?aK~*iOHdYzxy|zEAS}KTXoxh*|NiWJ09+ue=X>ABHyxzZ*x~pe_Ezd`S|#% zD{Cj^^%yRbUcN%b@L0s`pH2>0d7j&Kh3;Q>PhdOHx-l)J-H-dqX$}qTq^lhY0@DQx z_y1BzpU~ki6}$Ms4wo}>@ug0`-Cn3H%xx*V|H!C)nc+7Jml@3~Tf&9CVqDMoK09!- zMciudy5CXt-;0h2dedif zLsp&2e!5*<@%-!w(@)Da$2RcRYaGh^)%jP&@KC#?Ph!UOIZIy{g@-#Edv2Ag|Ej0G zPPP8`)6HiO?_*9paUrDdl*HDbI{#)IjEa7@?D6fYI{oWUVrE=?ad7I#YpvFyGgth} z{_LZ?yz-i_*TL=I9&-KURXM47Z2tN6hQNfPTH+c}l9E`GYL#4+3Zxi}42%qQ4NP^7 yEJF+otqcvUj4ibd46F2vwNGylT^pEq;8-_Q5?vm)T*Lf^+TJl@Xpc{bDY`7E#FE%ujs zoL|rNelgqY)f}%ci~Jr<_c-6>bgt9sOo!v0$!@nNx!suHdcEJ}Y^URiR)?oEJijjX z`?SdSWShgoX&(2cxPM#X_h72~ujK*Xm--)WvirR};Q#;s|D;x%0v*Iy666=m;PC85 z8i^mS!_$|}pqqx}9}$twm1CN57G#}JR>dqYl_-Bu7tJ(S&` z=%T{%ZBxE{{J;OY>)oY`j#)0>Jd5{x%riTQ-TXF%ic{IXz0hzmxpvZ@q2}Yg zvR}dsdN=Is?0F_Mon0y|x8Jec=-kZ9>U}SA&mEjE&o+VKS7pn~!~FY~sjRy4*n;`& zE={FXN2Z@PnzUp}A0y+(l)d>4WgYsdDlYHOnlBY-PcpV&)^~mNX;s1HF$tF%4$e8G zz_9tO^M0Ar)6a+b_o^M+V6-e)D)m0U)3mw`*S0t_FzvV-zV6?qN1NN$abKJ9GclCG z>&>+&cAz{wVI ztG(-fN7a8XIwFv>ZB|d9%@dh!S<}GW+iPa|T;{0y&%IjLv;Dzb*_JPX`zz~BpUn+f zbt?Pmc6G(`vnNbHE!P~|z+10zDDPM2Ulqec?UFu;8Pn%1ePI+H?riM2RjU50p7uJ` z`rl7CpFO;fIq}4WkiJtATYu{On{hBI`rWd}x2x*(uRn>Iaq-2$sUNSkT8GYD@h|(c zkMi=$Yrb9ww|{%c^^;fSq~@{t=hqto6N+kyYeY#(Vo9o1a#1RfVlXl=GSoFN)itsV wF)*|;G_W$Z)HX1%GBD6C3w?s3AvZrIGp!Q0hA8c~5kL(Lp00i_>zopr0P?A!0RR91 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/coldiron.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/coldiron.png new file mode 100644 index 0000000000000000000000000000000000000000..16b9d47184f58ef2639fd3fbf3eb743075913e64 GIT binary patch literal 935 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/emerald.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/emerald.png new file mode 100644 index 0000000000000000000000000000000000000000..d94b96da6a301c5488d1094a5ef3b89cf1bfc767 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*WnC&U#<*BtIC-rL%A zd{X7XuDYZBt*55e9_icq^uUxWizi-MF!|D=xi?o&y|Se1?986?b9yh#E!f>ub+~)N z#rgdg=1sr4wBlfA`Tma5eQixACN~_PSbwy?bbou{?&j`uvu9jeR=lUV{q&5P*H+BF zu`+i@J8=;`7Z;&FU$=;^XM3Oue46&t&J1(L-ddLEzr@4tE3 z#gvzY#+J*YHa?u!{f;@=jxBD@XU2mz){PxWN&k5p%UCJs+kawk16 zH;7d#-cys@Y1vsYZywtRh9A2Q{Ce7LpIv(Q@urdseab7c!gt4RcinrfijTu(`jpQM zUP1S6Epo9u978_bW$-zjwW~riHz)}l=k8{nq+*o+{L{%P1+u%OobO7kDgF3a z=iK(lpsvRv4vcy7?$UOVH~S2H=On%HU(Iyk)RybdYZH6kJD#ndv-hy(UAsdYgGIk? z;m+G4zkKW0vRTbrwM>k=+t<-qUesM9tN&}E z3d0sjU+B5@VDQ#rO1Q+6dU-J-oQ+{;;0Hu?@X z{}Q9gA}?fi2ld@K^{$IYKgaab?6`NoKl0t%9N%H->C|f&A*QLTyW*Dni^Lzh^cs%) z-w0lPVvc3!=baDc759B~)NV8v1{0cS7u%Z+(ZW(+~eBYW>5w=8KA#fM6LgaWklvxJHzuB$lLFB^RXvDF!10 zBST#SQ(Ys=5CcOiLjx;gOKk%KD+2@Vvd||e8glbfGSez?YlzZ*8v)e7;OXk;vd$@? F2>`I|eoFuV literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/invar.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/invar.png new file mode 100644 index 0000000000000000000000000000000000000000..69c8f71f83d02959e3934bc1569643edaf6d2757 GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*@$C&X1%MPbkOCEGU5 zKd^hnu5F9=?p%6k@2b5!mcD#)=IqHWr;lwqdt&p|3%kyp+;Z&T+B3&D9Y4J8#NqW@ zHq70 zSQ6wH%;50sMjD8dFMXg{Cm}oZ7^CEER}kn-)UOihHG1#8JKq54PW$tDY_?Z~W;PvL(mmT^NlS2i6_isK|;8C8p>bCu|Wry{4Jlr+^TF~i4zGV^L=B}Ln zv`nM&@$pqx)=tXnFW@V_HbNANQ5h92(k5 zS3490rVAGC|D}*Vp~GJ)cJYH9E@$N8OPzkZy--=0+fsJ_kx~0H!*3QYGn!YngbRDc zxSsKScHm@-xYgcuzoY8E7abAE**2>u(B_Fux2$Pk?(H?Rd@gfT{pVh->)HNbu58Pf z!2Ol=rqAYvtU8tbbi2CZ`PmbupO$NmZQ!lfIF$FR^RJ5Gp>|21#Ej{4mcB3w4|g{9 z+$vT7RZn}JYW?r0o6jEJ$DDZLLP*~!iLF0%{>?ZT75#469=x|pzDAqq)!}Q?0MCwt0 zhAmOsetb=2i1qe+{qG0wwd(w}_w5Uh1QxA({LP?&@xXfF6a4mnmTmpSw)`Zc<(9?{ zn~8f)bn;}@@^PH`Zq&xASAFM_%bDaa?-dQ+uS~I8elB^-923E(EJBUh`>)3`KA-gc z?VQGQ+nX*;5^35iu;OdVw%l;F+-l9c^Oyt!Lv_3cX$dn9(j7>ky?1SjQKs~9k*;hzA!!NdNjv(oy*?5lKRNLt^X{~9N9W8 zWF8RwpKdol<_b-1fIg=aqtjIE{ zfWzQ(zr&tW`g=SN3)-D=xOO+L$Smuuh?}~*noe!c#UcfhFMqP1O!}V8erVpoHW}yl ziE@#DO`SDW_s;5j_Vioax|LgB?Rb3eQc3J@SBAT z?`P+^`wf^nR7+eVN>UO_QmvAUQh^kMk%5t+u7Rnpk!6U1p_QS5m9eF^fq|8Qfp%Hw e6BG@(`6-!cmAExTX}<-fYX(nOKbLh*2~7a2JVG!4 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/mithril.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/mithril.png new file mode 100644 index 0000000000000000000000000000000000000000..71b631127b9d60c650cc1c9bfc0ef2705a7b4004 GIT binary patch literal 602 zcmV-g0;TP)t-sF#rJC zgwU^>*DO}ugK~zY`y;WheqaY0QUhOH6kOc6_|No`8RQkSI zUhT{=<4`4THfA@SroQNIJ{G3w>MHfI;->)oDZtldfN%g@{|5C_fL=nq3=oO<%hCGw zi+@A#IkIz!G_e#_&1%bSaT+y*F(4hxrSDFUz4Vf7O#KK9YIv1a?m)ip%dgtUt0=hE zJWU*eYnZ+R%Md_`=Kj;lla-|>lXST&)DZS?T^Hbyi%$P>?TLnTlazC%D(i3-%ymC^ zYt3UHthJsilb2;4wp?u7mAqx;hkRHd&JrJ;kYtOJmL!2?tB~y}fQO)|DOhT=1N+L0 zqZ(0RW}M-Caj!-n^h1#G9l-*3SeG6zHlg6_5v1S~t1FSFG29LC+7qIb9G5q{R*tXYKzHV(n-Ho-If2hWw o`L~m2b*2deJw|Vvygfqx0WXm+058Hf(EtDd07*qoM6N<$f+kKd2LJ#7 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/nickel.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/nickel.png new file mode 100644 index 0000000000000000000000000000000000000000..58e1d4eab33950504399ed3d6eb57dacecfa2af7 GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*fqC&ZPDoAcu9Gp8OO zz4r0q`Io0Izdd*J%au!S&i?=Z|Hc0&PyauB{{Qi(|Ly>hzQU_aFVc`}qI8*Z-g2{dwcui<4)cojCpE*p1JZuYbC9^}~fL@6Mljdi=!0 z!}ovRdh`F~tN+hVK00#e$MsuZufF~N>h`y5AO636_y6^gJNrNWf7kcufE3VGj3q&S z!3+-1Zlr-YN#5=*9BuceRslKeC7!;n>`z%`8F}OnY~;vgU|{0%ba4#vIKDUJblGhM zfz(6U4N5KyH-j!JEZ;We%g6uwue;t|y6BkY^3Ah&zsEeYli1B~Q>ZwV?b{0t7n5rz z{TXUL-Yfeh%%FF}&d#1^Letr$(sKJ9%Z<*>ysX~$BKO?E`SNTN7=Bf@ygbamf0@dv zD~~Oh&+gJxT6JXlX`@L?rt~o~eoWb$-%!?}pQ_^W{;c^@f%YV0`(=ICSD#iDTpp8f zso~(9LkbL=&pPjyIX(S+n18R@u?1v09 zz;waF{l65_Cv^Br#V&rZ!{v-ze5uoKw-+i4b6d*pKQd}xX86s*Wk&PLmT+OO7}qnt z&kmey5x3gA?sruE_o5>LIooFS1ll~2>6SGO%)Py4md|C5s{h=pbv@f3%$05V61cyz z-t^hrkX5I$pKe!IJU@HF^wV<9u?@WS8i(?Jb^cW`Jk&1flbA7m&e9h~;o;84o?E5r zzv^kPQ?38~bo1H6`Cye9Gv>`TB~*F z%oYE#Kl>;zue|2#b#VK)hg?5-RZeOin}2@2Auyq+mbgZgq$HN4S|t~y0x1R~10zFS z15;fi%Mb%YD?nC}Q!>*kachXuej5SQz~JfX=d#Wzp$P!5 CNXDlC literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/obsidian.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..73e3051a941c866996529751a7e0e7522e8a619a GIT binary patch literal 1888 zcmV-m2cP(fP) z3L&CU7^N|$f!2yIVd?WWlx0~(K7{%gt2_{ec6<8EXFypN92~qt5EP2>c#Lxntqmfd ze-c!k&YW0l&vJg6CV1}=fe=Dn3a2QF0%HtHf%hI`ERCcIqAscT+( z#73hb-R=rXYYq<&F1{7MGJTaI_e{61kQd|2A6|@MV`H5pNwC&kJOGEs2gDG0b9zJ> z%1Z|zNfL&`5k~9xO7f*ufqQqq5~UR}Mq&)a7|~j@ySx3~*>@Hmh&2{tEC{q(ZN`&~ z@gxI;o!w{e?Z18dt{77dT$9O|G;L6pC0c8YHAoZ?1p?Msv@uv~NfO8Duqv@JMt1-0 z-2XZUoVW5K=i6@=X|-B}5D*c%-4(81pOb%0T(h&Y7;8w=l$DiLoO9%PP6&Z+cZHib z??|UJCpT`)%l!OpSy}1geTh=Aw)P#}?lLZM#2ESJn?)8Em+R3S9zR~=(aK|n!&8oq z4_RJbW@%}W5dFs|!E-636un;W-GQ}HvbOd|u3ft>H*YOSx7#I3q$mrraYlc$hagyM z&uF~5y2|zIH<+87XLWUz?d=^zgrdj+q1Wr<>ir7EV6cVO8kaZ(q1W3WNfVrN2$79m z52e(n0RRMJ3>9Uo|JT>o>2$8M`e>D2uSZ#Wy!R+7xrkJDtI`@247RqaK`I8GKK+SN zHY80`VicY}T?e2jN{VCA34n^X- zb~YPQ7CFWkwAQrREkcNusbbQ~W7L+@(^KA@9{>G9C18xB@;HQ}$Osz3*Yq8Mj+~D-h35!dM3I_;LeDF*rIU#tGBqdE7AMC|nzT8vB z7qGv7u literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/pewter.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/pewter.png new file mode 100644 index 0000000000000000000000000000000000000000..619e4b713e76ddde609fc9687a58880e1b283495 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*WnC&U#<&z`@0%8UgI zmaLgMcj?@PE0-)^H)p|$(`PSk*t~1q#vSW7?cA~Jz{V}RSFGN&YVDTQ>$XmqGH=$r zWotKVU$cJOrmcHs%vmyh_Ts5C7cN}7cK+hk^A@d|HfzzOsq-N3dckb_@F$i zyAo?kKYrFZw>>hb>#>LfW1hUbv|Z%QJ_Fx5NpJjDGhH~f<@)p5#Gdz#XY1$eJ*;`x z?$E|y(XU&$^R~z@-}<#|R`b>^$?1=_-StzI{}wYV+_b##^& zb=S!1|5~WRutm~1X-3CI!94B>?_Fd&4+!RRUo8CE$WgIKTt)6wj_t&hUCB$gXm1Sn za@LfMzQfJG#Avd}3z^+PeRod1>*CSRG5s_f>)oIW7+w6=Yx60eIFgQoVV}2eY^W}aKXPS+oTT(OOMtmu&KR?OkTKlG61=S-GPGaA$^Jp$*n{T?=zrSeh znLC<`3ZnCb>jS=q{@>c25WD7E-{I=?!#|2z|1hrkqT(eWSO!eo45}rr5hW>!C8<`) zMX5lF!N|bKP}jgz*T^!&z|hLjz{=QC+rYrez(Bh!^a+ZF-29Zxv`X9>qO{*e05vdp My85}Sb4q9e0An15zyJUM literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/platinum.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/platinum.png new file mode 100644 index 0000000000000000000000000000000000000000..ab3c693bf6890a57508cd9949b0c5be4e3780f02 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*WnC&U#FC9?SMJ?@ z|MT11?_a+C|8w!~_4Bu{pSgbN-mB-gpFh6&^wHUy*N$I0|KiL0@BjauxN`C7`!_%T z|Nry<|ADh7fY!}_;W!6KF_r}R1v5B2yO9RsBze2LFm$lWdH^|`1s;*b3=G`DAk4@x zYmNj^kiEpy*OmP#t1Kgr^80%wuYh_!db&7V@ZGW7UH4wA;^T0c zKIJomSJ1s%i(D*^$14hWdMBM<8GKG>?W)ks4N3yXxx1MssTk!y|8#Onf$T0R=erVX zN8%{~L)IZ1E)S2JBWwdMNr+Qgpsj%VxV>^-b`*Y429 zV9~EzxbwEiFW>sLY*zEuEy?MRw%zqpmH!qqRc_ZKgJTjhVcs9IdJGre_H}fY7j@Uj z>i=4(!mvfsIB7=5MZrAo3GZEGI}Zrva$hX`+Q?C{NL)qkRF3V$lwHY7w`gw+_j1;h zjlRRpzr<*=$P1a>L49{lz3bx9&oTWpJMP`@k9_ww$9GtII`tYxh-vETuDIp?BJsyA zy@uodH-cB6m}A-bdFO+9#eE+gwVb!_y?wj;b8x}GD%+$F5A1iaFU|bx`}x(%1Jfnf z=sebXbXUdf$%@$88_DNpsz!V%t3N-<8^@uk&awWt(rh*}uPN?U_58 ziwdIigzE#ohW_8$oe;a`Ti@a8^us@jTK_Pv`J&<_AXo-W+zhHEt`Q|Ei6yC4$wjF^ ziowXh$WYh7RM*Hd#K6$X(7?*rQrp15%D_OoEc6MAhTQy=%(P0}8ltq{MgTQ1c)I$z JtaD0e0sy7Po+XrflN}QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz`!jG!i)^F=12eq*-JcqUD=Eaj?aro?Y$Ko|+0xS>y z{4&+&^7`;cYSk+%53m&@5< zp;y=4IP#p~$A;UY-5)I(%w|8zD*acde=hQHokrK$yq}c} zfdW0}svN)nW%wt;(ySx(wJLH#%Hou1DxTAPtkUPk38_9bWN2Ph75t{mGvK}Jj#o>U zaqYf4`=+mYS7@M*oWoDuKg%LmPpWMFeokY>S_Si?1?&+b*N+4-^ViR%swO2lWqr-Hg28rG@T=KLzJ%GA>)!q$K1^9 zoBsWOy6Xi0LNo7Y%3ia2E-}{}=zdj{GHczYuZ+eEHb?cpII`mM-_^SPTgr`W7kO`r zEb~5dUm?G0=d7dtzdg-fsyJpncbcu4ZTK6jHN;r`{}P(v}V<& zz);raRjGjG*xTz&8M8x6flS;DHJ6W^U@UKE@&DRAqq zZJrV-vty^dJDjt1m&BT`CuMn)-k5biIlH@?+4MuA_}B8yQ6h^|w$Ju0=ijMS_4uy+ z8DIUy7lKUWJP$6d{dlA1(c4{)TcUgQ&T79o>o4=6;ik%IHT^i=MMrZ4=Fa`A$K3vp z`QF({Sr>mgmtO5$75d>VPl=gpQJBcZgg~EXVg}xeeqMH+on$8II=Q=lcfX$dl=tDY zRW~Q)il5K>R`VfJ&`bIE{9k4>V|CowzpR~a9=TOobav?bqe;JojLi1`Noc?P(s$CG zH5DSf%hFEnum1C&b+6gc`z`|JvA~q5TH+c}l9E`GYL#4+3Zxi}42%qQ4NP^7EJF+o utqcvUj4ibd46F&U7&V literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/silver.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/silver.png new file mode 100644 index 0000000000000000000000000000000000000000..307a1afeb44314d589013cabcc9302f821be6321 GIT binary patch literal 807 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%0D%p_T#~6r_Zt>XzVm=pfpHr6K{Gn?tL5 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

c`ir|_cFB)gxn_$g( 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 z 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

%WN^`i>5>l&R0mzPN3vBH)VCQ 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 E0G?sL8UO$Q literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/tin.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/tin.png new file mode 100644 index 0000000000000000000000000000000000000000..b40b911a913e0fbc0f3d8145cb3bdeac7c8a1d96 GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@*fqC&X1oTJrUSOHXc| z`SA4m%X=5zKDzSd#jQ6FFaHOEuP^_9e)|8*i~m1A|Nr{x=iB@LzdZZ>{^6ew4l(o|Y?Wcq2NNlT{mF*1Hk*_+=`)}f!O;`08i`BH)QBxCz!eb-l?Rux;7$ew7G2^_q7>6 z6GIui-dy{#LtkQYsNnDZ&F2a{%JWv;wqLgFu-=Y`yXIdDI-SV3EaKbTmD8V=X;eNw zzUs=_NqIen%cPgDP%%6fG5e>JLsp*Wc3q+S*WDA?4zzAe3u*V`zH*vFLp$kehl0R# z!NUE&6w)Vj_)Enuez3#kj9h%F({HyIDhqR4%I-fhYF}pf&BA3y^U9WRVXqk1GrrFb zoNN)d+Pm&|RQ>m&BLX?wX7vQxJdx>^H4V(Yy=IorWsa)<+^cmx+aJu8ZTS+ozp~!+ z+1!v-r?Q`JS64hgd&2b7a?P;~y!9G~@_u#xRWUr&F6on)F@4U`7e?XX&c>cwrRu-x zX|GeQ|NV6H*~9yo6Hi(C@-(P=IeEE`?rT&KY3M7Y95<^e!U?up{SO)MwFx^mZVxG7o`Fz1|tI_LtO(? zT_ej714AoA11n=oZ36=<0|V`{&?hJwa`RI%(<*Umh|+!=0o1_Y>FVdQ&MBb@0H^rL AHvj+t literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/zinc.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid/zinc.png new file mode 100644 index 0000000000000000000000000000000000000000..ff32d1fbf61231ab65693ce92d41691bff240841 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH0VEjOzbQrlDVB6cUq=Rpjs4tz5?Mi#$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8W<`fJ z(@dYI>;Ee`7xdw@Q^S*FHuvCCMQt;+d0R&6(PW69mK|0-+f@fZ7x!k*r;m>YcE zux0h(mYBqE3ohj!5}P9Z*=+9V<4b>9KFaBtWO#3KK8!X zgHI+~g|`|l>^~;)IQft*yUDQ`9+^%Dd@lZ+QSNj6S41kq+@4Nbanby%{@fV~p`TVI zgf4gey5m=aWYeqF;hh?jnzZ=$Rxi(Wo!W3qDa(3WMM7uXci&3(Nq#F9d*2P;UCg7y zxqHvUxBKMYKd5bSb(J#j-}_wUOm%Lz`;r-&#~(an{qs@yTG(81$xAodHvTT{x%j&| zB+bj^<*zK~lV&k`?mTjT*uVEgJ(J&c*0KDDQFEk4+>B=3IiFs5NPN0=T;h=B&k5JQ zAMCBH(}+H^=lQ*2xt#yA7H$oDxH;|GCynbGN=xo;zVbBcNpn`gkM*%EpC?T?aa5XN~C70Z1TD5VFtR}>XIVtfzZ|DTcHv_pswKrG!!ChV}YWWR5&rBZR?#EBCp zPMkP#;>3v)Cr+G{US_Snthz(F?FaHO2&HrcEIPjYY`^<_N5Gvwmd|9R%DQv} zkp2K)_eMfCoIT*N*OaitgVAHdiEq&!ff4QTe`Mn_)5sVZa?o&bP+B+Em@vk1qkfTi{!gnfDgwGUZj z1^uG%1OS*C2V|P3IHVlgM4yHS8G+Z(JxDtX0vLBhlc)j+Wlf|<*A1}};axxmn9cs6 zS}Q&QfFhb-)3wfin+gCV;@yj?jz<*RO2noBWkaSgB_OAN>FK9s4?5Y~`1)6#u9+^B z7yZQ=FZba6!SC2TPSRuS4ZsDt7*XX?*6{%|tkw?~<#Jqh*%=(p+0)tH4cMkOQOFvy z3m?9xtXSLmzh|r|7vdpBb^ypS0ub3GNwmM9^c5q3Ju-+AgYb-ySpBX4aHbGbhA08X zdWI1~M%aG}n=)jLy(`}1g=Q0^SP!ys%x~Eg`u7A-LKZo|*h31NvH>*UclkpKf1=BG n)O^-+5+x0P>|O4EivJ?NJ+{Z;E!RL|00000NkvXXu0mjfq(KcI literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/antimony.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/antimony.png new file mode 100644 index 0000000000000000000000000000000000000000..a8597ace7361d6b8ad13b5878c4dbfaa710601bf GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH0VEjOzbQrlDVB6cUq=Rpjs4tz5?Mi#$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8W<`H&E!mr;B5V z$MLt959S?K;Awcc?|NZsI<};oy)X8To^!)Pv;mHS5!j2z~MV)!9eo%?gwdwJjnwxhF9&}Y*atoQwtXC(o zVUb7BvdrW;p@|X~_6klhlFro3?mf(~p(5bpf$pCZYh^q_ldsflE>h9{X~p-ZzeRO+ zf2nDJnY-O>|JRJ~-o2K4b}~4s=+N`>m22Vmb-qd^Y}c#buln)p zaMaB}@w96ko9?dLyMb%}KG{2;a-&`szR?ZJ)eI9on_4Gnux4UNZO&E6Jnm1gHeOp^ z|5UuEWVhiTZPTs5pinJwjVMV;EJ?LWE=mPb3`Pb#~9k|k?K z3Z+mwh-+XT`mYj^141yqXu55;n zh$$lIZ4eXr)AXWl5s61pJ*f!NRxG<3Ch>POobBU@AQ?sol6@FK{uGt67Z42ODI-VKbytKv5o?^w9zqY*Ge{ z3g9$BNdZD^KvNk~x4{+-^avBJ_66CEXuUt|v_K#7z(xmXM&N1!_IeO$kCu9XsTOS9 z2EKm%=*8(yr zs2~I#2t#jjV80W3f(9DV!8s3HJFEy+@N99~) zL|kWv_tCflZNVAr(+lj_Q3kgUS9!sS-)x`V!j2hb$K7RcuQT}r^vG-ExGv{}ZtId3 zT0{?>BcMhK*4Nkl?#73ScKSq;kC(5A|8FdD@?UP{IxhFwsLNb>Sn6ih=#Us<_+)a{kmDO@sQBf~)OetO zp}~qO1sq-!oP+Vw9| zHRfHLJ$p2zYQnFnu14ik3N_f|dtsWNur_NTCv(k>K0YBif^#p(shwU_T#gJ562}v> zJ0u4ty!FwCQ|I5cj^T3lrQeAbk^>UNs$N!HZvV_dEZWv51CP#nKDSy}sPA~@AMsrW zu?R*6=I?36&p)l(!HVrR%YKd9-FqpGl_wRgOk5IV9nZg>{7&t7^E6*dHK#Xrr3qh) zUC#&&h*-{H&TG^ejz8M^p92%}d1}o=6Z(?(7@A8#c6Opr2a<0&FGATPMye*)4 za$d7jy5YW1fUf?Ei)4LA0$h~h%dcV@Gs7Bse)=OVd*j(mik|S>QypQ-n%r%oz4QXq zFXhIbV{#@b)w+$#1!DeU?Xz8Mgpb1_kt?eLlNYvhrLwufkg}apYhq$+l!!Uo*CDqw zw|B?Tv6DV zf3flCsd#g>;{_l0k3dh9bjWU z5q@Eb|BZ2%gLP^`%UcK1mJT8H4Y}m=3LmBZ8Is}Hz;6@cTNg(kO)Ae!ej}G|S4ayS zO3UiWu*|L#UpLUkB_6Ntl+ZE1@M^v6bcQQtvL-OFnBQ1sM&(q5gWf2}Dl&Pv$Q$Qz!k)KS1{6*ShYNl6+6e(dwPQij|rNt=%T!{);mORxGp zMHQ=y@AluAfNF1C$X){o=Qz$)ESW_nx2F?bNI> zbpQEgodx6K+Q@6#DJy;uzv_{Ox7OqQeS24i_5)C6u`ZHf@-_#k2aqbJ=a* zG^fp9@4x14eo$m-ZEgK~^2W*4+zj$(q7RsyzZ~5#SLsi6h3Af294SRwtapESZrJ3Q zcKOKGnC)gfTUJSKVQ#tSktN5*rOk9b^(ISss1)0m7YUEig)D!Td2sl6$S+<({2s68p5F8=Z7U6q_?)1;@) z=P``Rv77MmUUs^7+=|Ngd$soc+YpxdAkyWEQ2zDV>lf*)&u2F;kG*Da-hI13)fUId z*t_v;lUA@^&8g1t{ME84jpyOZ_@As^F?=6gf_o>z z40R1mb&V`T3=FLd4XlhUwG9lc3=Fi(LZ6^$$jwj5OsmALAxisg1W*Hmr>mdKI;Vst E08T*$_5c6? literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/brass.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/brass.png new file mode 100644 index 0000000000000000000000000000000000000000..376c3c407c9c62936dc677f8adb8354fb838ba87 GIT binary patch literal 632 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 literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/invar.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/invar.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b9d7cfd355c6f375b23c32186f3072e77ae014 GIT binary patch literal 632 zcmV-;0*C#HP)p23SxG0xYdqvh2qijX;U(Vg^A^Z&iZJ2^h` zvMin>z!BgGa0EC490861M}Q;15#R`L1ULd50geE#-?=fP@Xm|}4`w!cGMOV_*e#l` z&y9(ebpsihBVaOoH1C^01U+*Ekp2LF4(|=waPS1Q>KCSMWze}b^Kofg|NSlauzf9M z5Vo$xrxO%J@TEV{CsI!UV3w1LS!uX$xwv#OcetU!kh{1@Z0*r_J~5CDo6 zH33KD(O+y6L>JrY*g}BKiq*6tXYfxw0i-n11~kzJFg5@w4}@p~n)lsi!EENf2xO$5 z0D!!$gCydB0z3j(Y9B&)Pj8_1A&ab_U!;+_i+PrU6&(co-por#2)RNh+QvrZP+%KKVcto(ZM05&B z+1N~BN5aNzG=q1rE8hStV6QvHf?2g_PeH59=NIB>&{L|iS6?n_cr%evVG#-RJX!^X=mP# zQe)W+x#hJFMzl>IO^CqJ7o1O#-^hSNxtNc+IGAhUxP^C9U!2?v+lsw{r7& zUuSP45JvM7_5Gi#w6(3ZNi>mY;stM8&f+d#7lcAVjF}&UJ2+Wp&dz+BWKW|}He|~T zfB`T72EYIq00UqE41fVJ00zJS7ytv1&DU$!?Dwucom}Uf8ytXoyY+=*z!)5W?tG2_ zSPu>W?N8y$!@fF(=sy5$YhdUt zz==OkCck{`5JZu&2{!|9UZzw38@dPkS}c6*Yo7Zxw+rKiz69a*d0bw?LLRr!m@K>l zkRXY1sw5Q@pJK*k851Qrl3na}@i`Sm_E4QjHA4Zi*5^}W|GWPh)LSBS#9sk0VgSDu zf0GXQ?*=+D6r?~>qiYlp-K3h68e?+z0Q8!q7%h;op=j+8jc4W+Ao1$o;#=ego)GT73z^J=B71|Q=1$3ba>VgBHEuk zJODzjTKVa5qKIe2%6&kLs||7=EK#9ebRGb~a-2vZtq;oMKJP1dU@V``l`+ts1pvn# zZ}KWZOq-{dM(-k1#JxZSWZ(G0;BEH-5XGCf?O!nRR3MPYXM3;8@yPTuMe-DoHX_9- z0nS|ib@`vs!`3bq%iQ^sH>K@#kzVRc7GC>s|L~sN$0TY@lXn0cv@u?_sjT?KEDmQM zHfnP=yMMR!ur9C8d2e|91NX1>0;Y!crhe*xi(&aSCSPbmNZ002ovPDHLk FV1hZxCYk^M literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/obsidian.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7eb44e3e03ec4570d1a863a42696c02f0d5de7 GIT binary patch literal 881 zcmV-%1CIQOP)}?e5Vzr|yM`iHV7ciHV7ciHV7ciHZLk=G%vN?|xDdq4I&M3M_v8#k^zz z4J~#S7rReaJb}wk@bZjD7hXaD4n$je)8P z%w`SSZHI_ORZ#_JJ*Xk2gfWJq1?L;?D9yaVh|q1i{qKOB)2{pk)q*jCh~T}$7=yI}MycwGQZkC7s{inR z>}dy-QV;=S$~Y{bs>B%CZnuCkn>C0C)(R;l#0my5X8%=iZ{8eZtwnVlsFaLq0l->I z&KYYR&O4m*)b$L50_I7uy^g@c!#yz$q!dYM%(#dJ#wb)(0ASs&>AH@uUmqx?V66dk z{~h3cg|!Y<@ZO<14mJ!uec$7p0}O|Uhm?}pY&N4H>yGuheF=MjAmXuBFlJ58i5MfQ z8Dn6xSrg+SF%Gormdg8`14ehefB&K>Bpx_V|B5@S|P?n+qUGKIsJIb^89=kr_9NR z4~P-Gt?;hq>gozG+j9`oYfhiNxMB0IE!*}iS-x)CtVPpjFP^`6^{Ta7<}O@0XTge@bC<4Jzir*d z9kb^zU%O%Z>UCS!Z`!$W%kEk8mTlU)XX?y_Q)VofGO>_%)r1c48n{Iv*t(u z1=&kHeO=j~vdS{@D8Ii~@(L*Q+tbA{#N+te%Z^2d6?hyjHV8^6a|>+RFnfz<^?&EG z+rDW|o4?+F&D;E-$kN){`uF6GldHKI3Zr-mhw<3wl6Onw!Z7EE|Gd;;BaW>6yuXq z?0!hFCk13*jpaVSal`Ij=Hux{UR}DrOKnwj^P5w9Qx>`ZuA5PNQb1k&$BG{(pjI+ZeAXH&EUNIc7dub zj*+o<8E#Z zzJGc5`}^Y$umAu5|M&m@mtQ_yesJgNqkE6uz5ev?_r2H8@4S3^{po|R|Nnmf|NqX* z$KU_|`||(y@BjaAJ$>}=|No2kZeF-^^UTewM=zf{arNT$$M;TMzkKf2b)fmP9ro%1 zDaMi@zhDN3XE)M7oFs2|7lsa2Sq~tGv%n*=n1O*?7=#%aX3dcR3bL1Y`ns||WtC;* zQJQhnr3NVU)zif>#N+te%cqMDEATj6{4mL26NBREyi3de{@?#*+w3zl(q8YrF3EQA zZCPn)=~wmV&NbW~4exXn7+SV7$QS+k{vjyitL4VkOHI2zt1r~+bGdWDBJ2J!6N6n> zQ)UP~N_bl;m60@MiT>$jTV{VWNnlrdSF7J-DfKI}AyjL2$h82wCo|ZMW_=fX@2g>BR=cjFS}6CZ?)s^l_{H-GoIjM;5lln z!Oy^8Z1sObm@KDD=-JIV-`Pt{FMhtgQ1{++QAWNmoQBmV8*hBS>=5|*?kq6=MJZ literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/quartz.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/quartz.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca0b4c014700e9e56d5b54b6af1106e8a0e899e GIT binary patch literal 583 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!2%>XrflN}QY`6?zK#qG8~eHcB(j1elRbib z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz`!jG!i)^F=12eq*-JcqUD=}%W5^?zL)q{OY6hzz} z*8M*|+sBtzmn$peK;-VfX&0BtFA!dBCMTw%bK>ElzdwKM*a-oao^G3u-e%e4Jo%ow z!R@!tzH|1ZP5x8WsNfN{*wf6T%5nK*o%Jg`Hfc^;qA_Vjgv;KuYH|7kxvS#BOe3$E zTwHMD%XRLOF0GSYz5?gETtZD_^aI|`%CYd46FHj_X!`goQ}d!1yss?9H$PaPRNs1F z$x64ySs$-xmQD8CSh2?`;rn@&n>tPLVXHsXsz&Bt{JHkBG>@Gt|NKcBFH$GpOqx{p zDXmGxORnnTg3r(Ilo)v}ayIthYj?gXviRUai6g~-1FmW>vWXB4EYo2`Eq=- z7ipamjs09|>VI(6&9`M|E1n%qxf0^KHAXn*p-o{}=-!V!tJaszRXw_Dy2)Gi`jhpC zxA1%9wTH_B16H-fHKHUXu_VKa*w7#La^8dw=yY8x0>85n4n gg+4*ikei>9nO2EgLzMR02%rWAPgg&ebxsLQ0Efofm;e9( literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/silver.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/silver.png new file mode 100644 index 0000000000000000000000000000000000000000..77255f7b6736aa1d5b210b979961007baa326e59 GIT binary patch literal 552 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 !BLu8;gUw8+#ITsTKdDQ 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/steel.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/steel.png new file mode 100644 index 0000000000000000000000000000000000000000..6701bd1210a84eeb83fbbe776b8eb7ee4a83165f GIT binary patch literal 599 zcmV-d0;v6oP)J1_OoIJKtp)LpF7V7*B@M?iBtO~3!7w0L+*$k;goddqcMzr1F( z-Z=uKKj7`zBFTmi5BOWVlfHMlsc|t$!_8H$|IU1w!PkbPTn1<7!|Ze1>u2SwKj;&c zCjgj>tD7{vz0Y9T)?uFx&eP=PF7;QJd5sMIqaWAVt~>!i05rdU%-}@cdinUA*HlAf z^OY6j>)X7Cf8_~~(xMHt=mX3KP09NBbN@+Gy-rAzC;UVK|tDWB=?L!b?+=-^B0z|Dv`b)EwqD0&a zWI)*7AJ!YyCjcnX+`RtEvp=Q+fFizsa+=2@Wk-p`6i_xY#gstKr?XoAjqIUE-Cp)R zsMYh@bWvXVOEg~RaR2Z>agKNCF>wcQKnD|5hl-95%;!dPdr*gS*w$pW-4|EqxHqsv zW1`3!*~Q0mWn~@v|J@T!xe^yC*#S^w1P}mwroT{qB?$0N1}QOw^OsfpqyN}bi76vW zz(mgoLS#gIQ^b^!HF2+4J-y^?LQ3?Y7{~rArqF*+fD($x0TUM~wz2^lcpzm6f6?_! l%_Go$r159-rSI`A@)zZny1rwZ>W2UT002ovPDHLkV1hC%Aou_P literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/tin.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/tin.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e8bfedccd98d1ccb20328f026d93f702b064d7 GIT binary patch literal 631 zcmV--0*L*IP)m+NdE6FnV zBm#&4B7g`W0*C-2fCwN0hyWsh2p|H803v|ozIkGgcU7Bquk2-TV@n5M)H*Y@NoK%U zIsmg?&1^PMXS{R(aDRk9buJ8V`1b(XmwR@1wQs}p)Lw^m#s4I`l=wm8SYgnwSF|R( zK2T>Z`GGu9dH{%de`uIJwj`E0W1shKkHR>$=l-?Ez+nB`sIGbG0U$yEo;nhzBpAjv z>1wQbNQlf?i&uP%o7%(r(gVPyW$_>y>q~H$BarZ*V{Jt9ynAyP*0$AwQF;IpGwl}^ zM-<}eh$Z#~C_E=O5c_iv$&@cj4*Cs`h(TKp+;cRn}D=>C8Puyb2IDcnVbl zIJYMo`gQN2cWMV(TR+{@nCe1!kzYLVat`hvyvNV6h#Zsn9e@LJFs#a zU0#L$JODz-Er*!mA{FL@4WbnSK_nhBFRQ8kBjy3fexR{lH&I=@vW0w$d;&QuJoz@O Re|`V}002ovPDHLkV1np96psJ^ literal 0 HcmV?d00001 diff --git a/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/zinc.png b/src/generated/resources/assets/basemetals/textures/entity/equipment/humanoid_leggings/zinc.png new file mode 100644 index 0000000000000000000000000000000000000000..8d15f145d1b39ab8ae294d6a99e47447a1294650 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH0VEjOzbQrlDVB6cUq=Rpjs4tz5?Mi#$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8W<`w1Zwdw!6^99;YKYarP{)&1( zbsMU9^BGSU>f|#PdVYET@Z4Kd8j$+VuEM&CNRo54x%@xrNMT)~l1) zu*f55S!VK_&_sy~dj+Q$NoQ(i_a0{0P!aI)K=;pywK5)|$yaJN7pZ9fwBmcy-=aFZ zztl9q%-!y`|7*r~?_SG2I~g2Rbm)0`@`cvbFw&_-2P^gx;MwFx^mZVxG7o`Fz1|tI_LtO(?T_ej714AoA11n=oZ36=< j0|V`{&?hJwa`RI%(<*Umh|+!wifjf?S3j3^P6= READY_TICKS) { + if (joinedTicks >= READY_TICKS + && minecraft.getSingleplayerServer().getTickCount() >= READY_TICKS) { if (!projectileSyncChecked) { throw new IllegalStateException( "BASEMETALS_INTEGRATED_SMOKE FAIL: projectile sync was never verified"); @@ -155,7 +170,7 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { BaseMetals.LOGGER.info( "BASEMETALS_INTEGRATED_SMOKE PASS world={} dimension={} client_ticks={} server_ticks={}", System.getProperty(WORLD_PROPERTY, "basemetals-integrated-smoke"), - minecraft.level.dimension().location(), elapsedTicks, + minecraft.level.dimension().identifier(), elapsedTicks, minecraft.getSingleplayerServer().getTickCount()); minecraft.stop(); return; @@ -169,6 +184,28 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { } } + private static java.util.List quads( + net.minecraft.client.renderer.block.model.BlockStateModel model, net.minecraft.core.Direction face) { + var result = new java.util.ArrayList(); + for (var part : model.collectParts(net.minecraft.util.RandomSource.create(0))) { + result.addAll(part.getQuads(face)); + } + + return result; + } + + private static int[] vertices(net.minecraft.client.renderer.block.model.BakedQuad quad) { + int[] result = new int[32]; + for (int vertex = 0; vertex < 4; vertex++) { + var position = quad.position(vertex); + result[vertex * 8] = Float.floatToRawIntBits(position.x()); + result[vertex * 8 + 1] = Float.floatToRawIntBits(position.y()); + result[vertex * 8 + 2] = Float.floatToRawIntBits(position.z()); + } + + return result; + } + private static void verifyOreOverlayModels(Minecraft minecraft) { int ores = 0; for (var entry : ModContent.blocksById().entrySet()) { @@ -176,10 +213,10 @@ private static void verifyOreOverlayModels(Minecraft minecraft) { var state = entry.getValue().get().defaultBlockState(); var model = minecraft.getBlockRenderer().getBlockModel(state); for (var face : net.minecraft.core.Direction.values()) { - var quads = model.getQuads(state, face, net.minecraft.util.RandomSource.create(0)); + var quads = quads(model, face); if (quads.size() != 2) throw new IllegalStateException("Ore model lost a layer: " + entry.getKey()); boolean offset = quads.stream().anyMatch(quad -> { - int[] vertices = quad.getVertices(); + int[] vertices = vertices(quad); for (int index = 0; index < vertices.length; index += 8) { for (int axis = 0; axis < 3; axis++) { float coordinate = Float.intBitsToFloat(vertices[index + axis]); @@ -192,7 +229,7 @@ private static void verifyOreOverlayModels(Minecraft minecraft) { } var layers = model.getRenderTypes(state, net.minecraft.util.RandomSource.create(0), net.minecraftforge.client.model.data.ModelData.EMPTY); - if (!layers.contains(RenderType.cutout()) || layers.contains(RenderType.solid())) { + if (!layers.contains(ChunkSectionLayer.CUTOUT) || layers.contains(ChunkSectionLayer.SOLID)) { throw new IllegalStateException("Ore overlay is not cutout: " + entry.getKey()); } ores++; @@ -201,7 +238,7 @@ private static void verifyOreOverlayModels(Minecraft minecraft) { if (Boolean.getBoolean("basemetals.hostTextureProbe")) { try { var host = minecraft.getResourceManager().getResource( - net.minecraft.resources.ResourceLocation.parse("minecraft:textures/block/stone.png")); + net.minecraft.resources.Identifier.parse("minecraft:textures/block/stone.png")); if (!host.orElseThrow().sourcePackId().contains("basemetals-host-test")) { throw new IllegalStateException("The ore host texture did not come from the replacement pack"); } @@ -224,24 +261,24 @@ private static void verifyBarsModels(Minecraft minecraft) { } var model = minecraft.getBlockRenderer().getBlockModel(state); - var quads = new java.util.ArrayList<>(model.getQuads(state, null, net.minecraft.util.RandomSource.create(0))); + var quads = new java.util.ArrayList<>(quads(model, null)); for (var face : net.minecraft.core.Direction.values()) { - quads.addAll(model.getQuads(state, face, net.minecraft.util.RandomSource.create(0))); + quads.addAll(quads(model, face)); } for (int first = 0; first < quads.size(); first++) { for (int second = first + 1; second < quads.size(); second++) { var a = quads.get(first); var b = quads.get(second); - if (a.getDirection() != b.getDirection()) continue; + if (a.direction() != b.direction()) continue; - int axis = switch (a.getDirection().getAxis()) { + int axis = switch (a.direction().getAxis()) { case X -> 0; case Y -> 1; case Z -> 2; }; - float[][] aBounds = quadBounds(a.getVertices()); - float[][] bBounds = quadBounds(b.getVertices()); + float[][] aBounds = quadBounds(vertices(a)); + float[][] bBounds = quadBounds(vertices(b)); if (Math.abs(aBounds[0][axis] - bBounds[0][axis]) > 0.01F / 16) continue; boolean overlaps = true; @@ -287,21 +324,21 @@ private static void verifyBlockRenderLayers(Minecraft minecraft) { int trapdoors = 0; for (var reference : ModContent.blocksById().values()) { Block block = reference.get(); - RenderType expected = null; + ChunkSectionLayer expected = null; if (block instanceof IronBarsBlock) { - expected = RenderType.cutoutMipped(); + expected = ChunkSectionLayer.CUTOUT; bars++; } else if (block instanceof DoorBlock) { - expected = RenderType.cutout(); + expected = ChunkSectionLayer.CUTOUT; doors++; } else if (block instanceof TrapDoorBlock) { - expected = RenderType.cutout(); + expected = ChunkSectionLayer.CUTOUT; trapdoors++; } var state = block.defaultBlockState(); var layers = minecraft.getBlockRenderer().getBlockModel(state).getRenderTypes(state, net.minecraft.util.RandomSource.create(0), net.minecraftforge.client.model.data.ModelData.EMPTY); - if (expected != null && (!layers.contains(expected) || layers.contains(RenderType.solid()))) { + if (expected != null && (!layers.contains(expected) || layers.contains(ChunkSectionLayer.SOLID))) { throw new IllegalStateException("BASEMETALS_INTEGRATED_SMOKE FAIL: wrong render layer for " + net.minecraftforge.registries.ForgeRegistries.BLOCKS.getKey(block)); } @@ -344,6 +381,7 @@ private static void verifyCreativeBuckets(Minecraft minecraft) { } }); BaseMetals.LOGGER.info("BASEMETALS_CREATIVE_INVENTORY PASS visible={} hidden_fluid_blocks=36", shown.size()); + verifyItemModels(minecraft); java.util.List bucketSearch = minecraft.getConnection().searchTrees() .creativeNameSearch().search("bucket"); for (var fluid : ModContent.fluids().entrySet()) { @@ -358,17 +396,65 @@ private static void verifyCreativeBuckets(Minecraft minecraft) { + " direct_search=" + searchTab.size() + " indexed_bucket_results=" + bucketSearch.size()); } - var model = minecraft.getItemRenderer().getModel(bucketStack, null, null, 0); - if (model.getQuads(null, null, net.minecraft.util.RandomSource.create(0)).isEmpty()) { + var model = new net.minecraft.client.renderer.item.ItemStackRenderState(); + minecraft.getItemModelResolver().updateForTopItem(model, bucketStack, + net.minecraft.world.item.ItemDisplayContext.GUI, minecraft.level, null, 0); + if (model.isEmpty() || model.getModelBoundingBox().getSize() == 0) { throw new IllegalStateException( "BASEMETALS_INTEGRATED_SMOKE FAIL: invisible bucket model " + fluid.getKey()); } + + var quads = itemQuads(model); + var still = net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions + .of(fluid.getValue().source().get()).getStillTexture(); + if (quads.stream().noneMatch(quad -> quad.tintIndex() == 1 + && quad.sprite().contents().name().equals(still))) { + throw new IllegalStateException("Bucket has no tinted fluid layer: " + fluid.getKey()); + } } BaseMetals.LOGGER.info( "BASEMETALS_INTEGRATED_SMOKE creative buckets PASS count={}", ModContent.fluids().size()); } + private static void verifyItemModels(Minecraft minecraft) { + for (var entry : ModContent.itemsById().entrySet()) { + var state = new net.minecraft.client.renderer.item.ItemStackRenderState(); + minecraft.getItemModelResolver().updateForTopItem(state, + entry.getValue().get().getDefaultInstance(), + net.minecraft.world.item.ItemDisplayContext.GUI, minecraft.level, null, 0); + var quads = itemQuads(state); + + if (state.isEmpty() || quads.isEmpty() || quads.stream().anyMatch(quad -> + quad.sprite().contents().name().getPath().equals("missingno"))) { + throw new IllegalStateException("Missing item model or texture: " + entry.getKey()); + } + } + + BaseMetals.LOGGER.info("BASEMETALS_ITEM_MODELS PASS items={}", ModContent.itemsById().size()); + } + + private static java.util.List itemQuads( + net.minecraft.client.renderer.item.ItemStackRenderState state) { + try { + var layersField = state.getClass().getDeclaredField("layers"); + var countField = state.getClass().getDeclaredField("activeLayerCount"); + layersField.setAccessible(true); + countField.setAccessible(true); + var layers = (net.minecraft.client.renderer.item.ItemStackRenderState.LayerRenderState[]) + layersField.get(state); + var result = new java.util.ArrayList(); + + for (int index = 0; index < countField.getInt(state); index++) { + result.addAll(layers[index].prepareQuadList()); + } + + return result; + } catch (ReflectiveOperationException exception) { + throw new IllegalStateException("Could not inspect the native item render state", exception); + } + } + private static void verifyProjectileRenderers(Minecraft minecraft) { for (var type : java.util.List.of(ModEntities.CUSTOM_ARROW.get(), ModEntities.CUSTOM_BOLT.get())) { MaterialProjectile projectile = new MaterialProjectile(type, minecraft.level); diff --git a/src/main/java/zone/moddev/mc/basemetals/BaseMetals.java b/src/main/java/zone/moddev/mc/basemetals/BaseMetals.java index 3fd05162b..7e6d8d3f4 100644 --- a/src/main/java/zone/moddev/mc/basemetals/BaseMetals.java +++ b/src/main/java/zone/moddev/mc/basemetals/BaseMetals.java @@ -9,8 +9,8 @@ import zone.moddev.mc.basemetals.entity.ModEntities; import zone.moddev.mc.basemetals.loot.ModLoot; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; @@ -23,12 +23,13 @@ public final class BaseMetals { public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public BaseMetals(FMLJavaModLoadingContext context) { - IEventBus modBus = context.getModEventBus(); + BusGroup modBus = context.getModBusGroup(); ModContent.register(modBus); ModTabs.register(modBus); zone.moddev.mc.basemetals.recipe.ContentRecipeCondition.SERIALIZERS.register(modBus); - modBus.addListener(BaseMetalsConfig::onConfigLoading); - modBus.addListener((net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent event) -> { + net.minecraftforge.fml.event.config.ModConfigEvent.Loading.getBus(modBus) + .addListener(BaseMetalsConfig::onConfigLoading); + FMLCommonSetupEvent.getBus(modBus).addListener(event -> { event.enqueueWork(() -> { zone.moddev.mc.basemetals.network.ContentModeNetwork.register(); }); @@ -38,6 +39,9 @@ public BaseMetals(FMLJavaModLoadingContext context) { ModEntities.register(modBus); ModLoot.register(modBus); context.registerConfig(ModConfig.Type.COMMON, BaseMetalsConfig.SPEC); - MinecraftForge.EVENT_BUS.register(new BaseMetalsEvents()); + if (net.minecraftforge.fml.loading.FMLEnvironment.dist == net.minecraftforge.api.distmarker.Dist.CLIENT) { + zone.moddev.mc.basemetals.client.ClientSetup.register(context); + } + BaseMetalsEvents.register(); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java index 1d547ead0..9f739e64f 100644 --- a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java +++ b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsAdvancements.java @@ -8,12 +8,12 @@ import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementProgress; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorItem; +import zone.moddev.mc.basemetals.content.MaterialItems.Armor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -27,7 +27,7 @@ final class BaseMetalsAdvancements { private static final String CRITERION = "event"; private static final TagKey STORAGE_BLOCKS = BlockTags.create( - ResourceLocation.fromNamespaceAndPath("forge", "storage_blocks")); + Identifier.fromNamespaceAndPath("forge", "storage_blocks")); private static final Map ALLOY_ADVANCEMENTS = Map.ofEntries( Map.entry("aquarium", "aquarium_maker"), Map.entry("brass", "brass_maker"), @@ -43,7 +43,7 @@ private BaseMetalsAdvancements() {} static void onCrafted(ServerPlayer player, ItemStack result) { if (result.getItem() instanceof CrackhammerItem) award(player, "geologist"); - ResourceLocation id = ForgeRegistries.ITEMS.getKey(result.getItem()); + Identifier id = ForgeRegistries.ITEMS.getKey(result.getItem()); if (id != null && id.getNamespace().equals(BaseMetals.MOD_ID) && (id.getPath().endsWith("_blend") || id.getPath().endsWith("_smallblend"))) { award(player, "metallurgy"); @@ -56,7 +56,7 @@ static void onSmelted(ServerPlayer player, ItemStack result) { return; } - ResourceLocation id = ForgeRegistries.ITEMS.getKey(result.getItem()); + Identifier id = ForgeRegistries.ITEMS.getKey(result.getItem()); if (id == null || !id.getNamespace().equals(BaseMetals.MOD_ID) || !id.getPath().endsWith("_ingot")) { return; @@ -68,7 +68,7 @@ static void onSmelted(ServerPlayer player, ItemStack result) { } static void onPlaced(ServerPlayer player, BlockState state) { - ResourceLocation id = ForgeRegistries.BLOCKS.getKey(state.getBlock()); + Identifier id = ForgeRegistries.BLOCKS.getKey(state.getBlock()); if (id != null && (id.getNamespace().equals(BaseMetals.MOD_ID) || state.is(net.minecraft.world.level.block.Blocks.COPPER_BLOCK)) && state.is(STORAGE_BLOCKS)) { award(player, "blocktastic"); @@ -97,7 +97,7 @@ private static boolean fullArmor(ServerPlayer player, String material) { for (EquipmentSlot slot : new EquipmentSlot[] { EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}) { ItemStack stack = player.getItemBySlot(slot); - if (!(stack.getItem() instanceof ArmorItem) || !material(stack, material)) return false; + if (!(stack.getItem() instanceof Armor) || !material(stack, material)) return false; } return true; } @@ -113,8 +113,8 @@ private static boolean material(ItemStack stack, String expected) { } static boolean award(ServerPlayer player, String id) { - AdvancementHolder advancement = player.getServer().getAdvancements().get( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, id)); + AdvancementHolder advancement = player.level().getServer().getAdvancements().get( + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, id)); if (advancement == null) return false; AdvancementProgress progress = player.getAdvancements().getOrStartProgress(advancement); if (progress.isDone()) return false; diff --git a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsEvents.java b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsEvents.java index 759616689..b781a137f 100644 --- a/src/main/java/zone/moddev/mc/basemetals/BaseMetalsEvents.java +++ b/src/main/java/zone/moddev/mc/basemetals/BaseMetalsEvents.java @@ -24,23 +24,22 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ArmorItem; +import zone.moddev.mc.basemetals.content.MaterialItems.Armor; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TieredItem; + import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.AnvilUpdateEvent; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.ItemTags; import zone.moddev.mc.basemetals.content.ModContent; import zone.moddev.mc.basemetals.material.MaterialDefinition; import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.Priority; import net.minecraftforge.event.village.VillagerTradesEvent; import zone.moddev.mc.basemetals.trade.BaseMetalsTrades; import zone.moddev.mc.basemetals.migration.Legacy112WorldMigrator; @@ -49,24 +48,36 @@ /** Forge event handlers for Base Metals. */ public final class BaseMetalsEvents { - @SubscribeEvent + public static void register() { + BaseMetalsEvents handlers = new BaseMetalsEvents(); + PlayerEvent.PlayerLoggedInEvent.BUS.addListener(handlers::onPlayerLogin); + ServerAboutToStartEvent.BUS.addListener(handlers::onServerAboutToStart); + BlockEvent.BreakEvent.BUS.addListener(Priority.LOWEST, handlers::onBreak); + TickEvent.PlayerTickEvent.Post.BUS.addListener(handlers::onPlayerTick); + LivingHurtEvent.BUS.addListener(handlers::onLivingHurt); + AnvilUpdateEvent.BUS.addListener(handlers::onShieldUpgrade); + PlayerEvent.ItemCraftedEvent.BUS.addListener(handlers::onItemCrafted); + PlayerEvent.ItemSmeltedEvent.BUS.addListener(handlers::onItemSmelted); + BlockEvent.EntityPlaceEvent.BUS.addListener(handlers::onBlockPlaced); + VillagerTradesEvent.BUS.addListener(handlers::onVillagerTrades); + } + public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if (!(event.getEntity() instanceof ServerPlayer player)) return; var recipes = new ArrayList>(); - for (var recipe : player.server.getRecipeManager().getRecipes()) { - if (!recipe.id().getNamespace().equals(BaseMetals.MOD_ID) || recipe.value().isSpecial()) continue; + for (var recipe : player.level().getServer().getRecipeManager().getRecipes()) { + if (!recipe.id().identifier().getNamespace().equals(BaseMetals.MOD_ID) || recipe.value().isSpecial()) continue; - var unlock = player.server.getAdvancements().get(ResourceLocation.fromNamespaceAndPath( - BaseMetals.MOD_ID, "recipes/" + recipe.id().getPath())); + var unlock = player.level().getServer().getAdvancements().get(Identifier.fromNamespaceAndPath( + BaseMetals.MOD_ID, "recipes/" + recipe.id().identifier().getPath())); if (unlock != null && player.getAdvancements().getOrStartProgress(unlock).isDone()) recipes.add(recipe); } player.awardRecipes(recipes); } - @SubscribeEvent public void onServerAboutToStart(ServerAboutToStartEvent event) { try { java.nio.file.Path worldRoot = event.getServer().getWorldPath(LevelResource.ROOT); @@ -78,18 +89,18 @@ public void onServerAboutToStart(ServerAboutToStartEvent event) { } } - @SubscribeEvent(priority = EventPriority.LOWEST) public void onBreak(BlockEvent.BreakEvent event) { + if (event.getResult().isDenied()) return; if (!(event.getLevel() instanceof ServerLevel level) || !(event.getPlayer() instanceof ServerPlayer player)) { return; } ItemStack held = player.getMainHandItem(); if (held.getItem() instanceof CrackhammerItem && !player.isCreative() && event.getState().canHarvestBlock(level, event.getPos(), player)) { - Optional> recipe = level.getRecipeManager().getRecipeFor(CrushingRecipe.TYPE.get(), + Optional> recipe = level.getServer().getRecipeManager().getRecipeFor(CrushingRecipe.TYPE.get(), new SingleRecipeInput(new ItemStack(event.getState().getBlock())), level); if (recipe.isPresent()) { - event.setCanceled(true); + event.setResult(net.minecraftforge.common.util.Result.DENY); event.getState().getBlock().playerWillDestroy(level, event.getPos(), event.getState(), player); boolean removed = event.getState().onDestroyedByPlayer(level, event.getPos(), player, true, level.getFluidState(event.getPos())); @@ -108,10 +119,9 @@ public void onBreak(BlockEvent.BreakEvent event) { } } - @SubscribeEvent - public void onPlayerTick(TickEvent.PlayerTickEvent event) { - Player player = event.player; - if (event.phase != TickEvent.Phase.END || player.level().isClientSide) return; + public void onPlayerTick(TickEvent.PlayerTickEvent.Post event) { + Player player = event.player(); + if (player.level().isClientSide()) return; if (BaseMetalsConfig.STARSTEEL_REGENERATION.get() && player.tickCount % 200 == 0) { repairStarsteel(player.getMainHandItem()); repairStarsteel(player.getOffhandItem()); @@ -127,7 +137,7 @@ public void onPlayerTick(TickEvent.PlayerTickEvent event) { private static void repairStarsteel(ItemStack stack) { if (stack.getItem() instanceof MaterialBacked backed - && !(stack.getItem() instanceof ArmorItem) + && !(stack.getItem() instanceof Armor) && backed.baseMetalsMaterial().name().equals("starsteel") && stack.isDamaged()) { stack.setDamageValue(stack.getDamageValue() - 1); } @@ -138,7 +148,7 @@ private static Map armorMaterials(Player player) { for (EquipmentSlot slot : new EquipmentSlot[] { EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}) { ItemStack stack = player.getItemBySlot(slot); - if (stack.getItem() instanceof ArmorItem && stack.getItem() instanceof MaterialBacked backed) { + if (stack.getItem() instanceof Armor && stack.getItem() instanceof MaterialBacked backed) { result.put(slot, backed.baseMetalsMaterial().name()); } } @@ -151,14 +161,14 @@ private static int count(Map armor, String material) { private static void applyArmorEffects(Player player, Map armor) { int adamantine = count(armor, "adamantine"); - if (adamantine >= 2) add(player, MobEffects.DAMAGE_RESISTANCE, adamantine == 4 ? 1 : 0); + if (adamantine >= 2) add(player, MobEffects.RESISTANCE, adamantine == 4 ? 1 : 0); int lead = count(armor, "lead"); - if (lead >= 2) add(player, MobEffects.MOVEMENT_SLOWDOWN, lead == 4 ? 1 : 0); + if (lead >= 2) add(player, MobEffects.SLOWNESS, lead == 4 ? 1 : 0); if (count(armor, "coldiron") == 4) add(player, MobEffects.FIRE_RESISTANCE, 0); if (count(armor, "aquarium") == 4 && player.isUnderWater()) { add(player, MobEffects.WATER_BREATHING, 0); - add(player, MobEffects.DAMAGE_RESISTANCE, 0); - player.removeEffect(MobEffects.DIG_SLOWDOWN); + add(player, MobEffects.RESISTANCE, 0); + player.removeEffect(MobEffects.MINING_FATIGUE); } if (count(armor, "mithril") == 4) { for (MobEffectInstance effect : new ArrayList<>(player.getActiveEffects())) { @@ -168,20 +178,19 @@ private static void applyArmorEffects(Player player, Map } } int starsteel = count(armor, "starsteel"); - if (starsteel > 0) add(player, MobEffects.JUMP, starsteel - 1); - if (starsteel >= 2) add(player, MobEffects.MOVEMENT_SPEED, Math.min(2, starsteel - 2)); + if (starsteel > 0) add(player, MobEffects.JUMP_BOOST, starsteel - 1); + if (starsteel >= 2) add(player, MobEffects.SPEED, Math.min(2, starsteel - 2)); } private static void add(Player player, net.minecraft.core.Holder effect, int amplifier) { player.addEffect(new MobEffectInstance(effect, 45, amplifier, false, false, true)); } - @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { - if (!BaseMetalsConfig.SPECIAL_EFFECTS.get() || event.getEntity().level().isClientSide + if (!BaseMetalsConfig.SPECIAL_EFFECTS.get() || event.getEntity().level().isClientSide() || !(event.getSource().getEntity() instanceof LivingEntity attacker)) return; ItemStack held = attacker.getMainHandItem(); - if (!(held.getItem() instanceof MaterialBacked backed) || !(held.getItem() instanceof TieredItem)) return; + if (!(held.getItem() instanceof MaterialBacked backed) || !held.has(net.minecraft.core.component.DataComponents.TOOL)) return; LivingEntity target = event.getEntity(); switch (backed.baseMetalsMaterial().name()) { case "adamantine" -> { @@ -203,7 +212,6 @@ public void onLivingHurt(LivingHurtEvent event) { } } - @SubscribeEvent public void onShieldUpgrade(AnvilUpdateEvent event) { if (!(event.getLeft().getItem() instanceof zone.moddev.mc.basemetals.content.MaterialItems.Shield shield) || event.getLeft().getCount() != 1 || event.getRight().getCount() != 1) return; @@ -211,7 +219,7 @@ public void onShieldUpgrade(AnvilUpdateEvent event) { MaterialDefinition upgrade = shieldMaterials().values().stream() .filter(candidate -> candidate.hardness() > current.hardness()) .filter(candidate -> event.getRight().is(ItemTags.create( - ResourceLocation.fromNamespaceAndPath("forge", "plates/" + candidate.name())))) + Identifier.fromNamespaceAndPath("forge", "plates/" + candidate.name())))) .sorted(Comparator.comparingDouble(MaterialDefinition::hardness) .thenComparing(MaterialDefinition::name)) .findFirst().orElse(null); @@ -243,28 +251,24 @@ static int shieldUpgradeCost(MaterialDefinition current, MaterialDefinition upgr + upgrade.magic() * enchantments)); } - @SubscribeEvent public void onItemCrafted(PlayerEvent.ItemCraftedEvent event) { if (event.getEntity() instanceof ServerPlayer player) { BaseMetalsAdvancements.onCrafted(player, event.getCrafting()); } } - @SubscribeEvent public void onItemSmelted(PlayerEvent.ItemSmeltedEvent event) { if (event.getEntity() instanceof ServerPlayer player) { BaseMetalsAdvancements.onSmelted(player, event.getSmelting()); } } - @SubscribeEvent public void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { if (event.getEntity() instanceof ServerPlayer player) { BaseMetalsAdvancements.onPlaced(player, event.getPlacedBlock()); } } - @SubscribeEvent public void onVillagerTrades(VillagerTradesEvent event) { BaseMetalsTrades.add(event); } diff --git a/src/main/java/zone/moddev/mc/basemetals/MissingMappings.java b/src/main/java/zone/moddev/mc/basemetals/MissingMappings.java index 04d5a4943..ddf4be213 100644 --- a/src/main/java/zone/moddev/mc/basemetals/MissingMappings.java +++ b/src/main/java/zone/moddev/mc/basemetals/MissingMappings.java @@ -6,9 +6,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.item.Item; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraftforge.registries.MissingMappingsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; @@ -20,7 +20,7 @@ private MissingMappings() {} @SubscribeEvent public static void blocks(MissingMappingsEvent event) { for (MissingMappingsEvent.Mapping mapping : event.getAllMappings(ForgeRegistries.Keys.BLOCKS)) { - ResourceLocation vanillaTarget = vanilla114Target(mapping.getKey()); + Identifier vanillaTarget = vanilla114Target(mapping.getKey()); if (vanillaTarget != null) { Block target = ForgeRegistries.BLOCKS.getValue(vanillaTarget); if (target != null) mapping.remap(target); @@ -35,7 +35,7 @@ public static void blocks(MissingMappingsEvent event) { @SubscribeEvent public static void items(MissingMappingsEvent event) { for (MissingMappingsEvent.Mapping mapping : event.getAllMappings(ForgeRegistries.Keys.ITEMS)) { - ResourceLocation vanillaTarget = vanilla114Target(mapping.getKey()); + Identifier vanillaTarget = vanilla114Target(mapping.getKey()); if (vanillaTarget != null) { Item target = ForgeRegistries.ITEMS.getValue(vanillaTarget); if (target != null) mapping.remap(target); @@ -60,17 +60,17 @@ private static boolean isLegacyNamespace(String namespace) { return BaseMetals.MOD_ID.equals(namespace) || "mmdlib".equals(namespace); } - public static ResourceLocation vanilla114Target(ResourceLocation oldName) { + public static Identifier vanilla114Target(Identifier oldName) { if (!"minecraft".equals(oldName.getNamespace())) return null; // Vanilla converts the saved blocks and items, but Forge's registry // snapshot still needs aliases for names retired in 1.14. switch (oldName.getPath()) { - case "sign": return ResourceLocation.fromNamespaceAndPath("minecraft", "oak_sign"); - case "wall_sign": return ResourceLocation.fromNamespaceAndPath("minecraft", "oak_wall_sign"); - case "rose_red": return ResourceLocation.fromNamespaceAndPath("minecraft", "red_dye"); - case "cactus_green": return ResourceLocation.fromNamespaceAndPath("minecraft", "green_dye"); - case "dandelion_yellow": return ResourceLocation.fromNamespaceAndPath("minecraft", "yellow_dye"); + case "sign": return Identifier.fromNamespaceAndPath("minecraft", "oak_sign"); + case "wall_sign": return Identifier.fromNamespaceAndPath("minecraft", "oak_wall_sign"); + case "rose_red": return Identifier.fromNamespaceAndPath("minecraft", "red_dye"); + case "cactus_green": return Identifier.fromNamespaceAndPath("minecraft", "green_dye"); + case "dandelion_yellow": return Identifier.fromNamespaceAndPath("minecraft", "yellow_dye"); default: return null; } } @@ -85,10 +85,10 @@ public static String itemTargetPath(String path) { return path.endsWith("_door_item") ? path.substring(0, path.length() - "_item".length()) : path; } - public static ResourceLocation itemTargetId(String path) { + public static Identifier itemTargetId(String path) { return "iron_nugget".equals(path) - ? ResourceLocation.fromNamespaceAndPath("minecraft", "iron_nugget") - : ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, itemTargetPath(path)); + ? Identifier.fromNamespaceAndPath("minecraft", "iron_nugget") + : Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, itemTargetPath(path)); } public static String fluidTargetPath(String name) { diff --git a/src/main/java/zone/moddev/mc/basemetals/ModTabs.java b/src/main/java/zone/moddev/mc/basemetals/ModTabs.java index bb4ffaef1..b69759835 100644 --- a/src/main/java/zone/moddev/mc/basemetals/ModTabs.java +++ b/src/main/java/zone/moddev/mc/basemetals/ModTabs.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.core.registries.Registries; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import zone.moddev.mc.basemetals.content.BaseMetalAmmoItem; @@ -26,7 +26,7 @@ public final class ModTabs { private ModTabs() {} - public static void register(IEventBus bus) { + public static void register(BusGroup bus) { TABS.register(bus); } diff --git a/src/main/java/zone/moddev/mc/basemetals/ModTags.java b/src/main/java/zone/moddev/mc/basemetals/ModTags.java index 570f62abc..5f01a42bb 100644 --- a/src/main/java/zone/moddev/mc/basemetals/ModTags.java +++ b/src/main/java/zone/moddev/mc/basemetals/ModTags.java @@ -1,16 +1,16 @@ package zone.moddev.mc.basemetals; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; public final class ModTags { public static final TagKey SCYTHE_HARVESTABLE = BlockTags.create( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, "scythe_harvestable")); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, "scythe_harvestable")); public static final TagKey CRACKHAMMER_CRUSHABLE = BlockTags.create( - ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, "crackhammer_crushable")); + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, "crackhammer_crushable")); private ModTags() {} } diff --git a/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java b/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java index eaf155c15..e3001d8de 100644 --- a/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java +++ b/src/main/java/zone/moddev/mc/basemetals/client/BaseMetalsConfigScreen.java @@ -2,15 +2,14 @@ import java.util.ArrayList; import java.util.List; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.util.FormattedCharSequence; - +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.ConfirmScreen; -import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; +import net.minecraft.util.FormattedCharSequence; import net.minecraftforge.common.ForgeConfigSpec; import zone.moddev.mc.basemetals.config.BaseMetalsConfig; @@ -34,7 +33,7 @@ public final class BaseMetalsConfigScreen extends Screen { private OptionButton modeButton; public BaseMetalsConfigScreen(Screen parent) { - super(net.minecraft.network.chat.Component.translatable(PREFIX + "title")); + super(Component.translatable(PREFIX + "title")); this.parent = parent; this.edits = new ConfigEdits(ContentMode.parse(BaseMetalsConfig.CONTENT_MODE.get()), VALUES[0].get(), VALUES[1].get(), VALUES[2].get(), VALUES[3].get()); @@ -83,26 +82,29 @@ private String optionLabel(int index) { } private void initLabels() { - modeButton.setMessage(net.minecraft.network.chat.Component.literal(modeLabel())); + modeButton.setMessage(Component.literal(modeLabel())); for (int index = 0; index < optionButtons.size(); index++) { - optionButtons.get(index).setMessage(net.minecraft.network.chat.Component.literal(optionLabel(index))); + optionButtons.get(index).setMessage(Component.literal(optionLabel(index))); } } private void done() { if (edits.modeChanged()) { minecraft.setScreen(new ConfirmScreen(this::confirmResult, - net.minecraft.network.chat.Component.translatable(PREFIX + "confirm.title"), - net.minecraft.network.chat.Component.translatable(PREFIX + "confirm.message"))); + Component.translatable(PREFIX + "confirm.title"), + Component.translatable(PREFIX + "confirm.message"))); } else { saveAndClose(); } } private void confirmResult(boolean accepted) { - if (accepted) saveAndClose(); - else minecraft.setScreen(this); + if (accepted) { + saveAndClose(); + } else { + minecraft.setScreen(this); + } } private void saveAndClose() { @@ -122,29 +124,30 @@ public void onClose() { public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { renderBackground(graphics, mouseX, mouseY, partialTicks); super.render(graphics, mouseX, mouseY, partialTicks); - graphics.drawCenteredString(font, title, width / 2, 12, 0xFFFFFF); + graphics.drawCenteredString(font, title, width / 2, 12, 0xFFFFFFFF); for (net.minecraft.client.gui.components.events.GuiEventListener child : children()) { if (child instanceof OptionButton && ((OptionButton) child).isHoveredOrFocused()) { String key = ((OptionButton) child).option; if (key != null) { List help = new ArrayList<>(font.split( - net.minecraft.network.chat.Component.translatable(PREFIX + key + ".tooltip"), 280)); + Component.translatable(PREFIX + key + ".tooltip"), 280)); if ("contentMode".equals(key)) { - help.addAll(font.split(net.minecraft.network.chat.Component.translatable(edits.mode().translationKey() + ".description"), 280)); - help.addAll(font.split(net.minecraft.network.chat.Component.translatable(PREFIX + "restart"), 280)); + help.addAll(font.split(Component.translatable( + edits.mode().translationKey() + ".description"), 280)); + help.addAll(font.split(Component.translatable(PREFIX + "restart"), 280)); } - graphics.renderTooltip(font, help, mouseX, mouseY); + graphics.setTooltipForNextFrame(help, mouseX, mouseY); } } } } - private static final class OptionButton extends Button { + private static final class OptionButton extends Button.Plain { private final String option; private OptionButton(int x, int y, int width, String label, Runnable click, String option) { - super(x, y, width, 20, net.minecraft.network.chat.Component.literal(label), button -> click.run(), DEFAULT_NARRATION); + super(x, y, width, 20, Component.literal(label), button -> click.run(), DEFAULT_NARRATION); this.option = option; } diff --git a/src/main/java/zone/moddev/mc/basemetals/client/ClientSetup.java b/src/main/java/zone/moddev/mc/basemetals/client/ClientSetup.java index 8631c141a..4ed024395 100644 --- a/src/main/java/zone/moddev/mc/basemetals/client/ClientSetup.java +++ b/src/main/java/zone/moddev/mc/basemetals/client/ClientSetup.java @@ -6,9 +6,8 @@ import zone.moddev.mc.basemetals.entity.ModEntities; import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.FishingRodItem; import net.minecraft.world.level.block.Block; @@ -17,71 +16,51 @@ import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.common.Mod; -@Mod.EventBusSubscriber(modid = BaseMetals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public final class ClientSetup { private ClientSetup() {} - @SubscribeEvent + public static void register(net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext context) { + EntityRenderersEvent.RegisterRenderers.BUS.addListener(ClientSetup::registerRenderers); + FMLClientSetupEvent.getBus(context.getModBusGroup()).addListener(ClientSetup::clientSetup); + context.registerExtensionPoint( + net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory.class, + () -> new net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory( + (minecraft, parent) -> new BaseMetalsConfigScreen(parent))); + } + public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(ModEntities.CUSTOM_ARROW.get(), MaterialProjectileRenderer::new); event.registerEntityRenderer(ModEntities.CUSTOM_BOLT.get(), MaterialProjectileRenderer::new); } - @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { - net.minecraftforge.fml.ModLoadingContext.get().registerExtensionPoint( - net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory.class, - () -> new net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory( - (minecraft, parent) -> new BaseMetalsConfigScreen(parent))); event.enqueueWork(() -> { zone.moddev.mc.orespawn.api.client.WorldSettingsExtensionRegistry.registerConfigScreen( BaseMetals.MOD_ID, BaseMetalsConfigScreen::new); ModContent.blocksById().forEach((id, block) -> { - if (id.endsWith("_ore")) ItemBlockRenderTypes.setRenderLayer(block.get(), RenderType.cutout()); + if (id.endsWith("_ore")) ItemBlockRenderTypes.setRenderLayer(block.get(), ChunkSectionLayer.CUTOUT); }); ModContent.fluids().values().forEach(fluid -> { - ItemBlockRenderTypes.setRenderLayer(fluid.source().get(), RenderType.translucent()); - ItemBlockRenderTypes.setRenderLayer(fluid.flowing().get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(fluid.source().get(), ChunkSectionLayer.TRANSLUCENT); + ItemBlockRenderTypes.setRenderLayer(fluid.flowing().get(), ChunkSectionLayer.TRANSLUCENT); }); ModContent.blocksById().values().stream() .map(entry -> entry.get()) .forEach(ClientSetup::registerBlockRenderLayer); - ModContent.itemsById().values().forEach(entry -> { - net.minecraft.world.item.Item item = entry.get(); - if (item instanceof MaterialItems.Bow || item instanceof MaterialItems.Crossbow) { - ItemProperties.register(item, ResourceLocation.parse("pull"), (stack, level, user, seed) -> - user == null || user.getUseItem() != stack ? 0.0F - : (float) (stack.getUseDuration(user) - user.getUseItemRemainingTicks()) / 20.0F); - ItemProperties.register(item, ResourceLocation.parse("pulling"), (stack, level, user, seed) -> - user != null && user.isUsingItem() && user.getUseItem() == stack ? 1.0F : 0.0F); - } - if (item instanceof MaterialItems.Shield) { - ItemProperties.register(item, ResourceLocation.parse("blocking"), (stack, level, user, seed) -> - user != null && user.isUsingItem() && user.getUseItem() == stack ? 1.0F : 0.0F); - } - if (item instanceof MaterialItems.FishingRod) { - ItemProperties.register(item, ResourceLocation.parse("cast"), (stack, level, user, seed) -> { - if (user == null) return 0.0F; - boolean main = user.getMainHandItem() == stack; - boolean off = user.getOffhandItem() == stack; - if (user.getMainHandItem().getItem() instanceof FishingRodItem) off = false; - return (main || off) && user instanceof Player player && player.fishing != null ? 1.0F : 0.0F; - }); - } - }); + }); } private static void registerBlockRenderLayer(Block block) { if (block instanceof IronBarsBlock) { - ItemBlockRenderTypes.setRenderLayer(block, RenderType.cutoutMipped()); + ItemBlockRenderTypes.setRenderLayer(block, ChunkSectionLayer.CUTOUT); } else if (block instanceof DoorBlock || block instanceof TrapDoorBlock) { - ItemBlockRenderTypes.setRenderLayer(block, RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(block, ChunkSectionLayer.CUTOUT); } } } diff --git a/src/main/java/zone/moddev/mc/basemetals/client/MaterialProjectileRenderer.java b/src/main/java/zone/moddev/mc/basemetals/client/MaterialProjectileRenderer.java index f84848842..411fbd636 100644 --- a/src/main/java/zone/moddev/mc/basemetals/client/MaterialProjectileRenderer.java +++ b/src/main/java/zone/moddev/mc/basemetals/client/MaterialProjectileRenderer.java @@ -1,53 +1,61 @@ package zone.moddev.mc.basemetals.client; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import zone.moddev.mc.basemetals.content.MaterialBacked; -import zone.moddev.mc.basemetals.entity.MaterialProjectile; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.ArrowRenderer; +import com.mojang.math.Axis; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.model.object.projectile.ArrowModel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.entity.TippableArrowRenderer; +import net.minecraft.client.renderer.entity.state.ArrowRenderState; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.CameraRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; +import zone.moddev.mc.basemetals.content.MaterialBacked; +import zone.moddev.mc.basemetals.entity.MaterialProjectile; -/** - * Uses vanilla's trajectory-aligned arrow geometry while tinting it from the - * exact ammunition item retained by the shared projectile entity. - */ -public final class MaterialProjectileRenderer extends ArrowRenderer { - private int colour = 0xFFFFFF; +/** Vanilla arrow geometry, with the ammunition's colour kept in its own render state. */ +public final class MaterialProjectileRenderer + extends EntityRenderer { + private static final Identifier TEXTURE = Identifier.withDefaultNamespace( + "textures/entity/projectiles/arrow.png"); + private final ArrowModel model; public MaterialProjectileRenderer(EntityRendererProvider.Context context) { super(context); + model = new ArrowModel(context.bakeLayer(ModelLayers.ARROW)); } @Override - public void render(MaterialProjectile projectile, float yaw, float partialTicks, - PoseStack poses, MultiBufferSource buffers, int packedLight) { - colour = projectile.getItem().getItem() instanceof MaterialBacked backed - ? backed.baseMetalsMaterial().colour() - : 0xFFFFFF; - super.render(projectile, yaw, partialTicks, poses, buffers, packedLight); + public State createRenderState() { + return new State(); } @Override - public void vertex(PoseStack.Pose pose, VertexConsumer vertices, - int x, int y, int z, float u, float v, int normalX, int normalY, - int normalZ, int packedLight) { - vertices.addVertex(pose, x, y, z) - .setColor((colour >> 16) & 0xFF, (colour >> 8) & 0xFF, colour & 0xFF, 0xFF) - .setUv(u, v) - .setOverlay(OverlayTexture.NO_OVERLAY) - .setLight(packedLight) - .setNormal(pose, normalX, normalZ, normalY); + public void extractRenderState(MaterialProjectile projectile, State state, float partialTicks) { + super.extractRenderState(projectile, state, partialTicks); + state.xRot = projectile.getXRot(partialTicks); + state.yRot = projectile.getYRot(partialTicks); + state.shake = projectile.shakeTime - partialTicks; + state.colour = 0xFF000000 | (projectile.getItem().getItem() instanceof MaterialBacked backed + ? backed.baseMetalsMaterial().colour() : 0xFFFFFF); } @Override - public ResourceLocation getTextureLocation(MaterialProjectile projectile) { - return TippableArrowRenderer.NORMAL_ARROW_LOCATION; + public void submit(State state, PoseStack poses, SubmitNodeCollector collector, CameraRenderState camera) { + poses.pushPose(); + poses.mulPose(Axis.YP.rotationDegrees(state.yRot - 90.0F)); + poses.mulPose(Axis.ZP.rotationDegrees(state.xRot)); + collector.submitModel(model, state, poses, RenderTypes.entityCutout(TEXTURE), + state.lightCoords, OverlayTexture.NO_OVERLAY, state.colour, null, + state.outlineColor, null); + poses.popPose(); + + super.submit(state, poses, collector, camera); + } + + public static final class State extends ArrowRenderState { + public int colour = 0xFFFFFFFF; } } diff --git a/src/main/java/zone/moddev/mc/basemetals/compat/VanillaCopper.java b/src/main/java/zone/moddev/mc/basemetals/compat/VanillaCopper.java index 5ba6055f6..c66d3bb34 100644 --- a/src/main/java/zone/moddev/mc/basemetals/compat/VanillaCopper.java +++ b/src/main/java/zone/moddev/mc/basemetals/compat/VanillaCopper.java @@ -4,21 +4,45 @@ /** Uses vanilla copper for new items while keeping the old Base Metals IDs valid. */ public final class VanillaCopper { - private static final Map EQUIVALENTS = Map.of( - "basemetals:copper_ingot", "minecraft:copper_ingot", - "basemetals:copper_block", "minecraft:copper_block", - "basemetals:copper_door", "minecraft:copper_door", - "basemetals:copper_trapdoor", "minecraft:copper_trapdoor", - "basemetals:copper_slab", "minecraft:cut_copper_slab", - "basemetals:copper_stairs", "minecraft:cut_copper_stairs"); + private static final Map EQUIVALENTS = Map.ofEntries( + Map.entry("basemetals:copper_ingot", "minecraft:copper_ingot"), + Map.entry("basemetals:copper_nugget", "minecraft:copper_nugget"), + Map.entry("basemetals:copper_block", "minecraft:copper_block"), + Map.entry("basemetals:copper_door", "minecraft:copper_door"), + Map.entry("basemetals:copper_trapdoor", "minecraft:copper_trapdoor"), + Map.entry("basemetals:copper_slab", "minecraft:cut_copper_slab"), + Map.entry("basemetals:copper_stairs", "minecraft:cut_copper_stairs"), + Map.entry("basemetals:copper_bars", "minecraft:copper_bars"), + Map.entry("basemetals:copper_pickaxe", "minecraft:copper_pickaxe"), + Map.entry("basemetals:copper_axe", "minecraft:copper_axe"), + Map.entry("basemetals:copper_shovel", "minecraft:copper_shovel"), + Map.entry("basemetals:copper_hoe", "minecraft:copper_hoe"), + Map.entry("basemetals:copper_sword", "minecraft:copper_sword"), + Map.entry("basemetals:copper_helmet", "minecraft:copper_helmet"), + Map.entry("basemetals:copper_chestplate", "minecraft:copper_chestplate"), + Map.entry("basemetals:copper_leggings", "minecraft:copper_leggings"), + Map.entry("basemetals:copper_boots", "minecraft:copper_boots"), + Map.entry("basemetals:copper_horse_armor", "minecraft:copper_horse_armor")); - private static final Map INGREDIENT_TAGS = Map.of( - "basemetals:copper_ingot", "forge:ingots/copper", - "basemetals:copper_block", "forge:storage_blocks/copper", - "basemetals:copper_door", "forge:doors/copper", - "basemetals:copper_trapdoor", "forge:trapdoors/copper", - "basemetals:copper_slab", "forge:slabs/copper", - "basemetals:copper_stairs", "forge:stairs/copper"); + private static final Map INGREDIENT_TAGS = Map.ofEntries( + Map.entry("basemetals:copper_ingot", "forge:ingots/copper"), + Map.entry("basemetals:copper_nugget", "forge:nuggets/copper"), + Map.entry("basemetals:copper_block", "forge:storage_blocks/copper"), + Map.entry("basemetals:copper_door", "forge:doors/copper"), + Map.entry("basemetals:copper_trapdoor", "forge:trapdoors/copper"), + Map.entry("basemetals:copper_slab", "forge:slabs/copper"), + Map.entry("basemetals:copper_stairs", "forge:stairs/copper"), + Map.entry("basemetals:copper_bars", "forge:bars/copper"), + Map.entry("basemetals:copper_pickaxe", "forge:tools/pickaxes/copper"), + Map.entry("basemetals:copper_axe", "forge:tools/axes/copper"), + Map.entry("basemetals:copper_shovel", "forge:tools/shovels/copper"), + Map.entry("basemetals:copper_hoe", "forge:tools/hoes/copper"), + Map.entry("basemetals:copper_sword", "forge:tools/swords/copper"), + Map.entry("basemetals:copper_helmet", "forge:armors/helmets/copper"), + Map.entry("basemetals:copper_chestplate", "forge:armors/chestplates/copper"), + Map.entry("basemetals:copper_leggings", "forge:armors/leggings/copper"), + Map.entry("basemetals:copper_boots", "forge:armors/boots/copper"), + Map.entry("basemetals:copper_horse_armor", "forge:armors/horse/copper")); private VanillaCopper() {} diff --git a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAmmoItem.java b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAmmoItem.java index c67d809d4..33dc54391 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAmmoItem.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAmmoItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; diff --git a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAnvilBlock.java b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAnvilBlock.java index 7c32c691c..43330cfd3 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAnvilBlock.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalAnvilBlock.java @@ -10,11 +10,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.AnvilBlock; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; @@ -43,13 +41,8 @@ public MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) } private static final class DurableAnvilMenu extends AnvilMenu { - private final Level level; - private final BlockPos pos; - private DurableAnvilMenu(int containerId, Inventory inventory, Level level, BlockPos pos) { super(containerId, inventory, ContainerLevelAccess.create(level, pos)); - this.level = level; - this.pos = pos.immutable(); } @Override @@ -57,29 +50,5 @@ protected boolean isValidBlock(BlockState state) { return state.getBlock() instanceof BaseMetalAnvilBlock; } - @Override - protected void onTake(Player player, ItemStack output) { - BlockState original = level.getBlockState(pos); - if (!(original.getBlock() instanceof BaseMetalAnvilBlock)) { - super.onTake(player, output); - return; - } - - int damage = original.getValue(DAMAGE); - Block placeholder = switch (damage) { - case 0 -> Blocks.ANVIL; - case 1 -> Blocks.CHIPPED_ANVIL; - default -> Blocks.DAMAGED_ANVIL; - }; - level.setBlock(pos, placeholder.defaultBlockState().setValue(FACING, original.getValue(FACING)), 2); - super.onTake(player, output); - - BlockState after = level.getBlockState(pos); - if (after.is(placeholder)) { - level.setBlock(pos, original, 2); - } else if (damage < 2 && (after.is(Blocks.CHIPPED_ANVIL) || after.is(Blocks.DAMAGED_ANVIL))) { - level.setBlock(pos, original.setValue(DAMAGE, damage + 1), 2); - } - } } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java index f3e22327a..de1586253 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/BaseMetalBucketItem.java @@ -11,7 +11,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; @@ -38,25 +38,25 @@ public BaseMetalBucketItem(Supplier fluid, Properties propertie } @Override - public InteractionResultHolder use(Level level, net.minecraft.world.entity.player.Player player, + public InteractionResult use(Level level, net.minecraft.world.entity.player.Player player, InteractionHand hand) { ItemStack held = player.getItemInHand(hand); BlockHitResult hit = getPlayerPOVHitResult(level, player, ClipContext.Fluid.NONE); - InteractionResultHolder forgeResult = ForgeEventFactory.onBucketUse(player, level, held, hit); + InteractionResult forgeResult = ForgeEventFactory.onBucketUse(player, level, held, hit); if (forgeResult != null) return forgeResult; - if (hit.getType() != HitResult.Type.BLOCK) return InteractionResultHolder.pass(held); + if (hit.getType() != HitResult.Type.BLOCK) return InteractionResult.PASS; BlockPos clicked = hit.getBlockPos(); Direction direction = hit.getDirection(); BlockPos adjacent = clicked.relative(direction); if (!level.mayInteract(player, clicked) || !player.mayUseItemAt(adjacent, direction, held)) { - return InteractionResultHolder.fail(held); + return InteractionResult.FAIL; } BlockState clickedState = level.getBlockState(clicked); BlockPos destination = canContainFluid(level, clicked, clickedState) ? clicked : adjacent; if (!emptyContents(player, level, destination, hit, held, hand)) { - return InteractionResultHolder.fail(held); + return InteractionResult.FAIL; } checkExtraContent(player, level, held, destination); @@ -65,10 +65,9 @@ public InteractionResultHolder use(Level level, net.minecraft.world.e } player.awardStat(Stats.ITEM_USED.get(this)); level.gameEvent(player, GameEvent.FLUID_PLACE, destination); - return InteractionResultHolder.sidedSuccess(getEmptySuccessItem(held, player), level.isClientSide()); + return InteractionResult.SUCCESS.heldItemTransformedTo(getEmptySuccessItem(held, player)); } - @Override public boolean emptyContents(@Nullable net.minecraft.world.entity.player.Player player, Level level, BlockPos position, @Nullable BlockHitResult hit) { return emptyContents(player, level, position, hit, getDefaultInstance()); diff --git a/src/main/java/zone/moddev/mc/basemetals/content/CrackhammerItem.java b/src/main/java/zone/moddev/mc/basemetals/content/CrackhammerItem.java index 590d9c114..9fe1aeea7 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/CrackhammerItem.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/CrackhammerItem.java @@ -11,7 +11,9 @@ import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.component.TooltipDisplay; +import java.util.function.Consumer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; @@ -22,14 +24,13 @@ import net.minecraftforge.common.ToolAction; import net.minecraftforge.common.ToolActions; -public final class CrackhammerItem extends DiggerItem implements MaterialBacked { +public final class CrackhammerItem extends Item implements MaterialBacked { private final MaterialDefinition material; public CrackhammerItem(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), BlockTags.MINEABLE_WITH_PICKAXE, - properties.durability(material.crackhammerDurability()).attributes( - DiggerItem.createAttributes(new MaterialTier(material), - 5.0F + material.baseAttackDamage(), -3.5F))); + super(properties.pickaxe(new MaterialTier(material).toolMaterial(), + 5.0F + material.baseAttackDamage(), -3.5F) + .durability(material.crackhammerDurability())); this.material = material; } @@ -50,14 +51,14 @@ public boolean canPerformAction(ItemStack stack, ToolAction action) { @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, + TooltipDisplay display, Consumer tooltip, net.minecraft.world.item.TooltipFlag flag) { MaterialItems.addToolTooltip(material, tooltip); } @Override public InteractionResult useOn(UseOnContext context) { - if (context.getClickedFace() != Direction.UP || context.getLevel().isClientSide + if (context.getClickedFace() != Direction.UP || context.getLevel().isClientSide() || context.getPlayer() == null) { return InteractionResult.PASS; } @@ -66,7 +67,7 @@ public InteractionResult useOn(UseOnContext context) { entity -> entity.isAlive() && !entity.getItem().isEmpty()); for (ItemEntity entity : entities) { ItemStack input = entity.getItem(); - Optional> recipe = context.getLevel().getRecipeManager().getRecipeFor( + Optional> recipe = ((net.minecraft.server.level.ServerLevel) context.getLevel()).getServer().getRecipeManager().getRecipeFor( CrushingRecipe.TYPE.get(), new SingleRecipeInput(input), context.getLevel()); if (recipe.isEmpty() || !canCrushDroppedBlock(context.getItemInHand(), input)) continue; // Sneaking is the per-use full-stack control; ordinary use crushes @@ -83,7 +84,7 @@ public InteractionResult useOn(UseOnContext context) { if (input.isEmpty()) entity.discard(); else entity.setItem(input); spawnOutputs(context.getLevel(), entity, output, operations); hammer.hurtAndBreak(operations, context.getPlayer(), - net.minecraft.world.entity.LivingEntity.getSlotForHand(context.getHand())); + zone.moddev.mc.basemetals.content.MaterialItems.handSlot(context.getHand())); context.getLevel().playSound(null, context.getClickedPos(), net.minecraft.sounds.SoundEvents.GRAVEL_BREAK, net.minecraft.sounds.SoundSource.BLOCKS, 0.5F, diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MaterialArmor.java b/src/main/java/zone/moddev/mc/basemetals/content/MaterialArmor.java index 81e48bf0a..cc904f66b 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MaterialArmor.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MaterialArmor.java @@ -2,53 +2,45 @@ import java.util.EnumMap; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.ItemTags; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; +import net.minecraft.world.item.equipment.ArmorMaterial; +import net.minecraft.world.item.equipment.ArmorType; +import net.minecraft.world.item.equipment.EquipmentAssets; import zone.moddev.mc.basemetals.BaseMetals; import zone.moddev.mc.basemetals.material.MaterialDefinition; -/** Registered armour materials shared by worn armour and horse armour. */ +/** Shared equipment properties for each material. */ public final class MaterialArmor { - private static final DeferredRegister MATERIALS = - DeferredRegister.create(Registries.ARMOR_MATERIAL, BaseMetals.MOD_ID); - private static final Map> BY_NAME = new LinkedHashMap<>(); + private static final Map BY_NAME = new LinkedHashMap<>(); private MaterialArmor() {} public static void register(MaterialDefinition material) { - BY_NAME.computeIfAbsent(material.name(), name -> MATERIALS.register(name, () -> create(material))); + BY_NAME.computeIfAbsent(material.name(), name -> create(material)); } - public static void register(IEventBus bus) { - MATERIALS.register(bus); - } - - public static Holder get(MaterialDefinition material) { - return BY_NAME.get(material.name()).getHolder().orElseThrow(); + public static ArmorMaterial get(MaterialDefinition material) { + return BY_NAME.get(material.name()); } private static ArmorMaterial create(MaterialDefinition material) { - Map defense = new EnumMap<>(ArmorItem.Type.class); - for (ArmorItem.Type type : ArmorItem.Type.values()) { - defense.put(type, type == ArmorItem.Type.BODY + Map defense = new EnumMap<>(ArmorType.class); + + for (ArmorType type : ArmorType.values()) { + defense.put(type, type == ArmorType.BODY ? material.horseArmorProtection() : material.armorProtection(type.getSlot())); } - return new ArmorMaterial(defense, material.enchantability(), SoundEvents.ARMOR_EQUIP_IRON, - () -> Ingredient.of(ItemTags.create(ResourceLocation.parse(material.repairIngredientTag()))), - List.of(new ArmorMaterial.Layer(ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, material.name()))), - material.armorToughness(), 0.0F); + return new ArmorMaterial(material.armorDurabilityFactor(), defense, + material.enchantability(), SoundEvents.ARMOR_EQUIP_IRON, + material.armorToughness(), 0.0F, + ItemTags.create(Identifier.parse(material.repairIngredientTag())), + ResourceKey.create(EquipmentAssets.ROOT_ID, + Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, material.name()))); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MaterialBacked.java b/src/main/java/zone/moddev/mc/basemetals/content/MaterialBacked.java index 674c8fda0..29bdb78ae 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MaterialBacked.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MaterialBacked.java @@ -2,7 +2,7 @@ import zone.moddev.mc.basemetals.material.MaterialDefinition; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; @@ -10,7 +10,7 @@ public interface MaterialBacked { MaterialDefinition baseMetalsMaterial(); default boolean isMaterialRepairIngredient(ItemStack repair) { - return repair.is(ItemTags.create(ResourceLocation.parse( + return repair.is(ItemTags.create(Identifier.parse( baseMetalsMaterial().repairIngredientTag()))); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MaterialItems.java b/src/main/java/zone/moddev/mc/basemetals/content/MaterialItems.java index 5372db768..163bac708 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MaterialItems.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MaterialItems.java @@ -6,7 +6,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.core.registries.Registries; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -17,22 +17,18 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BowItem; import net.minecraft.world.item.FishingRodItem; import net.minecraft.world.item.HoeItem; -import net.minecraft.world.item.AnimalArmorItem; import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.item.Item; -import net.minecraft.world.item.PickaxeItem; import net.minecraft.world.item.ShearsItem; import net.minecraft.world.item.ShieldItem; import net.minecraft.world.item.ShovelItem; -import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; @@ -41,6 +37,9 @@ import net.minecraft.world.level.Level; import javax.annotation.Nullable; import java.util.List; +import java.util.function.Consumer; +import net.minecraft.world.item.component.TooltipDisplay; +import net.minecraft.world.item.equipment.ArmorType; import java.util.function.Predicate; import net.minecraft.world.item.ItemStack; @@ -62,105 +61,93 @@ public Basic(MaterialDefinition material, int burnTime, Properties properties) { } } - public static final class Pickaxe extends PickaxeItem implements MaterialBacked { + public static final class Pickaxe extends Item implements MaterialBacked { private final MaterialDefinition material; public Pickaxe(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), properties.attributes( - toolAttributes(material, 1, -2.8F))); + super(properties.pickaxe(new MaterialTier(material).toolMaterial(), 1, -2.8F)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static final class Axe extends AxeItem implements MaterialBacked { private final MaterialDefinition material; public Axe(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), properties.attributes( - toolAttributes(material, 4.0F + material.baseAttackDamage(), material.axeAttackSpeed()))); + super(new MaterialTier(material).toolMaterial(), 4.0F + material.baseAttackDamage(), + material.axeAttackSpeed(), properties); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static final class Shovel extends ShovelItem implements MaterialBacked { private final MaterialDefinition material; public Shovel(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), properties.attributes(toolAttributes(material, 1.5F, -3.0F))); + super(new MaterialTier(material).toolMaterial(), 1.5F, -3.0F, properties); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static final class Hoe extends HoeItem implements MaterialBacked { private final MaterialDefinition material; public Hoe(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), properties.attributes(ItemAttributeModifiers.builder() - .add(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, - 0.0D, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) - .add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, - material.baseAttackDamage() - 3.0D, - AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) - .build())); + super(new MaterialTier(material).toolMaterial(), -material.baseAttackDamage(), + material.baseAttackDamage() - 3.0F, properties); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } - public static class Sword extends SwordItem implements MaterialBacked { + public static class Sword extends Item implements MaterialBacked { private final MaterialDefinition material; public Sword(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), properties.attributes( - SwordItem.createAttributes(new MaterialTier(material), 3, -2.4F))); + super(properties.sword(new MaterialTier(material).toolMaterial(), 3, -2.4F)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } - public static final class Armor extends ArmorItem implements MaterialBacked { + public static final class Armor extends Item implements MaterialBacked { private final MaterialDefinition material; public Armor(MaterialDefinition material, EquipmentSlot slot, Properties properties) { - super(MaterialArmor.get(material), armorType(slot), - properties.durability(armorType(slot).getDurability(material.armorDurabilityFactor()))); + super(properties.humanoidArmor(MaterialArmor.get(material), armorType(slot))); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addArmorTooltip(material, tooltip); } } - public static final class HorseArmor extends AnimalArmorItem implements MaterialBacked { + public static final class HorseArmor extends Item implements MaterialBacked { private final MaterialDefinition material; public HorseArmor(MaterialDefinition material, Properties properties) { - super(MaterialArmor.get(material), BodyType.EQUESTRIAN, false, properties.stacksTo(1)); + super(properties.horseArmor(MaterialArmor.get(material)).stacksTo(1)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } } - private static ItemAttributeModifiers toolAttributes(MaterialDefinition material, float damage, float speed) { - return net.minecraft.world.item.DiggerItem.createAttributes(new MaterialTier(material), damage, speed); - } - - private static ArmorItem.Type armorType(EquipmentSlot slot) { + private static ArmorType armorType(EquipmentSlot slot) { return switch (slot) { - case HEAD -> ArmorItem.Type.HELMET; - case CHEST -> ArmorItem.Type.CHESTPLATE; - case LEGS -> ArmorItem.Type.LEGGINGS; - case FEET -> ArmorItem.Type.BOOTS; + case HEAD -> ArmorType.HELMET; + case CHEST -> ArmorType.CHESTPLATE; + case LEGS -> ArmorType.LEGGINGS; + case FEET -> ArmorType.BOOTS; default -> throw new IllegalArgumentException("Not an armour slot: " + slot); }; } @@ -179,35 +166,29 @@ public BurnableBlock(net.minecraft.world.level.block.Block block, int burnTime, public static final class Shears extends ShearsItem implements MaterialBacked { private final MaterialDefinition material; - public Shears(MaterialDefinition material, Properties properties) { super(properties); this.material = material; } + public Shears(MaterialDefinition material, Properties properties) { super(repairable(material, properties)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } - @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { - return isMaterialRepairIngredient(repair) || super.isValidRepairItem(toRepair, repair); - } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static class Shield extends ShieldItem implements MaterialBacked { private final MaterialDefinition material; - public Shield(MaterialDefinition material, Properties properties) { super(properties); this.material = material; } + public Shield(MaterialDefinition material, Properties properties) { super(repairable(material, properties)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } - @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { - return isMaterialRepairIngredient(repair) || super.isValidRepairItem(toRepair, repair); - } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static class Bow extends BowItem implements MaterialBacked { private final MaterialDefinition material; - public Bow(MaterialDefinition material, Properties properties) { super(properties); this.material = material; } + public Bow(MaterialDefinition material, Properties properties) { super(repairable(material, properties)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public Predicate getAllSupportedProjectiles() { return stack -> stack.getItem() instanceof net.minecraft.world.item.ArrowItem @@ -220,33 +201,27 @@ public static class Bow extends BowItem implements MaterialBacked { } @Override public AbstractArrow customArrow(AbstractArrow arrow) { - arrow.setBaseDamage(arrow.getBaseDamage() + material.baseAttackDamage() - 1.0D); + applyLauncherDamage(arrow, material); return arrow; } - @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { - return isMaterialRepairIngredient(repair) || super.isValidRepairItem(toRepair, repair); - } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static final class Crossbow extends BowItem implements MaterialBacked { private final MaterialDefinition material; - public Crossbow(MaterialDefinition material, Properties properties) { super(properties); this.material = material; } + public Crossbow(MaterialDefinition material, Properties properties) { super(repairable(material, properties)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } @Override public Predicate getAllSupportedProjectiles() { return stack -> stack.getItem() instanceof BaseMetalAmmoItem ammo && ammo.kind() == BaseMetalAmmoItem.Kind.BOLT; } - @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { - return isMaterialRepairIngredient(repair) || super.isValidRepairItem(toRepair, repair); - } @Override - public void releaseUsing(ItemStack bow, Level level, LivingEntity user, int timeLeft) { - if (!(user instanceof Player player)) return; + public boolean releaseUsing(ItemStack bow, Level level, LivingEntity user, int timeLeft) { + if (!(user instanceof Player player)) return false; boolean hasInfiniteAmmo = player.getAbilities().instabuild || EnchantmentHelper.getItemEnchantmentLevel(player.registryAccess() .lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(Enchantments.INFINITY), bow) > 0; @@ -254,13 +229,13 @@ public void releaseUsing(ItemStack bow, Level level, LivingEntity user, int time int charge = getUseDuration(bow, user) - timeLeft; charge = net.minecraftforge.event.ForgeEventFactory.onArrowLoose( bow, level, player, charge, !ammunition.isEmpty() || hasInfiniteAmmo); - if (charge < 0 || ammunition.isEmpty() && !hasInfiniteAmmo) return; + if (charge < 0 || ammunition.isEmpty() && !hasInfiniteAmmo) return false; if (ammunition.isEmpty()) { ammunition = ModContent.item("iron_bolt").get().getDefaultInstance(); } float power = getPowerForTime(charge); - if (power < 0.1F) return; + if (power < 0.1F) return false; BaseMetalAmmoItem boltItem = ammunition.getItem() instanceof BaseMetalAmmoItem ammo && ammo.kind() == BaseMetalAmmoItem.Kind.BOLT @@ -268,16 +243,17 @@ public void releaseUsing(ItemStack bow, Level level, LivingEntity user, int time : (BaseMetalAmmoItem) ModContent.item("iron_bolt").get(); boolean infiniteShot = player.getAbilities().instabuild || boltItem.isInfinite(ammunition, bow, player); - if (!level.isClientSide) { + if (!level.isClientSide()) { AbstractArrow bolt = boltItem.createArrow(level, ammunition, player, bow); - bolt.setBaseDamage(bolt.getBaseDamage() + material.baseAttackDamage() - 1.0D); + applyLauncherDamage(bolt, material); bolt.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, power * 3.0F, 1.0F); if (power == 1.0F) bolt.setCritArrow(true); - // The saved weapon lets vanilla apply Power, Punch and Flame once. - bow.hurtAndBreak(1, player, LivingEntity.getSlotForHand(player.getUsedItemHand())); + // Keep the weapon for hit effects, and apply launch effects through vanilla's spawn path. + bow.hurtAndBreak(1, player, zone.moddev.mc.basemetals.content.MaterialItems.handSlot(player.getUsedItemHand())); if (infiniteShot) bolt.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; - level.addFreshEntity(bolt); + net.minecraft.world.entity.projectile.Projectile.spawnProjectile( + bolt, (net.minecraft.server.level.ServerLevel) level, ammunition); } level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, @@ -287,6 +263,7 @@ public void releaseUsing(ItemStack bow, Level level, LivingEntity user, int time if (ammunition.isEmpty()) player.getInventory().removeItem(ammunition); } player.awardStat(Stats.ITEM_USED.get(this)); + return true; } private ItemStack findBolt(Player player) { @@ -303,26 +280,41 @@ private ItemStack findBolt(Player player) { @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } public static final class FishingRod extends FishingRodItem implements MaterialBacked { private final MaterialDefinition material; - public FishingRod(MaterialDefinition material, Properties properties) { super(properties); this.material = material; } + public FishingRod(MaterialDefinition material, Properties properties) { super(repairable(material, properties)); this.material = material; } @Override public MaterialDefinition baseMetalsMaterial() { return material; } - @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { - return isMaterialRepairIngredient(repair) || super.isValidRepairItem(toRepair, repair); - } @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { addToolTooltip(material, tooltip); } } - static void addToolTooltip(MaterialDefinition material, List tooltip) { + public static EquipmentSlot handSlot(net.minecraft.world.InteractionHand hand) { + return hand == net.minecraft.world.InteractionHand.MAIN_HAND + ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND; + } + + private static void applyLauncherDamage(AbstractArrow arrow, MaterialDefinition launcher) { + double ammunitionDamage = arrow instanceof zone.moddev.mc.basemetals.entity.MaterialProjectile projectile + && projectile.getItem().getItem() instanceof MaterialBacked backed + ? backed.baseMetalsMaterial().baseAttackDamage() : 1.0D; + arrow.setBaseDamage(launcher.baseAttackDamage() + ammunitionDamage); + } + + private static Item.Properties repairable(MaterialDefinition material, Item.Properties properties) { + return properties.repairable(net.minecraft.tags.ItemTags.create( + Identifier.parse(material.repairIngredientTag()))) + .enchantable(material.enchantability()); + } + + static void addToolTooltip(MaterialDefinition material, Consumer tooltip) { Component component = switch (material.name()) { case "adamantine" -> net.minecraft.network.chat.Component.translatable("tooltip.adamantine.tool", 4); case "aquarium" -> net.minecraft.network.chat.Component.translatable("tooltip.aquarium.tool", 4); @@ -331,14 +323,14 @@ static void addToolTooltip(MaterialDefinition material, List tooltip) case "starsteel" -> net.minecraft.network.chat.Component.translatable("tooltip.starsteel.tool", 10); default -> null; }; - if (component != null) tooltip.add(component); + if (component != null) tooltip.accept(component); } - private static void addArmorTooltip(MaterialDefinition material, List tooltip) { + private static void addArmorTooltip(MaterialDefinition material, Consumer tooltip) { if (material.name().equals("adamantine") || material.name().equals("aquarium") || material.name().equals("coldiron") || material.name().equals("mithril") || material.name().equals("starsteel")) { - tooltip.add(net.minecraft.network.chat.Component.translatable("tooltip." + material.name() + ".armor")); + tooltip.accept(net.minecraft.network.chat.Component.translatable("tooltip." + material.name() + ".armor")); } } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MaterialTier.java b/src/main/java/zone/moddev/mc/basemetals/content/MaterialTier.java index 791fc48b5..706bc9ed8 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MaterialTier.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MaterialTier.java @@ -5,32 +5,38 @@ import zone.moddev.mc.basemetals.BaseMetals; import zone.moddev.mc.basemetals.material.MaterialDefinition; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; -import net.minecraft.world.item.Tier; +import net.minecraft.world.item.ToolMaterial; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.core.Registry; -public final class MaterialTier implements Tier { +public final class MaterialTier { private final MaterialDefinition material; private final Supplier repair; public MaterialTier(MaterialDefinition material) { this.material = material; - TagKey tag = ItemTags.create(ResourceLocation.parse(material.repairIngredientTag())); - this.repair = () -> Ingredient.of(tag); + TagKey tag = ItemTags.create(Identifier.parse(material.repairIngredientTag())); + this.repair = () -> Ingredient.of(net.minecraft.core.registries.BuiltInRegistries.ITEM + .getOrThrow(tag)); + } + + public ToolMaterial toolMaterial() { + return new ToolMaterial(getIncorrectBlocksForDrops(), getUses(), getSpeed(), + getAttackDamageBonus(), getEnchantmentValue(), + ItemTags.create(Identifier.parse(material.repairIngredientTag()))); } public MaterialDefinition material() { return material; } - @Override public int getUses() { return material.toolDurability(); } - @Override public float getSpeed() { return material.toolEfficiency(); } - @Override public float getAttackDamageBonus() { return material.baseAttackDamage(); } - @Override + public int getUses() { return material.toolDurability(); } + public float getSpeed() { return material.toolEfficiency(); } + public float getAttackDamageBonus() { return material.baseAttackDamage(); } public net.minecraft.tags.TagKey getIncorrectBlocksForDrops() { return switch (material.toolLevel()) { case 0 -> net.minecraft.tags.BlockTags.INCORRECT_FOR_WOODEN_TOOL; @@ -39,6 +45,6 @@ public net.minecraft.tags.TagKey getIncor default -> net.minecraft.tags.BlockTags.INCORRECT_FOR_DIAMOND_TOOL; }; } - @Override public int getEnchantmentValue() { return material.enchantability(); } - @Override public Ingredient getRepairIngredient() { return repair.get(); } + public int getEnchantmentValue() { return material.enchantability(); } + public Ingredient getRepairIngredient() { return repair.get(); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MetalFluidType.java b/src/main/java/zone/moddev/mc/basemetals/content/MetalFluidType.java index 5bf3f5b8b..bb4050a72 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MetalFluidType.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MetalFluidType.java @@ -2,28 +2,32 @@ import java.util.function.Consumer; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import net.minecraftforge.fluids.FluidType; /** Shared molten-fluid rendering; Forge only requests these extensions on the client. */ public final class MetalFluidType extends FluidType { - private final ResourceLocation still; - private final ResourceLocation flowing; + private final Identifier still; + private final Identifier flowing; private final int colour; - public MetalFluidType(Properties properties, ResourceLocation still, ResourceLocation flowing, int colour) { + public MetalFluidType(Properties properties, Identifier still, Identifier flowing, int colour) { super(properties); this.still = still; this.flowing = flowing; this.colour = 0xFF000000 | colour; } + public int colour() { + return colour; + } + @Override public void initializeClient(Consumer consumer) { consumer.accept(new IClientFluidTypeExtensions() { - @Override public ResourceLocation getStillTexture() { return still; } - @Override public ResourceLocation getFlowingTexture() { return flowing; } + @Override public Identifier getStillTexture() { return still; } + @Override public Identifier getFlowingTexture() { return flowing; } @Override public int getTintColor() { return colour; } }); } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/ModContent.java b/src/main/java/zone/moddev/mc/basemetals/content/ModContent.java index e278e0cd4..07d7ea582 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/ModContent.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/ModContent.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.function.Supplier; +import java.util.function.Function; import zone.moddev.mc.basemetals.BaseMetals; import zone.moddev.mc.basemetals.ModTabs; @@ -34,10 +35,10 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.level.material.Fluid; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.level.block.SoundType; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.common.SoundActions; import net.minecraftforge.fluids.ForgeFlowingFluid; @@ -76,8 +77,8 @@ public final class ModContent { registerAnvil("steel_anvil", metalProperties(MaterialCatalogue.get("steel"))); registerAnvil("adamantine_anvil", metalProperties(MaterialCatalogue.get("adamantine"))); HUMAN_DETECTOR = registerBlock("human_detector", - () -> new HumanDetectorBlock(BlockBehaviour.Properties.of().mapColor(MapColor.METAL) - .sound(SoundType.METAL).strength(5.0F).noCollission()), true); + () -> new HumanDetectorBlock(BlockBehaviour.Properties.of().setId(BLOCKS.key("human_detector")).mapColor(MapColor.METAL) + .sound(SoundType.METAL).strength(5.0F).noCollision()), true); registerVanillaBits(); MaterialCatalogue.ALL.forEach(material -> registerFluid(material.name(), material.colour(), material.name().equals("mercury"))); @@ -91,8 +92,16 @@ public final class ModContent { private ModContent() {} - public static void register(IEventBus bus) { - MaterialArmor.register(bus); + private static final class MaterialProperties extends Item.Properties { + @Override + public Item.Properties enchantable(int value) { + // Zero means un-enchantable in the material catalogue. The native + // component accepts only positive values, so leave it absent. + return value > 0 ? super.enchantable(value) : this; + } + } + + public static void register(BusGroup bus) { BLOCKS.register(bus); ITEMS.register(bus); FLUIDS.register(bus); @@ -137,12 +146,12 @@ private static void registerMaterial(MaterialDefinition material) { } String doubleSlab = "double_" + material.name() + "_slab"; blocks.put("double_slab", registerBlock(doubleSlab, - () -> new CompatibilityDoubleSlabBlock(metalProperties(material)), false)); + () -> new CompatibilityDoubleSlabBlock(metalProperties(material).setId(BLOCKS.key(doubleSlab))), false)); HIDDEN_BLOCKS.add(doubleSlab); } if (material.hasOre()) { String id = material.name() + "_ore"; - blocks.put("ore", registerBlock(id, () -> new Block(oreProperties(material)), true)); + blocks.put("ore", registerBlock(id, () -> new Block(oreProperties(material).setId(BLOCKS.key(id))), true)); items.put("ore", ITEMS_BY_ID.get(id)); if (!material.name().equals("copper")) { items.put("raw", registerSimpleMaterialItem(material.name() + "_raw", material)); @@ -179,19 +188,20 @@ private static RegistryObject registerMaterialBlock(String id, String for private static RegistryObject registerMaterialBlock(String id, String form, MaterialDefinition material, boolean item, Supplier properties, Supplier stairBase) { + Supplier keyedProperties = () -> properties.get().setId(BLOCKS.key(id)); Supplier factory = switch (form) { - case "plate" -> () -> new PlateBlock(properties.get().noOcclusion()); - case "bars" -> () -> new IronBarsBlock(properties.get().noOcclusion().dynamicShape()); - case "door" -> () -> new DoorBlock(doorType(material), properties.get().noOcclusion().dynamicShape()); - case "trapdoor" -> () -> new TrapDoorBlock(doorType(material), properties.get().noOcclusion().dynamicShape()); - case "button" -> () -> new ButtonBlock(BlockSetType.STONE, 20, properties.get().noCollission()); - case "slab" -> () -> new SlabBlock(properties.get()); - case "lever" -> () -> new LeverBlock(properties.get().noCollission()); + case "plate" -> () -> new PlateBlock(keyedProperties.get().noOcclusion()); + case "bars" -> () -> new IronBarsBlock(keyedProperties.get().noOcclusion().dynamicShape()); + case "door" -> () -> new DoorBlock(doorType(material), keyedProperties.get().noOcclusion().dynamicShape()); + case "trapdoor" -> () -> new TrapDoorBlock(doorType(material), keyedProperties.get().noOcclusion().dynamicShape()); + case "button" -> () -> new ButtonBlock(BlockSetType.STONE, 20, keyedProperties.get().noCollision()); + case "slab" -> () -> new SlabBlock(keyedProperties.get()); + case "lever" -> () -> new LeverBlock(keyedProperties.get().noCollision()); case "pressure_plate" -> () -> new PressurePlateBlock( - BlockSetType.STONE, properties.get()); - case "stairs" -> () -> new StairBlock(stairBase.get(), properties.get()); - case "wall" -> () -> new WallBlock(properties.get()); - default -> () -> new Block(properties.get()); + BlockSetType.STONE, keyedProperties.get()); + case "stairs" -> () -> new StairBlock(stairBase.get(), keyedProperties.get()); + case "wall" -> () -> new WallBlock(keyedProperties.get()); + default -> () -> new Block(keyedProperties.get()); }; return registerBlock(id, factory, item); } @@ -201,41 +211,39 @@ private static BlockSetType doorType(MaterialDefinition material) { } private static void registerEquipment(MaterialDefinition material, Map> items) { - Item.Properties tool = new Item.Properties().durability(material.toolDurability()); - Item.Properties combat = new Item.Properties(); - items.put("pickaxe", registerItem(material.name() + "_pickaxe", () -> new MaterialItems.Pickaxe(material, tool))); - items.put("axe", registerItem(material.name() + "_axe", () -> new MaterialItems.Axe(material, - new Item.Properties()))); - items.put("shovel", registerItem(material.name() + "_shovel", () -> new MaterialItems.Shovel(material, - new Item.Properties()))); - items.put("hoe", registerItem(material.name() + "_hoe", () -> new MaterialItems.Hoe(material, - new Item.Properties()))); - items.put("sword", registerItem(material.name() + "_sword", () -> new MaterialItems.Sword(material, - new Item.Properties()))); - items.put("crackhammer", registerItem(material.name() + "_crackhammer", () -> new CrackhammerItem(material, - new Item.Properties()))); - items.put("scythe", registerItem(material.name() + "_scythe", () -> new ScytheItem(material, - new Item.Properties()))); - items.put("shears", registerItem(material.name() + "_shears", () -> new MaterialItems.Shears(material, - new Item.Properties().durability(material.toolDurability())))); - items.put("fishing_rod", registerItem(material.name() + "_fishing_rod", () -> new MaterialItems.FishingRod(material, - new Item.Properties().durability(material.toolDurability())))); - items.put("bow", registerItem(material.name() + "_bow", () -> new MaterialItems.Bow(material, - combat.durability(material.toolDurability())))); - items.put("crossbow", registerItem(material.name() + "_crossbow", () -> new MaterialItems.Crossbow(material, - new Item.Properties().durability(material.toolDurability())))); - items.put("shield", registerItem(material.name() + "_shield", () -> new MaterialItems.Shield(material, - new Item.Properties().durability(material.shieldDurability())))); - items.put("arrow", registerItem(material.name() + "_arrow", () -> new BaseMetalAmmoItem(material, + items.put("pickaxe", registerItem(material.name() + "_pickaxe", itemProperties -> new MaterialItems.Pickaxe(material, itemProperties))); + items.put("axe", registerItem(material.name() + "_axe", itemProperties -> new MaterialItems.Axe(material, + itemProperties))); + items.put("shovel", registerItem(material.name() + "_shovel", itemProperties -> new MaterialItems.Shovel(material, + itemProperties))); + items.put("hoe", registerItem(material.name() + "_hoe", itemProperties -> new MaterialItems.Hoe(material, + itemProperties))); + items.put("sword", registerItem(material.name() + "_sword", itemProperties -> new MaterialItems.Sword(material, + itemProperties))); + items.put("crackhammer", registerItem(material.name() + "_crackhammer", itemProperties -> new CrackhammerItem(material, + itemProperties))); + items.put("scythe", registerItem(material.name() + "_scythe", itemProperties -> new ScytheItem(material, + itemProperties))); + items.put("shears", registerItem(material.name() + "_shears", itemProperties -> new MaterialItems.Shears(material, + itemProperties.durability(material.toolDurability())))); + items.put("fishing_rod", registerItem(material.name() + "_fishing_rod", itemProperties -> new MaterialItems.FishingRod(material, + itemProperties.durability(material.toolDurability())))); + items.put("bow", registerItem(material.name() + "_bow", itemProperties -> new MaterialItems.Bow(material, + itemProperties.durability(material.toolDurability())))); + items.put("crossbow", registerItem(material.name() + "_crossbow", itemProperties -> new MaterialItems.Crossbow(material, + itemProperties.durability(material.toolDurability())))); + items.put("shield", registerItem(material.name() + "_shield", itemProperties -> new MaterialItems.Shield(material, + itemProperties.durability(material.shieldDurability())))); + items.put("arrow", registerItem(material.name() + "_arrow", itemProperties -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.ARROW, ModEntities.CUSTOM_ARROW::get, - new Item.Properties()))); - items.put("bolt", registerItem(material.name() + "_bolt", () -> new BaseMetalAmmoItem(material, + itemProperties))); + items.put("bolt", registerItem(material.name() + "_bolt", itemProperties -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.BOLT, ModEntities.CUSTOM_BOLT::get, - new Item.Properties()))); + itemProperties))); items.put("rod", registerSimpleMaterialItem(material.name() + "_rod", material)); items.put("gear", registerSimpleMaterialItem(material.name() + "_gear", material)); items.put("horse_armor", registerItem(material.name() + "_horse_armor", - () -> new MaterialItems.HorseArmor(material, new Item.Properties().stacksTo(1)))); + itemProperties -> new MaterialItems.HorseArmor(material, itemProperties.stacksTo(1)))); items.put("helmet", registerArmor(material, EquipmentSlot.HEAD)); items.put("chestplate", registerArmor(material, EquipmentSlot.CHEST)); items.put("leggings", registerArmor(material, EquipmentSlot.LEGS)); @@ -250,17 +258,17 @@ private static RegistryObject registerArmor(MaterialDefinition material, E case FEET -> "boots"; default -> throw new IllegalArgumentException("Not armor: " + slot); }; - return registerItem(id, () -> new MaterialItems.Armor(material, slot, - new Item.Properties())); + return registerItem(id, itemProperties -> new MaterialItems.Armor(material, slot, + itemProperties)); } private static void registerVanillaBits() { Map vanilla = vanillaDefinitions(); RegistryObject charcoalBlock = registerBlock("charcoal_block", - () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.STONE) + () -> new Block(BlockBehaviour.Properties.of().setId(BLOCKS.key("charcoal_block")).mapColor(MapColor.STONE) .sound(SoundType.SAND).requiresCorrectToolForDrops().strength(5.0F)), false); - registerItem("charcoal_block", () -> new MaterialItems.BurnableBlock( - charcoalBlock.get(), 16000, new Item.Properties())); + registerItem("charcoal_block", itemProperties -> new MaterialItems.BurnableBlock( + charcoalBlock.get(), 16000, itemProperties)); registerVanillaDecorative("diamond", vanilla.get("diamond"), List.of("bars", "door", "trapdoor", "button", "slab", "lever", "pressure_plate", "stairs", "wall")); registerVanillaDecorative("emerald", vanilla.get("emerald"), @@ -273,19 +281,19 @@ private static void registerVanillaBits() { List.of("button", "slab", "lever", "stairs", "wall")); registerVanillaDecorative("quartz", vanilla.get("quartz"), List.of("bars", "door", "trapdoor", "button", "lever", "pressure_plate", "wall")); - registerBlock("gold_plate", () -> new PlateBlock(BlockBehaviour.Properties.ofFullCopy(net.minecraft.world.level.block.Blocks.GOLD_BLOCK).noOcclusion()), true); - registerBlock("iron_plate", () -> new PlateBlock(BlockBehaviour.Properties.ofFullCopy(net.minecraft.world.level.block.Blocks.IRON_BLOCK).noOcclusion()), true); + registerBlock("gold_plate", () -> new PlateBlock(BlockBehaviour.Properties.ofFullCopy(net.minecraft.world.level.block.Blocks.GOLD_BLOCK).setId(BLOCKS.key("gold_plate")).noOcclusion()), true); + registerBlock("iron_plate", () -> new PlateBlock(BlockBehaviour.Properties.ofFullCopy(net.minecraft.world.level.block.Blocks.IRON_BLOCK).setId(BLOCKS.key("iron_plate")).noOcclusion()), true); for (String name : List.of("diamond", "emerald", "gold", "iron", "obsidian", "quartz")) { registerVanillaCombatAndUtility(vanilla.get(name)); } for (String name : List.of("diamond", "emerald", "gold", "iron", "obsidian", "quartz", "stone", "wood")) { MaterialDefinition material = vanilla.get(name); - registerItem(name + "_crackhammer", () -> new CrackhammerItem(material, - new Item.Properties())); + registerItem(name + "_crackhammer", itemProperties -> new CrackhammerItem(material, + itemProperties)); registerSimpleMaterialItem(name + "_gear", material); - registerItem(name + "_scythe", () -> new ScytheItem(material, - new Item.Properties())); + registerItem(name + "_scythe", itemProperties -> new ScytheItem(material, + itemProperties)); } for (String name : List.of("coal", "charcoal", "diamond", "emerald", "gold", "iron", "obsidian", "quartz")) { MaterialDefinition material = vanilla.get(name); @@ -316,7 +324,7 @@ private static void registerVanillaDecorative(String name, MaterialDefinition ma if (forms.contains("slab")) { String id = "double_" + name + "_slab"; registerBlock(id, () -> new CompatibilityDoubleSlabBlock( - vanillaDecorativeProperties(name, "slab", material)), false); + vanillaDecorativeProperties(name, "slab", material).setId(BLOCKS.key(id))), false); HIDDEN_BLOCKS.add(id); } } @@ -349,40 +357,40 @@ private static Block vanillaStorageBlock(String name) { private static void registerVanillaCombatAndUtility(MaterialDefinition material) { String name = material.name(); - registerItem(name + "_arrow", () -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.ARROW, - ModEntities.CUSTOM_ARROW::get, new Item.Properties())); - registerItem(name + "_bolt", () -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.BOLT, - ModEntities.CUSTOM_BOLT::get, new Item.Properties())); - registerItem(name + "_bow", () -> new MaterialItems.Bow(material, - new Item.Properties().durability(material.toolDurability()))); - registerItem(name + "_crossbow", () -> new MaterialItems.Crossbow(material, - new Item.Properties().durability(material.toolDurability()))); - registerItem(name + "_fishing_rod", () -> new MaterialItems.FishingRod(material, - new Item.Properties().durability(material.toolDurability()))); + registerItem(name + "_arrow", itemProperties -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.ARROW, + ModEntities.CUSTOM_ARROW::get, itemProperties)); + registerItem(name + "_bolt", itemProperties -> new BaseMetalAmmoItem(material, BaseMetalAmmoItem.Kind.BOLT, + ModEntities.CUSTOM_BOLT::get, itemProperties)); + registerItem(name + "_bow", itemProperties -> new MaterialItems.Bow(material, + itemProperties.durability(material.toolDurability()))); + registerItem(name + "_crossbow", itemProperties -> new MaterialItems.Crossbow(material, + itemProperties.durability(material.toolDurability()))); + registerItem(name + "_fishing_rod", itemProperties -> new MaterialItems.FishingRod(material, + itemProperties.durability(material.toolDurability()))); registerSimpleMaterialItem(name + "_rod", material); if (!name.equals("iron")) { - registerItem(name + "_shears", () -> new MaterialItems.Shears(material, - new Item.Properties().durability(material.toolDurability()))); + registerItem(name + "_shears", itemProperties -> new MaterialItems.Shears(material, + itemProperties.durability(material.toolDurability()))); } - registerItem(name + "_shield", () -> new MaterialItems.Shield(material, - new Item.Properties().durability(material.shieldDurability()))); + registerItem(name + "_shield", itemProperties -> new MaterialItems.Shield(material, + itemProperties.durability(material.shieldDurability()))); // Preserve IDs which were added for vanilla materials by MMDLib. The // vanilla equipment itself remains the canonical tool/armor where present. if (name.equals("emerald") || name.equals("obsidian") || name.equals("quartz")) { - registerItem(name + "_axe", () -> new MaterialItems.Axe(material, new Item.Properties())); - registerItem(name + "_pickaxe", () -> new MaterialItems.Pickaxe(material, new Item.Properties())); - registerItem(name + "_shovel", () -> new MaterialItems.Shovel(material, new Item.Properties())); - registerItem(name + "_hoe", () -> new MaterialItems.Hoe(material, new Item.Properties())); + registerItem(name + "_axe", itemProperties -> new MaterialItems.Axe(material, itemProperties)); + registerItem(name + "_pickaxe", itemProperties -> new MaterialItems.Pickaxe(material, itemProperties)); + registerItem(name + "_shovel", itemProperties -> new MaterialItems.Shovel(material, itemProperties)); + registerItem(name + "_hoe", itemProperties -> new MaterialItems.Hoe(material, itemProperties)); registerArmor(material, EquipmentSlot.HEAD); registerArmor(material, EquipmentSlot.CHEST); registerArmor(material, EquipmentSlot.LEGS); registerArmor(material, EquipmentSlot.FEET); - registerItem(name + "_horse_armor", () -> new MaterialItems.HorseArmor(material, - new Item.Properties().stacksTo(1))); + registerItem(name + "_horse_armor", itemProperties -> new MaterialItems.HorseArmor(material, + itemProperties.stacksTo(1))); } if (name.equals("emerald") || name.equals("obsidian") || name.equals("quartz")) { - registerItem(name + "_sword", () -> new MaterialItems.Sword(material, - new Item.Properties())); + registerItem(name + "_sword", itemProperties -> new MaterialItems.Sword(material, + itemProperties)); } } @@ -415,9 +423,9 @@ private static void registerFluid(String name, int colour, boolean mercury) { RegistryObject[] flowing = new RegistryObject[1]; RegistryObject[] block = new RegistryObject[1]; RegistryObject[] bucket = new RegistryObject[1]; - ResourceLocation still = ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, + Identifier still = Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, mercury ? "block/mercury_still" : "block/molten_metal_still"); - ResourceLocation flow = ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, + Identifier flow = Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, mercury ? "block/mercury_flow" : "block/molten_metal_flow"); RegistryObject type = FLUID_TYPES.register(name, () -> new MetalFluidType( FluidType.Properties.create().density(mercury ? 13594 : 2000) @@ -436,19 +444,19 @@ private static void registerFluid(String name, int colour, boolean mercury) { source[0] = FLUIDS.register(name, () -> new ForgeFlowingFluid.Source(properties)); flowing[0] = FLUIDS.register("flowing_" + name, () -> new ForgeFlowingFluid.Flowing(properties)); block[0] = BLOCKS.register(name, () -> new MoltenMetalBlock(() -> source[0].get(), - BlockBehaviour.Properties.of().mapColor(MapColor.FIRE).liquid().replaceable() - .pushReaction(PushReaction.DESTROY).noCollission().strength(100.0F).noLootTable(), mercury)); + BlockBehaviour.Properties.of().setId(BLOCKS.key(name)).mapColor(MapColor.FIRE).liquid().replaceable() + .pushReaction(PushReaction.DESTROY).noCollision().strength(100.0F).noLootTable(), mercury)); BLOCKS_BY_ID.put(name, block[0]); // Forge 1.12 registered an ItemBlock under every molten block ID. Keep // those hidden inventory IDs so old stacks can survive a world upgrade. - registerItem(name, () -> new BlockItem(block[0].get(), new Item.Properties())); - bucket[0] = registerItem(name + "_bucket", () -> new BaseMetalBucketItem(() -> source[0].get(), - new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + registerItem(name, itemProperties -> new BlockItem(block[0].get(), itemProperties)); + bucket[0] = registerItem(name + "_bucket", itemProperties -> new BaseMetalBucketItem(() -> source[0].get(), + itemProperties.craftRemainder(Items.BUCKET).stacksTo(1))); FLUID_CONTENT.put(name, new FluidContent(source[0], flowing[0], block[0], bucket[0])); } private static RegistryObject registerAnvil(String id, BlockBehaviour.Properties properties) { - return registerBlock(id, () -> new BaseMetalAnvilBlock(properties), true); + return registerBlock(id, () -> new BaseMetalAnvilBlock(properties.setId(BLOCKS.key(id))), true); } private static RegistryObject registerBlock(String id, Supplier factory, boolean hasItem) { @@ -456,14 +464,14 @@ private static RegistryObject registerBlock(String id, Supplier block = BLOCKS.register(id, factory); BLOCKS_BY_ID.put(id, block); if (hasItem) { - registerItem(id, () -> new BlockItem(block.get(), new Item.Properties())); + registerItem(id, itemProperties -> new BlockItem(block.get(), itemProperties)); } return block; } private static RegistryObject registerSimpleMaterialItem(String id, MaterialDefinition material) { - return registerItem(id, () -> new MaterialItems.Basic(material, burnTime(id), - new Item.Properties())); + return registerItem(id, itemProperties -> new MaterialItems.Basic(material, burnTime(id), + itemProperties)); } private static int burnTime(String id) { @@ -481,9 +489,10 @@ private static boolean isLegacyFuelMaterial(String name) { return false; } - private static RegistryObject registerItem(String id, Supplier factory) { + private static RegistryObject registerItem(String id, Function factory) { if (ITEMS_BY_ID.containsKey(id)) throw new IllegalStateException("Duplicate item " + id); - RegistryObject item = ITEMS.register(id, factory); + RegistryObject item = ITEMS.register(id, + () -> factory.apply(new MaterialProperties().setId(ITEMS.key(id)))); ITEMS_BY_ID.put(id, item); return item; } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/MoltenMetalBlock.java b/src/main/java/zone/moddev/mc/basemetals/content/MoltenMetalBlock.java index 6988b83a3..58c4b3d61 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/MoltenMetalBlock.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/MoltenMetalBlock.java @@ -23,11 +23,12 @@ public MoltenMetalBlock(Supplier fluid, Properties prope } @Override - public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { - super.entityInside(state, level, pos, entity); - if (mercury && !level.isClientSide && BaseMetalsConfig.MERCURY_EFFECTS.get() + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, + net.minecraft.world.entity.InsideBlockEffectApplier effects, boolean intersects) { + super.entityInside(state, level, pos, entity, effects, intersects); + if (mercury && !level.isClientSide() && BaseMetalsConfig.MERCURY_EFFECTS.get() && entity instanceof LivingEntity living && level.random.nextInt(32) == 0) { - living.addEffect(new MobEffectInstance(MobEffects.CONFUSION, 30 * 20, 2)); + living.addEffect(new MobEffectInstance(MobEffects.NAUSEA, 30 * 20, 2)); } } } diff --git a/src/main/java/zone/moddev/mc/basemetals/content/PlateBlock.java b/src/main/java/zone/moddev/mc/basemetals/content/PlateBlock.java index 2c85a7171..39689be49 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/PlateBlock.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/PlateBlock.java @@ -10,14 +10,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.Vec3; import net.minecraft.util.Mth; public final class PlateBlock extends Block { - public static final DirectionProperty FACING = BlockStateProperties.FACING; + public static final EnumProperty FACING = BlockStateProperties.FACING; private static final VoxelShape[] SHAPES = { box(0, 15, 0, 16, 16, 16), box(0, 0, 0, 16, 1, 16), box(0, 0, 15, 16, 16, 16), box(0, 0, 0, 16, 16, 1), diff --git a/src/main/java/zone/moddev/mc/basemetals/content/ScytheItem.java b/src/main/java/zone/moddev/mc/basemetals/content/ScytheItem.java index b07f421a1..40b49308c 100644 --- a/src/main/java/zone/moddev/mc/basemetals/content/ScytheItem.java +++ b/src/main/java/zone/moddev/mc/basemetals/content/ScytheItem.java @@ -4,7 +4,9 @@ import zone.moddev.mc.basemetals.ModTags; import net.minecraft.core.BlockPos; -import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.component.TooltipDisplay; +import java.util.function.Consumer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.network.chat.Component; @@ -14,7 +16,7 @@ import java.util.List; import javax.annotation.Nullable; -public final class ScytheItem extends DiggerItem implements MaterialBacked { +public final class ScytheItem extends Item implements MaterialBacked { /** * The nested calls use the ordinary server break path so every affected * block still fires Forge's protection event and receives vanilla drops. @@ -25,8 +27,8 @@ public final class ScytheItem extends DiggerItem implements MaterialBacked { private final MaterialDefinition material; public ScytheItem(MaterialDefinition material, Properties properties) { - super(new MaterialTier(material), ModTags.SCYTHE_HARVESTABLE, - properties.attributes(DiggerItem.createAttributes(new MaterialTier(material), 0.0F, 0.0F))); + super(properties.tool(new MaterialTier(material).toolMaterial(), + ModTags.SCYTHE_HARVESTABLE, 0.0F, 0.0F, 0.0F)); this.material = material; } @@ -34,7 +36,7 @@ public ScytheItem(MaterialDefinition material, Properties properties) { @Override public boolean onBlockStartBreak(ItemStack stack, BlockPos position, Player player) { - if (player.level().isClientSide || !(player instanceof ServerPlayer serverPlayer) + if (player.level().isClientSide() || !(player instanceof ServerPlayer serverPlayer) || HARVESTING.get()) { return false; } @@ -62,7 +64,7 @@ public boolean onBlockStartBreak(ItemStack stack, BlockPos position, Player play @Override public void appendHoverText(ItemStack stack, net.minecraft.world.item.Item.TooltipContext context, - List tooltip, TooltipFlag flag) { + TooltipDisplay display, Consumer tooltip, TooltipFlag flag) { MaterialItems.addToolTooltip(material, tooltip); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/entity/MaterialProjectile.java b/src/main/java/zone/moddev/mc/basemetals/entity/MaterialProjectile.java index 5769d56ea..54c2a01c1 100644 --- a/src/main/java/zone/moddev/mc/basemetals/entity/MaterialProjectile.java +++ b/src/main/java/zone/moddev/mc/basemetals/entity/MaterialProjectile.java @@ -7,7 +7,7 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.entity.projectile.ItemSupplier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -53,27 +53,44 @@ public ItemStack getItem() { } @Override - public void addAdditionalSaveData(CompoundTag tag) { + public void addAdditionalSaveData(net.minecraft.world.level.storage.ValueOutput tag) { super.addAdditionalSaveData(tag); - if (!ammunition.isEmpty()) tag.put("Ammunition", ammunition.save(registryAccess())); + if (!ammunition.isEmpty()) tag.store("Ammunition", ItemStack.CODEC, ammunition); } @Override - public void readAdditionalSaveData(CompoundTag tag) { + public void readAdditionalSaveData(net.minecraft.world.level.storage.ValueInput tag) { super.readAdditionalSaveData(tag); - CompoundTag saved = tag.getCompound("Ammunition"); + CompoundTag saved = tag.read("Ammunition", CompoundTag.CODEC).orElseGet(CompoundTag::new); if (saved.contains("Count")) { saved = (CompoundTag) net.minecraft.util.datafix.DataFixers.getDataFixer().update( net.minecraft.util.datafix.fixes.References.ITEM_STACK, new com.mojang.serialization.Dynamic<>(net.minecraft.nbt.NbtOps.INSTANCE, saved), - 3465, net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion()).getValue(); + 3465, net.minecraft.SharedConstants.getCurrentVersion().dataVersion().version()).getValue(); } - ammunition = ItemStack.parseOptional(registryAccess(), saved); + ammunition = decodeAmmunition(saved); if (!ammunition.isEmpty()) setPickupItemStack(ammunition); } - @Override public void writeSpawnData(FriendlyByteBuf buffer) { buffer.writeNbt((CompoundTag) ammunition.saveOptional(registryAccess())); } - @Override public void readSpawnData(FriendlyByteBuf additionalData) { ammunition = ItemStack.parseOptional(registryAccess(), additionalData.readNbt()); } + private ItemStack decodeAmmunition(CompoundTag saved) { + if (saved == null || saved.isEmpty()) return ItemStack.EMPTY; + + return ItemStack.CODEC.parse(registryAccess().createSerializationContext( + net.minecraft.nbt.NbtOps.INSTANCE), saved).getOrThrow(); + } + + @Override + public void writeSpawnData(FriendlyByteBuf buffer) { + buffer.writeNbt(ammunition.isEmpty() ? new CompoundTag() + : (CompoundTag) ItemStack.CODEC.encodeStart(registryAccess().createSerializationContext( + net.minecraft.nbt.NbtOps.INSTANCE), ammunition).getOrThrow()); + } + + @Override + public void readSpawnData(FriendlyByteBuf buffer) { + ammunition = decodeAmmunition(buffer.readNbt()); + if (!ammunition.isEmpty()) setPickupItemStack(ammunition); + } /** * AbstractArrow's vanilla packet omits Forge additional spawn data. The diff --git a/src/main/java/zone/moddev/mc/basemetals/entity/ModEntities.java b/src/main/java/zone/moddev/mc/basemetals/entity/ModEntities.java index 6631905e0..6c739e6a0 100644 --- a/src/main/java/zone/moddev/mc/basemetals/entity/ModEntities.java +++ b/src/main/java/zone/moddev/mc/basemetals/entity/ModEntities.java @@ -4,7 +4,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -15,12 +15,12 @@ public final class ModEntities { public static final RegistryObject> CUSTOM_ARROW = ENTITIES.register( "custom_arrow", () -> EntityType.Builder.of(MaterialProjectile::new, MobCategory.MISC) .sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20) - .build(BaseMetals.MOD_ID + ":custom_arrow")); + .build(ENTITIES.key("custom_arrow"))); public static final RegistryObject> CUSTOM_BOLT = ENTITIES.register( "custom_bolt", () -> EntityType.Builder.of(MaterialProjectile::new, MobCategory.MISC) .sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20) - .build(BaseMetals.MOD_ID + ":custom_bolt")); + .build(ENTITIES.key("custom_bolt"))); private ModEntities() {} - public static void register(IEventBus bus) { ENTITIES.register(bus); } + public static void register(BusGroup bus) { ENTITIES.register(bus); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/loot/AppendLootTableModifier.java b/src/main/java/zone/moddev/mc/basemetals/loot/AppendLootTableModifier.java index 72776f2da..da4e0058a 100644 --- a/src/main/java/zone/moddev/mc/basemetals/loot/AppendLootTableModifier.java +++ b/src/main/java/zone/moddev/mc/basemetals/loot/AppendLootTableModifier.java @@ -4,7 +4,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; @@ -13,18 +13,19 @@ public final class AppendLootTableModifier extends LootModifier { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> - codecStart(instance).and(ResourceLocation.CODEC.fieldOf("table").forGetter(modifier -> modifier.table)) + codecStart(instance).and(Identifier.CODEC.fieldOf("table").forGetter(modifier -> modifier.table)) .apply(instance, AppendLootTableModifier::new)); - private final ResourceLocation table; + private final Identifier table; - public AppendLootTableModifier(LootItemCondition[] conditions, ResourceLocation table) { + public AppendLootTableModifier(LootItemCondition[] conditions, Identifier table) { super(conditions); this.table = table; } @Override - protected ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { - context.getResolver().get(net.minecraft.core.registries.Registries.LOOT_TABLE, net.minecraft.resources.ResourceKey.create( + protected ObjectArrayList doApply(net.minecraft.world.level.storage.loot.LootTable source, + ObjectArrayList generatedLoot, LootContext context) { + context.getResolver().get(net.minecraft.resources.ResourceKey.create( net.minecraft.core.registries.Registries.LOOT_TABLE, table)).orElseThrow().value().getRandomItemsRaw(context, item -> { if (zone.moddev.mc.basemetals.config.ContentPolicy.active().allows(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(item.getItem()).toString())) { generatedLoot.add(item); diff --git a/src/main/java/zone/moddev/mc/basemetals/loot/ModLoot.java b/src/main/java/zone/moddev/mc/basemetals/loot/ModLoot.java index e082288c3..6ebe77b2e 100644 --- a/src/main/java/zone/moddev/mc/basemetals/loot/ModLoot.java +++ b/src/main/java/zone/moddev/mc/basemetals/loot/ModLoot.java @@ -4,7 +4,7 @@ import com.mojang.serialization.MapCodec; import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -16,5 +16,5 @@ public final class ModLoot { SERIALIZERS.register("add_table", () -> AppendLootTableModifier.CODEC); private ModLoot() {} - public static void register(IEventBus bus) { SERIALIZERS.register(bus); } + public static void register(BusGroup bus) { SERIALIZERS.register(bus); } } diff --git a/src/main/java/zone/moddev/mc/basemetals/migration/Legacy112WorldMigrator.java b/src/main/java/zone/moddev/mc/basemetals/migration/Legacy112WorldMigrator.java index feaf84490..09f26f0c6 100644 --- a/src/main/java/zone/moddev/mc/basemetals/migration/Legacy112WorldMigrator.java +++ b/src/main/java/zone/moddev/mc/basemetals/migration/Legacy112WorldMigrator.java @@ -42,7 +42,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.MinecraftServer; import net.minecraft.util.datafix.DataFixTypes; import net.minecraft.util.datafix.DataFixers; @@ -97,16 +97,16 @@ static void beginWorldLoad() { static void prepareWorld(Path levelDat, CompoundTag root) { if (!isLegacyLevel(root)) return; - CompoundTag data = root.getCompound("Data"); + CompoundTag data = root.getCompoundOrEmpty("Data"); preparedWorld = levelDat.toAbsolutePath().normalize().getParent(); - preparedVersion = data.getInt("DataVersion"); - preparedPlayer = data.contains("Player", Tag.TAG_COMPOUND) ? data.getCompound("Player").copy() : null; + preparedVersion = data.getIntOr("DataVersion", 0); + preparedPlayer = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(data, "Player", Tag.TAG_COMPOUND) ? data.getCompoundOrEmpty("Player").copy() : null; } private static boolean isLegacyLevel(CompoundTag root) { - CompoundTag data = root.getCompound("Data"); - return data.contains("DataVersion", Tag.TAG_ANY_NUMERIC) - && data.getInt("DataVersion") <= LAST_SUPPORTED_LEGACY_DATA_VERSION; + CompoundTag data = root.getCompoundOrEmpty("Data"); + return zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(data, "DataVersion", 99) + && data.getIntOr("DataVersion", 0) <= LAST_SUPPORTED_LEGACY_DATA_VERSION; } private static boolean hasLegacySource(Path root) throws IOException { @@ -193,22 +193,22 @@ public static void refreshLoadedSingleplayerPlayer(MinecraftServer server, Path CompoundTag loaded = server.getWorldData().getLoadedPlayerTag(); if (loaded == null) return; CompoundTag level = LegacyNbt.readCompressed(worldRoot.resolve("level.dat").toFile()); - CompoundTag data = level.getCompound("Data"); - if (!data.contains("Player", Tag.TAG_COMPOUND)) return; - int version = data.getInt("DataVersion"); + CompoundTag data = level.getCompoundOrEmpty("Data"); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(data, "Player", Tag.TAG_COMPOUND)) return; + int version = data.getIntOr("DataVersion", 0); CompoundTag corrected = DataFixTypes.PLAYER.updateToCurrentVersion(DataFixers.getDataFixer(), - data.getCompound("Player"), version); - for (String key : List.copyOf(loaded.getAllKeys())) loaded.remove(key); + data.getCompoundOrEmpty("Player"), version); + for (String key : List.copyOf(loaded.keySet())) loaded.remove(key); loaded.merge(corrected); } private static Map oldBlockIds(CompoundTag level) { - CompoundTag registries = level.getCompound("FML").getCompound("Registries"); - ListTag ids = registries.getCompound("minecraft:blocks").getList("ids", Tag.TAG_COMPOUND); + CompoundTag registries = level.getCompoundOrEmpty("FML").getCompoundOrEmpty("Registries"); + ListTag ids = registries.getCompoundOrEmpty("minecraft:blocks").getListOrEmpty("ids"); Map result = new LinkedHashMap<>(); for (Tag value : ids) { CompoundTag entry = (CompoundTag) value; - result.put(entry.getInt("V"), entry.getString("K")); + result.put(entry.getIntOr("V", 0), entry.getStringOr("K", "")); } return result; } @@ -218,7 +218,7 @@ private static Map legacyBlockIds(Path root) throws IOException Path file = root.resolve(fileName); if (!Files.isRegularFile(file)) continue; CompoundTag candidate = LegacyNbt.readCompressed(file.toFile()); - int dataVersion = candidate.getCompound("Data").getInt("DataVersion"); + int dataVersion = candidate.getCompoundOrEmpty("Data").getIntOr("DataVersion", 0); if (dataVersion > LAST_SUPPORTED_LEGACY_DATA_VERSION && !fileName.equals("basemetals-legacy-registry.dat")) continue; Map ids = oldBlockIds(candidate); @@ -357,19 +357,19 @@ record = Arrays.copyOfRange(source, position, position + 4 + length); } private static ChunkConversion convertChunk(CompoundTag chunk, Map ids) throws IOException { - int sourceVersion = chunk.getInt("DataVersion"); + int sourceVersion = chunk.getIntOr("DataVersion", 0); if (sourceVersion > LAST_SUPPORTED_LEGACY_DATA_VERSION) { return new ChunkConversion(false, 0, 0, 0, 0, 0, chunk); } ItemMigration itemMigration = convertLegacyItems(chunk); - CompoundTag level = chunk.getCompound("Level"); - ListTag sections = level.getList("Sections", Tag.TAG_COMPOUND); + CompoundTag level = chunk.getCompoundOrEmpty("Level"); + ListTag sections = level.getListOrEmpty("Sections"); List savedBlocks = new ArrayList<>(); int externalStates = 0; for (Tag value : sections) { CompoundTag section = (CompoundTag) value; - if (!section.contains("Blocks", Tag.TAG_BYTE_ARRAY)) continue; + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(section, "Blocks", Tag.TAG_BYTE_ARRAY)) continue; SectionSnapshot snapshot = snapshotSection(section, ids); savedBlocks.addAll(snapshot.blocks()); externalStates += snapshot.externalStates(); @@ -433,9 +433,9 @@ private static ItemMigration restoreRewrittenSingleplayerPlayer(Path root) throw } CompoundTag current = LegacyNbt.readCompressed(currentFile.toFile()); - CompoundTag currentData = current.getCompound("Data"); - if (currentData.getInt("DataVersion") <= LAST_SUPPORTED_LEGACY_DATA_VERSION - || !currentData.contains("Player", Tag.TAG_COMPOUND)) { + CompoundTag currentData = current.getCompoundOrEmpty("Data"); + if (currentData.getIntOr("DataVersion", 0) <= LAST_SUPPORTED_LEGACY_DATA_VERSION + || !zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(currentData, "Player", Tag.TAG_COMPOUND)) { return ItemMigration.NONE; } @@ -457,10 +457,10 @@ private static ItemMigration convertLegacyItems(Tag value) { int convertedItemAliases = 0; int convertedDamageValues = 0; if (value instanceof CompoundTag compound) { - if (compound.getString("id").equalsIgnoreCase("forge:bucketfilled") - && compound.contains("tag", Tag.TAG_COMPOUND)) { - CompoundTag itemTag = compound.getCompound("tag"); - String fluid = itemTag.getString("FluidName"); + if (compound.getStringOr("id", "").equalsIgnoreCase("forge:bucketfilled") + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "tag", Tag.TAG_COMPOUND)) { + CompoundTag itemTag = compound.getCompoundOrEmpty("tag"); + String fluid = itemTag.getStringOr("FluidName", ""); String target = MissingMappings.fluidTargetPath(fluid); if (ModContent.fluids().containsKey(target)) { compound.putString("id", BaseMetals.MOD_ID + ":" + target + "_bucket"); @@ -470,22 +470,22 @@ private static ItemMigration convertLegacyItems(Tag value) { convertedBuckets++; } } else { - ResourceLocation oldId = ResourceLocation.tryParse(compound.getString("id")); + Identifier oldId = Identifier.tryParse(compound.getStringOr("id", "")); if (oldId != null && (oldId.getNamespace().equals(BaseMetals.MOD_ID) || oldId.getNamespace().equals("mmdlib")) - && compound.contains("Count", Tag.TAG_ANY_NUMERIC)) { - ResourceLocation targetId = MissingMappings.itemTargetId(oldId.getPath()); + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "Count", 99)) { + Identifier targetId = MissingMappings.itemTargetId(oldId.getPath()); net.minecraft.world.item.Item item = ForgeRegistries.ITEMS.getValue(targetId); if (item != null && !oldId.equals(targetId)) { compound.putString("id", targetId.toString()); convertedItemAliases++; } - int damage = compound.getInt("Damage"); + int damage = compound.getIntOr("Damage", 0); if (item != null && item.getDefaultInstance().isDamageableItem() && damage > 0 - && compound.contains("Damage", Tag.TAG_ANY_NUMERIC)) { - CompoundTag itemTag = compound.contains("tag", Tag.TAG_COMPOUND) - ? compound.getCompound("tag") : new CompoundTag(); - if (!itemTag.contains("Damage", Tag.TAG_ANY_NUMERIC)) { + && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "Damage", 99)) { + CompoundTag itemTag = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "tag", Tag.TAG_COMPOUND) + ? compound.getCompoundOrEmpty("tag") : new CompoundTag(); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(itemTag, "Damage", 99)) { itemTag.putInt("Damage", damage); compound.put("tag", itemTag); convertedDamageValues++; @@ -493,7 +493,7 @@ private static ItemMigration convertLegacyItems(Tag value) { } } } - for (String key : List.copyOf(compound.getAllKeys())) { + for (String key : List.copyOf(compound.keySet())) { Tag child = compound.get(key); if (child != null) { ItemMigration childMigration = convertLegacyItems(child); @@ -524,11 +524,11 @@ private static void writeCompressedAtomically(Path file, CompoundTag data) throw } static CompoundTag stateAtForTest(CompoundTag chunk, int sectionY, int index) throws IOException { - ListTag sections = chunk.getCompound("Level").getList("Sections", Tag.TAG_COMPOUND); + ListTag sections = chunk.getCompoundOrEmpty("Level").getListOrEmpty("Sections"); for (Tag value : sections) { CompoundTag section = (CompoundTag) value; - if (section.getByte("Y") != sectionY) continue; - ListTag palette = section.getList("Palette", Tag.TAG_COMPOUND); + if (section.getByteOr("Y", (byte) 0) != sectionY) continue; + ListTag palette = section.getListOrEmpty("Palette"); int[] values = unpackBlockStates(section, palette.size()); return ((CompoundTag) palette.get(values[index])).copy(); } @@ -537,10 +537,10 @@ static CompoundTag stateAtForTest(CompoundTag chunk, int sectionY, int index) th private static SectionSnapshot snapshotSection(CompoundTag section, Map ids) throws IOException { - byte[] blocks = section.getByteArray("Blocks"); - byte[] metadata = section.getByteArray("Data"); - byte[] add = section.contains("Add", Tag.TAG_BYTE_ARRAY) ? section.getByteArray("Add") : null; - int sectionY = section.getByte("Y"); + byte[] blocks = section.getByteArray("Blocks").orElseGet(() -> new byte[0]); + byte[] metadata = section.getByteArray("Data").orElseGet(() -> new byte[0]); + byte[] add = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(section, "Add", Tag.TAG_BYTE_ARRAY) ? section.getByteArray("Add").orElseGet(() -> new byte[0]) : null; + int sectionY = section.getByteOr("Y", (byte) 0); List savedBlocks = new ArrayList<>(); int externalStates = 0; @@ -562,10 +562,10 @@ private static SectionSnapshot snapshotSection(CompoundTag section, Map savedBlocks) throws IOException { Map targetSections = new HashMap<>(); - ListTag sections = chunk.getCompound("Level").getList("Sections", Tag.TAG_COMPOUND); + ListTag sections = chunk.getCompoundOrEmpty("Level").getListOrEmpty("Sections"); for (Tag value : sections) { CompoundTag section = (CompoundTag) value; - targetSections.put((int) section.getByte("Y"), section); + targetSections.put((int) section.getByteOr("Y", (byte) 0), section); } Map byPosition = new HashMap<>(); @@ -580,7 +580,7 @@ private static void restoreSavedBlocks(CompoundTag chunk, List save if (section == null) { throw new IOException("Mojang's flattening data fix removed legacy section Y=" + entry.getKey()); } - ListTag palette = section.getList("Palette", Tag.TAG_COMPOUND); + ListTag palette = section.getListOrEmpty("Palette"); if (palette.isEmpty()) { throw new IOException("Mojang's flattening data fix produced an empty palette at section Y=" + entry.getKey()); @@ -612,7 +612,7 @@ private static Map> snapshotLegacyBlockEntities( for (LegacyBlock block : savedBlocks) savedPositions.add(block.positionKey()); Map> result = new LinkedHashMap<>(); - for (Tag value : level.getList("TileEntities", Tag.TAG_COMPOUND)) { + for (Tag value : level.getListOrEmpty("TileEntities")) { CompoundTag blockEntity = (CompoundTag) value; long position = localPositionKey(blockEntity); if (!savedPositions.contains(position)) continue; @@ -626,9 +626,9 @@ private static void restoreLegacyBlockEntities(CompoundTag chunk, List savedPositions = new HashSet<>(); for (LegacyBlock block : savedBlocks) savedPositions.add(block.positionKey()); - CompoundTag level = chunk.getCompound("Level"); + CompoundTag level = chunk.getCompoundOrEmpty("Level"); ListTag restored = new ListTag(); - for (Tag value : level.getList("TileEntities", Tag.TAG_COMPOUND)) { + for (Tag value : level.getListOrEmpty("TileEntities")) { CompoundTag blockEntity = (CompoundTag) value; if (!savedPositions.contains(localPositionKey(blockEntity))) restored.add(blockEntity.copy()); } @@ -639,13 +639,13 @@ private static void restoreLegacyBlockEntities(CompoundTag chunk, List new long[0]); if (packed.length == 0 && paletteSize == 1) return values; int bits = bitsForPalette(paletteSize); int requiredLongs = (int) Math.ceil(values.length * (double) bits / 64.0D); @@ -689,11 +689,11 @@ private static int bitsForPalette(int paletteSize) { private static CompoundTag restoredState(LegacyBlock legacy, Map byPosition) throws IOException { String normalizedName = normalizeLegacyRegistryName(legacy.name()); - ResourceLocation oldId = ResourceLocation.tryParse(normalizedName); + Identifier oldId = Identifier.tryParse(normalizedName); if (oldId == null) throw new IOException("Invalid legacy block registry name " + legacy.name()); if (oldId.getNamespace().equals(BaseMetals.MOD_ID) || oldId.getNamespace().equals("mmdlib")) { String path = MissingMappings.blockTargetPath(oldId.getPath()); - ResourceLocation targetId = ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, path); + Identifier targetId = Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, path); Block block = ForgeRegistries.BLOCKS.getValue(targetId); if (block == null) throw new IOException("No 1.18 block exists for legacy block " + legacy.name()); BlockState state = stateForLegacyMetadata(block, legacy.metadata()); @@ -721,7 +721,7 @@ private static CompoundTag restoredState(LegacyBlock legacy, Map Codec acceptLegacyPayload(Codec current) { + Codec legacy = CompoundTag.CODEC.validate(payload -> { + for (String key : payload.keySet()) { + Identifier id = Identifier.tryParse(key); + + // Capability owners have namespaced IDs. A broken current wrapper is not an old payload. + if (id == null || !id.toString().equals(key)) { + return DataResult.error(() -> "Not a legacy world-capability payload"); + } + } + + return DataResult.success(payload); + }); + + return Codec.withAlternative(current, legacy, payload -> { + CompoundTag wrapper = new CompoundTag(); + wrapper.put("data", payload.copy()); + return current.parse(NbtOps.INSTANCE, wrapper).getOrThrow(); + }); + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHook.java b/src/main/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHook.java index dd65498e6..288cb02d7 100644 --- a/src/main/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHook.java +++ b/src/main/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHook.java @@ -64,7 +64,7 @@ import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.level.block.state.properties.StairsShape; import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.datafix.fixes.BlockStateData; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.registries.ForgeRegistries; @@ -75,10 +75,10 @@ * durability data before Minecraft reads the items. */ public final class LegacyWorldDataHook { - private static final ResourceLocation BLOCK_REGISTRY = ResourceLocation.fromNamespaceAndPath("minecraft", "blocks"); + private static final Identifier BLOCK_REGISTRY = Identifier.fromNamespaceAndPath("minecraft", "blocks"); private static final Map LEGACY_WORLD_DATA = new ConcurrentHashMap(); private static final BitSet LEGACY_BASE_METALS_BLOCK_IDS = new BitSet(); - private static volatile Map legacyTerrainChunks = Collections.emptyMap(); + private static volatile Map legacyTerrainChunks = Collections.emptyMap(); private static final Map LEGACY_BASE_METALS_BLOCK_COUNTS = new ConcurrentHashMap(); private static final Map VANILLA_BLOCK_ENTITY_IDS = vanillaBlockEntityIds(); @@ -88,7 +88,7 @@ public final class LegacyWorldDataHook { private LegacyWorldDataHook() {} - /** Called by the coremod before Forge reads level.dat. */ + /** Captures the current level.dat before vanilla converts it. */ public static synchronized void prepareLegacyWorld(File levelDat) { Legacy112WorldMigrator.beginWorldLoad(); legacyWorldActive = false; @@ -99,12 +99,12 @@ public static synchronized void prepareLegacyWorld(File levelDat) { if (source == null) return; try (FileInputStream input = new FileInputStream(source)) { CompoundTag root = LegacyNbt.readCompressed(input); - if (root.getCompound("Data").getInt("DataVersion") < 2834) { + if (root.getCompoundOrEmpty("Data").getIntOr("DataVersion", 0) < 2834) { legacyWorldActive = true; indexLegacyChunks(levelDat.getParentFile()); } - if (root.contains("FML", 10)) { - prepareLegacyData(levelDat.getParentFile(), root.getCompound("FML")); + if (zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(root, "FML", 10)) { + prepareLegacyData(levelDat.getParentFile(), root.getCompoundOrEmpty("FML")); } migrateLoosePlayerData(levelDat, root); } catch (IOException exception) { @@ -132,8 +132,8 @@ private static void prepareLevelMetadata(File levelDat) { } private static void preserveLegacySource(File levelDat, CompoundTag root) throws IOException { - CompoundTag data = root.getCompound("Data"); - if (!data.contains("DataVersion", Tag.TAG_ANY_NUMERIC) || data.getInt("DataVersion") >= 2834) return; + CompoundTag data = root.getCompoundOrEmpty("Data"); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(data, "DataVersion", 99) || data.getIntOr("DataVersion", 0) >= 2834) return; Path sidecar = levelDat.toPath().resolveSibling(REGISTRY_SIDECAR); if (Files.exists(sidecar)) return; @@ -142,9 +142,9 @@ private static void preserveLegacySource(File levelDat, CompoundTag root) throws // Player data belongs to this load only and is deliberately not saved here. CompoundTag saved = new CompoundTag(); CompoundTag source = new CompoundTag(); - source.putInt("DataVersion", data.getInt("DataVersion")); + source.putInt("DataVersion", data.getIntOr("DataVersion", 0)); saved.put("Data", source); - if (root.contains("FML", Tag.TAG_COMPOUND)) saved.put("FML", root.getCompound("FML").copy()); + if (zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(root, "FML", Tag.TAG_COMPOUND)) saved.put("FML", root.getCompoundOrEmpty("FML").copy()); try (java.io.OutputStream output = Files.newOutputStream(sidecar, StandardOpenOption.CREATE_NEW)) { LegacyNbt.writeCompressed(saved, output); @@ -154,27 +154,27 @@ private static void preserveLegacySource(File levelDat, CompoundTag root) throws static boolean removeRetiredVanillaProfessionRegistry(CompoundTag root) { boolean changed = false; for (String namespace : new String[] {"fml", "FML"}) { - CompoundTag registries = root.getCompound(namespace).getCompound("Registries"); + CompoundTag registries = root.getCompoundOrEmpty(namespace).getCompoundOrEmpty("Registries"); String key = "minecraft:villagerprofessions"; - if (!registries.contains(key, 10)) continue; - CompoundTag snapshot = registries.getCompound(key); - if (!snapshot.contains("ids", 9)) continue; + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(registries, key, 10)) continue; + CompoundTag snapshot = registries.getCompoundOrEmpty(key); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(snapshot, "ids", 9)) continue; boolean vanillaOnly = true; for (Tag entry : (ListTag) snapshot.get("ids")) { if (!(entry instanceof CompoundTag)) { vanillaOnly = false; continue; } - String name = ((CompoundTag) entry).getString("K"); + String name = ((CompoundTag) entry).getStringOr("K", ""); if (!Arrays.asList("minecraft:farmer", "minecraft:librarian", "minecraft:priest", "minecraft:smith", "minecraft:butcher", "minecraft:nitwit").contains(name)) { vanillaOnly = false; } } for (String list : new String[] {"aliases", "overrides", "dummied"}) { - if (snapshot.contains(list, 9) && !((ListTag) snapshot.get(list)).isEmpty()) vanillaOnly = false; + if (zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(snapshot, list, 9) && !((ListTag) snapshot.get(list)).isEmpty()) vanillaOnly = false; } - if (snapshot.getIntArray("blocked").length > 0) vanillaOnly = false; + if (snapshot.getIntArray("blocked").orElseGet(() -> new int[0]).length > 0) vanillaOnly = false; if (!vanillaOnly) continue; // Vanilla converts the villagers themselves. This retired Forge registry @@ -206,15 +206,15 @@ static boolean removeObsoleteVanillaBiomeSnapshot(CompoundTag root) { + "windswept_forest windswept_gravelly_hills windswept_hills windswept_savanna wooded_badlands").split(" ")); boolean changed = false; for (String namespace : new String[] {"fml", "FML"}) { - CompoundTag registries = root.getCompound(namespace).getCompound("Registries"); + CompoundTag registries = root.getCompoundOrEmpty(namespace).getCompoundOrEmpty("Registries"); String key = "minecraft:worldgen/biome"; - if (!registries.contains(key, 10)) continue; - CompoundTag snapshot = registries.getCompound(key); - if (!snapshot.contains("ids", 9) || snapshot.getIntArray("blocked").length != 0) continue; + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(registries, key, 10)) continue; + CompoundTag snapshot = registries.getCompoundOrEmpty(key); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(snapshot, "ids", 9) || snapshot.getIntArray("blocked").orElseGet(() -> new int[0]).length != 0) continue; boolean vanillaOnly = true; for (Tag entry : (ListTag) snapshot.get("ids")) { if (!(entry instanceof CompoundTag id)) { vanillaOnly = false; break; } - String name = id.getString("K"); + String name = id.getStringOr("K", ""); if (!name.startsWith("minecraft:") || !known.contains(name.substring("minecraft:".length()))) { vanillaOnly = false; break; @@ -233,23 +233,23 @@ static boolean removeObsoleteVanillaBiomeSnapshot(CompoundTag root) { } static boolean migrateRemovedVanillaBiomeSources(CompoundTag root) { - CompoundTag data = root.getCompound("Data"); - if (data.getInt("DataVersion") >= 2834) return false; + CompoundTag data = root.getCompoundOrEmpty("Data"); + if (data.getIntOr("DataVersion", 0) >= 2834) return false; - CompoundTag dimensions = data.getCompound("WorldGenSettings").getCompound("dimensions"); + CompoundTag dimensions = data.getCompoundOrEmpty("WorldGenSettings").getCompoundOrEmpty("dimensions"); boolean changed = false; - for (String id : dimensions.getAllKeys()) { + for (String id : dimensions.keySet()) { // Minecraft handles the main Overworld itself, but skips custom dimensions. if ("minecraft:overworld".equals(id)) continue; - CompoundTag generator = dimensions.getCompound(id).getCompound("generator"); - CompoundTag source = generator.getCompound("biome_source"); - if (!"minecraft:noise".equals(generator.getString("type")) - || !"minecraft:vanilla_layered".equals(source.getString("type"))) continue; + CompoundTag generator = dimensions.getCompoundOrEmpty(id).getCompoundOrEmpty("generator"); + CompoundTag source = generator.getCompoundOrEmpty("biome_source"); + if (!"minecraft:noise".equals(generator.getStringOr("type", "")) + || !"minecraft:vanilla_layered".equals(source.getStringOr("type", ""))) continue; // Use Minecraft's 1.18 replacement for this removed vanilla biome source. // Modded biome sources and noise settings stay untouched. - if (source.getBoolean("large_biomes") && "minecraft:overworld".equals(generator.getString("settings"))) { + if (source.getBooleanOr("large_biomes", false) && "minecraft:overworld".equals(generator.getStringOr("settings", ""))) { generator.putString("settings", "minecraft:large_biomes"); } CompoundTag replacement = new CompoundTag(); @@ -266,11 +266,11 @@ public static synchronized void prepareLegacyChunk(CompoundTag root) { if (root == null) return; migrateLegacyItems(root); migrateWallStates(root); - if (!legacyWorldActive || !root.contains("Level", 10)) return; - CompoundTag level = root.getCompound("Level"); + if (!legacyWorldActive || !zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(root, "Level", 10)) return; + CompoundTag level = root.getCompoundOrEmpty("Level"); int legacyBlocks = countLegacyBaseMetalsBlocks(level); if (legacyBlocks > 0) { - LEGACY_BASE_METALS_BLOCK_COUNTS.put(Long.valueOf(chunkKey(level.getInt("xPos"), level.getInt("zPos"))), + LEGACY_BASE_METALS_BLOCK_COUNTS.put(Long.valueOf(chunkKey(level.getIntOr("xPos", 0), level.getIntOr("zPos", 0))), Integer.valueOf(legacyBlocks)); } // Chests or entities may contain the only Base Metals items in this chunk. @@ -285,18 +285,18 @@ static int migrateWallStates(Tag value) { int changed = 0; if (value instanceof CompoundTag) { CompoundTag compound = (CompoundTag) value; - String name = compound.getString("Name"); + String name = compound.getStringOr("Name", ""); if (name.startsWith("basemetals:") && name.endsWith("_wall")) { - CompoundTag properties = compound.getCompound("Properties"); + CompoundTag properties = compound.getCompoundOrEmpty("Properties"); for (String direction : new String[] {"north", "east", "south", "west"}) { - String connection = properties.getString(direction); + String connection = properties.getStringOr(direction, ""); if ("true".equals(connection) || "false".equals(connection)) { properties.putString(direction, "true".equals(connection) ? "low" : "none"); changed++; } } } - for (String key : compound.getAllKeys()) changed += migrateWallStates(compound.get(key)); + for (String key : compound.keySet()) changed += migrateWallStates(compound.get(key)); } else if (value instanceof ListTag) { for (Tag entry : (ListTag) value) changed += migrateWallStates(entry); } @@ -306,11 +306,11 @@ static int migrateWallStates(Tag value) { /** Called after vanilla datafixing, before a legacy chunk is returned. */ public static CompoundTag finalizeLegacyChunk(CompoundTag root) { if (root != null) { - CompoundTag level = root.contains("Level", 10) ? root.getCompound("Level") : root; - if (level.getBoolean(PRESERVE_CHUNK_MARKER)) { + CompoundTag level = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(root, "Level", 10) ? root.getCompoundOrEmpty("Level") : root; + if (level.getBooleanOr(PRESERVE_CHUNK_MARKER, false)) { removePhantomBedEntities(level); // Keep vanilla's below-zero retrogen status so 1.18 can fill the new underground. - if (!level.contains("below_zero_retrogen", 10)) level.putString("Status", "full"); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(level, "below_zero_retrogen", 10)) level.putString("Status", "full"); level.remove(PRESERVE_CHUNK_MARKER); } } @@ -318,16 +318,16 @@ public static CompoundTag finalizeLegacyChunk(CompoundTag root) { } static int removePhantomBedEntities(CompoundTag level) { - ListTag entities = level.getList(level.contains("block_entities", 9) ? "block_entities" : "TileEntities", 10); + ListTag entities = level.getListOrEmpty(NbtCompat.containsTag(level, "block_entities", 9) ? "block_entities" : "TileEntities"); int removed = 0; for (int index = entities.size() - 1; index >= 0; index--) { - CompoundTag entity = entities.getCompound(index); - if (!"minecraft:bed".equals(entity.getString("id"))) continue; + CompoundTag entity = entities.getCompoundOrEmpty(index); + if (!"minecraft:bed".equals(entity.getStringOr("id", ""))) continue; // Vanilla's pre-flattening bed fixer ignores the high bits of modded block IDs. // A bed entity cannot belong to a Base Metals block; real beds are left alone. - String block = paletteBlockAt(level, entity.getInt("x"), entity.getInt("y"), entity.getInt("z")); + String block = paletteBlockAt(level, entity.getIntOr("x", 0), entity.getIntOr("y", 0), entity.getIntOr("z", 0)); if (block.startsWith("basemetals:")) { entities.remove(index); removed++; @@ -338,25 +338,25 @@ static int removePhantomBedEntities(CompoundTag level) { } private static String paletteBlockAt(CompoundTag level, int x, int y, int z) { - for (Tag entry : level.getList(level.contains("sections", 9) ? "sections" : "Sections", 10)) { + for (Tag entry : level.getListOrEmpty(NbtCompat.containsTag(level, "sections", 9) ? "sections" : "Sections")) { CompoundTag section = (CompoundTag) entry; - if (section.getByte("Y") != (y >> 4)) continue; + if (section.getByteOr("Y", (byte) 0) != (y >> 4)) continue; - CompoundTag statesTag = section.getCompound("block_states"); - boolean modern = section.contains("block_states", 10); - ListTag palette = modern ? statesTag.getList("palette", 10) : section.getList("Palette", 10); + CompoundTag statesTag = section.getCompoundOrEmpty("block_states"); + boolean modern = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(section, "block_states", 10); + ListTag palette = modern ? statesTag.getListOrEmpty("palette") : section.getListOrEmpty("Palette"); if (palette.isEmpty()) return ""; int state = 0; if (palette.size() > 1) { int bits = Math.max(4, 32 - Integer.numberOfLeadingZeros(palette.size() - 1)); int perWord = 64 / bits; int position = ((y & 15) << 8) | ((z & 15) << 4) | (x & 15); - long[] states = modern ? statesTag.getLongArray("data") : section.getLongArray("BlockStates"); + long[] states = modern ? statesTag.getLongArray("data").orElseGet(() -> new long[0]) : section.getLongArray("BlockStates").orElseGet(() -> new long[0]); int word = position / perWord; if (word >= states.length) return ""; state = (int) ((states[word] >>> ((position % perWord) * bits)) & ((1L << bits) - 1)); } - return state < palette.size() ? palette.getCompound(state).getString("Name") : ""; + return state < palette.size() ? palette.getCompoundOrEmpty(state).getStringOr("Name", "") : ""; } return ""; } @@ -364,10 +364,10 @@ private static String paletteBlockAt(CompoundTag level, int x, int y, int z) { public static boolean shouldBlockWorldgenWrite(net.minecraft.server.level.WorldGenRegion region, net.minecraft.core.BlockPos position) { return legacyWorldActive && position != null - && isProtectedChunk(region.getLevel().dimension().location(), position); + && isProtectedChunk(region.getLevel().dimension().identifier(), position); } - static boolean isProtectedChunk(ResourceLocation dimension, net.minecraft.core.BlockPos position) { + static boolean isProtectedChunk(Identifier dimension, net.minecraft.core.BlockPos position) { LongSet chunks = legacyTerrainChunks.get(dimension); // Pre-1.18 worlds have saved terrain at Y=0..255. New negative-Y terrain is not protected. return position.getY() >= 0 && position.getY() < 256 && chunks != null @@ -375,12 +375,12 @@ static boolean isProtectedChunk(ResourceLocation dimension, net.minecraft.core.B } private static synchronized void prepareLegacyData(File worldDirectory, CompoundTag tag) { - if (!tag.contains("Registries", 10)) return; - CompoundTag registries = tag.getCompound("Registries"); - if (!registries.contains(BLOCK_REGISTRY.toString(), 10)) return; + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(tag, "Registries", 10)) return; + CompoundTag registries = tag.getCompoundOrEmpty("Registries"); + if (!NbtCompat.containsTag(registries, BLOCK_REGISTRY.toString(), 10)) return; String key = worldKey(worldDirectory); boolean first = !LEGACY_WORLD_DATA.containsKey(key); - int states = installLegacyBlockStates(registries.getCompound(BLOCK_REGISTRY.toString())); + int states = installLegacyBlockStates(registries.getCompoundOrEmpty(BLOCK_REGISTRY.toString())); if (first) LEGACY_WORLD_DATA.put(key, tag.copy()); legacyWorldActive |= states > 0; File sidecar = new File(worldDirectory, REGISTRY_SIDECAR); @@ -402,18 +402,18 @@ private static synchronized void prepareLegacyData(File worldDirectory, Compound private static int installLegacyBlockStates(CompoundTag snapshot) { LEGACY_BASE_METALS_BLOCK_IDS.clear(); - Map ids = new LinkedHashMap(); - ListTag savedIds = snapshot.getList("ids", 10); + Map ids = new LinkedHashMap(); + ListTag savedIds = snapshot.getListOrEmpty("ids"); int highestState = 0; for (int index = 0; index < savedIds.size(); index++) { - CompoundTag entry = savedIds.getCompound(index); - String normalized = normalizeLegacyRegistryName(entry.getString("K")); + CompoundTag entry = savedIds.getCompoundOrEmpty(index); + String normalized = normalizeLegacyRegistryName(entry.getStringOr("K", "")); int separator = normalized.indexOf(':'); if (separator < 0) continue; String namespace = normalized.substring(0, separator); if (!BaseMetals.MOD_ID.equals(namespace) && !"mmdlib".equals(namespace)) continue; - ResourceLocation id = ResourceLocation.parse(normalized); - int numeric = entry.getInt("V"); + Identifier id = Identifier.parse(normalized); + int numeric = entry.getIntOr("V", 0); ids.put(id, Integer.valueOf(numeric)); LEGACY_BASE_METALS_BLOCK_IDS.set(numeric); highestState = Math.max(highestState, (numeric << 4) | 15); @@ -421,21 +421,21 @@ private static int installLegacyBlockStates(CompoundTag snapshot) { if (ids.isEmpty()) return 0; Dynamic[] table = expandFlatteningTable(highestState + 1); int mapped = 0; - for (Map.Entry entry : ids.entrySet()) { + for (Map.Entry entry : ids.entrySet()) { Block block = resolveCurrentBlock(entry.getKey()); for (int meta = 0; meta < 16; meta++) { BlockState state = legacyState(block, entry.getKey().getPath(), meta); table[(entry.getValue().intValue() << 4) | meta] = - BlockStateData.parse(NbtUtils.writeBlockState(state).toString()); + new Dynamic<>(net.minecraft.nbt.NbtOps.INSTANCE, NbtUtils.writeBlockState(state)); mapped++; } } return mapped; } - private static Block resolveCurrentBlock(ResourceLocation oldId) { + private static Block resolveCurrentBlock(Identifier oldId) { String path = MissingMappings.blockTargetPath(oldId.getPath()); - Block block = ForgeRegistries.BLOCKS.getValue(ResourceLocation.fromNamespaceAndPath(BaseMetals.MOD_ID, path)); + Block block = ForgeRegistries.BLOCKS.getValue(Identifier.fromNamespaceAndPath(BaseMetals.MOD_ID, path)); if (block == null) throw new IllegalStateException("No Base Metals replacement for legacy block " + oldId); return block; } @@ -536,11 +536,11 @@ static Map legacyBlockIdsForTest(java.nio.file.Path root) throw private static Map idsFromRoot(CompoundTag root) { Map result = new LinkedHashMap(); - ListTag ids = root.getCompound("FML").getCompound("Registries") - .getCompound(BLOCK_REGISTRY.toString()).getList("ids", 10); + ListTag ids = root.getCompoundOrEmpty("FML").getCompoundOrEmpty("Registries") + .getCompoundOrEmpty(BLOCK_REGISTRY.toString()).getListOrEmpty("ids"); for (int index = 0; index < ids.size(); index++) { - CompoundTag entry = ids.getCompound(index); - result.put(Integer.valueOf(entry.getInt("V")), normalizeLegacyRegistryName(entry.getString("K"))); + CompoundTag entry = ids.getCompoundOrEmpty(index); + result.put(Integer.valueOf(entry.getIntOr("V", 0)), normalizeLegacyRegistryName(entry.getStringOr("K", ""))); } return result; } @@ -585,16 +585,16 @@ private static int migrateLegacyItems(Tag value) { int changed = 0; if (value instanceof CompoundTag) { CompoundTag compound = (CompoundTag) value; - String id = compound.getString("id"); + String id = compound.getStringOr("id", ""); String vanillaBlockEntity = VANILLA_BLOCK_ENTITY_IDS.get(id); if (vanillaBlockEntity != null) { compound.putString("id", vanillaBlockEntity); id = vanillaBlockEntity; changed++; } - if ("forge:bucketfilled".equalsIgnoreCase(id) && compound.contains("tag", 10)) { - CompoundTag tag = compound.getCompound("tag"); - String target = MissingMappings.fluidTargetPath(tag.getString("FluidName")); + if ("forge:bucketfilled".equalsIgnoreCase(id) && zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "tag", 10)) { + CompoundTag tag = compound.getCompoundOrEmpty("tag"); + String target = MissingMappings.fluidTargetPath(tag.getStringOr("FluidName", "")); if (ModContent.fluids().containsKey(target)) { compound.putString("id", BaseMetals.MOD_ID + ":" + target + "_bucket"); tag.remove("FluidName"); @@ -602,27 +602,27 @@ private static int migrateLegacyItems(Tag value) { if (tag.isEmpty()) compound.remove("tag"); changed++; } - } else if (compound.contains("Count", 99)) { - ResourceLocation oldId = safeId(id); + } else if (zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "Count", 99)) { + Identifier oldId = safeId(id); if (oldId != null && (BaseMetals.MOD_ID.equals(oldId.getNamespace()) || "mmdlib".equals(oldId.getNamespace()))) { - ResourceLocation target = MissingMappings.itemTargetId(oldId.getPath()); + Identifier target = MissingMappings.itemTargetId(oldId.getPath()); if (!target.equals(oldId)) { compound.putString("id", target.toString()); changed++; } - if (compound.contains("Damage", 99) && compound.getInt("Damage") > 0) { - CompoundTag tag = compound.contains("tag", 10) - ? compound.getCompound("tag") : new CompoundTag(); - if (!tag.contains("Damage", 99)) { - tag.putInt("Damage", compound.getInt("Damage")); + if (zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "Damage", 99) && compound.getIntOr("Damage", 0) > 0) { + CompoundTag tag = zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(compound, "tag", 10) + ? compound.getCompoundOrEmpty("tag") : new CompoundTag(); + if (!zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(tag, "Damage", 99)) { + tag.putInt("Damage", compound.getIntOr("Damage", 0)); compound.put("tag", tag); changed++; } } } } - for (String key : new ArrayList(compound.getAllKeys())) { + for (String key : new ArrayList(compound.keySet())) { Tag child = compound.get(key); if (child != null) changed += migrateLegacyItems(child); } @@ -661,8 +661,8 @@ private static Map vanillaBlockEntityIds() { return Collections.unmodifiableMap(ids); } - private static ResourceLocation safeId(String value) { - try { return value == null || value.isEmpty() ? null : ResourceLocation.parse(value.toLowerCase(Locale.ROOT)); } + private static Identifier safeId(String value) { + try { return value == null || value.isEmpty() ? null : Identifier.parse(value.toLowerCase(Locale.ROOT)); } catch (RuntimeException ignored) { return null; } } @@ -686,9 +686,9 @@ private static File legacyRegistrySource(File levelDat) { if (!candidate.isFile()) continue; try (FileInputStream input = new FileInputStream(candidate)) { CompoundTag root = LegacyNbt.readCompressed(input); - if ((root.contains("FML", 10) && containsLegacyBaseMetalsRegistryEntry(root)) - || (root.getCompound("Data").contains("DataVersion", Tag.TAG_ANY_NUMERIC) - && root.getCompound("Data").getInt("DataVersion") < 2834)) return candidate; + if ((zone.moddev.mc.basemetals.migration.NbtCompat.containsTag(root, "FML", 10) && containsLegacyBaseMetalsRegistryEntry(root)) + || (NbtCompat.containsTag(root.getCompoundOrEmpty("Data"), "DataVersion", 99) + && root.getCompoundOrEmpty("Data").getIntOr("DataVersion", 0) < 2834)) return candidate; } catch (IOException ignored) {} } return null; @@ -705,12 +705,12 @@ private static boolean containsLegacyBaseMetalsRegistryEntry(CompoundTag root) { private static int countLegacyBaseMetalsBlocks(CompoundTag level) { int found = 0; - ListTag sections = level.getList("Sections", 10); + ListTag sections = level.getListOrEmpty("Sections"); for (int sectionIndex = 0; sectionIndex < sections.size(); sectionIndex++) { - CompoundTag section = sections.getCompound(sectionIndex); - byte[] blocks = section.getByteArray("Blocks"); + CompoundTag section = sections.getCompoundOrEmpty(sectionIndex); + byte[] blocks = section.getByteArray("Blocks").orElseGet(() -> new byte[0]); if (blocks.length != 4096) continue; - byte[] add = section.getByteArray("Add"); + byte[] add = section.getByteArray("Add").orElseGet(() -> new byte[0]); for (int index = 0; index < blocks.length; index++) { int high = add.length == 2048 ? (add[index >> 1] >> ((index & 1) * 4)) & 15 : 0; if (LEGACY_BASE_METALS_BLOCK_IDS.get((blocks[index] & 255) | (high << 8))) found++; @@ -725,10 +725,10 @@ public static Map legacyPreparedBlockCounts() { } static int indexLegacyChunks(File worldDirectory) { - Map indexed = new LinkedHashMap<>(); - indexRegionDirectory(indexed, ResourceLocation.parse("minecraft:overworld"), new File(worldDirectory, "region")); - indexRegionDirectory(indexed, ResourceLocation.parse("minecraft:the_nether"), new File(worldDirectory, "DIM-1/region")); - indexRegionDirectory(indexed, ResourceLocation.parse("minecraft:the_end"), new File(worldDirectory, "DIM1/region")); + Map indexed = new LinkedHashMap<>(); + indexRegionDirectory(indexed, Identifier.parse("minecraft:overworld"), new File(worldDirectory, "region")); + indexRegionDirectory(indexed, Identifier.parse("minecraft:the_nether"), new File(worldDirectory, "DIM-1/region")); + indexRegionDirectory(indexed, Identifier.parse("minecraft:the_end"), new File(worldDirectory, "DIM1/region")); Path dimensions = worldDirectory.toPath().resolve("dimensions"); if (Files.isDirectory(dimensions)) { @@ -739,7 +739,7 @@ static int indexLegacyChunks(File worldDirectory) { if (relative.getNameCount() < 2) return; String namespace = relative.getName(0).toString(); String name = relative.subpath(1, relative.getNameCount()).toString().replace(File.separatorChar, '/'); - indexRegionDirectory(indexed, ResourceLocation.fromNamespaceAndPath(namespace, name), path.toFile()); + indexRegionDirectory(indexed, Identifier.fromNamespaceAndPath(namespace, name), path.toFile()); }); } catch (IOException exception) { throw new IllegalStateException("Could not inspect saved dimensions in " + dimensions, exception); @@ -750,8 +750,8 @@ static int indexLegacyChunks(File worldDirectory) { return indexed.values().stream().mapToInt(LongSet::size).sum(); } - private static void indexRegionDirectory(Map indexed, - ResourceLocation dimension, File regionDirectory) { + private static void indexRegionDirectory(Map indexed, + Identifier dimension, File regionDirectory) { File[] regions = regionDirectory.listFiles((directory, name) -> name.matches("r\\.-?\\d+\\.-?\\d+\\.mc[ar]")); if (regions == null) return; LongSet chunks = indexed.computeIfAbsent(dimension, key -> new LongOpenHashSet()); diff --git a/src/main/java/zone/moddev/mc/basemetals/migration/NbtCompat.java b/src/main/java/zone/moddev/mc/basemetals/migration/NbtCompat.java new file mode 100644 index 000000000..ecdaeb76b --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/migration/NbtCompat.java @@ -0,0 +1,15 @@ +package zone.moddev.mc.basemetals.migration; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.Tag; + +/** Type checks for saved data written before NBT's optional getters were introduced. */ +public final class NbtCompat { + private NbtCompat() {} + + public static boolean containsTag(CompoundTag compound, String key, int type) { + Tag value = compound.get(key); + return value != null && (type == 99 ? value instanceof NumericTag : value.getId() == type); + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilBlockMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilBlockMixin.java new file mode 100644 index 000000000..073a02edd --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilBlockMixin.java @@ -0,0 +1,22 @@ +package zone.moddev.mc.basemetals.mixin; + +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zone.moddev.mc.basemetals.content.BaseMetalAnvilBlock; + +/** Advances the saved damage state without replacing a custom anvil with a vanilla one. */ +@Mixin(AnvilBlock.class) +abstract class AnvilBlockMixin { + @Inject(method = "damage", at = @At("HEAD"), cancellable = true) + private static void basemetals$damageAnvil(BlockState state, CallbackInfoReturnable callback) { + if (state.getBlock() instanceof BaseMetalAnvilBlock) { + int damage = state.getValue(BaseMetalAnvilBlock.DAMAGE); + callback.setReturnValue(damage < 2 + ? state.setValue(BaseMetalAnvilBlock.DAMAGE, damage + 1) : null); + } + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilMenuMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilMenuMixin.java new file mode 100644 index 000000000..b0a962fca --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/AnvilMenuMixin.java @@ -0,0 +1,23 @@ +package zone.moddev.mc.basemetals.mixin; + +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import zone.moddev.mc.basemetals.content.BaseMetalAnvilBlock; + +/** Includes custom anvils in the normal wear check without changing their falling behaviour. */ +@Mixin(AnvilMenu.class) +abstract class AnvilMenuMixin { + @Redirect( + method = "lambda$onTake$2(Lnet/minecraft/world/entity/player/Player;FLnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/tags/TagKey;)Z"), + require = 1, allow = 1) + private static boolean basemetals$includeCustomAnvil(BlockState state, TagKey tag) { + return state.is(tag) || tag == BlockTags.ANVIL && state.getBlock() instanceof BaseMetalAnvilBlock; + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/BlockStateDataMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/BlockStateDataMixin.java new file mode 100644 index 000000000..8d8a8bf4c --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/BlockStateDataMixin.java @@ -0,0 +1,29 @@ +package zone.moddev.mc.basemetals.mixin; + +import java.util.Arrays; + +import com.mojang.serialization.Dynamic; +import net.minecraft.util.datafix.fixes.BlockStateData; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** Makes room for the numeric block IDs used by old Forge saves. */ +@Mixin(BlockStateData.class) +abstract class BlockStateDataMixin { + @Shadow @Final @Mutable + private static Dynamic[] MAP; + + @Shadow @Final @Mutable + private static Dynamic[] BLOCK_DEFAULTS; + + @Inject(method = "", at = @At("TAIL")) + private static void basemetals$expandLegacyTables(CallbackInfo callback) { + MAP = Arrays.copyOf(MAP, Math.max(MAP.length, 65_536)); + BLOCK_DEFAULTS = Arrays.copyOf(BLOCK_DEFAULTS, Math.max(BLOCK_DEFAULTS.length, 4_096)); + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/LevelCapabilityDataMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/LevelCapabilityDataMixin.java new file mode 100644 index 000000000..113f1ed6c --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/LevelCapabilityDataMixin.java @@ -0,0 +1,22 @@ +package zone.moddev.mc.basemetals.mixin; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedDataType; +import net.minecraftforge.common.util.LevelCapabilityData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zone.moddev.mc.basemetals.migration.LegacyWorldCapabilityCodec; + +/** Forge 61 adds a wrapper that older world-capability files do not have. */ +@Mixin(value = LevelCapabilityData.class, remap = false) +abstract class LevelCapabilityDataMixin { + @Inject(method = "type", at = @At("RETURN"), cancellable = true, remap = false) + private static void basemetals$readOlderCapabilities(ServerLevel level, + CallbackInfoReturnable> callback) { + var current = callback.getReturnValue(); + callback.setReturnValue(new SavedDataType<>(current.id(), current.constructor(), + LegacyWorldCapabilityCodec.acceptLegacyPayload(current.codec()), current.dataFixType())); + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/LevelStorageSourceMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/LevelStorageSourceMixin.java new file mode 100644 index 000000000..59fbc8234 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/LevelStorageSourceMixin.java @@ -0,0 +1,25 @@ +package zone.moddev.mc.basemetals.mixin; + +import java.nio.file.Path; + +import com.mojang.datafixers.DataFixer; +import com.mojang.serialization.Dynamic; +import net.minecraft.world.level.storage.LevelStorageSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zone.moddev.mc.basemetals.migration.LegacyWorldDataHook; + +/** Captures original registry and item data before vanilla runs its data fixers. */ +@Mixin(LevelStorageSource.class) +abstract class LevelStorageSourceMixin { + @Inject(method = "readLevelDataTagFixed", at = @At("HEAD")) + private static void basemetals$prepareWorld(Path file, DataFixer fixer, + CallbackInfoReturnable> callback) { + // A fallback backup must never make a modern world look like a legacy save. + if (file.getFileName().toString().equals("level.dat")) { + LegacyWorldDataHook.prepareLegacyWorld(file.toFile()); + } + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/OreSpawnEarlyTagCompatibilityMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/OreSpawnEarlyTagCompatibilityMixin.java new file mode 100644 index 000000000..8d9007352 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/OreSpawnEarlyTagCompatibilityMixin.java @@ -0,0 +1,37 @@ +package zone.moddev.mc.basemetals.mixin; + +import java.util.Collections; +import java.util.Set; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** Lets OreSpawn defer its early tag lookup until Minecraft has loaded the world's tags. */ +@Mixin(targets = "zone.moddev.mc.orespawn.worldgen.OreSpawnOreGeneration", remap = false) +abstract class OreSpawnEarlyTagCompatibilityMixin { + @Inject(method = "resolveTag", at = @At("HEAD"), cancellable = true, remap = false) + private static void basemetals$deferUnboundTags(TagKey tag, + CallbackInfoReturnable> callback) { + for (Block block : ForgeRegistries.BLOCKS.getValues()) { + try { + // Modded holders can still be unbound after vanilla's holders are ready. + block.defaultBlockState().is(tag); + } catch (IllegalStateException failure) { + if (!"Tags not bound".equals(failure.getMessage())) { + throw failure; + } + + // OreSpawn rebakes the unchanged profile once the world's tags are available. + callback.setReturnValue(Collections.emptySet()); + return; + } + } + + // Bound tags use OreSpawn's original resolver unchanged. + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/SimpleRegionStorageMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/SimpleRegionStorageMixin.java new file mode 100644 index 000000000..353f6b355 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/SimpleRegionStorageMixin.java @@ -0,0 +1,27 @@ +package zone.moddev.mc.basemetals.mixin; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.chunk.storage.SimpleRegionStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zone.moddev.mc.basemetals.migration.LegacyWorldDataHook; + +/** Restores legacy mod identities on either side of vanilla's chunk conversion. */ +@Mixin(SimpleRegionStorage.class) +abstract class SimpleRegionStorageMixin { + @Inject(method = "upgradeChunkTag(Lnet/minecraft/nbt/CompoundTag;ILnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/nbt/CompoundTag;", + at = @At("HEAD")) + private void basemetals$prepareChunk(CompoundTag chunk, int fallbackVersion, + CompoundTag context, CallbackInfoReturnable callback) { + LegacyWorldDataHook.prepareLegacyChunk(chunk); + } + + @Inject(method = "upgradeChunkTag(Lnet/minecraft/nbt/CompoundTag;ILnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/nbt/CompoundTag;", + at = @At("RETURN"), cancellable = true) + private void basemetals$finishChunk(CompoundTag chunk, int fallbackVersion, + CompoundTag context, CallbackInfoReturnable callback) { + callback.setReturnValue(LegacyWorldDataHook.finalizeLegacyChunk(callback.getReturnValue())); + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/mixin/WorldGenRegionMixin.java b/src/main/java/zone/moddev/mc/basemetals/mixin/WorldGenRegionMixin.java new file mode 100644 index 000000000..f08aaa208 --- /dev/null +++ b/src/main/java/zone/moddev/mc/basemetals/mixin/WorldGenRegionMixin.java @@ -0,0 +1,20 @@ +package zone.moddev.mc.basemetals.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zone.moddev.mc.basemetals.migration.LegacyWorldDataHook; + +/** Protects imported terrain while allowing generation in genuinely new chunks. */ +@Mixin(WorldGenRegion.class) +abstract class WorldGenRegionMixin { + @Inject(method = "ensureCanWrite", at = @At("HEAD"), cancellable = true) + private void basemetals$protectTerrain(BlockPos position, CallbackInfoReturnable callback) { + if (LegacyWorldDataHook.shouldBlockWorldgenWrite((WorldGenRegion) (Object) this, position)) { + callback.setReturnValue(false); + } + } +} diff --git a/src/main/java/zone/moddev/mc/basemetals/network/ContentModeNetwork.java b/src/main/java/zone/moddev/mc/basemetals/network/ContentModeNetwork.java index aca65e0a8..55328b9bc 100644 --- a/src/main/java/zone/moddev/mc/basemetals/network/ContentModeNetwork.java +++ b/src/main/java/zone/moddev/mc/basemetals/network/ContentModeNetwork.java @@ -6,9 +6,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.network.ConfigurationTask; import net.minecraft.server.network.ServerConfigurationPacketListenerImpl; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.network.GatherLoginConfigurationTasksEvent; -import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.listener.Priority; import net.minecraftforge.network.ChannelBuilder; import net.minecraftforge.network.NetworkDirection; import net.minecraftforge.network.SimpleChannel; @@ -54,7 +53,7 @@ public static void register() { context.setPacketHandled(true); }).add(); - MinecraftForge.EVENT_BUS.addListener(EventPriority.LOWEST, ContentModeNetwork::gatherTasks); + GatherLoginConfigurationTasksEvent.BUS.addListener(Priority.LOWEST, ContentModeNetwork::gatherTasks); } public static boolean modesMatch(String server, String client) { diff --git a/src/main/java/zone/moddev/mc/basemetals/recipe/ContentCraftingRecipe.java b/src/main/java/zone/moddev/mc/basemetals/recipe/ContentCraftingRecipe.java index a790ccd3d..c7ef46210 100644 --- a/src/main/java/zone/moddev/mc/basemetals/recipe/ContentCraftingRecipe.java +++ b/src/main/java/zone/moddev/mc/basemetals/recipe/ContentCraftingRecipe.java @@ -1,111 +1,108 @@ package zone.moddev.mc.basemetals.recipe; +import java.util.List; + import com.mojang.serialization.MapCodec; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import com.google.gson.JsonSyntaxException; -import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.PlacementInfo; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.GsonHelper; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.display.RecipeDisplay; import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; import zone.moddev.mc.basemetals.config.ContentPolicy; -/** Keeps recipe IDs stable between modes, including IDs stored in an old recipe book. */ -public final class ContentCraftingRecipe { - public static final RecipeSerializer> SERIALIZER = new Serializer(); - private ContentCraftingRecipe() {} +/** Keeps recipe IDs stable while hiding recipes that the selected mode does not allow. */ +public final class ContentCraftingRecipe implements CraftingRecipe { + public static final RecipeSerializer SERIALIZER = new Serializer(); + private final CraftingRecipe plain; - private static boolean allowed(Recipe recipe) { - return ContentPolicy.active().allows(ForgeRegistries.ITEMS.getKey(recipe.getResultItem(net.minecraft.core.RegistryAccess.EMPTY).getItem()).toString()); + private ContentCraftingRecipe(CraftingRecipe plain) { + this.plain = plain; } - private static Recipe wrap(Recipe recipe) { - // Recipe-book placement needs the shaped recipe's width and height, not just its ingredients. - if (recipe instanceof ShapedRecipe) return new Shaped((ShapedRecipe) recipe); - if (recipe instanceof ShapelessRecipe) return new Shapeless((ShapelessRecipe) recipe); - throw new IllegalArgumentException("Not an ordinary crafting recipe: " + recipe.getSerializer()); + private boolean allowed() { + ItemStack result = plain.assemble(CraftingInput.EMPTY, RegistryAccess.EMPTY); + return ContentPolicy.active().allows(ForgeRegistries.ITEMS.getKey(result.getItem()).toString()); } - private static final class Shaped extends ShapedRecipe { - private final ShapedRecipe plain; - - private Shaped(ShapedRecipe plain) { - super(plain.getGroup(), plain.category(), - new net.minecraft.world.item.crafting.ShapedRecipePattern(plain.getWidth(), plain.getHeight(), - plain.getIngredients(), java.util.Optional.empty()), - plain.getResultItem(net.minecraft.core.RegistryAccess.EMPTY), plain.showNotification()); - this.plain = plain; - } - - @Override - public boolean matches(CraftingInput inventory, Level world) { - return allowed(this) && super.matches(inventory, world); + private static ContentCraftingRecipe wrap(Recipe recipe) { + if (!(recipe instanceof CraftingRecipe crafting)) { + throw new IllegalArgumentException("Expected a crafting recipe, got " + recipe.getSerializer()); } - @Override - public ItemStack assemble(CraftingInput inventory, net.minecraft.core.HolderLookup.Provider registries) { - return allowed(this) ? super.assemble(inventory, registries) : ItemStack.EMPTY; - } + return new ContentCraftingRecipe(crafting); + } - @Override - public boolean isSpecial() { - return !allowed(this); - } + @Override + public boolean matches(CraftingInput input, Level level) { + return allowed() && plain.matches(input, level); + } - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } + @Override + public ItemStack assemble(CraftingInput input, HolderLookup.Provider registries) { + return allowed() ? plain.assemble(input, registries) : ItemStack.EMPTY; } - private static final class Shapeless extends ShapelessRecipe { - private final ShapelessRecipe plain; + @Override + public boolean isSpecial() { + return !allowed() || plain.isSpecial(); + } - private Shapeless(ShapelessRecipe plain) { - super(plain.getGroup(), plain.category(), plain.getResultItem(net.minecraft.core.RegistryAccess.EMPTY), plain.getIngredients()); - this.plain = plain; - } + @Override + public String group() { + return plain.group(); + } - @Override - public boolean matches(CraftingInput inventory, Level world) { - return allowed(this) && super.matches(inventory, world); - } + @Override + public CraftingBookCategory category() { + return plain.category(); + } - @Override - public ItemStack assemble(CraftingInput inventory, net.minecraft.core.HolderLookup.Provider registries) { - return allowed(this) ? super.assemble(inventory, registries) : ItemStack.EMPTY; - } + @Override + public PlacementInfo placementInfo() { + return allowed() ? plain.placementInfo() : PlacementInfo.NOT_PLACEABLE; + } - @Override - public boolean isSpecial() { - return !allowed(this); - } + @Override + public List display() { + return allowed() ? plain.display() : List.of(); + } - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } + @Override + public boolean showNotification() { + return plain.showNotification(); } - private static Recipe plain(Recipe recipe) { - return recipe instanceof Shaped shaped ? shaped.plain : ((Shapeless) recipe).plain; + @Override + public RecipeSerializer getSerializer() { + return SERIALIZER; } - private static final class Serializer implements RecipeSerializer> { - private static final MapCodec> CODEC = Recipe.CODEC.fieldOf("recipe") - .xmap(ContentCraftingRecipe::wrap, ContentCraftingRecipe::plain); - private static final StreamCodec> STREAM_CODEC = - Recipe.STREAM_CODEC.map(ContentCraftingRecipe::wrap, ContentCraftingRecipe::plain); + private static final class Serializer implements RecipeSerializer { + private static final MapCodec CODEC = Recipe.CODEC.fieldOf("recipe") + .xmap(ContentCraftingRecipe::wrap, recipe -> recipe.plain); + // Preserve empty pattern slots and tag names instead of flattening the ingredients. + private static final StreamCodec STREAM_CODEC = + ByteBufCodecs.fromCodecWithRegistries(Recipe.CODEC) + .map(ContentCraftingRecipe::wrap, recipe -> recipe.plain); - @Override public MapCodec> codec() { return CODEC; } - @Override public StreamCodec> streamCodec() { return STREAM_CODEC; } + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return STREAM_CODEC; + } } } diff --git a/src/main/java/zone/moddev/mc/basemetals/recipe/CrushingRecipe.java b/src/main/java/zone/moddev/mc/basemetals/recipe/CrushingRecipe.java index 8be81699d..f877f8f72 100644 --- a/src/main/java/zone/moddev/mc/basemetals/recipe/CrushingRecipe.java +++ b/src/main/java/zone/moddev/mc/basemetals/recipe/CrushingRecipe.java @@ -9,7 +9,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.crafting.SingleRecipeInput; import net.minecraft.world.item.ItemStack; @@ -35,7 +35,7 @@ public final class CrushingRecipe implements Recipe { SERIALIZERS.register("legacy_smelting", LegacySmeltingRecipe.Serializer::new); public static final RegistryObject> PLATE_REPAIR_SERIALIZER = SERIALIZERS.register("plate_repair", PlateRepairRecipe.Serializer::new); - public static final RegistryObject>> CONTENT_CRAFTING_SERIALIZER = + public static final RegistryObject> CONTENT_CRAFTING_SERIALIZER = SERIALIZERS.register("content_crafting", () -> ContentCraftingRecipe.SERIALIZER); private final Ingredient ingredient; @@ -55,12 +55,18 @@ public boolean matches(SingleRecipeInput input, Level level) { public ItemStack assemble(SingleRecipeInput input, net.minecraft.core.HolderLookup.Provider registries) { return result.copy(); } - @Override public boolean canCraftInDimensions(int width, int height) { return width * height >= 1; } - @Override public ItemStack getResultItem(net.minecraft.core.HolderLookup.Provider registries) { return result.copy(); } - @Override public RecipeSerializer getSerializer() { return SERIALIZER.get(); } - @Override public RecipeType getType() { return TYPE.get(); } - @Override public NonNullList getIngredients() { return NonNullList.of(Ingredient.EMPTY, ingredient); } + public boolean canCraftInDimensions(int width, int height) { return width * height >= 1; } + public ItemStack getResultItem(net.minecraft.core.HolderLookup.Provider registries) { return result.copy(); } + @Override public RecipeSerializer getSerializer() { return SERIALIZER.get(); } + @Override public RecipeType getType() { return TYPE.get(); } + public java.util.List getIngredients() { return java.util.List.of(ingredient); } @Override public boolean isSpecial() { return true; } + @Override public net.minecraft.world.item.crafting.PlacementInfo placementInfo() { + return net.minecraft.world.item.crafting.PlacementInfo.NOT_PLACEABLE; + } + @Override public net.minecraft.world.item.crafting.RecipeBookCategory recipeBookCategory() { + return net.minecraft.world.item.crafting.RecipeBookCategories.CRAFTING_MISC; + } private static final class CrushingRecipeType implements RecipeType { @Override @@ -72,7 +78,7 @@ public String toString() { public static final class Serializer implements RecipeSerializer { private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Ingredient.CODEC_NONEMPTY.fieldOf("ingredient").forGetter(recipe -> recipe.ingredient), + Ingredient.CODEC.fieldOf("ingredient").forGetter(recipe -> recipe.ingredient), ItemStack.CODEC.fieldOf("result").forGetter(recipe -> recipe.result)) .apply(instance, CrushingRecipe::new)); diff --git a/src/main/java/zone/moddev/mc/basemetals/recipe/LegacySmeltingRecipe.java b/src/main/java/zone/moddev/mc/basemetals/recipe/LegacySmeltingRecipe.java index 2d4ab74ea..112d0d766 100644 --- a/src/main/java/zone/moddev/mc/basemetals/recipe/LegacySmeltingRecipe.java +++ b/src/main/java/zone/moddev/mc/basemetals/recipe/LegacySmeltingRecipe.java @@ -8,7 +8,7 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -26,38 +26,40 @@ public LegacySmeltingRecipe(String group, Ingredient ingredient, @Override public boolean matches(net.minecraft.world.item.crafting.SingleRecipeInput inventory, net.minecraft.world.level.Level world) { - return zone.moddev.mc.basemetals.config.ContentPolicy.active().allows(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(getResultItem(world.registryAccess()).getItem()).toString()) + return zone.moddev.mc.basemetals.config.ContentPolicy.active().allows(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(result().getItem()).toString()) && super.matches(inventory, world); } @Override public ItemStack assemble(net.minecraft.world.item.crafting.SingleRecipeInput inventory, net.minecraft.core.HolderLookup.Provider registries) { - return zone.moddev.mc.basemetals.config.ContentPolicy.active().allows(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(getResultItem(registries).getItem()).toString()) + return zone.moddev.mc.basemetals.config.ContentPolicy.active().allows(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(result().getItem()).toString()) ? super.assemble(inventory, registries) : ItemStack.EMPTY; } @Override - public RecipeSerializer getSerializer() { - return CrushingRecipe.LEGACY_SMELTING_SERIALIZER.get(); + @SuppressWarnings("unchecked") + public RecipeSerializer getSerializer() { + return (RecipeSerializer) (RecipeSerializer) + CrushingRecipe.LEGACY_SMELTING_SERIALIZER.get(); } public static final class Serializer implements RecipeSerializer { private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Codec.STRING.optionalFieldOf("group", "").forGetter(LegacySmeltingRecipe::getGroup), - Ingredient.CODEC_NONEMPTY.fieldOf("ingredient").forGetter(recipe -> recipe.getIngredients().getFirst()), - ItemStack.CODEC.fieldOf("result").forGetter(recipe -> recipe.getResultItem(null)), - Codec.FLOAT.optionalFieldOf("experience", 0.0F).forGetter(LegacySmeltingRecipe::getExperience), - Codec.INT.optionalFieldOf("cookingtime", 200).forGetter(LegacySmeltingRecipe::getCookingTime)) + Codec.STRING.optionalFieldOf("group", "").forGetter(LegacySmeltingRecipe::group), + Ingredient.CODEC.fieldOf("ingredient").forGetter(recipe -> recipe.input()), + ItemStack.CODEC.fieldOf("result").forGetter(recipe -> recipe.result()), + Codec.FLOAT.optionalFieldOf("experience", 0.0F).forGetter(LegacySmeltingRecipe::experience), + Codec.INT.optionalFieldOf("cookingtime", 200).forGetter(LegacySmeltingRecipe::cookingTime)) .apply(instance, LegacySmeltingRecipe::new)); private static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.STRING_UTF8, LegacySmeltingRecipe::getGroup, - Ingredient.CONTENTS_STREAM_CODEC, recipe -> recipe.getIngredients().getFirst(), - ItemStack.STREAM_CODEC, recipe -> recipe.getResultItem(null), - ByteBufCodecs.FLOAT, LegacySmeltingRecipe::getExperience, - ByteBufCodecs.VAR_INT, LegacySmeltingRecipe::getCookingTime, + ByteBufCodecs.STRING_UTF8, LegacySmeltingRecipe::group, + Ingredient.CONTENTS_STREAM_CODEC, recipe -> recipe.input(), + ItemStack.STREAM_CODEC, recipe -> recipe.result(), + ByteBufCodecs.FLOAT, LegacySmeltingRecipe::experience, + ByteBufCodecs.VAR_INT, LegacySmeltingRecipe::cookingTime, LegacySmeltingRecipe::new); @Override public MapCodec codec() { return CODEC; } diff --git a/src/main/java/zone/moddev/mc/basemetals/recipe/PlateRepairRecipe.java b/src/main/java/zone/moddev/mc/basemetals/recipe/PlateRepairRecipe.java index b8324fa1a..fab367e21 100644 --- a/src/main/java/zone/moddev/mc/basemetals/recipe/PlateRepairRecipe.java +++ b/src/main/java/zone/moddev/mc/basemetals/recipe/PlateRepairRecipe.java @@ -10,7 +10,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.Item; @@ -43,7 +43,7 @@ public boolean matches(CraftingInput container, Level level) { for (int slot = 0; slot < container.size(); slot++) { ItemStack stack = container.getItem(slot); if (stack.isEmpty()) continue; - if (stack.is(target) && stack.isDamaged() && foundTarget.isEmpty()) { + if (isTarget(stack) && stack.isDamaged() && foundTarget.isEmpty()) { foundTarget = stack; } else if (plate.test(stack) && !foundPlate) { foundPlate = true; @@ -59,7 +59,7 @@ public ItemStack assemble(CraftingInput container, net.minecraft.core.HolderLook if (!matches(container, null)) return ItemStack.EMPTY; for (int slot = 0; slot < container.size(); slot++) { ItemStack stack = container.getItem(slot); - if (stack.is(target) && stack.isDamaged()) { + if (isTarget(stack) && stack.isDamaged()) { ItemStack repaired = stack.copy(); repaired.setCount(1); repaired.setDamageValue(0); @@ -69,23 +69,29 @@ public ItemStack assemble(CraftingInput container, net.minecraft.core.HolderLook return ItemStack.EMPTY; } - @Override + private boolean isTarget(ItemStack stack) { + if (stack.is(target)) return true; + + String oldId = ForgeRegistries.ITEMS.getKey(target).toString(); + String equivalent = zone.moddev.mc.basemetals.compat.VanillaCopper.output(oldId); + return !equivalent.equals(oldId) + && equivalent.equals(ForgeRegistries.ITEMS.getKey(stack.getItem()).toString()); + } + public boolean canCraftInDimensions(int width, int height) { return width * height >= 2; } - @Override public ItemStack getResultItem(net.minecraft.core.HolderLookup.Provider registries) { return target.getDefaultInstance(); } - @Override - public NonNullList getIngredients() { - return NonNullList.of(Ingredient.EMPTY, Ingredient.of(target), plate); + public java.util.List getIngredients() { + return java.util.List.of(Ingredient.of(target), plate); } @Override - public RecipeSerializer getSerializer() { + public RecipeSerializer getSerializer() { return CrushingRecipe.PLATE_REPAIR_SERIALIZER.get(); } @@ -93,7 +99,7 @@ public static final class Serializer implements RecipeSerializer CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( BuiltInRegistries.ITEM.byNameCodec().fieldOf("target").forGetter(recipe -> recipe.target), - Ingredient.CODEC_NONEMPTY.fieldOf("plate").forGetter(recipe -> recipe.plate)) + Ingredient.CODEC.fieldOf("plate").forGetter(recipe -> recipe.plate)) .apply(instance, PlateRepairRecipe::new)); private static final StreamCodec STREAM_CODEC = diff --git a/src/main/java/zone/moddev/mc/basemetals/trade/BaseMetalsTrades.java b/src/main/java/zone/moddev/mc/basemetals/trade/BaseMetalsTrades.java index 417df93a5..eb46776c3 100644 --- a/src/main/java/zone/moddev/mc/basemetals/trade/BaseMetalsTrades.java +++ b/src/main/java/zone/moddev/mc/basemetals/trade/BaseMetalsTrades.java @@ -7,8 +7,8 @@ import zone.moddev.mc.basemetals.material.MaterialCatalogue; import zone.moddev.mc.basemetals.material.MaterialDefinition; -import net.minecraft.world.entity.npc.VillagerProfession; -import net.minecraft.world.entity.npc.VillagerTrades.ItemListing; +import net.minecraft.world.entity.npc.villager.VillagerProfession; +import net.minecraft.world.entity.npc.villager.VillagerTrades.ItemListing; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -100,12 +100,12 @@ private static ItemListing selling(Item item, int emeralds) { } private static ItemListing selling(Item item, int count, int emeralds) { - return (trader, random) -> new MerchantOffer(new net.minecraft.world.item.trading.ItemCost(Items.EMERALD, Math.max(1, emeralds)), + return (level, trader, random) -> new MerchantOffer(new net.minecraft.world.item.trading.ItemCost(Items.EMERALD, Math.max(1, emeralds)), new ItemStack(item, count), 6, 5, 0.2F); } private static ItemListing enchanted(Item item, int baseCost) { - return (trader, random) -> { + return (level, trader, random) -> { int enchantmentLevel = 5 + random.nextInt(15); ItemStack result = EnchantmentHelper.enchantItem(random, new ItemStack(item), enchantmentLevel, trader.registryAccess(), java.util.Optional.of(trader.registryAccess() diff --git a/src/main/resources/META-INF/coremods.json b/src/main/resources/META-INF/coremods.json deleted file mode 100644 index 2bf71a9de..000000000 --- a/src/main/resources/META-INF/coremods.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "basemetals_118_compatibility": "coremods/basemetals_118_compatibility.js" -} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 614e28432..b2e3b7ff4 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -14,7 +14,7 @@ description='''${mod_description}''' [[dependencies.${mod_id}]] modId="orespawn" mandatory=true -versionRange="[4.1.0.121011,5.0.0)" +versionRange="[4.1.0.121111,5.0.0)" ordering="AFTER" side="BOTH" diff --git a/src/main/resources/assets/basemetals/models/item/door_item.json b/src/main/resources/assets/basemetals/models/item/door_item.json index 006e7ec33..f3eafec9c 100644 --- a/src/main/resources/assets/basemetals/models/item/door_item.json +++ b/src/main/resources/assets/basemetals/models/item/door_item.json @@ -1,4 +1,5 @@ { + "textures": { "particle": "#bottom" }, "ambientocclusion": false, "elements": [ { "from": [ 0, 0, 4 ], diff --git a/src/main/resources/assets/basemetals/models/item/shield.json b/src/main/resources/assets/basemetals/models/item/shield.json index 5752e1e3f..d5c32ce47 100644 --- a/src/main/resources/assets/basemetals/models/item/shield.json +++ b/src/main/resources/assets/basemetals/models/item/shield.json @@ -1,5 +1,6 @@ { "textures": { + "particle": "#shield", "0": "#shield" }, "elements": [ @@ -89,4 +90,4 @@ "scale": [ 0.75, 0.75, 0.75 ] } } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/basemetals/models/item/shield_blocking.json b/src/main/resources/assets/basemetals/models/item/shield_blocking.json index e558e5418..aa65eaf15 100644 --- a/src/main/resources/assets/basemetals/models/item/shield_blocking.json +++ b/src/main/resources/assets/basemetals/models/item/shield_blocking.json @@ -1,5 +1,6 @@ { "textures": { + "particle": "#shield", "0": "#shield" }, "elements": [ @@ -79,4 +80,4 @@ "scale": [ 0.75, 0.75, 0.75 ] } } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json new file mode 100644 index 000000000..4304c4897 --- /dev/null +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -0,0 +1,19 @@ +{ + "sources": [ + { + "type": "minecraft:single", + "resource": "minecraft:item/bucket", + "sprite": "basemetals:block/bucket_base" + }, + { + "type": "minecraft:single", + "resource": "forge:item/mask/bucket_fluid", + "sprite": "basemetals:block/bucket_fluid" + }, + { + "type": "minecraft:single", + "resource": "forge:item/mask/bucket_fluid_cover", + "sprite": "basemetals:block/bucket_cover" + } + ] +} diff --git a/src/main/resources/basemetals.mixins.json b/src/main/resources/basemetals.mixins.json new file mode 100644 index 000000000..a6b98faa4 --- /dev/null +++ b/src/main/resources/basemetals.mixins.json @@ -0,0 +1,19 @@ +{ + "required": true, + "minVersion": "0.8.7", + "package": "zone.moddev.mc.basemetals.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "AnvilBlockMixin", + "AnvilMenuMixin", + "BlockStateDataMixin", + "LevelCapabilityDataMixin", + "LevelStorageSourceMixin", + "OreSpawnEarlyTagCompatibilityMixin", + "SimpleRegionStorageMixin", + "WorldGenRegionMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/coremods/basemetals_118_compatibility.js b/src/main/resources/coremods/basemetals_118_compatibility.js deleted file mode 100644 index 472da246f..000000000 --- a/src/main/resources/coremods/basemetals_118_compatibility.js +++ /dev/null @@ -1,109 +0,0 @@ -var Opcodes = Java.type('org.objectweb.asm.Opcodes'); -var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode'); -var InsnList = Java.type('org.objectweb.asm.tree.InsnList'); -var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode'); -var LabelNode = Java.type('org.objectweb.asm.tree.LabelNode'); -var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); -var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); -var HOOK = 'zone/moddev/mc/basemetals/migration/LegacyWorldDataHook'; -var NBT = 'Lnet/minecraft/nbt/CompoundTag;'; -var STATE = 'Lnet/minecraft/world/level/block/state/BlockState;'; -var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI'); - -function initializeCoreMod() { - return { - 'basemetals_expand_flattening_table': { - 'target': { 'type': 'CLASS', 'name': 'net.minecraft.util.datafix.fixes.BlockStateData' }, - 'transformer': function(node) { - var patched = false; - for (var i = 0; i < node.fields.size(); ++i) { - var field = node.fields.get(i); - if (field.name !== 'MAP' - || field.desc !== '[Lcom/mojang/serialization/Dynamic;') continue; - // Modded numeric IDs need more room than vanilla's 4096-entry table. - field.access &= ~Opcodes.ACC_FINAL; - patched = true; - } - if (!patched) throw new Error('Base Metals could not make the legacy block table expandable'); - return node; - } - }, - 'basemetals_legacy_world_info': { - 'target': { 'type': 'CLASS', 'name': 'net.minecraft.world.level.storage.LevelStorageSource' }, - 'transformer': function(node) { - var patched = false; - for (var i = 0; i < node.methods.size(); ++i) { - var method = node.methods.get(i); - if (method.name !== 'readLevelDataTagFixed' - || method.desc !== '(Ljava/nio/file/Path;Lcom/mojang/datafixers/DataFixer;)Lcom/mojang/serialization/Dynamic;') continue; - // Keep legacy IDs and item damage intact before Mojang updates level.dat. - var prefix = new InsnList(); - prefix.add(new VarInsnNode(Opcodes.ALOAD, 0)); - prefix.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, 'java/nio/file/Path', - 'toFile', '()Ljava/io/File;', true)); - prefix.add(new MethodInsnNode(Opcodes.INVOKESTATIC, HOOK, - 'prepareLegacyWorld', '(Ljava/io/File;)V', false)); - method.instructions.insert(prefix); - patched = true; - } - if (!patched) throw new Error('Base Metals could not attach its legacy level.dat reader'); - return node; - } - }, - 'basemetals_legacy_chunk_status': { - 'target': { 'type': 'CLASS', 'name': 'net.minecraft.world.level.chunk.storage.ChunkStorage' }, - 'transformer': function(node) { - var patched = false; - for (var i = 0; i < node.methods.size(); ++i) { - var method = node.methods.get(i); - if (method.desc !== '(Lnet/minecraft/resources/ResourceKey;' + - 'Ljava/util/function/Supplier;' + NBT + 'Ljava/util/Optional;)' + NBT) continue; - - // Restore mod IDs before vanilla flattens the numeric block palette. - var prefix = new InsnList(); - prefix.add(new VarInsnNode(Opcodes.ALOAD, 3)); - prefix.add(new MethodInsnNode(Opcodes.INVOKESTATIC, HOOK, - 'prepareLegacyChunk', '(' + NBT + ')V', false)); - method.instructions.insert(prefix); - - for (var instruction = method.instructions.getFirst(); instruction !== null; - instruction = instruction.getNext()) { - if (instruction.getOpcode() === Opcodes.ARETURN) { - method.instructions.insertBefore(instruction, new MethodInsnNode(Opcodes.INVOKESTATIC, - HOOK, 'finalizeLegacyChunk', '(' + NBT + ')' + NBT, false)); - } - } - patched = true; - } - if (!patched) throw new Error('Base Metals could not attach its legacy chunk converter'); - return node; - } - }, - 'basemetals_legacy_worldgen_guard': { - 'target': { 'type': 'CLASS', 'name': 'net.minecraft.server.level.WorldGenRegion' }, - 'transformer': function(node) { - var patched = false; - for (var i = 0; i < node.methods.size(); ++i) { - var method = node.methods.get(i); - // Both setBlock and direct ore-section writes use this permission check. - if (method.name !== 'ensureCanWrite' - || method.desc !== '(Lnet/minecraft/core/BlockPos;)Z') continue; - var allowed = new LabelNode(); - var prefix = new InsnList(); - prefix.add(new VarInsnNode(Opcodes.ALOAD, 0)); - prefix.add(new VarInsnNode(Opcodes.ALOAD, 1)); - prefix.add(new MethodInsnNode(Opcodes.INVOKESTATIC, HOOK, - 'shouldBlockWorldgenWrite', '(Lnet/minecraft/server/level/WorldGenRegion;Lnet/minecraft/core/BlockPos;)Z', false)); - prefix.add(new JumpInsnNode(Opcodes.IFEQ, allowed)); - prefix.add(new InsnNode(Opcodes.ICONST_0)); - prefix.add(new InsnNode(Opcodes.IRETURN)); - prefix.add(allowed); - method.instructions.insert(prefix); - patched = true; - } - if (!patched) throw new Error('Base Metals could not protect existing legacy terrain'); - return node; - } - } - }; -} diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 5cb9139dd..64d20e29e 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { "description": "${mod_id} resources", - "pack_format": 34, - "supported_formats": {"min_inclusive": 34, "max_inclusive": 48} + "min_format": [94, 1], + "max_format": [94, 1] } } diff --git a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedClientSmokeMod.java b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedClientSmokeMod.java index 3ec3f80f2..f38c573df 100644 --- a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedClientSmokeMod.java +++ b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedClientSmokeMod.java @@ -1,6 +1,6 @@ package zone.moddev.mc.basemetals.smoke; -import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.fml.common.Mod; /** Loads the existing integrated-world assertions from an isolated packaged probe mod. */ @@ -9,7 +9,7 @@ public final class PackagedClientSmokeMod { public static final String MOD_ID = "basemetals_client_smoke"; public PackagedClientSmokeMod() { - MinecraftForge.EVENT_BUS.register(IntegratedWorldSmoke.class); - MinecraftForge.EVENT_BUS.register(RemoteLoginSmoke.class); + IntegratedWorldSmoke.register(); + TickEvent.ClientTickEvent.Post.BUS.addListener(RemoteLoginSmoke::tick); } } diff --git a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java index f7063c183..f7d52008b 100644 --- a/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java +++ b/src/packagedClientSmoke/java/zone/moddev/mc/basemetals/smoke/RemoteLoginSmoke.java @@ -5,9 +5,9 @@ import net.minecraft.client.gui.screens.DisconnectedScreen; import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.multiplayer.resolver.ServerAddress; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import zone.moddev.mc.basemetals.BaseMetals; import zone.moddev.mc.basemetals.config.BaseMetalsConfig; import zone.moddev.mc.basemetals.config.ContentMode; @@ -24,8 +24,8 @@ public final class RemoteLoginSmoke { private RemoteLoginSmoke() {} @SubscribeEvent - public static void tick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END || completed || !Boolean.getBoolean("basemetals.remoteLoginSmoke")) return; + public static void tick(TickEvent.ClientTickEvent.Post event) { + if (completed || !Boolean.getBoolean("basemetals.remoteLoginSmoke")) return; Minecraft minecraft = Minecraft.getInstance(); if (++ticks > 3600) throw new IllegalStateException("MODE_LOGIN_SMOKE FAIL: timed out at " + (minecraft.screen == null ? "gameplay" : minecraft.screen.getClass().getName())); @@ -43,16 +43,14 @@ public static void tick(TickEvent.ClientTickEvent event) { if (minecraft.player != null && minecraft.level != null) { if (reject) throw new IllegalStateException("MODE_LOGIN_SMOKE FAIL: mismatched modes entered gameplay"); if (++joinedTicks < 40) return; - var recipe = minecraft.level.getRecipeManager().byKey(ResourceLocation.parse("basemetals:adamantine_bow")) - .orElseThrow(); - if (recipe.value().isSpecial() != (BaseMetalsConfig.activeMode() == ContentMode.LOW_FANTASY)) { - throw new IllegalStateException("MODE_LOGIN_SMOKE FAIL: recipe policy was not synchronized"); + if (minecraft.player.connection == null) { + throw new IllegalStateException("MODE_LOGIN_SMOKE FAIL: gameplay has no live connection"); } connections++; if (connections < Integer.getInteger("basemetals.loginSmokeConnections", 1)) { BaseMetals.LOGGER.info("BASEMETALS_MODE_RECONNECT connection={}", connections); - minecraft.level.disconnect(); - minecraft.disconnect(new TitleScreen()); + minecraft.level.disconnect(net.minecraft.network.chat.Component.literal("Reconnect smoke")); + minecraft.disconnect(new TitleScreen(), false); connecting = false; titleTicks = 0; joinedTicks = 0; diff --git a/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml b/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml index c29d34d31..931fea1c0 100644 --- a/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml +++ b/src/packagedClientSmoke/packaged-resources/META-INF/mods.toml @@ -10,13 +10,13 @@ displayName="Base Metals packaged client smoke" [[dependencies.basemetals_client_smoke]] modId="basemetals" mandatory=true -versionRange="[3.1.1.121011]" +versionRange="[3.1.1.121111]" ordering="AFTER" side="CLIENT" [[dependencies.basemetals_client_smoke]] modId="orespawn" mandatory=true -versionRange="[4.1.0.121011]" +versionRange="[4.1.0.121111]" ordering="AFTER" side="CLIENT" diff --git a/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java index ff7522606..8d13fffd9 100644 --- a/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java +++ b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/PackagedServerSmoke.java @@ -10,9 +10,7 @@ import com.mojang.logging.LogUtils; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; @@ -23,27 +21,33 @@ public final class PackagedServerSmoke { private static final Logger LOGGER = LogUtils.getLogger(); public PackagedServerSmoke() { - MinecraftForge.EVENT_BUS.register(this); + ServerStartedEvent.BUS.addListener(this::onServerStarted); + + if (Boolean.getBoolean("basemetals.capabilityDiskSmoke")) { + SavedWorldCapabilitySmoke.register(); + } + if (Boolean.getBoolean("basemetals.upgradeWorldSmoke")) { try { - MinecraftForge.EVENT_BUS.register(Class.forName( - "zone.moddev.mc.basemetals.smoke.UpgradeWorldSmoke")); - } catch (ClassNotFoundException exception) { - throw new IllegalStateException("The upgrade probe is missing from the test jar", exception); + Class.forName("zone.moddev.mc.basemetals.smoke.UpgradeWorldSmoke") + .getMethod("register").invoke(null); + } catch (ReflectiveOperationException exception) { + throw new IllegalStateException("Could not register the isolated upgrade probe", exception); } } } - @SubscribeEvent - public void onServerStarted(ServerStartedEvent event) throws IOException { + public void onServerStarted(ServerStartedEvent event) { String baseMetals = version("basemetals"); String oreSpawn = version("orespawn"); - if (!"3.1.1.121011".equals(baseMetals) || !"4.1.0.121011".equals(oreSpawn)) { + if (!"3.1.1.121111".equals(baseMetals) || !"4.1.0.121111".equals(oreSpawn)) { throw new IllegalStateException("PACKAGED_SERVER_SMOKE FAIL versions basemetals=" + baseMetals + " orespawn=" + oreSpawn); } verifyContent(event.getServer()); if (Boolean.getBoolean("basemetals.oreSampleSmoke")) verifyOreSample(event.getServer()); + if (Boolean.getBoolean("basemetals.modernFlatWorldSmoke")) verifyModernFlatTerrain(event.getServer()); + if (Boolean.getBoolean("basemetals.capabilityDiskSmoke")) SavedWorldCapabilitySmoke.verify(event.getServer()); Properties result = new Properties(); result.setProperty("basemetals", baseMetals); result.setProperty("orespawn", oreSpawn); @@ -52,6 +56,8 @@ public void onServerStarted(ServerStartedEvent event) throws IOException { .resolve("packaged-server-smoke-pass.properties"); try (var writer = Files.newBufferedWriter(marker, StandardCharsets.UTF_8)) { result.store(writer, "Base Metals packaged dedicated-server smoke"); + } catch (IOException exception) { + throw new java.io.UncheckedIOException("Could not save the server smoke result", exception); } LOGGER.info("BASEMETALS_PACKAGED_SERVER_SMOKE PASS basemetals={} orespawn={} forge={}", baseMetals, oreSpawn, result.getProperty("forge")); @@ -66,7 +72,7 @@ private static String version(String modId) { .getModInfo().getVersion().toString(); } - private static void verifyContent(net.minecraft.server.MinecraftServer server) throws IOException { + private static void verifyContent(net.minecraft.server.MinecraftServer server) { var level = server.overworld(); var policy = zone.moddev.mc.basemetals.config.ContentPolicy.active(); var items = zone.moddev.mc.basemetals.content.ModContent.itemsById(); @@ -74,21 +80,25 @@ private static void verifyContent(net.minecraft.server.MinecraftServer server) t for (var entry : items.entrySet()) { String id = entry.getKey(); if (id.endsWith("_powder") || id.endsWith("_smallpowder") || id.endsWith("_nugget")) { - int burn = net.minecraftforge.common.ForgeHooks.getBurnTime(entry.getValue().get().getDefaultInstance(), + int burn = server.fuelValues().burnDuration(entry.getValue().get().getDefaultInstance(), net.minecraft.world.item.crafting.RecipeType.SMELTING); int expected = id.startsWith("coal_") || id.startsWith("charcoal_") ? (id.endsWith("_powder") ? 1600 : 200) : 0; if (burn != expected) throw new IllegalStateException(id + " has burn time " + burn + ", expected " + expected); } } - var bow = server.getRecipeManager().byKey(net.minecraft.resources.ResourceLocation.parse("basemetals:adamantine_bow")) + var bow = server.getRecipeManager().byKey(net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.RECIPE, net.minecraft.resources.Identifier.parse("basemetals:adamantine_bow"))) .orElseThrow(); boolean enabled = !bow.value().isSpecial(); if (enabled != policy.allows("basemetals:adamantine_bow")) { throw new IllegalStateException("The recipe book does not follow the active content mode"); } if (ModList.get().isLoaded("tconstruct")) verifyTinkers(); - verifyIntegrationRecipes(server); + try { + verifyIntegrationRecipes(server); + } catch (IOException exception) { + throw new java.io.UncheckedIOException("Could not read the integration recipes", exception); + } LOGGER.info("BASEMETALS_PACKAGED_CONTENT PASS mode={} items={}", zone.moddev.mc.basemetals.config.BaseMetalsConfig.activeMode().serializedName(), items.size()); } @@ -112,9 +122,9 @@ private static void verifyIntegrationRecipes(net.minecraft.server.MinecraftServe if (!"basemetals:content_mode".equals(object.get("type").getAsString())) continue; enabled &= policy.allows(object.get("item").getAsString()); } - var id = net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("basemetals", + var id = net.minecraft.resources.Identifier.fromNamespaceAndPath("basemetals", path.substring("recipe/".length(), path.length() - ".json".length())); - if (server.getRecipeManager().byKey(id).isPresent() != enabled) { + if (server.getRecipeManager().byKey(net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.RECIPE, id)).isPresent() != enabled) { throw new IllegalStateException("Integration recipe does not follow content mode: " + id); } checked++; @@ -132,8 +142,11 @@ private static void verifyOreSample(net.minecraft.server.MinecraftServer server) for (var level : server.getAllLevels()) { var dimension = level.dimension(); var counts = new java.util.TreeMap(); - for (int chunkX = 0; chunkX < 3; chunkX++) { - for (int chunkZ = 0; chunkZ < 3; chunkZ++) { + int start = dimension == net.minecraft.world.level.Level.OVERWORLD + ? Integer.getInteger("basemetals.oreSampleOverworldChunkStart", 0) : 0; + + for (int chunkX = start; chunkX < start + 3; chunkX++) { + for (int chunkZ = start; chunkZ < start + 3; chunkZ++) { var chunk = level.getChunk(chunkX, chunkZ); for (var section : chunk.getSections()) { for (int x = 0; x < 16; x++) for (int y = 0; y < 16; y++) for (int z = 0; z < 16; z++) { @@ -153,11 +166,58 @@ private static void verifyOreSample(net.minecraft.server.MinecraftServer server) } } if (counts.isEmpty()) throw new IllegalStateException("No Base Metals ores in " + dimension); - LOGGER.info("BASEMETALS_ORE_SAMPLE PASS dimension={} chunks=9 ores={}", dimension.location(), counts); + if (Boolean.getBoolean("basemetals.tagOnlyTinSmoke") + && dimension == net.minecraft.world.level.Level.OVERWORLD + && counts.getOrDefault("tin_ore", 0) == 0) { + throw new IllegalStateException("The tag-only tin rule produced no ore after tags were loaded"); + } + LOGGER.info("BASEMETALS_ORE_SAMPLE PASS dimension={} chunks=9 ores={}", dimension.identifier(), counts); } } private static void verifyTinkers() { - throw new IllegalStateException("Tinkers integration is not enabled in this Forge 1.21.1 build"); + throw new IllegalStateException("Tinkers integration is not enabled in this Forge 1.21.11 build"); + } + + private static void verifyModernFlatTerrain(net.minecraft.server.MinecraftServer server) { + var level = server.overworld(); + if (!(level.getChunkSource().getGenerator() instanceof net.minecraft.world.level.levelgen.FlatLevelSource)) { + throw new IllegalStateException("The modern-world control must use its captured flat generator"); + } + + int start = Boolean.getBoolean("basemetals.modernLaterChunkSmoke") ? 10 : 0; + int checked = 0; + + for (int chunkX = start; chunkX < start + 3; chunkX++) { + for (int chunkZ = start; chunkZ < start + 3; chunkZ++) { + var chunk = level.getChunk(chunkX, chunkZ); + + for (int sectionIndex = 0; sectionIndex < chunk.getSectionsCount(); sectionIndex++) { + var section = chunk.getSection(sectionIndex); + int bottom = chunk.getSectionYFromSectionIndex(sectionIndex) * 16; + + for (int y = 0; y < 16; y++) { + int height = bottom + y; + var expected = height == -64 ? net.minecraft.world.level.block.Blocks.BEDROCK + : height == -63 || height == -62 ? net.minecraft.world.level.block.Blocks.DIRT + : height == -61 ? net.minecraft.world.level.block.Blocks.GRASS_BLOCK + : net.minecraft.world.level.block.Blocks.AIR; + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + if (!section.getBlockState(x, y, z).is(expected)) { + throw new IllegalStateException("Modern terrain changed at chunk " + + chunk.getPos() + ", local " + x + "," + height + "," + z); + } + checked++; + } + } + } + } + } + } + + LOGGER.info("BASEMETALS_MODERN_TERRAIN PASS blocks={} later_chunks={}", + checked, start != 0); } } diff --git a/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/SavedWorldCapabilitySmoke.java b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/SavedWorldCapabilitySmoke.java new file mode 100644 index 000000000..a4bfe668c --- /dev/null +++ b/src/packagedServerSmoke/java/zone/moddev/mc/basemetals/smoke/SavedWorldCapabilitySmoke.java @@ -0,0 +1,68 @@ +package zone.moddev.mc.basemetals.smoke; + +import java.util.IdentityHashMap; +import java.util.Map; + +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import zone.moddev.mc.basemetals.BaseMetals; + +/** Checks an actual older capabilities.dat file through Forge's normal load and save path. */ +final class SavedWorldCapabilitySmoke { + private static final Map LEVELS = new IdentityHashMap<>(); + + private SavedWorldCapabilitySmoke() {} + + static void register() { + AttachCapabilitiesEvent.Levels.BUS.addListener(event -> { + var data = new ProbeData(); + LEVELS.put(event.getObject(), data); + event.addCapability(Identifier.parse("basemetals_server_smoke:legacy_data"), data); + }); + } + + static void verify(MinecraftServer server) { + var data = LEVELS.get(server.overworld()); + var expected = new CompoundTag(); + expected.putInt("counter", 37); + expected.putString("note", "Saved before Forge 61"); + var nested = new CompoundTag(); + nested.putIntArray("custom_array", new int[] {4, 8, 15, 16, 23, 42}); + nested.putString("owner", "Existing world"); + expected.put("nested", nested); + + if (data == null || !expected.equals(data.value)) { + throw new IllegalStateException("Saved world-capability data was lost or changed: " + + (data == null ? "no provider" : data.value)); + } + + BaseMetals.LOGGER.info("BASEMETALS_SAVED_CAPABILITY PASS nonempty_disk_payload=unchanged"); + } + + private static final class ProbeData implements ICapabilitySerializable { + private CompoundTag value = new CompoundTag(); + + @Override + public LazyOptional getCapability(Capability capability, Direction side) { + return LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider registries) { + return value.copy(); + } + + @Override + public void deserializeNBT(HolderLookup.Provider registries, CompoundTag saved) { + value = saved.copy(); + } + } +} diff --git a/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml b/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml index 2b4aea8b7..b03103032 100644 --- a/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml +++ b/src/packagedServerSmoke/packaged-resources/META-INF/mods.toml @@ -10,13 +10,13 @@ displayName="Base Metals packaged server smoke" [[dependencies.basemetals_server_smoke]] modId="basemetals" mandatory=true -versionRange="[3.1.1.121011]" +versionRange="[3.1.1.121111]" ordering="AFTER" side="SERVER" [[dependencies.basemetals_server_smoke]] modId="orespawn" mandatory=true -versionRange="[4.1.0.121011]" +versionRange="[4.1.0.121111]" ordering="AFTER" side="SERVER" diff --git a/src/smoke/datapack/pack.mcmeta b/src/smoke/datapack/pack.mcmeta index 848430838..e601bae19 100644 --- a/src/smoke/datapack/pack.mcmeta +++ b/src/smoke/datapack/pack.mcmeta @@ -1,6 +1,7 @@ { "pack": { - "pack_format": 48, + "min_format": [94, 1], + "max_format": [94, 1], "description": "Base Metals custom ordinary dimension smoke fixture" } } diff --git a/src/test/java/zone/moddev/mc/basemetals/MechanicsContractTest.java b/src/test/java/zone/moddev/mc/basemetals/MechanicsContractTest.java index de5ede19d..534fe6b76 100644 --- a/src/test/java/zone/moddev/mc/basemetals/MechanicsContractTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/MechanicsContractTest.java @@ -20,7 +20,7 @@ void historicalAliasesResolveToTheirPreservedIds() { assertEquals("adamantine_door", MissingMappings.itemTargetPath("adamantine_door_item")); assertEquals("minecraft:iron_nugget", MissingMappings.itemTargetId("iron_nugget").toString()); assertEquals("mercury", MissingMappings.blockTargetPath( - net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("mmdlib", "liquid_mercury").getPath())); + net.minecraft.resources.Identifier.fromNamespaceAndPath("mmdlib", "liquid_mercury").getPath())); assertEquals("double_diamond_slab", MissingMappings.blockTargetPath("double_diamond_slab")); assertEquals("human_detector", MissingMappings.blockTargetPath("human_detector")); assertEquals("emerald_bow", MissingMappings.itemTargetPath("emerald_bow")); diff --git a/src/test/java/zone/moddev/mc/basemetals/data/CopperCompatibilityTest.java b/src/test/java/zone/moddev/mc/basemetals/data/CopperCompatibilityTest.java index 1eb2dccce..33426e606 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/CopperCompatibilityTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/CopperCompatibilityTest.java @@ -17,7 +17,12 @@ class CopperCompatibilityTest { void overlappingCraftingRecipesProduceVanillaItems() throws Exception { for (var entry : VanillaCopper.equivalents().entrySet()) { String id = entry.getKey().substring("basemetals:".length()); - String recipeId = id.equals("copper_ingot") ? "copper_ingot_from_nuggets" : id; + String recipeId = switch (id) { + case "copper_ingot" -> "copper_ingot_from_nuggets"; + case "copper_nugget" -> "copper_nuggets"; + case "copper_horse_armor" -> "copper_horsearmor"; + default -> id; + }; assertEquals(entry.getValue(), recipe(recipeId).getAsJsonObject("result") .get("id").getAsString(), recipeId); @@ -31,7 +36,8 @@ void oldCopperItemsAndBlocksRemainRegistered() throws Exception { for (String item : VanillaCopper.equivalents().keySet()) { assertTrue(manifest.getAsJsonArray("items").toString().contains('"' + item + '"'), item); - if (!item.endsWith("_ingot")) { + if (java.util.List.of("block", "door", "trapdoor", "slab", "stairs", "bars") + .contains(item.substring("basemetals:copper_".length()))) { assertTrue(manifest.getAsJsonArray("blocks").toString().contains('"' + item + '"'), item); } } @@ -79,6 +85,6 @@ private static JsonObject recipe(String id) throws Exception { } private static JsonObject read(Path path) throws Exception { - return JsonParser.parseString(Files.readString(path)).getAsJsonObject(); + return RecipeDataSemantics.normalize(JsonParser.parseString(Files.readString(path))).getAsJsonObject(); } } diff --git a/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java b/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java index cb78a6ecf..f599ed042 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/Minecraft1211ResourceTest.java @@ -14,12 +14,15 @@ class Minecraft1211ResourceTest { @Test - void resourceAndDataPacksUseThe1211Formats() throws Exception { + void resourceAndDataPacksUseThe12111Formats() throws Exception { var pack = read("src/main/resources/pack.mcmeta").getAsJsonObject("pack"); - assertEquals(34, pack.get("pack_format").getAsInt()); - var formats = pack.getAsJsonObject("supported_formats"); - assertEquals(34, formats.get("min_inclusive").getAsInt()); - assertEquals(48, formats.get("max_inclusive").getAsInt()); + assertEquals("[94,1]", pack.get("min_format").toString()); + assertEquals("[94,1]", pack.get("max_format").toString()); + net.minecraft.SharedConstants.tryDetectVersion(); + var resources = net.minecraft.SharedConstants.getCurrentVersion() + .packVersion(net.minecraft.server.packs.PackType.CLIENT_RESOURCES); + assertEquals(75, resources.major()); + assertEquals(0, resources.minor()); } @Test diff --git a/src/test/java/zone/moddev/mc/basemetals/data/NativeAssetDefinitionTest.java b/src/test/java/zone/moddev/mc/basemetals/data/NativeAssetDefinitionTest.java new file mode 100644 index 000000000..68288d789 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basemetals/data/NativeAssetDefinitionTest.java @@ -0,0 +1,90 @@ +package zone.moddev.mc.basemetals.data; + +import static org.junit.jupiter.api.Assertions.*; + +import java.nio.file.Files; +import java.nio.file.Path; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.junit.jupiter.api.Test; + +class NativeAssetDefinitionTest { + private static final Path ASSETS = Path.of("src/generated/resources/assets/basemetals"); + + @Test + void everySavedItemHasANativeModelDefinition() throws Exception { + var manifest = read(Path.of("src/generated/resources/data/basemetals/registry_manifest.json")); + int count = 0; + for (var item : manifest.getAsJsonArray("items")) { + String id = item.getAsString().substring("basemetals:".length()); + var definition = read(ASSETS.resolve("items/" + id + ".json")); + assertTrue(definition.has("model"), id); + checkModels(definition.get("model")); + count++; + } + assertEquals(1127, count); + } + + @Test + void armourAssetsHaveBothPlayerLayersAndTheHorseLayer() throws Exception { + try (var files = Files.list(ASSETS.resolve("equipment"))) { + for (Path file : files.toList()) { + var layers = read(file).getAsJsonObject("layers"); + for (String layer : new String[] {"humanoid", "humanoid_leggings", "horse_body"}) { + String texture = layers.getAsJsonArray(layer).get(0).getAsJsonObject() + .get("texture").getAsString().substring("basemetals:".length()); + assertTrue(Files.isRegularFile(ASSETS.resolve( + "textures/entity/equipment/" + layer + "/" + texture + ".png")), file.toString()); + } + } + } + } + + @Test + void filledBucketsKeepTheirSpritesOnTheBlockAtlas() throws Exception { + var atlas = read(Path.of("src/main/resources/assets/minecraft/atlases/blocks.json")); + assertEquals(3, atlas.getAsJsonArray("sources").size()); + + try (var files = Files.list(ASSETS.resolve("models/item"))) { + var buckets = files.filter(file -> file.getFileName().toString().endsWith("_bucket.json")).toList(); + assertEquals(36, buckets.size()); + + for (Path file : buckets) { + var textures = read(file).getAsJsonObject("textures"); + assertEquals("basemetals:block/bucket_base", textures.get("base").getAsString()); + assertEquals("basemetals:block/bucket_cover", textures.get("cover").getAsString()); + assertEquals("#base", textures.get("particle").getAsString()); + } + } + } + + @Test + void copperAgeAddsNoNewSaveIdentities() { + assertEquals(18, zone.moddev.mc.basemetals.compat.VanillaCopper.equivalents().size()); + assertEquals("minecraft:copper_nugget", zone.moddev.mc.basemetals.compat.VanillaCopper.output("basemetals:copper_nugget")); + assertEquals("minecraft:copper_horse_armor", zone.moddev.mc.basemetals.compat.VanillaCopper.output("basemetals:copper_horse_armor")); + assertEquals("basemetals:copper_bow", zone.moddev.mc.basemetals.compat.VanillaCopper.output("basemetals:copper_bow")); + } + + private static void checkModels(JsonElement element) { + if (element.isJsonArray()) { + element.getAsJsonArray().forEach(NativeAssetDefinitionTest::checkModels); + } else if (element.isJsonObject()) { + var object = element.getAsJsonObject(); + if (object.has("model") && object.get("model").isJsonPrimitive()) { + String model = object.get("model").getAsString(); + if (model.startsWith("basemetals:")) { + String path = "models/" + model.substring("basemetals:".length()) + ".json"; + assertTrue(Files.isRegularFile(ASSETS.resolve(path)) || Files.isRegularFile( + Path.of("src/main/resources/assets/basemetals").resolve(path)), model); + } + } + object.entrySet().forEach(entry -> checkModels(entry.getValue())); + } + } + + private static JsonObject read(Path file) throws Exception { + return JsonParser.parseString(Files.readString(file)).getAsJsonObject(); + } +} diff --git a/src/test/java/zone/moddev/mc/basemetals/data/OreOverlayModelTest.java b/src/test/java/zone/moddev/mc/basemetals/data/OreOverlayModelTest.java index b81d489e2..d68a838e0 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/OreOverlayModelTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/OreOverlayModelTest.java @@ -53,8 +53,9 @@ void allThirteenNativeModelsKeepKirisTwoLayerGeometry() throws Exception { @Test void providerUsesForgeAndRemainsOutsideTheProductionSourceSet() throws Exception { String provider = Files.readString(Paths.get("src/dataGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java")); - assertTrue(provider.contains("extends BlockStateProvider")); - assertTrue(provider.contains(".allFaces((direction, face) -> face.texture(\"#overlay\").cullface(direction))")); + assertTrue(provider.contains("implements DataProvider")); + assertTrue(provider.contains("elements.add(cube(-OVERLAY_OFFSET, 16 + OVERLAY_OFFSET, \"#overlay\"))")); + assertTrue(provider.contains("\"texture\", texture, \"cullface\", direction")); assertTrue(provider.contains("@author KiriCattus")); assertFalse(Files.isRegularFile(Paths.get("src/modelGenerator/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java"))); assertFalse(Files.exists(Paths.get("src/main/java/zone/moddev/mc/basemetals/data/BMBlockStateProvider.java"))); diff --git a/src/test/java/zone/moddev/mc/basemetals/data/RecipeDataSemantics.java b/src/test/java/zone/moddev/mc/basemetals/data/RecipeDataSemantics.java new file mode 100644 index 000000000..9c12b4b13 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basemetals/data/RecipeDataSemantics.java @@ -0,0 +1,44 @@ +package zone.moddev.mc.basemetals.data; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +/** Lets historical quantity checks compare ingredients independently of their JSON spelling. */ +final class RecipeDataSemantics { + private RecipeDataSemantics() {} + + static JsonElement normalize(JsonElement value) { + if (!value.isJsonObject()) return value; + JsonObject recipe = value.getAsJsonObject(); + if (recipe.has("recipe")) normalize(recipe.get("recipe")); + + for (String field : new String[] {"ingredient", "ingredients", "plate"}) { + if (recipe.has(field)) recipe.add(field, ingredient(recipe.get(field))); + } + if (recipe.has("key") && recipe.get("key").isJsonObject()) { + JsonObject key = recipe.getAsJsonObject("key"); + for (String symbol : new java.util.ArrayList<>(key.keySet())) { + key.add(symbol, ingredient(key.get(symbol))); + } + } + + return value; + } + + private static JsonElement ingredient(JsonElement value) { + if (value.isJsonPrimitive()) { + String id = value.getAsString(); + JsonObject result = new JsonObject(); + result.addProperty(id.startsWith("#") ? "tag" : "item", id.startsWith("#") ? id.substring(1) : id); + return result; + } + if (value.isJsonArray()) { + JsonArray result = new JsonArray(); + value.getAsJsonArray().forEach(entry -> result.add(ingredient(entry))); + return result; + } + + return value; + } +} diff --git a/src/test/java/zone/moddev/mc/basemetals/data/RecipeRegressionTest.java b/src/test/java/zone/moddev/mc/basemetals/data/RecipeRegressionTest.java index ced63a243..2d7b7f4a6 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/RecipeRegressionTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/RecipeRegressionTest.java @@ -202,7 +202,7 @@ private static double units(JsonObject ingredient, String material) { private static JsonObject read(Path path) throws Exception { try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { - JsonObject json = new JsonParser().parse(reader).getAsJsonObject(); + JsonObject json = RecipeDataSemantics.normalize(JsonParser.parseReader(reader)).getAsJsonObject(); return json.has("recipe") ? json.getAsJsonObject("recipe") : json; } } diff --git a/src/test/java/zone/moddev/mc/basemetals/data/ResourceIntegrityTest.java b/src/test/java/zone/moddev/mc/basemetals/data/ResourceIntegrityTest.java index d63572d90..e1f6ff68e 100644 --- a/src/test/java/zone/moddev/mc/basemetals/data/ResourceIntegrityTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/data/ResourceIntegrityTest.java @@ -384,7 +384,7 @@ void legacyCraftingYieldsIngredientsAndAlternateRecipesAreRestored() throws Exce assertRecipeIngredientTag("copper_block_ingot", "forge:storage_blocks/copper"); assertRecipeIngredientTag("tin_block_ingot", "forge:storage_blocks/tin"); assertRecipeIngredientTag("copper_nuggets", "forge:ingots/copper"); - assertRecipeKeyItem("copper_ingot_from_nuggets", "X", "basemetals:copper_nugget"); + assertRecipeKeyTag("copper_ingot_from_nuggets", "X", "forge:nuggets/copper"); assertRecipeResult("iron_plate", "basemetals:iron_plate", 3); assertRecipeResult("gold_plate", "basemetals:gold_plate", 3); @@ -706,6 +706,28 @@ private static String path(String id) { } private static void assertResource(String relative) { + if (relative.startsWith("assets/basemetals/textures/") && relative.endsWith(".png")) { + String sprite = "basemetals:" + relative.substring("assets/basemetals/textures/".length(), + relative.length() - ".png".length()); + + try { + var sources = JsonParser.parseString(Files.readString( + MAIN.resolve("assets/minecraft/atlases/blocks.json"))) + .getAsJsonObject().getAsJsonArray("sources"); + + for (var source : sources) { + var alias = source.getAsJsonObject(); + if (alias.has("sprite") && alias.get("sprite").getAsString().equals(sprite)) { + assertEquals("minecraft:single", alias.get("type").getAsString()); + assertTrue(alias.get("resource").getAsString().matches("(?:minecraft|forge):[a-z0-9_./-]+")); + return; + } + } + } catch (IOException exception) { + throw new AssertionError("Could not read the block-atlas aliases", exception); + } + } + assertTrue(Files.isRegularFile(resource(relative)), "Missing resource " + relative); } @@ -717,7 +739,7 @@ private static Path resource(String relative) { private static JsonElement read(Path path) throws IOException { try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { - JsonElement value = JsonParser.parseReader(reader); + JsonElement value = RecipeDataSemantics.normalize(JsonParser.parseReader(reader)); if (value.isJsonObject() && value.getAsJsonObject().has("recipe") && "basemetals:content_crafting".equals(value.getAsJsonObject().get("type").getAsString())) { return value.getAsJsonObject().get("recipe"); diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java index 6a88ed8f5..bc97cb1fd 100644 --- a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyMigrationSafetyTest.java @@ -40,6 +40,12 @@ /** Checks the migration boundary without opening a player's save. */ class LegacyMigrationSafetyTest { + @BeforeAll + static void bootstrapRegistries() { + SharedConstants.tryDetectVersion(); + net.minecraft.server.Bootstrap.bootStrap(); + } + @TempDir(cleanup = CleanupMode.ON_SUCCESS) Path temporaryWorld; @@ -94,7 +100,7 @@ void modernExternalChunk() throws Exception { @Test void modernLz4Chunk() throws Exception { - assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.1"), "Native LZ4 is not available on older targets"); + assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11"), "Native LZ4 is not available on older targets"); Path world = world("lz4", false); Path file = region(world, false, true); assertTrue(nativeAccepts(file, false)); @@ -171,7 +177,7 @@ void savedRegistryCanBeScannedWithAnEmptyRegion() throws Exception { @Test void savedRegistryCanBeScannedWithLz4Chunks() throws Exception { - assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.1")); + assumeTrue(VERSION.equals("1.20.6") || VERSION.equals("1.21.11")); Path world = world("saved-registry-lz4", false); writeRegistry(world.resolve("basemetals-legacy-registry.dat")); Path file = region(world, false, true); @@ -274,9 +280,9 @@ void mixedRegionsAndLaterOpenedCustomDimensionChunksKeepTheirContents() throws E for (Path file : Arrays.asList(mixed, later)) { int index = file.equals(mixed) ? 1 : 0; CompoundTag chunk = readRegionChunk(file, index); - assertEquals(1456, chunk.getInt("DataVersion")); + assertEquals(1456, chunk.getIntOr("DataVersion", 0)); assertEquals("example:legacy_block", - Legacy112WorldMigrator.stateAtForTest(chunk, 0, 0).getString("Name")); + Legacy112WorldMigrator.stateAtForTest(chunk, 0, 0).getStringOr("Name", "")); assertTrue(Files.exists(world.resolve("basemetals-1.12-region-backup").resolve(world.relativize(file)))); } assertEquals(37, experience(world.resolve("level.dat"))); @@ -440,7 +446,7 @@ private static void integer(DataOutputStream output, String key, int value) thro private static int experience(Path file) throws IOException { try (DataInputStream input = new DataInputStream(new GZIPInputStream(Files.newInputStream(file)))) { - return NbtIo.read(input).getCompound("Data").getCompound("Player").getInt("XpLevel"); + return NbtIo.read(input).getCompoundOrEmpty("Data").getCompoundOrEmpty("Player").getIntOr("XpLevel", 0); } } @@ -488,7 +494,7 @@ private static boolean nativeAccepts(Path file, boolean empty) throws IOExceptio } assertNotNull(input); - assertEquals(DATA_VERSION, NbtIo.read(input).getInt("DataVersion")); + assertEquals(DATA_VERSION, NbtIo.read(input).getIntOr("DataVersion", 0)); return true; } } diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldCapabilityCodecTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldCapabilityCodecTest.java new file mode 100644 index 000000000..c6834aa63 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldCapabilityCodecTest.java @@ -0,0 +1,43 @@ +package zone.moddev.mc.basemetals.migration; + +import static org.junit.jupiter.api.Assertions.*; + +import com.mojang.serialization.Codec; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import org.junit.jupiter.api.Test; + +class LegacyWorldCapabilityCodecTest { + private static final Codec CODEC = LegacyWorldCapabilityCodec.acceptLegacyPayload( + CompoundTag.CODEC.fieldOf("data").codec()); + + @Test + void readsBothFormatsAndWritesOnlyTheCurrentFormat() { + CompoundTag contents = new CompoundTag(); + contents.putLongArray("custom_array", new long[] {11, 22, 33}); + contents.putString("owner", "Existing world"); + CompoundTag legacy = new CompoundTag(); + legacy.put("another_mod:world_data", contents); + CompoundTag original = legacy.copy(); + + CompoundTag loaded = CODEC.parse(NbtOps.INSTANCE, legacy).getOrThrow(); + assertEquals(original, loaded); + assertEquals(original, legacy, "Reading must not modify the original tag"); + + var encoded = CODEC.encodeStart(NbtOps.INSTANCE, loaded).getOrThrow(); + assertEquals(original, ((CompoundTag) encoded).getCompoundOrEmpty("data")); + assertEquals(original, CODEC.parse(NbtOps.INSTANCE, encoded).getOrThrow()); + } + + @Test + void acceptsEmptyOldDataButRejectsBrokenCurrentData() { + assertTrue(CODEC.parse(NbtOps.INSTANCE, new CompoundTag()).isSuccess()); + CompoundTag malformed = new CompoundTag(); + malformed.putInt("data", 12); + assertTrue(CODEC.parse(NbtOps.INSTANCE, malformed).isError()); + + CompoundTag unrelated = new CompoundTag(); + unrelated.putString("unexpected_key", "not a capability ID"); + assertTrue(CODEC.parse(NbtOps.INSTANCE, unrelated).isError()); + } +} diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHookTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHookTest.java index 56b504510..f41222cd1 100644 --- a/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHookTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/migration/LegacyWorldDataHookTest.java @@ -9,21 +9,20 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; class LegacyWorldDataHookTest { @TempDir Path world; @Test void levelHookPassesTheFileBeforeComponentConversion() throws IOException { - String hook = Files.readString(Path.of("src/main/resources/coremods/basemetals_118_compatibility.js")); - int start = hook.indexOf("'basemetals_legacy_world_info'"); - int end = hook.indexOf("'basemetals_legacy_chunk_status'"); - String levelHook = hook.substring(start, end); - assertTrue(levelHook.contains("'readLevelDataTagFixed'")); - assertTrue(levelHook.contains("'toFile', '()Ljava/io/File;'")); - assertFalse(levelHook.contains("'getParent'")); - assertTrue(levelHook.contains("'prepareLegacyWorld'")); + String hook = Files.readString(Path.of( + "src/main/java/zone/moddev/mc/basemetals/mixin/LevelStorageSourceMixin.java")); + assertTrue(hook.contains("method = \"readLevelDataTagFixed\"")); + assertTrue(hook.contains("at = @At(\"HEAD\")")); + assertTrue(hook.contains("prepareLegacyWorld(file.toFile())")); + assertTrue(hook.contains("file.getFileName().toString().equals(\"level.dat\")")); + assertFalse(hook.contains("getParent")); } @Test @@ -34,10 +33,10 @@ void obsoleteVanillaBiomeSnapshotIsRemovedWithoutChangingSavedBiomesOrOtherRegis root.put("Data", data); CompoundTag blocks = new CompoundTag(); blocks.putInt("marker", 42); - root.getCompound("fml").getCompound("Registries").put("minecraft:block", blocks); + root.getCompoundOrEmpty("fml").getCompoundOrEmpty("Registries").put("minecraft:block", blocks); assertTrue(LegacyWorldDataHook.removeObsoleteVanillaBiomeSnapshot(root)); - assertEquals(data, root.getCompound("Data")); - assertEquals(blocks, root.getCompound("fml").getCompound("Registries").getCompound("minecraft:block")); + assertEquals(data, root.getCompoundOrEmpty("Data")); + assertEquals(blocks, root.getCompoundOrEmpty("fml").getCompoundOrEmpty("Registries").getCompoundOrEmpty("minecraft:block")); assertFalse(LegacyWorldDataHook.removeObsoleteVanillaBiomeSnapshot(root)); } @@ -53,7 +52,7 @@ void moddedUnknownAndOverriddenBiomeSnapshotsAreNotRemoved() { CompoundTag root = biomeSnapshot("minecraft:plains"); ListTag entries = new ListTag(); entries.add(new CompoundTag()); - root.getCompound("fml").getCompound("Registries").getCompound("minecraft:worldgen/biome").put(list, entries); + root.getCompoundOrEmpty("fml").getCompoundOrEmpty("Registries").getCompoundOrEmpty("minecraft:worldgen/biome").put(list, entries); CompoundTag before = root.copy(); assertFalse(LegacyWorldDataHook.removeObsoleteVanillaBiomeSnapshot(root)); assertEquals(before, root); @@ -83,15 +82,15 @@ private static CompoundTag biomeSnapshot(String... names) { void oldCustomOverworldDimensionsUseTheNativeBiomeSourceReplacement() { CompoundTag root = dimensionFixture("minecraft:vanilla_layered", "minecraft:overworld"); CompoundTag generator = dimensionGenerator(root); - generator.getCompound("biome_source").putBoolean("large_biomes", true); + generator.getCompoundOrEmpty("biome_source").putBoolean("large_biomes", true); assertTrue(LegacyWorldDataHook.migrateRemovedVanillaBiomeSources(root)); - assertEquals("minecraft:multi_noise", generator.getCompound("biome_source").getString("type")); - assertEquals("minecraft:overworld", generator.getCompound("biome_source").getString("preset")); - assertEquals("minecraft:large_biomes", generator.getString("settings")); - assertEquals(1234L, generator.getLong("seed")); - assertEquals("example:overworld", root.getCompound("Data").getCompound("WorldGenSettings") - .getCompound("dimensions").getCompound("example:overworld").getString("type")); + assertEquals("minecraft:multi_noise", generator.getCompoundOrEmpty("biome_source").getStringOr("type", "")); + assertEquals("minecraft:overworld", generator.getCompoundOrEmpty("biome_source").getStringOr("preset", "")); + assertEquals("minecraft:large_biomes", generator.getStringOr("settings", "")); + assertEquals(1234L, generator.getLongOr("seed", 0L)); + assertEquals("example:overworld", root.getCompoundOrEmpty("Data").getCompoundOrEmpty("WorldGenSettings") + .getCompoundOrEmpty("dimensions").getCompoundOrEmpty("example:overworld").getStringOr("type", "")); assertFalse(LegacyWorldDataHook.migrateRemovedVanillaBiomeSources(root)); } @@ -103,7 +102,7 @@ void biomeSourceMigrationLeavesModdedAndModernWorldSettingsAlone() { assertEquals(copy, modded); CompoundTag modern = dimensionFixture("minecraft:vanilla_layered", "minecraft:overworld"); - modern.getCompound("Data").putInt("DataVersion", 2975); + modern.getCompoundOrEmpty("Data").putInt("DataVersion", 2975); assertFalse(LegacyWorldDataHook.migrateRemovedVanillaBiomeSources(modern)); } @@ -131,8 +130,8 @@ private static CompoundTag dimensionFixture(String source, String settings) { } private static CompoundTag dimensionGenerator(CompoundTag root) { - return root.getCompound("Data").getCompound("WorldGenSettings").getCompound("dimensions") - .getCompound("example:overworld").getCompound("generator"); + return root.getCompoundOrEmpty("Data").getCompoundOrEmpty("WorldGenSettings").getCompoundOrEmpty("dimensions") + .getCompoundOrEmpty("example:overworld").getCompoundOrEmpty("generator"); } @Test @@ -146,9 +145,9 @@ void oldWallConnectionsBecomeNativeHeightsWithoutChangingTallConnections() { wall.put("Properties", properties); assertEquals(2, LegacyWorldDataHook.migrateWallStates(wall)); - assertEquals("low", properties.getString("north")); - assertEquals("none", properties.getString("east")); - assertEquals("tall", properties.getString("south")); + assertEquals("low", properties.getStringOr("north", "")); + assertEquals("none", properties.getStringOr("east", "")); + assertEquals("tall", properties.getStringOr("south", "")); assertEquals(0, LegacyWorldDataHook.migrateWallStates(wall)); } @@ -166,7 +165,7 @@ void modernChunkCleanupRemovesOnlyBedsAtBaseMetalsBlocks() { assertEquals(1, LegacyWorldDataHook.removePhantomBedEntities(root)); assertEquals(1, entities.size()); - assertEquals(17, entities.getCompound(0).getInt("y")); + assertEquals(17, entities.getCompoundOrEmpty(0).getIntOr("y", 0)); } @Test @@ -177,7 +176,7 @@ void convertedChunksKeepBelowZeroRetrogen() { root.put("below_zero_retrogen", new CompoundTag()); assertSame(root, LegacyWorldDataHook.finalizeLegacyChunk(root)); - assertEquals("noise", root.getString("Status")); + assertEquals("noise", root.getStringOr("Status", "")); assertFalse(root.contains("BaseMetalsLegacyPreserveChunk")); } @@ -189,14 +188,14 @@ void terrainGuardProtectsSavedChunksButAllowsNewUnderground() throws IOException locations[3] = 1; Files.write(region, locations); assertEquals(1, LegacyWorldDataHook.indexLegacyChunks(world.toFile())); - ResourceLocation overworld = ResourceLocation.parse("minecraft:overworld"); + Identifier overworld = Identifier.parse("minecraft:overworld"); assertTrue(LegacyWorldDataHook.isProtectedChunk(overworld, new BlockPos(1, 0, 1))); assertTrue(LegacyWorldDataHook.isProtectedChunk(overworld, new BlockPos(1, 255, 1))); assertFalse(LegacyWorldDataHook.isProtectedChunk(overworld, new BlockPos(1, -1, 1))); assertFalse(LegacyWorldDataHook.isProtectedChunk(overworld, new BlockPos(1, 256, 1))); assertFalse(LegacyWorldDataHook.isProtectedChunk(overworld, new BlockPos(17, 64, 1))); - assertFalse(LegacyWorldDataHook.isProtectedChunk(ResourceLocation.parse("minecraft:the_nether"), + assertFalse(LegacyWorldDataHook.isProtectedChunk(Identifier.parse("minecraft:the_nether"), new BlockPos(1, 64, 1))); } diff --git a/src/test/java/zone/moddev/mc/basemetals/migration/NativeMigrationHooksTest.java b/src/test/java/zone/moddev/mc/basemetals/migration/NativeMigrationHooksTest.java new file mode 100644 index 000000000..77d5c04b0 --- /dev/null +++ b/src/test/java/zone/moddev/mc/basemetals/migration/NativeMigrationHooksTest.java @@ -0,0 +1,77 @@ +package zone.moddev.mc.basemetals.migration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.reflect.Modifier; +import java.nio.file.Path; + +import com.mojang.datafixers.DataFixer; +import com.mojang.serialization.Dynamic; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.util.datafix.fixes.BlockStateData; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.storage.SimpleRegionStorage; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.level.Level; +import org.junit.jupiter.api.Test; + +/** Catches renamed injection targets before a packaged world is opened. */ +class NativeMigrationHooksTest { + @Test + void levelCaptureStillRunsBeforeVanillaConversion() throws Exception { + var method = LevelStorageSource.class.getDeclaredMethod( + "readLevelDataTagFixed", Path.class, DataFixer.class); + + assertTrue(Modifier.isStatic(method.getModifiers())); + assertEquals(Dynamic.class, method.getReturnType()); + } + + @Test + void chunkAndTerrainTargetsKeepTheirNativeSignatures() throws Exception { + var upgrade = SimpleRegionStorage.class.getDeclaredMethod( + "upgradeChunkTag", CompoundTag.class, int.class, CompoundTag.class); + var write = WorldGenRegion.class.getDeclaredMethod("ensureCanWrite", BlockPos.class); + + assertEquals(CompoundTag.class, upgrade.getReturnType()); + assertEquals(boolean.class, write.getReturnType()); + } + + @Test + void anvilDamageAndLegacyTablesRemainAvailable() throws Exception { + var damage = AnvilBlock.class.getDeclaredMethod("damage", BlockState.class); + + assertTrue(Modifier.isStatic(damage.getModifiers())); + assertEquals(BlockState.class, damage.getReturnType()); + + for (String name : new String[] {"MAP", "BLOCK_DEFAULTS"}) { + var field = BlockStateData.class.getDeclaredField(name); + + assertTrue(Modifier.isStatic(field.getModifiers()), name); + assertEquals(Dynamic[].class, field.getType(), name); + } + } + + @Test + void capabilityHookTargetsOnlyForgesWorldDataCodec() throws Exception { + var factory = net.minecraftforge.common.util.LevelCapabilityData.class.getDeclaredMethod( + "type", net.minecraft.server.level.ServerLevel.class); + + assertTrue(Modifier.isStatic(factory.getModifiers())); + assertEquals(net.minecraft.world.level.saveddata.SavedDataType.class, factory.getReturnType()); + } + + @Test + void anvilWearHookTargetsOnlyTheNativeTakeCallback() throws Exception { + var callback = AnvilMenu.class.getDeclaredMethod( + "lambda$onTake$2", Player.class, float.class, Level.class, BlockPos.class); + + assertTrue(Modifier.isStatic(callback.getModifiers())); + assertEquals(void.class, callback.getReturnType()); + } +} diff --git a/src/test/java/zone/moddev/mc/basemetals/network/ConnectionReadInterestTest.java b/src/test/java/zone/moddev/mc/basemetals/network/ConnectionReadInterestTest.java index 9f53f7b0d..387dfa1ea 100644 --- a/src/test/java/zone/moddev/mc/basemetals/network/ConnectionReadInterestTest.java +++ b/src/test/java/zone/moddev/mc/basemetals/network/ConnectionReadInterestTest.java @@ -10,8 +10,9 @@ class ConnectionReadInterestTest { @Test void obsoleteConnectionPatchIsNotInstalled() throws Exception { assertFalse(Files.exists(Path.of("src/main/resources/coremods/connection_read_interest.js"))); - String coremods = Files.readString(Path.of("src/main/resources/META-INF/coremods.json")); - assertFalse(coremods.contains("connection_read_interest")); + assertFalse(Files.exists(Path.of("src/main/resources/META-INF/coremods.json"))); + String mixins = Files.readString(Path.of("src/main/resources/basemetals.mixins.json")); + assertFalse(mixins.contains("Connection")); } @Test diff --git a/src/upgradeSmoke/java/zone/moddev/mc/basemetals/smoke/UpgradeWorldSmoke.java b/src/upgradeSmoke/java/zone/moddev/mc/basemetals/smoke/UpgradeWorldSmoke.java index 0078e38cd..e6e7679e5 100644 --- a/src/upgradeSmoke/java/zone/moddev/mc/basemetals/smoke/UpgradeWorldSmoke.java +++ b/src/upgradeSmoke/java/zone/moddev/mc/basemetals/smoke/UpgradeWorldSmoke.java @@ -20,7 +20,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; @@ -34,12 +34,12 @@ import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.phys.AABB; import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; /** Validation-only reader for captured legacy Forge upgrade fixtures and worlds. */ -@Mod.EventBusSubscriber(modid = BaseMetals.MOD_ID) +@Mod.EventBusSubscriber(modid = BaseMetals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public final class UpgradeWorldSmoke { private static final String ENABLED_PROPERTY = "basemetals.upgradeWorldSmoke"; private static final String LEGACY_WORLD_PROPERTY = "basemetals.legacyWorldSmoke"; @@ -47,10 +47,23 @@ public final class UpgradeWorldSmoke { private static ServerStartedEvent pending; private static int waitTicks; private static boolean equipmentReady; + private static boolean registered; private UpgradeWorldSmoke() {} @SubscribeEvent + public static void setup(net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent event) { + register(); + } + + public static void register() { + if (!registered) { + ServerStartedEvent.BUS.addListener(UpgradeWorldSmoke::onServerStarted); + net.minecraftforge.event.TickEvent.ServerTickEvent.Post.BUS.addListener(UpgradeWorldSmoke::onServerTick); + registered = true; + } + } + public static void onServerStarted(ServerStartedEvent event) { boolean fixture = Boolean.getBoolean(ENABLED_PROPERTY); boolean legacyWorld = Boolean.getBoolean(LEGACY_WORLD_PROPERTY); @@ -143,8 +156,8 @@ public static void onServerStarted(ServerStartedEvent event) { int expectedCount = oldItem.has("count") ? oldItem.get("count").getAsInt() : 1; int expectedDamage = oldItem.has("damage") ? oldItem.get("damage").getAsInt() : 0; boolean proofMatches = format < 2 || stack.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, - net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompound("basemetals_fixture") - .getString("proof").equals(oldItem.get("id").getAsString()); + net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompoundOrEmpty("basemetals_fixture") + .getStringOr("proof", "").equals(oldItem.get("id").getAsString()); boolean enchantmentMatches = !oldItem.has("enchanted") || !oldItem.get("enchanted").getAsBoolean() || EnchantmentHelper.getItemEnchantmentLevel(unbreaking, stack) == 2; if (!expected.equals(actual) || stack.getCount() != expectedCount @@ -166,15 +179,15 @@ public static void onServerStarted(ServerStartedEvent event) { (int) Math.floor(oldItem.get("armor_z").getAsDouble())); overworld.getChunkAt(armorPos); List stands = overworld.getEntitiesOfClass(ArmorStand.class, - new AABB(armorPos.getX() - 0.75D, overworld.getMinBuildHeight(), armorPos.getZ() - 0.75D, - armorPos.getX() + 1.75D, overworld.getMaxBuildHeight(), armorPos.getZ() + 1.75D)); + new AABB(armorPos.getX() - 0.75D, overworld.getMinY(), armorPos.getZ() - 0.75D, + armorPos.getX() + 1.75D, overworld.getMaxY(), armorPos.getZ() + 1.75D)); EquipmentSlot equipmentSlot = EquipmentSlot.byName(oldItem.get("armor_slot").getAsString()); boolean equipped = stands.stream().anyMatch(stand -> { ItemStack worn = stand.getItemBySlot(equipmentSlot); return expected.equals(String.valueOf(ForgeRegistries.ITEMS.getKey(worn.getItem()))) && worn.getDamageValue() == expectedDamage && worn.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, - net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompound("basemetals_fixture").getString("proof") + net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompoundOrEmpty("basemetals_fixture").getStringOr("proof", "") .equals(oldItem.get("id").getAsString()) && EnchantmentHelper.getItemEnchantmentLevel(unbreaking, worn) == 2; }); @@ -216,19 +229,22 @@ public static void onServerStarted(ServerStartedEvent event) { ServerPlayer player = new ServerPlayer(event.getServer(), overworld, new GameProfile(UUID.fromString(savedPlayer.get("uuid").getAsString()), name), net.minecraft.server.level.ClientInformation.createDefault()); - CompoundTag loaded = event.getServer().getPlayerList().load(player).orElse(null); + CompoundTag loaded = event.getServer().getPlayerList().loadPlayerData( + new net.minecraft.server.players.NameAndId(player.getGameProfile())).orElse(null); if (loaded == null) { failures.add("fixture playerdata did not load"); continue; } + player.load(net.minecraft.world.level.storage.TagValueInput.create( + net.minecraft.util.ProblemReporter.DISCARDING, overworld.registryAccess(), loaded)); for (JsonElement inventoryElement : savedPlayer.getAsJsonArray("inventory")) { JsonObject expectedItem = inventoryElement.getAsJsonObject(); int slot = expectedItem.get("slot").getAsInt(); ItemStack stack = player.getInventory().getItem(slot); String expected = currentItemId(expectedItem.get("id").getAsString()); boolean proof = stack.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, - net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompound("basemetals_fixture") - .getString("player_proof").equals(expectedItem.get("id").getAsString()); + net.minecraft.world.item.component.CustomData.EMPTY).copyTag().getCompoundOrEmpty("basemetals_fixture") + .getStringOr("player_proof", "").equals(expectedItem.get("id").getAsString()); if (!expected.equals(String.valueOf(ForgeRegistries.ITEMS.getKey(stack.getItem()))) || !proof) { if (itemMismatches < 10) failures.add("player slot " + slot + " lost " + expected); @@ -290,9 +306,8 @@ private static void prepareEquipmentChunks(ServerStartedEvent event) { } } - @SubscribeEvent - public static void onServerTick(net.minecraftforge.event.TickEvent.ServerTickEvent event) { - if (event.phase != net.minecraftforge.event.TickEvent.Phase.END || pending == null || ++waitTicks < 20) return; + public static void onServerTick(net.minecraftforge.event.TickEvent.ServerTickEvent.Post event) { + if (pending == null || ++waitTicks < 20) return; var server = pending.getServer(); boolean loaded = equipmentChunks.stream().allMatch(chunk -> server.overworld().areEntitiesLoaded(chunk.toLong())); if (!loaded && waitTicks < 200) return; @@ -316,7 +331,7 @@ private static void verifySavedAdvancements(net.minecraft.server.MinecraftServer int retained = 0; for (var entry : fixture.getAsJsonObject("progress").entrySet()) { if ("DataVersion".equals(entry.getKey())) continue; - var advancement = server.getAdvancements().get(ResourceLocation.parse(entry.getKey())); + var advancement = server.getAdvancements().get(Identifier.parse(entry.getKey())); if (advancement == null) throw new IllegalStateException("Saved advancement missing: " + entry.getKey()); var progress = player.getAdvancements().getOrStartProgress(advancement); if (!progress.isDone()) throw new IllegalStateException("Saved advancement is incomplete: " + entry.getKey()); @@ -367,7 +382,7 @@ private static ServerLevel level(ServerStartedEvent event, int dimension) { } private static String currentBlockId(String legacy) { - ResourceLocation id = ResourceLocation.parse(legacy.toLowerCase(java.util.Locale.ROOT)); + Identifier id = Identifier.parse(legacy.toLowerCase(java.util.Locale.ROOT)); if (id.getNamespace().equals("mmdlib") || id.getNamespace().equals(BaseMetals.MOD_ID)) { return BaseMetals.MOD_ID + ":" + MissingMappings.blockTargetPath(id.getPath()); } @@ -375,7 +390,7 @@ private static String currentBlockId(String legacy) { } private static String currentItemId(String legacy) { - ResourceLocation id = ResourceLocation.parse(legacy.toLowerCase(java.util.Locale.ROOT)); + Identifier id = Identifier.parse(legacy.toLowerCase(java.util.Locale.ROOT)); if (id.getNamespace().equals("mmdlib") || id.getNamespace().equals(BaseMetals.MOD_ID)) { return MissingMappings.itemTargetId(id.getPath()).toString(); } diff --git a/tools/validation/README.md b/tools/validation/README.md index 13982d99c..4bca17e28 100644 --- a/tools/validation/README.md +++ b/tools/validation/README.md @@ -1,9 +1,11 @@ # World upgrade checks -`test_legacy_worlds.js` starts the packaged Forge 1.21.1 server against a fresh +`test_legacy_worlds.js` starts the packaged Forge 1.21.11 server against a fresh copy of each supplied world, then starts it again to check the saved result. It refuses to overwrite an existing test directory and fingerprints every source world before and after the test. +An optional `forgeVersion` selects another installed Forge 1.21.11 build for +compatibility checks; the default is the compilation target, `61.1.0`. Pass a local JSON specification containing `java` (the Java 21 executable), `serverRuntime`, `output`, `modJar`, `probeJar`, `oreSpawn` (a `path` and `sha256`), and a `profiles` list. @@ -26,6 +28,8 @@ with `node --test tools/validation/test_painting_registry.js`. `compare_world_terrain.py` checks fixed vanilla terrain before and after conversion. It accepts Minecraft's new underground floor and accounts for normal falling sand and gravel, but rejects ore replacing existing rock. +Exposed dirt may become grass only when grass was already growing beside it; +buried changes and new ore in saved terrain still fail the comparison. It needs the Python `nbtlib` package. Run `test_world_terrain.py` to check the palette readers and falling-block comparison. diff --git a/tools/validation/compare_current_world.py b/tools/validation/compare_current_world.py index 2b9ce4eee..a2768a9f1 100644 --- a/tools/validation/compare_current_world.py +++ b/tools/validation/compare_current_world.py @@ -40,14 +40,30 @@ def ordered(tag): def canonical_text(value): - text = str(value) - try: - parsed = json.loads(text) - except (ValueError, TypeError): - parsed = text + if isinstance(value, (nbtlib.Compound, nbtlib.List)): + parsed = value.unpack(json=True) + else: + text = str(value) + try: + parsed = json.loads(text) + except (ValueError, TypeError): + parsed = text + if isinstance(parsed, str): parsed = {"text": parsed} - return nbtlib.String(json.dumps(parsed, sort_keys=True, separators=(",", ":"))) + + def styles(component): + if isinstance(component, dict): + result = {} + boolean_styles = {"bold", "italic", "underlined", "strikethrough", "obfuscated"} + for key, child in component.items(): + result[key] = bool(child) if key in boolean_styles and isinstance(child, int) else styles(child) + return result + if isinstance(component, list): + return [styles(child) for child in component] + return component + + return nbtlib.String(json.dumps(styles(parsed), sort_keys=True, separators=(",", ":"))) def canonical_stack(stack): @@ -83,6 +99,9 @@ def canonical_stack(stack): components[new] = nbtlib.Compound({"levels": levels}) if new in components: enchantments = components[new] + if "levels" not in enchantments: + enchantments = nbtlib.Compound({"levels": enchantments}) + components[new] = enchantments if bool(enchantments.get("show_in_tooltip", False)): enchantments.pop("show_in_tooltip") if not enchantments.get("levels"): @@ -95,6 +114,16 @@ def canonical_stack(stack): return ordered(result).snbt() +def canonical_player(player): + """Keep worn slots comparable after Minecraft moves them out of Inventory.""" + result = copy.deepcopy(player) + slots = {"feet": 100, "legs": 101, "chest": 102, "head": 103, "offhand": -106} + for name, stack in result.get("equipment", {}).items(): + if name in slots and isinstance(stack, nbtlib.Compound): + stack["Slot"] = nbtlib.Byte(slots[name]) + return result + + def snapshot(world): blocks = {} stacks = Counter() @@ -140,9 +169,9 @@ def items(value): for entity in saved_entities(world): items(entity) - items(nbtlib.load(world / "level.dat")["Data"].get("Player", {})) + items(canonical_player(nbtlib.load(world / "level.dat")["Data"].get("Player", {}))) for player in (world / "playerdata").glob("*.dat"): - items(nbtlib.load(player)) + items(canonical_player(nbtlib.load(player))) advancements = {} for file in (world / "advancements").glob("*.json"): diff --git a/tools/validation/compare_world_terrain.py b/tools/validation/compare_world_terrain.py index 9987fba44..4acf7c9c3 100644 --- a/tools/validation/compare_world_terrain.py +++ b/tools/validation/compare_world_terrain.py @@ -173,12 +173,43 @@ def assign(source, visited): def compare(original, upgraded): before, after = chunks(original), chunks(upgraded) + decoded_sections = {} + + def block_at(world, dimension, x, y, z): + key = (dimension, x >> 4, z >> 4) + section_y = y >> 4 + cache_key = (id(world), key, section_y) + if cache_key not in decoded_sections: + chunk = world.get(key, {}) + sections = chunk.get("Sections", chunk.get("sections", [])) + section = next((entry for entry in sections if int(entry["Y"]) == section_y), None) + decoded_sections[cache_key] = list(block_names(section)) if section is not None else [None] * 4096 + index = ((y & 15) << 8) | ((z & 15) << 4) | (x & 15) + return decoded_sections[cache_key][index] + + def natural_grass_growth(dimension, x, y, z): + if block_at(before, dimension, x, y + 1, z) not in AIR: + return False + if block_at(after, dimension, x, y + 1, z) not in AIR: + return False + + # Grass can spread from an exposed neighbour, but never turn buried dirt or rock into grass. + for dx in range(-1, 2): + for dz in range(-1, 2): + for dy in range(-1, 4): + neighbour = block_at(before, dimension, x + dx, y + dy, z + dz) + above = block_at(before, dimension, x + dx, y + dy + 1, z + dz) + if neighbour == "minecraft:grass_block" and above in AIR: + return True + return False + original_drops, current_drops = [], [] falling_blocks(original, before, original_drops) current_falling = falling_blocks(upgraded, after, current_drops) old_drop_ids = {drop["uuid"] for drop in original_drops} current_drops = [drop for drop in current_drops if drop["uuid"] not in old_drop_ids] checked = 0 + grass_updates = 0 missing, recovered = [], [] for (dimension, chunk_x, chunk_z, column), entries in current_falling.items(): @@ -217,6 +248,10 @@ def compare(original, upgraded): continue checked += 1 if actual[index] != expected: + if (expected == "minecraft:dirt" and actual[index] == "minecraft:grass_block" + and natural_grass_growth(key[0], math.floor(x), y, math.floor(z))): + grass_updates += 1 + continue # Vanilla replaces the old Overworld floor when it opens the new underground. if (key[0] == "" and 0 <= y <= 4 and lowest_section < 0 and expected == "minecraft:bedrock" and actual[index] == "minecraft:deepslate"): @@ -231,7 +266,7 @@ def compare(original, upgraded): match_fallen_blocks(missing, recovered) print(f"TERRAIN_UPGRADE PASS chunks={len(before)} solid_blocks={checked} " - f"recovered_falling_blocks={len(missing)}") + f"recovered_falling_blocks={len(missing)} natural_grass_updates={grass_updates}") if __name__ == "__main__": diff --git a/tools/validation/test_component_comparison.py b/tools/validation/test_component_comparison.py index 5ca6f8159..c1b7c014a 100644 --- a/tools/validation/test_component_comparison.py +++ b/tools/validation/test_component_comparison.py @@ -3,10 +3,21 @@ import copy import unittest import nbtlib -from compare_current_world import canonical_stack +from compare_current_world import canonical_player, canonical_stack class ComponentComparisonTest(unittest.TestCase): + def test_player_armour_keeps_its_slot_in_native_equipment(self): + older = nbtlib.parse_nbt('{Slot:100b,id:"basemetals:adamantine_boots",Count:1b}') + current = nbtlib.parse_nbt('{equipment:{feet:{id:"basemetals:adamantine_boots",count:1}}}') + normalized = canonical_player(current) + self.assertEqual(canonical_stack(older), canonical_stack(normalized['equipment']['feet'])) + self.assertNotIn('Slot', current['equipment']['feet']) + + wrong_slot = nbtlib.parse_nbt('{equipment:{head:{id:"basemetals:adamantine_boots",count:1}}}') + self.assertNotEqual(canonical_stack(older), + canonical_stack(canonical_player(wrong_slot)['equipment']['head'])) + def test_legacy_data_equals_its_native_components(self): legacy = nbtlib.parse_nbt('''{id:"basemetals:steel_sword",Count:1b,Slot:2b,tag:{ Damage:19,display:{Name:'{"text":"Old sword"}',Lore:['{"text":"A keepsake"}']}, @@ -26,6 +37,26 @@ def test_unknown_component_and_custom_nbt_are_not_ignored(self): changed = nbtlib.parse_nbt('{id:"basemetals:steel_arrow",count:1,components:{"example:data":{value:9}}}') self.assertNotEqual(canonical_stack(original), canonical_stack(changed)) + def test_native_text_and_flat_enchantment_maps_keep_their_data(self): + older = nbtlib.parse_nbt('''{id:"basemetals:steel_sword",count:1,components:{ + "minecraft:custom_name":'{"text":"Old sword","color":"gold","bold":true}', + "minecraft:lore":['{"text":"A keepsake"}'], + "minecraft:enchantments":{levels:{"minecraft:unbreaking":2}}}}''') + current = nbtlib.parse_nbt('''{id:"basemetals:steel_sword",count:1,components:{ + "minecraft:custom_name":{text:"Old sword",color:"gold",bold:1b}, + "minecraft:lore":[{text:"A keepsake"}], + "minecraft:enchantments":{"minecraft:unbreaking":2}}}''') + self.assertEqual(canonical_stack(older), canonical_stack(current)) + + for key in current['components']: + changed = copy.deepcopy(current) + changed['components'].pop(key) + self.assertNotEqual(canonical_stack(older), canonical_stack(changed), key) + + changed = copy.deepcopy(current) + changed['components']['minecraft:custom_name']['color'] = nbtlib.String('red') + self.assertNotEqual(canonical_stack(older), canonical_stack(changed)) + if __name__ == '__main__': unittest.main() diff --git a/tools/validation/test_content_modes.js b/tools/validation/test_content_modes.js index cfb21ff78..05be044a1 100644 --- a/tools/validation/test_content_modes.js +++ b/tools/validation/test_content_modes.js @@ -94,7 +94,7 @@ function verifyConfig(directory, initial) { (async () => { const results = []; - const client = clientLaunch(spec.clientRuntime, '1.21.1', '52.1.0'); + const client = clientLaunch(spec.clientRuntime, '1.21.11', '61.1.0'); const selected = spec.cases ? cases.filter(([name]) => spec.cases.includes(name)) : cases; if (!selected.length || (spec.cases && selected.length !== spec.cases.length)) { throw new Error('The requested mode-test case is unknown or duplicated.'); @@ -114,14 +114,14 @@ function verifyConfig(directory, initial) { + 'generator-settings={"layers":[{"block":"minecraft:bedrock","height":1},{"block":"minecraft:dirt","height":2},{"block":"minecraft:grass_block","height":1}],"biome":"minecraft:plains"}\n' + 'generate-structures=false\nmax-tick-time=-1\n'); const server = launch(serverDir, ['-Xms256m', '-Xmx2g', '-Dbasemetals.awaitLoginSmoke=true', - ...serverArguments(spec.serverRuntime, serverDir, '1.21.1', '52.1.0')], 'server.log'); + ...serverArguments(spec.serverRuntime, serverDir, '1.21.11', '61.1.0')], 'server.log'); let player; try { await waitFor(server, 'BASEMETALS_PACKAGED_SERVER_SMOKE PASS', 240000); player = launch(clientDir, ['-Xms512m', '-Xmx2g', '-Dbasemetals.remoteLoginSmoke=true', `-Dbasemetals.remoteAddress=127.0.0.1:${port}`, `-Dbasemetals.loginSmokeConnections=${reject ? 1 : 3}`, `-Dbasemetals.expectModeReject=${!!reject}`, ...client.args, ...client.metadata.arguments.game, - '--username', 'BMValidation', '--version', '1.21.1', '--gameDir', clientDir, + '--username', 'BMValidation', '--version', '1.21.11', '--gameDir', clientDir, '--assetsDir', path.join(spec.clientRuntime, 'assets'), '--assetIndex', client.vanilla.assetIndex.id, '--uuid', '00000000000000000000000000000118', '--accessToken', '0', '--userType', 'legacy'], 'client.log'); await waitFor(player, 'BASEMETALS_MODE_LOGIN_CLIENT PASS result=' + (reject ? 'rejected' : 'connected'), 240000); diff --git a/tools/validation/test_legacy_worlds.js b/tools/validation/test_legacy_worlds.js index 24f7f7168..1c0b7a9d3 100644 --- a/tools/validation/test_legacy_worlds.js +++ b/tools/validation/test_legacy_worlds.js @@ -68,6 +68,9 @@ function prepare(directory, runtime, launcher, mods) { function checkUpgradeLog(log) { // Forge reports these removed vanilla names when it reads an older registry snapshot. const retiredVanillaEntries = new Set([ + // Vanilla split boats by wood type and thrown potions by potion type. + 'minecraft:boat', 'minecraft:chest_boat', 'minecraft:potion', + 'minecraft:chain', 'minecraft:grass_path', // These names were changed by vanilla's 1.20.5 data fixes. 'minecraft:grass', 'minecraft:scute', 'minecraft:sweeping', 'minecraft:empty', @@ -83,6 +86,9 @@ function checkUpgradeLog(log) { 'minecraft:music.overworld.jungle_and_forest', 'minecraft:entity.zombie_pigman.ambient', 'minecraft:entity.zombie_pigman.angry', 'minecraft:entity.zombie_pigman.death', 'minecraft:entity.zombie_pigman.hurt', + 'minecraft:entity.leash_knot.break', 'minecraft:entity.leash_knot.place', + 'minecraft:entity.puffer_fish.ambient', 'minecraft:entity.wolf.howl', + 'minecraft:entity.goat.screaming.horn_break', 'minecraft:item.goat_horn.play', 'minecraft:music.nether', 'minecraft:item.sweet_berries.pick_from_bush' ]); // Minecraft's Caves and Cliffs data fix folds these biomes into their new names. @@ -114,14 +120,13 @@ function checkUpgradeLog(log) { const registry = line.slice(line.indexOf('Unidentified mapping from registry ') + 'Unidentified mapping from registry '.length).trim(); const knownPaintingSnapshot = isVanillaPaintingSnapshot(registry, entries); - const renamedTrialSpawnerSounds = registry === 'minecraft:sound_event' - && entries.length > 0 && entries.every(entry => [ + const knownVanillaNames = entries.length > 0 && entries.every(entry => + retiredVanillaEntries.has(entry) || registry === 'minecraft:sound_event' && [ 'minecraft:block.trial_spawner.ambient_charged', 'minecraft:block.trial_spawner.charge_activate' ].includes(entry)); - if (knownPaintingSnapshot || renamedTrialSpawnerSounds - || entries.length && entries.every(entry => retiredVanillaEntries.has(entry))) { + if (knownPaintingSnapshot || knownVanillaNames) { entries.forEach(entry => acceptedEntries.add(entry)); continue; } @@ -143,7 +148,7 @@ async function run(directory, launcher, label, marker, properties = []) { const output = fs.createWriteStream(path.join(directory, label + '.log')); const executable = phase === 'capture' ? spec.java8 : (spec.java || spec.java17); const launchArguments = phase === 'capture' ? ['-jar', launcher, 'nogui'] - : serverArguments(spec.serverRuntime, directory, '1.21.1', '52.1.0'); + : serverArguments(spec.serverRuntime, directory, '1.21.11', spec.forgeVersion || '61.1.0'); const child = spawn(executable, ['-Xms256m', '-Xmx2g', ...properties, ...launchArguments], { cwd: directory, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }); child.stdout.pipe(output, { end: false }); diff --git a/tools/validation/test_world_terrain.py b/tools/validation/test_world_terrain.py index 562710f78..df8f16856 100644 --- a/tools/validation/test_world_terrain.py +++ b/tools/validation/test_world_terrain.py @@ -41,6 +41,41 @@ def gravel(x=0.5, y=35, z=0.5, dimension=""): class FallingTerrainTest(unittest.TestCase): + def test_exposed_dirt_beside_old_grass_can_grow_normally(self): + self.compare_surface("minecraft:dirt", "minecraft:grass_block", nearby_grass=True) + + def test_grass_does_not_excuse_buried_or_isolated_changes(self): + for buried, nearby in [(True, True), (False, False)]: + with self.assertRaisesRegex(AssertionError, "dirt became minecraft:grass_block"): + self.compare_surface("minecraft:dirt", "minecraft:grass_block", nearby, buried) + + def test_surface_growth_never_excuses_changed_rock_or_new_ore(self): + for original, changed in [("minecraft:stone", "minecraft:grass_block"), + ("minecraft:dirt", "basemetals:tin_ore")]: + with self.assertRaises(AssertionError): + self.compare_surface(original, changed, nearby_grass=True) + + def compare_surface(self, original, changed, nearby_grass, buried=False): + values = ["minecraft:air"] * 4096 + values[0] = original + if nearby_grass: + values[1] = "minecraft:grass_block" + if buried: + values[256] = "minecraft:stone" + after = values.copy() + after[0] = changed + + def chunk(blocks): + return {("", 0, 0): {"Sections": [{"Y": 0, "values": blocks, + "Palette": [{"Name": "minecraft:dirt"}, {"Name": "minecraft:stone"}]}]}} + + with ( + patch.object(terrain, "chunks", side_effect=[chunk(values), chunk(after)]), + patch.object(terrain, "block_names", side_effect=lambda section: iter(section["values"])), + patch.object(terrain, "falling_blocks", return_value={}), + ): + terrain.compare(Path("source"), Path("copy")) + def test_identical_sections_still_count_every_solid_block(self): chunks = {("", 0, 0): {"Sections": [{"Y": 0, "Palette": [{"Name": "minecraft:stone"}]}]}} with (