diff --git a/build.gradle b/build.gradle index 6b2c0df0..dde2c1ee 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'org.spongepowered.mixin' version '0.7.+' } -version = '1.3' +version = '1.4' group = 'thedarkcolour.exdeorum' base { archivesName = 'exdeorum' diff --git a/changelog.md b/changelog.md index a7984320..ded15600 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,10 @@ +## Ex Deorum 1.4 +- Red Sand is now obtainable by hammering crushed netherrack. +- Sieves can no longer be automated by machines (can be re-enabled in the server config.) +- Fixed desync bug when a machine like Create's Deployer interacts with the Sieve +- Fixed an edge case where a modded ore wouldn't appear if the item form wasn't in the ore's tag. +- Fixed #5, which prevented automating the Crucible + ## Ex Deorum 1.3 - Allow modded ores to drop from sieving Gravel and Crushed Deepslate if a mod with that ore is installed. Supported ores are Aluminum, Cobalt, Silver, Lead, Platinum, Nickel, Uranium, Osmium, Tin, Zinc, and Iridium. - Allow some modded drops from sieving if a mod with those resources is installed. Currently, only Grains of Infinity from Ender IO is supported. diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 18909054..4cb1149f 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-01T15:25:16.1558751 Recipes +// 1.20.1 2023-09-09T11:37:17.5523493 Recipes 5ad481a0c376c1a1785a5d3b992064d0ec0bf3b0 data/exdeorum/advancements/recipes/food/end_cake.json 25dd027e844a72b03c95dbe5e3c3dd8c738ceb00 data/exdeorum/advancements/recipes/misc/acacia_barrel.json 376be94a64c9ca97a9ea2346547b6e617f13a815 data/exdeorum/advancements/recipes/misc/acacia_crucible.json @@ -222,6 +222,7 @@ df7f23b00f23a5ac255345801ac88850877a2e88 data/exdeorum/recipes/hammer/fire_coral 808203624a792fcd4a0289975d82b3bff34af90e data/exdeorum/recipes/hammer/horn_coral.json 5ebb5a4dfa54230abcd4cdb5af34b2b296c7eb23 data/exdeorum/recipes/hammer/horn_coral_fan.json 19c00defa531bfbaa11f19403ff9d1694a9cd04a data/exdeorum/recipes/hammer/prismarine.json +fdc243a5cfb1e84220cf6c41f46f454b3aff8b87 data/exdeorum/recipes/hammer/red_sand.json b592554bc00ab20d8affdfd1627406858ac10797 data/exdeorum/recipes/hammer/sand.json 0e879c5bcf28023efdcd257d3e12e7153bd0bef7 data/exdeorum/recipes/hammer/stone_pebbles.json 3bf60837b935bd09248a84fd8f22968fc244ea46 data/exdeorum/recipes/hammer/tube_coral.json @@ -564,12 +565,14 @@ da3556d43a22a00cfba29419879f8bb1c24f76e0 data/exdeorum/recipes/sieve/dust/diamon 0087b10cc106dc6cb22a9574567faf8096fa797e data/exdeorum/recipes/sieve/dust/diamond/grains_of_infinity.json aacdbedc91e09191a6fc335ed82ca481d934ebc3 data/exdeorum/recipes/sieve/dust/diamond/gunpowder.json 00907e701451521c3ca793ec337b0b2f0166e895 data/exdeorum/recipes/sieve/dust/diamond/redstone.json +64de5902f0aaee9c844ba1316a796e10cb0aed34 data/exdeorum/recipes/sieve/dust/diamond/yellorium_dust.json 7eba59b03b5affdc11c937060e99949db301086a data/exdeorum/recipes/sieve/dust/flint/blaze_powder.json 7af226b5661b96e0b8ddcb8ec902d37f429b0b48 data/exdeorum/recipes/sieve/dust/flint/bone_meal.json 0a7d44bdff5a9b7040f702cb5ff756ce231c9a60 data/exdeorum/recipes/sieve/dust/flint/glowstone_dust.json c418797b65a0c67841c5e99d8fec95d1ee780065 data/exdeorum/recipes/sieve/dust/flint/grains_of_infinity.json 52c65219279d46fe5474a8a01d69a1362cb3a2ea data/exdeorum/recipes/sieve/dust/flint/gunpowder.json 7ecd5ae5d7f6783ff7535978352190a9af1b0ab4 data/exdeorum/recipes/sieve/dust/flint/redstone.json +34cf976c49dbd139da48e9896d700587e0ae75e1 data/exdeorum/recipes/sieve/dust/flint/yellorium_dust.json bdbe4b3434ff67299b47d65eab0c442b235dc654 data/exdeorum/recipes/sieve/dust/golden/blaze_powder.json fab2426618c3f527ed401f1ef2cee3fa81de1969 data/exdeorum/recipes/sieve/dust/golden/bone_meal.json 9a9eb3cc996de392e75dd9c6613af1ff382615d5 data/exdeorum/recipes/sieve/dust/golden/glowstone_dust.json @@ -578,6 +581,7 @@ c087c3ba3bd7bda74aac13435f61a998060d4872 data/exdeorum/recipes/sieve/dust/golden 4d28a3acd946fd55c3982e5ff9bb8876b8b0baef data/exdeorum/recipes/sieve/dust/golden/gunpowder.json a9c9258b74162f5132b8b47f3981b071ec6b60bf data/exdeorum/recipes/sieve/dust/golden/raw_gold.json 65c99881294536c0f59d66d0e7429d85bbec0b9b data/exdeorum/recipes/sieve/dust/golden/redstone.json +f5e23ee85134101ff76f64b301e7cc3d86fb87e6 data/exdeorum/recipes/sieve/dust/golden/yellorium_dust.json 4b304a265794186e3c1fbd23acfcfde57322d615 data/exdeorum/recipes/sieve/dust/iron/blaze_powder.json 758573f460a7f2ff2104a1bbfde2fa8392d002a4 data/exdeorum/recipes/sieve/dust/iron/bone_meal.json e3f7f74c6e84a149282b23f0388e25c7ae5f4352 data/exdeorum/recipes/sieve/dust/iron/glowstone_dust.json @@ -585,6 +589,7 @@ f5c25b6ee05890bdc41ddc45a14b2015665388fe data/exdeorum/recipes/sieve/dust/iron/g 5ffc2f95fc5a52aad02e7b063ba64c4cd41836f3 data/exdeorum/recipes/sieve/dust/iron/gunpowder.json eeb2ec19599044971eeff5929e7238fa398f1f08 data/exdeorum/recipes/sieve/dust/iron/iron_nugget.json 9dc82b4a79edf9561566137af39399b1621b89a0 data/exdeorum/recipes/sieve/dust/iron/redstone.json +9fd60c04e81943398e45a95f8f301fe4ee1f6efd data/exdeorum/recipes/sieve/dust/iron/yellorium_dust.json 55bf627cf6c3a8eca57328cb482a6f86326a8e68 data/exdeorum/recipes/sieve/dust/netherite/blaze_powder.json 33e35a1af71274a675498234b8dcd9834368c717 data/exdeorum/recipes/sieve/dust/netherite/bone_meal.json 0472c65dad0e35df7397dfb2a7b53c5408f5fffc data/exdeorum/recipes/sieve/dust/netherite/glowstone_dust.json @@ -593,12 +598,14 @@ a776c6d6946a02fea8bb346860f525bde2c835de data/exdeorum/recipes/sieve/dust/nether 2fb062f8d8be004bd5e54a43a089c579a374abb1 data/exdeorum/recipes/sieve/dust/netherite/gunpowder.json c6a8996009ae3e712a2895001e96c74bb35b224c data/exdeorum/recipes/sieve/dust/netherite/iron_nugget.json 44e98c8ce40d6f72596b009398943cb3ac6ef1b5 data/exdeorum/recipes/sieve/dust/netherite/redstone.json +20f154dc498320be8037e23b3bdc7b1c483d2f95 data/exdeorum/recipes/sieve/dust/netherite/yellorium_dust.json 7bed9653a0d40436bd15531ffb15eb84563cfc4d data/exdeorum/recipes/sieve/dust/string/blaze_powder.json 74dc1675b4dc9c0d1d96bc22db0b844f322082b8 data/exdeorum/recipes/sieve/dust/string/bone_meal.json e4ead3b21ece1d4470c2000017586c1730acd1bb data/exdeorum/recipes/sieve/dust/string/glowstone_dust.json 91428deb05889718e458b8cd9f6d610f1e652330 data/exdeorum/recipes/sieve/dust/string/grains_of_infinity.json 3272a1f8b4534dd8800b07b7ec826d8f7a4fae65 data/exdeorum/recipes/sieve/dust/string/gunpowder.json e1a8558df8270d57cbcdf7255b93b40d0c05d33b data/exdeorum/recipes/sieve/dust/string/redstone.json +9b5162b466041d395a2428c2c944b0a450c135b6 data/exdeorum/recipes/sieve/dust/string/yellorium_dust.json 9df7ca0a604ab01b33dfe0b342441b9705c9ac9e data/exdeorum/recipes/sieve/gravel/diamond/aluminum_ore_chunk.json b1b1c231670f2622dc2227fac65aff0ebbd2ea19 data/exdeorum/recipes/sieve/gravel/diamond/amethyst_shard.json 2284efd2a38ecb63f694ba0586c478b26207adce data/exdeorum/recipes/sieve/gravel/diamond/coal.json @@ -798,6 +805,35 @@ ee240ebb80802c83d48985d9e431bc12410589a4 data/exdeorum/recipes/sieve/moss_block/ e5351932ff3700bf95f2ec770cd051f08debee9c data/exdeorum/recipes/sieve/moss_block/string/small_dripleaf.json 64280db27eca51b0aa8fddc970756c1e3a25db08 data/exdeorum/recipes/sieve/moss_block/string/spore_blossom.json fec8737e1aba9773807c7cd582c685e4532f488d data/exdeorum/recipes/sieve/moss_block/string/spruce_sapling.json +156f165c67999ede3087cb52cb701f0d265a4aed data/exdeorum/recipes/sieve/red_sand/diamond/cactus.json +c96dd108668d448619c27dafa1770b8473de904f data/exdeorum/recipes/sieve/red_sand/diamond/dead_bush.json +cb16aa3c76c75a47abdad3a42dfdb13676525851 data/exdeorum/recipes/sieve/red_sand/diamond/gold_nugget.json +0509eae50392db7a5d04ce937a5f3973f75d9921 data/exdeorum/recipes/sieve/red_sand/diamond/raw_gold.json +8dc85127d9bf3d2882b5551b889cbf23eb013f7a data/exdeorum/recipes/sieve/red_sand/diamond/redstone.json +0d883ea6b876bbf69711a3ebf367c1e465b72a24 data/exdeorum/recipes/sieve/red_sand/flint/cactus.json +404252db62319c367d0564b18c340b66e7fafa28 data/exdeorum/recipes/sieve/red_sand/flint/dead_bush.json +a135a5cfc5d6177ece92481fd6ba2a3ae50d28ac data/exdeorum/recipes/sieve/red_sand/flint/gold_nugget.json +eff718d36e89f82a96d9ffdc98caa5a5c33e0a2b data/exdeorum/recipes/sieve/red_sand/flint/raw_gold.json +9f19e4c9f625de7d3490ab3feef53e4436989a91 data/exdeorum/recipes/sieve/red_sand/flint/redstone.json +bdd32c9a8b3fa2f379ad71289bb52b4ef68c0577 data/exdeorum/recipes/sieve/red_sand/golden/cactus.json +6281aadf6936c3160d0e261bf1a248ebc86c7f7e data/exdeorum/recipes/sieve/red_sand/golden/dead_bush.json +d2329615e5d3a674ff162901518bf91043c4b2bc data/exdeorum/recipes/sieve/red_sand/golden/gold_nugget.json +238130e1482e64676b0b45a48e261bf6443fec9f data/exdeorum/recipes/sieve/red_sand/golden/raw_gold.json +e836570ca27341f19df56ffe342957ba54fb5e38 data/exdeorum/recipes/sieve/red_sand/golden/redstone.json +85c37a8ea69278436f5b354a098fa8dd93a269cb data/exdeorum/recipes/sieve/red_sand/iron/cactus.json +e301aa1a48bbb0cba03d0efd4162c4ea27bcd735 data/exdeorum/recipes/sieve/red_sand/iron/dead_bush.json +e7890d925decdcd1972508026943b52507ba6ce1 data/exdeorum/recipes/sieve/red_sand/iron/gold_nugget.json +ad592d67fba2ae9554f7425d88c13ec106e6e08a data/exdeorum/recipes/sieve/red_sand/iron/raw_gold.json +1b82c029f28894e2eee7ab8effca14e745dab1d5 data/exdeorum/recipes/sieve/red_sand/iron/redstone.json +a9aa1611d994d1b3f6c4a9bbb6865d8998521a48 data/exdeorum/recipes/sieve/red_sand/netherite/cactus.json +1294a1825ceb652ffdb1aac352a20886e4ee162c data/exdeorum/recipes/sieve/red_sand/netherite/gold_nugget.json +f31cb4bb77b550f1239f7853ebc95f9671c0a356 data/exdeorum/recipes/sieve/red_sand/netherite/raw_gold.json +09bfe3d4ca5ba25fe268ef680f7e1af24bf06da0 data/exdeorum/recipes/sieve/red_sand/netherite/redstone.json +0bbec585a6a89b7eb128c2f9475e0ae4c325852f data/exdeorum/recipes/sieve/red_sand/string/cactus.json +54b7248def54580a7e88cf538a52e721b1c872d1 data/exdeorum/recipes/sieve/red_sand/string/dead_bush.json +b443cbaf342f0fa3a6a88d7205644792bcb47093 data/exdeorum/recipes/sieve/red_sand/string/gold_nugget.json +e1c550f09fcddcc09da0f76458f2d2ef429bcc44 data/exdeorum/recipes/sieve/red_sand/string/raw_gold.json +5c3788fbc13f9a25dd7e42b27210f258ec337c02 data/exdeorum/recipes/sieve/red_sand/string/redstone.json c63500f17bbac4d47caac5a48f3cedfe750916a5 data/exdeorum/recipes/sieve/sand/diamond/flint.json 3b0c8920c2c19e3731e0258bd005b4d2cc2bd5ab data/exdeorum/recipes/sieve/sand/diamond/gold_nugget.json 286085cb6ec9ed4d3fb2e84fc19887019dbe2d02 data/exdeorum/recipes/sieve/sand/diamond/iron_nugget.json diff --git a/src/main/java/thedarkcolour/exdeorum/blockentity/AbstractCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exdeorum/blockentity/AbstractCrucibleBlockEntity.java index 864bdc66..9190c97f 100644 --- a/src/main/java/thedarkcolour/exdeorum/blockentity/AbstractCrucibleBlockEntity.java +++ b/src/main/java/thedarkcolour/exdeorum/blockentity/AbstractCrucibleBlockEntity.java @@ -32,7 +32,6 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SaplingBlock; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -121,7 +120,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { return FluidUtil.interactWithFluidHandler(player, hand, tank) ? InteractionResult.sidedSuccess(level.isClientSide) : InteractionResult.PASS; } - if (!level.isClientSide) { + if (!level.isClientSide && canInsertItem(playerItem)) { tryMelt(playerItem, player.getAbilities().instabuild ? stack -> {} : stack -> stack.shrink(1)); } @@ -138,36 +137,51 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { * @param shrinkAction What to do when item is melted */ private void tryMelt(ItemStack item, Consumer shrinkAction) { - CrucibleRecipe recipe = getRecipe(item); + if (item.isEmpty()) return; - if (recipe != null) { - FluidStack result = recipe.getResult(); - FluidStack contained = tank.getFluid(); + var meltItem = item.getItem(); + var recipe = getRecipe(item); + if (recipe == null) { + this.item.setStackInSlot(0, ItemStack.EMPTY); + return; + } + var result = recipe.getResult(); + var contained = this.tank.getFluid(); + shrinkAction.accept(item); + this.solids = (short) Math.max(solids + result.getAmount(), MAX_SOLIDS); - if (((result.isFluidEqual(contained) || contained.isEmpty()) && result.getAmount() + solids <= MAX_SOLIDS)) { - var meltItem = item.getItem(); - shrinkAction.accept(item); - solids += result.getAmount(); + if (contained.isEmpty()) { + fluid = result.getFluid(); + } - if (contained.isEmpty()) { - fluid = result.getFluid(); - } - - var melts = MELT_OVERRIDES.get(); - if (melts.containsKey(meltItem)) { - lastMelted = melts.get(meltItem); - } else if (meltItem.getClass() == BlockItem.class) { - lastMelted = ((BlockItem) meltItem).getBlock(); - } else { - // If we already have something else inside just use that instead of switching to default - if (lastMelted == null) { - lastMelted = getDefaultMeltBlock(); - } - } - - markUpdated(); + var melts = MELT_OVERRIDES.get(); + if (melts.containsKey(meltItem)) { + lastMelted = melts.get(meltItem); + } else if (meltItem.getClass() == BlockItem.class) { + lastMelted = ((BlockItem) meltItem).getBlock(); + } else { + // If we already have something else inside just use that instead of switching to default + if (lastMelted == null) { + lastMelted = getDefaultMeltBlock(); } } + + markUpdated(); + } + + private boolean canInsertItem(ItemStack item) { + if (item.isEmpty()) return false; + + var recipe = getRecipe(item); + + if (recipe != null) { + var result = recipe.getResult(); + var contained = tank.getFluid(); + + return (result.isFluidEqual(contained) || contained.isEmpty()) && result.getAmount() + solids <= MAX_SOLIDS; + } + + return false; } public int getMeltingRate() { @@ -250,7 +264,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { - return getRecipe(stack) != null; + return canInsertItem(stack); } public ItemStack getItem() { diff --git a/src/main/java/thedarkcolour/exdeorum/blockentity/SieveBlockEntity.java b/src/main/java/thedarkcolour/exdeorum/blockentity/SieveBlockEntity.java index 6f17ee56..692e916b 100644 --- a/src/main/java/thedarkcolour/exdeorum/blockentity/SieveBlockEntity.java +++ b/src/main/java/thedarkcolour/exdeorum/blockentity/SieveBlockEntity.java @@ -31,6 +31,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraftforge.common.util.FakePlayer; import thedarkcolour.exdeorum.config.EConfig; import thedarkcolour.exdeorum.recipe.RecipeUtil; import thedarkcolour.exdeorum.recipe.sieve.SieveRecipe; @@ -147,7 +148,9 @@ public class SieveBlockEntity extends EBlockEntity { } } } else { - if (EConfig.SERVER.simultaneousSieveUsage.get()) { + var realPlayer = !(player instanceof FakePlayer); + + if (realPlayer && EConfig.SERVER.simultaneousSieveUsage.get()) { var cursor = worldPosition.mutable().move(-1, 0, -1); // Sieve with adjacent sieves @@ -165,7 +168,7 @@ public class SieveBlockEntity extends EBlockEntity { } cursor.move(1, 0, -3); } - } else { + } else if (realPlayer || EConfig.SERVER.automatedSieves.get()) { performSift(player); } } @@ -211,6 +214,8 @@ public class SieveBlockEntity extends EBlockEntity { if (!level.isClientSide) { giveItems(player); } + } else { + markUpdated(); } } diff --git a/src/main/java/thedarkcolour/exdeorum/client/ter/InfestedLeavesRenderer.java b/src/main/java/thedarkcolour/exdeorum/client/ter/InfestedLeavesRenderer.java index f58aae79..0eb1e47d 100644 --- a/src/main/java/thedarkcolour/exdeorum/client/ter/InfestedLeavesRenderer.java +++ b/src/main/java/thedarkcolour/exdeorum/client/ter/InfestedLeavesRenderer.java @@ -39,10 +39,9 @@ public class InfestedLeavesRenderer implements BlockEntityRenderer GRAINS_OF_INFINITY = null; + public static RegistryObject YELLORITE_DUST = null; public static void registerModData() { registerEnderIO(); + registerExtremeReactors(); } private static void registerEnderIO() { @@ -22,4 +23,11 @@ public class ModCompatData { GRAINS_OF_INFINITY = deferredRegister.register("grains_of_infinity", () -> new Item(new Item.Properties())); } + + private static void registerExtremeReactors() { + var deferredRegister = DeferredRegister.create(ForgeRegistries.ITEMS, ModIds.BIGGER_REACTORS); + deferredRegister.register(FMLJavaModLoadingContext.get().getModEventBus()); + + YELLORITE_DUST = deferredRegister.register("yellorium_dust", () -> new Item(new Item.Properties())); + } } diff --git a/src/main/java/thedarkcolour/exdeorum/data/recipe/Recipes.java b/src/main/java/thedarkcolour/exdeorum/data/recipe/Recipes.java new file mode 100644 index 00000000..f621cbdc --- /dev/null +++ b/src/main/java/thedarkcolour/exdeorum/data/recipe/Recipes.java @@ -0,0 +1,457 @@ +/* + * Ex Deorum + * Copyright (c) 2023 thedarkcolour + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package thedarkcolour.exdeorum.data.recipe; + +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.RegistryObject; +import org.apache.commons.lang3.mutable.MutableObject; +import thedarkcolour.exdeorum.ExDeorum; +import thedarkcolour.exdeorum.recipe.TagResultRecipe; +import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelCompostRecipe; +import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelMixingRecipe; +import thedarkcolour.exdeorum.recipe.crucible.FinishedCrucibleRecipe; +import thedarkcolour.exdeorum.recipe.hammer.FinishedHammerRecipe; +import thedarkcolour.exdeorum.registry.EBlocks; +import thedarkcolour.exdeorum.registry.EFluids; +import thedarkcolour.exdeorum.registry.EItems; +import thedarkcolour.exdeorum.registry.ERecipeSerializers; +import thedarkcolour.exdeorum.tag.EItemTags; +import thedarkcolour.modkit.data.MKRecipeProvider; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static net.minecraft.world.level.storage.loot.providers.number.UniformGenerator.between; +import static thedarkcolour.modkit.data.MKRecipeProvider.ingredient; +import static thedarkcolour.modkit.data.MKRecipeProvider.path; + +public class Recipes { + private static final Ingredient SPORES_AND_SEEDS = ingredient(EItems.GRASS_SEEDS, EItems.MYCELIUM_SPORES, EItems.WARPED_NYLIUM_SPORES, EItems.CRIMSON_NYLIUM_SPORES); + public static void addRecipes(Consumer writer, MKRecipeProvider recipes) { + craftingRecipes(writer, recipes); + smeltingRecipes(recipes); + SieveRecipes.sieveRecipes(writer); + crucibleRecipes(writer); + hammerRecipes(writer); + barrelCompostRecipes(writer); + barrelMixingRecipes(writer); + } + + private static void craftingRecipes(Consumer writer, MKRecipeProvider recipes) { + // Crooks + shapedCrook(recipes, EItems.CROOK, ingredient(Tags.Items.RODS_WOODEN)); + shapedCrook(recipes, EItems.BONE_CROOK, ingredient(Items.BONE)); + + // Hammers + shapedHammer(recipes, EItems.WOODEN_HAMMER, ingredient(ItemTags.PLANKS)); + shapedHammer(recipes, EItems.STONE_HAMMER, ingredient(ItemTags.STONE_CRAFTING_MATERIALS)); + shapedHammer(recipes, EItems.GOLDEN_HAMMER, ingredient(Tags.Items.INGOTS_GOLD)); + shapedHammer(recipes, EItems.IRON_HAMMER, ingredient(Tags.Items.INGOTS_IRON)); + shapedHammer(recipes, EItems.DIAMOND_HAMMER, ingredient(Tags.Items.GEMS_DIAMOND)); + recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_HAMMER.get()), EItems.NETHERITE_HAMMER.get()); + + // Crucibles + uShaped(recipes, EItems.OAK_CRUCIBLE, ingredient(Items.OAK_LOG), ingredient(Items.OAK_SLAB)); + uShaped(recipes, EItems.SPRUCE_CRUCIBLE, ingredient(Items.SPRUCE_LOG), ingredient(Items.SPRUCE_SLAB)); + uShaped(recipes, EItems.BIRCH_CRUCIBLE, ingredient(Items.BIRCH_LOG), ingredient(Items.BIRCH_SLAB)); + uShaped(recipes, EItems.JUNGLE_CRUCIBLE, ingredient(Items.JUNGLE_LOG), ingredient(Items.JUNGLE_SLAB)); + uShaped(recipes, EItems.ACACIA_CRUCIBLE, ingredient(Items.ACACIA_LOG), ingredient(Items.ACACIA_SLAB)); + uShaped(recipes, EItems.DARK_OAK_CRUCIBLE, ingredient(Items.DARK_OAK_LOG), ingredient(Items.DARK_OAK_SLAB)); + uShaped(recipes, EItems.MANGROVE_CRUCIBLE, ingredient(Items.MANGROVE_LOG), ingredient(Items.MANGROVE_SLAB)); + uShaped(recipes, EItems.CHERRY_CRUCIBLE, ingredient(Items.CHERRY_LOG), ingredient(Items.CHERRY_SLAB)); + uShaped(recipes, EItems.BAMBOO_CRUCIBLE, ingredient(Items.BAMBOO_BLOCK), ingredient(Items.BAMBOO_SLAB)); + uShaped(recipes, EItems.CRIMSON_CRUCIBLE, ingredient(Items.CRIMSON_STEM), ingredient(Items.CRIMSON_SLAB)); + uShaped(recipes, EItems.WARPED_CRUCIBLE, ingredient(Items.WARPED_STEM), ingredient(Items.WARPED_SLAB)); + uShaped(recipes, EItems.UNFIRED_PORCELAIN_CRUCIBLE, ingredient(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(EItems.PORCELAIN_CLAY_BALL.get())); + + // Barrels + uShaped(recipes, EItems.OAK_BARREL, ingredient(Items.OAK_PLANKS), ingredient(Items.OAK_SLAB)); + uShaped(recipes, EItems.SPRUCE_BARREL, ingredient(Items.SPRUCE_PLANKS), ingredient(Items.SPRUCE_SLAB)); + uShaped(recipes, EItems.BIRCH_BARREL, ingredient(Items.BIRCH_PLANKS), ingredient(Items.BIRCH_SLAB)); + uShaped(recipes, EItems.JUNGLE_BARREL, ingredient(Items.JUNGLE_PLANKS), ingredient(Items.JUNGLE_SLAB)); + uShaped(recipes, EItems.ACACIA_BARREL, ingredient(Items.ACACIA_PLANKS), ingredient(Items.ACACIA_SLAB)); + uShaped(recipes, EItems.DARK_OAK_BARREL, ingredient(Items.DARK_OAK_PLANKS), ingredient(Items.DARK_OAK_SLAB)); + uShaped(recipes, EItems.MANGROVE_BARREL, ingredient(Items.MANGROVE_PLANKS), ingredient(Items.MANGROVE_SLAB)); + uShaped(recipes, EItems.CHERRY_BARREL, ingredient(Items.CHERRY_PLANKS), ingredient(Items.CHERRY_SLAB)); + uShaped(recipes, EItems.BAMBOO_BARREL, ingredient(Items.BAMBOO_PLANKS), ingredient(Items.BAMBOO_SLAB)); + uShaped(recipes, EItems.CRIMSON_BARREL, ingredient(Items.CRIMSON_PLANKS), ingredient(Items.CRIMSON_SLAB)); + uShaped(recipes, EItems.WARPED_BARREL, ingredient(Items.WARPED_PLANKS), ingredient(Items.WARPED_SLAB)); + uShaped(recipes, EItems.STONE_BARREL, ingredient(Items.STONE), ingredient(Items.STONE_SLAB)); + + // Pebbles and ore chunks + recipes.grid2x2(Items.COBBLESTONE, ingredient(EItems.STONE_PEBBLE)); + recipes.grid2x2(Items.ANDESITE, ingredient(EItems.ANDESITE_PEBBLE)); + recipes.grid2x2(Items.DIORITE, ingredient(EItems.DIORITE_PEBBLE)); + recipes.grid2x2(Items.GRANITE, ingredient(EItems.GRANITE_PEBBLE)); + recipes.grid2x2(Items.COBBLED_DEEPSLATE, ingredient(EItems.DEEPSLATE_PEBBLE)); + recipes.grid2x2(Items.TUFF, ingredient(EItems.TUFF_PEBBLE)); + recipes.grid2x2(Items.CALCITE, ingredient(EItems.CALCITE_PEBBLE)); + recipes.grid2x2(Items.BLACKSTONE, ingredient(EItems.BLACKSTONE_PEBBLE)); + recipes.grid2x2(Items.BASALT, ingredient(EItems.BASALT_PEBBLE)); + recipes.grid2x2(Items.IRON_ORE, ingredient(EItems.IRON_ORE_CHUNK)); + recipes.grid2x2(Items.GOLD_ORE, ingredient(EItems.GOLD_ORE_CHUNK)); + recipes.grid2x2(Items.COPPER_ORE, ingredient(EItems.COPPER_ORE_CHUNK)); + recipes.grid2x2(Items.MOSS_BLOCK, ingredient(EItems.GRASS_SEEDS)); + + // Modded ores + grid2x2TagResult(writer, recipes, EItemTags.ORES_ALUMINUM, ingredient(EItems.ALUMINUM_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_COBALT, ingredient(EItems.COBALT_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_SILVER, ingredient(EItems.SILVER_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_LEAD, ingredient(EItems.LEAD_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_PLATINUM, ingredient(EItems.PLATINUM_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_NICKEL, ingredient(EItems.NICKEL_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_URANIUM, ingredient(EItems.URANIUM_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_OSMIUM, ingredient(EItems.OSMIUM_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_TIN, ingredient(EItems.TIN_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_ZINC, ingredient(EItems.ZINC_ORE_CHUNK)); + grid2x2TagResult(writer, recipes, EItemTags.ORES_IRIDIUM, ingredient(EItems.IRIDIUM_ORE_CHUNK)); + + // Sieves + sieve(recipes, EItems.OAK_SIEVE, Items.OAK_PLANKS, Items.OAK_SLAB); + sieve(recipes, EItems.SPRUCE_SIEVE, Items.SPRUCE_PLANKS, Items.SPRUCE_SLAB); + sieve(recipes, EItems.BIRCH_SIEVE, Items.BIRCH_PLANKS, Items.BIRCH_SLAB); + sieve(recipes, EItems.JUNGLE_SIEVE, Items.JUNGLE_PLANKS, Items.JUNGLE_SLAB); + sieve(recipes, EItems.ACACIA_SIEVE, Items.ACACIA_PLANKS, Items.ACACIA_SLAB); + sieve(recipes, EItems.DARK_OAK_SIEVE, Items.DARK_OAK_PLANKS, Items.DARK_OAK_SLAB); + sieve(recipes, EItems.MANGROVE_SIEVE, Items.MANGROVE_PLANKS, Items.MANGROVE_SLAB); + sieve(recipes, EItems.CHERRY_SIEVE, Items.CHERRY_PLANKS, Items.CHERRY_SLAB); + sieve(recipes, EItems.BAMBOO_SIEVE, Items.BAMBOO_PLANKS, Items.BAMBOO_SLAB); + sieve(recipes, EItems.CRIMSON_SIEVE, Items.CRIMSON_PLANKS, Items.CRIMSON_SLAB); + sieve(recipes, EItems.WARPED_SIEVE, Items.WARPED_PLANKS, Items.WARPED_SLAB); + + // Meshes + recipes.grid3x3(EItems.STRING_MESH.get(), ingredient(Tags.Items.STRING)); + mesh(recipes, EItems.FLINT_MESH.get(), ingredient(Items.FLINT)); + mesh(recipes, EItems.IRON_MESH.get(), ingredient(Tags.Items.INGOTS_IRON)); + mesh(recipes, EItems.GOLDEN_MESH.get(), ingredient(Tags.Items.INGOTS_GOLD)); + mesh(recipes, EItems.DIAMOND_MESH.get(), ingredient(Tags.Items.GEMS_DIAMOND)); + recipes.netheriteUpgrade(RecipeCategory.MISC, ingredient(EItems.DIAMOND_MESH), EItems.NETHERITE_MESH.get()); + + // Watering cans + wateringCan(recipes, EItems.WOODEN_WATERING_CAN, ingredient(ItemTags.PLANKS)); + wateringCan(recipes, EItems.STONE_WATERING_CAN, ingredient(ItemTags.STONE_TOOL_MATERIALS)); + wateringCan(recipes, EItems.IRON_WATERING_CAN, ingredient(Tags.Items.INGOTS_IRON)); + wateringCan(recipes, EItems.GOLDEN_WATERING_CAN, ingredient(Tags.Items.INGOTS_GOLD)); + wateringCan(recipes, EItems.DIAMOND_WATERING_CAN, ingredient(Tags.Items.GEMS_DIAMOND)); + recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get()); + + // misc + recipes.shapelessCrafting(RecipeCategory.MISC, new ItemStack(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL)); + recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> { + recipe.define('#', EItems.PORCELAIN_CLAY_BALL); + recipe.pattern("# #"); + recipe.pattern(" # "); + }); + recipes.shapedCrafting(RecipeCategory.MISC, EItems.SCULK_CORE.get(), recipe -> { + recipe.define('#', Items.ECHO_SHARD); + recipe.define('O', Items.ENDER_PEARL); + recipe.pattern(" # "); + recipe.pattern("#O#"); + recipe.pattern(" # "); + }); + recipes.shapedCrafting(RecipeCategory.FOOD, EItems.END_CAKE.get(), recipe -> { + recipe.define('P', Items.ENDER_EYE); + recipe.define('S', Items.SUGAR); + recipe.define('E', Tags.Items.EGGS); + recipe.define('C', EItems.CRUSHED_END_STONE); + recipe.pattern("PPP"); + recipe.pattern("SES"); + recipe.pattern("CCC"); + }); + } + + private static void grid2x2TagResult(Consumer writer, MKRecipeProvider recipes, TagKey resultTag, Ingredient ingredient) { + var ref = new MutableObject(); + recipes.pushWriter(ref::setValue, newWriter -> { + recipes.shapedCrafting(resultTag.location().getPath() + "_tag", RecipeCategory.MISC, Items.AIR, recipe -> { + recipe.define('#', ingredient); + recipe.pattern("##"); + recipe.pattern("##"); + }); + }); + writer.accept(new TagResultRecipe.Finished(resultTag, ref.getValue())); + } + + private static void shapedCrook(MKRecipeProvider recipes, RegistryObject crook, Ingredient stick) { + recipes.shapedCrafting(RecipeCategory.TOOLS, crook.get(), recipe -> { + recipe.define('x', stick); + recipe.pattern("xx"); + recipe.pattern(" x"); + recipe.pattern(" x"); + }); + } + + private static void shapedHammer(MKRecipeProvider recipes, RegistryObject hammer, Ingredient material) { + recipes.shapedCrafting(RecipeCategory.TOOLS, hammer.get(), recipe -> { + recipe.define('m', material); + recipe.define('s', Tags.Items.RODS_WOODEN); + recipe.pattern(" m "); + recipe.pattern(" sm"); + recipe.pattern("s "); + }); + } + + private static void uShaped(MKRecipeProvider recipes, RegistryObject result, Ingredient sides, Ingredient middle) { + recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> { + recipe.define('s', sides); + recipe.define('m', middle); + recipe.pattern("s s"); + recipe.pattern("s s"); + recipe.pattern("sms"); + }); + } + + private static void sieve(MKRecipeProvider recipes, Supplier result, Item planks, Item slab) { + recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> { + recipe.define('O', planks); + recipe.define('_', slab); + recipe.define('I', Tags.Items.RODS_WOODEN); + recipe.pattern("O O"); + recipe.pattern("O_O"); + recipe.pattern("I I"); + }); + } + + private static void mesh(MKRecipeProvider recipes, Item result, Ingredient ingredient) { + recipes.shapedCrafting(RecipeCategory.MISC, result, recipe -> { + recipe.define('#', ingredient); + recipe.define('S', ingredient(Tags.Items.STRING)); + recipe.pattern("S#S"); + recipe.pattern("#S#"); + recipe.pattern("S#S"); + }); + } + + private static void wateringCan(MKRecipeProvider recipes, Supplier result, Ingredient shell) { + recipes.shapedCrafting(RecipeCategory.TOOLS, result.get(), recipe -> { + recipe.define('#', shell); + recipe.define('B', Items.BOWL); + recipe.pattern("# "); + recipe.pattern("#B#"); + recipe.pattern(" # "); + }); + } + + private static void smeltingRecipes(MKRecipeProvider recipes) { + recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_CRUCIBLE), EItems.PORCELAIN_CRUCIBLE.get(), 0.1f); + recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_BUCKET), EItems.PORCELAIN_BUCKET.get(), 0.1f); + + recipes.foodCooking(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get(), 0.1f); + } + private static void crucibleRecipes(Consumer writer) { + lavaCrucible(writer, "cobblestone", ingredient(Tags.Items.COBBLESTONE), 250); + lavaCrucible(writer, "stone", ingredient(Tags.Items.STONE), 250); + lavaCrucible(writer, "gravel", ingredient(Tags.Items.GRAVEL), 250); + lavaCrucible(writer, "netherrack", ingredient(Tags.Items.NETHERRACK), 500); + + waterCrucible(writer, "saplings", ingredient(ItemTags.SAPLINGS), 100); + waterCrucible(writer, "leaves", ingredient(ItemTags.LEAVES), 250); + waterCrucible(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100); + waterCrucible(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 200); + waterCrucible(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100); + waterCrucible(writer, "lily_pad", ingredient(Items.LILY_PAD), 150); + waterCrucible(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 100); + waterCrucible(writer, "vine", ingredient(Items.VINE), 100); + waterCrucible(writer, "seeds_and_spores", SPORES_AND_SEEDS, 50); + waterCrucible(writer, "seeds", ingredient(Tags.Items.SEEDS), 50); + waterCrucible(writer, "grass", ingredient(Items.GRASS, Items.TALL_GRASS), 100); + waterCrucible(writer, "grass_block", ingredient(Items.GRASS_BLOCK), 150); + waterCrucible(writer, "sweet_berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 50); + waterCrucible(writer, "melon_slice", ingredient(Items.MELON_SLICE), 50); + waterCrucible(writer, "potato", ingredient(Items.POTATO), 100); + waterCrucible(writer, "carrot", ingredient(Items.CARROT), 100); + waterCrucible(writer, "beetroot", ingredient(Items.BEETROOT), 100); + waterCrucible(writer, "apple", ingredient(Items.APPLE), 100); + waterCrucible(writer, "cactus", ingredient(Items.CACTUS), 250); + waterCrucible(writer, "pumpkin", ingredient(Items.PUMPKIN), 250); + waterCrucible(writer, "melon", ingredient(Items.MELON), 250); + waterCrucible(writer, "seagrass", ingredient(Items.SEAGRASS), 100); + waterCrucible(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 200); + waterCrucible(writer, "moss", ingredient(Items.MOSS_BLOCK), 150); + waterCrucible(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100); + waterCrucible(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 150); + } + + private static void lavaCrucible(Consumer writer, String id, Ingredient ingredient, int volume) { + writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "lava_crucible/" + id), ERecipeSerializers.LAVA_CRUCIBLE.get(), ingredient, Fluids.LAVA, volume)); + } + + private static void waterCrucible(Consumer writer, String id, Ingredient ingredient, int volume) { + writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "water_crucible/" + id), ERecipeSerializers.WATER_CRUCIBLE.get(), ingredient, Fluids.WATER, volume)); + } + + private static void hammerRecipes(Consumer writer) { + // Cobblestone -> Gravel -> Sand -> Dust + hammerRecipe(writer, "gravel", ingredient(Items.COBBLESTONE, Items.DIORITE, Items.GRANITE, Items.ANDESITE), Blocks.GRAVEL); + hammerRecipe(writer, "sand", ingredient(Items.GRAVEL), Blocks.SAND); + hammerRecipe(writer, "dust", ingredient(Items.SAND, Items.RED_SAND), EBlocks.DUST.get()); + + hammerRecipe(writer, "crushed_deepslate", ingredient(Blocks.DEEPSLATE, Blocks.COBBLED_DEEPSLATE), EBlocks.CRUSHED_DEEPSLATE.get()); + hammerRecipe(writer, "crushed_netherrack", ingredient(Blocks.NETHERRACK), EBlocks.CRUSHED_NETHERRACK.get()); + hammerRecipe(writer, "crushed_blackstone", ingredient(Blocks.BLACKSTONE), EBlocks.CRUSHED_BLACKSTONE.get()); + hammerRecipe(writer, "crushed_end_stone", ingredient(Blocks.END_STONE), EBlocks.CRUSHED_END_STONE.get()); + hammerRecipe(writer, "red_sand", ingredient(EBlocks.CRUSHED_NETHERRACK), Blocks.RED_SAND); + + hammerRecipe(writer, "crushing_sandstone", ingredient(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), Items.SAND); + hammerRecipe(writer, "crushing_red_sandstone", ingredient(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), Items.RED_SAND); + hammerRecipe(writer, "crushing_stone_bricks", ingredient(Items.STONE_BRICKS), Items.CRACKED_STONE_BRICKS); + + hammerRecipe(writer, "stone_pebbles", ingredient(Items.STONE, Items.STONE_BRICKS, Items.CHISELED_STONE_BRICKS, Items.CRACKED_STONE_BRICKS), EItems.STONE_PEBBLE.get(), new UniformGenerator(ConstantValue.exactly(1), ConstantValue.exactly(6))); + hammerRecipe(writer, "basalt", ingredient(Items.POLISHED_BASALT, Items.SMOOTH_BASALT), Items.BASALT); + + hammerRecipe(writer, "tube_coral", ingredient(Items.TUBE_CORAL_BLOCK), Items.TUBE_CORAL); + hammerRecipe(writer, "brain_coral", ingredient(Items.BRAIN_CORAL_BLOCK), Items.BRAIN_CORAL); + hammerRecipe(writer, "bubble_coral", ingredient(Items.BUBBLE_CORAL_BLOCK), Items.BUBBLE_CORAL); + hammerRecipe(writer, "fire_coral", ingredient(Items.FIRE_CORAL_BLOCK), Items.FIRE_CORAL); + hammerRecipe(writer, "horn_coral", ingredient(Items.HORN_CORAL_BLOCK), Items.HORN_CORAL); + hammerRecipe(writer, "tube_coral_fan", ingredient(Items.TUBE_CORAL), Items.TUBE_CORAL_FAN); + hammerRecipe(writer, "brain_coral_fan", ingredient(Items.BRAIN_CORAL), Items.BRAIN_CORAL_FAN); + hammerRecipe(writer, "bubble_coral_fan", ingredient(Items.BUBBLE_CORAL), Items.BUBBLE_CORAL_FAN); + hammerRecipe(writer, "fire_coral_fan", ingredient(Items.FIRE_CORAL), Items.FIRE_CORAL_FAN); + hammerRecipe(writer, "horn_coral_fan", ingredient(Items.HORN_CORAL), Items.HORN_CORAL_FAN); + + hammerRecipe(writer, "prismarine", ingredient(Items.PRISMARINE, Items.PRISMARINE_BRICKS, Items.DARK_PRISMARINE), Items.PRISMARINE_SHARD, between(1, 4)); + } + + private static void hammerRecipe(Consumer writer, String name, Ingredient block, ItemLike result) { + hammerRecipe(writer, name, block, result, ConstantValue.exactly(1f)); + } + + private static void hammerRecipe(Consumer writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) { + writer.accept(new FinishedHammerRecipe(new ResourceLocation(ExDeorum.ID, "hammer/" + name), block, result.asItem(), resultAmount)); + } + + private static void barrelCompostRecipes(Consumer writer) { + // plants + barrelCompost(writer, "saplings", ingredient(ItemTags.SAPLINGS), 125); + barrelCompost(writer, "leaves", ingredient(ItemTags.LEAVES), 125); + barrelCompost(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100); + barrelCompost(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 150); + barrelCompost(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100); + barrelCompost(writer, "lily_pad", ingredient(Items.LILY_PAD), 100); + barrelCompost(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 80); + barrelCompost(writer, "vine", ingredient(Items.VINE), 100); + barrelCompost(writer, "grass", ingredient(Items.GRASS, Items.FERN), 100); + barrelCompost(writer, "tall_grass", ingredient(Items.TALL_GRASS, Items.LARGE_FERN), 150); + barrelCompost(writer, "seagrass", ingredient(Items.SEAGRASS), 80); + barrelCompost(writer, "nether_wart", ingredient(Items.NETHER_WART), 100); + barrelCompost(writer, "seeds", ingredient(Tags.Items.SEEDS), 80); + barrelCompost(writer, "wheat", ingredient(Tags.Items.CROPS_WHEAT), 80); + barrelCompost(writer, "berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 80); + barrelCompost(writer, "melon", ingredient(Items.MELON), 200); + barrelCompost(writer, "cake", ingredient(Items.CAKE), 500); + barrelCompost(writer, "pumpkin", ingredient(Items.PUMPKIN), 500); + barrelCompost(writer, "carrots", ingredient(Items.CARROT), 100); + barrelCompost(writer, "potatoes", ingredient(Items.POTATO, Items.BAKED_POTATO, Items.POISONOUS_POTATO), 80); + barrelCompost(writer, "beetroot", ingredient(Items.BEETROOT), 80); + barrelCompost(writer, "moss_block", ingredient(Items.MOSS_BLOCK), 150); + barrelCompost(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100); + barrelCompost(writer, "spores_and_seeds", SPORES_AND_SEEDS, 80); + barrelCompost(writer, "bamboo", ingredient(Items.BAMBOO), 100); + barrelCompost(writer, "cactus", ingredient(Items.CACTUS), 125); + barrelCompost(writer, "dead_bush", ingredient(Items.DEAD_BUSH), 80); + barrelCompost(writer, "chorus_flower", ingredient(Items.CHORUS_FLOWER), 150); + barrelCompost(writer, "chorus_fruit", ingredient(Items.CHORUS_FRUIT), 80); + barrelCompost(writer, "chorus_plant", ingredient(Items.CHORUS_PLANT), 150); + barrelCompost(writer, "kelp", ingredient(Items.KELP, Items.DRIED_KELP), 80); + barrelCompost(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 80); + barrelCompost(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 125); + barrelCompost(writer, "weeping_vines", ingredient(Items.WEEPING_VINES), 100); + barrelCompost(writer, "twisting_vines", ingredient(Items.TWISTING_VINES), 100); + // flesh + barrelCompost(writer, "rotten_flesh", ingredient(Items.ROTTEN_FLESH), 100); + barrelCompost(writer, "spider_eye", ingredient(Items.SPIDER_EYE), 80); + barrelCompost(writer, "fermented_spider_eye", ingredient(Items.FERMENTED_SPIDER_EYE), 100); + barrelCompost(writer, "string", ingredient(Items.STRING), 40); + barrelCompost(writer, "rabbit_foot", ingredient(Items.RABBIT_FOOT), 100); + // meats + barrelCompost(writer, "pork", ingredient(Items.PORKCHOP, Items.COOKED_PORKCHOP), 150); + barrelCompost(writer, "beef", ingredient(Items.BEEF, Items.COOKED_BEEF), 150); + barrelCompost(writer, "chicken", ingredient(Items.CHICKEN, Items.COOKED_CHICKEN), 125); + barrelCompost(writer, "mutton", ingredient(Items.MUTTON, Items.COOKED_MUTTON), 125); + barrelCompost(writer, "salmon", ingredient(Items.SALMON, Items.COOKED_SALMON), 125); + barrelCompost(writer, "rabbit", ingredient(Items.RABBIT, Items.COOKED_RABBIT), 100); + barrelCompost(writer, "cod", ingredient(Items.COD, Items.COOKED_COD), 100); + barrelCompost(writer, "tropical_fish", ingredient(Items.TROPICAL_FISH), 80); + barrelCompost(writer, "pufferfish", ingredient(Items.PUFFERFISH), 80); + barrelCompost(writer, "egg", ingredient(Items.EGG), 100); + // foods + barrelCompost(writer, "melon_slice", ingredient(Items.MELON_SLICE), 40); + barrelCompost(writer, "silk_worms", ingredient(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get()), 40); + barrelCompost(writer, "apple", ingredient(Items.APPLE), 100); + barrelCompost(writer, "cookie", ingredient(Items.COOKIE), 100); + barrelCompost(writer, "pumpkin_pie", ingredient(Items.PUMPKIN_PIE), 150); + barrelCompost(writer, "bread", ingredient(Items.BREAD), 125); + barrelCompost(writer, "mushroom_stew", ingredient(Items.MUSHROOM_STEW), 200); + barrelCompost(writer, "suspicious_stew", ingredient(Items.SUSPICIOUS_STEW), 200); + barrelCompost(writer, "beetroot_soup", ingredient(Items.BEETROOT_SOUP), 150); + barrelCompost(writer, "rabbit_stew", ingredient(Items.RABBIT_STEW), 200); + + // lol + barrelCompost(writer, "golden_apples", ingredient(Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE), 1000); + } + + private static void barrelCompost(Consumer writer, String id, Ingredient ingredient, int volume) { + writer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExDeorum.ID, "barrel_compost/" + id), ingredient, volume)); + } + + private static void barrelMixingRecipes(Consumer writer) { + // water + barrelMixing(writer, ingredient(EItems.DUST.get()), Fluids.WATER, Items.CLAY); + barrelMixing(writer, ingredient(Items.MILK_BUCKET), Fluids.WATER, Items.SLIME_BLOCK); + barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_MILK_BUCKET.get()), Fluids.WATER, Items.SLIME_BLOCK); + barrelMixing(writer, ingredient(Items.SNOWBALL), Fluids.WATER, Items.ICE); + barrelMixing(writer, ingredient(Items.LAVA_BUCKET), Fluids.WATER, Items.STONE); + barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_LAVA_BUCKET), Fluids.WATER, Items.STONE); + // lava + barrelMixing(writer, ingredient(EItems.WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK); + barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK); + barrelMixing(writer, ingredient(Items.GLOWSTONE_DUST), Fluids.LAVA, Items.END_STONE); + barrelMixing(writer, ingredient(Items.WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN); + barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN); + barrelMixing(writer, ingredient(Items.SLIME_BALL), Fluids.LAVA, Items.MAGMA_CREAM); + barrelMixing(writer, ingredient(Items.SOUL_SAND), Fluids.LAVA, Items.SOUL_SOIL); + // witch water + barrelMixing(writer, ingredient(Items.SAND), EFluids.WITCH_WATER.get(), Items.SOUL_SAND); + } + + private static void barrelMixing(Consumer writer, Ingredient ingredient, Fluid fluidType, Item result) { + writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result)), ingredient, fluidType, 1000, result)); + } + + private static void barrelMixing(Consumer writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) { + writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result) + suffix), ingredient, fluidType, 1000, result)); + } +} diff --git a/src/main/java/thedarkcolour/exdeorum/data/Recipes.java b/src/main/java/thedarkcolour/exdeorum/data/recipe/SieveRecipes.java similarity index 66% rename from src/main/java/thedarkcolour/exdeorum/data/Recipes.java rename to src/main/java/thedarkcolour/exdeorum/data/recipe/SieveRecipes.java index f9fb77b9..ad27815c 100644 --- a/src/main/java/thedarkcolour/exdeorum/data/Recipes.java +++ b/src/main/java/thedarkcolour/exdeorum/data/recipe/SieveRecipes.java @@ -1,61 +1,25 @@ -/* - * Ex Deorum - * Copyright (c) 2023 thedarkcolour - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package thedarkcolour.exdeorum.data; +package thedarkcolour.exdeorum.data.recipe; import com.mojang.datafixers.util.Either; import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator; -import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; -import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; -import net.minecraftforge.common.Tags; import net.minecraftforge.common.crafting.ConditionalRecipe; import net.minecraftforge.common.crafting.conditions.ICondition; import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; import net.minecraftforge.common.crafting.conditions.NotCondition; import net.minecraftforge.common.crafting.conditions.TagEmptyCondition; import net.minecraftforge.registries.RegistryObject; -import org.apache.commons.lang3.mutable.MutableObject; import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.compat.ModIds; -import thedarkcolour.exdeorum.recipe.TagResultRecipe; -import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelCompostRecipe; -import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelMixingRecipe; -import thedarkcolour.exdeorum.recipe.crucible.FinishedCrucibleRecipe; -import thedarkcolour.exdeorum.recipe.hammer.FinishedHammerRecipe; +import thedarkcolour.exdeorum.data.ModCompatData; import thedarkcolour.exdeorum.recipe.sieve.FinishedSieveRecipe; -import thedarkcolour.exdeorum.registry.EBlocks; -import thedarkcolour.exdeorum.registry.EFluids; import thedarkcolour.exdeorum.registry.EItems; -import thedarkcolour.exdeorum.registry.ERecipeSerializers; import thedarkcolour.exdeorum.tag.EItemTags; import thedarkcolour.modkit.data.MKRecipeProvider; @@ -65,225 +29,11 @@ import java.util.function.Consumer; import java.util.function.Supplier; import static net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator.binomial; -import static net.minecraft.world.level.storage.loot.providers.number.UniformGenerator.between; import static thedarkcolour.modkit.data.MKRecipeProvider.ingredient; import static thedarkcolour.modkit.data.MKRecipeProvider.path; -class Recipes { - private static final Ingredient SPORES_AND_SEEDS = ingredient(EItems.GRASS_SEEDS, EItems.MYCELIUM_SPORES, EItems.WARPED_NYLIUM_SPORES, EItems.CRIMSON_NYLIUM_SPORES); - public static void addRecipes(Consumer writer, MKRecipeProvider recipes) { - craftingRecipes(writer, recipes); - smeltingRecipes(recipes); - sieveRecipes(writer); - crucibleRecipes(writer); - hammerRecipes(writer); - barrelCompostRecipes(writer); - barrelMixingRecipes(writer); - } - - private static void craftingRecipes(Consumer writer, MKRecipeProvider recipes) { - // Crooks - shapedCrook(recipes, EItems.CROOK, ingredient(Tags.Items.RODS_WOODEN)); - shapedCrook(recipes, EItems.BONE_CROOK, ingredient(Items.BONE)); - - // Hammers - shapedHammer(recipes, EItems.WOODEN_HAMMER, ingredient(ItemTags.PLANKS)); - shapedHammer(recipes, EItems.STONE_HAMMER, ingredient(ItemTags.STONE_CRAFTING_MATERIALS)); - shapedHammer(recipes, EItems.GOLDEN_HAMMER, ingredient(Tags.Items.INGOTS_GOLD)); - shapedHammer(recipes, EItems.IRON_HAMMER, ingredient(Tags.Items.INGOTS_IRON)); - shapedHammer(recipes, EItems.DIAMOND_HAMMER, ingredient(Tags.Items.GEMS_DIAMOND)); - recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_HAMMER.get()), EItems.NETHERITE_HAMMER.get()); - - // Crucibles - uShaped(recipes, EItems.OAK_CRUCIBLE, ingredient(Items.OAK_LOG), ingredient(Items.OAK_SLAB)); - uShaped(recipes, EItems.SPRUCE_CRUCIBLE, ingredient(Items.SPRUCE_LOG), ingredient(Items.SPRUCE_SLAB)); - uShaped(recipes, EItems.BIRCH_CRUCIBLE, ingredient(Items.BIRCH_LOG), ingredient(Items.BIRCH_SLAB)); - uShaped(recipes, EItems.JUNGLE_CRUCIBLE, ingredient(Items.JUNGLE_LOG), ingredient(Items.JUNGLE_SLAB)); - uShaped(recipes, EItems.ACACIA_CRUCIBLE, ingredient(Items.ACACIA_LOG), ingredient(Items.ACACIA_SLAB)); - uShaped(recipes, EItems.DARK_OAK_CRUCIBLE, ingredient(Items.DARK_OAK_LOG), ingredient(Items.DARK_OAK_SLAB)); - uShaped(recipes, EItems.MANGROVE_CRUCIBLE, ingredient(Items.MANGROVE_LOG), ingredient(Items.MANGROVE_SLAB)); - uShaped(recipes, EItems.CHERRY_CRUCIBLE, ingredient(Items.CHERRY_LOG), ingredient(Items.CHERRY_SLAB)); - uShaped(recipes, EItems.BAMBOO_CRUCIBLE, ingredient(Items.BAMBOO_BLOCK), ingredient(Items.BAMBOO_SLAB)); - uShaped(recipes, EItems.CRIMSON_CRUCIBLE, ingredient(Items.CRIMSON_STEM), ingredient(Items.CRIMSON_SLAB)); - uShaped(recipes, EItems.WARPED_CRUCIBLE, ingredient(Items.WARPED_STEM), ingredient(Items.WARPED_SLAB)); - uShaped(recipes, EItems.UNFIRED_PORCELAIN_CRUCIBLE, ingredient(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(EItems.PORCELAIN_CLAY_BALL.get())); - - // Barrels - uShaped(recipes, EItems.OAK_BARREL, ingredient(Items.OAK_PLANKS), ingredient(Items.OAK_SLAB)); - uShaped(recipes, EItems.SPRUCE_BARREL, ingredient(Items.SPRUCE_PLANKS), ingredient(Items.SPRUCE_SLAB)); - uShaped(recipes, EItems.BIRCH_BARREL, ingredient(Items.BIRCH_PLANKS), ingredient(Items.BIRCH_SLAB)); - uShaped(recipes, EItems.JUNGLE_BARREL, ingredient(Items.JUNGLE_PLANKS), ingredient(Items.JUNGLE_SLAB)); - uShaped(recipes, EItems.ACACIA_BARREL, ingredient(Items.ACACIA_PLANKS), ingredient(Items.ACACIA_SLAB)); - uShaped(recipes, EItems.DARK_OAK_BARREL, ingredient(Items.DARK_OAK_PLANKS), ingredient(Items.DARK_OAK_SLAB)); - uShaped(recipes, EItems.MANGROVE_BARREL, ingredient(Items.MANGROVE_PLANKS), ingredient(Items.MANGROVE_SLAB)); - uShaped(recipes, EItems.CHERRY_BARREL, ingredient(Items.CHERRY_PLANKS), ingredient(Items.CHERRY_SLAB)); - uShaped(recipes, EItems.BAMBOO_BARREL, ingredient(Items.BAMBOO_PLANKS), ingredient(Items.BAMBOO_SLAB)); - uShaped(recipes, EItems.CRIMSON_BARREL, ingredient(Items.CRIMSON_PLANKS), ingredient(Items.CRIMSON_SLAB)); - uShaped(recipes, EItems.WARPED_BARREL, ingredient(Items.WARPED_PLANKS), ingredient(Items.WARPED_SLAB)); - uShaped(recipes, EItems.STONE_BARREL, ingredient(Items.STONE), ingredient(Items.STONE_SLAB)); - - // Pebbles and ore chunks - recipes.grid2x2(Items.COBBLESTONE, ingredient(EItems.STONE_PEBBLE)); - recipes.grid2x2(Items.ANDESITE, ingredient(EItems.ANDESITE_PEBBLE)); - recipes.grid2x2(Items.DIORITE, ingredient(EItems.DIORITE_PEBBLE)); - recipes.grid2x2(Items.GRANITE, ingredient(EItems.GRANITE_PEBBLE)); - recipes.grid2x2(Items.COBBLED_DEEPSLATE, ingredient(EItems.DEEPSLATE_PEBBLE)); - recipes.grid2x2(Items.TUFF, ingredient(EItems.TUFF_PEBBLE)); - recipes.grid2x2(Items.CALCITE, ingredient(EItems.CALCITE_PEBBLE)); - recipes.grid2x2(Items.BLACKSTONE, ingredient(EItems.BLACKSTONE_PEBBLE)); - recipes.grid2x2(Items.BASALT, ingredient(EItems.BASALT_PEBBLE)); - recipes.grid2x2(Items.IRON_ORE, ingredient(EItems.IRON_ORE_CHUNK)); - recipes.grid2x2(Items.GOLD_ORE, ingredient(EItems.GOLD_ORE_CHUNK)); - recipes.grid2x2(Items.COPPER_ORE, ingredient(EItems.COPPER_ORE_CHUNK)); - recipes.grid2x2(Items.MOSS_BLOCK, ingredient(EItems.GRASS_SEEDS)); - - // Modded ores - grid2x2TagResult(writer, recipes, EItemTags.ORES_ALUMINUM, ingredient(EItems.ALUMINUM_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_COBALT, ingredient(EItems.COBALT_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_SILVER, ingredient(EItems.SILVER_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_LEAD, ingredient(EItems.LEAD_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_PLATINUM, ingredient(EItems.PLATINUM_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_NICKEL, ingredient(EItems.NICKEL_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_URANIUM, ingredient(EItems.URANIUM_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_OSMIUM, ingredient(EItems.OSMIUM_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_TIN, ingredient(EItems.TIN_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_ZINC, ingredient(EItems.ZINC_ORE_CHUNK)); - grid2x2TagResult(writer, recipes, EItemTags.ORES_IRIDIUM, ingredient(EItems.IRIDIUM_ORE_CHUNK)); - - // Sieves - sieve(recipes, EItems.OAK_SIEVE, Items.OAK_PLANKS, Items.OAK_SLAB); - sieve(recipes, EItems.SPRUCE_SIEVE, Items.SPRUCE_PLANKS, Items.SPRUCE_SLAB); - sieve(recipes, EItems.BIRCH_SIEVE, Items.BIRCH_PLANKS, Items.BIRCH_SLAB); - sieve(recipes, EItems.JUNGLE_SIEVE, Items.JUNGLE_PLANKS, Items.JUNGLE_SLAB); - sieve(recipes, EItems.ACACIA_SIEVE, Items.ACACIA_PLANKS, Items.ACACIA_SLAB); - sieve(recipes, EItems.DARK_OAK_SIEVE, Items.DARK_OAK_PLANKS, Items.DARK_OAK_SLAB); - sieve(recipes, EItems.MANGROVE_SIEVE, Items.MANGROVE_PLANKS, Items.MANGROVE_SLAB); - sieve(recipes, EItems.CHERRY_SIEVE, Items.CHERRY_PLANKS, Items.CHERRY_SLAB); - sieve(recipes, EItems.BAMBOO_SIEVE, Items.BAMBOO_PLANKS, Items.BAMBOO_SLAB); - sieve(recipes, EItems.CRIMSON_SIEVE, Items.CRIMSON_PLANKS, Items.CRIMSON_SLAB); - sieve(recipes, EItems.WARPED_SIEVE, Items.WARPED_PLANKS, Items.WARPED_SLAB); - - // Meshes - recipes.grid3x3(EItems.STRING_MESH.get(), ingredient(Tags.Items.STRING)); - mesh(recipes, EItems.FLINT_MESH.get(), ingredient(Items.FLINT)); - mesh(recipes, EItems.IRON_MESH.get(), ingredient(Tags.Items.INGOTS_IRON)); - mesh(recipes, EItems.GOLDEN_MESH.get(), ingredient(Tags.Items.INGOTS_GOLD)); - mesh(recipes, EItems.DIAMOND_MESH.get(), ingredient(Tags.Items.GEMS_DIAMOND)); - recipes.netheriteUpgrade(RecipeCategory.MISC, ingredient(EItems.DIAMOND_MESH), EItems.NETHERITE_MESH.get()); - - // Watering cans - wateringCan(recipes, EItems.WOODEN_WATERING_CAN, ingredient(ItemTags.PLANKS)); - wateringCan(recipes, EItems.STONE_WATERING_CAN, ingredient(ItemTags.STONE_TOOL_MATERIALS)); - wateringCan(recipes, EItems.IRON_WATERING_CAN, ingredient(Tags.Items.INGOTS_IRON)); - wateringCan(recipes, EItems.GOLDEN_WATERING_CAN, ingredient(Tags.Items.INGOTS_GOLD)); - wateringCan(recipes, EItems.DIAMOND_WATERING_CAN, ingredient(Tags.Items.GEMS_DIAMOND)); - recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get()); - - // misc - recipes.shapelessCrafting(RecipeCategory.MISC, new ItemStack(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL)); - recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> { - recipe.define('#', EItems.PORCELAIN_CLAY_BALL); - recipe.pattern("# #"); - recipe.pattern(" # "); - }); - recipes.shapedCrafting(RecipeCategory.MISC, EItems.SCULK_CORE.get(), recipe -> { - recipe.define('#', Items.ECHO_SHARD); - recipe.define('O', Items.ENDER_PEARL); - recipe.pattern(" # "); - recipe.pattern("#O#"); - recipe.pattern(" # "); - }); - recipes.shapedCrafting(RecipeCategory.FOOD, EItems.END_CAKE.get(), recipe -> { - recipe.define('P', Items.ENDER_EYE); - recipe.define('S', Items.SUGAR); - recipe.define('E', Tags.Items.EGGS); - recipe.define('C', EItems.CRUSHED_END_STONE); - recipe.pattern("PPP"); - recipe.pattern("SES"); - recipe.pattern("CCC"); - }); - } - - private static void grid2x2TagResult(Consumer writer, MKRecipeProvider recipes, TagKey resultTag, Ingredient ingredient) { - var ref = new MutableObject(); - recipes.pushWriter(ref::setValue, newWriter -> { - recipes.shapedCrafting(resultTag.location().getPath() + "_tag", RecipeCategory.MISC, Items.AIR, recipe -> { - recipe.define('#', ingredient); - recipe.pattern("##"); - recipe.pattern("##"); - }); - }); - writer.accept(new TagResultRecipe.Finished(resultTag, ref.getValue())); - } - - private static void shapedCrook(MKRecipeProvider recipes, RegistryObject crook, Ingredient stick) { - recipes.shapedCrafting(RecipeCategory.TOOLS, crook.get(), recipe -> { - recipe.define('x', stick); - recipe.pattern("xx"); - recipe.pattern(" x"); - recipe.pattern(" x"); - }); - } - - private static void shapedHammer(MKRecipeProvider recipes, RegistryObject hammer, Ingredient material) { - recipes.shapedCrafting(RecipeCategory.TOOLS, hammer.get(), recipe -> { - recipe.define('m', material); - recipe.define('s', Tags.Items.RODS_WOODEN); - recipe.pattern(" m "); - recipe.pattern(" sm"); - recipe.pattern("s "); - }); - } - - private static void uShaped(MKRecipeProvider recipes, RegistryObject result, Ingredient sides, Ingredient middle) { - recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> { - recipe.define('s', sides); - recipe.define('m', middle); - recipe.pattern("s s"); - recipe.pattern("s s"); - recipe.pattern("sms"); - }); - } - - private static void sieve(MKRecipeProvider recipes, Supplier result, Item planks, Item slab) { - recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> { - recipe.define('O', planks); - recipe.define('_', slab); - recipe.define('I', Tags.Items.RODS_WOODEN); - recipe.pattern("O O"); - recipe.pattern("O_O"); - recipe.pattern("I I"); - }); - } - - private static void mesh(MKRecipeProvider recipes, Item result, Ingredient ingredient) { - recipes.shapedCrafting(RecipeCategory.MISC, result, recipe -> { - recipe.define('#', ingredient); - recipe.define('S', ingredient(Tags.Items.STRING)); - recipe.pattern("S#S"); - recipe.pattern("#S#"); - recipe.pattern("S#S"); - }); - } - - private static void wateringCan(MKRecipeProvider recipes, Supplier result, Ingredient shell) { - recipes.shapedCrafting(RecipeCategory.TOOLS, result.get(), recipe -> { - recipe.define('#', shell); - recipe.define('B', Items.BOWL); - recipe.pattern("# "); - recipe.pattern("#B#"); - recipe.pattern(" # "); - }); - } - - private static void smeltingRecipes(MKRecipeProvider recipes) { - recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_CRUCIBLE), EItems.PORCELAIN_CRUCIBLE.get(), 0.1f); - recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_BUCKET), EItems.PORCELAIN_BUCKET.get(), 0.1f); - - recipes.foodCooking(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get(), 0.1f); - } - - private static void sieveRecipes(Consumer writer) { +class SieveRecipes { + static void sieveRecipes(Consumer writer) { var allMeshes = List.of(EItems.STRING_MESH, EItems.FLINT_MESH, EItems.IRON_MESH, EItems.GOLDEN_MESH, EItems.DIAMOND_MESH, EItems.NETHERITE_MESH); // Dirt -> String mesh @@ -610,6 +360,49 @@ class Recipes { addDrop.accept(Items.PRISMARINE_CRYSTALS, chance(0.12f)); }); + // Red Sand -> String mesh + forMesh(writer, ingredient(Items.RED_SAND), EItems.STRING_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.12f)); + addDrop.accept(Items.DEAD_BUSH, chance(0.07f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.09f)); + addDrop.accept(Items.REDSTONE, chance(0.08f)); + addDrop.accept(Items.RAW_GOLD, chance(0.03f)); + }); + forMesh(writer, ingredient(Items.RED_SAND), EItems.FLINT_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.12f)); + addDrop.accept(Items.DEAD_BUSH, chance(0.07f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.12f)); + addDrop.accept(Items.REDSTONE, chance(0.09f)); + addDrop.accept(Items.RAW_GOLD, chance(0.04f)); + }); + forMesh(writer, ingredient(Items.RED_SAND), EItems.IRON_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.12f)); + addDrop.accept(Items.DEAD_BUSH, chance(0.07f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.09f)); + addDrop.accept(Items.REDSTONE, chance(0.11f)); + addDrop.accept(Items.RAW_GOLD, chance(0.06f)); + }); + forMesh(writer, ingredient(Items.RED_SAND), EItems.GOLDEN_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.12f)); + addDrop.accept(Items.DEAD_BUSH, chance(0.07f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.19f)); + addDrop.accept(Items.REDSTONE, chance(0.07f)); + addDrop.accept(Items.RAW_GOLD, chance(0.11f)); + }); + forMesh(writer, ingredient(Items.RED_SAND), EItems.DIAMOND_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.10f)); + addDrop.accept(Items.DEAD_BUSH, chance(0.03f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.14f)); + addDrop.accept(Items.REDSTONE, chance(0.14f)); + addDrop.accept(Items.RAW_GOLD, chance(0.08f)); + }); + forMesh(writer, ingredient(Items.RED_SAND), EItems.NETHERITE_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { + addDrop.accept(Items.CACTUS, chance(0.12f)); + addDrop.accept(Items.GOLD_NUGGET, chance(0.15f)); + addDrop.accept(Items.REDSTONE, chance(0.17f)); + addDrop.accept(Items.RAW_GOLD, chance(0.10f)); + }); + forMesh(writer, ingredient(EItems.DUST.get()), EItems.STRING_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.1f)); addDrop.accept(Items.BONE_MEAL, chance(0.1f)); @@ -618,6 +411,7 @@ class Recipes { addDrop.accept(Items.BLAZE_POWDER, chance(0.03f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.06f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.05f), modInstalled(ModIds.EXTREME_REACTORS)); }); forMesh(writer, ingredient(EItems.DUST.get()), EItems.FLINT_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.11f)); @@ -627,6 +421,7 @@ class Recipes { addDrop.accept(Items.BLAZE_POWDER, chance(0.04f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.07f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.055f), modInstalled(ModIds.EXTREME_REACTORS)); }); forMesh(writer, ingredient(EItems.DUST.get()), EItems.IRON_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.13f)); @@ -637,6 +432,7 @@ class Recipes { addDrop.accept(Items.IRON_NUGGET, chance(0.06f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.09f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.08f), modInstalled(ModIds.EXTREME_REACTORS)); }); forMesh(writer, ingredient(EItems.DUST.get()), EItems.GOLDEN_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.13f)); @@ -648,6 +444,7 @@ class Recipes { addDrop.accept(Items.RAW_GOLD, chance(0.02f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.11f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.10f), modInstalled(ModIds.EXTREME_REACTORS)); }); forMesh(writer, ingredient(EItems.DUST.get()), EItems.DIAMOND_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.14f)); @@ -658,6 +455,7 @@ class Recipes { addDrop.accept(Items.GOLD_NUGGET, chance(0.08f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.12f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.12f), modInstalled(ModIds.EXTREME_REACTORS)); }); forMesh(writer, ingredient(EItems.DUST.get()), EItems.NETHERITE_MESH, (addDrop, addTagDrop, addConditionalDrop) -> { addDrop.accept(Items.GUNPOWDER, chance(0.14f)); @@ -669,6 +467,7 @@ class Recipes { addDrop.accept(Items.IRON_NUGGET, chance(0.08f)); addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.135f), modInstalled(ModIds.ENDERIO)); + addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.14f), modInstalled(ModIds.EXTREME_REACTORS)); }); // Crushed Deepslate -> String mesh @@ -1031,10 +830,18 @@ class Recipes { return binomial(1, p); } + private static ICondition tagNotEmpty(TagKey tag) { + return new NotCondition(new TagEmptyCondition(tag.location())); + } + + private static ICondition modInstalled(String modid) { + return new ModLoadedCondition(modid); + } + private static void forMesh(Consumer writer, Ingredient block, RegistryObject mesh, ForMeshContext addDrops) { var folder = mesh.getId().getPath().replace("_mesh", "/"); var basePath = path(block.getItems()[0].getItem()) + "/" + folder; - + addDrops.accept( (result, resultAmount) -> sieveRecipe(writer, basePath + path(result), block, mesh, result, resultAmount), (resultTag, resultAmount) -> sieveRecipeTag(writer, basePath + resultTag.location().getPath().concat("_tag"), block, mesh, resultTag, resultAmount), @@ -1066,7 +873,7 @@ class Recipes { private static void sieveRecipeTag(Consumer writer, String name, Ingredient block, Supplier mesh, TagKey result, NumberProvider resultAmount) { writer.accept(new FinishedSieveRecipe(new ResourceLocation(ExDeorum.ID, "sieve/" + name), mesh.get(), block, Either.right(result), resultAmount)); } - + private static void sieveConditional(Consumer writer, String name, Ingredient block, Supplier mesh, Either> result, NumberProvider resultAmount, ICondition condition) { var path = new ResourceLocation(ExDeorum.ID, "sieve/" + name); ConditionalRecipe.builder() @@ -1074,197 +881,4 @@ class Recipes { .addRecipe(new FinishedSieveRecipe(path, mesh.get(), block, result, resultAmount)) .build(writer, path); } - - private static void crucibleRecipes(Consumer writer) { - lavaCrucible(writer, "cobblestone", ingredient(Tags.Items.COBBLESTONE), 250); - lavaCrucible(writer, "stone", ingredient(Tags.Items.STONE), 250); - lavaCrucible(writer, "gravel", ingredient(Tags.Items.GRAVEL), 250); - lavaCrucible(writer, "netherrack", ingredient(Tags.Items.NETHERRACK), 500); - - waterCrucible(writer, "saplings", ingredient(ItemTags.SAPLINGS), 100); - waterCrucible(writer, "leaves", ingredient(ItemTags.LEAVES), 250); - waterCrucible(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100); - waterCrucible(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 200); - waterCrucible(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100); - waterCrucible(writer, "lily_pad", ingredient(Items.LILY_PAD), 150); - waterCrucible(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 100); - waterCrucible(writer, "vine", ingredient(Items.VINE), 100); - waterCrucible(writer, "seeds_and_spores", SPORES_AND_SEEDS, 50); - waterCrucible(writer, "seeds", ingredient(Tags.Items.SEEDS), 50); - waterCrucible(writer, "grass", ingredient(Items.GRASS, Items.TALL_GRASS), 100); - waterCrucible(writer, "grass_block", ingredient(Items.GRASS_BLOCK), 150); - waterCrucible(writer, "sweet_berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 50); - waterCrucible(writer, "melon_slice", ingredient(Items.MELON_SLICE), 50); - waterCrucible(writer, "potato", ingredient(Items.POTATO), 100); - waterCrucible(writer, "carrot", ingredient(Items.CARROT), 100); - waterCrucible(writer, "beetroot", ingredient(Items.BEETROOT), 100); - waterCrucible(writer, "apple", ingredient(Items.APPLE), 100); - waterCrucible(writer, "cactus", ingredient(Items.CACTUS), 250); - waterCrucible(writer, "pumpkin", ingredient(Items.PUMPKIN), 250); - waterCrucible(writer, "melon", ingredient(Items.MELON), 250); - waterCrucible(writer, "seagrass", ingredient(Items.SEAGRASS), 100); - waterCrucible(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 200); - waterCrucible(writer, "moss", ingredient(Items.MOSS_BLOCK), 150); - waterCrucible(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100); - waterCrucible(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 150); - } - - private static void lavaCrucible(Consumer writer, String id, Ingredient ingredient, int volume) { - writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "lava_crucible/" + id), ERecipeSerializers.LAVA_CRUCIBLE.get(), ingredient, Fluids.LAVA, volume)); - } - - private static void waterCrucible(Consumer writer, String id, Ingredient ingredient, int volume) { - writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "water_crucible/" + id), ERecipeSerializers.WATER_CRUCIBLE.get(), ingredient, Fluids.WATER, volume)); - } - - private static void hammerRecipes(Consumer writer) { - // Cobblestone -> Gravel -> Sand -> Dust - hammerRecipe(writer, "gravel", ingredient(Items.COBBLESTONE, Items.DIORITE, Items.GRANITE, Items.ANDESITE), Blocks.GRAVEL); - hammerRecipe(writer, "sand", ingredient(Items.GRAVEL), Blocks.SAND); - hammerRecipe(writer, "dust", ingredient(Items.SAND, Items.RED_SAND), EBlocks.DUST.get()); - - hammerRecipe(writer, "crushed_deepslate", ingredient(Blocks.DEEPSLATE, Blocks.COBBLED_DEEPSLATE), EBlocks.CRUSHED_DEEPSLATE.get()); - hammerRecipe(writer, "crushed_netherrack", ingredient(Blocks.NETHERRACK), EBlocks.CRUSHED_NETHERRACK.get()); - hammerRecipe(writer, "crushed_blackstone", ingredient(Blocks.BLACKSTONE), EBlocks.CRUSHED_BLACKSTONE.get()); - hammerRecipe(writer, "crushed_end_stone", ingredient(Blocks.END_STONE), EBlocks.CRUSHED_END_STONE.get()); - - hammerRecipe(writer, "crushing_sandstone", ingredient(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), Items.SAND); - hammerRecipe(writer, "crushing_red_sandstone", ingredient(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), Items.RED_SAND); - hammerRecipe(writer, "crushing_stone_bricks", ingredient(Items.STONE_BRICKS), Items.CRACKED_STONE_BRICKS); - - hammerRecipe(writer, "stone_pebbles", ingredient(Items.STONE, Items.STONE_BRICKS, Items.CHISELED_STONE_BRICKS, Items.CRACKED_STONE_BRICKS), EItems.STONE_PEBBLE.get(), new UniformGenerator(ConstantValue.exactly(1), ConstantValue.exactly(6))); - hammerRecipe(writer, "basalt", ingredient(Items.POLISHED_BASALT, Items.SMOOTH_BASALT), Items.BASALT); - - hammerRecipe(writer, "tube_coral", ingredient(Items.TUBE_CORAL_BLOCK), Items.TUBE_CORAL); - hammerRecipe(writer, "brain_coral", ingredient(Items.BRAIN_CORAL_BLOCK), Items.BRAIN_CORAL); - hammerRecipe(writer, "bubble_coral", ingredient(Items.BUBBLE_CORAL_BLOCK), Items.BUBBLE_CORAL); - hammerRecipe(writer, "fire_coral", ingredient(Items.FIRE_CORAL_BLOCK), Items.FIRE_CORAL); - hammerRecipe(writer, "horn_coral", ingredient(Items.HORN_CORAL_BLOCK), Items.HORN_CORAL); - hammerRecipe(writer, "tube_coral_fan", ingredient(Items.TUBE_CORAL), Items.TUBE_CORAL_FAN); - hammerRecipe(writer, "brain_coral_fan", ingredient(Items.BRAIN_CORAL), Items.BRAIN_CORAL_FAN); - hammerRecipe(writer, "bubble_coral_fan", ingredient(Items.BUBBLE_CORAL), Items.BUBBLE_CORAL_FAN); - hammerRecipe(writer, "fire_coral_fan", ingredient(Items.FIRE_CORAL), Items.FIRE_CORAL_FAN); - hammerRecipe(writer, "horn_coral_fan", ingredient(Items.HORN_CORAL), Items.HORN_CORAL_FAN); - - hammerRecipe(writer, "prismarine", ingredient(Items.PRISMARINE, Items.PRISMARINE_BRICKS, Items.DARK_PRISMARINE), Items.PRISMARINE_SHARD, between(1, 4)); - } - - private static void hammerRecipe(Consumer writer, String name, Ingredient block, ItemLike result) { - hammerRecipe(writer, name, block, result, ConstantValue.exactly(1f)); - } - - private static void hammerRecipe(Consumer writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) { - writer.accept(new FinishedHammerRecipe(new ResourceLocation(ExDeorum.ID, "hammer/" + name), block, result.asItem(), resultAmount)); - } - - private static void barrelCompostRecipes(Consumer writer) { - // plants - barrelCompost(writer, "saplings", ingredient(ItemTags.SAPLINGS), 125); - barrelCompost(writer, "leaves", ingredient(ItemTags.LEAVES), 125); - barrelCompost(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100); - barrelCompost(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 150); - barrelCompost(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100); - barrelCompost(writer, "lily_pad", ingredient(Items.LILY_PAD), 100); - barrelCompost(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 80); - barrelCompost(writer, "vine", ingredient(Items.VINE), 100); - barrelCompost(writer, "grass", ingredient(Items.GRASS, Items.FERN), 100); - barrelCompost(writer, "tall_grass", ingredient(Items.TALL_GRASS, Items.LARGE_FERN), 150); - barrelCompost(writer, "seagrass", ingredient(Items.SEAGRASS), 80); - barrelCompost(writer, "nether_wart", ingredient(Items.NETHER_WART), 100); - barrelCompost(writer, "seeds", ingredient(Tags.Items.SEEDS), 80); - barrelCompost(writer, "wheat", ingredient(Tags.Items.CROPS_WHEAT), 80); - barrelCompost(writer, "berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 80); - barrelCompost(writer, "melon", ingredient(Items.MELON), 200); - barrelCompost(writer, "cake", ingredient(Items.CAKE), 500); - barrelCompost(writer, "pumpkin", ingredient(Items.PUMPKIN), 500); - barrelCompost(writer, "carrots", ingredient(Items.CARROT), 100); - barrelCompost(writer, "potatoes", ingredient(Items.POTATO, Items.BAKED_POTATO, Items.POISONOUS_POTATO), 80); - barrelCompost(writer, "beetroot", ingredient(Items.BEETROOT), 80); - barrelCompost(writer, "moss_block", ingredient(Items.MOSS_BLOCK), 150); - barrelCompost(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100); - barrelCompost(writer, "spores_and_seeds", SPORES_AND_SEEDS, 80); - barrelCompost(writer, "bamboo", ingredient(Items.BAMBOO), 100); - barrelCompost(writer, "cactus", ingredient(Items.CACTUS), 125); - barrelCompost(writer, "dead_bush", ingredient(Items.DEAD_BUSH), 80); - barrelCompost(writer, "chorus_flower", ingredient(Items.CHORUS_FLOWER), 150); - barrelCompost(writer, "chorus_fruit", ingredient(Items.CHORUS_FRUIT), 80); - barrelCompost(writer, "chorus_plant", ingredient(Items.CHORUS_PLANT), 150); - barrelCompost(writer, "kelp", ingredient(Items.KELP, Items.DRIED_KELP), 80); - barrelCompost(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 80); - barrelCompost(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 125); - barrelCompost(writer, "weeping_vines", ingredient(Items.WEEPING_VINES), 100); - barrelCompost(writer, "twisting_vines", ingredient(Items.TWISTING_VINES), 100); - // flesh - barrelCompost(writer, "rotten_flesh", ingredient(Items.ROTTEN_FLESH), 100); - barrelCompost(writer, "spider_eye", ingredient(Items.SPIDER_EYE), 80); - barrelCompost(writer, "fermented_spider_eye", ingredient(Items.FERMENTED_SPIDER_EYE), 100); - barrelCompost(writer, "string", ingredient(Items.STRING), 40); - barrelCompost(writer, "rabbit_foot", ingredient(Items.RABBIT_FOOT), 100); - // meats - barrelCompost(writer, "pork", ingredient(Items.PORKCHOP, Items.COOKED_PORKCHOP), 150); - barrelCompost(writer, "beef", ingredient(Items.BEEF, Items.COOKED_BEEF), 150); - barrelCompost(writer, "chicken", ingredient(Items.CHICKEN, Items.COOKED_CHICKEN), 125); - barrelCompost(writer, "mutton", ingredient(Items.MUTTON, Items.COOKED_MUTTON), 125); - barrelCompost(writer, "salmon", ingredient(Items.SALMON, Items.COOKED_SALMON), 125); - barrelCompost(writer, "rabbit", ingredient(Items.RABBIT, Items.COOKED_RABBIT), 100); - barrelCompost(writer, "cod", ingredient(Items.COD, Items.COOKED_COD), 100); - barrelCompost(writer, "tropical_fish", ingredient(Items.TROPICAL_FISH), 80); - barrelCompost(writer, "pufferfish", ingredient(Items.PUFFERFISH), 80); - barrelCompost(writer, "egg", ingredient(Items.EGG), 100); - // foods - barrelCompost(writer, "melon_slice", ingredient(Items.MELON_SLICE), 40); - barrelCompost(writer, "silk_worms", ingredient(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get()), 40); - barrelCompost(writer, "apple", ingredient(Items.APPLE), 100); - barrelCompost(writer, "cookie", ingredient(Items.COOKIE), 100); - barrelCompost(writer, "pumpkin_pie", ingredient(Items.PUMPKIN_PIE), 150); - barrelCompost(writer, "bread", ingredient(Items.BREAD), 125); - barrelCompost(writer, "mushroom_stew", ingredient(Items.MUSHROOM_STEW), 200); - barrelCompost(writer, "suspicious_stew", ingredient(Items.SUSPICIOUS_STEW), 200); - barrelCompost(writer, "beetroot_soup", ingredient(Items.BEETROOT_SOUP), 150); - barrelCompost(writer, "rabbit_stew", ingredient(Items.RABBIT_STEW), 200); - - // lol - barrelCompost(writer, "golden_apples", ingredient(Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE), 1000); - } - - private static void barrelCompost(Consumer writer, String id, Ingredient ingredient, int volume) { - writer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExDeorum.ID, "barrel_compost/" + id), ingredient, volume)); - } - - private static void barrelMixingRecipes(Consumer writer) { - // water - barrelMixing(writer, ingredient(EItems.DUST.get()), Fluids.WATER, Items.CLAY); - barrelMixing(writer, ingredient(Items.MILK_BUCKET), Fluids.WATER, Items.SLIME_BLOCK); - barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_MILK_BUCKET.get()), Fluids.WATER, Items.SLIME_BLOCK); - barrelMixing(writer, ingredient(Items.SNOWBALL), Fluids.WATER, Items.ICE); - barrelMixing(writer, ingredient(Items.LAVA_BUCKET), Fluids.WATER, Items.STONE); - barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_LAVA_BUCKET), Fluids.WATER, Items.STONE); - // lava - barrelMixing(writer, ingredient(EItems.WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK); - barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK); - barrelMixing(writer, ingredient(Items.GLOWSTONE_DUST), Fluids.LAVA, Items.END_STONE); - barrelMixing(writer, ingredient(Items.WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN); - barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN); - barrelMixing(writer, ingredient(Items.SLIME_BALL), Fluids.LAVA, Items.MAGMA_CREAM); - barrelMixing(writer, ingredient(Items.SOUL_SAND), Fluids.LAVA, Items.SOUL_SOIL); - // witch water - barrelMixing(writer, ingredient(Items.SAND), EFluids.WITCH_WATER.get(), Items.SOUL_SAND); - } - - private static void barrelMixing(Consumer writer, Ingredient ingredient, Fluid fluidType, Item result) { - writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result)), ingredient, fluidType, 1000, result)); - } - - // todo replace with fluid mixing recipe type - private static void barrelMixing(Consumer writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) { - writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result) + suffix), ingredient, fluidType, 1000, result)); - } - - private static ICondition tagNotEmpty(TagKey tag) { - return new NotCondition(new TagEmptyCondition(tag.location())); - } - - private static ICondition modInstalled(String modid) { - return new ModLoadedCondition(modid); - } } diff --git a/src/main/java/thedarkcolour/exdeorum/item/WateringCanItem.java b/src/main/java/thedarkcolour/exdeorum/item/WateringCanItem.java index f04c083d..67c2136f 100644 --- a/src/main/java/thedarkcolour/exdeorum/item/WateringCanItem.java +++ b/src/main/java/thedarkcolour/exdeorum/item/WateringCanItem.java @@ -162,8 +162,12 @@ public class WateringCanItem extends Item { } if (!fluidHandler.getFluidInTank(0).isEmpty()) { - if (usableInMachines || !(player instanceof FakePlayer)) { + var realPlayer = !(player instanceof FakePlayer); + + if (realPlayer) { player.startUsingItem(hand); + } else if (this.usableInMachines) { + onUseTick(level, player, itemInHand, 72000); } return InteractionResultHolder.consume(itemInHand); @@ -176,7 +180,7 @@ public class WateringCanItem extends Item { public void onUseTick(Level level, LivingEntity living, ItemStack stack, int remainingTicks) { var useTicks = 72000 - remainingTicks; - if (useTicks >= STARTUP_TIME) { + if (useTicks >= STARTUP_TIME || living instanceof FakePlayer) { stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).ifPresent(fluidHandler -> { if (!fluidHandler.getFluidInTank(0).isEmpty()) { // do watering can @@ -191,7 +195,7 @@ public class WateringCanItem extends Item { if (useTicks % WATERING_INTERVAL == 0) { tryWatering((ServerLevel) level, pos, state); - if (!renewing || fluidHandler.getFluidInTank(0).getAmount() != capacity) { + if (!this.renewing || fluidHandler.getFluidInTank(0).getAmount() != capacity) { if (!(living instanceof Player player && player.getAbilities().instabuild)) { ((CapabilityProvider) fluidHandler).drain(); } diff --git a/src/main/java/thedarkcolour/exdeorum/recipe/RecipeUtil.java b/src/main/java/thedarkcolour/exdeorum/recipe/RecipeUtil.java index 602aa0ec..df87ae31 100644 --- a/src/main/java/thedarkcolour/exdeorum/recipe/RecipeUtil.java +++ b/src/main/java/thedarkcolour/exdeorum/recipe/RecipeUtil.java @@ -32,6 +32,7 @@ import net.minecraft.util.GsonHelper; import net.minecraft.world.Container; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; @@ -46,6 +47,7 @@ import net.minecraftforge.common.util.Lazy; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; +import thedarkcolour.exdeorum.compat.ModdedTags; import thedarkcolour.exdeorum.recipe.barrel.BarrelCompostRecipe; import thedarkcolour.exdeorum.recipe.barrel.BarrelMixingRecipe; import thedarkcolour.exdeorum.recipe.crucible.CrucibleRecipe; @@ -291,7 +293,7 @@ public final class RecipeUtil { } public static boolean isTagEmpty(TagKey tag) { - return BuiltInRegistries.ITEM.getTag(tag).map(set -> !set.iterator().hasNext()).orElse(true); + return BuiltInRegistries.ITEM.getTag(tag).map(set -> !set.iterator().hasNext()).orElse(ModdedTags.getPreferredOre(tag) == Items.AIR); } private record SieveCacheKey(Item mesh, Item ingredient) {