From 2dcb88ccece33f74c0988324a6109b23f35427ea Mon Sep 17 00:00:00 2001 From: thedarkcolour <30441001+thedarkcolour@users.noreply.github.com> Date: Fri, 21 Jul 2023 21:16:52 -0700 Subject: [PATCH] Initial commit --- .gitattributes | 5 + .gitignore | 25 ++ build.gradle | 127 +++++++ changelog.md | 6 + gradle.properties | 15 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 +++++++++ gradlew.bat | 89 +++++ settings.gradle | 11 + src/generated/resources/.cache/cache | 308 +++++++++++++++ .../blockstates/acacia_barrel.json | 7 + .../blockstates/acacia_crucible.json | 7 + .../blockstates/acacia_sieve.json | 7 + .../blockstates/birch_barrel.json | 7 + .../blockstates/birch_crucible.json | 7 + .../blockstates/birch_sieve.json | 7 + .../blockstates/crimson_barrel.json | 7 + .../blockstates/crimson_crucible.json | 7 + .../blockstates/crimson_sieve.json | 7 + .../blockstates/crushed_end_stone.json | 7 + .../blockstates/crushed_netherrack.json | 7 + .../blockstates/dark_oak_barrel.json | 7 + .../blockstates/dark_oak_crucible.json | 7 + .../blockstates/dark_oak_sieve.json | 7 + .../exnihiloreborn/blockstates/dust.json | 7 + .../blockstates/jungle_barrel.json | 7 + .../blockstates/jungle_crucible.json | 7 + .../blockstates/jungle_sieve.json | 7 + .../blockstates/oak_barrel.json | 7 + .../blockstates/oak_crucible.json | 7 + .../exnihiloreborn/blockstates/oak_sieve.json | 7 + .../blockstates/porcelain_crucible.json | 7 + .../blockstates/spruce_barrel.json | 7 + .../blockstates/spruce_crucible.json | 7 + .../blockstates/spruce_sieve.json | 7 + .../blockstates/stone_barrel.json | 7 + .../blockstates/unfired_crucible.json | 7 + .../blockstates/warped_barrel.json | 7 + .../blockstates/warped_crucible.json | 7 + .../blockstates/warped_sieve.json | 7 + .../assets/exnihiloreborn/lang/en_us.json | 52 +++ .../models/block/acacia_barrel.json | 6 + .../models/block/acacia_crucible.json | 9 + .../models/block/acacia_sieve.json | 6 + .../models/block/birch_barrel.json | 6 + .../models/block/birch_crucible.json | 9 + .../models/block/birch_sieve.json | 6 + .../models/block/crimson_barrel.json | 6 + .../models/block/crimson_crucible.json | 9 + .../models/block/crimson_sieve.json | 6 + .../models/block/crushed_end_stone.json | 6 + .../models/block/crushed_netherrack.json | 6 + .../models/block/dark_oak_barrel.json | 6 + .../models/block/dark_oak_crucible.json | 9 + .../models/block/dark_oak_sieve.json | 6 + .../exnihiloreborn/models/block/dust.json | 6 + .../models/block/jungle_barrel.json | 6 + .../models/block/jungle_crucible.json | 9 + .../models/block/jungle_sieve.json | 6 + .../models/block/oak_barrel.json | 6 + .../models/block/oak_crucible.json | 9 + .../models/block/oak_sieve.json | 6 + .../models/block/porcelain_crucible.json | 9 + .../models/block/spruce_barrel.json | 6 + .../models/block/spruce_crucible.json | 9 + .../models/block/spruce_sieve.json | 6 + .../models/block/stone_barrel.json | 6 + .../models/block/unfired_crucible.json | 9 + .../models/block/warped_barrel.json | 6 + .../models/block/warped_crucible.json | 9 + .../models/block/warped_sieve.json | 6 + .../models/item/acacia_barrel.json | 3 + .../models/item/acacia_crucible.json | 3 + .../models/item/acacia_sieve.json | 3 + .../models/item/birch_barrel.json | 3 + .../models/item/birch_crucible.json | 3 + .../models/item/birch_sieve.json | 3 + .../models/item/bone_crook.json | 6 + .../models/item/cooked_silk_worm.json | 6 + .../models/item/crimson_barrel.json | 3 + .../models/item/crimson_crucible.json | 3 + .../models/item/crimson_sieve.json | 3 + .../exnihiloreborn/models/item/crook.json | 6 + .../models/item/crushed_end_stone.json | 3 + .../models/item/crushed_netherrack.json | 3 + .../models/item/dark_oak_barrel.json | 3 + .../models/item/dark_oak_crucible.json | 3 + .../models/item/dark_oak_sieve.json | 3 + .../models/item/diamond_hammer.json | 6 + .../exnihiloreborn/models/item/dust.json | 3 + .../models/item/golden_hammer.json | 6 + .../models/item/iron_hammer.json | 6 + .../models/item/jungle_barrel.json | 3 + .../models/item/jungle_crucible.json | 3 + .../models/item/jungle_sieve.json | 3 + .../models/item/oak_barrel.json | 3 + .../models/item/oak_crucible.json | 3 + .../exnihiloreborn/models/item/oak_sieve.json | 3 + .../models/item/porcelain_crucible.json | 3 + .../exnihiloreborn/models/item/silk_worm.json | 6 + .../models/item/spruce_barrel.json | 3 + .../models/item/spruce_crucible.json | 3 + .../models/item/spruce_sieve.json | 3 + .../models/item/stone_barrel.json | 3 + .../models/item/stone_hammer.json | 6 + .../models/item/unfired_crucible.json | 3 + .../models/item/warped_barrel.json | 3 + .../models/item/warped_crucible.json | 3 + .../models/item/warped_sieve.json | 3 + .../models/item/wooden_hammer.json | 6 + .../recipes/exnihiloreborn/acacia_barrel.json | 32 ++ .../exnihiloreborn/acacia_crucible.json | 32 ++ .../recipes/exnihiloreborn/birch_barrel.json | 32 ++ .../exnihiloreborn/birch_crucible.json | 32 ++ .../recipes/exnihiloreborn/bone_crook.json | 32 ++ .../exnihiloreborn/compressed_crook.json | 32 ++ .../exnihiloreborn/cooked_silk_worm.json | 32 ++ .../exnihiloreborn/crimson_barrel.json | 32 ++ .../exnihiloreborn/crimson_crucible.json | 32 ++ .../recipes/exnihiloreborn/crook.json | 32 ++ .../exnihiloreborn/dark_oak_barrel.json | 32 ++ .../exnihiloreborn/dark_oak_crucible.json | 32 ++ .../exnihiloreborn/diamond_hammer.json | 32 ++ .../recipes/exnihiloreborn/golden_hammer.json | 32 ++ .../recipes/exnihiloreborn/iron_hammer.json | 32 ++ .../recipes/exnihiloreborn/jungle_barrel.json | 32 ++ .../exnihiloreborn/jungle_crucible.json | 32 ++ .../recipes/exnihiloreborn/oak_barrel.json | 32 ++ .../recipes/exnihiloreborn/oak_crucible.json | 32 ++ .../exnihiloreborn/porcelain_crucible.json | 32 ++ .../recipes/exnihiloreborn/spruce_barrel.json | 32 ++ .../exnihiloreborn/spruce_crucible.json | 32 ++ .../recipes/exnihiloreborn/stone_barrel.json | 32 ++ .../recipes/exnihiloreborn/stone_hammer.json | 32 ++ .../exnihiloreborn/unfired_crucible.json | 32 ++ .../recipes/exnihiloreborn/warped_barrel.json | 32 ++ .../exnihiloreborn/warped_crucible.json | 32 ++ .../recipes/exnihiloreborn/wooden_hammer.json | 32 ++ .../loot_tables/blocks/acacia_barrel.json | 19 + .../loot_tables/blocks/birch_barrel.json | 19 + .../blocks/compressed_cobblestone.json | 19 + .../loot_tables/blocks/compressed_dirt.json | 19 + .../loot_tables/blocks/compressed_dust.json | 19 + .../loot_tables/blocks/compressed_sand.json | 19 + .../loot_tables/blocks/crimson_barrel.json | 19 + .../loot_tables/blocks/dark_oak_barrel.json | 19 + .../loot_tables/blocks/dust.json | 19 + .../loot_tables/blocks/infested_leaves.json | 19 + .../loot_tables/blocks/jungle_barrel.json | 19 + .../loot_tables/blocks/oak_barrel.json | 19 + .../loot_tables/blocks/spruce_barrel.json | 19 + .../loot_tables/blocks/stone_barrel.json | 19 + .../loot_tables/blocks/warped_barrel.json | 19 + .../exnihiloreborn/recipes/acacia_barrel.json | 19 + .../recipes/acacia_crucible.json | 19 + .../recipes/barrel_compost/apple.json | 7 + .../recipes/barrel_compost/bread.json | 7 + .../recipes/barrel_compost/cookie.json | 7 + .../recipes/barrel_compost/kelp.json | 12 + .../recipes/barrel_compost/leaves.json | 7 + .../recipes/barrel_compost/melon.json | 7 + .../recipes/barrel_compost/melon_slice.json | 7 + .../recipes/barrel_compost/mushrooms.json | 7 + .../recipes/barrel_compost/nether_wart.json | 7 + .../recipes/barrel_compost/pumpkin.json | 7 + .../recipes/barrel_compost/pumpkin_pie.json | 7 + .../recipes/barrel_compost/saplings.json | 7 + .../recipes/barrel_compost/seagrass.json | 7 + .../recipes/barrel_compost/seeds.json | 7 + .../recipes/barrel_compost/silk_worms.json | 12 + .../recipes/barrel_compost/small_flowers.json | 7 + .../recipes/barrel_compost/spider_eye.json | 7 + .../recipes/barrel_compost/sweet_berries.json | 7 + .../recipes/barrel_compost/tall_flowers.json | 7 + .../recipes/barrel_compost/wheat.json | 7 + .../exnihiloreborn/recipes/birch_barrel.json | 19 + .../recipes/birch_crucible.json | 19 + .../exnihiloreborn/recipes/bone_crook.json | 16 + .../recipes/compressed_crook.json | 16 + .../recipes/cooked_silk_worm.json | 9 + .../recipes/crimson_barrel.json | 19 + .../recipes/crimson_crucible.json | 19 + .../data/exnihiloreborn/recipes/crook.json | 16 + .../recipes/dark_oak_barrel.json | 19 + .../recipes/dark_oak_crucible.json | 19 + .../recipes/diamond_hammer.json | 19 + .../exnihiloreborn/recipes/golden_hammer.json | 19 + .../hammer/crushing_red_sandstone.json | 26 ++ .../recipes/hammer/crushing_sandstone.json | 26 ++ .../recipes/hammer/crushing_stone_bricks.json | 15 + .../exnihiloreborn/recipes/hammer/dust.json | 15 + .../exnihiloreborn/recipes/hammer/gravel.json | 15 + .../exnihiloreborn/recipes/hammer/sand.json | 15 + .../recipes/hammer/stone_pebbles.json | 55 +++ .../exnihiloreborn/recipes/iron_hammer.json | 19 + .../exnihiloreborn/recipes/jungle_barrel.json | 19 + .../recipes/jungle_crucible.json | 19 + .../recipes/lava_crucible/cobblestone.json | 10 + .../recipes/lava_crucible/gravel.json | 10 + .../recipes/lava_crucible/netherrack.json | 10 + .../recipes/lava_crucible/stone.json | 10 + .../exnihiloreborn/recipes/oak_barrel.json | 19 + .../exnihiloreborn/recipes/oak_crucible.json | 19 + .../recipes/porcelain_crucible.json | 9 + .../recipes/sieve/beetroot_seeds.json | 16 + .../recipes/sieve/melon_seeds.json | 16 + .../recipes/sieve/pumpkin_seeds.json | 16 + .../recipes/sieve/stone_pebble.json | 58 +++ .../recipes/sieve/wheat_seeds.json | 16 + .../exnihiloreborn/recipes/spruce_barrel.json | 19 + .../recipes/spruce_crucible.json | 19 + .../exnihiloreborn/recipes/stone_barrel.json | 19 + .../exnihiloreborn/recipes/stone_hammer.json | 19 + .../recipes/unfired_crucible.json | 19 + .../exnihiloreborn/recipes/warped_barrel.json | 19 + .../recipes/warped_crucible.json | 19 + .../recipes/water_crucible/apple.json | 10 + .../recipes/water_crucible/cactus.json | 10 + .../recipes/water_crucible/leaves.json | 10 + .../recipes/water_crucible/melon.json | 10 + .../recipes/water_crucible/melon_slice.json | 10 + .../recipes/water_crucible/pumpkin.json | 10 + .../recipes/water_crucible/saplings.json | 10 + .../recipes/water_crucible/small_flowers.json | 10 + .../recipes/water_crucible/sweet_berries.json | 10 + .../recipes/water_crucible/tall_flowers.json | 10 + .../exnihiloreborn/recipes/wooden_hammer.json | 19 + .../tags/items/compressed_hammers.json | 11 + .../exnihiloreborn/tags/items/crooks.json | 8 + .../exnihiloreborn/tags/items/hammers.json | 11 + .../cooked_silk_worm_from_smoking.json | 32 ++ .../cooked_silk_worm_from_smoking.json | 9 + .../minecraft/tags/blocks/acacia_logs.json | 9 + .../data/minecraft/tags/blocks/anvil.json | 8 + .../tags/blocks/bamboo_plantable_on.json | 14 + .../data/minecraft/tags/blocks/banners.json | 37 ++ .../tags/blocks/base_stone_nether.json | 8 + .../tags/blocks/base_stone_overworld.json | 9 + .../tags/blocks/beacon_base_blocks.json | 10 + .../data/minecraft/tags/blocks/beds.json | 21 ++ .../minecraft/tags/blocks/bee_growables.json | 7 + .../data/minecraft/tags/blocks/beehives.json | 7 + .../minecraft/tags/blocks/birch_logs.json | 9 + .../data/minecraft/tags/blocks/buttons.json | 8 + .../data/minecraft/tags/blocks/campfires.json | 7 + .../data/minecraft/tags/blocks/carpets.json | 21 ++ .../data/minecraft/tags/blocks/climbable.json | 12 + .../minecraft/tags/blocks/coral_blocks.json | 10 + .../minecraft/tags/blocks/coral_plants.json | 10 + .../data/minecraft/tags/blocks/corals.json | 11 + .../minecraft/tags/blocks/crimson_stems.json | 9 + .../data/minecraft/tags/blocks/crops.json | 11 + .../minecraft/tags/blocks/dark_oak_logs.json | 9 + .../data/minecraft/tags/blocks/doors.json | 7 + .../minecraft/tags/blocks/dragon_immune.json | 21 ++ .../tags/blocks/enderman_holdable.json | 28 ++ .../minecraft/tags/blocks/fence_gates.json | 13 + .../data/minecraft/tags/blocks/fences.json | 7 + .../data/minecraft/tags/blocks/fire.json | 7 + .../minecraft/tags/blocks/flower_pots.json | 35 ++ .../data/minecraft/tags/blocks/flowers.json | 7 + .../data/minecraft/tags/blocks/gold_ores.json | 7 + .../tags/blocks/guarded_by_piglins.json | 13 + .../tags/blocks/hoglin_repellents.json | 9 + .../data/minecraft/tags/blocks/ice.json | 9 + .../minecraft/tags/blocks/impermeable.json | 22 ++ .../minecraft/tags/blocks/infiniburn_end.json | 7 + .../tags/blocks/infiniburn_nether.json | 6 + .../tags/blocks/infiniburn_overworld.json | 7 + .../minecraft/tags/blocks/jungle_logs.json | 9 + .../data/minecraft/tags/blocks/leaves.json | 11 + .../data/minecraft/tags/blocks/logs.json | 8 + .../minecraft/tags/blocks/logs_that_burn.json | 11 + .../tags/blocks/mushroom_grow_block.json | 9 + .../tags/blocks/non_flammable_wood.json | 35 ++ .../data/minecraft/tags/blocks/nylium.json | 7 + .../data/minecraft/tags/blocks/oak_logs.json | 9 + .../tags/blocks/piglin_repellents.json | 10 + .../data/minecraft/tags/blocks/planks.json | 13 + .../data/minecraft/tags/blocks/portals.json | 8 + .../tags/blocks/pressure_plates.json | 9 + .../blocks/prevent_mob_spawning_inside.json | 6 + .../data/minecraft/tags/blocks/rails.json | 9 + .../data/minecraft/tags/blocks/sand.json | 7 + .../data/minecraft/tags/blocks/saplings.json | 11 + .../minecraft/tags/blocks/shulker_boxes.json | 22 ++ .../data/minecraft/tags/blocks/signs.json | 7 + .../data/minecraft/tags/blocks/slabs.json | 38 ++ .../minecraft/tags/blocks/small_flowers.json | 18 + .../tags/blocks/soul_fire_base_blocks.json | 7 + .../tags/blocks/soul_speed_blocks.json | 7 + .../minecraft/tags/blocks/spruce_logs.json | 9 + .../data/minecraft/tags/blocks/stairs.json | 34 ++ .../minecraft/tags/blocks/standing_signs.json | 13 + .../minecraft/tags/blocks/stone_bricks.json | 9 + .../tags/blocks/stone_pressure_plates.json | 7 + .../tags/blocks/strider_warm_blocks.json | 6 + .../minecraft/tags/blocks/tall_flowers.json | 9 + .../data/minecraft/tags/blocks/trapdoors.json | 7 + .../tags/blocks/underwater_bonemeals.json | 8 + .../tags/blocks/unstable_bottom_center.json | 6 + .../minecraft/tags/blocks/valid_spawn.json | 7 + .../minecraft/tags/blocks/wall_corals.json | 10 + .../tags/blocks/wall_post_override.json | 12 + .../minecraft/tags/blocks/wall_signs.json | 13 + .../data/minecraft/tags/blocks/walls.json | 22 ++ .../minecraft/tags/blocks/warped_stems.json | 9 + .../minecraft/tags/blocks/wart_blocks.json | 7 + .../minecraft/tags/blocks/wither_immune.json | 16 + .../blocks/wither_summon_base_blocks.json | 7 + .../minecraft/tags/blocks/wooden_buttons.json | 13 + .../minecraft/tags/blocks/wooden_doors.json | 13 + .../minecraft/tags/blocks/wooden_fences.json | 13 + .../tags/blocks/wooden_pressure_plates.json | 13 + .../minecraft/tags/blocks/wooden_slabs.json | 13 + .../minecraft/tags/blocks/wooden_stairs.json | 13 + .../tags/blocks/wooden_trapdoors.json | 13 + .../data/minecraft/tags/blocks/wool.json | 21 ++ .../exnihiloreborn/ExNihiloReborn.java | 67 ++++ .../block/AbstractCrucibleBlock.java | 33 ++ .../exnihiloreborn/block/BarrelBlock.java | 49 +++ .../exnihiloreborn/block/EBlock.java | 41 ++ .../block/InfestedLeavesBlock.java | 55 +++ .../block/LavaCrucibleBlock.java | 7 + .../exnihiloreborn/block/SieveBlock.java | 28 ++ .../block/UnfiredCrucibleBlock.java | 24 ++ .../block/WaterCrucibleBlock.java | 18 + .../exnihiloreborn/block/package-info.java | 3 + .../AbstractCrucibleBlockEntity.java | 242 ++++++++++++ .../blockentity/BarrelBlockEntity.java | 351 ++++++++++++++++++ .../blockentity/EBlockEntity.java | 51 +++ .../InfestedLeavesBlockEntity.java | 116 ++++++ .../blockentity/LavaCrucibleBlockEntity.java | 58 +++ .../blockentity/RecipeUtil.java | 42 +++ .../blockentity/SieveBlockEntity.java | 195 ++++++++++ .../blockentity/WaterCrucibleBlockEntity.java | 46 +++ .../exnihiloreborn/client/ClientHandler.java | 89 +++++ .../exnihiloreborn/client/ItemColors.java | 9 + .../client/ter/BarrelRenderer.java | 155 ++++++++ .../client/ter/CrucibleRenderer.java | 87 +++++ .../client/ter/InfestedLeavesRenderer.java | 55 +++ .../client/ter/SieveRenderer.java | 34 ++ .../compat/jei/ExNihiloRebornPlugin.java | 20 + .../top/InfestedLeavesInfoProvider.java | 60 +++ .../compat/top/TopCompatExNihiloReborn.java | 14 + .../exnihiloreborn/data/Data.java | 31 ++ .../data/EBlockTagsProvider.java | 19 + .../exnihiloreborn/data/EItemTagProvider.java | 24 ++ .../exnihiloreborn/data/ELangProvider.java | 77 ++++ .../exnihiloreborn/data/ELootProvider.java | 103 +++++ .../exnihiloreborn/data/EModelProvider.java | 173 +++++++++ .../exnihiloreborn/data/ERecipeProvider.java | 260 +++++++++++++ .../fluid/WitchWaterFluidType.java | 60 +++ .../exnihiloreborn/item/CrookItem.java | 48 +++ .../exnihiloreborn/item/EItemTags.java | 16 + .../exnihiloreborn/item/ETab.java | 19 + .../exnihiloreborn/item/FluidBucketItem.java | 20 + .../exnihiloreborn/item/HammerItem.java | 32 ++ .../exnihiloreborn/item/SilkWormItem.java | 50 +++ .../loot/CrookLootModifier.java | 56 +++ .../loot/HammerLootModifier.java | 78 ++++ .../exnihiloreborn/loot/InfestedString.java | 69 ++++ .../exnihiloreborn/recipe/CodecUtil.java | 25 ++ .../exnihiloreborn/recipe/Reward.java | 71 ++++ .../exnihiloreborn/recipe/RewardRecipe.java | 75 ++++ .../recipe/SingleIngredientRecipe.java | 83 +++++ .../recipe/barrel/BarrelCompostRecipe.java | 69 ++++ .../barrel/FinishedBarrelCompostRecipe.java | 52 +++ .../recipe/crucible/CrucibleRecipe.java | 67 ++++ .../crucible/FinishedCrucibleRecipe.java | 59 +++ .../recipe/hammer/CompressedHammerRecipe.java | 28 ++ .../recipe/hammer/FinishedHammerRecipe.java | 64 ++++ .../recipe/hammer/HammerRecipe.java | 27 ++ .../recipe/sieve/AbstractSieveRecipe.java | 84 +++++ .../recipe/sieve/CompressedSieveRecipe.java | 27 ++ .../recipe/sieve/FinishedSieveRecipe.java | 69 ++++ .../recipe/sieve/SieveRecipe.java | 27 ++ .../registry/EBlockEntities.java | 51 +++ .../exnihiloreborn/registry/EBlocks.java | 111 ++++++ .../exnihiloreborn/registry/EFluids.java | 19 + .../exnihiloreborn/registry/EItems.java | 183 +++++++++ .../registry/ELootFunctions.java | 18 + .../registry/ERecipeSerializers.java | 30 ++ .../exnihiloreborn/registry/ERecipeTypes.java | 27 ++ .../resources/META-INF/accesstransformer.cfg | 3 + src/main/resources/META-INF/mods.toml | 26 ++ .../blockstates/infested_leaves.json | 7 + .../models/block/infested_leaves.json | 5 + .../models/block/old_crucible.json | 257 +++++++++++++ .../models/block/template_barrel.json | 61 +++ .../models/block/template_crucible.json | 145 ++++++++ .../models/block/template_sieve.json | 105 ++++++ .../textures/block/compost_dirt.png | Bin 0 -> 261 bytes .../textures/block/crushed_end_stone.png | Bin 0 -> 1625 bytes .../textures/block/crushed_netherrack.png | Bin 0 -> 1646 bytes .../exnihiloreborn/textures/block/dust.png | Bin 0 -> 1524 bytes .../textures/block/porcelain_crucible.png | Bin 0 -> 652 bytes .../textures/block/unfired_crucible.png | Bin 0 -> 425 bytes .../textures/block/witch_water_flowing.pdn | Bin 0 -> 11837 bytes .../textures/block/witch_water_flowing.png | Bin 0 -> 9034 bytes .../block/witch_water_flowing.png.mcmeta | 3 + .../textures/block/witch_water_still.pdn | Bin 0 -> 9552 bytes .../textures/block/witch_water_still.png | Bin 0 -> 5149 bytes .../block/witch_water_still.png.mcmeta | 5 + .../textures/item/bone_crook.png | Bin 0 -> 3044 bytes .../textures/item/cooked_silk_worm.png | Bin 0 -> 1213 bytes .../exnihiloreborn/textures/item/crook.png | Bin 0 -> 2941 bytes .../textures/item/diamond_hammer.png | Bin 0 -> 3013 bytes .../textures/item/golden_hammer.png | Bin 0 -> 3015 bytes .../textures/item/iron_hammer.png | Bin 0 -> 2984 bytes .../textures/item/silk_worm.png | Bin 0 -> 1204 bytes .../textures/item/stone_hammer.png | Bin 0 -> 2992 bytes .../textures/item/wooden_hammer.png | Bin 0 -> 2995 bytes .../loot_modifiers/compressed_hammer.json | 10 + .../exnihiloreborn/loot_modifiers/crook.json | 10 + .../exnihiloreborn/loot_modifiers/hammer.json | 10 + .../loot_modifiers/global_loot_modifiers.json | 8 + src/main/resources/pack.mcmeta | 6 + 419 files changed, 9783 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 changelog.md create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/generated/resources/.cache/cache create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/acacia_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/acacia_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/acacia_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/birch_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/birch_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/birch_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/crimson_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/crimson_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/crimson_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/crushed_end_stone.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/crushed_netherrack.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/dust.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/jungle_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/jungle_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/jungle_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/porcelain_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/spruce_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/spruce_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/spruce_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/stone_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/unfired_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/warped_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/warped_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/blockstates/warped_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/lang/en_us.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/acacia_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/acacia_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/acacia_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/birch_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/birch_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/birch_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/crimson_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/crimson_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/crimson_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/crushed_end_stone.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/crushed_netherrack.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/dust.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/jungle_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/jungle_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/jungle_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/porcelain_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/spruce_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/spruce_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/spruce_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/stone_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/unfired_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/warped_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/warped_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/block/warped_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/acacia_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/acacia_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/acacia_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/birch_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/birch_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/birch_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/bone_crook.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/cooked_silk_worm.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crimson_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crimson_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crimson_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crook.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crushed_end_stone.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/crushed_netherrack.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/diamond_hammer.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/dust.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/golden_hammer.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/iron_hammer.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/jungle_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/jungle_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/jungle_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/oak_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/oak_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/oak_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/porcelain_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/silk_worm.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/spruce_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/spruce_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/spruce_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/stone_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/stone_hammer.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/unfired_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/warped_barrel.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/warped_crucible.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/warped_sieve.json create mode 100644 src/generated/resources/assets/exnihiloreborn/models/item/wooden_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/bone_crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/compressed_crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/cooked_silk_worm.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/diamond_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/golden_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/iron_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/porcelain_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/unfired_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/wooden_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dust.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/infested_leaves.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/stone_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/acacia_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/acacia_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/apple.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/bread.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/cookie.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/kelp.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/leaves.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon_slice.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/mushrooms.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/nether_wart.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin_pie.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/saplings.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seagrass.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seeds.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/silk_worms.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/small_flowers.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/spider_eye.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/sweet_berries.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/tall_flowers.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/wheat.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/birch_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/birch_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/bone_crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/compressed_crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/cooked_silk_worm.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/crimson_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/crimson_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/crook.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/dark_oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/dark_oak_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/diamond_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/golden_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/iron_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/jungle_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/jungle_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/cobblestone.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/gravel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/netherrack.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/stone.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/oak_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/oak_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/porcelain_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/spruce_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/spruce_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/stone_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/stone_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/unfired_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/warped_barrel.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/warped_crucible.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/apple.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/cactus.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/leaves.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon_slice.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/pumpkin.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/saplings.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/small_flowers.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/sweet_berries.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/water_crucible/tall_flowers.json create mode 100644 src/generated/resources/data/exnihiloreborn/recipes/wooden_hammer.json create mode 100644 src/generated/resources/data/exnihiloreborn/tags/items/compressed_hammers.json create mode 100644 src/generated/resources/data/exnihiloreborn/tags/items/crooks.json create mode 100644 src/generated/resources/data/exnihiloreborn/tags/items/hammers.json create mode 100644 src/generated/resources/data/minecraft/advancements/recipes/exnihiloreborn/cooked_silk_worm_from_smoking.json create mode 100644 src/generated/resources/data/minecraft/recipes/cooked_silk_worm_from_smoking.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/acacia_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/anvil.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/bamboo_plantable_on.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/banners.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/base_stone_nether.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/base_stone_overworld.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/beds.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/bee_growables.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/beehives.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/birch_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/buttons.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/campfires.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/carpets.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/climbable.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/coral_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/coral_plants.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/corals.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/crimson_stems.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/crops.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/dark_oak_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/doors.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/enderman_holdable.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/fence_gates.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/fences.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/fire.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/flower_pots.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/flowers.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/gold_ores.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/guarded_by_piglins.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/hoglin_repellents.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/ice.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/impermeable.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/infiniburn_end.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/infiniburn_nether.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/infiniburn_overworld.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/jungle_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/leaves.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/nylium.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/oak_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/piglin_repellents.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/planks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/portals.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/prevent_mob_spawning_inside.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/rails.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/sand.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/saplings.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/shulker_boxes.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/signs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/slabs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/small_flowers.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/soul_fire_base_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/soul_speed_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/spruce_logs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/stairs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/standing_signs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/stone_bricks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/stone_pressure_plates.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/tall_flowers.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/trapdoors.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/underwater_bonemeals.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/unstable_bottom_center.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/valid_spawn.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wall_corals.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wall_post_override.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wall_signs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/walls.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/warped_stems.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wart_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wither_immune.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wither_summon_base_blocks.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/wool.json create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/ExNihiloReborn.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/AbstractCrucibleBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/LavaCrucibleBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/UnfiredCrucibleBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/WaterCrucibleBlock.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/block/package-info.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ItemColors.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ter/InfestedLeavesRenderer.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/client/ter/SieveRenderer.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornPlugin.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/Data.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/EBlockTagsProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/EItemTagProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/ELangProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/ELootProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/EModelProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/data/ERecipeProvider.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluidType.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/CrookItem.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/EItemTags.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/ETab.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/FluidBucketItem.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/item/SilkWormItem.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/loot/CrookLootModifier.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/loot/InfestedString.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/CodecUtil.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/CompressedHammerRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/AbstractSieveRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/CompressedSieveRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/EBlockEntities.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/ELootFunctions.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java create mode 100644 src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java create mode 100644 src/main/resources/META-INF/accesstransformer.cfg create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/exnihiloreborn/blockstates/infested_leaves.json create mode 100644 src/main/resources/assets/exnihiloreborn/models/block/infested_leaves.json create mode 100644 src/main/resources/assets/exnihiloreborn/models/block/old_crucible.json create mode 100644 src/main/resources/assets/exnihiloreborn/models/block/template_barrel.json create mode 100644 src/main/resources/assets/exnihiloreborn/models/block/template_crucible.json create mode 100644 src/main/resources/assets/exnihiloreborn/models/block/template_sieve.json create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/crushed_end_stone.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/crushed_netherrack.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/dust.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/porcelain_crucible.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/unfired_crucible.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_flowing.pdn create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_flowing.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_flowing.png.mcmeta create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.pdn create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.png.mcmeta create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/bone_crook.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/cooked_silk_worm.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/crook.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/diamond_hammer.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/golden_hammer.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/iron_hammer.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/silk_worm.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/stone_hammer.png create mode 100644 src/main/resources/assets/exnihiloreborn/textures/item/wooden_hammer.png create mode 100644 src/main/resources/data/exnihiloreborn/loot_modifiers/compressed_hammer.json create mode 100644 src/main/resources/data/exnihiloreborn/loot_modifiers/crook.json create mode 100644 src/main/resources/data/exnihiloreborn/loot_modifiers/hammer.json create mode 100644 src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..f811f6ae --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Disable autocrlf on generated files, they always generate with LF +# Add any extra files or paths here to make git stop saying they +# are changed when only line endings change. +src/generated/**/.cache/cache text eol=lf +src/generated/**/*.json text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..12f86447 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea + +# gradle +build +.gradle + +# other +eclipse +run + +# Files from Forge MDK +forge*changelog.txt diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..e5b07fe4 --- /dev/null +++ b/build.gradle @@ -0,0 +1,127 @@ +plugins { + id 'idea' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' + id 'org.parchmentmc.librarian.forgegradle' version '1.+' + id 'org.spongepowered.mixin' version '0.7.+' +} + +version = '1.0' +group = 'team.rusty.exnihiloreborn' +base { + archivesName = 'exnihiloreborn' +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +minecraft { + mappings channel: 'parchment', version: "$parchment_mappings-$mc_version" + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + runs { + copyIdeResources = true + + client { + workingDirectory project.file('run') + + property 'forge.logging.console.level', 'debug' + + mods { + exnihiloreborn { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run/server') + + property 'forge.logging.console.level', 'debug' + + mods { + exnihiloreborn { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + property 'forge.logging.console.level', 'debug' + + args '--mod', 'exnihiloreborn', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + + mods { + exnihiloreborn { + source sourceSets.main + } + } + } + } +} + +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + +repositories { + mavenCentral() + maven { + name = 'McJty maven' + url = 'https://maven.k-4u.nl' + content { includeGroup 'mcjty.theoneprobe' } + } + maven { + name = 'jei' + url = 'https://maven.blamejared.com/' + content { includeGroup "mezz.jei" } + } +} + +dependencies { + minecraft("net.minecraftforge:forge:${mc_version}-${forge_version}") + + // TOP + implementation(fg.deobf("mcjty.theoneprobe:theoneprobe:1.20.0-${top_version}") { + transitive = false + }) + // JEI OPTIONAL + compileOnly(fg.deobf("mezz.jei:jei-${mc_version}-common-api:${jei_version}")) + compileOnly(fg.deobf("mezz.jei:jei-${mc_version}-forge-api:${jei_version}")) + // at runtime, use the full JEI jar for Forge + runtimeOnly(fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}")) +} + +def replaceProperties = [ mc_version: mc_version, mod_version: version ] + +processResources { + inputs.properties replaceProperties + replaceProperties.put 'project', project + + filesMatching(['META-INF/mods.toml']) { + expand replaceProperties + } + + // Minify JSON resources + // Actual reduction in file size is just a few KB, but why not? + doLast { + fileTree(dir: outputs.files.asPath, include: "**/*.json").each { + File file -> + //noinspection UnnecessaryQualifiedReference + file.text = groovy.json.JsonOutput.toJson(new groovy.json.JsonSlurper().parse(file)) + } + } +} + +jar { + manifest { + attributes([ + "Specification-Title": "exnihiloreborn", + "Specification-Vendor": "exnihilorebornsareus", + "Specification-Version": "1", // We are version 1 of ourselves + "Implementation-Title": project.name, + "Implementation-Version": "${version}", + "Implementation-Vendor" :"exnihilorebornsareus", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..d2ebe83f --- /dev/null +++ b/changelog.md @@ -0,0 +1,6 @@ +## Ex Nihilo Reborn - 1.0 +- Ex Nihilo Reborn is a port mixed of the original Ex Nihilo from 1.7.10 + and Ex Nihilo Adscensio for 1.10.2. I was unimpressed with Ex Nihilo Sequentia, + so I made this. +- Removed Andesite, Granite, and Diorite pebbles +- No coral seeds diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..3db35286 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,15 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false +org.gradle.cache=true + +mc_version=1.20.1 +forge_version=47.0.34 +parchment_mappings=1.20.1-2023.06.26 + +geckolib_version=4.2 +modonomicon_version=1.36.0 +jei_version=15.0.0.12 +curios_version=5.2.0-beta.3 +top_version=9.0.0-1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..fae08049 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..55452c3c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net/' } + maven { url = 'https://maven.parchmentmc.org' } + } +} + +plugins { + //id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' +} diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache new file mode 100644 index 00000000..76c3dccc --- /dev/null +++ b/src/generated/resources/.cache/cache @@ -0,0 +1,308 @@ +6b1f7c2a40a8907e7f7408f1abfb28078caa4fff assets/exnihiloreborn/blockstates/acacia_barrel.json +4cfcca92876cd40dce2731bf17e1c12bde0dc813 assets/exnihiloreborn/blockstates/acacia_crucible.json +ef543c60f5f20a84037814c027cfdecca0f4cea0 assets/exnihiloreborn/blockstates/acacia_sieve.json +239790a7c18c748b660d8ef88104bea785b6c8b2 assets/exnihiloreborn/blockstates/birch_barrel.json +d00f325339290b49a550cbe16457fcf99e5d5a0e assets/exnihiloreborn/blockstates/birch_crucible.json +da9be2724dd0b84eecab228d82785599313a025d assets/exnihiloreborn/blockstates/birch_sieve.json +96fb45b1314378aaa7fb3860ee0c551137607d23 assets/exnihiloreborn/blockstates/crimson_barrel.json +5dda0004c1720107f61245c74d9f382febb7c9ea assets/exnihiloreborn/blockstates/crimson_crucible.json +2fbf799c3aa62833b89eedcda3841115eb51d846 assets/exnihiloreborn/blockstates/crimson_sieve.json +cc9c3f04c5b8dab09cbe27daa63acd46d53d55e2 assets/exnihiloreborn/blockstates/crushed_end_stone.json +0cc83d101a7ba1c53e4233520603cb8ec90ea4e5 assets/exnihiloreborn/blockstates/crushed_netherrack.json +c57daf6b8fcfdedc131961f69c73b6507952afe3 assets/exnihiloreborn/blockstates/dark_oak_barrel.json +2e621058efc29a09a1a7ef63c8beff29629e949f assets/exnihiloreborn/blockstates/dark_oak_crucible.json +631b32a1d0ffaa6870a33b49c01ef90bcb1af498 assets/exnihiloreborn/blockstates/dark_oak_sieve.json +b80f3a9a366a319ffb13b430ac450f7e9a8da1c7 assets/exnihiloreborn/blockstates/dust.json +d6e60487cb7b9fe4895677bc27cf7ae460f4a6c8 assets/exnihiloreborn/blockstates/jungle_barrel.json +304d271ad49bc8295de2d10e16eb91506e1a3049 assets/exnihiloreborn/blockstates/jungle_crucible.json +bbad544438efbffb530fbafb3733069782c8a75f assets/exnihiloreborn/blockstates/jungle_sieve.json +7aa72fb4e265c728322964fdf9fd6ee36156cd00 assets/exnihiloreborn/blockstates/oak_barrel.json +21ad905736d2fdd2df8eb5a5e8263c6c1c23d799 assets/exnihiloreborn/blockstates/oak_crucible.json +3c2c217a2309840bb1d94dddd376f948617d43b8 assets/exnihiloreborn/blockstates/oak_sieve.json +1b11dc53dbabd2844e6763f47cae3388ad0c5264 assets/exnihiloreborn/blockstates/porcelain_crucible.json +859f034cece7abfa991b8b3cef4f194bbfafa2e8 assets/exnihiloreborn/blockstates/spruce_barrel.json +b60e62238d282b373cacdcaaa8f5cdfcf8773304 assets/exnihiloreborn/blockstates/spruce_crucible.json +b87591386e02d4f86a3faef2b43b89011d055542 assets/exnihiloreborn/blockstates/spruce_sieve.json +72a1cca44f9264a87045d73b6ba4b4422f893f7a assets/exnihiloreborn/blockstates/stone_barrel.json +035bba6565158e71f78ddc64421004001b72f9bd assets/exnihiloreborn/blockstates/unfired_crucible.json +43f536765740a10e87376f1868a352e9b3578e3b assets/exnihiloreborn/blockstates/warped_barrel.json +3da9a7f055c1ef45bddbbe4d2caab4010e4a94ba assets/exnihiloreborn/blockstates/warped_crucible.json +5bf22e4b5f24f6e634a7a5d2ffb507160d7df19b assets/exnihiloreborn/blockstates/warped_sieve.json +8593319de75b48dd4f6cd75c29344891b173b0e3 assets/exnihiloreborn/lang/en_us.json +fc7629ecbb61ad05a717b5399e494746aebd46f2 assets/exnihiloreborn/models/block/acacia_barrel.json +2faac013888461275178b85d135bee8c4587a1d3 assets/exnihiloreborn/models/block/acacia_crucible.json +8774297c443953ac2add65bfdd4eded703fbb412 assets/exnihiloreborn/models/block/acacia_sieve.json +0a0fd97607320822d7f126f6422922df0225c69a assets/exnihiloreborn/models/block/birch_barrel.json +732bd9803ef2351896e97f277eefc9f0857b34b0 assets/exnihiloreborn/models/block/birch_crucible.json +b03c2fe3e19cb42da6329bc0312b8bece38b0a01 assets/exnihiloreborn/models/block/birch_sieve.json +e78e763781a1dcd1919f9b466faa124048c703f0 assets/exnihiloreborn/models/block/crimson_barrel.json +d61d2a148163e9315d8ebd058323a59697503a8d assets/exnihiloreborn/models/block/crimson_crucible.json +ec509d5d0ce8307f4db0373effd841962fb444b2 assets/exnihiloreborn/models/block/crimson_sieve.json +a2dd7dc4b93718c1fa541cbbc4b707a0b10c7a45 assets/exnihiloreborn/models/block/crushed_end_stone.json +4a8f2f59570b6ee3abdd9332c422f0c4bd922a70 assets/exnihiloreborn/models/block/crushed_netherrack.json +da1a0e75d98233de9afc951a09d760ed8b17ba80 assets/exnihiloreborn/models/block/dark_oak_barrel.json +fcfa75f17fbf9ef1ab688920c9ad274f4a6af7c6 assets/exnihiloreborn/models/block/dark_oak_crucible.json +c55835b1aeba6642ddffe80282819cc31e75f1a1 assets/exnihiloreborn/models/block/dark_oak_sieve.json +bfc71b617371fc9b58281dab8db17e3022ed5976 assets/exnihiloreborn/models/block/dust.json +916d957dd5700f934d8b2e821762c812a23f244d assets/exnihiloreborn/models/block/jungle_barrel.json +63c0cbd8217e3b639b3a3187cd99a805f0cece29 assets/exnihiloreborn/models/block/jungle_crucible.json +b805f2bc24a1565fa0e86eeb5653e0d46a78e993 assets/exnihiloreborn/models/block/jungle_sieve.json +f8d2bd98ad407c49566ae911feba7abc531a4cd5 assets/exnihiloreborn/models/block/oak_barrel.json +08525e523958ca7b6c7540c2bef11f28fb7502c0 assets/exnihiloreborn/models/block/oak_crucible.json +39f9c13ade872068dbb48ecf7dc98c19d11fab75 assets/exnihiloreborn/models/block/oak_sieve.json +f124d29de3f40103c7e47b98c28f02f752e92f6c assets/exnihiloreborn/models/block/porcelain_crucible.json +34d343e599b93fad9b765dce84501504be0217c0 assets/exnihiloreborn/models/block/spruce_barrel.json +86245ab87ce1595f217d9a9d9c21f4d2303dfefe assets/exnihiloreborn/models/block/spruce_crucible.json +40db06387ec10438a8feb79ffdd6b53cd07e582d assets/exnihiloreborn/models/block/spruce_sieve.json +b2acd16c3cf321faee10b2a3863ce2797e1a026e assets/exnihiloreborn/models/block/stone_barrel.json +f454ed0ed5fa37fd1339f18063fb1cfdfd164669 assets/exnihiloreborn/models/block/unfired_crucible.json +ad9c5cf97b42805238a7edea2fdaeeb03e6da7d3 assets/exnihiloreborn/models/block/warped_barrel.json +953a84335205c9b8581d793d5c844f895a4f3135 assets/exnihiloreborn/models/block/warped_crucible.json +a89c05d07b7e05c6aaf2bb197aedb10786e1128f assets/exnihiloreborn/models/block/warped_sieve.json +b6b1c57f668edf98740db76fd14f133eaffd0720 assets/exnihiloreborn/models/item/acacia_barrel.json +183d0697b952c37b5c6818adb9fa8f6333693528 assets/exnihiloreborn/models/item/acacia_crucible.json +056527f91834d397e6e6d58ed593304290379d4a assets/exnihiloreborn/models/item/acacia_sieve.json +009913aff8f2b1c986022ae220711a6ae0a5b7b0 assets/exnihiloreborn/models/item/birch_barrel.json +38cbfac78e620cd843f87fb06bb82d0b782b10ce assets/exnihiloreborn/models/item/birch_crucible.json +1e55d3001b89131196e2633c5ca90b39a0fd3d85 assets/exnihiloreborn/models/item/birch_sieve.json +c5b025888aa5205fd99aa22ced491ab5d15d8367 assets/exnihiloreborn/models/item/bone_crook.json +14b3d5e284b7b3d39951712a1f1f7c4e1ff17d48 assets/exnihiloreborn/models/item/cooked_silk_worm.json +6bf1e8bafd9b964e601768304131f4f16d45cd0e assets/exnihiloreborn/models/item/crimson_barrel.json +a98fd77c49e09c5a3ddb17ff128157bd60ca9a8c assets/exnihiloreborn/models/item/crimson_crucible.json +b9a31f1db41dbd0b59f867b008ec55792061bdaa assets/exnihiloreborn/models/item/crimson_sieve.json +1cd6f833e1d0c8751cfc358d91d964c897de58d4 assets/exnihiloreborn/models/item/crook.json +28d934726ab844081edb590c59f3dcc3c2dc6bfb assets/exnihiloreborn/models/item/crushed_end_stone.json +6e2ecc834f0e35ed8f0f24b1bb2382c68f359a17 assets/exnihiloreborn/models/item/crushed_netherrack.json +3b66ea2aae7c884567ba388bf64e89c627d9ce23 assets/exnihiloreborn/models/item/dark_oak_barrel.json +a37fde390decb12fde8466cc3379ee12ab5fe25d assets/exnihiloreborn/models/item/dark_oak_crucible.json +8d83269151e363c2bdd9d0c428f856a0a05791fe assets/exnihiloreborn/models/item/dark_oak_sieve.json +e7c623c33a07c856eb70bb68c5504d64c1131d6a assets/exnihiloreborn/models/item/diamond_hammer.json +ce06221b61a1e59776244f6cd7297730dc6c44f7 assets/exnihiloreborn/models/item/dust.json +34b81e1056dc4a84b7cf40ca711e81a4d52d6113 assets/exnihiloreborn/models/item/golden_hammer.json +c568879b6ac167affec3e14eb12e5119178c8369 assets/exnihiloreborn/models/item/iron_hammer.json +f07bda7d8acb0858f4f5141496ec1b8f1ad8adca assets/exnihiloreborn/models/item/jungle_barrel.json +d6add4e04cec2661b245b69d228acc7237da42dc assets/exnihiloreborn/models/item/jungle_crucible.json +123aafb9e4c2d7b84a11788eb125f1dd4fb0f02f assets/exnihiloreborn/models/item/jungle_sieve.json +70120521c811abb2e8c81a6b06eb7d5c14219db4 assets/exnihiloreborn/models/item/oak_barrel.json +307de756c26a215396ab04a905ac79df5e96a948 assets/exnihiloreborn/models/item/oak_crucible.json +cabe1fe16d343bcd9338dcc1c7c52b9f992110e4 assets/exnihiloreborn/models/item/oak_sieve.json +6c25f161c7adc7db3961bbd9a24146b8edeb32b6 assets/exnihiloreborn/models/item/porcelain_crucible.json +d0baa6801590a4581fa94f168df5183730589fb1 assets/exnihiloreborn/models/item/silk_worm.json +8e0cecb3176800ff5972704e7251dffa7253d2e1 assets/exnihiloreborn/models/item/spruce_barrel.json +b853e1b5a36df4b5660e0fc413a9df9a145ce3f9 assets/exnihiloreborn/models/item/spruce_crucible.json +cc1c573870dac3f2a5c3e8e80964eb494cb2c3e9 assets/exnihiloreborn/models/item/spruce_sieve.json +7a1b6abcd79c1c797a0884380c926482e2323fb1 assets/exnihiloreborn/models/item/stone_barrel.json +b6aa4986ab295a968d7fb1630023714240a7b03f assets/exnihiloreborn/models/item/stone_hammer.json +b69a214d853d74c17a1a92114ab4c2f1316162fe assets/exnihiloreborn/models/item/unfired_crucible.json +42e0adade5d4e9f8c5bc0309ab9e82e375d77696 assets/exnihiloreborn/models/item/warped_barrel.json +afed51f68ebb12aaeffe6f8141b9c21ec950fb4f assets/exnihiloreborn/models/item/warped_crucible.json +b9fcf4827195310e0fc6120171bc0242bc440ef7 assets/exnihiloreborn/models/item/warped_sieve.json +fb15c1f086ed59aeb62879c7160f28a3d7ef4de3 assets/exnihiloreborn/models/item/wooden_hammer.json +6b13f0abd30f8e3935c86963e3b5b7a4258bd7dd data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_barrel.json +5c134ce0d7c57e569bbf1bb9a6905976b34c2540 data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_crucible.json +cbd050075da9b73b9738af87c8bb98b42510f452 data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_barrel.json +ee0e9d1c8c34cd7ff43b9ee286d9aa0a44dd6407 data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_crucible.json +bb7c50bcb94ee585343de89c7aca1713bc451b71 data/exnihiloreborn/advancements/recipes/exnihiloreborn/bone_crook.json +bcc07ba16eb241fe27411e70e9802fa9ccf1c725 data/exnihiloreborn/advancements/recipes/exnihiloreborn/compressed_crook.json +966e85a52859f9e071130353134d823b8e6d37f5 data/exnihiloreborn/advancements/recipes/exnihiloreborn/cooked_silk_worm.json +2eeffb066842df5bd36818c751e7e900bfab573c data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_barrel.json +07fb507a770c9d70e80bd1e7f3c1b50090087521 data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_crucible.json +4738a5e12744f6f0bc1411bd4a6d2d09f8c98930 data/exnihiloreborn/advancements/recipes/exnihiloreborn/crook.json +285be8d87ddf835429c7d6d61f5246c94faa54a3 data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_barrel.json +01bc75c0be5fa8d224cedbc963f07e80a5fbd7ac data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_crucible.json +ecc1a50dc52ef324615180e1b8caf4666d6bb0c6 data/exnihiloreborn/advancements/recipes/exnihiloreborn/diamond_hammer.json +f6b903bc4e0549a39d1319fea690090c52450373 data/exnihiloreborn/advancements/recipes/exnihiloreborn/golden_hammer.json +ea82d82f3598de41a34b675a87979bcf11c11908 data/exnihiloreborn/advancements/recipes/exnihiloreborn/iron_hammer.json +fa64e83b81957793f3e280e3295f70fb5a378e12 data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_barrel.json +0ba940ea12af29bacb95bcf0256335e3deaf7eaf data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_crucible.json +6c3cd676b4b31c9758a12b1f2207aa2b5a2f6dcc data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_barrel.json +c8ed20329333ddf22c2258ed797c1d3bb28490fe data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_crucible.json +bcbc1214981633751fbdbad75c1e15b2cc2c5e9c data/exnihiloreborn/advancements/recipes/exnihiloreborn/porcelain_crucible.json +e0de3a8f65d6f0ce24d3a73daa9ad49cd8f1eab0 data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_barrel.json +8f9a667b15d0ca9e61d55514be28d3d68ab960be data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_crucible.json +53237e2f0c0332e2b651a70caada4bf0883cd7d8 data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_barrel.json +1d6f6b945d4c8aea67e256309a2833ad62e40111 data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_hammer.json +23cad98d77125e56b162f66a4f7c063aaf976050 data/exnihiloreborn/advancements/recipes/exnihiloreborn/unfired_crucible.json +a833117f7ea1ea35025691aa1e9392de75b4d27a data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_barrel.json +95709fa9f528fe8864a380e47271fa136a4d23a4 data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_crucible.json +6bb59781f6303c94205223365921e3197f07eace data/exnihiloreborn/advancements/recipes/exnihiloreborn/wooden_hammer.json +7e1a9f4c6014042f1b37e13e5f41d7f1aa1c3782 data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json +55e3f3cfedf47ad775d1354ea0850fa6e2da1515 data/exnihiloreborn/loot_tables/blocks/birch_barrel.json +56f8a57d4951f080a470c6a993aded60978da8c5 data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json +96e3fd87da7d782ee296f92e0d21f7126952203c data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json +7dcf5bcc109a8232bad0eb5da20452751e28f742 data/exnihiloreborn/loot_tables/blocks/compressed_dust.json +d3c6080124dec154a147f7b387f7b45f7a69b08f data/exnihiloreborn/loot_tables/blocks/compressed_sand.json +13b8c702c4a29592805d50ad6be1fb418a762d68 data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json +0df0157da6efb67e302174b78a11336042b55029 data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json +153332e35013ac8ce00c3c7d9e96fcf2b7418f12 data/exnihiloreborn/loot_tables/blocks/dust.json +3f997adf0dbd796a553c901d44bf344d0758393a data/exnihiloreborn/loot_tables/blocks/infested_leaves.json +b72effb758675549b6bed2a131f9bbe3e46ea505 data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json +cf78b1f62fe2f14a3aeeab9c55a594d4fafd965d data/exnihiloreborn/loot_tables/blocks/oak_barrel.json +12541930dfff7ddf4fdaaeeb744ef361e9a85dcb data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json +5bc1d6f1f8f190d6da258c215b450156cb915853 data/exnihiloreborn/loot_tables/blocks/stone_barrel.json +bb4e1d6e0d46871a50fd12a0ee6ec2522044fd05 data/exnihiloreborn/loot_tables/blocks/warped_barrel.json +80cd88ac7cdf83c4d85ed33eaec23b1e5a30be37 data/exnihiloreborn/recipes/acacia_barrel.json +00289c1036ea6eb7b7bc352dfe730aefabcfccf3 data/exnihiloreborn/recipes/acacia_crucible.json +9a5593056cd0123fc99ceee4e8b4e0baab451e77 data/exnihiloreborn/recipes/barrel_compost/apple.json +17484460671baa5c0030bad675d7ef998c39df8b data/exnihiloreborn/recipes/barrel_compost/bread.json +924c20ccecc4549c3da5ebecbdd98bb737c896d4 data/exnihiloreborn/recipes/barrel_compost/cookie.json +ef70f45c9dae5e819ae41a3fce333cfdea509e4a data/exnihiloreborn/recipes/barrel_compost/kelp.json +7fa9a414885aeeba54fd530d895620f436991dcc data/exnihiloreborn/recipes/barrel_compost/leaves.json +153fcdc950855b9f18e417e249daa1bf22ee3af1 data/exnihiloreborn/recipes/barrel_compost/melon.json +d48c313e8904ac474d823ab9cb3f0028df15356f data/exnihiloreborn/recipes/barrel_compost/melon_slice.json +53d049cf51ddc6902503dafffc5298704dab0dc2 data/exnihiloreborn/recipes/barrel_compost/mushrooms.json +93c059428567a58439cfd7c999eb75a298a2419e data/exnihiloreborn/recipes/barrel_compost/nether_wart.json +5bf24aacd0eee32a5f8c89b22f108cb9715366d6 data/exnihiloreborn/recipes/barrel_compost/pumpkin.json +9bd10d56444191c6f88d9c8839446675de4eef37 data/exnihiloreborn/recipes/barrel_compost/pumpkin_pie.json +ff828be14e992c890b3066ac0f24f0f8d2f465e5 data/exnihiloreborn/recipes/barrel_compost/saplings.json +729c7a6d72e29103b1c6d265e02238ad1e8add20 data/exnihiloreborn/recipes/barrel_compost/seagrass.json +62ead8b6d3747c3467e7e14f6f34c816bfcbcd40 data/exnihiloreborn/recipes/barrel_compost/seeds.json +b8c51d6410b50dee022db5ccac01b9800bade308 data/exnihiloreborn/recipes/barrel_compost/silk_worms.json +2d14fef43c12935f895bfd958a14bb3ca5fc9223 data/exnihiloreborn/recipes/barrel_compost/small_flowers.json +fbe5d2c7c275df5683b20b1e15f12bec2f426f6d data/exnihiloreborn/recipes/barrel_compost/spider_eye.json +d3ab57bca3495e7537716f168554ce6ae9f72f9f data/exnihiloreborn/recipes/barrel_compost/sweet_berries.json +6f6f93ffa5bcc28948106e6efc0fe275b7fecb2e data/exnihiloreborn/recipes/barrel_compost/tall_flowers.json +74ddc2ca01f0e2a35e609633bc7a67793c63f473 data/exnihiloreborn/recipes/barrel_compost/wheat.json +00f9ee47d01b26ff9fdb01032c2629c9701ff5a1 data/exnihiloreborn/recipes/birch_barrel.json +c9d521c98e634eaee6a64a5ac152902ba10dd694 data/exnihiloreborn/recipes/birch_crucible.json +00c545fb1552eda6d048d2360ae59c8fc837dc7e data/exnihiloreborn/recipes/bone_crook.json +eeed21a616d81213a7fc605b51b0c18e46bde843 data/exnihiloreborn/recipes/compressed_crook.json +0830189e0e494f36030ed2511639528df4473d13 data/exnihiloreborn/recipes/cooked_silk_worm.json +327708e5cc4c5cb2c1c3ba88bb3cf3939039ec2b data/exnihiloreborn/recipes/crimson_barrel.json +37cc68ed5337fdf24bafeee830b327009ebaa33e data/exnihiloreborn/recipes/crimson_crucible.json +9f1f7d3b1498aea50cd4aca636fe97ff495073b3 data/exnihiloreborn/recipes/crook.json +3de823e6a637550f483788fbbf0bcf3eb754344f data/exnihiloreborn/recipes/dark_oak_barrel.json +91505bedc6771829bd6e2e3ced6e992c107c96b7 data/exnihiloreborn/recipes/dark_oak_crucible.json +2c6e77c878721480afc9f90262db4c037d651237 data/exnihiloreborn/recipes/diamond_hammer.json +4bfc3eabfc36a2d19f0c55227f0e4a322d823962 data/exnihiloreborn/recipes/golden_hammer.json +f57cb3b8bf65c90a48cc388152840f7b11ce3556 data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json +23e4048ef09ed61a26ba66da7aadd5adfb522415 data/exnihiloreborn/recipes/hammer/crushing_sandstone.json +2d4174edc94e859a604bed46199db915a6927260 data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json +b69e7d7dda133d91b025d36ef84566ac44f7f6dc data/exnihiloreborn/recipes/hammer/dust.json +f487e8a70d29641a70d76f274957ba42286963e0 data/exnihiloreborn/recipes/hammer/gravel.json +12e8c032a7db4148d0006d66ff1fbd0373935803 data/exnihiloreborn/recipes/hammer/sand.json +281e8e15a3159a508fe4262ad2ce2113d7ceac3c data/exnihiloreborn/recipes/hammer/stone_pebbles.json +ced6fb12c0fbc529e98572cbd3452891e0564fe7 data/exnihiloreborn/recipes/iron_hammer.json +c918efafcf434580d9b47d0a1ec3dbfdb28045f6 data/exnihiloreborn/recipes/jungle_barrel.json +a19f3bc2479dcacc247de14ba6869ffc001c8dea data/exnihiloreborn/recipes/jungle_crucible.json +d829ab200ba6efdc0d1a9758759289363c132f5d data/exnihiloreborn/recipes/lava_crucible/cobblestone.json +ffaec302cf020443f66ca28f8e8a8ed427bbd89b data/exnihiloreborn/recipes/lava_crucible/gravel.json +b3ebb98ef1ea9ac7e49d77d23ec0e984faf6537e data/exnihiloreborn/recipes/lava_crucible/netherrack.json +f8bb7bbed78bf4dae074eaa05326d803337a489c data/exnihiloreborn/recipes/lava_crucible/stone.json +af075fdc2fdc2cd328c6e7d5d22044780b5a00b9 data/exnihiloreborn/recipes/oak_barrel.json +70bc1f2f8c7d3da8eada077d8658185a8d6b5055 data/exnihiloreborn/recipes/oak_crucible.json +c05d612814c3125dc7c4e1a370cd073d3a63300c data/exnihiloreborn/recipes/porcelain_crucible.json +62037aa67646438cc78d36b3fc481f5e3d2f8fe5 data/exnihiloreborn/recipes/sieve/beetroot_seeds.json +60d53c7435b74119da7d0d94bf994831ad8eaed8 data/exnihiloreborn/recipes/sieve/melon_seeds.json +8c3674b088a37bf1fa425ac09c014a56d3799612 data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json +0c3425075a3cdd2170d75d3a0db1798ccce457d7 data/exnihiloreborn/recipes/sieve/stone_pebble.json +8e15ced335e2cbd6cd529f5f87484e22d9a53a87 data/exnihiloreborn/recipes/sieve/wheat_seeds.json +300c398ab36fc28e82f8cb8896dc904e600495d5 data/exnihiloreborn/recipes/spruce_barrel.json +a6b1b5fc9a290b5f8603510daf8d9399b4de9c10 data/exnihiloreborn/recipes/spruce_crucible.json +5de67d9a1ebd11bd5eacb443f94be5a47823e552 data/exnihiloreborn/recipes/stone_barrel.json +2e5789cb2eb0ba068bbf4f53d970b68fe2388e9e data/exnihiloreborn/recipes/stone_hammer.json +e08d2edc60f419dd2a508de85316391d67b9c207 data/exnihiloreborn/recipes/unfired_crucible.json +655c330907b76195e87fa161d146cb0100033ca4 data/exnihiloreborn/recipes/warped_barrel.json +a3e0957d9b6c1f42fed4d067bf9e9d9f318c4f93 data/exnihiloreborn/recipes/warped_crucible.json +f04fcb9681c6ff62234de6a4c63ac34bbb9b5d36 data/exnihiloreborn/recipes/water_crucible/apple.json +da94cf0fc55ba1eee518547737498bf97a7f4f86 data/exnihiloreborn/recipes/water_crucible/cactus.json +a142cf2209793519f0bce78be556a94f6537d4e8 data/exnihiloreborn/recipes/water_crucible/leaves.json +4287d1f9c6c075c455ad09494e61c972f084d779 data/exnihiloreborn/recipes/water_crucible/melon.json +854fded794e66307815bf312c49178f9913ac000 data/exnihiloreborn/recipes/water_crucible/melon_slice.json +7ca6f356f6aa83273998591beab8297eb0939e63 data/exnihiloreborn/recipes/water_crucible/pumpkin.json +0105732c70823f5d877c74e31bc7dca75016a02d data/exnihiloreborn/recipes/water_crucible/saplings.json +05b0098dcf57c14680657d6e4a53560ea4f93ed0 data/exnihiloreborn/recipes/water_crucible/small_flowers.json +89594753b56d1e8472441092228d11d8fb331740 data/exnihiloreborn/recipes/water_crucible/sweet_berries.json +356317e7828186a65e04c364f8b41466755cad82 data/exnihiloreborn/recipes/water_crucible/tall_flowers.json +8e71b4e52184f7b6997eca3c9b8df1b4d59d885b data/exnihiloreborn/recipes/wooden_hammer.json +28cc96bf923f4243eafb2f424562c080c13776b9 data/exnihiloreborn/tags/items/compressed_hammers.json +b66a5a958fc3d99897f32b6c50ead81d28a54434 data/exnihiloreborn/tags/items/crooks.json +98b73372f2e5fb304543394d7226cf167e489491 data/exnihiloreborn/tags/items/hammers.json +b05cd8294321449882aa1b4378b355a0357d29c0 data/minecraft/advancements/recipes/exnihiloreborn/cooked_silk_worm_from_smoking.json +d7f16a5ad2b46b72cc4270e809e342775fa1a91c data/minecraft/recipes/cooked_silk_worm_from_smoking.json +cc64a594a266c61f9b417095b48483644216923f data/minecraft/tags/blocks/acacia_logs.json +10bdf4ae09461a8befbc6db074f0c87810a179c8 data/minecraft/tags/blocks/anvil.json +98ed40a9ce70e2db6314eb20b0d798def90cd5ad data/minecraft/tags/blocks/bamboo_plantable_on.json +0bd4a7ad9fb3945080016c0c513a71666f1fa45c data/minecraft/tags/blocks/banners.json +eb26bd99d17e673ddcd07ef7f38dd6ebe4549404 data/minecraft/tags/blocks/base_stone_nether.json +5214bb43c66d495441732b69df204f2460edd494 data/minecraft/tags/blocks/base_stone_overworld.json +2c730d92b3c8bcae7f62381358d05a2994910647 data/minecraft/tags/blocks/beacon_base_blocks.json +cc19b2ce5b4f8d513515eaeff4f8aa1725b038b7 data/minecraft/tags/blocks/beds.json +28d9d739651aa47e95879352a12477c2955448bc data/minecraft/tags/blocks/bee_growables.json +7287fc69a24712818e7bb083eb0ec7eb8ad93d22 data/minecraft/tags/blocks/beehives.json +c4119acccb760f40cc53a372a663ef7202048573 data/minecraft/tags/blocks/birch_logs.json +331374fcc23ad23fe964854acef30097211d234e data/minecraft/tags/blocks/buttons.json +271abebf80b907324609fcf4515fd54d1256703e data/minecraft/tags/blocks/campfires.json +13952d80b58aeec6e0eedccd3ddf31a863df7945 data/minecraft/tags/blocks/carpets.json +f737e48a0a53d2326c89e7d22205ae282bf14ba8 data/minecraft/tags/blocks/climbable.json +351098f7d8142e1e4817b1f637a0f4d554cf0c7d data/minecraft/tags/blocks/coral_blocks.json +ffce4d9383da7dbaea8fc3beb3274a87f0fd58a6 data/minecraft/tags/blocks/coral_plants.json +8c2b7258d84870e024525f5c39a271c8d1229b63 data/minecraft/tags/blocks/corals.json +df61716e1ac18ac14aec90b5380f2912d003d3c6 data/minecraft/tags/blocks/crimson_stems.json +6a1d3975d7be1769c8ab82c38891f0eb5c4f7cf4 data/minecraft/tags/blocks/crops.json +66d8f495d38fd65a5d878009e381e229278a2e0e data/minecraft/tags/blocks/dark_oak_logs.json +41f37916879608eed7f4602ce79a1b21a14d0434 data/minecraft/tags/blocks/doors.json +09f673d40ce1656aa6762c7648373e1b2bca6245 data/minecraft/tags/blocks/dragon_immune.json +b9632e149fc25c3e732ed4c80577c3b88cba171d data/minecraft/tags/blocks/enderman_holdable.json +08f309abe5bee3cb77fa78626d0d11576b95eb31 data/minecraft/tags/blocks/fence_gates.json +8f291eb61c0fb314c0ad9c0253bcabbf93675a93 data/minecraft/tags/blocks/fences.json +515488fb4f5e6fdabfa79481571614283c3741a9 data/minecraft/tags/blocks/fire.json +e741db23dc6f63187460b39e2fd4b5989f6c268c data/minecraft/tags/blocks/flower_pots.json +14b8d5f845b0c48e3c62466258c5a1d508c59da5 data/minecraft/tags/blocks/flowers.json +62c882e7cfd5cd28d7640fe60c94e6817afb811e data/minecraft/tags/blocks/gold_ores.json +a53af57695f5ae2c7076fc645a798201f4eba593 data/minecraft/tags/blocks/guarded_by_piglins.json +07f68e4763cb27322af0824eae4a8d56e10b9246 data/minecraft/tags/blocks/hoglin_repellents.json +6a357118cbaf9faa2d0bd0495c5247dadce3fe52 data/minecraft/tags/blocks/ice.json +6a0a372baf9147d4b3e85cc46301e1e72c3b393c data/minecraft/tags/blocks/impermeable.json +98b39cf1f9ea43f3f4b22dbd718f3f8b30606fdd data/minecraft/tags/blocks/infiniburn_end.json +bb24015cb753c1592206891a800b04b5abda4339 data/minecraft/tags/blocks/infiniburn_nether.json +305fe272833afea72f97591d3555e3566f54eaba data/minecraft/tags/blocks/infiniburn_overworld.json +f26ca94468ebfc40099f3f2387a1a986403ffb36 data/minecraft/tags/blocks/jungle_logs.json +703bb97646721fc12e3c4ccd3dff9413add224f4 data/minecraft/tags/blocks/leaves.json +640c19329c7cbb0bb94a6416947857edc2ffea4d data/minecraft/tags/blocks/logs.json +db1ab1ed896a7e45212c93f307dee6f52d8dfa55 data/minecraft/tags/blocks/logs_that_burn.json +a61ce092a0cba8201832e3e71ea2dcfde6cbd867 data/minecraft/tags/blocks/mushroom_grow_block.json +40737af63de1cafd9baa1cef9bf08e7f5cf74079 data/minecraft/tags/blocks/non_flammable_wood.json +3885d5904ab09945dcff7697f01515438f30aeb2 data/minecraft/tags/blocks/nylium.json +6fb332fe9223f98ad2bfa07a673bd284f1a46127 data/minecraft/tags/blocks/oak_logs.json +b37b4708db0159c68602e2936ba133436a8b4dae data/minecraft/tags/blocks/piglin_repellents.json +4e29a5f501d2d4badb4090d06eddef9b25fe96d3 data/minecraft/tags/blocks/planks.json +e638584b6bd73b4740d21b71a2693044abe3d3ca data/minecraft/tags/blocks/portals.json +6d84dcae6236185e4b25df1c06bb34e5cbe04e8c data/minecraft/tags/blocks/pressure_plates.json +2d2c74dda901bbd6ba0c550c5382ab51a5a82745 data/minecraft/tags/blocks/prevent_mob_spawning_inside.json +fb703660094d60e13c6dcacee036356c207a0843 data/minecraft/tags/blocks/rails.json +b034b4a14f3411c66ed7088642d8369e157a4e93 data/minecraft/tags/blocks/sand.json +b5b0d52ba483e6d85bc0ff6ee81350a7120e708b data/minecraft/tags/blocks/saplings.json +6cc10fee1002cd63b3e1a791358c73fe7d671bb0 data/minecraft/tags/blocks/shulker_boxes.json +b22f77d82e51b5ba6d1b52e03f5912727b0457a4 data/minecraft/tags/blocks/signs.json +11aed5a73a4d9ab505170505f8b145edfb73a0c8 data/minecraft/tags/blocks/slabs.json +e9086500162394a98cfe9221e2081b49a277cc0c data/minecraft/tags/blocks/small_flowers.json +abe677791f6d916b3b307bd1270f4d6687516251 data/minecraft/tags/blocks/soul_fire_base_blocks.json +abe677791f6d916b3b307bd1270f4d6687516251 data/minecraft/tags/blocks/soul_speed_blocks.json +b004f3a3e1922a8b9a89b7b7cda7a7f2986d2f0a data/minecraft/tags/blocks/spruce_logs.json +1806d3b443a9654f81e8a0e9815a129ef17b33a6 data/minecraft/tags/blocks/stairs.json +d3e46da83d51b4d69b0c37e5dc4760934c36bf88 data/minecraft/tags/blocks/standing_signs.json +d35012ca4132eafef53e9ea68e84a7fc8fdd31f6 data/minecraft/tags/blocks/stone_bricks.json +a80bb35192330f6592610482814b73e32b5362b7 data/minecraft/tags/blocks/stone_pressure_plates.json +beb725be018ed98165b5c4c796b463baf18eba68 data/minecraft/tags/blocks/strider_warm_blocks.json +9b9d3f63cf193545f63194080fd1fc66ba69e7ff data/minecraft/tags/blocks/tall_flowers.json +15ee37a120b5ccd1d8986677bd26019e61b12bd5 data/minecraft/tags/blocks/trapdoors.json +dc3094aace807212a671548598e6ebf551f703d5 data/minecraft/tags/blocks/underwater_bonemeals.json +714c9ed3b16a4bbf99ed92a851c50e713f557f20 data/minecraft/tags/blocks/unstable_bottom_center.json +17248c8f056e7340f67ce50f0e3cedbc79832485 data/minecraft/tags/blocks/valid_spawn.json +cdaf7e91da81cec00b8d9bac65d54b6dd9f9d5b2 data/minecraft/tags/blocks/wall_corals.json +21b8bf0ef6b677f9b5b8d1e0398a6b4972c1ca1a data/minecraft/tags/blocks/wall_post_override.json +271c53cb9102f85dc318f1de46c2800ce3a1dc1f data/minecraft/tags/blocks/wall_signs.json +e3eeb6c6451a3d8d2c66ecf464bd8e8b7426c763 data/minecraft/tags/blocks/walls.json +fa0b5df5192cab3ac9a864f1ea9783ecf55db97c data/minecraft/tags/blocks/warped_stems.json +65d65a17100d9372f0adb5b1d6a91118ae9eb340 data/minecraft/tags/blocks/wart_blocks.json +dd2268ec7dfbec202c0946cfe4d7e29a6f904b89 data/minecraft/tags/blocks/wither_immune.json +abe677791f6d916b3b307bd1270f4d6687516251 data/minecraft/tags/blocks/wither_summon_base_blocks.json +b96e14548e654afcd1e02ff74c7087e65f90372a data/minecraft/tags/blocks/wooden_buttons.json +58c7f65650d0381cd95b86e8d1b2a9c40b61fcc3 data/minecraft/tags/blocks/wooden_doors.json +2395f3a3a34048c36bf81272e77d943de8d3f720 data/minecraft/tags/blocks/wooden_fences.json +1c30c5a0651b3223a562deb4e7389ab1675608cb data/minecraft/tags/blocks/wooden_pressure_plates.json +cd2a2d2457ca52209ebd0c54290d2c80579ad301 data/minecraft/tags/blocks/wooden_slabs.json +10a843d1d5098b35227da5304e96dc1156479a2d data/minecraft/tags/blocks/wooden_stairs.json +d25b93d3b70cb0c3ba7a8a0c93de95366c8dbccd data/minecraft/tags/blocks/wooden_trapdoors.json +721eaf2d7f45c4c481c9a86c14ebff6ffb83e3b3 data/minecraft/tags/blocks/wool.json diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_barrel.json new file mode 100644 index 00000000..7de275c5 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/acacia_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_crucible.json new file mode 100644 index 00000000..b2965a9a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/acacia_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_sieve.json new file mode 100644 index 00000000..5a6a891a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/acacia_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/acacia_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/birch_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_barrel.json new file mode 100644 index 00000000..fcad1e5a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/birch_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/birch_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_crucible.json new file mode 100644 index 00000000..0b20d4b8 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/birch_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/birch_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_sieve.json new file mode 100644 index 00000000..ab71b296 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/birch_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/birch_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_barrel.json new file mode 100644 index 00000000..683a3b22 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/crimson_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_crucible.json new file mode 100644 index 00000000..912f3453 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/crimson_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_sieve.json new file mode 100644 index 00000000..f5dc2dcd --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/crimson_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/crimson_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_end_stone.json b/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_end_stone.json new file mode 100644 index 00000000..c5efe3fc --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_end_stone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/crushed_end_stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_netherrack.json b/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_netherrack.json new file mode 100644 index 00000000..6d7adc45 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/crushed_netherrack.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/crushed_netherrack" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_barrel.json new file mode 100644 index 00000000..ab64b1dc --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/dark_oak_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_crucible.json new file mode 100644 index 00000000..2d93c323 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/dark_oak_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_sieve.json new file mode 100644 index 00000000..030c9da6 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/dark_oak_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/dark_oak_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/dust.json b/src/generated/resources/assets/exnihiloreborn/blockstates/dust.json new file mode 100644 index 00000000..6036098c --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/dust.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/dust" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_barrel.json new file mode 100644 index 00000000..ed66c5c0 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/jungle_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_crucible.json new file mode 100644 index 00000000..1365a1fc --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/jungle_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_sieve.json new file mode 100644 index 00000000..f90136de --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/jungle_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/jungle_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_barrel.json new file mode 100644 index 00000000..ad867859 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/oak_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_crucible.json new file mode 100644 index 00000000..94770373 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/oak_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_sieve.json new file mode 100644 index 00000000..6b444230 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/oak_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/oak_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/porcelain_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/porcelain_crucible.json new file mode 100644 index 00000000..0493ab5b --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/porcelain_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/porcelain_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_barrel.json new file mode 100644 index 00000000..65887092 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/spruce_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_crucible.json new file mode 100644 index 00000000..501f3be4 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/spruce_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_sieve.json new file mode 100644 index 00000000..a1cf2a6e --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/spruce_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/spruce_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/stone_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/stone_barrel.json new file mode 100644 index 00000000..88f6e81c --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/stone_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/stone_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/unfired_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/unfired_crucible.json new file mode 100644 index 00000000..070843f3 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/unfired_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/unfired_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/warped_barrel.json b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_barrel.json new file mode 100644 index 00000000..991b6fe5 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_barrel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/warped_barrel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/warped_crucible.json b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_crucible.json new file mode 100644 index 00000000..e0bf0f13 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_crucible.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/warped_crucible" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/blockstates/warped_sieve.json b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_sieve.json new file mode 100644 index 00000000..8e08a54e --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/blockstates/warped_sieve.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/warped_sieve" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/lang/en_us.json b/src/generated/resources/assets/exnihiloreborn/lang/en_us.json new file mode 100644 index 00000000..5fda2507 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/lang/en_us.json @@ -0,0 +1,52 @@ +{ + "block.exnihiloreborn.acacia_barrel": "Acacia Barrel", + "block.exnihiloreborn.acacia_crucible": "Acacia Crucible", + "block.exnihiloreborn.birch_barrel": "Birch Barrel", + "block.exnihiloreborn.birch_crucible": "Birch Crucible", + "block.exnihiloreborn.compressed_cobblestone": "Compressed Cobblestone", + "block.exnihiloreborn.compressed_crushed_end_stone": "Compressed Crushed End Stone", + "block.exnihiloreborn.compressed_crushed_netherrack": "Compressed Crushed Netherrack", + "block.exnihiloreborn.compressed_dirt": "Compressed Dirt", + "block.exnihiloreborn.compressed_dust": "Compressed Dust", + "block.exnihiloreborn.compressed_sand": "Compressed Sand", + "block.exnihiloreborn.crimson_barrel": "Crimson Barrel", + "block.exnihiloreborn.crimson_crucible": "Crimson Crucible", + "block.exnihiloreborn.crushed_end_stone": "Crushed End Stone", + "block.exnihiloreborn.crushed_netherrack": "Crushed Netherrack", + "block.exnihiloreborn.dark_oak_barrel": "Dark_oak Barrel", + "block.exnihiloreborn.dark_oak_crucible": "Dark Oak Crucible", + "block.exnihiloreborn.dust": "Dust", + "block.exnihiloreborn.jungle_barrel": "Jungle Barrel", + "block.exnihiloreborn.jungle_crucible": "Jungle Crucible", + "block.exnihiloreborn.oak_barrel": "Oak Barrel", + "block.exnihiloreborn.oak_crucible": "Oak Crucible", + "block.exnihiloreborn.porcelain_crucible": "Porcelain Crucible", + "block.exnihiloreborn.spruce_barrel": "Spruce Barrel", + "block.exnihiloreborn.spruce_crucible": "Spruce Crucible", + "block.exnihiloreborn.stone_barrel": "Stone Barrel", + "block.exnihiloreborn.unfired_crucible": "Unfired Crucible", + "block.exnihiloreborn.warped_barrel": "Warped Barrel", + "block.exnihiloreborn.warped_crucible": "Warped Crucible", + "item.exnihiloreborn.bone_crook": "Bone Crook", + "item.exnihiloreborn.compressed_crook": "Compressed Crook", + "item.exnihiloreborn.compressed_diamond_hammer": "Compressed Diamond Hammer", + "item.exnihiloreborn.compressed_golden_hammer": "Compressed Golden Hammer", + "item.exnihiloreborn.compressed_iron_hammer": "Compressed Iron Hammer", + "item.exnihiloreborn.compressed_netherite_hammer": "Compressed Netherite Hammer", + "item.exnihiloreborn.compressed_stone_hammer": "Compressed Stone Hammer", + "item.exnihiloreborn.compressed_wooden_hammer": "Compressed Wooden Hammer", + "item.exnihiloreborn.cooked_silk_worm": "Cooked Silk Worm", + "item.exnihiloreborn.copper_ore_pieces": "Copper Ore Pieces", + "item.exnihiloreborn.crook": "Crook", + "item.exnihiloreborn.deepslate_pebble": "Deepslate Pebble", + "item.exnihiloreborn.diamond_hammer": "Diamond Hammer", + "item.exnihiloreborn.gold_ore_pieces": "Gold Ore Pieces", + "item.exnihiloreborn.golden_hammer": "Golden Hammer", + "item.exnihiloreborn.iron_hammer": "Iron Hammer", + "item.exnihiloreborn.iron_ore_pieces": "Iron Ore Pieces", + "item.exnihiloreborn.netherite_hammer": "Netherite Hammer", + "item.exnihiloreborn.silk_worm": "Silk Worm", + "item.exnihiloreborn.stone_hammer": "Stone Hammer", + "item.exnihiloreborn.stone_pebble": "Stone Pebble", + "item.exnihiloreborn.wooden_hammer": "Wooden Hammer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/acacia_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_barrel.json new file mode 100644 index 00000000..aea863ad --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/acacia_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_crucible.json new file mode 100644 index 00000000..d74a71e6 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log", + "bottom": "minecraft:block/acacia_log", + "side": "minecraft:block/acacia_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/acacia_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_sieve.json new file mode 100644 index 00000000..4bb72708 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/acacia_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/birch_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/birch_barrel.json new file mode 100644 index 00000000..d12040c4 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/birch_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/birch_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/birch_crucible.json new file mode 100644 index 00000000..015f30ad --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/birch_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log", + "bottom": "minecraft:block/birch_log", + "side": "minecraft:block/birch_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/birch_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/birch_sieve.json new file mode 100644 index 00000000..a1ceb5ca --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/birch_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/crimson_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_barrel.json new file mode 100644 index 00000000..824de7d4 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/crimson_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_crucible.json new file mode 100644 index 00000000..d42d797a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem", + "bottom": "minecraft:block/crimson_stem", + "side": "minecraft:block/crimson_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/crimson_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_sieve.json new file mode 100644 index 00000000..abd56729 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/crimson_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/crushed_end_stone.json b/src/generated/resources/assets/exnihiloreborn/models/block/crushed_end_stone.json new file mode 100644 index 00000000..ef47e847 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/crushed_end_stone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "exnihiloreborn:block/crushed_end_stone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/crushed_netherrack.json b/src/generated/resources/assets/exnihiloreborn/models/block/crushed_netherrack.json new file mode 100644 index 00000000..c5d5fcd0 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/crushed_netherrack.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "exnihiloreborn:block/crushed_netherrack" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_barrel.json new file mode 100644 index 00000000..722728b0 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_crucible.json new file mode 100644 index 00000000..662e5f26 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log", + "bottom": "minecraft:block/dark_oak_log", + "side": "minecraft:block/dark_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_sieve.json new file mode 100644 index 00000000..38ff57b1 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/dark_oak_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/dust.json b/src/generated/resources/assets/exnihiloreborn/models/block/dust.json new file mode 100644 index 00000000..29a1e35a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "exnihiloreborn:block/dust" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/jungle_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_barrel.json new file mode 100644 index 00000000..ebc9e9a3 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/jungle_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_crucible.json new file mode 100644 index 00000000..95214e20 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log", + "bottom": "minecraft:block/jungle_log", + "side": "minecraft:block/jungle_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/jungle_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_sieve.json new file mode 100644 index 00000000..25dafaea --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/jungle_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/oak_barrel.json new file mode 100644 index 00000000..5f76c07d --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/oak_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/oak_crucible.json new file mode 100644 index 00000000..d54e99a2 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/oak_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log", + "bottom": "minecraft:block/oak_log", + "side": "minecraft:block/oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/oak_sieve.json new file mode 100644 index 00000000..4b3a4859 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/oak_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/porcelain_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/porcelain_crucible.json new file mode 100644 index 00000000..8f392eac --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/porcelain_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "exnihiloreborn:block/porcelain_crucible", + "top": "exnihiloreborn:block/porcelain_crucible", + "bottom": "exnihiloreborn:block/porcelain_crucible", + "side": "exnihiloreborn:block/porcelain_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/spruce_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_barrel.json new file mode 100644 index 00000000..1d6fefff --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/spruce_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_crucible.json new file mode 100644 index 00000000..00d24cab --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log", + "bottom": "minecraft:block/spruce_log", + "side": "minecraft:block/spruce_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/spruce_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_sieve.json new file mode 100644 index 00000000..208ee8e8 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/spruce_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/stone_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/stone_barrel.json new file mode 100644 index 00000000..ed6d7a99 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/stone_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/unfired_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/unfired_crucible.json new file mode 100644 index 00000000..c24fa9d8 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/unfired_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "exnihiloreborn:block/unfired_crucible", + "top": "exnihiloreborn:block/unfired_crucible", + "bottom": "exnihiloreborn:block/unfired_crucible", + "side": "exnihiloreborn:block/unfired_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/warped_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/block/warped_barrel.json new file mode 100644 index 00000000..a5ec089e --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/warped_barrel.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_barrel", + "textures": { + "barrel": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/warped_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/block/warped_crucible.json new file mode 100644 index 00000000..a3c79708 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/warped_crucible.json @@ -0,0 +1,9 @@ +{ + "parent": "exnihiloreborn:block/template_crucible", + "textures": { + "inside": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem", + "bottom": "minecraft:block/warped_stem", + "side": "minecraft:block/warped_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/block/warped_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/block/warped_sieve.json new file mode 100644 index 00000000..d448dbf1 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/block/warped_sieve.json @@ -0,0 +1,6 @@ +{ + "parent": "exnihiloreborn:block/template_sieve", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/acacia_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_barrel.json new file mode 100644 index 00000000..33ba8089 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/acacia_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/acacia_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_crucible.json new file mode 100644 index 00000000..083eda5e --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/acacia_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/acacia_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_sieve.json new file mode 100644 index 00000000..92ff89c0 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/acacia_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/acacia_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/birch_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/birch_barrel.json new file mode 100644 index 00000000..117623dc --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/birch_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/birch_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/birch_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/birch_crucible.json new file mode 100644 index 00000000..5614b198 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/birch_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/birch_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/birch_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/birch_sieve.json new file mode 100644 index 00000000..6798de10 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/birch_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/birch_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/bone_crook.json b/src/generated/resources/assets/exnihiloreborn/models/item/bone_crook.json new file mode 100644 index 00000000..32dae7d1 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/bone_crook.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/bone_crook" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/cooked_silk_worm.json b/src/generated/resources/assets/exnihiloreborn/models/item/cooked_silk_worm.json new file mode 100644 index 00000000..cfc52eac --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/cooked_silk_worm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/cooked_silk_worm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crimson_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_barrel.json new file mode 100644 index 00000000..1c37ab2f --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/crimson_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crimson_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_crucible.json new file mode 100644 index 00000000..adecdd24 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/crimson_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crimson_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_sieve.json new file mode 100644 index 00000000..b441fe1f --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crimson_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/crimson_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crook.json b/src/generated/resources/assets/exnihiloreborn/models/item/crook.json new file mode 100644 index 00000000..4fe64879 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crook.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/crook" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crushed_end_stone.json b/src/generated/resources/assets/exnihiloreborn/models/item/crushed_end_stone.json new file mode 100644 index 00000000..8ee6765d --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crushed_end_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/crushed_end_stone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/crushed_netherrack.json b/src/generated/resources/assets/exnihiloreborn/models/item/crushed_netherrack.json new file mode 100644 index 00000000..6da0c2d9 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/crushed_netherrack.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/crushed_netherrack" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_barrel.json new file mode 100644 index 00000000..714b4d05 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/dark_oak_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_crucible.json new file mode 100644 index 00000000..2ae6683b --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/dark_oak_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_sieve.json new file mode 100644 index 00000000..afc0585f --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/dark_oak_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/dark_oak_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/diamond_hammer.json b/src/generated/resources/assets/exnihiloreborn/models/item/diamond_hammer.json new file mode 100644 index 00000000..23201085 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/diamond_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/diamond_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/dust.json b/src/generated/resources/assets/exnihiloreborn/models/item/dust.json new file mode 100644 index 00000000..125d085a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/dust.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/dust" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/golden_hammer.json b/src/generated/resources/assets/exnihiloreborn/models/item/golden_hammer.json new file mode 100644 index 00000000..bb658a12 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/golden_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/golden_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/iron_hammer.json b/src/generated/resources/assets/exnihiloreborn/models/item/iron_hammer.json new file mode 100644 index 00000000..65473382 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/iron_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/iron_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/jungle_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_barrel.json new file mode 100644 index 00000000..f4bf6d97 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/jungle_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/jungle_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_crucible.json new file mode 100644 index 00000000..22329243 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/jungle_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/jungle_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_sieve.json new file mode 100644 index 00000000..49bcf324 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/jungle_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/jungle_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/oak_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/oak_barrel.json new file mode 100644 index 00000000..75dc951b --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/oak_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/oak_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/oak_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/oak_crucible.json new file mode 100644 index 00000000..087cd236 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/oak_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/oak_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/oak_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/oak_sieve.json new file mode 100644 index 00000000..1e775876 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/oak_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/oak_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/porcelain_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/porcelain_crucible.json new file mode 100644 index 00000000..b53015a9 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/porcelain_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/porcelain_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/silk_worm.json b/src/generated/resources/assets/exnihiloreborn/models/item/silk_worm.json new file mode 100644 index 00000000..379f7600 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/silk_worm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/silk_worm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/spruce_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_barrel.json new file mode 100644 index 00000000..b28a554f --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/spruce_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/spruce_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_crucible.json new file mode 100644 index 00000000..06d0d87f --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/spruce_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/spruce_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_sieve.json new file mode 100644 index 00000000..623a99e2 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/spruce_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/spruce_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/stone_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/stone_barrel.json new file mode 100644 index 00000000..72594547 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/stone_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/stone_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/stone_hammer.json b/src/generated/resources/assets/exnihiloreborn/models/item/stone_hammer.json new file mode 100644 index 00000000..0cf0b549 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/stone_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/stone_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/unfired_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/unfired_crucible.json new file mode 100644 index 00000000..5550105d --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/unfired_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/unfired_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/warped_barrel.json b/src/generated/resources/assets/exnihiloreborn/models/item/warped_barrel.json new file mode 100644 index 00000000..16eb10b3 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/warped_barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/warped_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/warped_crucible.json b/src/generated/resources/assets/exnihiloreborn/models/item/warped_crucible.json new file mode 100644 index 00000000..f07cee02 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/warped_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/warped_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/warped_sieve.json b/src/generated/resources/assets/exnihiloreborn/models/item/warped_sieve.json new file mode 100644 index 00000000..c8fb844b --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/warped_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "exnihiloreborn:block/warped_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/wooden_hammer.json b/src/generated/resources/assets/exnihiloreborn/models/item/wooden_hammer.json new file mode 100644 index 00000000..8c8b1d18 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/wooden_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "exnihiloreborn:item/wooden_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_barrel.json new file mode 100644 index 00000000..f22584f3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:acacia_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:acacia_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_crucible.json new file mode 100644 index 00000000..c1f86d0b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/acacia_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:acacia_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:acacia_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_barrel.json new file mode 100644 index 00000000..4592c89b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:birch_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:birch_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_crucible.json new file mode 100644 index 00000000..69ae1d7d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/birch_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:birch_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:birch_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/bone_crook.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/bone_crook.json new file mode 100644 index 00000000..7d4de8d5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/bone_crook.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:bone_crook" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:rods/wooden" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:bone_crook" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/compressed_crook.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/compressed_crook.json new file mode 100644 index 00000000..9b7f79a8 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/compressed_crook.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:compressed_crook" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:rods/wooden" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:compressed_crook" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/cooked_silk_worm.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/cooked_silk_worm.json new file mode 100644 index 00000000..2b244864 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/cooked_silk_worm.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:cooked_silk_worm" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "exnihiloreborn:silk_worm" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:cooked_silk_worm" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_barrel.json new file mode 100644 index 00000000..6f68a44a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:crimson_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:crimson_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_crucible.json new file mode 100644 index 00000000..ff70e658 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crimson_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:crimson_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:crimson_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crook.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crook.json new file mode 100644 index 00000000..fb086191 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/crook.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:crook" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:rods/wooden" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:crook" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_barrel.json new file mode 100644 index 00000000..f142529d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:dark_oak_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:dark_oak_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_crucible.json new file mode 100644 index 00000000..0e53fd84 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/dark_oak_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:dark_oak_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:dark_oak_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/diamond_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/diamond_hammer.json new file mode 100644 index 00000000..4d4db0be --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/diamond_hammer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:diamond_hammer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:diamond_hammer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/golden_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/golden_hammer.json new file mode 100644 index 00000000..e89b363f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/golden_hammer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:golden_hammer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:golden_hammer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/iron_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/iron_hammer.json new file mode 100644 index 00000000..57c302c2 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/iron_hammer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:iron_hammer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:iron_hammer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_barrel.json new file mode 100644 index 00000000..0396a525 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:jungle_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:jungle_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_crucible.json new file mode 100644 index 00000000..335d43e7 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/jungle_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:jungle_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:jungle_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_barrel.json new file mode 100644 index 00000000..4af69e81 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:oak_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:oak_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_crucible.json new file mode 100644 index 00000000..88ae9d78 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/oak_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:oak_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:oak_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/porcelain_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/porcelain_crucible.json new file mode 100644 index 00000000..e957f7ff --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/porcelain_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:porcelain_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "exnihiloreborn:unfired_crucible" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:porcelain_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_barrel.json new file mode 100644 index 00000000..5af548e9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:spruce_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:spruce_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_crucible.json new file mode 100644 index 00000000..30cf4a2f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/spruce_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:spruce_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:spruce_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_barrel.json new file mode 100644 index 00000000..05db968e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:stone_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:stone_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_hammer.json new file mode 100644 index 00000000..df5f4f5b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/stone_hammer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:stone_hammer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:stone_hammer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/unfired_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/unfired_crucible.json new file mode 100644 index 00000000..de5c95bd --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/unfired_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:unfired_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:unfired_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_barrel.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_barrel.json new file mode 100644 index 00000000..7ec52a3f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_barrel.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:warped_barrel" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:warped_barrel" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_crucible.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_crucible.json new file mode 100644 index 00000000..b5102f51 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/warped_crucible.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:warped_crucible" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:warped_crucible" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/wooden_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/wooden_hammer.json new file mode 100644 index 00000000..4479285b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/exnihiloreborn/wooden_hammer.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "exnihiloreborn:wooden_hammer" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "exnihiloreborn:wooden_hammer" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json new file mode 100644 index 00000000..dca4ecc3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:acacia_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_barrel.json new file mode 100644 index 00000000..fa0b437c --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:birch_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json new file mode 100644 index 00000000..7d0f98c4 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:compressed_cobblestone" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json new file mode 100644 index 00000000..f3d4f51a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:compressed_dirt" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json new file mode 100644 index 00000000..25144402 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:compressed_dust" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json new file mode 100644 index 00000000..c9003664 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:compressed_sand" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json new file mode 100644 index 00000000..e2ade3b6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:crimson_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json new file mode 100644 index 00000000..a3485390 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:dark_oak_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dust.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dust.json new file mode 100644 index 00000000..5acb19f6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dust.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:dust" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/infested_leaves.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/infested_leaves.json new file mode 100644 index 00000000..971c50da --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/infested_leaves.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "exnihiloreborn:infested_string" + } + ], + "name": "minecraft:string" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json new file mode 100644 index 00000000..dfd9ef19 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:jungle_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_barrel.json new file mode 100644 index 00000000..72f41e62 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:oak_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json new file mode 100644 index 00000000..1add1852 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:spruce_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/stone_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/stone_barrel.json new file mode 100644 index 00000000..aefd5ac0 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/stone_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:stone_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_barrel.json new file mode 100644 index 00000000..c88c7d6a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:warped_barrel" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/acacia_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/acacia_barrel.json new file mode 100644 index 00000000..b64212d9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/acacia_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:acacia_planks" + }, + "z": { + "item": "minecraft:acacia_slab" + } + }, + "result": { + "item": "exnihiloreborn:acacia_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/acacia_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/acacia_crucible.json new file mode 100644 index 00000000..ee9f9c3f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/acacia_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:acacia_logs" + }, + "z": { + "item": "minecraft:acacia_slab" + } + }, + "result": { + "item": "exnihiloreborn:acacia_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/apple.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/apple.json new file mode 100644 index 00000000..1f87f4c3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/apple.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:apple" + }, + "volume": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/bread.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/bread.json new file mode 100644 index 00000000..e84a8606 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/bread.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:bread" + }, + "volume": 125 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/cookie.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/cookie.json new file mode 100644 index 00000000..3bf94145 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/cookie.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:cookie" + }, + "volume": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/kelp.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/kelp.json new file mode 100644 index 00000000..7cae207a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/kelp.json @@ -0,0 +1,12 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": [ + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:kelp" + } + ], + "volume": 40 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/leaves.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/leaves.json new file mode 100644 index 00000000..e4f0d013 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/leaves.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "minecraft:leaves" + }, + "volume": 125 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon.json new file mode 100644 index 00000000..a2a09780 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:melon" + }, + "volume": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon_slice.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon_slice.json new file mode 100644 index 00000000..0ab07cdf --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/melon_slice.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:melon_slice" + }, + "volume": 40 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/mushrooms.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/mushrooms.json new file mode 100644 index 00000000..92773aef --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/mushrooms.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "forge:mushrooms" + }, + "volume": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/nether_wart.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/nether_wart.json new file mode 100644 index 00000000..7341fc75 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/nether_wart.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:nether_wart" + }, + "volume": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin.json new file mode 100644 index 00000000..2fd7775b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:pumpkin" + }, + "volume": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin_pie.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin_pie.json new file mode 100644 index 00000000..52966b45 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/pumpkin_pie.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:pumpkin_pie" + }, + "volume": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/saplings.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/saplings.json new file mode 100644 index 00000000..38230c44 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/saplings.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "minecraft:saplings" + }, + "volume": 125 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seagrass.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seagrass.json new file mode 100644 index 00000000..6fead6c0 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seagrass.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:seagrass" + }, + "volume": 80 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seeds.json new file mode 100644 index 00000000..e157565e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/seeds.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "forge:seeds" + }, + "volume": 80 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/silk_worms.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/silk_worms.json new file mode 100644 index 00000000..913186d4 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/silk_worms.json @@ -0,0 +1,12 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": [ + { + "item": "exnihiloreborn:silk_worm" + }, + { + "item": "exnihiloreborn:cooked_silk_worm" + } + ], + "volume": 40 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/small_flowers.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/small_flowers.json new file mode 100644 index 00000000..3af1a1e3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/small_flowers.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "minecraft:small_flowers" + }, + "volume": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/spider_eye.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/spider_eye.json new file mode 100644 index 00000000..abdd7515 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/spider_eye.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:spider_eye" + }, + "volume": 80 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/sweet_berries.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/sweet_berries.json new file mode 100644 index 00000000..31146da9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/sweet_berries.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "item": "minecraft:sweet_berries" + }, + "volume": 80 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/tall_flowers.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/tall_flowers.json new file mode 100644 index 00000000..9c722715 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/tall_flowers.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "minecraft:tall_flowers" + }, + "volume": 150 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/wheat.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/wheat.json new file mode 100644 index 00000000..d201d0f1 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_compost/wheat.json @@ -0,0 +1,7 @@ +{ + "type": "exnihiloreborn:barrel_compost", + "ingredient": { + "tag": "forge:crops/wheat" + }, + "volume": 80 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/birch_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/birch_barrel.json new file mode 100644 index 00000000..723895ef --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/birch_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:birch_planks" + }, + "z": { + "item": "minecraft:birch_slab" + } + }, + "result": { + "item": "exnihiloreborn:birch_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/birch_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/birch_crucible.json new file mode 100644 index 00000000..c2882f37 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/birch_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:birch_logs" + }, + "z": { + "item": "minecraft:birch_slab" + } + }, + "result": { + "item": "exnihiloreborn:birch_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/bone_crook.json b/src/generated/resources/data/exnihiloreborn/recipes/bone_crook.json new file mode 100644 index 00000000..edbaad12 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/bone_crook.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "xx", + " x", + " x" + ], + "key": { + "x": { + "item": "minecraft:bone" + } + }, + "result": { + "item": "exnihiloreborn:bone_crook" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/compressed_crook.json b/src/generated/resources/data/exnihiloreborn/recipes/compressed_crook.json new file mode 100644 index 00000000..64ab09cc --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/compressed_crook.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "xx", + " x", + " x" + ], + "key": { + "x": { + "item": "exnihiloreborn:crook" + } + }, + "result": { + "item": "exnihiloreborn:compressed_crook" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/cooked_silk_worm.json b/src/generated/resources/data/exnihiloreborn/recipes/cooked_silk_worm.json new file mode 100644 index 00000000..15e6bf41 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/cooked_silk_worm.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "exnihiloreborn:silk_worm" + }, + "result": "exnihiloreborn:cooked_silk_worm", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/crimson_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/crimson_barrel.json new file mode 100644 index 00000000..6074c09d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/crimson_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:crimson_planks" + }, + "z": { + "item": "minecraft:crimson_slab" + } + }, + "result": { + "item": "exnihiloreborn:crimson_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/crimson_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/crimson_crucible.json new file mode 100644 index 00000000..e859b23b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/crimson_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:crimson_stems" + }, + "z": { + "item": "minecraft:crimson_slab" + } + }, + "result": { + "item": "exnihiloreborn:crimson_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/crook.json b/src/generated/resources/data/exnihiloreborn/recipes/crook.json new file mode 100644 index 00000000..270a7391 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/crook.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "xx", + " x", + " x" + ], + "key": { + "x": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:crook" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_barrel.json new file mode 100644 index 00000000..32113432 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:dark_oak_planks" + }, + "z": { + "item": "minecraft:dark_oak_slab" + } + }, + "result": { + "item": "exnihiloreborn:dark_oak_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_crucible.json new file mode 100644 index 00000000..82cd014d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/dark_oak_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:dark_oak_logs" + }, + "z": { + "item": "minecraft:dark_oak_slab" + } + }, + "result": { + "item": "exnihiloreborn:dark_oak_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/diamond_hammer.json b/src/generated/resources/data/exnihiloreborn/recipes/diamond_hammer.json new file mode 100644 index 00000000..ee88ee84 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/diamond_hammer.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " x ", + "xv ", + " v" + ], + "key": { + "x": { + "tag": "forge:gems/diamond" + }, + "v": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:diamond_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/golden_hammer.json b/src/generated/resources/data/exnihiloreborn/recipes/golden_hammer.json new file mode 100644 index 00000000..135b6d16 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/golden_hammer.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " x ", + "xv ", + " v" + ], + "key": { + "x": { + "tag": "forge:ingots/gold" + }, + "v": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:golden_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json new file mode 100644 index 00000000..3bfc3c3a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json @@ -0,0 +1,26 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": [ + { + "item": "minecraft:red_sandstone" + }, + { + "item": "minecraft:cut_red_sandstone" + }, + { + "item": "minecraft:chiseled_red_sandstone" + }, + { + "item": "minecraft:smooth_red_sandstone" + } + ], + "rewards": [ + { + "item": { + "id": "minecraft:red_sand", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json new file mode 100644 index 00000000..fa2a85ac --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json @@ -0,0 +1,26 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": [ + { + "item": "minecraft:sandstone" + }, + { + "item": "minecraft:cut_sandstone" + }, + { + "item": "minecraft:chiseled_sandstone" + }, + { + "item": "minecraft:smooth_sandstone" + } + ], + "rewards": [ + { + "item": { + "id": "minecraft:sand", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json new file mode 100644 index 00000000..4b7ef5b8 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json @@ -0,0 +1,15 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "rewards": [ + { + "item": { + "id": "minecraft:cracked_stone_bricks", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json new file mode 100644 index 00000000..1b5ea5ff --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json @@ -0,0 +1,15 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": { + "item": "minecraft:sand" + }, + "rewards": [ + { + "item": { + "id": "exnihiloreborn:dust", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json new file mode 100644 index 00000000..8e7a8c5d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json @@ -0,0 +1,15 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "rewards": [ + { + "item": { + "id": "minecraft:gravel", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json new file mode 100644 index 00000000..8260032c --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json @@ -0,0 +1,15 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": { + "item": "minecraft:gravel" + }, + "rewards": [ + { + "item": { + "id": "minecraft:sand", + "Count": 1 + }, + "chance": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json new file mode 100644 index 00000000..3fa61e93 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json @@ -0,0 +1,55 @@ +{ + "type": "exnihiloreborn:hammer", + "ingredient": [ + { + "item": "minecraft:stone" + }, + { + "item": "minecraft:cracked_stone_bricks" + } + ], + "rewards": [ + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 1.0 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.75 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.75 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.5 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.25 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.05 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/iron_hammer.json b/src/generated/resources/data/exnihiloreborn/recipes/iron_hammer.json new file mode 100644 index 00000000..4cec5979 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/iron_hammer.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " x ", + "xv ", + " v" + ], + "key": { + "x": { + "tag": "forge:ingots/iron" + }, + "v": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:iron_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/jungle_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/jungle_barrel.json new file mode 100644 index 00000000..a67816f8 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/jungle_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:jungle_planks" + }, + "z": { + "item": "minecraft:jungle_slab" + } + }, + "result": { + "item": "exnihiloreborn:jungle_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/jungle_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/jungle_crucible.json new file mode 100644 index 00000000..0f05e0f5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/jungle_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:jungle_logs" + }, + "z": { + "item": "minecraft:jungle_slab" + } + }, + "result": { + "item": "exnihiloreborn:jungle_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/cobblestone.json b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/cobblestone.json new file mode 100644 index 00000000..fb33c6f5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/cobblestone.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:lava_crucible", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "fluid": { + "FluidName": "minecraft:lava", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/gravel.json b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/gravel.json new file mode 100644 index 00000000..e73dbdfd --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/gravel.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:lava_crucible", + "ingredient": { + "item": "minecraft:gravel" + }, + "fluid": { + "FluidName": "minecraft:lava", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/netherrack.json b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/netherrack.json new file mode 100644 index 00000000..6eda43d1 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/netherrack.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:lava_crucible", + "ingredient": { + "item": "minecraft:netherrack" + }, + "fluid": { + "FluidName": "minecraft:lava", + "Amount": 1000 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/stone.json b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/stone.json new file mode 100644 index 00000000..2ee01186 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/lava_crucible/stone.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:lava_crucible", + "ingredient": { + "item": "minecraft:stone" + }, + "fluid": { + "FluidName": "minecraft:lava", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/oak_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/oak_barrel.json new file mode 100644 index 00000000..41633bcf --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/oak_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:oak_planks" + }, + "z": { + "item": "minecraft:oak_slab" + } + }, + "result": { + "item": "exnihiloreborn:oak_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/oak_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/oak_crucible.json new file mode 100644 index 00000000..ec0b249a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/oak_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:oak_logs" + }, + "z": { + "item": "minecraft:oak_slab" + } + }, + "result": { + "item": "exnihiloreborn:oak_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/porcelain_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/porcelain_crucible.json new file mode 100644 index 00000000..9bc8b870 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/porcelain_crucible.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "exnihiloreborn:unfired_crucible" + }, + "result": "exnihiloreborn:porcelain_crucible", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json new file mode 100644 index 00000000..e084350e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json @@ -0,0 +1,16 @@ +{ + "type": "exnihiloreborn:sieve", + "mesh": "exnihiloreborn:string_mesh", + "ingredient": { + "item": "minecraft:dirt" + }, + "rewards": [ + { + "item": { + "id": "minecraft:beetroot_seeds", + "Count": 1 + }, + "chance": 0.35 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json new file mode 100644 index 00000000..98cd99c8 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json @@ -0,0 +1,16 @@ +{ + "type": "exnihiloreborn:sieve", + "mesh": "exnihiloreborn:string_mesh", + "ingredient": { + "item": "minecraft:dirt" + }, + "rewards": [ + { + "item": { + "id": "minecraft:melon_seeds", + "Count": 1 + }, + "chance": 0.35 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json new file mode 100644 index 00000000..39c16300 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json @@ -0,0 +1,16 @@ +{ + "type": "exnihiloreborn:sieve", + "mesh": "exnihiloreborn:string_mesh", + "ingredient": { + "item": "minecraft:dirt" + }, + "rewards": [ + { + "item": { + "id": "minecraft:pumpkin_seeds", + "Count": 1 + }, + "chance": 0.35 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json new file mode 100644 index 00000000..030e901f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json @@ -0,0 +1,58 @@ +{ + "type": "exnihiloreborn:sieve", + "mesh": "exnihiloreborn:string_mesh", + "ingredient": { + "item": "minecraft:dirt" + }, + "rewards": [ + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 1.0 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 1.0 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 1.0 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.5 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.5 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.1 + }, + { + "item": { + "id": "exnihiloreborn:stone_pebble", + "Count": 1 + }, + "chance": 0.1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json new file mode 100644 index 00000000..ddfafeb4 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json @@ -0,0 +1,16 @@ +{ + "type": "exnihiloreborn:sieve", + "mesh": "exnihiloreborn:string_mesh", + "ingredient": { + "item": "minecraft:dirt" + }, + "rewards": [ + { + "item": { + "id": "minecraft:wheat_seeds", + "Count": 1 + }, + "chance": 0.7 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/spruce_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/spruce_barrel.json new file mode 100644 index 00000000..4f5800f6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/spruce_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:spruce_planks" + }, + "z": { + "item": "minecraft:spruce_slab" + } + }, + "result": { + "item": "exnihiloreborn:spruce_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/spruce_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/spruce_crucible.json new file mode 100644 index 00000000..99f01e21 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/spruce_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:spruce_logs" + }, + "z": { + "item": "minecraft:spruce_slab" + } + }, + "result": { + "item": "exnihiloreborn:spruce_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/stone_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/stone_barrel.json new file mode 100644 index 00000000..0677fbc4 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/stone_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:stone" + }, + "z": { + "item": "minecraft:stone_slab" + } + }, + "result": { + "item": "exnihiloreborn:stone_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/stone_hammer.json b/src/generated/resources/data/exnihiloreborn/recipes/stone_hammer.json new file mode 100644 index 00000000..b5012d4e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/stone_hammer.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " x ", + "xv ", + " v" + ], + "key": { + "x": { + "tag": "minecraft:stone_crafting_materials" + }, + "v": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:stone_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/unfired_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/unfired_crucible.json new file mode 100644 index 00000000..8f4b427d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/unfired_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "exnihiloreborn:porcelain_clay" + }, + "z": { + "item": "exnihiloreborn:porcelain_clay" + } + }, + "result": { + "item": "exnihiloreborn:unfired_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/warped_barrel.json b/src/generated/resources/data/exnihiloreborn/recipes/warped_barrel.json new file mode 100644 index 00000000..d0acebb2 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/warped_barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "item": "minecraft:warped_planks" + }, + "z": { + "item": "minecraft:warped_slab" + } + }, + "result": { + "item": "exnihiloreborn:warped_barrel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/warped_crucible.json b/src/generated/resources/data/exnihiloreborn/recipes/warped_crucible.json new file mode 100644 index 00000000..56ba440e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/warped_crucible.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "x x", + "x x", + "xzx" + ], + "key": { + "x": { + "tag": "minecraft:warped_stems" + }, + "z": { + "item": "minecraft:warped_slab" + } + }, + "result": { + "item": "exnihiloreborn:warped_crucible" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/apple.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/apple.json new file mode 100644 index 00000000..3d6bacae --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/apple.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:apple" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/cactus.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/cactus.json new file mode 100644 index 00000000..285dec90 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/cactus.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:cactus" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/leaves.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/leaves.json new file mode 100644 index 00000000..c24f9c05 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/leaves.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "tag": "minecraft:leaves" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon.json new file mode 100644 index 00000000..47b28c20 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:melon" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon_slice.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon_slice.json new file mode 100644 index 00000000..9972e0dd --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/melon_slice.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:melon_slice" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 50 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/pumpkin.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/pumpkin.json new file mode 100644 index 00000000..44cf2d2c --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/pumpkin.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:pumpkin" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 250 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/saplings.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/saplings.json new file mode 100644 index 00000000..cdfc90ee --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/saplings.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "tag": "minecraft:saplings" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/small_flowers.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/small_flowers.json new file mode 100644 index 00000000..231aeeae --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/small_flowers.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "tag": "minecraft:small_flowers" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/sweet_berries.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/sweet_berries.json new file mode 100644 index 00000000..c45a7f11 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/sweet_berries.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "item": "minecraft:sweet_berries" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 50 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/tall_flowers.json b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/tall_flowers.json new file mode 100644 index 00000000..fb829258 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/water_crucible/tall_flowers.json @@ -0,0 +1,10 @@ +{ + "type": "exnihiloreborn:water_crucible", + "ingredient": { + "tag": "minecraft:tall_flowers" + }, + "fluid": { + "FluidName": "minecraft:water", + "Amount": 200 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/wooden_hammer.json b/src/generated/resources/data/exnihiloreborn/recipes/wooden_hammer.json new file mode 100644 index 00000000..a31faef6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/wooden_hammer.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " x ", + "xv ", + " v" + ], + "key": { + "x": { + "tag": "minecraft:planks" + }, + "v": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "exnihiloreborn:wooden_hammer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/items/compressed_hammers.json b/src/generated/resources/data/exnihiloreborn/tags/items/compressed_hammers.json new file mode 100644 index 00000000..6b106795 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/tags/items/compressed_hammers.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "exnihiloreborn:compressed_wooden_hammer", + "exnihiloreborn:compressed_stone_hammer", + "exnihiloreborn:compressed_golden_hammer", + "exnihiloreborn:compressed_iron_hammer", + "exnihiloreborn:compressed_diamond_hammer", + "exnihiloreborn:compressed_netherite_hammer" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/items/crooks.json b/src/generated/resources/data/exnihiloreborn/tags/items/crooks.json new file mode 100644 index 00000000..205d1e71 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/tags/items/crooks.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "exnihiloreborn:crook", + "exnihiloreborn:compressed_crook", + "exnihiloreborn:bone_crook" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/items/hammers.json b/src/generated/resources/data/exnihiloreborn/tags/items/hammers.json new file mode 100644 index 00000000..5e8ed510 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/tags/items/hammers.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "exnihiloreborn:wooden_hammer", + "exnihiloreborn:stone_hammer", + "exnihiloreborn:golden_hammer", + "exnihiloreborn:iron_hammer", + "exnihiloreborn:diamond_hammer", + "exnihiloreborn:netherite_hammer" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/exnihiloreborn/cooked_silk_worm_from_smoking.json b/src/generated/resources/data/minecraft/advancements/recipes/exnihiloreborn/cooked_silk_worm_from_smoking.json new file mode 100644 index 00000000..5db42701 --- /dev/null +++ b/src/generated/resources/data/minecraft/advancements/recipes/exnihiloreborn/cooked_silk_worm_from_smoking.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "minecraft:cooked_silk_worm_from_smoking" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "exnihiloreborn:silk_worm" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "minecraft:cooked_silk_worm_from_smoking" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/recipes/cooked_silk_worm_from_smoking.json b/src/generated/resources/data/minecraft/recipes/cooked_silk_worm_from_smoking.json new file mode 100644 index 00000000..638386bc --- /dev/null +++ b/src/generated/resources/data/minecraft/recipes/cooked_silk_worm_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "exnihiloreborn:silk_worm" + }, + "result": "exnihiloreborn:cooked_silk_worm", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/acacia_logs.json b/src/generated/resources/data/minecraft/tags/blocks/acacia_logs.json new file mode 100644 index 00000000..2aa36aea --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/acacia_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:acacia_log", + "minecraft:acacia_wood", + "minecraft:stripped_acacia_log", + "minecraft:stripped_acacia_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/anvil.json b/src/generated/resources/data/minecraft/tags/blocks/anvil.json new file mode 100644 index 00000000..d69773e1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/anvil.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:anvil", + "minecraft:chipped_anvil", + "minecraft:damaged_anvil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/bamboo_plantable_on.json b/src/generated/resources/data/minecraft/tags/blocks/bamboo_plantable_on.json new file mode 100644 index 00000000..53fe3036 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/bamboo_plantable_on.json @@ -0,0 +1,14 @@ +{ + "replace": false, + "values": [ + "#minecraft:sand", + "minecraft:bamboo", + "minecraft:bamboo_sapling", + "minecraft:gravel", + "minecraft:dirt", + "minecraft:grass_block", + "minecraft:podzol", + "minecraft:coarse_dirt", + "minecraft:mycelium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/banners.json b/src/generated/resources/data/minecraft/tags/blocks/banners.json new file mode 100644 index 00000000..df4ebc27 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/banners.json @@ -0,0 +1,37 @@ +{ + "replace": false, + "values": [ + "minecraft:white_banner", + "minecraft:orange_banner", + "minecraft:magenta_banner", + "minecraft:light_blue_banner", + "minecraft:yellow_banner", + "minecraft:lime_banner", + "minecraft:pink_banner", + "minecraft:gray_banner", + "minecraft:light_gray_banner", + "minecraft:cyan_banner", + "minecraft:purple_banner", + "minecraft:blue_banner", + "minecraft:brown_banner", + "minecraft:green_banner", + "minecraft:red_banner", + "minecraft:black_banner", + "minecraft:white_wall_banner", + "minecraft:orange_wall_banner", + "minecraft:magenta_wall_banner", + "minecraft:light_blue_wall_banner", + "minecraft:yellow_wall_banner", + "minecraft:lime_wall_banner", + "minecraft:pink_wall_banner", + "minecraft:gray_wall_banner", + "minecraft:light_gray_wall_banner", + "minecraft:cyan_wall_banner", + "minecraft:purple_wall_banner", + "minecraft:blue_wall_banner", + "minecraft:brown_wall_banner", + "minecraft:green_wall_banner", + "minecraft:red_wall_banner", + "minecraft:black_wall_banner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/base_stone_nether.json b/src/generated/resources/data/minecraft/tags/blocks/base_stone_nether.json new file mode 100644 index 00000000..1bbeddb6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/base_stone_nether.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:netherrack", + "minecraft:basalt", + "minecraft:blackstone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/base_stone_overworld.json b/src/generated/resources/data/minecraft/tags/blocks/base_stone_overworld.json new file mode 100644 index 00000000..955eb346 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/base_stone_overworld.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:stone", + "minecraft:granite", + "minecraft:diorite", + "minecraft:andesite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json new file mode 100644 index 00000000..a368aa50 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:netherite_block", + "minecraft:emerald_block", + "minecraft:diamond_block", + "minecraft:gold_block", + "minecraft:iron_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/beds.json b/src/generated/resources/data/minecraft/tags/blocks/beds.json new file mode 100644 index 00000000..2e031f30 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/beds.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "minecraft:red_bed", + "minecraft:black_bed", + "minecraft:blue_bed", + "minecraft:brown_bed", + "minecraft:cyan_bed", + "minecraft:gray_bed", + "minecraft:green_bed", + "minecraft:light_blue_bed", + "minecraft:light_gray_bed", + "minecraft:lime_bed", + "minecraft:magenta_bed", + "minecraft:orange_bed", + "minecraft:pink_bed", + "minecraft:purple_bed", + "minecraft:white_bed", + "minecraft:yellow_bed" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/bee_growables.json b/src/generated/resources/data/minecraft/tags/blocks/bee_growables.json new file mode 100644 index 00000000..9299ae2f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/bee_growables.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:crops", + "minecraft:sweet_berry_bush" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/beehives.json b/src/generated/resources/data/minecraft/tags/blocks/beehives.json new file mode 100644 index 00000000..3101ab6e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/beehives.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:bee_nest", + "minecraft:beehive" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/birch_logs.json b/src/generated/resources/data/minecraft/tags/blocks/birch_logs.json new file mode 100644 index 00000000..7be61059 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/birch_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:birch_log", + "minecraft:birch_wood", + "minecraft:stripped_birch_log", + "minecraft:stripped_birch_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/buttons.json b/src/generated/resources/data/minecraft/tags/blocks/buttons.json new file mode 100644 index 00000000..37433a79 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/buttons.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_buttons", + "minecraft:stone_button", + "minecraft:polished_blackstone_button" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/campfires.json b/src/generated/resources/data/minecraft/tags/blocks/campfires.json new file mode 100644 index 00000000..f57ad3d8 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/campfires.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:campfire", + "minecraft:soul_campfire" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/carpets.json b/src/generated/resources/data/minecraft/tags/blocks/carpets.json new file mode 100644 index 00000000..9b28b1fd --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/carpets.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "minecraft:white_carpet", + "minecraft:orange_carpet", + "minecraft:magenta_carpet", + "minecraft:light_blue_carpet", + "minecraft:yellow_carpet", + "minecraft:lime_carpet", + "minecraft:pink_carpet", + "minecraft:gray_carpet", + "minecraft:light_gray_carpet", + "minecraft:cyan_carpet", + "minecraft:purple_carpet", + "minecraft:blue_carpet", + "minecraft:brown_carpet", + "minecraft:green_carpet", + "minecraft:red_carpet", + "minecraft:black_carpet" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/climbable.json b/src/generated/resources/data/minecraft/tags/blocks/climbable.json new file mode 100644 index 00000000..76f8d613 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/climbable.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "minecraft:ladder", + "minecraft:vine", + "minecraft:scaffolding", + "minecraft:weeping_vines", + "minecraft:weeping_vines_plant", + "minecraft:twisting_vines", + "minecraft:twisting_vines_plant" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/coral_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/coral_blocks.json new file mode 100644 index 00000000..e2e55241 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/coral_blocks.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral_block", + "minecraft:brain_coral_block", + "minecraft:bubble_coral_block", + "minecraft:fire_coral_block", + "minecraft:horn_coral_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/coral_plants.json b/src/generated/resources/data/minecraft/tags/blocks/coral_plants.json new file mode 100644 index 00000000..0aa32f52 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/coral_plants.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral", + "minecraft:brain_coral", + "minecraft:bubble_coral", + "minecraft:fire_coral", + "minecraft:horn_coral" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/corals.json b/src/generated/resources/data/minecraft/tags/blocks/corals.json new file mode 100644 index 00000000..649b6ebc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/corals.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:coral_plants", + "minecraft:tube_coral_fan", + "minecraft:brain_coral_fan", + "minecraft:bubble_coral_fan", + "minecraft:fire_coral_fan", + "minecraft:horn_coral_fan" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/crimson_stems.json b/src/generated/resources/data/minecraft/tags/blocks/crimson_stems.json new file mode 100644 index 00000000..333772e8 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/crimson_stems.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:crimson_stem", + "minecraft:stripped_crimson_stem", + "minecraft:crimson_hyphae", + "minecraft:stripped_crimson_hyphae" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/crops.json b/src/generated/resources/data/minecraft/tags/blocks/crops.json new file mode 100644 index 00000000..cf219608 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/crops.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "minecraft:beetroots", + "minecraft:carrots", + "minecraft:potatoes", + "minecraft:wheat", + "minecraft:melon_stem", + "minecraft:pumpkin_stem" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/dark_oak_logs.json b/src/generated/resources/data/minecraft/tags/blocks/dark_oak_logs.json new file mode 100644 index 00000000..e1e3e165 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/dark_oak_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:dark_oak_log", + "minecraft:dark_oak_wood", + "minecraft:stripped_dark_oak_log", + "minecraft:stripped_dark_oak_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/doors.json b/src/generated/resources/data/minecraft/tags/blocks/doors.json new file mode 100644 index 00000000..0f9fe980 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/doors.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_doors", + "minecraft:iron_door" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json b/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json new file mode 100644 index 00000000..7f97f8ca --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "minecraft:barrier", + "minecraft:bedrock", + "minecraft:end_portal", + "minecraft:end_portal_frame", + "minecraft:end_gateway", + "minecraft:command_block", + "minecraft:repeating_command_block", + "minecraft:chain_command_block", + "minecraft:structure_block", + "minecraft:jigsaw", + "minecraft:moving_piston", + "minecraft:obsidian", + "minecraft:crying_obsidian", + "minecraft:end_stone", + "minecraft:iron_bars", + "minecraft:respawn_anchor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/enderman_holdable.json b/src/generated/resources/data/minecraft/tags/blocks/enderman_holdable.json new file mode 100644 index 00000000..20bad1b1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/enderman_holdable.json @@ -0,0 +1,28 @@ +{ + "replace": false, + "values": [ + "#minecraft:small_flowers", + "minecraft:grass_block", + "minecraft:dirt", + "minecraft:coarse_dirt", + "minecraft:podzol", + "minecraft:sand", + "minecraft:red_sand", + "minecraft:gravel", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:tnt", + "minecraft:cactus", + "minecraft:clay", + "minecraft:pumpkin", + "minecraft:carved_pumpkin", + "minecraft:melon", + "minecraft:mycelium", + "minecraft:crimson_fungus", + "minecraft:crimson_nylium", + "minecraft:crimson_roots", + "minecraft:warped_fungus", + "minecraft:warped_nylium", + "minecraft:warped_roots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json b/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json new file mode 100644 index 00000000..f94523b9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:acacia_fence_gate", + "minecraft:birch_fence_gate", + "minecraft:dark_oak_fence_gate", + "minecraft:jungle_fence_gate", + "minecraft:oak_fence_gate", + "minecraft:spruce_fence_gate", + "minecraft:crimson_fence_gate", + "minecraft:warped_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/fences.json b/src/generated/resources/data/minecraft/tags/blocks/fences.json new file mode 100644 index 00000000..0ef08473 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/fences.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_fences", + "minecraft:nether_brick_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/fire.json b/src/generated/resources/data/minecraft/tags/blocks/fire.json new file mode 100644 index 00000000..2ca0f384 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/fire.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:fire", + "minecraft:soul_fire" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json b/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json new file mode 100644 index 00000000..b105b95e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json @@ -0,0 +1,35 @@ +{ + "replace": false, + "values": [ + "minecraft:flower_pot", + "minecraft:potted_poppy", + "minecraft:potted_blue_orchid", + "minecraft:potted_allium", + "minecraft:potted_azure_bluet", + "minecraft:potted_red_tulip", + "minecraft:potted_orange_tulip", + "minecraft:potted_white_tulip", + "minecraft:potted_pink_tulip", + "minecraft:potted_oxeye_daisy", + "minecraft:potted_dandelion", + "minecraft:potted_oak_sapling", + "minecraft:potted_spruce_sapling", + "minecraft:potted_birch_sapling", + "minecraft:potted_jungle_sapling", + "minecraft:potted_acacia_sapling", + "minecraft:potted_dark_oak_sapling", + "minecraft:potted_red_mushroom", + "minecraft:potted_brown_mushroom", + "minecraft:potted_dead_bush", + "minecraft:potted_fern", + "minecraft:potted_cactus", + "minecraft:potted_cornflower", + "minecraft:potted_lily_of_the_valley", + "minecraft:potted_wither_rose", + "minecraft:potted_bamboo", + "minecraft:potted_crimson_fungus", + "minecraft:potted_warped_fungus", + "minecraft:potted_crimson_roots", + "minecraft:potted_warped_roots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/flowers.json b/src/generated/resources/data/minecraft/tags/blocks/flowers.json new file mode 100644 index 00000000..9d1ba3a1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/flowers.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:small_flowers", + "#minecraft:tall_flowers" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/gold_ores.json b/src/generated/resources/data/minecraft/tags/blocks/gold_ores.json new file mode 100644 index 00000000..ee9b150a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/gold_ores.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:gold_ore", + "minecraft:nether_gold_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/guarded_by_piglins.json b/src/generated/resources/data/minecraft/tags/blocks/guarded_by_piglins.json new file mode 100644 index 00000000..e1d6ebb5 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/guarded_by_piglins.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:gold_block", + "minecraft:barrel", + "minecraft:chest", + "minecraft:ender_chest", + "minecraft:gilded_blackstone", + "minecraft:trapped_chest", + "#minecraft:shulker_boxes", + "#minecraft:gold_ores" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/hoglin_repellents.json b/src/generated/resources/data/minecraft/tags/blocks/hoglin_repellents.json new file mode 100644 index 00000000..2da3b912 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/hoglin_repellents.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:warped_fungus", + "minecraft:potted_warped_fungus", + "minecraft:nether_portal", + "minecraft:respawn_anchor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/ice.json b/src/generated/resources/data/minecraft/tags/blocks/ice.json new file mode 100644 index 00000000..c5f45013 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/ice.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:ice", + "minecraft:packed_ice", + "minecraft:blue_ice", + "minecraft:frosted_ice" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json new file mode 100644 index 00000000..9a23d087 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json @@ -0,0 +1,22 @@ +{ + "replace": false, + "values": [ + "minecraft:glass", + "minecraft:white_stained_glass", + "minecraft:orange_stained_glass", + "minecraft:magenta_stained_glass", + "minecraft:light_blue_stained_glass", + "minecraft:yellow_stained_glass", + "minecraft:lime_stained_glass", + "minecraft:pink_stained_glass", + "minecraft:gray_stained_glass", + "minecraft:light_gray_stained_glass", + "minecraft:cyan_stained_glass", + "minecraft:purple_stained_glass", + "minecraft:blue_stained_glass", + "minecraft:brown_stained_glass", + "minecraft:green_stained_glass", + "minecraft:red_stained_glass", + "minecraft:black_stained_glass" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/infiniburn_end.json b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_end.json new file mode 100644 index 00000000..9d8f1185 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_end.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:infiniburn_overworld", + "minecraft:bedrock" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/infiniburn_nether.json b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_nether.json new file mode 100644 index 00000000..8ba042ec --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_nether.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:infiniburn_overworld" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/infiniburn_overworld.json b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_overworld.json new file mode 100644 index 00000000..432cf25d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/infiniburn_overworld.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:netherrack", + "minecraft:magma_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/jungle_logs.json b/src/generated/resources/data/minecraft/tags/blocks/jungle_logs.json new file mode 100644 index 00000000..ec51d638 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/jungle_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:jungle_log", + "minecraft:jungle_wood", + "minecraft:stripped_jungle_log", + "minecraft:stripped_jungle_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/leaves.json b/src/generated/resources/data/minecraft/tags/blocks/leaves.json new file mode 100644 index 00000000..036ec387 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/leaves.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "minecraft:jungle_leaves", + "minecraft:oak_leaves", + "minecraft:spruce_leaves", + "minecraft:dark_oak_leaves", + "minecraft:acacia_leaves", + "minecraft:birch_leaves" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs.json b/src/generated/resources/data/minecraft/tags/blocks/logs.json new file mode 100644 index 00000000..a3d931c1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/logs.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "#minecraft:logs_that_burn", + "#minecraft:crimson_stems", + "#minecraft:warped_stems" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json new file mode 100644 index 00000000..e5a8d0fc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:dark_oak_logs", + "#minecraft:oak_logs", + "#minecraft:acacia_logs", + "#minecraft:birch_logs", + "#minecraft:jungle_logs", + "#minecraft:spruce_logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json b/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json new file mode 100644 index 00000000..cf95ca25 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:mycelium", + "minecraft:podzol", + "minecraft:crimson_nylium", + "minecraft:warped_nylium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json b/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json new file mode 100644 index 00000000..71270023 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json @@ -0,0 +1,35 @@ +{ + "replace": false, + "values": [ + "minecraft:warped_stem", + "minecraft:stripped_warped_stem", + "minecraft:warped_hyphae", + "minecraft:stripped_warped_hyphae", + "minecraft:crimson_stem", + "minecraft:stripped_crimson_stem", + "minecraft:crimson_hyphae", + "minecraft:stripped_crimson_hyphae", + "minecraft:crimson_planks", + "minecraft:warped_planks", + "minecraft:crimson_slab", + "minecraft:warped_slab", + "minecraft:crimson_pressure_plate", + "minecraft:warped_pressure_plate", + "minecraft:crimson_fence", + "minecraft:warped_fence", + "minecraft:crimson_trapdoor", + "minecraft:warped_trapdoor", + "minecraft:crimson_fence_gate", + "minecraft:warped_fence_gate", + "minecraft:crimson_stairs", + "minecraft:warped_stairs", + "minecraft:crimson_button", + "minecraft:warped_button", + "minecraft:crimson_door", + "minecraft:warped_door", + "minecraft:crimson_sign", + "minecraft:warped_sign", + "minecraft:crimson_wall_sign", + "minecraft:warped_wall_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/nylium.json b/src/generated/resources/data/minecraft/tags/blocks/nylium.json new file mode 100644 index 00000000..7ce3a5a2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/nylium.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:crimson_nylium", + "minecraft:warped_nylium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/oak_logs.json b/src/generated/resources/data/minecraft/tags/blocks/oak_logs.json new file mode 100644 index 00000000..927086f6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/oak_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_log", + "minecraft:oak_wood", + "minecraft:stripped_oak_log", + "minecraft:stripped_oak_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/piglin_repellents.json b/src/generated/resources/data/minecraft/tags/blocks/piglin_repellents.json new file mode 100644 index 00000000..407bd501 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/piglin_repellents.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:soul_fire", + "minecraft:soul_torch", + "minecraft:soul_lantern", + "minecraft:soul_wall_torch", + "minecraft:soul_campfire" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/planks.json b/src/generated/resources/data/minecraft/tags/blocks/planks.json new file mode 100644 index 00000000..34ef51ff --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/planks.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_planks", + "minecraft:spruce_planks", + "minecraft:birch_planks", + "minecraft:jungle_planks", + "minecraft:acacia_planks", + "minecraft:dark_oak_planks", + "minecraft:crimson_planks", + "minecraft:warped_planks" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/portals.json b/src/generated/resources/data/minecraft/tags/blocks/portals.json new file mode 100644 index 00000000..e9f000ba --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/portals.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:nether_portal", + "minecraft:end_portal", + "minecraft:end_gateway" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json b/src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json new file mode 100644 index 00000000..b73310c7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/pressure_plates.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:light_weighted_pressure_plate", + "minecraft:heavy_weighted_pressure_plate", + "#minecraft:wooden_pressure_plates", + "#minecraft:stone_pressure_plates" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/prevent_mob_spawning_inside.json b/src/generated/resources/data/minecraft/tags/blocks/prevent_mob_spawning_inside.json new file mode 100644 index 00000000..0f6530e7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/prevent_mob_spawning_inside.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:rails" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/rails.json b/src/generated/resources/data/minecraft/tags/blocks/rails.json new file mode 100644 index 00000000..036ac7fc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/rails.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:rail", + "minecraft:powered_rail", + "minecraft:detector_rail", + "minecraft:activator_rail" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/sand.json b/src/generated/resources/data/minecraft/tags/blocks/sand.json new file mode 100644 index 00000000..fa7a9c4a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/sand.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:sand", + "minecraft:red_sand" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/saplings.json b/src/generated/resources/data/minecraft/tags/blocks/saplings.json new file mode 100644 index 00000000..04fe81f9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/saplings.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_sapling", + "minecraft:spruce_sapling", + "minecraft:birch_sapling", + "minecraft:jungle_sapling", + "minecraft:acacia_sapling", + "minecraft:dark_oak_sapling" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/shulker_boxes.json b/src/generated/resources/data/minecraft/tags/blocks/shulker_boxes.json new file mode 100644 index 00000000..7bcd4108 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/shulker_boxes.json @@ -0,0 +1,22 @@ +{ + "replace": false, + "values": [ + "minecraft:shulker_box", + "minecraft:black_shulker_box", + "minecraft:blue_shulker_box", + "minecraft:brown_shulker_box", + "minecraft:cyan_shulker_box", + "minecraft:gray_shulker_box", + "minecraft:green_shulker_box", + "minecraft:light_blue_shulker_box", + "minecraft:light_gray_shulker_box", + "minecraft:lime_shulker_box", + "minecraft:magenta_shulker_box", + "minecraft:orange_shulker_box", + "minecraft:pink_shulker_box", + "minecraft:purple_shulker_box", + "minecraft:red_shulker_box", + "minecraft:white_shulker_box", + "minecraft:yellow_shulker_box" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/signs.json b/src/generated/resources/data/minecraft/tags/blocks/signs.json new file mode 100644 index 00000000..7677a609 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/signs.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:standing_signs", + "#minecraft:wall_signs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/slabs.json b/src/generated/resources/data/minecraft/tags/blocks/slabs.json new file mode 100644 index 00000000..3dca479c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/slabs.json @@ -0,0 +1,38 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_slabs", + "minecraft:stone_slab", + "minecraft:smooth_stone_slab", + "minecraft:stone_brick_slab", + "minecraft:sandstone_slab", + "minecraft:purpur_slab", + "minecraft:quartz_slab", + "minecraft:red_sandstone_slab", + "minecraft:brick_slab", + "minecraft:cobblestone_slab", + "minecraft:nether_brick_slab", + "minecraft:petrified_oak_slab", + "minecraft:prismarine_slab", + "minecraft:prismarine_brick_slab", + "minecraft:dark_prismarine_slab", + "minecraft:polished_granite_slab", + "minecraft:smooth_red_sandstone_slab", + "minecraft:mossy_stone_brick_slab", + "minecraft:polished_diorite_slab", + "minecraft:mossy_cobblestone_slab", + "minecraft:end_stone_brick_slab", + "minecraft:smooth_sandstone_slab", + "minecraft:smooth_quartz_slab", + "minecraft:granite_slab", + "minecraft:andesite_slab", + "minecraft:red_nether_brick_slab", + "minecraft:polished_andesite_slab", + "minecraft:diorite_slab", + "minecraft:cut_sandstone_slab", + "minecraft:cut_red_sandstone_slab", + "minecraft:blackstone_slab", + "minecraft:polished_blackstone_brick_slab", + "minecraft:polished_blackstone_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/small_flowers.json b/src/generated/resources/data/minecraft/tags/blocks/small_flowers.json new file mode 100644 index 00000000..395128a6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/small_flowers.json @@ -0,0 +1,18 @@ +{ + "replace": false, + "values": [ + "minecraft:dandelion", + "minecraft:poppy", + "minecraft:blue_orchid", + "minecraft:allium", + "minecraft:azure_bluet", + "minecraft:red_tulip", + "minecraft:orange_tulip", + "minecraft:white_tulip", + "minecraft:pink_tulip", + "minecraft:oxeye_daisy", + "minecraft:cornflower", + "minecraft:lily_of_the_valley", + "minecraft:wither_rose" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/soul_fire_base_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/soul_fire_base_blocks.json new file mode 100644 index 00000000..18c9c11a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/soul_fire_base_blocks.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:soul_sand", + "minecraft:soul_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/soul_speed_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/soul_speed_blocks.json new file mode 100644 index 00000000..18c9c11a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/soul_speed_blocks.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:soul_sand", + "minecraft:soul_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/spruce_logs.json b/src/generated/resources/data/minecraft/tags/blocks/spruce_logs.json new file mode 100644 index 00000000..87b5caf6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/spruce_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:spruce_log", + "minecraft:spruce_wood", + "minecraft:stripped_spruce_log", + "minecraft:stripped_spruce_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/stairs.json b/src/generated/resources/data/minecraft/tags/blocks/stairs.json new file mode 100644 index 00000000..1c435365 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/stairs.json @@ -0,0 +1,34 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_stairs", + "minecraft:cobblestone_stairs", + "minecraft:sandstone_stairs", + "minecraft:nether_brick_stairs", + "minecraft:stone_brick_stairs", + "minecraft:brick_stairs", + "minecraft:purpur_stairs", + "minecraft:quartz_stairs", + "minecraft:red_sandstone_stairs", + "minecraft:prismarine_brick_stairs", + "minecraft:prismarine_stairs", + "minecraft:dark_prismarine_stairs", + "minecraft:polished_granite_stairs", + "minecraft:smooth_red_sandstone_stairs", + "minecraft:mossy_stone_brick_stairs", + "minecraft:polished_diorite_stairs", + "minecraft:mossy_cobblestone_stairs", + "minecraft:end_stone_brick_stairs", + "minecraft:stone_stairs", + "minecraft:smooth_sandstone_stairs", + "minecraft:smooth_quartz_stairs", + "minecraft:granite_stairs", + "minecraft:andesite_stairs", + "minecraft:red_nether_brick_stairs", + "minecraft:polished_andesite_stairs", + "minecraft:diorite_stairs", + "minecraft:blackstone_stairs", + "minecraft:polished_blackstone_brick_stairs", + "minecraft:polished_blackstone_stairs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json b/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json new file mode 100644 index 00000000..6b6500e5 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_sign", + "minecraft:spruce_sign", + "minecraft:birch_sign", + "minecraft:acacia_sign", + "minecraft:jungle_sign", + "minecraft:dark_oak_sign", + "minecraft:crimson_sign", + "minecraft:warped_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/stone_bricks.json b/src/generated/resources/data/minecraft/tags/blocks/stone_bricks.json new file mode 100644 index 00000000..7cec36c5 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/stone_bricks.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:stone_bricks", + "minecraft:mossy_stone_bricks", + "minecraft:cracked_stone_bricks", + "minecraft:chiseled_stone_bricks" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/stone_pressure_plates.json b/src/generated/resources/data/minecraft/tags/blocks/stone_pressure_plates.json new file mode 100644 index 00000000..c4e413b1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/stone_pressure_plates.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:stone_pressure_plate", + "minecraft:polished_blackstone_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json new file mode 100644 index 00000000..b009780b --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:lava" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/tall_flowers.json b/src/generated/resources/data/minecraft/tags/blocks/tall_flowers.json new file mode 100644 index 00000000..681427ff --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/tall_flowers.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:sunflower", + "minecraft:lilac", + "minecraft:peony", + "minecraft:rose_bush" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json b/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json new file mode 100644 index 00000000..d9625857 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/trapdoors.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:wooden_trapdoors", + "minecraft:iron_trapdoor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/underwater_bonemeals.json b/src/generated/resources/data/minecraft/tags/blocks/underwater_bonemeals.json new file mode 100644 index 00000000..c1245146 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/underwater_bonemeals.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:seagrass", + "#minecraft:corals", + "#minecraft:wall_corals" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/unstable_bottom_center.json b/src/generated/resources/data/minecraft/tags/blocks/unstable_bottom_center.json new file mode 100644 index 00000000..6766bc43 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/unstable_bottom_center.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:fence_gates" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/valid_spawn.json b/src/generated/resources/data/minecraft/tags/blocks/valid_spawn.json new file mode 100644 index 00000000..bcbc42e1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/valid_spawn.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:grass_block", + "minecraft:podzol" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wall_corals.json b/src/generated/resources/data/minecraft/tags/blocks/wall_corals.json new file mode 100644 index 00000000..db2c3304 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wall_corals.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:tube_coral_wall_fan", + "minecraft:brain_coral_wall_fan", + "minecraft:bubble_coral_wall_fan", + "minecraft:fire_coral_wall_fan", + "minecraft:horn_coral_wall_fan" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wall_post_override.json b/src/generated/resources/data/minecraft/tags/blocks/wall_post_override.json new file mode 100644 index 00000000..2fbdd646 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wall_post_override.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "minecraft:torch", + "minecraft:soul_torch", + "minecraft:redstone_torch", + "minecraft:tripwire", + "#minecraft:signs", + "#minecraft:banners", + "#minecraft:pressure_plates" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json b/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json new file mode 100644 index 00000000..ca5cb43f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_wall_sign", + "minecraft:spruce_wall_sign", + "minecraft:birch_wall_sign", + "minecraft:acacia_wall_sign", + "minecraft:jungle_wall_sign", + "minecraft:dark_oak_wall_sign", + "minecraft:crimson_wall_sign", + "minecraft:warped_wall_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/walls.json b/src/generated/resources/data/minecraft/tags/blocks/walls.json new file mode 100644 index 00000000..2f0ae281 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/walls.json @@ -0,0 +1,22 @@ +{ + "replace": false, + "values": [ + "minecraft:cobblestone_wall", + "minecraft:mossy_cobblestone_wall", + "minecraft:brick_wall", + "minecraft:prismarine_wall", + "minecraft:red_sandstone_wall", + "minecraft:mossy_stone_brick_wall", + "minecraft:granite_wall", + "minecraft:stone_brick_wall", + "minecraft:nether_brick_wall", + "minecraft:andesite_wall", + "minecraft:red_nether_brick_wall", + "minecraft:sandstone_wall", + "minecraft:end_stone_brick_wall", + "minecraft:diorite_wall", + "minecraft:blackstone_wall", + "minecraft:polished_blackstone_brick_wall", + "minecraft:polished_blackstone_wall" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/warped_stems.json b/src/generated/resources/data/minecraft/tags/blocks/warped_stems.json new file mode 100644 index 00000000..4174cdbf --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/warped_stems.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:warped_stem", + "minecraft:stripped_warped_stem", + "minecraft:warped_hyphae", + "minecraft:stripped_warped_hyphae" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wart_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/wart_blocks.json new file mode 100644 index 00000000..97a811d6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wart_blocks.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:nether_wart_block", + "minecraft:warped_wart_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json b/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json new file mode 100644 index 00000000..995c6486 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json @@ -0,0 +1,16 @@ +{ + "replace": false, + "values": [ + "minecraft:barrier", + "minecraft:bedrock", + "minecraft:end_portal", + "minecraft:end_portal_frame", + "minecraft:end_gateway", + "minecraft:command_block", + "minecraft:repeating_command_block", + "minecraft:chain_command_block", + "minecraft:structure_block", + "minecraft:jigsaw", + "minecraft:moving_piston" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wither_summon_base_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/wither_summon_base_blocks.json new file mode 100644 index 00000000..18c9c11a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wither_summon_base_blocks.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:soul_sand", + "minecraft:soul_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json new file mode 100644 index 00000000..27515915 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_button", + "minecraft:spruce_button", + "minecraft:birch_button", + "minecraft:jungle_button", + "minecraft:acacia_button", + "minecraft:dark_oak_button", + "minecraft:crimson_button", + "minecraft:warped_button" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json new file mode 100644 index 00000000..161af841 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_door", + "minecraft:spruce_door", + "minecraft:birch_door", + "minecraft:jungle_door", + "minecraft:acacia_door", + "minecraft:dark_oak_door", + "minecraft:crimson_door", + "minecraft:warped_door" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json new file mode 100644 index 00000000..e853ce55 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_fence", + "minecraft:acacia_fence", + "minecraft:dark_oak_fence", + "minecraft:spruce_fence", + "minecraft:birch_fence", + "minecraft:jungle_fence", + "minecraft:crimson_fence", + "minecraft:warped_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json new file mode 100644 index 00000000..c80cf5c8 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_pressure_plate", + "minecraft:spruce_pressure_plate", + "minecraft:birch_pressure_plate", + "minecraft:jungle_pressure_plate", + "minecraft:acacia_pressure_plate", + "minecraft:dark_oak_pressure_plate", + "minecraft:crimson_pressure_plate", + "minecraft:warped_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json new file mode 100644 index 00000000..b3d1b0b5 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_slab", + "minecraft:spruce_slab", + "minecraft:birch_slab", + "minecraft:jungle_slab", + "minecraft:acacia_slab", + "minecraft:dark_oak_slab", + "minecraft:crimson_slab", + "minecraft:warped_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json new file mode 100644 index 00000000..ff30545e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:oak_stairs", + "minecraft:spruce_stairs", + "minecraft:birch_stairs", + "minecraft:jungle_stairs", + "minecraft:acacia_stairs", + "minecraft:dark_oak_stairs", + "minecraft:crimson_stairs", + "minecraft:warped_stairs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json new file mode 100644 index 00000000..7368d84c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "minecraft:acacia_trapdoor", + "minecraft:birch_trapdoor", + "minecraft:dark_oak_trapdoor", + "minecraft:jungle_trapdoor", + "minecraft:oak_trapdoor", + "minecraft:spruce_trapdoor", + "minecraft:crimson_trapdoor", + "minecraft:warped_trapdoor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wool.json b/src/generated/resources/data/minecraft/tags/blocks/wool.json new file mode 100644 index 00000000..c39732fc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wool.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "minecraft:white_wool", + "minecraft:orange_wool", + "minecraft:magenta_wool", + "minecraft:light_blue_wool", + "minecraft:yellow_wool", + "minecraft:lime_wool", + "minecraft:pink_wool", + "minecraft:gray_wool", + "minecraft:light_gray_wool", + "minecraft:cyan_wool", + "minecraft:purple_wool", + "minecraft:blue_wool", + "minecraft:brown_wool", + "minecraft:green_wool", + "minecraft:red_wool", + "minecraft:black_wool" + ] +} \ No newline at end of file diff --git a/src/main/java/thedarkcolour/exnihiloreborn/ExNihiloReborn.java b/src/main/java/thedarkcolour/exnihiloreborn/ExNihiloReborn.java new file mode 100644 index 00000000..81bfaeb6 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/ExNihiloReborn.java @@ -0,0 +1,67 @@ +package thedarkcolour.exnihiloreborn; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.AddReloadListenerEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.InterModComms; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import thedarkcolour.exnihiloreborn.blockentity.LavaCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.WaterCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.client.ClientHandler; +import thedarkcolour.exnihiloreborn.compat.top.TopCompatExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EFluids; +import thedarkcolour.exnihiloreborn.registry.EItems; +import thedarkcolour.exnihiloreborn.registry.ELootFunctions; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +import java.util.concurrent.CompletableFuture; + +@Mod(ExNihiloReborn.ID) +public class ExNihiloReborn { + public static final String ID = "exnihiloreborn"; + + public ExNihiloReborn() { + final IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + final IEventBus fmlBus = MinecraftForge.EVENT_BUS; + + // Mod init + ELootFunctions.init(); + ERecipeTypes.init(); + modBus.addListener(this::interModEnqueue); + + // Client init + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> ClientHandler::register); + + // Registry Classes + EBlockEntities.BLOCK_ENTITIES.register(modBus); + EBlocks.BLOCKS.register(modBus); + EFluids.FLUIDS.register(modBus); + EItems.ITEMS.register(modBus); + ERecipeSerializers.RECIPE_SERIALIZERS.register(modBus); + + // Game Events + fmlBus.addListener(this::serverStart); + } + + // Send messages to other mods + public void interModEnqueue(InterModEnqueueEvent event) { + InterModComms.sendTo("theoneprobe", "getTheOneProbe", TopCompatExNihiloReborn::new); + } + + public void serverStart(AddReloadListenerEvent event) { + event.addListener((prepBarrier, resourceManager, prepProfiler, reloadProfiler, backgroundExecutor, gameExecutor) -> { + return CompletableFuture.allOf().thenCompose(prepBarrier::wait).thenRunAsync(() -> { + + LavaCrucibleBlockEntity.RECIPES_CACHE.invalidateAll(); + WaterCrucibleBlockEntity.RECIPES_CACHE.invalidateAll(); + }, gameExecutor); + }); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/AbstractCrucibleBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/AbstractCrucibleBlock.java new file mode 100644 index 00000000..8e14b821 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/AbstractCrucibleBlock.java @@ -0,0 +1,33 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import thedarkcolour.exnihiloreborn.blockentity.AbstractCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.EBlockEntity; + +public abstract class AbstractCrucibleBlock extends EBlock { + public AbstractCrucibleBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return UnfiredCrucibleBlock.SHAPE; + } + + @Override + public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { + if (level.getBlockEntity(pos) instanceof AbstractCrucibleBlockEntity crucible) { + return crucible.getTank().getFluid().getFluid().getFluidType().getLightLevel(); + } + return 0; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java new file mode 100644 index 00000000..4656a05c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java @@ -0,0 +1,49 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; + +public class BarrelBlock extends Block implements EntityBlock { + public static final VoxelShape SHAPE = Shapes.join( + box(1, 0, 1, 15, 16, 15), + box(2, 1, 2, 14, 16, 14), + BooleanOp.ONLY_FIRST + ); + + public BarrelBlock(Properties properties) { + super(properties); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BarrelBlockEntity(pos, state); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (level.getBlockEntity(pos) instanceof BarrelBlockEntity barrel) { + return barrel.use(level, pos, player, hand); + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java new file mode 100644 index 00000000..c4fc4c44 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java @@ -0,0 +1,41 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import thedarkcolour.exnihiloreborn.blockentity.EBlockEntity; + +import java.util.function.Supplier; + +public abstract class EBlock extends Block implements EntityBlock { + private final Supplier> blockEntityType; + + public EBlock(Properties properties, Supplier> blockEntityType) { + super(properties); + this.blockEntityType = blockEntityType; + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return blockEntityType.get().create(pos, state); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + var blockEntity = level.getBlockEntity(pos); + + if (blockEntity instanceof EBlockEntity entity) { + return entity.use(level, player, hand); + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java new file mode 100644 index 00000000..f7ad97f1 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java @@ -0,0 +1,55 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; + +public class InfestedLeavesBlock extends LeavesBlock implements EntityBlock { + public static final BooleanProperty FULLY_INFESTED = BooleanProperty.create("fully_infested"); + + public InfestedLeavesBlock(Properties properties) { + super(properties); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FULLY_INFESTED); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new InfestedLeavesBlockEntity(pos, state); + } + + @Override + public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter level, BlockPos pos, Player player) { + if (level.getBlockEntity(pos) instanceof InfestedLeavesBlockEntity leaves) { + return leaves.getMimic().getCloneItemStack(target, level, pos, player); + } + return ItemStack.EMPTY; + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (decaying(state)) { + // doesn't drop unless crook + //dropResources(state, level, pos); + level.removeBlock(pos, false); + } + } +} \ No newline at end of file diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/LavaCrucibleBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/LavaCrucibleBlock.java new file mode 100644 index 00000000..f0b34a26 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/LavaCrucibleBlock.java @@ -0,0 +1,7 @@ +package thedarkcolour.exnihiloreborn.block; + +public class LavaCrucibleBlock extends AbstractCrucibleBlock { + public LavaCrucibleBlock(Properties properties) { + super(properties); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java new file mode 100644 index 00000000..7cf40287 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java @@ -0,0 +1,28 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import thedarkcolour.exnihiloreborn.blockentity.EBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.SieveBlockEntity; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; + +public class SieveBlock extends EBlock { + public SieveBlock(Properties properties) { + super(properties, EBlockEntities.SIEVE); + } + + // todo + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return super.getShape(pState, pLevel, pPos, pContext); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new SieveBlockEntity(pos, state); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/UnfiredCrucibleBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/UnfiredCrucibleBlock.java new file mode 100644 index 00000000..7a112da8 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/UnfiredCrucibleBlock.java @@ -0,0 +1,24 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class UnfiredCrucibleBlock extends Block { + // From CauldronBlock + public static final VoxelShape SHAPE = Shapes.join(Shapes.block(), Shapes.or(box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D), box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D), box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D), box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D)), BooleanOp.ONLY_FIRST); + + public UnfiredCrucibleBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/WaterCrucibleBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/WaterCrucibleBlock.java new file mode 100644 index 00000000..033f77c1 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/WaterCrucibleBlock.java @@ -0,0 +1,18 @@ +package thedarkcolour.exnihiloreborn.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import thedarkcolour.exnihiloreborn.blockentity.WaterCrucibleBlockEntity; + +public class WaterCrucibleBlock extends AbstractCrucibleBlock { + public WaterCrucibleBlock(Properties properties) { + super(properties); + } + + @Override + public @NotNull BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new WaterCrucibleBlockEntity(pos, state); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/package-info.java b/src/main/java/thedarkcolour/exnihiloreborn/block/package-info.java new file mode 100644 index 00000000..f6fba231 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/package-info.java @@ -0,0 +1,3 @@ +@net.minecraft.MethodsReturnNonnullByDefault +@javax.annotation.ParametersAreNonnullByDefault +package thedarkcolour.exnihiloreborn.block; diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java new file mode 100644 index 00000000..62dbecb2 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java @@ -0,0 +1,242 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import com.google.common.cache.Cache; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.function.Consumer; + +public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { + public static final int MAX_SOLIDS = 1_000; + + private final AbstractCrucibleBlockEntity.ItemHandler item = new AbstractCrucibleBlockEntity.ItemHandler(); + private final AbstractCrucibleBlockEntity.FluidHandler tank = new AbstractCrucibleBlockEntity.FluidHandler(); + + private Block lastMelted; + private Fluid fluid; + private short solids; + + public AbstractCrucibleBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + // Capabilities + private final LazyOptional itemHandler = LazyOptional.of(() -> item); + private final LazyOptional fluidHandler = LazyOptional.of(() -> tank); + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.FLUID_HANDLER) { + return fluidHandler.cast(); + } else if (cap == ForgeCapabilities.ITEM_HANDLER) { + return itemHandler.cast(); + } + + + + return super.getCapability(cap, side); + } + + // NBT + @Override + public void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + + nbt.put("Tank", tank.writeToNBT(new CompoundTag())); + nbt.putString("LastMelted", ForgeRegistries.BLOCKS.getKey(lastMelted).toString()); + nbt.putString("Fluid", ForgeRegistries.FLUIDS.getKey(fluid).toString()); + nbt.putShort("Solids", solids); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + + tank.readFromNBT(nbt.getCompound("Tank")); + lastMelted = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(nbt.getString("LastMelted"))); + fluid = ForgeRegistries.FLUIDS.getValue(new ResourceLocation(nbt.getString("Fluid"))); + solids = nbt.getShort("Solids"); + + } + + public InteractionResult use(Level level, Player player, InteractionHand hand) { + var playerItem = player.getItemInHand(hand); + + if (playerItem.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).isPresent()) { + return FluidUtil.interactWithFluidHandler(player, hand, tank) ? InteractionResult.sidedSuccess(level.isClientSide) : InteractionResult.PASS; + } + + if (!level.isClientSide) { + tryMelt(playerItem, stack -> stack.shrink(1)); + } + + return InteractionResult.sidedSuccess(level.isClientSide); + } + + public CrucibleRecipe getRecipe(ItemStack item) { + var pair = new CacheKey(item.getItem(), item.getTag()); + var recipe = getRecipeCache().getIfPresent(pair); + + if (recipe != null) { + return recipe; + } else { + CrucibleRecipe newRecipe = RecipeUtil.getRecipe(level.getServer(), getRecipeType(), item); + + if (newRecipe != null) { + getRecipeCache().put(pair, newRecipe); // You can't put null values in a cache... + } + + return newRecipe; + } + } + + /** + * Tries to melt the specified item into the crucible. + * @param item Item to melt + * @param shrinkAction What to do when item is melted + */ + private void tryMelt(ItemStack item, Consumer shrinkAction) { + CrucibleRecipe recipe = getRecipe(item); + + if (recipe != null) { + FluidStack result = recipe.getResult(); + FluidStack contained = tank.getFluid(); + + if (((result.isFluidEqual(contained) || contained.isEmpty()) && result.getAmount() + solids <= MAX_SOLIDS)) { + shrinkAction.accept(item); + solids += result.getAmount(); + + if (contained.isEmpty()) { + fluid = result.getFluid(); + } + + // Hopefully invoking the state method doesn't screw with mods that depend on the block existing in the world + if (item.getItem() instanceof BlockItem && !(((BlockItem) item.getItem()).getBlock().defaultBlockState().getCollisionShape(level, getBlockPos()).isEmpty())) { + lastMelted = ((BlockItem) item.getItem()).getBlock(); + } else { + // If we already have something else inside just use that instead of switching to default + if (lastMelted == null) { + lastMelted = getDefaultMeltBlock(); + } + } + + markUpdated(); + } + } + } + + public int getMelt() { + return 1; + } + + public int getSolids() { + return solids; + } + + public FluidTank getTank() { + return tank; + } + + protected abstract RecipeType getRecipeType(); + + protected abstract Block getDefaultMeltBlock(); + + protected abstract Cache getRecipeCache(); + + public Block getLastMelted() { + return lastMelted; + } + + public record CacheKey(Item item, CompoundTag tag) {} + + private class FluidHandler extends FluidTank { + public FluidHandler() { + super(4_000); + } + + @Override + public boolean isFluidValid(FluidStack stack) { + return false; + } + } + + private class ItemHandler extends ItemStackHandler { + @Override + protected void onContentsChanged(int slot) { + tryMelt(getItem(), item -> setStackInSlot(0, ItemStack.EMPTY)); + } + + @Override + protected int getStackLimit(int slot, @Nonnull ItemStack stack) { + return 1; + } + + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) { + return getRecipe(stack) != null; + } + + public ItemStack getItem() { + return stacks.get(0); + } + } + + public static class Ticker implements BlockEntityTicker { + @Override + public void tick(Level level, BlockPos pos, BlockState state, AbstractCrucibleBlockEntity crucible) { + // Update twice per tick + if ((level.getGameTime() % 10L) == 0L) { + if (!level.isClientSide) { + int delta = Math.min(crucible.solids, crucible.getMelt()); + + // Skip if no heat + if (delta <= 0) return; + + if (crucible.tank.getSpace() >= delta) { + // Remove solids + crucible.solids -= delta; + + // Add lava + if (crucible.tank.isEmpty()) { + crucible.tank.setFluid(new FluidStack(crucible.fluid, delta)); + } else { + crucible.tank.getFluid().grow(delta); + } + + // Sync to client + crucible.markUpdated(); + } + } + } + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java new file mode 100644 index 00000000..56c7b31c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java @@ -0,0 +1,351 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.EFluids; +import thedarkcolour.exnihiloreborn.registry.EItems; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +// todo test which refresh calls can be removed to avoid network spam +public class BarrelBlockEntity extends EBlockEntity { + private static final float PROGRESS_STEP = 1.0f / 300.0f; + + private final BarrelBlockEntity.ItemHandler item = new BarrelBlockEntity.ItemHandler(); + private final BarrelBlockEntity.FluidHandler tank = new BarrelBlockEntity.FluidHandler(); + public float progress; + public short compost; + + public BarrelBlockEntity(BlockPos pos, BlockState state) { + super(EBlockEntities.BARREL.get(), pos, state); + } + + private final LazyOptional itemHandler = LazyOptional.of(() -> item); + private final LazyOptional fluidHandler = LazyOptional.of(() -> tank); + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.FLUID_HANDLER) { + return fluidHandler.cast(); + } else if (cap == ForgeCapabilities.ITEM_HANDLER) { + return itemHandler.cast(); + } + + return super.getCapability(cap, side); + } + + @Override + public void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + + nbt.put("item", item.serializeNBT()); + nbt.put("tank", tank.writeToNBT(new CompoundTag())); + nbt.putShort("compost", compost); + nbt.putFloat("progress", progress); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + + item.deserializeNBT(nbt.getCompound("item")); + tank.readFromNBT(nbt.getCompound("tank")); + compost = nbt.getShort("compost"); + progress = nbt.getFloat("progress"); + } + + public boolean isBrewing() { + return tank.getFluidAmount() == 1000 && progress != 0.0f && !isBurning(); + } + + public boolean isBurning() { + return hasHotFluid() && progress != 0.0f; + } + + public boolean isComposting() { + return compost == 1000; + } + + public boolean hasContents() { + return compost > 0 || !item.getStackInSlot(0).isEmpty(); + } + + public boolean hasFullWater() { + return tank.getFluidAmount() == 1000 && tank.getFluid().getFluid() == Fluids.WATER; + } + + // Burning temp of wood according to google is 300 C or ~575 kelvin + // Molten Constantan from Thermal Expansion is only 650 kelvin, but this should be fine + public boolean hasHotFluid() { + return tank.getFluid().getFluid().getFluidType().getTemperature() > 575; + } + + @Override + public void tick() { + if (!level.isClientSide) { + // Turn compost to dirt + if (isComposting()) { + progress += PROGRESS_STEP; + markUpdated(); + + if (progress >= 1.0f) { + progress = 0.0f; + compost = 0; + setItem(new ItemStack(Items.DIRT)); + } + } else if (hasFullWater()) { + var pos = getBlockPos(); + var rand = level.random; + var mycelium = 0f; + + for (BlockPos cursor : BlockPos.betweenClosed(pos.getX() - 1, pos.getY() - 1, pos.getZ() - 1, pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + // todo make this not hardcoded + if (level.getBlockState(cursor).getBlock() == Blocks.MYCELIUM) { + mycelium += 0.15f; + + if (rand.nextInt(1500) == 0) { + BlockPos above = cursor.above(); + + if (level.getBlockState(above).isAir()) { + if (rand.nextBoolean()) { + level.setBlockAndUpdate(above, Blocks.RED_MUSHROOM.defaultBlockState()); + } else { + level.setBlockAndUpdate(above, Blocks.BROWN_MUSHROOM.defaultBlockState()); + } + } + } + } + } + + if (progress != (progress += mycelium * PROGRESS_STEP)) { + markUpdated(); + } + + if (progress >= 1.0f) { + // Reset progress + progress = 0.0f; + + tank.setFluid(new FluidStack(EFluids.WITCH_WATER_STILL.get(), tank.getFluidAmount())); + } + + } else if (hasHotFluid()) { + if (getBlockState().ignitedByLava()) { + if ((progress += PROGRESS_STEP) >= 1.0f) { + if (tank.getFluidAmount() == 1000) { + var fluid = tank.getFluid().getFluid(); + level.setBlockAndUpdate(getBlockPos(), fluid.getFluidType().getBlockForFluidState(level, getBlockPos(), fluid.defaultFluidState())); + } else { + level.setBlockAndUpdate(getBlockPos(), Blocks.FIRE.defaultBlockState()); + } + } + markUpdated(); + } + } + } else { + spawnBurningParticles(); + } + } + + private void spawnBurningParticles() { + if (isBurning()) { + BlockPos pos = getBlockPos(); + int burnTicks = (int) (progress * 300); + + if (burnTicks % 30 == 0) { + level.addParticle(ParticleTypes.LARGE_SMOKE, pos.getX() + Math.random(), pos.getY() + 1.2, pos.getZ() + Math.random(), 0.0, 0.0, 0.0); + } else if (burnTicks % 5 == 0) { + level.addParticle(ParticleTypes.SMOKE, pos.getX() + Math.random(), pos.getY() + 1.2, pos.getZ() + Math.random(), 0.0, 0.0, 0.0); + } + } + } + + public ItemStack getItem() { + return item.getStackInSlot(0); + } + + private void setItem(ItemStack item) { + this.item.setStackInSlot(0, item); + } + + public InteractionResult use(Level level, BlockPos pos, Player player, InteractionHand hand) { + var isClientSide = level.isClientSide; + + // Collect an item + if (!getItem().isEmpty()) { + return giveItem(level, pos, isClientSide); + } + + // Handle item fluid interaction + if (!hasContents()) { + var wasBurning = isBurning(); + + if (FluidUtil.interactWithFluidHandler(player, hand, tank)) { + if (wasBurning && !hasHotFluid()) { + progress = 0.0f; + } + + return InteractionResult.sidedSuccess(isClientSide); + } + } + + var playerItem = player.getItemInHand(hand); + + // Handle compost + if (tank.isEmpty()) { + var inventory = new SimpleContainer(playerItem); + + if (compost < 1000) { + if (!level.isClientSide) { + // todo cache items to recipe + level.getServer().getRecipeManager().getRecipeFor(ERecipeTypes.BARREL_COMPOST, inventory, level).ifPresent(recipe -> { + compost = (short) Math.min(1000, compost + recipe.getVolume()); + markUpdated(); + + // Consume item + if (!player.getAbilities().instabuild) { + playerItem.shrink(1); + } + }); + } + + return InteractionResult.sidedSuccess(isClientSide); + } + } + + // Mixing + if (!playerItem.isEmpty()) { + var fluid = tank.getFluid(); + var container = playerItem.getCraftingRemainingItem(); + + if (fluid.getAmount() == 1000) { + // todo custom mixing recipes + if (doMix(playerItem, isClientSide)) { + if (!isClientSide && playerItem.isEmpty()) { + player.setItemInHand(hand, container); + } + return InteractionResult.sidedSuccess(isClientSide); + } + } + } + + return InteractionResult.FAIL; + } + + private InteractionResult giveItem(Level level, BlockPos pos, boolean isClientSide) { + if (!isClientSide) { + // Pop out item + var itemEntity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, item.extract(false)); + var rand = level.random; + itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); + level.addFreshEntity(itemEntity); + + // Empty contents + setItem(ItemStack.EMPTY); + } + + return InteractionResult.sidedSuccess(isClientSide); + } + + /** + * @param fluid Fluid in the barrel + * @param catalyst Item to mix with the fluid + * @param result Item (preferable a block) crafted by this mix + * @param playerItem Player's item to check and consume (test item if simulated) + * @param simulate Whether to simulate the mix + * @return if the mix succeeded (if simulated, whether the mix is possible) + */ + private boolean mix(Fluid fluid, Item catalyst, Item result, ItemStack playerItem, boolean simulate) { + if (tank.getFluid().getFluid() == fluid && playerItem.getItem() == catalyst) { + if (!simulate) { + // Consumer player input + playerItem.shrink(1); + // Empty barrel + tank.setFluid(FluidStack.EMPTY); + // Replace fluid with result + setItem(new ItemStack(result)); + } + + return true; + } + + return false; + } + + private boolean doMix(ItemStack playerItem, boolean simulate) { + return mix(Fluids.WATER, EItems.DUST.get(), Items.CLAY, playerItem, simulate) || + mix(Fluids.WATER, Items.MILK_BUCKET, Items.SLIME_BLOCK, playerItem, simulate) || + mix(EFluids.WITCH_WATER_STILL.get(), Items.SAND, Items.SOUL_SAND, playerItem, simulate) || + mix(Fluids.LAVA, Items.REDSTONE, Items.NETHERRACK, playerItem, simulate) || + mix(Fluids.LAVA, Items.GLOWSTONE_DUST, Items.END_STONE, playerItem, simulate) || + mix(Fluids.LAVA, Items.WATER_BUCKET, Items.OBSIDIAN, playerItem, simulate); + } + + // Inner class + private class ItemHandler extends ItemStackHandler { + @Override + protected int getStackLimit(int slot, @Nonnull ItemStack stack) { + return 1; + } + + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) { + FluidStack fluid = tank.getFluid(); + + if (fluid.getAmount() == 1000) { + return doMix(stack, true); + } + + return false; + } + + public ItemStack extract(boolean simulate) { + return extractItem(0, 1, simulate); + } + + @Override + protected void onContentsChanged(int slot) { + doMix(stacks.get(slot).copy(), level.isClientSide); + markUpdated(); + } + } + + // Inner class + private class FluidHandler extends FluidTank { + public FluidHandler() { + super(1000); + } + + @Override + public boolean isFluidValid(FluidStack stack) { + return !isBrewing() && !hasContents(); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java new file mode 100644 index 00000000..d2a61b3a --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java @@ -0,0 +1,51 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import javax.annotation.Nullable; + +public abstract class EBlockEntity extends BlockEntity { + public EBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public CompoundTag getUpdateTag() { + return saveWithoutMetadata(); + } + + @Nullable + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) { + if (pkt.getTag() == null) { + load(new CompoundTag()); + } else { + load(pkt.getTag()); + } + } + + // todo replace with smaller PropertyUpdate packets so we don't send a bunch of data every tick + protected void markUpdated() { + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 2); + } + + public InteractionResult use(Level level, Player player, InteractionHand hand) { + return InteractionResult.PASS; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java new file mode 100644 index 00000000..43dca544 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java @@ -0,0 +1,116 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.state.BlockState; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.EBlocks; + +public class InfestedLeavesBlockEntity extends EBlockEntity { + public static final float PROGRESS_INTERVAL = 0.005f; + public static final int SPREAD_INTERVAL = 100; + + // A percentage of how much this leaf is infested + private float progress; + // A timer that determines when this block should try to spread + private int spreadTimer; + // The state this block should render as + private BlockState mimic; + + public InfestedLeavesBlockEntity(BlockPos pos, BlockState state) { + super(EBlockEntities.INFESTED_LEAVES.get(), pos, state); + } + + @Override + public void tick() { + // Do progress + if (progress < 1.0f) { + progress = Math.min(1.0f, progress + PROGRESS_INTERVAL); + } + + // If the leave is infested enough, advance the spread timer + if (!level.isClientSide && progress > 0.6f) { + ++spreadTimer; + + // Attempt to spread and reset the timer + if (spreadTimer >= SPREAD_INTERVAL) { + trySpread(); + spreadTimer = level.random.nextInt(10); + } + } + } + + // Attempt to convert a leaf block within 1 block radius around this block + private void trySpread() { + // Get random offset + int x = level.random.nextInt(3) - 1; + int y = level.random.nextInt(3) - 1; + int z = level.random.nextInt(3) - 1; + + // Get the block in the world + BlockPos targetPos = getBlockPos().offset(x, y, z); + BlockState state = level.getBlockState(targetPos); + + // Test block at the position + if (state.is(BlockTags.LEAVES)) { + + // Spread and keep distance/persistent properties + level.setBlock(targetPos, EBlocks.INFESTED_LEAVES.get().defaultBlockState() + .setValue(LeavesBlock.DISTANCE, state.getValue(LeavesBlock.DISTANCE)) + .setValue(LeavesBlock.PERSISTENT, state.getValue(LeavesBlock.PERSISTENT)), + 2); + TileEntity te = level.getBlockEntity(targetPos); + + // Set mimic state of other block + if (te instanceof InfestedLeavesBlockEntity) { + ((InfestedLeavesBlockEntity) te).setMimic(state); + te.setChanged(); + } + } + } + + @Override + public void load(BlockState state, CompoundNBT nbt) { + super.load(state, nbt); + + mimic = NBTUtil.readBlockState(nbt.getCompound("Mimic")); + progress = nbt.getFloat("Progress"); + } + + @Override + public CompoundNBT save(CompoundNBT nbt) { + nbt.put("Mimic", NBTUtil.writeBlockState(mimic)); + nbt.putFloat("Progress", progress); + return super.save(nbt); + } + + @Override + public CompoundNBT getUpdateTag() { + // Used in getUpdatePacket + return save(new CompoundNBT()); + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + // Sends a packet with updated NBT whenever setChanged is called + return new SUpdateTileEntityPacket(getBlockPos(), 244, getUpdateTag()); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + // load properties from server's NBT + load(null, pkt.getTag()); + } + + public float getProgress() { + return progress; + } + + public BlockState getMimic() { + return mimic; + } + + public void setMimic(BlockState mimic) { + this.mimic = mimic; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java new file mode 100644 index 00000000..2a1cf990 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java @@ -0,0 +1,58 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class LavaCrucibleBlockEntity extends AbstractCrucibleBlockEntity { + public static final Cache RECIPES_CACHE = CacheBuilder.newBuilder().maximumSize(12).build(); + + // todo split this off somewhere else + private static final Object2IntMap HEAT_REGISTRY = new Object2IntOpenHashMap<>(); + + static { + HEAT_REGISTRY.put(Blocks.TORCH, 1); + HEAT_REGISTRY.put(Blocks.WALL_TORCH, 1); + HEAT_REGISTRY.put(Blocks.SOUL_TORCH, 2); + HEAT_REGISTRY.put(Blocks.SOUL_WALL_TORCH, 2); + HEAT_REGISTRY.put(Blocks.LAVA, 3); + HEAT_REGISTRY.put(Blocks.FIRE, 5); + HEAT_REGISTRY.put(Blocks.SOUL_FIRE, 7); + } + + + public LavaCrucibleBlockEntity(BlockPos pos, BlockState state) { + super(EBlockEntities.LAVA_CRUCIBLE.get(), pos, state); + } + + @Override + public int getMelt() { + BlockState state = level.getBlockState(getBlockPos().below()); + + return HEAT_REGISTRY.getInt(state.getBlock()); + } + + @Override + protected RecipeType getRecipeType() { + return ERecipeTypes.LAVA_CRUCIBLE; + } + + @Override + protected Block getDefaultMeltBlock() { + return Blocks.COBBLESTONE; + } + + @Override + protected Cache getRecipeCache() { + return RECIPES_CACHE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java new file mode 100644 index 00000000..49ac7704 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java @@ -0,0 +1,42 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.AbstractSieveRecipe; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public final class RecipeUtil { + public static List getSieveResults(MinecraftServer server, RecipeType type, ItemStack mesh, ItemStack item) { + ArrayList recipes = new ArrayList<>(); + + for (T recipe : byType(server, type)) { + if (recipe.test(mesh.getItem(), item)) { + recipes.add(recipe); + } + } + + return recipes.isEmpty() ? Collections.emptyList() : recipes; + } + + public static T getRecipe(MinecraftServer server, RecipeType type, ItemStack item) { + for (T recipe : byType(server, type)) { + if (recipe.getIngredient().test(item)) { + return recipe; + } + } + + return null; + } + + public static > Collection byType(MinecraftServer server, RecipeType type) { + return server.getRecipeManager().byType(type).values(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java new file mode 100644 index 00000000..5e91657e --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java @@ -0,0 +1,195 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.sieve.AbstractSieveRecipe; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.EItems; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; + +public class SieveBlockEntity extends EBlockEntity { + public static final short MAX_SIEVE_CAPACITY = 100; + public static final short SIEVE_INTERVAL = 10; + + private final SieveBlockEntity.ItemHandler item = new SieveBlockEntity.ItemHandler(); + private ItemStack mesh = ItemStack.EMPTY; + private short progress = 0; // Max is 100 + + // Does not persist in NBT, just a cache + // todo invalidate on /reload + private List currentRecipe = Collections.emptyList(); + + public SieveBlockEntity(BlockPos pos, BlockState state) { + super(EBlockEntities.SIEVE.get(), pos, state); + } + + // Capabilities + private final LazyOptional itemHandler = LazyOptional.of(() -> item); + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return itemHandler.cast(); + } + + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + + nbt.put("item", item.serializeNBT()); + nbt.putShort("Progress", progress); + if (!mesh.isEmpty()) { + nbt.put("mesh", mesh.save(new CompoundTag())); + } + } + + @Override + public void load(CompoundTag nbt) { + item.deserializeNBT(nbt.getCompound("item")); + progress = nbt.getShort("progress"); + if (nbt.contains("mesh")) { + mesh = ItemStack.of(nbt.getCompound("Mesh")); + } + + super.load(nbt); + } + + public InteractionResult use(Level level, Player player, InteractionHand hand) { + ItemStack playerItem = player.getItemInHand(hand); + boolean isClientSide = level.isClientSide; + + // Try insert mesh + if (mesh.isEmpty()) { + if (isMesh(playerItem)) { + mesh = playerItem.copy(); + mesh.setCount(1); + + // Remove stack + if (!player.isCreative()) { + player.setItemInHand(hand, ItemStack.EMPTY); + } + } + } + + if (progress == 0) { + // Insert an item + if (!isClientSide) { + // Check against cached recipe + if (!currentRecipe.isEmpty()) { + for (AbstractSieveRecipe recipe : currentRecipe) { + if (!recipe.test(mesh.getItem(), playerItem)) { + return InteractionResult.CONSUME; + } + } + + player.setItemInHand(hand, fillWithItem(playerItem)); + markUpdated(); + } else if (!(currentRecipe = getResults(playerItem)).isEmpty()) { + player.setItemInHand(hand, fillWithItem(playerItem)); + markUpdated(); + } + } + } else { + // todo mesh efficiency + progress -= SIEVE_INTERVAL; + + if (progress <= 0) { + progress = 0; + + if (!isClientSide) { + giveItems(); + } + } + } + + return InteractionResult.sidedSuccess(isClientSide); + } + + // Consumes an item and fills the sieve. + private ItemStack fillWithItem(ItemStack stack) { + progress = MAX_SIEVE_CAPACITY; + + return item.insertItem(0, stack, false); + } + + private void giveItems() { + var pos = getBlockPos(); + var rand = level.random; + + for (AbstractSieveRecipe recipe : currentRecipe) { + for (Reward reward : recipe.getRewards()) { + if (rand.nextFloat() < reward.getChance()) { + var itemEntity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, reward.getItem().copy()); + itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); + level.addFreshEntity(itemEntity); + } + } + } + + item.setStackInSlot(0, ItemStack.EMPTY); + markUpdated(); + } + + private boolean isMesh(ItemStack stack) { + var item = stack.getItem(); + return item == EItems.STRING_MESH.get() || item == EItems.FLINT_MESH.get() || item == EItems.IRON_MESH.get() || item == EItems.DIAMOND_MESH.get() || item == EItems.NETHERITE_MESH.get(); + } + + public short getProgress() { + return progress; + } + + public ItemStack getItem() { + return item.getStackInSlot(0); + } + + public List getResults(ItemStack stack) { + return RecipeUtil.getSieveResults(level.getServer(), getRecipeType(), mesh, stack); + } + + public RecipeType getRecipeType() { + return ERecipeTypes.SIEVE; + } + + private class ItemHandler extends ItemStackHandler { + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) { + return !getResults(stack).isEmpty(); + } + + @Override + protected int getStackLimit(int slot, @Nonnull ItemStack stack) { + return 1; + } + + @Nonnull + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return ItemStack.EMPTY; + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java new file mode 100644 index 00000000..78b55723 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java @@ -0,0 +1,46 @@ +package thedarkcolour.exnihiloreborn.blockentity; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.state.BlockState; +import org.apache.commons.lang3.tuple.Pair; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class WaterCrucibleBlockEntity extends AbstractCrucibleBlockEntity { + public static final Cache, CrucibleRecipe> RECIPES_CACHE = CacheBuilder.newBuilder().maximumSize(12).build(); + + public WaterCrucibleBlockEntity(BlockPos pos, BlockState state) { + super(EBlockEntities.WATER_CRUCIBLE.get(), pos, state); + } + + @Override + public CrucibleRecipe getRecipe(ItemStack item) { + return super.getRecipe(item); + } + + @Override + protected RecipeType getRecipeType() { + return ERecipeTypes.WATER_CRUCIBLE; + } + + @Override + protected Block getDefaultMeltBlock() { + return Blocks.OAK_LEAVES; + } + + @Override + protected Cache getRecipeCache() { + return RECIPES_CACHE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java new file mode 100644 index 00000000..100508be --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java @@ -0,0 +1,89 @@ +package thedarkcolour.exnihiloreborn.client; + +import com.mojang.blaze3d.platform.GlStateManager; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.NativeImage; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.client.ter.BarrelRenderer; +import thedarkcolour.exnihiloreborn.client.ter.CrucibleRenderer; +import thedarkcolour.exnihiloreborn.client.ter.InfestedLeavesRenderer; +import thedarkcolour.exnihiloreborn.client.ter.SieveRenderer; +import thedarkcolour.exnihiloreborn.registry.EBlockEntities; +import thedarkcolour.exnihiloreborn.registry.EFluids; + +public class ClientHandler { + public static void register() { + IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + + modBus.addListener(ClientHandler::clientSetup); + modBus.addListener(ClientHandler::stitchTextures); + modBus.addListener(ClientHandler::postStitchTextures); + } + + private static void clientSetup(FMLClientSetupEvent event) { + // not sure why this isn't in render layers? + bindTers(); + + event.enqueueWork(ClientHandler::setRenderLayers); + } + + private static void stitchTextures(TextureStitchEvent.Pre event) { + if (event.getMap().location().equals(PlayerContainer.BLOCK_ATLAS)) { + event.addSprite(BarrelRenderer.COMPOST_DIRT_TEXTURE); + } + } + + @SuppressWarnings("resource") + private static void postStitchTextures(TextureStitchEvent.Post event) { + if (event.getMap().location().equals(PlayerContainer.BLOCK_ATLAS)) { + int x = + try (NativeImage image = new NativeImage(x, y, false)) { + GlStateManager._bindTexture(event.getMap().getId()); + // alpha doesn't matter, only RGB + image.downloadTexture(0, false); + + for (Item item : ForgeRegistries.ITEMS) { + IBakedModel model = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(Items.HOPPER); + + if (model != null) { + TextureAtlasSprite sprite = model.getParticleTexture(EmptyModelData.INSTANCE); + + if (sprite.atlas() == event.getMap()) { + + continue; + } + } + // put default color + } + } + } + } + + private static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerBlockEntityRenderer(EBlockEntities.INFESTED_LEAVES.get(), InfestedLeavesRenderer::new); + event.registerBlockEntityRenderer(EBlockEntities.BARREL.get(), BarrelRenderer::new); + event.registerBlockEntityRenderer(EBlockEntities.LAVA_CRUCIBLE.get(), CrucibleRenderer::new); + event.registerBlockEntityRenderer(EBlockEntities.WATER_CRUCIBLE.get(), CrucibleRenderer::new); + event.registerBlockEntityRenderer(EBlockEntities.SIEVE.get(), SieveRenderer::new); + } + + private static void setRenderLayers() { + // Fluids + RenderTypeLookup.setRenderLayer(EFluids.WITCH_WATER.get(), RenderType.translucent()); + RenderTypeLookup.setRenderLayer(EFluids.WITCH_WATER_FLOWING.get(), RenderType.translucent()); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ItemColors.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ItemColors.java new file mode 100644 index 00000000..e9c0057c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ItemColors.java @@ -0,0 +1,9 @@ +package thedarkcolour.exnihiloreborn.client; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minecraft.item.Item; + +public class ItemColors { + public static final Object2IntMap STATIC_COLORS = new Object2IntOpenHashMap<>(); +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java new file mode 100644 index 00000000..413b45a7 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java @@ -0,0 +1,155 @@ +package thedarkcolour.exnihiloreborn.client.ter; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.FluidStack; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; + +public class BarrelRenderer implements BlockEntityRenderer { + public static final ResourceLocation COMPOST_DIRT_TEXTURE = new ResourceLocation(ExNihiloReborn.ID, "block/compost_dirt"); + private final BlockRenderDispatcher blockRenderer; + + public BarrelRenderer(BlockEntityRendererProvider.Context context) { + this.blockRenderer = context.getBlockRenderDispatcher(); + } + + @Override + public void render(BarrelBlockEntity barrel, float pPartialTick, PoseStack stack, MultiBufferSource buffers, int light, int overlay) { + var item = barrel.getItem().getItem(); + + // render an output + if (item instanceof BlockItem blockItem) { + var block = blockItem.getBlock(); + var state = block.defaultBlockState(); + + stack.pushPose(); + stack.translate(2 / 16f, 2 / 16f, 2 / 16f); + stack.scale(12 / 16f, 12 / 16f, 12 / 16f); + + blockRenderer.renderSingleBlock(state, stack, buffers, light, overlay, ModelData.EMPTY, null); + } else { + // todo render a flat item + } + + barrel.getCapability(ForgeCapabilities.FLUID_HANDLER).ifPresent(tank -> { + var stack = tank.getFluidInTank(0); + }); + } + + @Override + public void render(BarrelBlockEntity barrel, float partialTicks, MatrixStack stack, IRenderTypeBuffer buffers, int light, int overlay) { + Item item = barrel.getItem().getItem(); + + // render an output + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + BlockState state = block.defaultBlockState(); + + stack.pushPose(); + stack.translate(2.0f / 16.0f, 2.0f / 16.0f, 2.0f / 16.0f); + stack.scale(12.0f / 16.0f, 12.0f / 16.0f, 12.0f / 16.0f); + + Minecraft.getInstance().getBlockRenderer().renderBlock(state, stack, buffers, light, overlay, EmptyModelData.INSTANCE); + + stack.popPose(); + } + // render a fluid + barrel.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).ifPresent(tank -> { + FluidStack fluidStack = tank.getFluidInTank(0); + + if (!fluidStack.isEmpty()) { // Get texture + Fluid fluidType = fluidStack.getFluid(); + World level = barrel.getLevel(); + BlockPos blockPos = barrel.getBlockPos(); + TextureAtlasSprite sprite = ForgeHooksClient.getFluidSprites(level, blockPos, fluidType.defaultFluidState())[0]; + + // Get color + int col = fluidType.getAttributes().getColor(level, blockPos); + // Split into RGB components + int r = (col >> 16) & 0xff; + int g = (col >> 8) & 0xff; + int b = (col >> 0) & 0xff; + + if (barrel.isBrewing()) { + float progress = barrel.progress; + + // Transition between water color and witch water color (551ec6) + r = (int) MathHelper.lerp(progress, r, 85); + g = (int) MathHelper.lerp(progress, g, 30); + b = (int) MathHelper.lerp(progress, b, 198); + } + + // Setup rendering + IVertexBuilder builder = buffers.getBuffer(RenderTypeLookup.canRenderInLayer(fluidType.defaultFluidState(), RenderType.translucent()) ? RenderType.translucent() : RenderType.solid()); + + renderContents(builder, stack, fluidStack.getAmount() / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); + } + }); + + // render compost + if (barrel.compost > 0) { + TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(PlayerContainer.BLOCK_ATLAS).apply(COMPOST_DIRT_TEXTURE); + IVertexBuilder builder = buffers.getBuffer(RenderType.solid()); + + float compostProgress = barrel.progress; + + // todo custom compost colors + // Transition between default green and dirt brown + int r = (int) MathHelper.lerp(compostProgress, 53, 238); + int g = (int) MathHelper.lerp(compostProgress, 168, 169); + int b = (int) MathHelper.lerp(compostProgress, 42, 109); + + renderContents(builder, stack, barrel.compost / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); + } + } + + public static void renderContents(IVertexBuilder builder, MatrixStack stack, float percentage, int color, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { + renderContents(builder, stack, percentage, (color >> 16) & 0xff, (color >> 8) & 0xff, (color >> 0) & 0xff, sprite, light, edge, yMin, yMax); + } + + // Renders a sprite inside the barrel with the height determined by how full the barrel is. + public static void renderContents(IVertexBuilder builder, MatrixStack stack, float percentage, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { + // Height + float height = ((yMax - yMin) / 16.0f) * percentage; + + // Offset by specified number of pixels + stack.pushPose(); + stack.translate(0.0, yMin / 16.0, 0.0); + + // Render quad + renderQuad(builder, stack, height, r, g, b, sprite, light, edge); + + stack.popPose(); + } + + // Renders a sprite + private static void renderQuad(IVertexBuilder builder, MatrixStack stack, float quadHeight, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge) { + Matrix4f pose = stack.last().pose(); + + // Texture coordinates + float uMin = sprite.getU0(); + float uMax = sprite.getU1(); + float vMin = sprite.getV0(); + float vMax = sprite.getV1(); + + float edgeMin = edge / 16.0f; + float edgeMax = (16.0f - edge) / 16.0f; + + builder.vertex(pose, edgeMin, quadHeight, edgeMin).color(r, g, b, 255).uv(uMin, vMin).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); + builder.vertex(pose, edgeMin, quadHeight, edgeMax).color(r, g, b, 255).uv(uMin, vMax).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); + builder.vertex(pose, edgeMax, quadHeight, edgeMax).color(r, g, b, 255).uv(uMax, vMax).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); + builder.vertex(pose, edgeMax, quadHeight, edgeMin).color(r, g, b, 255).uv(uMax, vMin).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java new file mode 100644 index 00000000..b57a4ef8 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java @@ -0,0 +1,87 @@ +package thedarkcolour.exnihiloreborn.client.ter; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import thedarkcolour.exnihiloreborn.blockentity.AbstractCrucibleBlockEntity; + +public class CrucibleRenderer extends TileEntityRenderer { + public static final LoadingCache TOP_TEXTURES = CacheBuilder.newBuilder().maximumSize(30).build(new CacheLoader() { + @Override + public ResourceLocation load(Block key) { + ResourceLocation registryName = key.getRegistryName(); + return new ResourceLocation(registryName.getNamespace(), "block/" + registryName.getPath()); + } + }); + public static final LoadingCache TOP_LAYERS = CacheBuilder.newBuilder().maximumSize(30).build(new CacheLoader() { + @Override + public RenderType load(Block key) { + return RenderType.chunkBufferLayers().stream().filter(layer -> RenderTypeLookup.canRenderInLayer(key.defaultBlockState(), layer)).findFirst().get(); + } + }); + + public CrucibleRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public void render(AbstractCrucibleBlockEntity crucible, float partialTicks, MatrixStack stack, IRenderTypeBuffer buffers, int light, int overlay) { + crucible.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).ifPresent(tank -> { + FluidStack fluidStack = tank.getFluidInTank(0); + + float solids = (float) crucible.getSolids() / (float) AbstractCrucibleBlockEntity.MAX_SOLIDS; + float liquid = (float) fluidStack.getAmount() / (float) tank.getTankCapacity(0); + + if (solids != 0 || liquid != 0) { + World level = crucible.getLevel(); + BlockPos blockPos = crucible.getBlockPos(); + + IVertexBuilder builder; + TextureAtlasSprite sprite; + float percentage; + + if (solids != 0) { + percentage = solids; + builder = buffers.getBuffer(TOP_LAYERS.getUnchecked(crucible.getLastMelted())); + sprite = Minecraft.getInstance().getTextureAtlas(PlayerContainer.BLOCK_ATLAS).apply(TOP_TEXTURES.getUnchecked(crucible.getLastMelted())); + + int col = Minecraft.getInstance().getBlockColors().getColor(crucible.getLastMelted().defaultBlockState(), level, blockPos, 0); + + if (col == -1) col = 0xffffff; + + BarrelRenderer.renderContents(builder, stack, percentage, col, sprite, light, 2.0f, 4.0f, 14.0f); + } + if (liquid != 0) { + Fluid fluidType = fluidStack.getFluid(); + + percentage = liquid; + builder = buffers.getBuffer(RenderTypeLookup.canRenderInLayer(fluidType.defaultFluidState(), RenderType.translucent()) ? RenderType.translucent() : RenderType.solid()); + sprite = ForgeHooksClient.getFluidSprites(level, blockPos, fluidType.defaultFluidState())[0]; + + // Set biome colors + int col = fluidType.getAttributes().getColor(level, blockPos); + + BarrelRenderer.renderContents(builder, stack, percentage, col, sprite, light, 2.0f, 4.0f, 14.0f); + } + } + }); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/InfestedLeavesRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/InfestedLeavesRenderer.java new file mode 100644 index 00000000..89d12fa3 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/InfestedLeavesRenderer.java @@ -0,0 +1,55 @@ +package thedarkcolour.exnihiloreborn.client.ter; + +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.client.model.data.EmptyModelData; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; + +public class InfestedLeavesRenderer extends TileEntityRenderer { + public InfestedLeavesRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public void render(InfestedLeavesBlockEntity te, float partialTicks, MatrixStack stack, IRenderTypeBuffer buffer, int light, int overlay) { + Minecraft mc = Minecraft.getInstance(); + BlockState state = te.getMimic(); + + // Default to oak leaves + if (state == null) state = Blocks.OAK_LEAVES.defaultBlockState(); + + // If something is wrong render default leaves + if (!te.hasLevel()) { + Minecraft.getInstance().getBlockRenderer().renderBlock(state, stack, buffer, light, overlay, EmptyModelData.INSTANCE); + return; + } + + // Get infested percentage + float progress = te.getProgress(); + + // Get colors + int col = mc.getBlockColors().getColor(state, te.getLevel(), te.getBlockPos(), 0); + + // Average the white color with the biome color + float r = MathHelper.lerp(progress, (col >> 16) & 0xff, 255.0f); + float g = MathHelper.lerp(progress, (col >> 8 ) & 0xff, 255.0f); + float b = MathHelper.lerp(progress, (col >> 0 ) & 0xff, 255.0f); + + // Cap to 255 + float red = (Math.min(255, r)) / 255.0f; + float green = (Math.min(255, g)) / 255.0f; + float blue = (Math.min(255, b)) / 255.0f; + + // Render + IBakedModel model = mc.getBlockRenderer().getBlockModel(state); + mc.getBlockRenderer().getModelRenderer().renderModel(stack.last(), buffer.getBuffer(RenderTypeLookup.getRenderType(state, false)), state, model, red, green, blue, light, overlay, EmptyModelData.INSTANCE); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/SieveRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/SieveRenderer.java new file mode 100644 index 00000000..f003c5de --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/SieveRenderer.java @@ -0,0 +1,34 @@ +package thedarkcolour.exnihiloreborn.client.ter; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import thedarkcolour.exnihiloreborn.blockentity.SieveBlockEntity; + +// todo +public class SieveRenderer extends TileEntityRenderer { + public SieveRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public void render(SieveBlockEntity sieve, float partialTicks, MatrixStack stack, IRenderTypeBuffer buffers, int light, int overlay) { + ItemStack contents = sieve.getItem(); + + if (!contents.isEmpty() && contents.getItem() instanceof BlockItem) { + BlockItem item = (BlockItem) contents.getItem(); + float percentage = (float) sieve.getProgress() / 100.0f; + IVertexBuilder builder = buffers.getBuffer(CrucibleRenderer.TOP_LAYERS.getUnchecked(item.getBlock())); + TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(PlayerContainer.BLOCK_ATLAS).apply(CrucibleRenderer.TOP_TEXTURES.getUnchecked(item.getBlock())); + + BarrelRenderer.renderContents(builder, stack, percentage, 0xffffff, sprite, light, 1.0f, 11.0f, 15.0f); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornPlugin.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornPlugin.java new file mode 100644 index 00000000..f6d41d18 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornPlugin.java @@ -0,0 +1,20 @@ +package thedarkcolour.exnihiloreborn.compat.jei; + +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; + +@JeiPlugin +public class ExNihiloRebornPlugin implements IModPlugin { + @Override + public ResourceLocation getPluginUid() { + return new ResourceLocation(ExNihiloReborn.ID, "jei_plugin"); + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java new file mode 100644 index 00000000..bafcb690 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java @@ -0,0 +1,60 @@ +package thedarkcolour.exnihiloreborn.compat.top; + +import mcjty.theoneprobe.api.CompoundText; +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; +import mcjty.theoneprobe.api.TextStyleClass; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.blockentity.AbstractCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; +import thedarkcolour.exnihiloreborn.registry.EBlocks; + +public class InfestedLeavesInfoProvider implements IProbeInfoProvider { + @Override + public String getID() { + return ExNihiloReborn.ID + ":infested_leaves"; + } + + @Override + public void addProbeInfo(ProbeMode probeMode, IProbeInfo info, PlayerEntity playerEntity, World level, BlockState state, IProbeHitData data) { + TileEntity te = level.getBlockEntity(data.getPos()); + + if (state.getBlock() == EBlocks.INFESTED_LEAVES.get()) { + + if (te instanceof InfestedLeavesBlockEntity) { + int progress = (int) (((InfestedLeavesBlockEntity) te).getProgress() * 100.0f); + + info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Progress: ").style(TextStyleClass.WARNING).text(progress + "%")); + } + } else if (te instanceof BarrelBlockEntity) { + BarrelBlockEntity barrel = (BarrelBlockEntity) te; + short volume = barrel.compost; + + if (volume == 1000 || barrel.isBrewing()) { + int progress = (int) (barrel.progress * 100.0f); + + info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Progress: ").style(TextStyleClass.WARNING).text(progress + "%")); + } else if (volume > 0) { + int volumePercent = (int) (volume / 10.0f); + + info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Volume: ").style(TextStyleClass.WARNING).text(volumePercent + "%")); + } else if (barrel.isBurning()) { + int progress = 300 - (int) (barrel.progress * 300.0f); + + info.text(CompoundText.create().style(TextStyleClass.ERROR).text("Burning! ").style(TextStyleClass.WARNING).text(progress / 20 + "s")); + } + } else if (te instanceof AbstractCrucibleBlockEntity) { + AbstractCrucibleBlockEntity crucible = (AbstractCrucibleBlockEntity) te; + + info.tankHandler(crucible.getTank()); + info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Rate: ").style(TextStyleClass.WARNING).text(crucible.getMelt() + "x")); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java new file mode 100644 index 00000000..028f7fb2 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java @@ -0,0 +1,14 @@ +package thedarkcolour.exnihiloreborn.compat.top; + +import mcjty.theoneprobe.api.ITheOneProbe; + +import java.util.function.Function; + +public class TopCompatExNihiloReborn implements Function { + @Override + public Void apply(ITheOneProbe iTheOneProbe) { + iTheOneProbe.registerProvider(new InfestedLeavesInfoProvider()); + + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java b/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java new file mode 100644 index 00000000..8de46217 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java @@ -0,0 +1,31 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; + +// these two annotations basically mean modEventBus.addListener(Data::generateData) +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class Data { + @SubscribeEvent + public static void generateData(GatherDataEvent event) { + // Two things used by data generators + DataGenerator gen = event.getGenerator(); // writes to json + ExistingFileHelper helper = event.getExistingFileHelper(); // reads existing files like pngs and parent models + + if (event.includeServer()) { + EBlockTagsProvider blockTags = new EBlockTagsProvider(gen, helper); + + gen.addProvider(new ERecipeProvider(gen)); + gen.addProvider(new ELootProvider(gen)); + gen.addProvider(blockTags); + gen.addProvider(new EItemTagProvider(gen, blockTags, helper)); + } + if (event.includeClient()) { + gen.addProvider(new EModelProvider(gen, helper)); + gen.addProvider(new ELangProvider(gen)); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/EBlockTagsProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/EBlockTagsProvider.java new file mode 100644 index 00000000..8a4d3889 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/EBlockTagsProvider.java @@ -0,0 +1,19 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; + +import javax.annotation.Nullable; + +public class EBlockTagsProvider extends BlockTagsProvider { + public EBlockTagsProvider(DataGenerator gen, @Nullable ExistingFileHelper helper) { + super(gen, ExNihiloReborn.ID, helper); + } + + @Override + protected void addTags() { + super.addTags(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/EItemTagProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/EItemTagProvider.java new file mode 100644 index 00000000..06fe174b --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/EItemTagProvider.java @@ -0,0 +1,24 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.ItemTagsProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.item.EItemTags; +import thedarkcolour.exnihiloreborn.registry.EItems; + +import javax.annotation.Nullable; + +public class EItemTagProvider extends ItemTagsProvider { + public EItemTagProvider(DataGenerator gen, BlockTagsProvider blocKTags, @Nullable ExistingFileHelper helper) { + super(gen, blocKTags, ExNihiloReborn.ID, helper); + } + + @Override + protected void addTags() { + tag(EItemTags.HAMMERS).add(EItems.WOODEN_HAMMER.get(), EItems.STONE_HAMMER.get(), EItems.GOLDEN_HAMMER.get(), EItems.IRON_HAMMER.get(), EItems.DIAMOND_HAMMER.get(), EItems.NETHERITE_HAMMER.get()); + tag(EItemTags.CROOKS).add(EItems.CROOK.get(), EItems.COMPRESSED_CROOK.get(), EItems.BONE_CROOK.get()); + tag(EItemTags.COMPRESSED_HAMMERS).add(EItems.COMPRESSED_WOODEN_HAMMER.get(), EItems.COMPRESSED_STONE_HAMMER.get(), EItems.COMPRESSED_GOLDEN_HAMMER.get(), EItems.COMPRESSED_IRON_HAMMER.get(), EItems.COMPRESSED_DIAMOND_HAMMER.get(), EItems.COMPRESSED_NETHERITE_HAMMER.get()); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/ELangProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/ELangProvider.java new file mode 100644 index 00000000..d8281d7f --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/ELangProvider.java @@ -0,0 +1,77 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.LanguageProvider; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EItems; + +public class ELangProvider extends LanguageProvider { + public ELangProvider(DataGenerator gen) { + super(gen, ExNihiloReborn.ID, "en_us"); + } + + @Override + protected void addTranslations() { + addItem(EItems.SILK_WORM, "Silk Worm"); + addItem(EItems.COOKED_SILK_WORM, "Cooked Silk Worm"); + + addItem(EItems.CROOK, "Crook"); + addItem(EItems.COMPRESSED_CROOK, "Compressed Crook"); + addItem(EItems.BONE_CROOK, "Bone Crook"); + + addItem(EItems.WOODEN_HAMMER, "Wooden Hammer"); + addItem(EItems.STONE_HAMMER, "Stone Hammer"); + addItem(EItems.GOLDEN_HAMMER, "Golden Hammer"); + addItem(EItems.IRON_HAMMER, "Iron Hammer"); + addItem(EItems.DIAMOND_HAMMER, "Diamond Hammer"); + addItem(EItems.NETHERITE_HAMMER, "Netherite Hammer"); + + addItem(EItems.COMPRESSED_WOODEN_HAMMER, "Compressed Wooden Hammer"); + addItem(EItems.COMPRESSED_STONE_HAMMER, "Compressed Stone Hammer"); + addItem(EItems.COMPRESSED_GOLDEN_HAMMER, "Compressed Golden Hammer"); + addItem(EItems.COMPRESSED_IRON_HAMMER, "Compressed Iron Hammer"); + addItem(EItems.COMPRESSED_DIAMOND_HAMMER, "Compressed Diamond Hammer"); + addItem(EItems.COMPRESSED_NETHERITE_HAMMER, "Compressed Netherite Hammer"); + + addItem(EItems.IRON_ORE_PIECES, "Iron Ore Pieces"); + addItem(EItems.COPPER_ORE_PIECES, "Copper Ore Pieces"); + addItem(EItems.GOLD_ORE_PIECES, "Gold Ore Pieces"); + + addItem(EItems.STONE_PEBBLE, "Stone Pebble"); + addItem(EItems.DEEPSLATE_PEBBLE, "Deepslate Pebble"); + + addBlock(EBlocks.DUST, "Dust"); + addBlock(EBlocks.CRUSHED_NETHERRACK, "Crushed Netherrack"); + addBlock(EBlocks.CRUSHED_END_STONE, "Crushed End Stone"); + + addBlock(EBlocks.COMPRESSED_COBBLESTONE, "Compressed Cobblestone"); + addBlock(EBlocks.COMPRESSED_DIRT, "Compressed Dirt"); + addBlock(EBlocks.COMPRESSED_SAND, "Compressed Sand"); + addBlock(EBlocks.COMPRESSED_DUST, "Compressed Dust"); + addBlock(EBlocks.COMPRESSED_CRUSHED_NETHERRACK, "Compressed Crushed Netherrack"); + addBlock(EBlocks.COMPRESSED_CRUSHED_END_STONE, "Compressed Crushed End Stone"); + + addBlock(EBlocks.OAK_BARREL, "Oak Barrel"); + addBlock(EBlocks.SPRUCE_BARREL, "Spruce Barrel"); + addBlock(EBlocks.BIRCH_BARREL, "Birch Barrel"); + addBlock(EBlocks.JUNGLE_BARREL, "Jungle Barrel"); + addBlock(EBlocks.ACACIA_BARREL, "Acacia Barrel"); + addBlock(EBlocks.DARK_OAK_BARREL, "Dark_oak Barrel"); + addBlock(EBlocks.CRIMSON_BARREL, "Crimson Barrel"); + addBlock(EBlocks.WARPED_BARREL, "Warped Barrel"); + addBlock(EBlocks.STONE_BARREL, "Stone Barrel"); + + addBlock(EBlocks.PORCELAIN_CRUCIBLE, "Porcelain Crucible"); + addBlock(EBlocks.WARPED_CRUCIBLE, "Warped Crucible"); + addBlock(EBlocks.CRIMSON_CRUCIBLE, "Crimson Crucible"); + addBlock(EBlocks.UNFIRED_CRUCIBLE, "Unfired Crucible"); + + addBlock(EBlocks.OAK_CRUCIBLE, "Oak Crucible"); + addBlock(EBlocks.SPRUCE_CRUCIBLE, "Spruce Crucible"); + addBlock(EBlocks.BIRCH_CRUCIBLE, "Birch Crucible"); + addBlock(EBlocks.JUNGLE_CRUCIBLE, "Jungle Crucible"); + addBlock(EBlocks.ACACIA_CRUCIBLE, "Acacia Crucible"); + addBlock(EBlocks.DARK_OAK_CRUCIBLE, "Dark Oak Crucible"); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/ELootProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/ELootProvider.java new file mode 100644 index 00000000..493946fa --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/ELootProvider.java @@ -0,0 +1,103 @@ +package thedarkcolour.exnihiloreborn.data; + +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DirectoryCache; +import net.minecraft.data.IDataProvider; +import net.minecraft.data.LootTableProvider; +import net.minecraft.item.Items; +import net.minecraft.loot.ConstantRange; +import net.minecraft.loot.ItemLootEntry; +import net.minecraft.loot.LootParameterSets; +import net.minecraft.loot.LootPool; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.LootTableManager; +import net.minecraft.loot.conditions.SurvivesExplosion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import thedarkcolour.exnihiloreborn.loot.InfestedString; +import thedarkcolour.exnihiloreborn.registry.EBlocks; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +public class ELootProvider extends LootTableProvider { + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + private static final Logger LOGGER = LogManager.getLogger(); + private final DataGenerator generator; + private final Map blockTables = Maps.newHashMap(); + + public ELootProvider(DataGenerator generator) { + super(generator); + this.generator = generator; + } + + private void addBlockLootTables() { + addLoot(EBlocks.INFESTED_LEAVES, new LootTable.Builder().withPool(new LootPool.Builder().setRolls(ConstantRange.exactly(1)).add(ItemLootEntry.lootTableItem(Items.STRING).apply(InfestedString.infestedString())))); + + addSelfDrops(); + } + + private void addSelfDrops() { + dropSelf(EBlocks.DUST); + + dropSelf(EBlocks.COMPRESSED_COBBLESTONE); + dropSelf(EBlocks.COMPRESSED_DIRT); + dropSelf(EBlocks.COMPRESSED_SAND); + dropSelf(EBlocks.COMPRESSED_DUST); + + dropSelf(EBlocks.OAK_BARREL); + dropSelf(EBlocks.SPRUCE_BARREL); + dropSelf(EBlocks.BIRCH_BARREL); + dropSelf(EBlocks.JUNGLE_BARREL); + dropSelf(EBlocks.ACACIA_BARREL); + dropSelf(EBlocks.DARK_OAK_BARREL); + dropSelf(EBlocks.CRIMSON_BARREL); + dropSelf(EBlocks.WARPED_BARREL); + dropSelf(EBlocks.STONE_BARREL); + } + + @Override + public void run(DirectoryCache directoryCache) { + addBlockLootTables(); + + HashMap tables = new HashMap<>(blockTables.size()); + + for (Map.Entry entry : blockTables.entrySet()) { + // Add tables to the block loot parameter set automatically + tables.put(entry.getKey().getLootTable(), entry.getValue().setParamSet(LootParameterSets.BLOCK).build()); + } + + writeLootTables(tables, directoryCache); + } + + // Loot table to drop the block itself. Think Diamond Block, Sand, etc. + private void dropSelf(RegistryObject block) { + // refer to the diamond block loot table for this one + addLoot(block, new LootTable.Builder().withPool(new LootPool.Builder().setRolls(ConstantRange.exactly(1)).add(ItemLootEntry.lootTableItem(block.get())).when(SurvivesExplosion.survivesExplosion()))); + } + + private void addLoot(RegistryObject block, LootTable.Builder builder) { + blockTables.put(block.get(), builder); + } + + private void writeLootTables(Map tables, DirectoryCache cache) { + Path outputFolder = generator.getOutputFolder(); + + for (Map.Entry entry : tables.entrySet()) { + Path path = outputFolder.resolve("data/" + entry.getKey().getNamespace() + "/loot_tables/" + entry.getKey().getPath() + ".json"); + + try { + IDataProvider.save(GSON, cache, LootTableManager.serialize(entry.getValue()), path); + } catch (Exception e) { + LOGGER.error("Couldn't write loot table {}", path, e); + } + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/EModelProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/EModelProvider.java new file mode 100644 index 00000000..652c4332 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/EModelProvider.java @@ -0,0 +1,173 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.ModelProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.fml.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EItems; + +public class EModelProvider extends BlockStateProvider { + public EModelProvider(DataGenerator gen, ExistingFileHelper helper) { + super(gen, ExNihiloReborn.ID, helper); + } + + @Override + protected void registerStatesAndModels() { + registerBlockModels(); + registerItemModels(); + } + + public void registerBlockModels() { + // Materials + simpleCubeAll(EBlocks.DUST.get()); + simpleCubeAll(EBlocks.CRUSHED_NETHERRACK.get()); + simpleCubeAll(EBlocks.CRUSHED_END_STONE.get()); + + // Compressed Blocks + //simpleCubeAll(EBlocks.COMPRESSED_COBBLESTONE.get()); + //simpleCubeAll(EBlocks.COMPRESSED_DIRT.get()); + //simpleCubeAll(EBlocks.COMPRESSED_SAND.get()); + //simpleCubeAll(EBlocks.COMPRESSED_DUST.get()); + + //simpleCubeAll(EBlocks.COMPRESSED_CRUSHED_NETHERRACK.get()); + //simpleCubeAll(EBlocks.COMPRESSED_CRUSHED_END_STONE.get()); + + // Barrels + barrel(EBlocks.OAK_BARREL.get(), Blocks.OAK_PLANKS); + barrel(EBlocks.SPRUCE_BARREL.get(), Blocks.SPRUCE_PLANKS); + barrel(EBlocks.BIRCH_BARREL.get(), Blocks.BIRCH_PLANKS); + barrel(EBlocks.JUNGLE_BARREL.get(), Blocks.JUNGLE_PLANKS); + barrel(EBlocks.ACACIA_BARREL.get(), Blocks.ACACIA_PLANKS); + barrel(EBlocks.DARK_OAK_BARREL.get(), Blocks.DARK_OAK_PLANKS); + barrel(EBlocks.CRIMSON_BARREL.get(), Blocks.CRIMSON_PLANKS); + barrel(EBlocks.WARPED_BARREL.get(), Blocks.WARPED_PLANKS); + barrel(EBlocks.STONE_BARREL.get(), Blocks.STONE); + + sieve(EBlocks.OAK_SIEVE.get(), Blocks.OAK_PLANKS); + sieve(EBlocks.SPRUCE_SIEVE.get(), Blocks.SPRUCE_PLANKS); + sieve(EBlocks.BIRCH_SIEVE.get(), Blocks.BIRCH_PLANKS); + sieve(EBlocks.JUNGLE_SIEVE.get(), Blocks.JUNGLE_PLANKS); + sieve(EBlocks.ACACIA_SIEVE.get(), Blocks.ACACIA_PLANKS); + sieve(EBlocks.DARK_OAK_SIEVE.get(), Blocks.DARK_OAK_PLANKS); + sieve(EBlocks.CRIMSON_SIEVE.get(), Blocks.CRIMSON_PLANKS); + sieve(EBlocks.WARPED_SIEVE.get(), Blocks.WARPED_PLANKS); + + // Lava Crucible + crucible(EBlocks.UNFIRED_CRUCIBLE.get()); + crucible(EBlocks.PORCELAIN_CRUCIBLE.get()); + crucible(EBlocks.CRIMSON_CRUCIBLE.get(), Blocks.CRIMSON_STEM); + crucible(EBlocks.WARPED_CRUCIBLE.get(), Blocks.WARPED_STEM); + + // Water Crucible + crucible(EBlocks.OAK_CRUCIBLE.get(), Blocks.OAK_LOG); + crucible(EBlocks.SPRUCE_CRUCIBLE.get(), Blocks.SPRUCE_LOG); + crucible(EBlocks.BIRCH_CRUCIBLE.get(), Blocks.BIRCH_LOG); + crucible(EBlocks.JUNGLE_CRUCIBLE.get(), Blocks.JUNGLE_LOG); + crucible(EBlocks.ACACIA_CRUCIBLE.get(), Blocks.ACACIA_LOG); + crucible(EBlocks.DARK_OAK_CRUCIBLE.get(), Blocks.DARK_OAK_LOG); + } + + public void registerItemModels() { + generic2d(EItems.SILK_WORM); + generic2d(EItems.COOKED_SILK_WORM); + + handheld(EItems.WOODEN_HAMMER); + handheld(EItems.STONE_HAMMER); + handheld(EItems.GOLDEN_HAMMER); + handheld(EItems.IRON_HAMMER); + handheld(EItems.DIAMOND_HAMMER); + + handheld(EItems.CROOK); + handheld(EItems.BONE_CROOK); + } + + public void simpleCubeAll(Block block) { + blockItem(block); + simpleBlock(block); + } + + public void crucible(Block block) { + crucible(block, block); + } + + public void crucible(Block block, Block appearance) { + ResourceLocation texture = blockTexture(appearance); + + blockItem(block); + + singleModel(block) + .parent(modParent("template_crucible")) + .texture("inside", texture) + .texture("top", texture) + .texture("bottom", texture) + .texture("side", texture); + } + + public void barrel(Block block, Block appearance) { + ResourceLocation texture = blockTexture(appearance); + + blockItem(block); + + singleModel(block) + .parent(modParent("template_barrel")) + .texture("barrel", texture); + } + + public void sieve(Block block, Block appearance) { + ResourceLocation texture = blockTexture(appearance); + + blockItem(block); + + singleModel(block) + .parent(modParent("template_sieve")) + .texture("texture", texture); + } + + public void blockItem(Block block) { + simpleBlockItem(block, modParent(block.getRegistryName().getPath())); + } + + public ModelFile modParent(String name) { + return new ModelFile.UncheckedModelFile(modLoc(ModelProvider.BLOCK_FOLDER + "/" + name)); + } + + public ResourceLocation blockTexture(ResourceLocation id) { + return new ResourceLocation(id.getNamespace(), ModelProvider.BLOCK_FOLDER + "/" + id.getPath()); + } + + // Configures a block model with no block state properties + public BlockModelBuilder singleModel(Block block) { + BlockModelBuilder builder = blockModel(block); + + getVariantBuilder(block).partialState().addModels(new ConfiguredModel(builder)); + + return builder; + } + + public BlockModelBuilder blockModel(Block block) { + return models().getBuilder(block.getRegistryName().getPath()); + } + + // Generic 2d item model like lantern or hopper. Requires Item form. + private void generic2d(RegistryObject supplier) { + String path = supplier.getId().getPath(); + itemModels().getBuilder(path).parent(new ModelFile.UncheckedModelFile(mcLoc("item/generated"))).texture("layer0", modLoc("item/" + path)); + } + + private void handheld(RegistryObject item) { + String itemName = item.getId().getPath(); + + itemModels().singleTexture(itemName, mcLoc("item/handheld"), "layer0", modLoc("item/" + itemName)); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/ERecipeProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/data/ERecipeProvider.java new file mode 100644 index 00000000..ef523e72 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/ERecipeProvider.java @@ -0,0 +1,260 @@ +package thedarkcolour.exnihiloreborn.data; + +import com.google.common.collect.ImmutableList; +import net.minecraft.block.Blocks; +import net.minecraft.data.CookingRecipeBuilder; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.data.RecipeProvider; +import net.minecraft.data.ShapedRecipeBuilder; +import net.minecraft.data.SmithingRecipeBuilder; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.Tags; +import net.minecraftforge.fml.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.barrel.FinishedBarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.crucible.FinishedCrucibleRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.FinishedHammerRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.FinishedSieveRecipe; +import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EItems; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class ERecipeProvider extends RecipeProvider { + public ERecipeProvider(DataGenerator gen) { + super(gen); + } + + @Override + protected void buildShapelessRecipes(Consumer consumer) { + createCraftingRecipes(consumer); + createSieveRecipes(consumer); + createCrucibleRecipes(consumer); + createHammerRecipes(consumer); + createBarrelCompostRecipes(consumer); + } + + private void createCraftingRecipes(Consumer consumer) { + // Crook + shapedCrook(consumer, EItems.CROOK, Ingredient.of(Tags.Items.RODS_WOODEN)); + shapedCrook(consumer, EItems.COMPRESSED_CROOK, Ingredient.of(EItems.CROOK.get())); + shapedCrook(consumer, EItems.BONE_CROOK, Ingredient.of(Items.BONE)); + + // Hammer + shapedHammer(consumer, EItems.WOODEN_HAMMER, Ingredient.of(ItemTags.PLANKS)); + shapedHammer(consumer, EItems.STONE_HAMMER, Ingredient.of(ItemTags.STONE_CRAFTING_MATERIALS)); + shapedHammer(consumer, EItems.GOLDEN_HAMMER, Ingredient.of(Tags.Items.INGOTS_GOLD)); + shapedHammer(consumer, EItems.IRON_HAMMER, Ingredient.of(Tags.Items.INGOTS_IRON)); + shapedHammer(consumer, EItems.DIAMOND_HAMMER, Ingredient.of(Tags.Items.GEMS_DIAMOND)); + SmithingRecipeBuilder.smithing(Ingredient.of(EItems.DIAMOND_HAMMER.get()), Ingredient.of(Tags.Items.INGOTS_NETHERITE), EItems.NETHERITE_HAMMER.get()); + + // Barrels + shapedU(consumer, EItems.OAK_BARREL, Items.OAK_PLANKS, Items.OAK_SLAB); + shapedU(consumer, EItems.SPRUCE_BARREL, Items.SPRUCE_PLANKS, Items.SPRUCE_SLAB); + shapedU(consumer, EItems.BIRCH_BARREL, Items.BIRCH_PLANKS, Items.BIRCH_SLAB); + shapedU(consumer, EItems.JUNGLE_BARREL, Items.JUNGLE_PLANKS, Items.JUNGLE_SLAB); + shapedU(consumer, EItems.ACACIA_BARREL, Items.ACACIA_PLANKS, Items.ACACIA_SLAB); + shapedU(consumer, EItems.DARK_OAK_BARREL, Items.DARK_OAK_PLANKS, Items.DARK_OAK_SLAB); + shapedU(consumer, EItems.CRIMSON_BARREL, Items.CRIMSON_PLANKS, Items.CRIMSON_SLAB); + shapedU(consumer, EItems.WARPED_BARREL, Items.WARPED_PLANKS, Items.WARPED_SLAB); + shapedU(consumer, EItems.STONE_BARREL, Items.STONE, Items.STONE_SLAB); + + // Crucible + shapedU(consumer, EItems.OAK_CRUCIBLE, ItemTags.OAK_LOGS, Items.OAK_SLAB); + shapedU(consumer, EItems.SPRUCE_CRUCIBLE, ItemTags.SPRUCE_LOGS, Items.SPRUCE_SLAB); + shapedU(consumer, EItems.BIRCH_CRUCIBLE, ItemTags.BIRCH_LOGS, Items.BIRCH_SLAB); + shapedU(consumer, EItems.JUNGLE_CRUCIBLE, ItemTags.JUNGLE_LOGS, Items.JUNGLE_SLAB); + shapedU(consumer, EItems.ACACIA_CRUCIBLE, ItemTags.ACACIA_LOGS, Items.ACACIA_SLAB); + shapedU(consumer, EItems.DARK_OAK_CRUCIBLE, ItemTags.DARK_OAK_LOGS, Items.DARK_OAK_SLAB); + shapedU(consumer, EItems.CRIMSON_CRUCIBLE, ItemTags.CRIMSON_STEMS, Items.CRIMSON_SLAB); + shapedU(consumer, EItems.WARPED_CRUCIBLE, ItemTags.WARPED_STEMS, Items.WARPED_SLAB); + shapedU(consumer, EItems.UNFIRED_CRUCIBLE, EItems.PORCELAIN_CLAY.get(), EItems.PORCELAIN_CLAY.get()); + + // Furnace Recipe + CookingRecipeBuilder.smelting(Ingredient.of(EItems.UNFIRED_CRUCIBLE.get()), EItems.PORCELAIN_CRUCIBLE.get(), 0.1f, 200).unlockedBy("has_item", has(EItems.UNFIRED_CRUCIBLE.get())).save(consumer, EItems.PORCELAIN_CRUCIBLE.getId()); + CookingRecipeBuilder.smelting(Ingredient.of(EItems.SILK_WORM.get()), EItems.COOKED_SILK_WORM.get(), 0.1f, 200).unlockedBy("has_item", has(EItems.SILK_WORM.get())).save(consumer, EItems.COOKED_SILK_WORM.getId()); + + // Smoker Recipe + CookingRecipeBuilder.cooking(Ingredient.of(EItems.SILK_WORM.get()), EItems.COOKED_SILK_WORM.get(), 0.1f, 200, IRecipeSerializer.SMOKING_RECIPE).unlockedBy("has_item", has(EItems.SILK_WORM.get())).save(consumer, "cooked_silk_worm_from_smoking"); + } + + private void shapedHammer(Consumer consumer, RegistryObject hammer, Ingredient ingredient) { + shaped(consumer, hammer, 1, builder -> { + builder.define('x', ingredient); + builder.define('v', Tags.Items.RODS_WOODEN); + builder.pattern(" x "); + builder.pattern("xv "); + builder.pattern(" v"); + builder.unlockedBy("has_item", has(ItemTags.PLANKS)); + }); + } + + private void shapedCrook(Consumer consumer, RegistryObject crook, Ingredient stick) { + shaped(consumer, crook, 1, builder -> { + builder.define('x', stick); + builder.pattern("xx"); + builder.pattern(" x"); + builder.pattern(" x"); + builder.unlockedBy("has_item", has(Tags.Items.RODS_WOODEN)); + }); + } + + private void shapedU(Consumer consumer, RegistryObject barrel, ITag log, Item slab) { + shaped(consumer, barrel, 1, builder -> { + builder.define('x', log); + builder.define('z', slab); + builder.pattern("x x"); + builder.pattern("x x"); + builder.pattern("xzx"); + builder.unlockedBy("has_item", has(ItemTags.PLANKS)); + }); + } + + private void shapedU(Consumer consumer, RegistryObject barrel, Item plank, Item slab) { + shaped(consumer, barrel, 1, builder -> { + builder.define('x', plank); + builder.define('z', slab); + builder.pattern("x x"); + builder.pattern("x x"); + builder.pattern("xzx"); + builder.unlockedBy("has_item", has(ItemTags.PLANKS)); + }); + } + + private void shaped(Consumer consumer, RegistryObject jungleBarrel, int amount, Consumer recipe) { + Item item = jungleBarrel.get(); + + ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(item, amount); + recipe.accept(builder); + builder.save(consumer, item.getRegistryName()); + } + + private void createSieveRecipes(Consumer consumer) { + sieveRecipe(consumer, "stone_pebble", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.withExtraChances(EItems.STONE_PEBBLE, new float[] {1.0f, 1.0f, 0.5f, 0.5f, 0.1f, 0.1f })); + sieveRecipe(consumer, "wheat_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.WHEAT_SEEDS, 0.7f)); + sieveRecipe(consumer, "beetroot_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.BEETROOT_SEEDS, 0.35f)); + sieveRecipe(consumer, "melon_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.MELON_SEEDS, 0.35f)); + sieveRecipe(consumer, "pumpkin_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.PUMPKIN_SEEDS, 0.35f)); + + //sieveRecipe(consumer, "", Ingredient.of()); + } + + private void createCrucibleRecipes(Consumer consumer) { + lavaCrucible(consumer, "cobblestone", Ingredient.of(Blocks.COBBLESTONE), 250); + lavaCrucible(consumer, "stone", Ingredient.of(Blocks.STONE), 250); + lavaCrucible(consumer, "gravel", Ingredient.of(Blocks.GRAVEL), 250); + lavaCrucible(consumer, "netherrack", Ingredient.of(Blocks.NETHERRACK), 1000); + + waterCrucible(consumer, "sweet_berries", Ingredient.of(Items.SWEET_BERRIES), 50); + waterCrucible(consumer, "melon_slice", Ingredient.of(Items.MELON_SLICE), 50); + + waterCrucible(consumer, "saplings", Ingredient.of(ItemTags.SAPLINGS), 100); + waterCrucible(consumer, "small_flowers", Ingredient.of(ItemTags.SMALL_FLOWERS), 100); + waterCrucible(consumer, "apple", Ingredient.of(Items.APPLE), 100); + + waterCrucible(consumer, "tall_flowers", Ingredient.of(ItemTags.TALL_FLOWERS), 200); + + waterCrucible(consumer, "cactus", Ingredient.of(Items.CACTUS), 250); + waterCrucible(consumer, "pumpkin", Ingredient.of(Items.PUMPKIN), 250); + waterCrucible(consumer, "melon", Ingredient.of(Items.MELON), 250); + waterCrucible(consumer, "leaves", Ingredient.of(ItemTags.LEAVES), 250); + } + + private void createHammerRecipes(Consumer consumer) { + // Cobblestone -> Gravel -> Sand -> Dust + hammerRecipe(consumer, "gravel", Blocks.COBBLESTONE, new Reward(Blocks.GRAVEL)); + hammerRecipe(consumer, "sand", Blocks.GRAVEL, new Reward(Blocks.SAND)); + hammerRecipe(consumer, "dust", Blocks.SAND, new Reward(EBlocks.DUST.get())); + + hammerRecipe(consumer, "crushed_netherrack", Blocks.NETHERRACK, new Reward(EBlocks.CRUSHED_NETHERRACK.get())); + + hammerRecipe(consumer, "crushing_sandstone", Ingredient.of(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), ImmutableList.of(new Reward(Items.SAND))); + hammerRecipe(consumer, "crushing_red_sandstone", Ingredient.of(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), ImmutableList.of(new Reward(Items.RED_SAND))); + hammerRecipe(consumer, "crushing_stone_bricks", Items.STONE_BRICKS, new Reward(Items.CRACKED_STONE_BRICKS)); + + hammerRecipe(consumer, "stone_pebbles", + Ingredient.of(Items.STONE, Items.CRACKED_STONE_BRICKS), + Reward.withExtraChances(EItems.STONE_PEBBLE, new float[] { 0.75f, 0.75f, 0.5f, 0.25f, 0.05f })); + } + + private void createBarrelCompostRecipes(Consumer consumer) { + barrelCompost(consumer, "melon_slice", Ingredient.of(Items.MELON_SLICE), 40); + barrelCompost(consumer, "kelp", Ingredient.of(Items.DRIED_KELP, Items.KELP), 40); + barrelCompost(consumer, "silk_worms", Ingredient.of(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get()), 40); + + barrelCompost(consumer, "seeds", Ingredient.of(Tags.Items.SEEDS), 80); + barrelCompost(consumer, "seagrass", Ingredient.of(Items.SEAGRASS), 80); + barrelCompost(consumer, "sweet_berries", Ingredient.of(Items.SWEET_BERRIES), 80); + barrelCompost(consumer, "wheat", Ingredient.of(Tags.Items.CROPS_WHEAT), 80); + barrelCompost(consumer, "spider_eye", Ingredient.of(Items.SPIDER_EYE), 80); + + barrelCompost(consumer, "apple", Ingredient.of(Items.APPLE), 100); + barrelCompost(consumer, "small_flowers", Ingredient.of(ItemTags.SMALL_FLOWERS), 100); + barrelCompost(consumer, "cookie", Ingredient.of(Items.COOKIE), 100); + barrelCompost(consumer, "nether_wart", Ingredient.of(Items.NETHER_WART), 100); + barrelCompost(consumer, "mushrooms", Ingredient.of(Tags.Items.MUSHROOMS), 100); + + barrelCompost(consumer, "saplings", Ingredient.of(ItemTags.SAPLINGS), 125); + barrelCompost(consumer, "leaves", Ingredient.of(ItemTags.LEAVES), 125); + barrelCompost(consumer, "bread", Ingredient.of(Items.BREAD), 125); + + barrelCompost(consumer, "tall_flowers", Ingredient.of(ItemTags.TALL_FLOWERS), 150); + barrelCompost(consumer, "pumpkin_pie", Ingredient.of(Items.PUMPKIN_PIE), 150); + + barrelCompost(consumer, "melon", Ingredient.of(Items.MELON), 200); + barrelCompost(consumer, "pumpkin", Ingredient.of(Items.PUMPKIN), 200); + } + + private void lavaCrucible(Consumer consumer, String id, Ingredient ingredient, int volume) { + consumer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExNihiloReborn.ID, "lava_crucible/" + id), ERecipeSerializers.LAVA_CRUCIBLE.get(), ingredient, Fluids.LAVA, volume)); + } + + private void waterCrucible(Consumer consumer, String id, Ingredient ingredient, int volume) { + consumer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExNihiloReborn.ID, "water_crucible/" + id), ERecipeSerializers.WATER_CRUCIBLE.get(), ingredient, Fluids.WATER, volume)); + } + + private void barrelCompost(Consumer consumer, String id, Ingredient ingredient, int volume) { + consumer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExNihiloReborn.ID, "barrel_compost/" + id), ingredient, volume)); + } + + private void hammerRecipe(Consumer consumer, String name, Ingredient block, ImmutableList rewards) { + consumer.accept(new FinishedHammerRecipe(ERecipeSerializers.HAMMER.get(), new ResourceLocation(ExNihiloReborn.ID, "hammer/" + name), block, rewards)); + } + + private void hammerRecipe(Consumer consumer, String name, IItemProvider block, Reward... rewards) { + hammerRecipe(consumer, name, Ingredient.of(block), ImmutableList.builder().add(rewards).build()); + } + + private void hammerRecipe(Consumer consumer, ITag.INamedTag tag, Reward rewards) { + consumer.accept(new FinishedHammerRecipe(ERecipeSerializers.HAMMER.get(), new ResourceLocation(ExNihiloReborn.ID, tag.getName().getPath() + "_to_" + rewards.getItem().getItem().getRegistryName().getPath()), Ingredient.of(tag), ImmutableList.of(rewards))); + } + + private void compressedHammerRecipe(Consumer consumer, String name, Ingredient block, ImmutableList rewards) { + consumer.accept(new FinishedHammerRecipe(ERecipeSerializers.COMPRESSED_HAMMER.get(), new ResourceLocation(ExNihiloReborn.ID, "compressed_hammer/" + name), block, rewards)); + } + + private void sieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, ImmutableList rewards) { + consumer.accept(new FinishedSieveRecipe(ERecipeSerializers.SIEVE.get(), new ResourceLocation(ExNihiloReborn.ID, "sieve/" + name), mesh.get(), block, rewards)); + } + + private void sieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, Reward rewards) { + consumer.accept(new FinishedSieveRecipe(ERecipeSerializers.SIEVE.get(), new ResourceLocation(ExNihiloReborn.ID, "sieve/" + name), mesh.get(), block, ImmutableList.of(rewards))); + } + + private void compressedSieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, ImmutableList rewards) { + consumer.accept(new FinishedSieveRecipe(ERecipeSerializers.COMPRESSED_SIEVE.get(), new ResourceLocation(ExNihiloReborn.ID, "compressed_sieve/" + name), mesh.get(), block, rewards)); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluidType.java b/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluidType.java new file mode 100644 index 00000000..08a94c6d --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluidType.java @@ -0,0 +1,60 @@ +package thedarkcolour.exnihiloreborn.fluid; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EFluids; + +import java.util.function.Consumer; + +public class WitchWaterFluidType extends FluidType { + private static final ResourceLocation STILL_TEXTURE = new ResourceLocation(ExNihiloReborn.ID, "block/witch_water_still"); + private static final ResourceLocation FLOWING_TEXTURE = new ResourceLocation(ExNihiloReborn.ID, "block/witch_water_flowing"); + private static final ResourceLocation OVERLAY_TEXTURE = new ResourceLocation("block/water_overlay"); + + public WitchWaterFluidType() { + super(FluidType.Properties.create()); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return IClientFluidTypeExtensions.super.getStillTexture(); + } + + @Override + public ResourceLocation getFlowingTexture() { + return IClientFluidTypeExtensions.super.getFlowingTexture(); + } + + @Override + public @Nullable ResourceLocation getOverlayTexture() { + return IClientFluidTypeExtensions.super.getOverlayTexture(); + } + }); + } + + /*, FluidAttributes.builder(STILL_TEXTURE, FLOWING_TEXTURE) + .color(0xff551ec6) + .translationKey("block." + ExNihiloReborn.ID + ".witch_water") + .sound(SoundEvents.BUCKET_FILL, SoundEvents.BUCKET_EMPTY) + .overlay(new ResourceLocation("block/water_overlay")) + ).block(EBlocks.WITCH_WATER).bucket(EItems.WITCH_WATER_BUCKET);*/ + + public static class Flowing extends ForgeFlowingFluid.Flowing { + public Flowing() { + super(new ForgeFlowingFluid.Properties(EFluids.WITCH_WATER, EFluids.WITCH_WATER_STILL, EFluids.WITCH_WATER_FLOWING)); + } + } + + public static class Source extends ForgeFlowingFluid.Source { + public Source() { + super(new ForgeFlowingFluid.Properties(EFluids.WITCH_WATER, EFluids.WITCH_WATER_STILL, EFluids.WITCH_WATER_FLOWING)); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/CrookItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/CrookItem.java new file mode 100644 index 00000000..1a1db901 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/CrookItem.java @@ -0,0 +1,48 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.common.Tags; +import thedarkcolour.exnihiloreborn.registry.EItems; + +// Silk worms have a 1 in 100 chance to drop from regular leaves, 1 in 15 if the block is infested +// Infested leaves have a 1 in 4 * progress to drop 1 string +// Infested leaves have a 1 in 16 * progress to drop another string +public class CrookItem extends Item { + public CrookItem(Properties properties) { + super(properties); + } + + @Override + public boolean isValidRepairItem(ItemStack tool, ItemStack material) { + if (this == EItems.BONE_CROOK.get()) { + return material.getItem().is(Tags.Items.BONES); + } else { + return material.getItem().is(ItemTags.PLANKS); + } + } + + // Pulls the entity towards the player like a cartoon hook + @Override + public ActionResultType interactLivingEntity(ItemStack stack, PlayerEntity playerIn, LivingEntity living, Hand hand) { + Vector3d difference = playerIn.position().subtract(living.position()); + double distance = Math.sqrt(Entity.getHorizontalDistanceSqr(difference)); + + double scalarX = difference.x / distance; + double scalarZ = difference.z / distance; + + double dx = scalarX * 1.5; + double dz = scalarZ * 1.5; + + living.setDeltaMovement(living.getDeltaMovement().add(dx, 0.0, dz)); + + return ActionResultType.SUCCESS; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/EItemTags.java b/src/main/java/thedarkcolour/exnihiloreborn/item/EItemTags.java new file mode 100644 index 00000000..41412dab --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/EItemTags.java @@ -0,0 +1,16 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.item.Item; +import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; + +public class EItemTags { + public static final ITag.INamedTag CROOKS = tag("crooks"); + public static final ITag.INamedTag HAMMERS = tag("hammers"); + public static final ITag.INamedTag COMPRESSED_HAMMERS = tag("compressed_hammers"); + + public static ITag.INamedTag tag(String name) { + return ItemTags.bind(ExNihiloReborn.ID + ":" + name); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/ETab.java b/src/main/java/thedarkcolour/exnihiloreborn/item/ETab.java new file mode 100644 index 00000000..d5337c7e --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/ETab.java @@ -0,0 +1,19 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EItems; + +public final class ETab extends ItemGroup { + public static final ETab INSTANCE = new ETab(); + + private ETab() { + super(ExNihiloReborn.ID); + } + + @Override + public ItemStack makeIcon() { + return new ItemStack(EItems.CROOK.get()); + } +} \ No newline at end of file diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/FluidBucketItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/FluidBucketItem.java new file mode 100644 index 00000000..332d53bf --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/FluidBucketItem.java @@ -0,0 +1,20 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper; + +import javax.annotation.Nullable; + +public class FluidBucketItem extends Item { + public FluidBucketItem(Properties properties) { + super(properties); + } + + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { + return new FluidBucketWrapper(stack); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java new file mode 100644 index 00000000..c087d20e --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java @@ -0,0 +1,32 @@ +package thedarkcolour.exnihiloreborn.item; + +import com.google.common.collect.Sets; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.item.IItemTier; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ToolItem; +import thedarkcolour.exnihiloreborn.registry.EItems; + +import java.util.Set; + +public class HammerItem extends ToolItem { + public static final Set EFFECTIVE_ON = Sets.newHashSet( + Blocks.COBBLESTONE, + Blocks.GRAVEL, + Blocks.SAND, + Blocks.SANDSTONE, Blocks.CUT_SANDSTONE, Blocks.CHISELED_SANDSTONE, Blocks.SMOOTH_SANDSTONE, + Blocks.RED_SANDSTONE, Blocks.CUT_RED_SANDSTONE, Blocks.CHISELED_RED_SANDSTONE, Blocks.SMOOTH_RED_SANDSTONE, + Blocks.STONE_BRICKS, + Blocks.CRACKED_STONE_BRICKS, Blocks.STONE + ); + + public HammerItem(IItemTier tier, Properties properties) { + super(1.0f, -2.8f, tier, EFFECTIVE_ON, properties); // set is ignored in getDestroySpeed + } + + @Override + public int getBurnTime(ItemStack itemStack) { + return this == EItems.WOODEN_HAMMER.get() ? 200 : 0; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/SilkWormItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/SilkWormItem.java new file mode 100644 index 00000000..811b1e79 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/SilkWormItem.java @@ -0,0 +1,50 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.item.Item; +import net.minecraft.item.ItemUseContext; +import net.minecraft.tags.BlockTags; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; +import thedarkcolour.exnihiloreborn.registry.EBlocks; + +public class SilkWormItem extends Item { + public SilkWormItem(Properties properties) { + super(properties); + } + + @Override + public ActionResultType useOn(ItemUseContext context) { + BlockPos pos = context.getClickedPos(); + World level = context.getLevel(); + BlockState state = level.getBlockState(pos); + + if (!state.isAir()) { + if (state.is(BlockTags.LEAVES)) { + // Replace with infested block + level.setBlock(pos, EBlocks.INFESTED_LEAVES.get().defaultBlockState() + .setValue(LeavesBlock.DISTANCE, state.getValue(LeavesBlock.DISTANCE)) + .setValue(LeavesBlock.PERSISTENT, state.getValue(LeavesBlock.PERSISTENT)), 2); + + // Set mimic + TileEntity te = level.getBlockEntity(pos); + if (te instanceof InfestedLeavesBlockEntity) { + ((InfestedLeavesBlockEntity) te).setMimic(state); + } else { + return ActionResultType.FAIL; + } + + // Decrease item + context.getItemInHand().shrink(1); + + return ActionResultType.sidedSuccess(level.isClientSide); + } + } + + return ActionResultType.FAIL; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/loot/CrookLootModifier.java b/src/main/java/thedarkcolour/exnihiloreborn/loot/CrookLootModifier.java new file mode 100644 index 00000000..19563f38 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/loot/CrookLootModifier.java @@ -0,0 +1,56 @@ +package thedarkcolour.exnihiloreborn.loot; + +import com.google.gson.JsonObject; +import net.minecraft.block.BlockState; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.loot.conditions.ILootCondition; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.loot.GlobalLootModifierSerializer; +import net.minecraftforge.common.loot.LootModifier; +import thedarkcolour.exnihiloreborn.registry.EItems; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Random; + +public class CrookLootModifier extends LootModifier { + private static final float[] SILK_WORM_FORTUNE_CHANCES = new float[] { 0.01f, 0.0111111114f, 0.0125f, 0.016666668f, 0.05f }; + + protected CrookLootModifier(ILootCondition[] conditionsIn) { + super(conditionsIn); + } + + @Nonnull + @Override + protected List doApply(List generatedLoot, LootContext context) { + BlockState state = context.getParamOrNull(LootParameters.BLOCK_STATE); + + if (state.is(BlockTags.LEAVES)) { + Random level = context.getRandom(); + ItemStack stack = context.getParamOrNull(LootParameters.TOOL); + + if (level.nextFloat() < SILK_WORM_FORTUNE_CHANCES[EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, stack)]) { + generatedLoot.add(new ItemStack(EItems.SILK_WORM.get())); + } + } + + return generatedLoot; + } + + public static class Serializer extends GlobalLootModifierSerializer { + @Override + public CrookLootModifier read(ResourceLocation location, JsonObject object, ILootCondition[] conditions) { + return new CrookLootModifier(conditions); + } + + @Override + public JsonObject write(CrookLootModifier instance) { + return makeConditions(instance.conditions); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java b/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java new file mode 100644 index 00000000..fbbed887 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java @@ -0,0 +1,78 @@ +package thedarkcolour.exnihiloreborn.loot; + +import com.google.gson.JsonObject; +import net.minecraft.block.BlockState; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.loot.conditions.ILootCondition; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.loot.GlobalLootModifierSerializer; +import net.minecraftforge.common.loot.LootModifier; +import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import thedarkcolour.exnihiloreborn.recipe.Reward; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; + +public class HammerLootModifier extends LootModifier { + private final IRecipeType type; + + protected HammerLootModifier(ILootCondition[] conditionsIn, IRecipeType type) { + super(conditionsIn); + this.type = type; + } + + @Nonnull + @Override + protected List doApply(List generatedLoot, LootContext context) { + ServerWorld level = context.getLevel(); + Inventory temporaryItem = new Inventory(1); // wrap IInventory + BlockState state = context.getParamOrNull(LootParameters.BLOCK_STATE); + + if (state.getBlock().asItem() != Items.AIR) { + temporaryItem.setItem(0, new ItemStack(state.getBlock().asItem())); + Optional recipe = level.getRecipeManager().getRecipeFor(type, temporaryItem, level); + + if (recipe.isPresent()) { + Random rand = level.random; + ArrayList newLoot = new ArrayList<>(); + + for (Reward reward : recipe.get().getRewards()) { + if (rand.nextFloat() < reward.getChance()) { + newLoot.add(reward.getItem().copy()); + } + } + + return newLoot; + } + } + + return generatedLoot; + } + + public static class Serializer extends GlobalLootModifierSerializer { + private final IRecipeType type; + + public Serializer(IRecipeType type) { + this.type = type; + } + + @Override + public HammerLootModifier read(ResourceLocation location, JsonObject object, ILootCondition[] conditions) { + return new HammerLootModifier(conditions, type); + } + + @Override + public JsonObject write(HammerLootModifier instance) { + return makeConditions(instance.conditions); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/loot/InfestedString.java b/src/main/java/thedarkcolour/exnihiloreborn/loot/InfestedString.java new file mode 100644 index 00000000..09baf97d --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/loot/InfestedString.java @@ -0,0 +1,69 @@ +package thedarkcolour.exnihiloreborn.loot; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootFunction; +import net.minecraft.loot.LootFunctionType; +import net.minecraft.loot.LootParameters; +import net.minecraft.loot.conditions.ILootCondition; +import net.minecraft.tileentity.TileEntity; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; +import thedarkcolour.exnihiloreborn.registry.ELootFunctions; + +import java.util.Random; + +// Sets the correct amount based on the progress of the infested leaves +public class InfestedString extends LootFunction { + protected InfestedString(ILootCondition[] conditions) { + super(conditions); + } + + @Override + protected ItemStack run(ItemStack stack, LootContext context) { + TileEntity te = context.getParamOrNull(LootParameters.BLOCK_ENTITY); + + if (te instanceof InfestedLeavesBlockEntity) { + float progress = ((InfestedLeavesBlockEntity) te).getProgress(); + Random rand = context.getRandom(); + int count = 0; + + if (rand.nextFloat() < progress * 0.4) { + if (rand.nextFloat() < progress * 0.1) { + ++count; + } + ++count; + } + + if (count > 0) { + stack.setCount(count); + return stack; + } + } + + return ItemStack.EMPTY; + } + + @Override + public LootFunctionType getType() { + return ELootFunctions.INFESTED_STRING; + } + + public static LootFunction.Builder infestedString() { + return simpleBuilder(InfestedString::new); + } + + public static class Serializer extends LootFunction.Serializer { + @Override + public void serialize(JsonObject json, InfestedString p_230424_2_, JsonSerializationContext p_230424_3_) { + super.serialize(json, p_230424_2_, p_230424_3_); + } + + @Override + public InfestedString deserialize(JsonObject json, JsonDeserializationContext ctx, ILootCondition[] conditions) { + return new InfestedString(conditions); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/CodecUtil.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/CodecUtil.java new file mode 100644 index 00000000..afabd1d3 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/CodecUtil.java @@ -0,0 +1,25 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.NBTDynamicOps; + +public class CodecUtil { + public static JsonElement encode(Codec codec, T object) { + return codec.encodeStart(JsonOps.INSTANCE, object).result().get(); + } + + public static T decode(Codec codec, JsonElement json) { + return codec.parse(JsonOps.INSTANCE, json).result().get(); + } + + public static INBT encodeNbt(Codec codec, T object) { + return codec.encodeStart(NBTDynamicOps.INSTANCE, object).result().get(); + } + + public static T decodeNbt(Codec codec, INBT json) { + return codec.parse(NBTDynamicOps.INSTANCE, json).result().get(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java new file mode 100644 index 00000000..7a199fab --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java @@ -0,0 +1,71 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Supplier; + +public final class Reward { + public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( + ItemStack.CODEC.fieldOf("item").forGetter(Reward::getItem), + Codec.FLOAT.fieldOf("chance").forGetter(Reward::getChance) + ).apply(builder, Reward::new)); + private final ItemStack item; + private final float chance; + + public Reward(ItemStack item, float chance) { + this.item = item; + this.chance = chance; + } + + public static Reward of(RegistryObject item) { + return of(item, 1.0f); + } + + public static Reward of(RegistryObject item, float chance) { + return new Reward(new ItemStack(item.get()), chance); + } + + public static Reward of(ItemLike item, float chance) { + return new Reward(new ItemStack(item), chance); + } + + public Reward(ItemLike item) { + this(new ItemStack(item), 1.0f); + } + + public static ImmutableList withExtraChances(Supplier supplier, float[] chances) { + Item item = supplier.get(); + ImmutableList.Builder builder = ImmutableList.builder(); + builder.add(new Reward(item)); + + for (float chance : chances) { + builder.add(new Reward(new ItemStack(item), chance)); + } + + return builder.build(); + } + + public ItemStack getItem() { + return item; + } + + public float getChance() { + return chance; + } + + public void toNetwork(FriendlyByteBuf buffer) { + buffer.writeItem(getItem()); + buffer.writeFloat(getChance()); + } + + public static Reward fromNetwork(FriendlyByteBuf buffer) { + return new Reward(buffer.readItem(), buffer.readFloat()); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java new file mode 100644 index 00000000..fa8e90db --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java @@ -0,0 +1,75 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Function3; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; + +import javax.annotation.Nullable; + +public abstract class RewardRecipe extends SingleIngredientRecipe { + private final ImmutableList rewards; + + public RewardRecipe(ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { + super(id, ingredient); + this.rewards = rewards; + } + + public ImmutableList getRewards() { + return rewards; + } + + public static class Serializer implements RecipeSerializer { + private final Function3, T> factory; + + public Serializer(Function3, T> factory) { + this.factory = factory; + } + + @Override + public T fromJson(ResourceLocation name, JsonObject json) { + Ingredient ingredient = readIngredient(json, "ingredient"); + + // Rewards must be a list + JsonArray rewardsJson = GsonHelper.getAsJsonArray(json, "rewards"); + ImmutableList.Builder rewards = ImmutableList.builder(); + + for (JsonElement element : rewardsJson) { + rewards.add(CodecUtil.decode(Reward.CODEC, element)); + } + + return factory.apply(name, ingredient, rewards.build()); + } + + @Nullable + @Override + public T fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { + Ingredient ingredient = Ingredient.fromNetwork(buffer); + ImmutableList.Builder rewards = ImmutableList.builder(); + + for (int i = 0; i < buffer.readVarInt(); i++) { + rewards.add(Reward.fromNetwork(buffer)); + } + + return factory.apply(name, ingredient, rewards.build()); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, T recipe) { + recipe.getIngredient().toNetwork(buffer); + + ImmutableList rewards = recipe.getRewards(); + buffer.writeVarInt(rewards.size()); + + for (Reward reward : rewards) { + reward.toNetwork(buffer); + } + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java new file mode 100644 index 00000000..8dcc96c8 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java @@ -0,0 +1,83 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +/** + * Represents a recipe that does not take place in any screen or container. + *

+ * Has one ingredient by default and just tests off of that. Only the 1st slot + * of any container will be checked, so only one slot should be present. + */ +public abstract class SingleIngredientRecipe implements Recipe { + private final ResourceLocation id; + private final Ingredient ingredient; + + public SingleIngredientRecipe(ResourceLocation id, Ingredient ingredient) { + this.id = id; + this.ingredient = ingredient; + } + + public Ingredient getIngredient() { + return ingredient; + } + + @Override + public boolean matches(Container inventory, Level level) { + return ingredient.test(inventory.getItem(0)); + } + + @Override + public ItemStack assemble(Container pContainer, RegistryAccess pRegistryAccess) { + return ItemStack.EMPTY; + } + + @Override + public RecipeSerializer getSerializer() { + return null; + } + + @Override + public RecipeType getType() { + return null; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public ItemStack getResultItem(RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Deprecated + @Override + public NonNullList getIngredients() { + return NonNullList.create(); + } + + public static Ingredient readIngredient(JsonObject json, String key) { + if (GsonHelper.isArrayNode(json, key)) { + return Ingredient.fromJson(GsonHelper.getAsJsonArray(json, key)); + } else { + return Ingredient.fromJson(GsonHelper.getAsJsonObject(json, key)); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java new file mode 100644 index 00000000..74ea7008 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java @@ -0,0 +1,69 @@ +package thedarkcolour.exnihiloreborn.recipe.barrel; + +import com.google.gson.JsonObject; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.registries.ForgeRegistryEntry; +import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class BarrelCompostRecipe extends SingleIngredientRecipe { + private final int volume; + + public BarrelCompostRecipe(ResourceLocation id, Ingredient ingredient, int volume) { + super(id, ingredient); + + this.volume = volume; + } + + public int getVolume() { + return volume; + } + + @Override + public IRecipeSerializer getSerializer() { + return ERecipeSerializers.BARREL_COMPOST.get(); + } + + @Override + public IRecipeType getType() { + return ERecipeTypes.BARREL_COMPOST; + } + + public static class Serializer extends ForgeRegistryEntry> implements RecipeSerializer { + @Override // Creates the recipe object from a JSON file + public BarrelCompostRecipe fromJson(ResourceLocation name, JsonObject json) { + Ingredient ingredient; + + if (JSONUtils.isArrayNode(json, "ingredient")) { + ingredient = Ingredient.fromJson(JSONUtils.getAsJsonArray(json, "ingredient")); + } else { + ingredient = Ingredient.fromJson(JSONUtils.getAsJsonObject(json, "ingredient")); + } + + int volume = JSONUtils.getAsInt(json, "volume"); + + return new BarrelCompostRecipe(name, ingredient, volume); + } + + @Override + public void toNetwork(PacketBuffer buffer, BarrelCompostRecipe recipe) { + recipe.getIngredient().toNetwork(buffer); + buffer.writeVarInt(recipe.getVolume()); + } + + @Override + public BarrelCompostRecipe fromNetwork(ResourceLocation name, PacketBuffer buffer) { + Ingredient ingredient = Ingredient.fromNetwork(buffer); + int volume = buffer.readVarInt(); + + return new BarrelCompostRecipe(name, ingredient, volume); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java new file mode 100644 index 00000000..20e5a940 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java @@ -0,0 +1,52 @@ +package thedarkcolour.exnihiloreborn.recipe.barrel; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.Advancement; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; + +import javax.annotation.Nullable; + +public class FinishedBarrelCompostRecipe implements IFinishedRecipe { + private final Advancement.Builder advancement = Advancement.Builder.advancement(); + private final ResourceLocation id; + private final Ingredient ingredient; + private final int volume; + + public FinishedBarrelCompostRecipe(ResourceLocation id, Ingredient ingredient, int volume) { + this.id = id; + this.ingredient = ingredient; + this.volume = volume; + } + + @Override + public void serializeRecipeData(JsonObject json) { + json.add("ingredient", ingredient.toJson()); + json.addProperty("volume", volume); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public IRecipeSerializer getType() { + return ERecipeSerializers.BARREL_COMPOST.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java new file mode 100644 index 00000000..dd1a3531 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java @@ -0,0 +1,67 @@ +package thedarkcolour.exnihiloreborn.recipe.crucible; + +import com.google.gson.JsonObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraftforge.fluids.FluidStack; +import thedarkcolour.exnihiloreborn.recipe.CodecUtil; +import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; + +import javax.annotation.Nullable; + +public class CrucibleRecipe extends SingleIngredientRecipe { + private final RecipeType type; + private final FluidStack result; + + public CrucibleRecipe(ResourceLocation id, RecipeType type, Ingredient ingredient, FluidStack result) { + super(id, ingredient); + this.type = type; + this.result = result; + } + + public FluidStack getResult() { + return result; + } + + @Override + public RecipeSerializer getSerializer() { + return ERecipeSerializers.LAVA_CRUCIBLE.get(); + } + + @Override + public RecipeType getType() { + return type; + } + + public static class Serializer implements RecipeSerializer { + private final RecipeType type; + + public Serializer(RecipeType type) { + this.type = type; + } + + @Override + public CrucibleRecipe fromJson(ResourceLocation id, JsonObject json) { + Ingredient ingredient = readIngredient(json, "ingredient"); + FluidStack stack = CodecUtil.decode(FluidStack.CODEC, json.get("fluid")); + + return new CrucibleRecipe(id, type, ingredient, stack); + } + + @Nullable + @Override + public CrucibleRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + return new CrucibleRecipe(id, type, Ingredient.fromNetwork(buffer), FluidStack.readFromPacket(buffer)); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, CrucibleRecipe recipe) { + recipe.getIngredient().toNetwork(buffer); + recipe.getResult().writeToPacket(buffer); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java new file mode 100644 index 00000000..62753acc --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java @@ -0,0 +1,59 @@ +package thedarkcolour.exnihiloreborn.recipe.crucible; + +import com.google.gson.JsonObject; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import thedarkcolour.exnihiloreborn.recipe.CodecUtil; + +import javax.annotation.Nullable; + +public class FinishedCrucibleRecipe implements IFinishedRecipe { + private final ResourceLocation id; + private final IRecipeSerializer serializer; + private final Ingredient ingredient; + private final FluidStack fluidStack; + + public FinishedCrucibleRecipe(ResourceLocation id, IRecipeSerializer serializer, Ingredient ingredient, Fluid fluid, int amount) { + this(id, serializer, ingredient, new FluidStack(fluid, amount)); + } + + public FinishedCrucibleRecipe(ResourceLocation id, IRecipeSerializer serializer, Ingredient ingredient, FluidStack fluidStack) { + this.id = id; + this.serializer = serializer; + this.ingredient = ingredient; + this.fluidStack = fluidStack; + } + + + @Override + public void serializeRecipeData(JsonObject json) { + json.add("ingredient", ingredient.toJson()); + json.add("fluid", CodecUtil.encode(FluidStack.CODEC, fluidStack)); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public IRecipeSerializer getType() { + return serializer; + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/CompressedHammerRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/CompressedHammerRecipe.java new file mode 100644 index 00000000..b4d56814 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/CompressedHammerRecipe.java @@ -0,0 +1,28 @@ +package thedarkcolour.exnihiloreborn.recipe.hammer; + +import com.google.common.collect.ImmutableList; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class CompressedHammerRecipe extends RewardRecipe { + public CompressedHammerRecipe(ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { + super(id, ingredient, rewards); + } + + @Override + public IRecipeSerializer getSerializer() { + return ERecipeSerializers.COMPRESSED_HAMMER.get(); + } + + @Override + public IRecipeType getType() { + return ERecipeTypes.COMPRESSED_HAMMER; + } +} + diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java new file mode 100644 index 00000000..4375077e --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java @@ -0,0 +1,64 @@ +package thedarkcolour.exnihiloreborn.recipe.hammer; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.recipe.CodecUtil; +import thedarkcolour.exnihiloreborn.recipe.Reward; + +import javax.annotation.Nullable; + +public class FinishedHammerRecipe implements IFinishedRecipe { + private final ResourceLocation id; + private final Ingredient ingredient; + private final ImmutableList rewards; + private final IRecipeSerializer serializer; + + public FinishedHammerRecipe(IRecipeSerializer serializer, ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { + this.serializer = serializer; + this.id = id; + this.ingredient = ingredient; + this.rewards = rewards; + } + + @Override + public void serializeRecipeData(JsonObject object) { + object.add("ingredient", ingredient.toJson()); + + JsonArray rewardsJson = new JsonArray(); + + for (Reward reward : rewards) { + rewardsJson.add(CodecUtil.encode(Reward.CODEC, reward)); + } + + object.add("rewards", rewardsJson); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public IRecipeSerializer getType() { + return serializer; + } + + // We don't need an achievement cause this is basically a simplified loot table + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java new file mode 100644 index 00000000..19580ef0 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java @@ -0,0 +1,27 @@ +package thedarkcolour.exnihiloreborn.recipe.hammer; + +import com.google.common.collect.ImmutableList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class HammerRecipe extends RewardRecipe { + public HammerRecipe(ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { + super(id, ingredient, rewards); + } + + @Override + public RecipeSerializer getSerializer() { + return ERecipeSerializers.HAMMER.get(); + } + + @Override + public RecipeType getType() { + return ERecipeTypes.HAMMER; + } +} \ No newline at end of file diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/AbstractSieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/AbstractSieveRecipe.java new file mode 100644 index 00000000..1cb06982 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/AbstractSieveRecipe.java @@ -0,0 +1,84 @@ +package thedarkcolour.exnihiloreborn.recipe.sieve; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Function4; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.recipe.CodecUtil; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; + +import javax.annotation.Nullable; + +public abstract class AbstractSieveRecipe extends RewardRecipe { + public final Item mesh; + + public AbstractSieveRecipe(ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { + super(id, ingredient, rewards); + this.mesh = mesh; + } + + public boolean test(Item mesh, ItemStack item) { + return this.mesh == mesh && getIngredient().test(item); + } + + public static class Serializer implements RecipeSerializer { + private final Function4, T> factory; + + public Serializer(Function4, T> factory) { + this.factory = factory; + } + + @Override + public T fromJson(ResourceLocation name, JsonObject json) { + Item mesh = ForgeRegistries.ITEMS.getValue(new ResourceLocation(GsonHelper.getAsString(json, "mesh"))); + Ingredient ingredient = readIngredient(json, "ingredient"); + + // Rewards must be a list + JsonArray rewardsJson = GsonHelper.getAsJsonArray(json, "rewards"); + ImmutableList.Builder rewards = ImmutableList.builder(); + + for (JsonElement element : rewardsJson) { + rewards.add(CodecUtil.decode(Reward.CODEC, element)); + } + + return factory.apply(name, mesh, ingredient, rewards.build()); + } + + @Nullable + @Override + public T fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { + var mesh = buffer.readRegistryIdUnsafe(ForgeRegistries.ITEMS); + var ingredient = Ingredient.fromNetwork(buffer); + var rewards = ImmutableList.builder(); + + for (int i = 0; i < buffer.readVarInt(); i++) { + rewards.add(Reward.fromNetwork(buffer)); + } + + return factory.apply(name, mesh, ingredient, rewards.build()); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, T recipe) { + buffer.writeRegistryIdUnsafe(ForgeRegistries.ITEMS, recipe.mesh); + recipe.getIngredient().toNetwork(buffer); + + ImmutableList rewards = recipe.getRewards(); + buffer.writeVarInt(rewards.size()); + + for (Reward reward : rewards) { + reward.toNetwork(buffer); + } + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/CompressedSieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/CompressedSieveRecipe.java new file mode 100644 index 00000000..a7757be3 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/CompressedSieveRecipe.java @@ -0,0 +1,27 @@ +package thedarkcolour.exnihiloreborn.recipe.sieve; + +import com.google.common.collect.ImmutableList; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class CompressedSieveRecipe extends AbstractSieveRecipe { + public CompressedSieveRecipe(ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { + super(id, mesh, ingredient, rewards); + } + + @Override + public IRecipeSerializer getSerializer() { + return ERecipeSerializers.COMPRESSED_SIEVE.get(); + } + + @Override + public IRecipeType getType() { + return ERecipeTypes.COMPRESSED_SIEVE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java new file mode 100644 index 00000000..48c9902e --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java @@ -0,0 +1,69 @@ +package thedarkcolour.exnihiloreborn.recipe.sieve; + +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.recipe.CodecUtil; +import thedarkcolour.exnihiloreborn.recipe.Reward; + +import javax.annotation.Nullable; + +public class FinishedSieveRecipe implements IFinishedRecipe { + private final ResourceLocation id; + private final Item mesh; + private final Ingredient ingredient; + private final ImmutableList rewards; + private final IRecipeSerializer serializer; + + public FinishedSieveRecipe(IRecipeSerializer serializer, ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { + this.serializer = serializer; + this.id = id; + this.mesh = mesh; + this.ingredient = ingredient; + this.rewards = rewards; + } + + @Override + public void serializeRecipeData(JsonObject object) { + object.addProperty("mesh", ForgeRegistries.ITEMS.getKey(mesh).toString()); + object.add("ingredient", ingredient.toJson()); + + JsonArray rewardsJson = new JsonArray(); + + for (Reward reward : rewards) { + rewardsJson.add(CodecUtil.encode(Reward.CODEC, reward)); + } + + object.add("rewards", rewardsJson); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public IRecipeSerializer getType() { + return serializer; + } + + // We don't need an achievement cause this is basically a simplified loot table + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java new file mode 100644 index 00000000..b0c9e565 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java @@ -0,0 +1,27 @@ +package thedarkcolour.exnihiloreborn.recipe.sieve; + +import com.google.common.collect.ImmutableList; +import net.minecraft.item.Item; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class SieveRecipe extends AbstractSieveRecipe { + public SieveRecipe(ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { + super(id, mesh, ingredient, rewards); + } + + @Override + public IRecipeSerializer getSerializer() { + return ERecipeSerializers.SIEVE.get(); + } + + @Override + public IRecipeType getType() { + return ERecipeTypes.SIEVE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlockEntities.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlockEntities.java new file mode 100644 index 00000000..b07477a8 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlockEntities.java @@ -0,0 +1,51 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.LavaCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.SieveBlockEntity; +import thedarkcolour.exnihiloreborn.blockentity.WaterCrucibleBlockEntity; + +public class EBlockEntities { + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, ExNihiloReborn.ID); + + public static final RegistryObject> INFESTED_LEAVES = BLOCK_ENTITIES.register("infested_leaves", () -> BlockEntityType.Builder.of(InfestedLeavesBlockEntity::new, EBlocks.INFESTED_LEAVES.get()).build(null)); + public static final RegistryObject> LAVA_CRUCIBLE = BLOCK_ENTITIES.register("lava_crucible", () -> BlockEntityType.Builder.of(LavaCrucibleBlockEntity::new, + EBlocks.WARPED_CRUCIBLE.get(), + EBlocks.CRIMSON_CRUCIBLE.get(), + EBlocks.PORCELAIN_CRUCIBLE.get()).build(null)); + public static final RegistryObject> WATER_CRUCIBLE = BLOCK_ENTITIES.register("water_crucible", () -> BlockEntityType.Builder.of(WaterCrucibleBlockEntity::new, + EBlocks.OAK_CRUCIBLE.get(), + EBlocks.SPRUCE_CRUCIBLE.get(), + EBlocks.BIRCH_CRUCIBLE.get(), + EBlocks.JUNGLE_CRUCIBLE.get(), + EBlocks.ACACIA_CRUCIBLE.get(), + EBlocks.DARK_OAK_CRUCIBLE.get()).build(null)); + public static final RegistryObject> BARREL = BLOCK_ENTITIES.register("barrel", () -> BlockEntityType.Builder.of(BarrelBlockEntity::new, + EBlocks.OAK_BARREL.get(), + EBlocks.SPRUCE_BARREL.get(), + EBlocks.BIRCH_BARREL.get(), + EBlocks.JUNGLE_BARREL.get(), + EBlocks.ACACIA_BARREL.get(), + EBlocks.DARK_OAK_BARREL.get(), + EBlocks.CRIMSON_BARREL.get(), + EBlocks.WARPED_BARREL.get(), + EBlocks.STONE_BARREL.get()).build(null)); + public static final RegistryObject> SIEVE = BLOCK_ENTITIES.register("sieve", () -> BlockEntityType.Builder.of(SieveBlockEntity::new, + EBlocks.OAK_SIEVE.get(), + EBlocks.SPRUCE_SIEVE.get(), + EBlocks.BIRCH_SIEVE.get(), + EBlocks.JUNGLE_SIEVE.get(), + EBlocks.ACACIA_SIEVE.get(), + EBlocks.DARK_OAK_SIEVE.get(), + EBlocks.CRIMSON_SIEVE.get(), + EBlocks.WARPED_SIEVE.get() + ).build(null)); +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java new file mode 100644 index 00000000..7cf8f79b --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java @@ -0,0 +1,111 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.block.BarrelBlock; +import thedarkcolour.exnihiloreborn.block.HeavySieveBlock; +import thedarkcolour.exnihiloreborn.block.InfestedLeavesBlock; +import thedarkcolour.exnihiloreborn.block.LavaCrucibleBlock; +import thedarkcolour.exnihiloreborn.block.SieveBlock; +import thedarkcolour.exnihiloreborn.block.UnfiredCrucibleBlock; +import thedarkcolour.exnihiloreborn.block.WaterCrucibleBlock; + +import static net.minecraft.world.level.block.state.BlockBehaviour.Properties.of; + +public class EBlocks { + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ExNihiloReborn.ID); + + // Materials + public static final RegistryObject DUST = BLOCKS.register("dust", () -> new Block(of().sound(SoundType.WOOL).strength(0.4f))); + public static final RegistryObject CRUSHED_NETHERRACK = BLOCKS.register("crushed_netherrack", () -> new Block(of().sound(SoundType.WOOL).strength(0.6f))); + public static final RegistryObject CRUSHED_END_STONE = BLOCKS.register("crushed_end_stone", () -> new Block(of().sound(SoundType.WOOL).strength(0.6f))); + + // Compressed Blocks + public static final RegistryObject COMPRESSED_COBBLESTONE = BLOCKS.register("compressed_cobblestone", () -> new Block(Block.Properties.copy(Blocks.STONE))); + public static final RegistryObject COMPRESSED_DIRT = BLOCKS.register("compressed_dirt", () -> new Block(Block.Properties.copy(Blocks.DIRT))); + public static final RegistryObject COMPRESSED_SAND = BLOCKS.register("compressed_sand", () -> new Block(Block.Properties.copy(Blocks.SAND))); + public static final RegistryObject COMPRESSED_DUST = BLOCKS.register("compressed_dust", () -> new Block(Block.Properties.copy(DUST.get()))); + public static final RegistryObject COMPRESSED_CRUSHED_NETHERRACK = BLOCKS.register("compressed_crushed_netherrack", () -> new Block(Block.Properties.copy(CRUSHED_NETHERRACK.get()))); + public static final RegistryObject COMPRESSED_CRUSHED_END_STONE = BLOCKS.register("compressed_crushed_end_stone", () -> new Block(Block.Properties.copy(CRUSHED_END_STONE.get()))); + + // Barrels + public static final RegistryObject OAK_BARREL = registerBarrel("oak_barrel", false); + public static final RegistryObject SPRUCE_BARREL = registerBarrel("spruce_barrel", false); + public static final RegistryObject BIRCH_BARREL = registerBarrel("birch_barrel", false); + public static final RegistryObject JUNGLE_BARREL = registerBarrel("jungle_barrel", false); + public static final RegistryObject ACACIA_BARREL = registerBarrel("acacia_barrel", false); + public static final RegistryObject DARK_OAK_BARREL = registerBarrel("dark_oak_barrel", false); + public static final RegistryObject CRIMSON_BARREL = registerBarrel("crimson_barrel", false); + public static final RegistryObject WARPED_BARREL = registerBarrel("warped_barrel", false); + public static final RegistryObject STONE_BARREL = registerBarrel("stone_barrel", true); + + // Sieves + public static final RegistryObject OAK_SIEVE = registerSieve("oak_sieve"); + public static final RegistryObject SPRUCE_SIEVE = registerSieve("spruce_sieve"); + public static final RegistryObject BIRCH_SIEVE = registerSieve("birch_sieve"); + public static final RegistryObject JUNGLE_SIEVE = registerSieve("jungle_sieve"); + public static final RegistryObject ACACIA_SIEVE = registerSieve("acacia_sieve"); + public static final RegistryObject DARK_OAK_SIEVE = registerSieve("dark_oak_sieve"); + public static final RegistryObject CRIMSON_SIEVE = registerSieve("crimson_sieve"); + public static final RegistryObject WARPED_SIEVE = registerSieve("warped_sieve"); + + // Compressed Sieves + //public static final RegistryObject HEAVY_OAK_SIEVE = registerHeavySieve("heavy_oak_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_SPRUCE_SIEVE = registerHeavySieve("heavy_spruce_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_BIRCH_SIEVE = registerHeavySieve("heavy_birch_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_JUNGLE_SIEVE = registerHeavySieve("heavy_jungle_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_ACACIA_SIEVE = registerHeavySieve("heavy_acacia_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_DARK_OAK_SIEVE = registerHeavySieve("heavy_dark_oak_sieve", Material.WOOD); + //public static final RegistryObject HEAVY_CRIMSON_SIEVE = registerHeavySieve("heavy_crimson_sieve", Material.NETHER_WOOD); + //public static final RegistryObject HEAVY_WARPED_SIEVE = registerHeavySieve("heavy_warped_sieve", Material.NETHER_WOOD); + + // Lava Crucibles + public static final RegistryObject PORCELAIN_CRUCIBLE = registerLavaCrucible("porcelain_crucible", false); + public static final RegistryObject WARPED_CRUCIBLE = registerLavaCrucible("warped_crucible", true); + public static final RegistryObject CRIMSON_CRUCIBLE = registerLavaCrucible("crimson_crucible", true); + public static final RegistryObject UNFIRED_CRUCIBLE = BLOCKS.register("unfired_crucible", () -> new UnfiredCrucibleBlock(of(Material.STONE).strength(2.0f).harvestTool(ToolType.PICKAXE))); + + // Water Crucibles + public static final RegistryObject OAK_CRUCIBLE = registerWaterCrucible("oak_crucible"); + public static final RegistryObject SPRUCE_CRUCIBLE = registerWaterCrucible("spruce_crucible"); + public static final RegistryObject BIRCH_CRUCIBLE = registerWaterCrucible("birch_crucible"); + public static final RegistryObject JUNGLE_CRUCIBLE = registerWaterCrucible("jungle_crucible"); + public static final RegistryObject ACACIA_CRUCIBLE = registerWaterCrucible("acacia_crucible"); + public static final RegistryObject DARK_OAK_CRUCIBLE = registerWaterCrucible("dark_oak_crucible"); + + // Misc + public static final RegistryObject INFESTED_LEAVES = BLOCKS.register("infested_leaves", () -> new InfestedLeavesBlock(AbstractBlock.Properties.copy(Blocks.OAK_LEAVES))); + public static final RegistryObject WITCH_WATER = BLOCKS.register("witch_water", () -> new FlowingFluidBlock(EFluids.WITCH_WATER, AbstractBlock.Properties.of(Material.WATER).noCollission().strength(100.0F).noDrops())); + + public static RegistryObject registerSieve(String name) { + return BLOCKS.register(name, () -> new SieveBlock(of().strength(2.0f).noOcclusion().sound(SoundType.WOOD))); + } + + public static RegistryObject registerHeavySieve(String name) { + return BLOCKS.register(name, () -> new HeavySieveBlock(of(material).strength(2.0f).sound(SoundType.WOOD))); + } + + public static RegistryObject registerBarrel(String name, boolean stone) { + return BLOCKS.register(name, () -> new BarrelBlock(of(material).noOcclusion().strength(stone ? 4.0f : 2.0f).sound(stone ? SoundType.STONE : SoundType.WOOD))); + } + + public static RegistryObject registerLavaCrucible(String name, boolean stem) { + return BLOCKS.register(name, () -> { + var props = of().noOcclusion().strength(stem ? 1.5f : 2.0f).sound(stem ? SoundType.STEM : SoundType.STONE); + if (!stem) { + props.requiresCorrectToolForDrops(); + } + return new LavaCrucibleBlock(props); + }); + } + + public static RegistryObject registerWaterCrucible(String name) { + return BLOCKS.register(name, () -> new WaterCrucibleBlock(of(Material.WOOD).strength(1.5f).harvestTool(ToolType.AXE).sound(SoundType.WOOD))); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java new file mode 100644 index 00000000..64ff742c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java @@ -0,0 +1,19 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.fluid.WitchWaterFluidType; + +public class EFluids { + public static final DeferredRegister FLUID_TYPES = DeferredRegister.create(ForgeRegistries.FLUID_TYPES, ExNihiloReborn.ID); + public static final DeferredRegister FLUIDS = DeferredRegister.create(ForgeRegistries.FLUIDS, ExNihiloReborn.ID); + + public static final RegistryObject WITCH_WATER = FLUID_TYPES.register("witch_water", () -> new WitchWaterFluidType()); + + public static final RegistryObject WITCH_WATER_STILL = FLUIDS.register("witch_water", WitchWaterFluidType.Source::new); + public static final RegistryObject WITCH_WATER_FLOWING = FLUIDS.register("flowing_witch_water", WitchWaterFluidType.Flowing::new); +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java new file mode 100644 index 00000000..9c400644 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java @@ -0,0 +1,183 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.item.CrookItem; +import thedarkcolour.exnihiloreborn.item.ETab; +import thedarkcolour.exnihiloreborn.item.FluidBucketItem; +import thedarkcolour.exnihiloreborn.item.HammerItem; +import thedarkcolour.exnihiloreborn.item.SilkWormItem; + +public class EItems { + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ExNihiloReborn.ID); + + // Silk Worm + public static final RegistryObject SILK_WORM = ITEMS.register("silk_worm", () -> new SilkWormItem(props())); + public static final RegistryObject COOKED_SILK_WORM = ITEMS.register("cooked_silk_worm", () -> new Item(props().food(new Food.Builder().nutrition(2).saturationMod(0.6f).build()))); + + // Crooks + public static final RegistryObject CROOK = ITEMS.register("crook", () -> new CrookItem(props().durability(64))); + public static final RegistryObject COMPRESSED_CROOK = ITEMS.register("compressed_crook", () -> new CrookItem(props().durability(192))); + public static final RegistryObject BONE_CROOK = ITEMS.register("bone_crook", () -> new CrookItem(props().durability(256))); + + // Sieve Meshes + public static final RegistryObject STRING_MESH = ITEMS.register("string_mesh", () -> new Item(props().stacksTo(1))); + public static final RegistryObject FLINT_MESH = ITEMS.register("flint_mesh", () -> new Item(props().stacksTo(1))); + public static final RegistryObject IRON_MESH = ITEMS.register("iron_mesh", () -> new Item(props().stacksTo(1))); + public static final RegistryObject DIAMOND_MESH = ITEMS.register("diamond_mesh", () -> new Item(props().stacksTo(1))); + public static final RegistryObject NETHERITE_MESH = ITEMS.register("netherite_mesh", () -> new Item(props().stacksTo(1))); + + // Hammers + public static final RegistryObject WOODEN_HAMMER = ITEMS.register("wooden_hammer", () -> new HammerItem(ItemTier.WOOD, props())); + public static final RegistryObject STONE_HAMMER = ITEMS.register("stone_hammer", () -> new HammerItem(ItemTier.STONE, props())); + public static final RegistryObject GOLDEN_HAMMER = ITEMS.register("golden_hammer", () -> new HammerItem(ItemTier.GOLD, props())); + public static final RegistryObject IRON_HAMMER = ITEMS.register("iron_hammer", () -> new HammerItem(ItemTier.IRON, props())); + public static final RegistryObject DIAMOND_HAMMER = ITEMS.register("diamond_hammer", () -> new HammerItem(ItemTier.DIAMOND, props())); + public static final RegistryObject NETHERITE_HAMMER = ITEMS.register("netherite_hammer", () -> new HammerItem(ItemTier.NETHERITE, props())); + + // Compressed Hammers + public static final RegistryObject COMPRESSED_WOODEN_HAMMER = ITEMS.register("compressed_wooden_hammer", () -> new HammerItem(ItemTier.WOOD, props())); + public static final RegistryObject COMPRESSED_STONE_HAMMER = ITEMS.register("compressed_stone_hammer", () -> new HammerItem(ItemTier.STONE, props())); + public static final RegistryObject COMPRESSED_GOLDEN_HAMMER = ITEMS.register("compressed_golden_hammer", () -> new HammerItem(ItemTier.GOLD, props())); + public static final RegistryObject COMPRESSED_IRON_HAMMER = ITEMS.register("compressed_iron_hammer", () -> new HammerItem(ItemTier.IRON, props())); + public static final RegistryObject COMPRESSED_DIAMOND_HAMMER = ITEMS.register("compressed_diamond_hammer", () -> new HammerItem(ItemTier.DIAMOND, props())); + public static final RegistryObject COMPRESSED_NETHERITE_HAMMER = ITEMS.register("compressed_netherite_hammer", () -> new HammerItem(ItemTier.NETHERITE, props())); + + // Ore Pieces todo re evaluate + public static final RegistryObject IRON_ORE_PIECES = registerSimpleItem("iron_ore_pieces"); + public static final RegistryObject COPPER_ORE_PIECES = registerSimpleItem("copper_ore_pieces"); + public static final RegistryObject GOLD_ORE_PIECES = registerSimpleItem("gold_ore_pieces"); + + // Pebbles + public static final RegistryObject STONE_PEBBLE = registerSimpleItem("stone_pebble"); + public static final RegistryObject DEEPSLATE_PEBBLE = registerSimpleItem("deepslate_pebble"); + + // Misc + public static final RegistryObject PORCELAIN_CLAY = registerSimpleItem("porcelain_clay"); + + // Fluids + public static final RegistryObject WITCH_WATER_BUCKET = ITEMS.register("witch_water_bucket", () -> new FluidBucketItem(props().craftRemainder(Items.BUCKET).stacksTo(1))); + + public static RegistryObject registerSimpleItem(String name) { + return ITEMS.register(name, () -> new Item(props())); + } + + // Returns new properties with creative tab set + public static Item.Properties props() { + return new Item.Properties(); + } + + // Register a block item + public static RegistryObject registerItemBlock(RegistryObject block) { + return ITEMS.register(block.getId().getPath(), () -> new BlockItem(block.get(), props())); + } + + // BlockItems + public static final RegistryObject DUST; + public static final RegistryObject CRUSHED_NETHERRACK; + public static final RegistryObject CRUSHED_END_STONE; + + public static final RegistryObject COMPRESSED_COBBLESTONE; + public static final RegistryObject COMPRESSED_DIRT; + public static final RegistryObject COMPRESSED_SAND; + public static final RegistryObject COMPRESSED_DUST; + public static final RegistryObject COMPRESSED_CRUSHED_NETHERRACK; + public static final RegistryObject COMPRESSED_CRUSHED_END_STONE; + + // Barrels + public static final RegistryObject OAK_BARREL = registerItemBlock(EBlocks.OAK_BARREL); + public static final RegistryObject SPRUCE_BARREL = registerItemBlock(EBlocks.SPRUCE_BARREL); + public static final RegistryObject BIRCH_BARREL = registerItemBlock(EBlocks.BIRCH_BARREL); + public static final RegistryObject JUNGLE_BARREL = registerItemBlock(EBlocks.JUNGLE_BARREL); + public static final RegistryObject ACACIA_BARREL = registerItemBlock(EBlocks.ACACIA_BARREL); + public static final RegistryObject DARK_OAK_BARREL = registerItemBlock(EBlocks.DARK_OAK_BARREL); + public static final RegistryObject CRIMSON_BARREL = registerItemBlock(EBlocks.CRIMSON_BARREL); + public static final RegistryObject WARPED_BARREL = registerItemBlock(EBlocks.WARPED_BARREL); + public static final RegistryObject STONE_BARREL = registerItemBlock(EBlocks.STONE_BARREL); + + // Sieves + public static final RegistryObject OAK_SIEVE = registerItemBlock(EBlocks.OAK_SIEVE); + public static final RegistryObject SPRUCE_SIEVE = registerItemBlock(EBlocks.SPRUCE_SIEVE); + public static final RegistryObject BIRCH_SIEVE = registerItemBlock(EBlocks.BIRCH_SIEVE); + public static final RegistryObject JUNGLE_SIEVE = registerItemBlock(EBlocks.JUNGLE_SIEVE); + public static final RegistryObject ACACIA_SIEVE = registerItemBlock(EBlocks.ACACIA_SIEVE); + public static final RegistryObject DARK_OAK_SIEVE = registerItemBlock(EBlocks.DARK_OAK_SIEVE); + public static final RegistryObject CRIMSON_SIEVE = registerItemBlock(EBlocks.CRIMSON_SIEVE); + public static final RegistryObject WARPED_SIEVE = registerItemBlock(EBlocks.WARPED_SIEVE); + + // Compressed Sieves + //public static final RegistryObject HEAVY_OAK_SIEVE; + //public static final RegistryObject HEAVY_SPRUCE_SIEVE; + //public static final RegistryObject HEAVY_BIRCH_SIEVE; + //public static final RegistryObject HEAVY_JUNGLE_SIEVE; + //public static final RegistryObject HEAVY_ACACIA_SIEVE; + //public static final RegistryObject HEAVY_DARK_OAK_SIEVE; + //public static final RegistryObject HEAVY_CRIMSON_SIEVE; + //public static final RegistryObject HEAVY_WARPED_SIEVE; + + // Lava Crucibles + public static final RegistryObject PORCELAIN_CRUCIBLE = registerItemBlock(EBlocks.PORCELAIN_CRUCIBLE); + public static final RegistryObject WARPED_CRUCIBLE = registerItemBlock(EBlocks.WARPED_CRUCIBLE); + public static final RegistryObject CRIMSON_CRUCIBLE = registerItemBlock(EBlocks.CRIMSON_CRUCIBLE); + public static final RegistryObject UNFIRED_CRUCIBLE = registerItemBlock(EBlocks.UNFIRED_CRUCIBLE); + + // Water Crucibles + public static final RegistryObject OAK_CRUCIBLE = registerItemBlock(EBlocks.OAK_CRUCIBLE); + public static final RegistryObject SPRUCE_CRUCIBLE = registerItemBlock(EBlocks.SPRUCE_CRUCIBLE); + public static final RegistryObject BIRCH_CRUCIBLE = registerItemBlock(EBlocks.BIRCH_CRUCIBLE); + public static final RegistryObject JUNGLE_CRUCIBLE = registerItemBlock(EBlocks.JUNGLE_CRUCIBLE); + public static final RegistryObject ACACIA_CRUCIBLE = registerItemBlock(EBlocks.ACACIA_CRUCIBLE); + public static final RegistryObject DARK_OAK_CRUCIBLE = registerItemBlock(EBlocks.DARK_OAK_CRUCIBLE); + + static { + DUST = registerItemBlock(EBlocks.DUST); + CRUSHED_NETHERRACK = registerItemBlock(EBlocks.CRUSHED_NETHERRACK); + CRUSHED_END_STONE = registerItemBlock(EBlocks.CRUSHED_END_STONE); + COMPRESSED_COBBLESTONE = registerItemBlock(EBlocks.COMPRESSED_COBBLESTONE); + COMPRESSED_DIRT = registerItemBlock(EBlocks.COMPRESSED_DIRT); + COMPRESSED_SAND = registerItemBlock(EBlocks.COMPRESSED_SAND); + COMPRESSED_DUST = registerItemBlock(EBlocks.COMPRESSED_DUST); + COMPRESSED_CRUSHED_NETHERRACK = registerItemBlock(EBlocks.COMPRESSED_CRUSHED_NETHERRACK); + COMPRESSED_CRUSHED_END_STONE = registerItemBlock(EBlocks.COMPRESSED_CRUSHED_END_STONE); + OAK_BARREL = registerItemBlock(EBlocks.OAK_BARREL); + SPRUCE_BARREL = registerItemBlock(EBlocks.SPRUCE_BARREL); + BIRCH_BARREL = registerItemBlock(EBlocks.BIRCH_BARREL); + JUNGLE_BARREL = registerItemBlock(EBlocks.JUNGLE_BARREL); + ACACIA_BARREL = registerItemBlock(EBlocks.ACACIA_BARREL); + DARK_OAK_BARREL = registerItemBlock(EBlocks.DARK_OAK_BARREL); + CRIMSON_BARREL = registerItemBlock(EBlocks.CRIMSON_BARREL); + WARPED_BARREL = registerItemBlock(EBlocks.WARPED_BARREL); + STONE_BARREL = registerItemBlock(EBlocks.STONE_BARREL); + OAK_SIEVE = registerItemBlock(EBlocks.OAK_SIEVE); + SPRUCE_SIEVE = registerItemBlock(EBlocks.SPRUCE_SIEVE); + BIRCH_SIEVE = registerItemBlock(EBlocks.BIRCH_SIEVE); + JUNGLE_SIEVE = registerItemBlock(EBlocks.JUNGLE_SIEVE); + ACACIA_SIEVE = registerItemBlock(EBlocks.ACACIA_SIEVE); + DARK_OAK_SIEVE = registerItemBlock(EBlocks.DARK_OAK_SIEVE); + CRIMSON_SIEVE = registerItemBlock(EBlocks.CRIMSON_SIEVE); + WARPED_SIEVE = registerItemBlock(EBlocks.WARPED_SIEVE); + //HEAVY_OAK_SIEVE = registerItemBlock(EBlocks.HEAVY_OAK_SIEVE); + //HEAVY_SPRUCE_SIEVE = registerItemBlock(EBlocks.HEAVY_SPRUCE_SIEVE); + //HEAVY_BIRCH_SIEVE = registerItemBlock(EBlocks.HEAVY_BIRCH_SIEVE); + //HEAVY_JUNGLE_SIEVE = registerItemBlock(EBlocks.HEAVY_JUNGLE_SIEVE); + //HEAVY_ACACIA_SIEVE = registerItemBlock(EBlocks.HEAVY_ACACIA_SIEVE); + //HEAVY_DARK_OAK_SIEVE = registerItemBlock(EBlocks.HEAVY_DARK_OAK_SIEVE); + //HEAVY_CRIMSON_SIEVE = registerItemBlock(EBlocks.HEAVY_CRIMSON_SIEVE); + //HEAVY_WARPED_SIEVE = registerItemBlock(EBlocks.HEAVY_WARPED_SIEVE); + PORCELAIN_CRUCIBLE = registerItemBlock(EBlocks.PORCELAIN_CRUCIBLE); + WARPED_CRUCIBLE = registerItemBlock(EBlocks.WARPED_CRUCIBLE); + CRIMSON_CRUCIBLE = registerItemBlock(EBlocks.CRIMSON_CRUCIBLE); + UNFIRED_CRUCIBLE = registerItemBlock(EBlocks.UNFIRED_CRUCIBLE); + OAK_CRUCIBLE = registerItemBlock(EBlocks.OAK_CRUCIBLE); + SPRUCE_CRUCIBLE = registerItemBlock(EBlocks.SPRUCE_CRUCIBLE); + BIRCH_CRUCIBLE = registerItemBlock(EBlocks.BIRCH_CRUCIBLE); + JUNGLE_CRUCIBLE = registerItemBlock(EBlocks.JUNGLE_CRUCIBLE); + ACACIA_CRUCIBLE = registerItemBlock(EBlocks.ACACIA_CRUCIBLE); + DARK_OAK_CRUCIBLE = registerItemBlock(EBlocks.DARK_OAK_CRUCIBLE); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/ELootFunctions.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/ELootFunctions.java new file mode 100644 index 00000000..94868709 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/ELootFunctions.java @@ -0,0 +1,18 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.loot.LootFunctionType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.loot.InfestedString; + +public class ELootFunctions { + public static final LootFunctionType INFESTED_STRING = register("infested_string", new LootFunctionType(new InfestedString.Serializer())); + + // Trigger classloading + public static void init() {} + + private static LootFunctionType register(String name, LootFunctionType type) { + return Registry.register(Registry.LOOT_FUNCTION_TYPE, new ResourceLocation(ExNihiloReborn.ID, name), type); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java new file mode 100644 index 00000000..9d0b6a65 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java @@ -0,0 +1,30 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.CompressedHammerRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.AbstractSieveRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.CompressedSieveRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; + +public class ERecipeSerializers { + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, ExNihiloReborn.ID); + + public static final RegistryObject> BARREL_COMPOST = RECIPE_SERIALIZERS.register("barrel_compost", BarrelCompostRecipe.Serializer::new); + + public static final RegistryObject> HAMMER = RECIPE_SERIALIZERS.register("hammer", () -> new RewardRecipe.Serializer<>(HammerRecipe::new)); + public static final RegistryObject> COMPRESSED_HAMMER = RECIPE_SERIALIZERS.register("compressed_hammer", () -> new RewardRecipe.Serializer<>(CompressedHammerRecipe::new)); + + public static final RegistryObject> LAVA_CRUCIBLE = RECIPE_SERIALIZERS.register("lava_crucible", () -> new CrucibleRecipe.Serializer(ERecipeTypes.LAVA_CRUCIBLE)); + public static final RegistryObject> WATER_CRUCIBLE = RECIPE_SERIALIZERS.register("water_crucible", () -> new CrucibleRecipe.Serializer(ERecipeTypes.WATER_CRUCIBLE)); + + public static final RegistryObject> SIEVE = RECIPE_SERIALIZERS.register("sieve", () -> new AbstractSieveRecipe.Serializer<>(SieveRecipe::new)); + public static final RegistryObject> COMPRESSED_SIEVE = RECIPE_SERIALIZERS.register("compressed_sieve", () -> new AbstractSieveRecipe.Serializer<>(CompressedSieveRecipe::new)); +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java new file mode 100644 index 00000000..d891438f --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java @@ -0,0 +1,27 @@ +package thedarkcolour.exnihiloreborn.registry; + +import net.minecraft.world.item.crafting.RecipeType; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.CompressedHammerRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.CompressedSieveRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; + +public class ERecipeTypes { + public static final RecipeType BARREL_COMPOST = RecipeType.register(ExNihiloReborn.ID + ":barrel_compost"); + + public static final RecipeType LAVA_CRUCIBLE = RecipeType.register(ExNihiloReborn.ID + ":lava_crucible"); + public static final RecipeType WATER_CRUCIBLE = RecipeType.register(ExNihiloReborn.ID + ":water_crucible"); + + public static final RecipeType HAMMER = RecipeType.register(ExNihiloReborn.ID + ":hammer"); + public static final RecipeType COMPRESSED_HAMMER = RecipeType.register(ExNihiloReborn.ID + ":compressed_hammer"); + + + public static final RecipeType SIEVE = RecipeType.register(ExNihiloReborn.ID + ":sieve"); + public static final RecipeType COMPRESSED_SIEVE = RecipeType.register(ExNihiloReborn.ID + ":compressed_sieve"); + + // Trigger classloading + public static void init() {} +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..9f0a08ed --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +public net.minecraft.world.item.crafting.RecipeManager m_44054_(Lnet/minecraft/world/item/crafting/RecipeType;)Ljava/util/Map; # byType +public net.minecraft.client.renderer.texture.TextureAtlasSprite f_118349_ # x +public net.minecraft.client.renderer.texture.TextureAtlasSprite f_118350_ # y diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..4723424a --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,26 @@ +modLoader="javafml" +loaderVersion="[36,)" +license="All rights reserved" + +[[mods]] +modId="exnihiloreborn" +version="${file.jarVersion}" +displayName="Ex Nihilo Reborn" +credits="Herobrine knows all." +authors="TheDarkColour" +description=''' +Gives life to the original Ex Nihilo. +''' +[[dependencies.exnihiloreborn]] + modId="forge" + mandatory=true + versionRange="[36,)" + ordering="NONE" + side="BOTH" + +[[dependencies.exnihiloreborn]] + modId="minecraft" + mandatory=true + versionRange="[1.16.5,1.17)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/assets/exnihiloreborn/blockstates/infested_leaves.json b/src/main/resources/assets/exnihiloreborn/blockstates/infested_leaves.json new file mode 100644 index 00000000..217f92e3 --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/blockstates/infested_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "exnihiloreborn:block/infested_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/models/block/infested_leaves.json b/src/main/resources/assets/exnihiloreborn/models/block/infested_leaves.json new file mode 100644 index 00000000..8a9be127 --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/infested_leaves.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/oak_leaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/models/block/old_crucible.json b/src/main/resources/assets/exnihiloreborn/models/block/old_crucible.json new file mode 100644 index 00000000..04db1c15 --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/old_crucible.json @@ -0,0 +1,257 @@ +{ + "ambientocclusion": false, + "parent": "minecraft:block/block", + "elements": [ + { + "from": [0, 3, 0], + "to": [2, 16, 16], + "faces": { + "down": {"texture": "#inside"}, + "up": {"texture": "#top", "cullface": "up"}, + "north": {"texture": "#side", "cullface": "north"}, + "south": {"texture": "#side", "cullface": "south"}, + "west": {"texture": "#side", "cullface": "west"}, + "east": {"texture": "#side"} + } + }, + { + "from": [2, 3, 2], + "to": [14, 4, 14], + "faces": { + "down": {"texture": "#inside"}, + "up": {"texture": "#inside", "cullface": "up"}, + "north": {"texture": "#side", "cullface": "north"}, + "south": { + "texture": "#side", + "cullface": "south" + }, + "west": { + "texture": "#side", + "cullface": "west" + }, + "east": { + "texture": "#side", + "cullface": "east" + } + } + }, + { + "from": [ + 14, + 3, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "down": { + "texture": "#inside" + }, + "up": { + "texture": "#top", + "cullface": "up" + }, + "north": { + "texture": "#side", + "cullface": "north" + }, + "south": { + "texture": "#side", + "cullface": "south" + }, + "west": { + "texture": "#side" + }, + "east": { + "texture": "#side", + "cullface": "east" + } + } + }, + { + "from": [ + 2, + 3, + 0 + ], + "to": [ + 14, + 16, + 2 + ], + "faces": { + "down": { + "texture": "#inside" + }, + "up": { + "texture": "#top", + "cullface": "up" + }, + "north": { + "texture": "#side", + "cullface": "north" + }, + "south": { + "texture": "#side" + }, + "west": { + "texture": "#side", + "cullface": "west" + }, + "east": { + "texture": "#side", + "cullface": "east" + } + } + }, + { + "from": [ + 2, + 3, + 14 + ], + "to": [ + 14, + 16, + 16 + ], + "faces": { + "down": { + "texture": "#inside" + }, + "up": { + "texture": "#top", + "cullface": "up" + }, + "north": { + "texture": "#side" + }, + "south": { + "texture": "#side", + "cullface": "south" + }, + "west": { + "texture": "#side", + "cullface": "west" + }, + "east": { + "texture": "#side", + "cullface": "east" + } + } + }, + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 4, + 3, + 2 + ], + "faces": { + "down": { + "texture": "#bottom" + }, + "up": { + "texture": "#top" + }, + "north": { + "texture": "#side" + }, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [0, 0, 2], + "to": [2, 3, 4], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [12, 0, 0], + "to": [16, 3, 2], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [14, 0, 2], + "to": [16, 3, 4], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [0, 0, 14], + "to": [4, 3, 16], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [0, 0, 12], + "to": [2, 3, 14], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [12, 0, 14], + "to": [16, 3, 16], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + }, + { + "from": [14, 0, 12], + "to": [16, 3, 14], + "faces": { + "down": {"texture": "#bottom"}, + "up": {"texture": "#top"}, + "north": {"texture": "#side"}, + "south": {"texture": "#side"}, + "west": {"texture": "#side"}, + "east": {"texture": "#side"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/models/block/template_barrel.json b/src/main/resources/assets/exnihiloreborn/models/block/template_barrel.json new file mode 100644 index 00000000..8cb7848a --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/template_barrel.json @@ -0,0 +1,61 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "#barrel" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [2, 16, 15], + "faces": { + "north": {"uv": [14, 0, 15, 16], "texture": "#barrel"}, + "east": {"uv": [1, 0, 15, 16], "texture": "#barrel"}, + "south": {"uv": [1, 0, 2, 16], "texture": "#barrel"}, + "west": {"uv": [1, 0, 15, 16], "texture": "#barrel"}, + "up": {"uv": [14, 1, 15, 15], "texture": "#barrel", "cullface": "up"}, + "down": {"uv": [1, 1, 2, 15], "texture": "#barrel", "cullface": "down"} + } + }, + { + "from": [2, 0, 2], + "to": [14, 1, 14], + "faces": { + "up": {"uv": [2, 2, 14, 14], "texture": "#barrel"}, + "down": {"uv": [14, 2, 2, 14], "texture": "#barrel", "cullface": "down"} + } + }, + { + "from": [2, 0, 14], + "to": [14, 16, 15], + "faces": { + "north": {"uv": [2, 0, 14, 16], "texture": "#barrel"}, + "south": {"uv": [2, 0, 14, 16], "texture": "#barrel"}, + "up": {"uv": [2, 1, 14, 2], "texture": "#barrel", "cullface": "up"}, + "down": {"uv": [2, 1, 14, 2], "texture": "#barrel", "cullface": "down"} + } + }, + { + "from": [2, 0, 1], + "to": [14, 16, 2], + "faces": { + "north": {"uv": [2, 0, 14, 16], "texture": "#barrel"}, + "south": {"uv": [2, 0, 14, 16], "texture": "#barrel"}, + "up": {"uv": [2, 14, 14, 15], "texture": "#barrel", "cullface": "up"}, + "down": {"uv": [2, 14, 14, 15], "texture": "#barrel", "cullface": "down"} + } + }, + { + "from": [14, 0, 1], + "to": [15, 16, 15], + "faces": { + "north": {"uv": [1, 0, 2, 16], "texture": "#barrel"}, + "east": {"uv": [1, 0, 15, 16], "texture": "#barrel"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#barrel"}, + "west": {"uv": [1, 0, 15, 16], "texture": "#barrel"}, + "up": {"uv": [1, 1, 2, 15], "texture": "#barrel", "cullface": "up"}, + "down": {"uv": [14, 1, 15, 15], "texture": "#barrel", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/models/block/template_crucible.json b/src/main/resources/assets/exnihiloreborn/models/block/template_crucible.json new file mode 100644 index 00000000..eb988696 --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/template_crucible.json @@ -0,0 +1,145 @@ +{ + "ambientocclusion": false, + "parent": "minecraft:block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 3, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "north": { "texture": "#side", "cullface": "north" }, + "east": { "texture": "#side", "cullface": "up" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "up": { "texture": "#top", "cullface": "up" }, + "down": { "texture": "#inside" } + } + }, + { + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "up": { "texture": "#inside", "cullface": "up" }, + "down": { "texture": "#inside" } + } + }, + { + "from": [ 14, 3, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "north": { "texture": "#side", "cullface": "north" }, + "east": { "texture": "#side", "cullface": "east" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "up" }, + "up": { "texture": "#top", "cullface": "up" }, + "down": { "texture": "#inside" } + } + }, + { + "from": [ 2, 3, 0 ], + "to": [ 14, 16, 2 ], + "faces": { + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "up" }, + "up": { "texture": "#top", "cullface": "up" }, + "down": { "texture": "#inside" } + } + }, + { + "from": [ 2, 3, 14 ], + "to": [ 14, 16, 16 ], + "faces": { + "north": { "texture": "#side", "cullface": "up" }, + "south": { "texture": "#side", "cullface": "south" }, + "up": { "texture": "#top", "cullface": "up" }, + "down": { "texture": "#inside" } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 4, 3, 2 ], + "faces": { + "north": { "texture": "#side", "cullface": "north" }, + "east": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 0, 0, 2 ], + "to": [ 2, 3, 4 ], + "faces": { + "east": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 12, 0, 0 ], + "to": [ 16, 3, 2 ], + "faces": { + "north": { "texture": "#side", "cullface": "north" }, + "east": { "texture": "#side", "cullface": "east" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 14, 0, 2 ], + "to": [ 16, 3, 4 ], + "faces": { + "east": { "texture": "#side", "cullface": "east" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 0, 0, 14 ], + "to": [ 4, 3, 16 ], + "faces": { + "north": { "texture": "#side" }, + "east": { "texture": "#side" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 0, 0, 12 ], + "to": [ 2, 3, 14 ], + "faces": { + "north": { "texture": "#side" }, + "east": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 12, 0, 14 ], + "to": [ 16, 3, 16 ], + "faces": { + "north": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + }, + { + "from": [ 14, 0, 12 ], + "to": [ 16, 3, 14 ], + "faces": { + "north": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" }, + "west": { "texture": "#side" }, + "down": { "texture": "#bottom", "cullface": "down" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/models/block/template_sieve.json b/src/main/resources/assets/exnihiloreborn/models/block/template_sieve.json new file mode 100644 index 00000000..66e3195b --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/template_sieve.json @@ -0,0 +1,105 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#texture" + }, + "name": "blockSieve", + "elements": [ + { + "from": [ 0, 11, 0 ], + "to": [ 15, 16, 1 ], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [ 15, 11, 0 ], + "to": [ 16, 16, 15 ], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [ 1, 11, 15 ], + "to": [ 16, 16, 16 ], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [ 0, 11, 1 ], + "to": [ 1, 16, 16 ], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [1, 0, 1], + "to": [2, 16, 2], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [1, 0, 14], + "to": [2, 16, 15], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [14, 0, 1], + "to": [15, 16, 2], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + }, + { + "from": [14, 0, 14], + "to": [15, 16, 15], + "faces": { + "up": { "texture": "#texture"}, + "down": { "texture": "#texture"}, + "north": { "texture": "#texture"}, + "south": { "texture": "#texture"}, + "west": { "texture": "#texture"}, + "east": { "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png b/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..5044f4b439a26a775267ad804f8ca96afe5fa6f9 GIT binary patch literal 261 zcmV+g0s8)lP)64c0W5+)KLDgOBR1F{n7SsOl*n00000 LNkvXXu0mjf?D%j8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/crushed_end_stone.png b/src/main/resources/assets/exnihiloreborn/textures/block/crushed_end_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6350be56634392c5afe82afc23deb46c17bc54 GIT binary patch literal 1625 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/dust.png b/src/main/resources/assets/exnihiloreborn/textures/block/dust.png new file mode 100644 index 0000000000000000000000000000000000000000..1aea26765de7f010587ebb553744fa73c2c91b86 GIT binary patch literal 1524 zcmbVMeN5DL7(V$>cA_w67BEI@*&J+gZI8QhEu4;C@8AfBc%0mgDWTjIu7PVyTXqL7 z#$hriK@i41BxE=@WPEH{mI)ITHJgNO5l3X`V9I8Mb727-`^0Rn2cFv>#wBao{yzFV z&-?Lv-yY1#PG6;5r&K5utIQdsRUV@QPeh3PKHT6&SLRwz=p`FP4%N=rZyUBa+>aQ4($ z5MW$-(5|(>7T!R+nT#rd&aKL}Ijc&YmP*jCzv?z*f0n{*}hG6+d6A=xrMR9d9aPIP06qD5OJ zPeWE(+MdL9(2?hZ_n2WpD890wW&^RYr2o3J=XnW>OEzUsNu}g<~*^YD_v5 zLlBcO2|;uQ6iFitYMmyTK($FoP~(AI9i~&GNhD&D*@!Vomux}_Sf&yfqCpK?8jb_Y&9je{u%N&Om|U_*bz6x8w>8Oz)Szytv;yG%I(EAh(9~ zG*+!pggjv;(`>%6^^Nw%aX6YxBR9kDPyd|#ZqFxQc(3M<@5;C=ji3u`rcmqSkFajHK80@tExG6v}v^B zOn3X5Nxri6c*0{Jy?Ckb>+zo9wez}NFZU<=vuntVsg_vhSpF2KpSjZ6-PKv^NXVlN zU*;bhS&e|eu=9?=`{bx7szS7<_HJ$anFcFo{mnJq(k_7|y^Tx}X zp*@+;)w$N2V!FDP-;j3aeFpn?XrcPax6I9)IF}Z2eMCzVKYw^G<`C9In;X`YH{4wK zg{n1%M_cA6JmY6p;M&MHqKk5S_vLlg(=|BB=BmNnI7<{!_g`cn-;v!=oIq!#4z=2!09}g?>5rwA8 zWy>|2xoZc9&$-8cyGpDp04B=@vA9RwjUYEY_3a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/porcelain_crucible.png b/src/main/resources/assets/exnihiloreborn/textures/block/porcelain_crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4f655864a2784b4e7e2e4edafb44985aaf372e GIT binary patch literal 652 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 E3+9wYW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/witch_water_flowing.png b/src/main/resources/assets/exnihiloreborn/textures/block/witch_water_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2c4f08f631f9f8e7b8a47c0ca4730a60196d80 GIT binary patch literal 9034 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 UGYt+0zJCGT)H2YlPLWQmIr`s**}ll~j^2 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.png.mcmeta b/src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.png.mcmeta new file mode 100644 index 00000000..0645f48c --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/textures/block/witch_water_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/bone_crook.png b/src/main/resources/assets/exnihiloreborn/textures/item/bone_crook.png new file mode 100644 index 0000000000000000000000000000000000000000..f8282b39aba11a4a50d422dedea4733252a30d6c GIT binary patch literal 3044 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 bC_(@LNNXYat3NR100000NkvXXu0mjfTf9g5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/crook.png b/src/main/resources/assets/exnihiloreborn/textures/item/crook.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbfe96e5e640ed8a9f70a7aae325de709a71b0f GIT binary patch literal 2941 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/diamond_hammer.png b/src/main/resources/assets/exnihiloreborn/textures/item/diamond_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..a8294bd4726f1f7689b503ae0930aafed60d9e8d GIT binary patch literal 3013 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 Hu0mjf%Q}|T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/golden_hammer.png b/src/main/resources/assets/exnihiloreborn/textures/item/golden_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..9821b7a7e7ffed3185a7e7eafbb455a3ce352788 GIT binary patch literal 3015 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 JPDHLkV1kXEn^^z= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/iron_hammer.png b/src/main/resources/assets/exnihiloreborn/textures/item/iron_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd543da561967c2eb0e833fd7327aa349c3bd75 GIT binary patch literal 2984 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/wooden_hammer.png b/src/main/resources/assets/exnihiloreborn/textures/item/wooden_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..9c440330bfc063ad7a8c92863ba922c63e4e6bff GIT binary patch literal 2995 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