From 9deea24e7bd21a6f6292c83877ff3845dcae0c88 Mon Sep 17 00:00:00 2001 From: Eli Gibbs Date: Thu, 29 Jan 2026 23:18:17 -0500 Subject: [PATCH] continue datagen, but broken --- .../jurassicrevived/compat/JEIJRPlugin.java | 26 +- .../datagen/ModRecipeProvider.java | 296 +++++++++++++++++ .../custom/DNAAnalyzingRecipeBuilder.java | 199 +++++++++++ .../custom/DNAExtractingRecipeBuilder.java | 199 +++++++++++ .../custom/DNAHybridizingRecipeBuilder.java | 229 +++++++++++++ ...yoCalcificationMachiningRecipeBuilder.java | 177 ++++++++++ .../custom/EmbryonicMachineRecipeBuilder.java | 194 +++++++++++ .../custom/FossilCleaningRecipeBuilder.java | 192 +++++++++++ .../custom/FossilGrindingRecipeBuilder.java | 219 ++++++++++++ .../custom/IncubatingRecipeBuilder.java | 170 ++++++++++ .../datagen/DataGenerators.java | 1 + .../datagen/FabricRecipeProvider.java | 312 ++++++++++++++++++ .../datagen/DataGenerators.java | 1 + .../datagen/ForgeRecipeProvider.java | 184 +++++++++++ .../datagen/DataGenerators.java | 3 +- .../datagen/NeoForgeRecipeProvider.java | 203 ++++++++++++ 16 files changed, 2580 insertions(+), 25 deletions(-) create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/ModRecipeProvider.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAAnalyzingRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAExtractingRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAHybridizingRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryoCalcificationMachiningRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryonicMachineRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilCleaningRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilGrindingRecipeBuilder.java create mode 100644 common/src/main/java/net/cmr/jurassicrevived/datagen/custom/IncubatingRecipeBuilder.java create mode 100644 fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricRecipeProvider.java create mode 100644 minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeRecipeProvider.java create mode 100644 neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeRecipeProvider.java diff --git a/common/src/main/java/net/cmr/jurassicrevived/compat/JEIJRPlugin.java b/common/src/main/java/net/cmr/jurassicrevived/compat/JEIJRPlugin.java index 5b30285..4c77636 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/compat/JEIJRPlugin.java +++ b/common/src/main/java/net/cmr/jurassicrevived/compat/JEIJRPlugin.java @@ -28,7 +28,6 @@ public class JEIJRPlugin implements IModPlugin { return Constants.rl("jei_plugin"); } - // Expose JEI ingredient manager so categories can access all item variants (including mod-provided filled tanks) public static @org.jetbrains.annotations.Nullable IIngredientManager INGREDIENT_MANAGER; @Override @@ -38,24 +37,6 @@ public class JEIJRPlugin implements IModPlugin { @Override public void registerIngredients(IModIngredientRegistration registration) { - // We need to register the FluidStack ingredient type to use it in recipes - // However, JEI usually provides its own fluid type on each platform. - // In a common environment, we might be defining a duplicate type if we aren't careful. - // But since we are using Architectury's FluidStack, we can try to register it as a custom ingredient. - // Note: This might not automatically work with JEI's built-in fluid rendering unless we provide a helper. - // For now, we register it so we can use it in our custom renderer. - - // registration.register(FLUID_STACK_TYPE, Collections.emptyList(), new FluidStackHelper(), new FluidStackRenderer()); - // Implementing the helper and renderer is non-trivial without platform specifics. - // If we just want to use it in a custom slot renderer, we might not strictly need to register the *collection* of ingredients, - // but we do need the type to be recognized if we pass it to addIngredient. - - // Actually, addIngredient(IIngredientType type, T ingredient) requires the type to be known? - // JEI documentation says: "Custom ingredients must be registered with IModIngredientRegistration" - - // Given the complexity of cross-platform fluid registration in a common module without a bridge library, - // and that we only want to render a static water stack, we might be better off faking it or waiting for a bridge. - // But let's try to define the constant at least. } @Override @@ -74,8 +55,7 @@ public class JEIJRPlugin implements IModPlugin { public void registerRecipes(IRecipeRegistration registration) { RecipeManager recipeManager = Minecraft.getInstance().level.getRecipeManager(); - /*? if >1.20.1 {*/ - + //? if >1.20.1 { /*List dnaExtractorRecipes = recipeManager .getAllRecipesFor(ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList(); List dnaAnalyzerRecipes = recipeManager @@ -92,7 +72,7 @@ public class JEIJRPlugin implements IModPlugin { .getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList(); List incubatorRecipes = recipeManager .getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get()).stream().map(net.minecraft.world.item.crafting.RecipeHolder::value).toList(); - *//*?} else {*/ + *///?} else { List dnaExtractorRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_EXTRACTOR_RECIPE_TYPE.get()); List dnaAnalyzerRecipes = recipeManager.getAllRecipesFor(ModRecipes.DNA_ANALYZER_RECIPE_TYPE.get()); List fossilGrinderRecipes = recipeManager.getAllRecipesFor(ModRecipes.FOSSIL_GRINDER_RECIPE_TYPE.get()); @@ -101,7 +81,7 @@ public class JEIJRPlugin implements IModPlugin { List embryonicMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYONIC_MACHINE_RECIPE_TYPE.get()); List embryoCalcificationMachineRecipes = recipeManager.getAllRecipesFor(ModRecipes.EMBRYO_CALCIFICATION_MACHINE_RECIPE_TYPE.get()); List incubatorRecipes = recipeManager.getAllRecipesFor(ModRecipes.INCUBATOR_RECIPE_TYPE.get()); - /*?}*/ + //?} registration.addRecipes(DNAExtractorRecipeCategory.DNA_EXTRACTOR_RECIPE_RECIPE_TYPE, dnaExtractorRecipes); registration.addRecipes(DNAAnalyzerRecipeCategory.DNA_ANALYZER_RECIPE_RECIPE_TYPE, dnaAnalyzerRecipes); diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModRecipeProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModRecipeProvider.java new file mode 100644 index 0000000..ca97ea3 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModRecipeProvider.java @@ -0,0 +1,296 @@ +package net.cmr.jurassicrevived.datagen; + +import net.cmr.jurassicrevived.block.ModBlocks; +import net.cmr.jurassicrevived.item.ModItems; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Blocks; + +import java.util.List; + +public class ModRecipeProvider { + + public interface RecipeHelper { + void buildShaped(RecipeCategory category, ItemLike result, int count, String[] patterns, Object... keys); + void buildShapeless(RecipeCategory category, ItemLike result, int count, ItemLike... ingredients); + void buildShapeless(RecipeCategory category, ItemLike result, int count, String name, ItemLike... ingredients); + void buildSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group); + void buildBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group); + void buildSmelting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group); + void buildBlasting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group); + + // Custom + void dnaExtracting(ItemLike testTube, ItemLike tissue, ItemLike dna, int count); + void dnaAnalyzing(ItemLike testTube, ItemLike material, ItemLike dna, int count); + void dnaHybridizing(ItemLike result, int count, ItemLike catalyst, ItemLike... ingredients); + void embryonicMachine(ItemLike syringe, ItemLike dna, ItemLike catalyst, ItemLike result, int count); + void embryoCalcification(ItemLike syringe, ItemLike egg, ItemLike result, int count); + void incubating(ItemLike egg, ItemLike result, int count); + void fossilGrinding(ItemLike fossil, ItemLike tissue, int count); + void skullToTissue(ItemLike skull, ItemLike tissue, int count); + void fossilCleaning(ItemLike fossilBlock, ItemLike result, int count); + + // Special cases + void amberRandomDNA(ItemLike testTube, ItemLike amber, ItemLike defaultDna, int count); + } + + public static void registerRecipes(RecipeHelper helper) { + List GYPSUM_COBBLESTONE_SMELTABLES = List.of(ModBlocks.GYPSUM_COBBLESTONE.get()); + helper.buildSmelting(GYPSUM_COBBLESTONE_SMELTABLES, RecipeCategory.MISC, ModBlocks.GYPSUM_STONE.get(), 0.25f, 200, "jr_gypsum_stone"); + helper.buildBlasting(GYPSUM_COBBLESTONE_SMELTABLES, RecipeCategory.MISC, ModBlocks.GYPSUM_STONE.get(), 0.25f, 100, "jr_gypsum_stone"); + + List GYPSUM_STONE_SMELTABLES = List.of(ModBlocks.GYPSUM_STONE.get()); + helper.buildSmelting(GYPSUM_STONE_SMELTABLES, RecipeCategory.MISC, ModBlocks.SMOOTH_GYPSUM_STONE.get(), 0.25f, 200, "jr_smooth_gypsum_stone"); + helper.buildBlasting(GYPSUM_STONE_SMELTABLES, RecipeCategory.MISC, ModBlocks.SMOOTH_GYPSUM_STONE.get(), 0.25f, 100, "jr_smooth_gypsum_stone"); + + TagKey CHARRED_TERRACOTTA_SMELTABLES = ItemTags.TERRACOTTA; + helper.buildSmelting(CHARRED_TERRACOTTA_SMELTABLES, RecipeCategory.MISC, ModBlocks.CHARRED_TERRACOTTA.get(), 0.25f, 200, "jr_charred_terracotta"); + helper.buildBlasting(CHARRED_TERRACOTTA_SMELTABLES, RecipeCategory.MISC, ModBlocks.CHARRED_TERRACOTTA.get(), 0.25f, 100, "jr_charred_terracotta"); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.GYPSUM_BRICK_STAIRS.get(), 4, new String[]{"A ", "AA ", "AAA"}, 'A', ModBlocks.GYPSUM_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.GYPSUM_BRICK_SLAB.get(), 6, new String[]{"AAA"}, 'A', ModBlocks.GYPSUM_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.GYPSUM_BRICK_WALL.get(), 6, new String[]{"AAA", "AAA"}, 'A', ModBlocks.GYPSUM_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.CHISELED_GYPSUM_STONE.get(), 1, new String[]{"A", "A"}, 'A', ModBlocks.GYPSUM_BRICK_SLAB.get()); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.REINFORCED_BRICK_STAIRS.get(), 4, new String[]{"A ", "AA ", "AAA"}, 'A', ModBlocks.REINFORCED_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.REINFORCED_BRICK_SLAB.get(), 6, new String[]{"AAA"}, 'A', ModBlocks.REINFORCED_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.REINFORCED_BRICK_WALL.get(), 6, new String[]{"AAA", "AAA"}, 'A', ModBlocks.REINFORCED_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.CHISELED_REINFORCED_STONE.get(), 1, new String[]{"A", "A"}, 'A', ModBlocks.REINFORCED_BRICK_SLAB.get()); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.TRASH_CAN.get(), 1, new String[]{"AAA", "A A", "AAA"}, 'A', Items.IRON_INGOT); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.BENCH.get(), 1, new String[]{"A ", "AAA", "BBB"}, 'A', ItemTags.PLANKS, 'B', ModBlocks.REINFORCED_STONE_BRICKS.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.FENCE_LIGHT.get(), 1, new String[]{"A", "B"}, 'A', Blocks.GLOWSTONE, 'B', Items.IRON_INGOT); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.LIGHT_POST.get(), 1, new String[]{"A", "B"}, 'A', Blocks.GLOWSTONE, 'B', ModBlocks.GYPSUM_STONE.get()); + + helper.buildShaped(RecipeCategory.MISC, ModItems.TEST_TUBE.get(), 3, new String[]{" A", " B ", "B "}, 'A', Items.IRON_INGOT, 'B', Blocks.GLASS); + helper.buildShaped(RecipeCategory.MISC, ModItems.SYRINGE.get(), 3, new String[]{" A", " B ", "C "}, 'A', Items.IRON_INGOT, 'B', Blocks.GLASS, 'C', Items.IRON_NUGGET); + helper.buildShaped(RecipeCategory.MISC, ModItems.CABLE.get(), 4, new String[]{" BA", "BAB", "AB "}, 'A', Items.COPPER_INGOT, 'B', Items.IRON_NUGGET); + helper.buildShaped(RecipeCategory.MISC, ModItems.SCREEN.get(), 2, new String[]{"ABA", "ABA", " C "}, 'A', Items.IRON_INGOT, 'B', Blocks.REDSTONE_LAMP, 'C', ModItems.CABLE.get()); + helper.buildShaped(RecipeCategory.MISC, ModItems.PROCESSOR.get(), 1, new String[]{"ABA", "BCB", "ABA"}, 'A', Items.GOLD_NUGGET, 'B', Items.IRON_INGOT, 'C', Items.REDSTONE); + helper.buildShaped(RecipeCategory.MISC, ModItems.TIRE.get(), 1, new String[]{"AAA", "ABA", "AAA"}, 'A', Items.INK_SAC, 'B', Items.IRON_INGOT); + helper.buildShaped(RecipeCategory.MISC, ModItems.CUTTING_BLADES.get(), 4, new String[]{"A A", " A ", "A A"}, 'A', Items.IRON_INGOT); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.GYPSUM_STONE_BRICKS.get(), 4, new String[]{"AA", "AA"}, 'A', ModBlocks.GYPSUM_STONE.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.REINFORCED_STONE.get(), 6, new String[]{"AAA", "AAA", "AAA"}, 'A', Blocks.STONE); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.REINFORCED_STONE_BRICKS.get(), 6, new String[]{"AAA", "AAA", "AAA"}, 'A', Blocks.STONE_BRICKS); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.LOW_SECURITY_FENCE_POLE.get(), 8, new String[]{"ABA", " B ", "ABA"}, 'A', Items.IRON_NUGGET, 'B', Items.IRON_INGOT); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.LOW_SECURITY_FENCE_WIRE.get(), 16, new String[]{"AAA", " B ", "AAA"}, 'A', Items.IRON_INGOT, 'B', Items.REDSTONE); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.MEDIUM_SECURITY_FENCE_POLE.get(), 8, new String[]{"ABA", "ABA", "ABA"}, 'A', Items.IRON_INGOT, 'B', Items.IRON_NUGGET); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.MEDIUM_SECURITY_FENCE_WIRE.get(), 16, new String[]{"AAA", "BBB", "AAA"}, 'A', Items.IRON_INGOT, 'B', Items.REDSTONE); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.TANK.get(), 1, new String[]{"AAA", "ABA", "AAA"}, 'A', Items.IRON_INGOT, 'B', Items.BUCKET); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.POWER_CELL.get(), 1, new String[]{"AAA", "ABA", "AAA"}, 'A', Items.IRON_INGOT, 'B', ModBlocks.POWER_PIPE.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.WOOD_CRATE.get(), 1, new String[]{"AAA", "ABA", "AAA"}, 'A', ItemTags.PLANKS, 'B', Blocks.CHEST); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.IRON_CRATE.get(), 1, new String[]{"AAA", "ABA", "AAA"}, 'A', Items.IRON_INGOT, 'B', Blocks.CHEST); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.CAT_PLUSHIE.get(), 1, new String[]{"ABA", "CBD", "BBA"}, 'A', Blocks.BLACK_WOOL, 'B', Blocks.WHITE_WOOL, 'C', Blocks.GREEN_WOOL, 'D', Blocks.GRAY_WOOL); + + helper.buildShaped(RecipeCategory.MISC, ModBlocks.GENERATOR.get(), 1, new String[]{"ABA", "CDE", "ABA"}, 'A', Blocks.IRON_BLOCK, 'B', ModItems.CABLE.get(), 'C', Blocks.REDSTONE_BLOCK, 'D', ModItems.PROCESSOR.get(), 'E', Items.COPPER_INGOT); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.DNA_EXTRACTOR.get(), 1, new String[]{"AAA", "BCD", "AAA"}, 'A', Items.LAPIS_LAZULI, 'B', ModItems.SCREEN.get(), 'C', ModItems.CABLE.get(), 'D', ModItems.PROCESSOR.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.DNA_ANALYZER.get(), 1, new String[]{"AAA", "BCD", "EEE"}, 'A', ModItems.TEST_TUBE.get(), 'B', ModItems.SCREEN.get(), 'C', ModItems.CABLE.get(), 'D', ModItems.PROCESSOR.get(), 'E', ModItems.SYRINGE.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.FOSSIL_GRINDER.get(), 1, new String[]{"ABA", "CDC", "AEA"}, 'A', Items.IRON_INGOT, 'B', Blocks.GLASS, 'C', Items.LAPIS_LAZULI, 'D', ModItems.CUTTING_BLADES.get(), 'E', Items.WATER_BUCKET); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.FOSSIL_CLEANER.get(), 1, new String[]{"ABA", "ACA", "AAA"}, 'A', Items.IRON_INGOT, 'B', Items.IRON_NUGGET, 'C', Blocks.GLASS); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.DNA_HYBRIDIZER.get(), 1, new String[]{"ABA", "CDC", "BEB"}, 'A', ModItems.SCREEN.get(), 'B', Items.IRON_INGOT, 'C', ModItems.CABLE.get(), 'D', ModItems.PROCESSOR.get(), 'E', Items.REDSTONE); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYONIC_MACHINE.get(), 1, new String[]{"AAA", "BCB", "ADA"}, 'A', Items.IRON_INGOT, 'B', ModItems.TEST_TUBE.get(), 'C', Items.IRON_NUGGET, 'D', Items.REDSTONE); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, new String[]{"AB ", "CDE", "FAF"}, 'A', Items.IRON_INGOT, 'B', ModItems.SYRINGE.get(), 'C', ModItems.SCREEN.get(), 'D', ModItems.CABLE.get(), 'E', ModItems.PROCESSOR.get(), 'F', Items.FLINT); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, new String[]{"AAA", "BCB", "DED"}, 'A', Blocks.GLASS, 'B', Items.COPPER_INGOT, 'C', Blocks.HAY_BLOCK, 'D', Items.IRON_INGOT, 'E', ModItems.CABLE.get()); + helper.buildShaped(RecipeCategory.MISC, ModItems.WRENCH.get(), 1, new String[]{" A ", " BA", "B "}, 'A', Items.IRON_INGOT, 'B', Items.IRON_NUGGET); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.ITEM_PIPE.get(), 8, new String[]{"AAA"}, 'A', ModItems.CABLE.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.FLUID_PIPE.get(), 8, new String[]{" A ", "BBB", " A "}, 'A', Items.WATER_BUCKET, 'B', ModItems.CABLE.get()); + helper.buildShaped(RecipeCategory.MISC, ModBlocks.POWER_PIPE.get(), 8, new String[]{" A ", "BBB", " A "}, 'A', Items.REDSTONE, 'B', ModItems.CABLE.get()); + + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_GENERATOR.get(), 1, "white_generator_from_generator", ModBlocks.GENERATOR.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.GENERATOR.get(), 1, "generator_from_white_generator", ModBlocks.WHITE_GENERATOR.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_DNA_EXTRACTOR.get(), 1, "white_dna_extractor_from_dna_extractor", ModBlocks.DNA_EXTRACTOR.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.DNA_EXTRACTOR.get(), 1, "dna_extractor_from_white_dna_extractor", ModBlocks.WHITE_DNA_EXTRACTOR.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_DNA_ANALYZER.get(), 1, "white_dna_analyzer_from_dna_analyzer", ModBlocks.DNA_ANALYZER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.DNA_ANALYZER.get(), 1, "dna_analyzer_from_white_dna_analyzer", ModBlocks.WHITE_DNA_ANALYZER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_FOSSIL_GRINDER.get(), 1, "white_fossil_grinder_from_fossil_grinder", ModBlocks.FOSSIL_GRINDER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.FOSSIL_GRINDER.get(), 1, "fossil_grinder_from_white_fossil_grinder", ModBlocks.WHITE_FOSSIL_GRINDER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_FOSSIL_CLEANER.get(), 1, "white_fossil_cleaner_from_fossil_cleaner", ModBlocks.FOSSIL_CLEANER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.FOSSIL_CLEANER.get(), 1, "fossil_cleaner_from_white_fossil_cleaner", ModBlocks.WHITE_FOSSIL_CLEANER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_DNA_HYBRIDIZER.get(), 1, "white_dna_hybridizer_from_dna_hybridizer", ModBlocks.DNA_HYBRIDIZER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.DNA_HYBRIDIZER.get(), 1, "dna_hybridizer_from_white_dna_hybridizer", ModBlocks.WHITE_DNA_HYBRIDIZER.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_EMBRYONIC_MACHINE.get(), 1, "white_embryonic_machine_from_embryonic_machine", ModBlocks.EMBRYONIC_MACHINE.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.EMBRYONIC_MACHINE.get(), 1, "embryonic_machine_from_white_embryonic_machine", ModBlocks.WHITE_EMBRYONIC_MACHINE.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get(), 1, "white_embryo_calcification_machine_from_embryo_calcification_machine", ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.EMBRYO_CALCIFICATION_MACHINE.get(), 1, "embryo_calcification_machine_from_white_embryo_calcification_machine", ModBlocks.WHITE_EMBRYO_CALCIFICATION_MACHINE.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.WHITE_INCUBATOR.get(), 1, "white_incubator_from_incubator", ModBlocks.INCUBATOR.get()); + helper.buildShapeless(RecipeCategory.MISC, ModBlocks.INCUBATOR.get(), 1, "incubator_from_white_incubator", ModBlocks.WHITE_INCUBATOR.get()); + + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.APATOSAURUS_TISSUE.get(), ModItems.APATOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALBERTOSAURUS_TISSUE.get(), ModItems.ALBERTOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.BRACHIOSAURUS_TISSUE.get(), ModItems.BRACHIOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CERATOSAURUS_TISSUE.get(), ModItems.CERATOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.COMPSOGNATHUS_TISSUE.get(), ModItems.COMPSOGNATHUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DILOPHOSAURUS_TISSUE.get(), ModItems.DILOPHOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DIPLODOCUS_TISSUE.get(), ModItems.DIPLODOCUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.GALLIMIMUS_TISSUE.get(), ModItems.GALLIMIMUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.INDOMINUS_REX_TISSUE.get(), ModItems.INDOMINUS_REX_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.OURANOSAURUS_TISSUE.get(), ModItems.OURANOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PARASAUROLOPHUS_TISSUE.get(), ModItems.PARASAUROLOPHUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.SPINOSAURUS_TISSUE.get(), ModItems.SPINOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TRICERATOPS_TISSUE.get(), ModItems.TRICERATOPS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TYRANNOSAURUS_REX_TISSUE.get(), ModItems.TYRANNOSAURUS_REX_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.VELOCIRAPTOR_TISSUE.get(), ModItems.VELOCIRAPTOR_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.BARYONYX_TISSUE.get(), ModItems.BARYONYX_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CARNOTAURUS_TISSUE.get(), ModItems.CARNOTAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CONCAVENATOR_TISSUE.get(), ModItems.CONCAVENATOR_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DEINONYCHUS_TISSUE.get(), ModItems.DEINONYCHUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.EDMONTOSAURUS_TISSUE.get(), ModItems.EDMONTOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.GIGANOTOSAURUS_TISSUE.get(), ModItems.GIGANOTOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.GUANLONG_TISSUE.get(), ModItems.GUANLONG_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.HERRERASAURUS_TISSUE.get(), ModItems.HERRERASAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MAJUNGASAURUS_TISSUE.get(), ModItems.MAJUNGASAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PROCOMPSOGNATHUS_TISSUE.get(), ModItems.PROCOMPSOGNATHUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PROTOCERATOPS_TISSUE.get(), ModItems.PROTOCERATOPS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.RUGOPS_TISSUE.get(), ModItems.RUGOPS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.SHANTUNGOSAURUS_TISSUE.get(), ModItems.SHANTUNGOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.STEGOSAURUS_TISSUE.get(), ModItems.STEGOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.STYRACOSAURUS_TISSUE.get(), ModItems.STYRACOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.THERIZINOSAURUS_TISSUE.get(), ModItems.THERIZINOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DISTORTUS_REX_TISSUE.get(), ModItems.DISTORTUS_REX_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALLOSAURUS_TISSUE.get(), ModItems.ALLOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ALVAREZSAURUS_TISSUE.get(), ModItems.ALVAREZSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ANKYLOSAURUS_TISSUE.get(), ModItems.ANKYLOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ARAMBOURGIANIA_TISSUE.get(), ModItems.ARAMBOURGIANIA_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CARCHARODONTOSAURUS_TISSUE.get(), ModItems.CARCHARODONTOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CEARADACTYLUS_TISSUE.get(), ModItems.CEARADACTYLUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CHASMOSAURUS_TISSUE.get(), ModItems.CHASMOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.COELOPHYSIS_TISSUE.get(), ModItems.COELOPHYSIS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.COELURUS_TISSUE.get(), ModItems.COELURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.CORYTHOSAURUS_TISSUE.get(), ModItems.CORYTHOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DIMORPHODON_TISSUE.get(), ModItems.DIMORPHODON_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.DRYOSAURUS_TISSUE.get(), ModItems.DRYOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.GEOSTERNBERGIA_TISSUE.get(), ModItems.GEOSTERNBERGIA_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.GUIDRACO_TISSUE.get(), ModItems.GUIDRACO_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.HADROSAURUS_TISSUE.get(), ModItems.HADROSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.HYPSILOPHODON_TISSUE.get(), ModItems.HYPSILOPHODON_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.INDORAPTOR_TISSUE.get(), ModItems.INDORAPTOR_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.INOSTRANCEVIA_TISSUE.get(), ModItems.INOSTRANCEVIA_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.LAMBEOSAURUS_TISSUE.get(), ModItems.LAMBEOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.LUDODACTYLUS_TISSUE.get(), ModItems.LUDODACTYLUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MAMENCHISAURUS_TISSUE.get(), ModItems.MAMENCHISAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.METRIACANTHOSAURUS_TISSUE.get(), ModItems.METRIACANTHOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.MOGANOPTERUS_TISSUE.get(), ModItems.MOGANOPTERUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.NYCTOSAURUS_TISSUE.get(), ModItems.NYCTOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ORNITHOLESTES_TISSUE.get(), ModItems.ORNITHOLESTES_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ORNITHOMIMUS_TISSUE.get(), ModItems.ORNITHOMIMUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.OVIRAPTOR_TISSUE.get(), ModItems.OVIRAPTOR_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PACHYCEPHALOSAURUS_TISSUE.get(), ModItems.PACHYCEPHALOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PROCERATOSAURUS_TISSUE.get(), ModItems.PROCERATOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PTERANODON_TISSUE.get(), ModItems.PTERANODON_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.PTERODAUSTRO_TISSUE.get(), ModItems.PTERODAUSTRO_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.QUETZALCOATLUS_TISSUE.get(), ModItems.QUETZALCOATLUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.RAJASAURUS_TISSUE.get(), ModItems.RAJASAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.SEGISAURUS_TISSUE.get(), ModItems.SEGISAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TAPEJARA_TISSUE.get(), ModItems.TAPEJARA_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TITANOSAURUS_TISSUE.get(), ModItems.TITANOSAURUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TROODON_TISSUE.get(), ModItems.TROODON_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TROPEOGNATHUS_TISSUE.get(), ModItems.TROPEOGNATHUS_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.TUPUXUARA_TISSUE.get(), ModItems.TUPUXUARA_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.UTAHRAPTOR_TISSUE.get(), ModItems.UTAHRAPTOR_DNA.get(), 1); + helper.dnaExtracting(ModItems.TEST_TUBE.get(), ModItems.ZHENYUANOPTERUS_TISSUE.get(), ModItems.ZHENYUANOPTERUS_DNA.get(), 1); + + helper.fossilCleaning(ModBlocks.STONE_FOSSIL.get(), ModItems.APATOSAURUS_SKULL_FOSSIL.get(), 1); + helper.fossilCleaning(ModBlocks.DEEPSLATE_FOSSIL.get(), ModItems.VELOCIRAPTOR_SKULL_FOSSIL.get(), 1); + + helper.dnaHybridizing(ModItems.INDOMINUS_REX_DNA.get(), 1, ModItems.FROG_DNA.get(), + ModItems.TYRANNOSAURUS_REX_DNA.get(), + ModItems.VELOCIRAPTOR_DNA.get(), + ModItems.CARNOTAURUS_DNA.get(), + ModItems.THERIZINOSAURUS_DNA.get(), + ModItems.MAJUNGASAURUS_DNA.get(), + ModItems.RUGOPS_DNA.get(), + ModItems.GIGANOTOSAURUS_DNA.get()); + + helper.dnaHybridizing(ModItems.DISTORTUS_REX_DNA.get(), 1, ModItems.FROG_DNA.get(), + ModItems.TYRANNOSAURUS_REX_DNA.get(), + ModItems.BRACHIOSAURUS_DNA.get(), + ModItems.VELOCIRAPTOR_DNA.get()); + + helper.dnaHybridizing(ModItems.INDORAPTOR_DNA.get(), 1, ModItems.FROG_DNA.get(), + ModItems.INDOMINUS_REX_DNA.get(), + ModItems.VELOCIRAPTOR_DNA.get()); + + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.APATOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.APATOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ALBERTOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ALBERTOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.BRACHIOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.BRACHIOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CERATOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CERATOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.COMPSOGNATHUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.COMPSOGNATHUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DILOPHOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DILOPHOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DIPLODOCUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DIPLODOCUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.GALLIMIMUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.GALLIMIMUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.INDOMINUS_REX_DNA.get(), ModItems.FROG_DNA.get(), ModItems.INDOMINUS_REX_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.OURANOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.OURANOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PARASAUROLOPHUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PARASAUROLOPHUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.SPINOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.SPINOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TRICERATOPS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TRICERATOPS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TYRANNOSAURUS_REX_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TYRANNOSAURUS_REX_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.VELOCIRAPTOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.VELOCIRAPTOR_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.BARYONYX_DNA.get(), ModItems.FROG_DNA.get(), ModItems.BARYONYX_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CARNOTAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CARNOTAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CONCAVENATOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CONCAVENATOR_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DEINONYCHUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DEINONYCHUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.EDMONTOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.EDMONTOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.GIGANOTOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.GIGANOTOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.GUANLONG_DNA.get(), ModItems.FROG_DNA.get(), ModItems.GUANLONG_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.HERRERASAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.HERRERASAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MAJUNGASAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MAJUNGASAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PROCOMPSOGNATHUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PROCOMPSOGNATHUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PROTOCERATOPS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PROTOCERATOPS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.RUGOPS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.RUGOPS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.SHANTUNGOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.SHANTUNGOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.STEGOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.STEGOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.STYRACOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.STYRACOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.THERIZINOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.THERIZINOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DISTORTUS_REX_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DISTORTUS_REX_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ALLOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ALLOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ALVAREZSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ALVAREZSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ANKYLOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ANKYLOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ARAMBOURGIANIA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ARAMBOURGIANIA_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CARCHARODONTOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CARCHARODONTOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CEARADACTYLUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CEARADACTYLUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CHASMOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CHASMOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.COELOPHYSIS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.COELOPHYSIS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.COELURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.COELURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.CORYTHOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.CORYTHOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DIMORPHODON_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DIMORPHODON_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.DRYOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.DRYOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.GEOSTERNBERGIA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.GEOSTERNBERGIA_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.GUIDRACO_DNA.get(), ModItems.FROG_DNA.get(), ModItems.GUIDRACO_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.HADROSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.HADROSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.HYPSILOPHODON_DNA.get(), ModItems.FROG_DNA.get(), ModItems.HYPSILOPHODON_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.INDORAPTOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.INDORAPTOR_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.INOSTRANCEVIA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.INOSTRANCEVIA_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.LAMBEOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.LAMBEOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.LUDODACTYLUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.LUDODACTYLUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MAMENCHISAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MAMENCHISAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.METRIACANTHOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.METRIACANTHOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.MOGANOPTERUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.MOGANOPTERUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.NYCTOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.NYCTOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ORNITHOLESTES_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ORNITHOLESTES_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ORNITHOMIMUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ORNITHOMIMUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.OVIRAPTOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.OVIRAPTOR_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PACHYCEPHALOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PACHYCEPHALOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PROCERATOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PROCERATOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PTERANODON_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PTERANODON_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.PTERODAUSTRO_DNA.get(), ModItems.FROG_DNA.get(), ModItems.PTERODAUSTRO_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.QUETZALCOATLUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.QUETZALCOATLUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.RAJASAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.RAJASAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.SEGISAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.SEGISAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TAPEJARA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TAPEJARA_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TITANOSAURUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TITANOSAURUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TROODON_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TROODON_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TROPEOGNATHUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TROPEOGNATHUS_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.TUPUXUARA_DNA.get(), ModItems.FROG_DNA.get(), ModItems.TUPUXUARA_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.UTAHRAPTOR_DNA.get(), ModItems.FROG_DNA.get(), ModItems.UTAHRAPTOR_SYRINGE.get(), 1); + helper.embryonicMachine(ModItems.SYRINGE.get(), ModItems.ZHENYUANOPTERUS_DNA.get(), ModItems.FROG_DNA.get(), ModItems.ZHENYUANOPTERUS_SYRINGE.get(), 1); + + helper.amberRandomDNA(ModItems.TEST_TUBE.get(), ModItems.MOSQUITO_IN_AMBER.get(), ModItems.FROG_DNA.get(), 1); + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAAnalyzingRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAAnalyzingRecipeBuilder.java new file mode 100644 index 0000000..8977827 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAAnalyzingRecipeBuilder.java @@ -0,0 +1,199 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.DNAAnalyzerRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class DNAAnalyzingRecipeBuilder { + private java.util.Optional firstItem = java.util.Optional.empty(); + private java.util.Optional secondItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final Map weights = new java.util.HashMap<>(); + + public DNAAnalyzingRecipeBuilder(ItemLike ingredient, ItemLike secondIngredient, ItemLike result, int count) { + this.firstItem = java.util.Optional.of(ingredient); + this.secondItem = java.util.Optional.of(secondIngredient); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + public static DNAAnalyzingRecipeBuilder amberRandomDNAUniform(ItemLike testtube, ItemLike amber, ItemLike placeholderResult, int count) { + return new DNAAnalyzingRecipeBuilder(testtube, amber, placeholderResult, count); + } + + public DNAAnalyzingRecipeBuilder addDNAWeight(ItemLike dnaItem, int weight) { + ResourceLocation id = BuiltInRegistries.ITEM.getKey(dnaItem.asItem()); + if (id != null) { + weights.put(id, weight); + } + return this; + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_analyzing" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(firstItem.orElseThrow())); + inputs.add(Ingredient.of(secondItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + DNAAnalyzerRecipe recipe = new DNAAnalyzerRecipe(inputs, result, Map.copyOf(this.weights)); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_analyzing" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(firstItem.orElseThrow()), + Ingredient.of(secondItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + this.weights, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient first; + private final Ingredient second; + private final Item result; + private final int count; + private final Map weights; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient first, Ingredient second, Item result, int count, Map weights, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.first = first; + this.second = second; + this.result = result; + this.count = count; + this.weights = weights; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(first.toJson()); + ingredients.add(second.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + + if (!weights.isEmpty()) { + JsonObject weightsObj = new JsonObject(); + weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v)); + json.add("weights", weightsObj); + } + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.DNA_ANALYZER_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public DNAAnalyzingRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public DNAAnalyzingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAExtractingRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAExtractingRecipeBuilder.java new file mode 100644 index 0000000..b92acda --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAExtractingRecipeBuilder.java @@ -0,0 +1,199 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.DNAExtractorRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class DNAExtractingRecipeBuilder { + private java.util.Optional firstItem = java.util.Optional.empty(); + private java.util.Optional secondItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final java.util.Map weights = new java.util.HashMap<>(); + + public DNAExtractingRecipeBuilder(ItemLike ingredient, ItemLike secondIngredient, ItemLike result, int count) { + this.firstItem = java.util.Optional.of(ingredient); + this.secondItem = java.util.Optional.of(secondIngredient); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + public static DNAExtractingRecipeBuilder amberRandomDNAUniform(ItemLike testtube, ItemLike amber, ItemLike placeholderResult, int count) { + return new DNAExtractingRecipeBuilder(testtube, amber, placeholderResult, count); + } + + public DNAExtractingRecipeBuilder addDNAWeight(ItemLike dnaItem, int weight) { + ResourceLocation id = BuiltInRegistries.ITEM.getKey(dnaItem.asItem()); + if (id != null) { + weights.put(id, weight); + } + return this; + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_extracting" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(firstItem.orElseThrow())); + inputs.add(Ingredient.of(secondItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + DNAExtractorRecipe recipe = new DNAExtractorRecipe(inputs, result, java.util.Map.copyOf(this.weights)); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_extracting" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(firstItem.orElseThrow()), + Ingredient.of(secondItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + this.weights, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient first; + private final Ingredient second; + private final Item result; + private final int count; + private final Map weights; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient first, Ingredient second, Item result, int count, Map weights, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.first = first; + this.second = second; + this.result = result; + this.count = count; + this.weights = weights; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(first.toJson()); + ingredients.add(second.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + + if (!weights.isEmpty()) { + JsonObject weightsObj = new JsonObject(); + weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v)); + json.add("weights", weightsObj); + } + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.DNA_EXTRACTOR_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public DNAExtractingRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public DNAExtractingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAHybridizingRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAHybridizingRecipeBuilder.java new file mode 100644 index 0000000..a409e35 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/DNAHybridizingRecipeBuilder.java @@ -0,0 +1,229 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.DNAHybridizerRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class DNAHybridizingRecipeBuilder { + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final NonNullList ingredients = NonNullList.create(); + private java.util.Optional catalyst = java.util.Optional.empty(); + + public DNAHybridizingRecipeBuilder(ItemLike result, int count) { + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + public static DNAHybridizingRecipeBuilder result(ItemLike result, int count) { + return new DNAHybridizingRecipeBuilder(result, count); + } + + public DNAHybridizingRecipeBuilder addIngredient(ItemLike item) { + if (this.ingredients.size() >= 9) { + throw new IllegalStateException("DNAHybridizer supports at most 9 input ingredients"); + } + this.ingredients.add(Ingredient.of(item)); + return this; + } + + public DNAHybridizingRecipeBuilder addIngredient(Ingredient ingredient) { + if (this.ingredients.size() >= 9) { + throw new IllegalStateException("DNAHybridizer supports at most 9 input ingredients"); + } + this.ingredients.add(ingredient); + return this; + } + + public DNAHybridizingRecipeBuilder setCatalyst(ItemLike item) { + this.catalyst = java.util.Optional.of(item); + return this; + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_hybridizing" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + if (this.ingredients.isEmpty()) { + throw new IllegalStateException("DNAHybridizingRecipeBuilder requires at least 1 ingredient"); + } + NonNullList inputs = NonNullList.create(); + inputs.addAll(this.ingredients); + + if (inputs.size() > 8 && catalyst.isPresent()) { + throw new IllegalStateException("When a catalyst is set, at most 8 regular ingredients are allowed (slot 9 is reserved)."); + } + + if (catalyst.isPresent()) { + while (inputs.size() < 8) { + inputs.add(Ingredient.EMPTY); + } + inputs.add(Ingredient.of(catalyst.get())); + } + + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + DNAHybridizerRecipe recipe = new DNAHybridizerRecipe(inputs, result); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_dna_hybridizing" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + if (this.ingredients.isEmpty()) { + throw new IllegalStateException("DNAHybridizingRecipeBuilder requires at least 1 ingredient"); + } + NonNullList inputs = NonNullList.create(); + inputs.addAll(this.ingredients); + + if (inputs.size() > 8 && catalyst.isPresent()) { + throw new IllegalStateException("When a catalyst is set, at most 8 regular ingredients are allowed (slot 9 is reserved)."); + } + + if (catalyst.isPresent()) { + while (inputs.size() < 8) { + inputs.add(Ingredient.EMPTY); + } + inputs.add(Ingredient.of(catalyst.get())); + } + + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + inputs, + this.resultItem.orElseThrow(), + this.count, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final NonNullList ingredients; + private final Item result; + private final int count; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, NonNullList ingredients, Item result, int count, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.ingredients = ingredients; + this.result = result; + this.count = count; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredientsJson = new JsonArray(); + for (Ingredient ingredient : ingredients) { + ingredientsJson.add(ingredient.toJson()); + } + json.add("ingredients", ingredientsJson); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.DNA_HYBRIDIZER_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public DNAHybridizingRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public DNAHybridizingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryoCalcificationMachiningRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryoCalcificationMachiningRecipeBuilder.java new file mode 100644 index 0000000..aeff277 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryoCalcificationMachiningRecipeBuilder.java @@ -0,0 +1,177 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.EmbryoCalcificationMachineRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class EmbryoCalcificationMachiningRecipeBuilder { + private java.util.Optional firstItem = java.util.Optional.empty(); + private java.util.Optional secondItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + + public EmbryoCalcificationMachiningRecipeBuilder(ItemLike ingredient, ItemLike secondIngredient, ItemLike result, int count) { + this.firstItem = java.util.Optional.of(ingredient); + this.secondItem = java.util.Optional.of(secondIngredient); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_embryo_calcification_machining" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(firstItem.orElseThrow())); + inputs.add(Ingredient.of(secondItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + EmbryoCalcificationMachineRecipe recipe = new EmbryoCalcificationMachineRecipe(inputs, result); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_embryo_calcification_machining" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(firstItem.orElseThrow()), + Ingredient.of(secondItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient first; + private final Ingredient second; + private final Item result; + private final int count; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient first, Ingredient second, Item result, int count, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.first = first; + this.second = second; + this.result = result; + this.count = count; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(first.toJson()); + ingredients.add(second.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.EMBRYO_CALCIFICATION_MACHINE_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public EmbryoCalcificationMachiningRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public EmbryoCalcificationMachiningRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryonicMachineRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryonicMachineRecipeBuilder.java new file mode 100644 index 0000000..0ddc286 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/EmbryonicMachineRecipeBuilder.java @@ -0,0 +1,194 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.EmbryonicMachineRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class EmbryonicMachineRecipeBuilder { + private java.util.Optional firstItem = java.util.Optional.empty(); + private java.util.Optional secondItem = java.util.Optional.empty(); + private java.util.Optional thirdItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final Map weights = new java.util.HashMap<>(); + + public EmbryonicMachineRecipeBuilder(ItemLike ingredient, ItemLike secondIngredient, ItemLike thirdIngredient, ItemLike result, int count) { + this.firstItem = java.util.Optional.of(ingredient); + this.secondItem = java.util.Optional.of(secondIngredient); + this.thirdItem = java.util.Optional.of(thirdIngredient); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_embryonic_machining" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(firstItem.orElseThrow())); + inputs.add(Ingredient.of(secondItem.orElseThrow())); + inputs.add(Ingredient.of(thirdItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + EmbryonicMachineRecipe recipe = new EmbryonicMachineRecipe(inputs, result, Map.copyOf(this.weights)); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_embryonic_machining" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(firstItem.orElseThrow()), + Ingredient.of(secondItem.orElseThrow()), + Ingredient.of(thirdItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + this.weights, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient first; + private final Ingredient second; + private final Ingredient third; + private final Item result; + private final int count; + private final Map weights; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient first, Ingredient second, Ingredient third, Item result, int count, Map weights, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.first = first; + this.second = second; + this.third = third; + this.result = result; + this.count = count; + this.weights = weights; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(first.toJson()); + ingredients.add(second.toJson()); + ingredients.add(third.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + + if (!weights.isEmpty()) { + JsonObject weightsObj = new JsonObject(); + weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v)); + json.add("weights", weightsObj); + } + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.EMBRYONIC_MACHINE_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public EmbryonicMachineRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public EmbryonicMachineRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilCleaningRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilCleaningRecipeBuilder.java new file mode 100644 index 0000000..b987619 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilCleaningRecipeBuilder.java @@ -0,0 +1,192 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.FossilCleanerRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class FossilCleaningRecipeBuilder { + private java.util.Optional firstItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final Map weights = new java.util.HashMap<>(); + + public FossilCleaningRecipeBuilder(ItemLike ingredient, ItemLike placeholderResult, int count) { + this.firstItem = java.util.Optional.of(ingredient); + this.resultItem = java.util.Optional.of(placeholderResult.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + public static FossilCleaningRecipeBuilder randomFossil(ItemLike consumableInput, ItemLike placeholderResult, int count) { + return new FossilCleaningRecipeBuilder(consumableInput, placeholderResult, count); + } + + public FossilCleaningRecipeBuilder addFossilWeight(ItemLike fossilItem, int weight) { + ResourceLocation id = BuiltInRegistries.ITEM.getKey(fossilItem.asItem()); + if (id != null) { + weights.put(id, weight); + } + return this; + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_fossil_cleaning" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(firstItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + FossilCleanerRecipe recipe = new FossilCleanerRecipe(inputs, result, Map.copyOf(this.weights)); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_fossil_cleaning" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(firstItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + this.weights, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient first; + private final Item result; + private final int count; + private final Map weights; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient first, Item result, int count, Map weights, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.first = first; + this.result = result; + this.count = count; + this.weights = weights; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(first.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + + if (!weights.isEmpty()) { + JsonObject weightsObj = new JsonObject(); + weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v)); + json.add("weights", weightsObj); + } + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.FOSSIL_CLEANER_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public FossilCleaningRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public FossilCleaningRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilGrindingRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilGrindingRecipeBuilder.java new file mode 100644 index 0000000..104f558 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/FossilGrindingRecipeBuilder.java @@ -0,0 +1,219 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.item.ModItems; +import net.cmr.jurassicrevived.recipe.FossilGrinderRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +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 java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class FossilGrindingRecipeBuilder { + private java.util.Optional inputItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + private final java.util.Map weights = new java.util.HashMap<>(); + + public FossilGrindingRecipeBuilder(ItemLike input, ItemLike result, int count) { + this.inputItem = java.util.Optional.of(input); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + public static FossilGrindingRecipeBuilder fossilWeighted(ItemLike fossil, ItemLike tissueResult, int count) { + FossilGrindingRecipeBuilder b = new FossilGrindingRecipeBuilder(fossil, tissueResult, count); + b.addWeightedOutput(Items.BONE_MEAL, 40) + .addWeightedOutput(ModItems.CRUSHED_FOSSIL.get(), 40) + .addWeightedOutput(tissueResult, 20); + return b; + } + + public static FossilGrindingRecipeBuilder skullToTissue(ItemLike skull, ItemLike tissueResult, int count) { + return new FossilGrindingRecipeBuilder(skull, tissueResult, count); + } + + public FossilGrindingRecipeBuilder addWeightedOutput(ItemLike item, int weight) { + ResourceLocation id = BuiltInRegistries.ITEM.getKey(item.asItem()); + if (id != null) { + weights.put(id, Math.max(0, weight)); + } + return this; + } + + //? if >1.20.1 { + /*public void saveFossil(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_fossil_" + "grinding" + ); + save(output, id); + } + + public void saveSkull(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_skull_" + "grinding" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(inputItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + FossilGrinderRecipe recipe = new FossilGrinderRecipe(inputs, result, java.util.Map.copyOf(this.weights)); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void saveFossil(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_fossil_" + "grinding" + ); + save(consumer, id); + } + + public void saveSkull(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_skull_" + "grinding" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(inputItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + this.weights, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient input; + private final Item result; + private final int count; + private final Map weights; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient input, Item result, int count, Map weights, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.input = input; + this.result = result; + this.count = count; + this.weights = weights; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(input.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + + if (!weights.isEmpty()) { + JsonObject weightsObj = new JsonObject(); + weights.forEach((k, v) -> weightsObj.addProperty(k.toString(), v)); + json.add("weights", weightsObj); + } + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.FOSSIL_GRINDER_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public FossilGrindingRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public FossilGrindingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/IncubatingRecipeBuilder.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/IncubatingRecipeBuilder.java new file mode 100644 index 0000000..66c24a3 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/custom/IncubatingRecipeBuilder.java @@ -0,0 +1,170 @@ +package net.cmr.jurassicrevived.datagen.custom; + +import net.cmr.jurassicrevived.recipe.IncubatorRecipe; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.core.NonNullList; +import net.minecraft.core.registries.BuiltInRegistries; +//? if >1.20.1 { +/*import net.minecraft.data.recipes.RecipeOutput; +*///?} +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.LinkedHashMap; +import java.util.Map; + +//? if <=1.20.1 { +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.recipe.ModRecipes; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +//?} + +public class IncubatingRecipeBuilder { + private java.util.Optional inputItem = java.util.Optional.empty(); + private java.util.Optional resultItem = java.util.Optional.empty(); + private final int count; + //? if >1.20.1 { + /*private final Map> criteria; + *///?} else { + private final Map criteria; + //?} + + public IncubatingRecipeBuilder(ItemLike input, ItemLike result, int count) { + this.inputItem = java.util.Optional.of(input); + this.resultItem = java.util.Optional.of(result.asItem()); + this.count = count; + this.criteria = new LinkedHashMap(); + } + + //? if >1.20.1 { + /*public void save(RecipeOutput output) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath( + resultKey.getNamespace(), + resultKey.getPath() + "_from_incubating" + ); + save(output, id); + } + + public void save(RecipeOutput output, ResourceLocation recipeId) { + NonNullList inputs = NonNullList.create(); + inputs.add(Ingredient.of(inputItem.orElseThrow())); + ItemStack result = new ItemStack(resultItem.orElseThrow(), this.count); + + IncubatorRecipe recipe = new IncubatorRecipe(inputs, result); + + AdvancementHolder advancementHolder = null; + if (!this.criteria.isEmpty()) { + Advancement.Builder builder = output.advancement(); + for (Map.Entry> e : this.criteria.entrySet()) { + builder.addCriterion(e.getKey(), e.getValue()); + } + builder.rewards(AdvancementRewards.Builder.recipe(recipeId)); + builder.requirements(AdvancementRequirements.Strategy.OR); + advancementHolder = builder.build(recipeId.withPrefix("recipes/")); + } + + output.accept(recipeId, recipe, advancementHolder); + } + *///?} else { + public void save(Consumer consumer) { + ResourceLocation resultKey = BuiltInRegistries.ITEM.getKey(this.resultItem.orElseThrow()); + ResourceLocation id = new ResourceLocation( + resultKey.getNamespace(), + resultKey.getPath() + "_from_incubating" + ); + save(consumer, id); + } + + public void save(Consumer consumer, ResourceLocation recipeId) { + Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(recipeId)) + .rewards(AdvancementRewards.Builder.recipe(recipeId)) + .requirements(RequirementsStrategy.OR); + this.criteria.forEach(advancementBuilder::addCriterion); + + consumer.accept(new Result( + recipeId, + Ingredient.of(inputItem.orElseThrow()), + this.resultItem.orElseThrow(), + this.count, + advancementBuilder, + new ResourceLocation(recipeId.getNamespace(), "recipes/" + recipeId.getPath()) + )); + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final Ingredient input; + private final Item result; + private final int count; + private final Advancement.Builder advancement; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, Ingredient input, Item result, int count, Advancement.Builder advancement, ResourceLocation advancementId) { + this.id = id; + this.input = input; + this.result = result; + this.count = count; + this.advancement = advancement; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + JsonArray ingredients = new JsonArray(); + ingredients.add(input.toJson()); + json.add("ingredients", ingredients); + + JsonObject resultObj = new JsonObject(); + resultObj.addProperty("item", BuiltInRegistries.ITEM.getKey(result).toString()); + if (count > 1) { + resultObj.addProperty("count", count); + } + json.add("result", resultObj); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getType() { + return ModRecipes.INCUBATOR_SERIALIZER.get(); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return advancement.serializeToJson(); + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return advancementId; + } + } + //?} + + //? if >1.20.1 { + /*public IncubatingRecipeBuilder unlockedBy(String name, Criterion criterion) { + *///?} else { + public IncubatingRecipeBuilder unlockedBy(String name, InventoryChangeTrigger.TriggerInstance criterion) { + //?} + this.criteria.put(name, criterion); + return this; + } +} diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index 8abbdf7..dd4e21d 100644 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -13,5 +13,6 @@ public class DataGenerators implements DataGeneratorEntrypoint { pack.addProvider(FabricItemTagProvider::new); pack.addProvider(FabricBlockLootTableProvider::new); pack.addProvider(FabricEntityLootTableProvider::new); + pack.addProvider(FabricRecipeProvider::new); } } diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricRecipeProvider.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricRecipeProvider.java new file mode 100644 index 0000000..5f7f942 --- /dev/null +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/FabricRecipeProvider.java @@ -0,0 +1,312 @@ +package net.cmr.jurassicrevived.datagen; + +import net.cmr.jurassicrevived.Constants; +import net.cmr.jurassicrevived.datagen.custom.*; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.recipes.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.ItemLike; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +//? if <=1.20.1 { +import net.minecraft.data.recipes.FinishedRecipe; +//?} + +public class FabricRecipeProvider extends net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider implements ModRecipeProvider.RecipeHelper { + + //? if >1.20.1 { + /*public FabricRecipeProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + private RecipeOutput output; + + @Override + public void buildRecipes(RecipeOutput output) { + this.output = output; + ModRecipeProvider.registerRecipes(this); + this.output = null; + } + *///?} else { + public FabricRecipeProvider(FabricDataOutput output) { + super(output); + } + + private Consumer output; + + @Override + public void buildRecipes(Consumer output) { + this.output = output; + ModRecipeProvider.registerRecipes(this); + this.output = null; + } + //?} + + @Override + public void buildShaped(RecipeCategory category, ItemLike result, int count, String[] patterns, Object... keys) { + ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(category, result, count); + for (String pattern : patterns) { + builder.pattern(pattern); + } + for (int i = 0; i < keys.length; i += 2) { + Character key = (Character) keys[i]; + Object ingredient = keys[i + 1]; + if (ingredient instanceof ItemLike) { + builder.define(key, (ItemLike) ingredient); + } else if (ingredient instanceof TagKey) { + builder.define(key, (TagKey) ingredient); + } else if (ingredient instanceof Ingredient) { + builder.define(key, (Ingredient) ingredient); + } + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, String name, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + //? if >1.20.1 { + /*builder.save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, name)); + *///?} else { + builder.save(output, new ResourceLocation(Constants.MOD_ID, name)); + //?} + } + + @Override + public void buildSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + //? if >1.20.1 { + /*oreCooking(output, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new, ingredients, category, result, experience, cookingTime, group, "_from_smelting"); + *///?} else { + oreCooking120(output, RecipeSerializer.SMELTING_RECIPE, ingredients, category, result, experience, cookingTime, group, "_from_smelting"); + //?} + } + + @Override + public void buildBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + //? if >1.20.1 { + /*oreCooking(output, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new, ingredients, category, result, experience, cookingTime, group, "_from_blasting"); + *///?} else { + oreCooking120(output, RecipeSerializer.BLASTING_RECIPE, ingredients, category, result, experience, cookingTime, group, "_from_blasting"); + //?} + } + + @Override + public void buildSmelting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + //? if >1.20.1 { + /*SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(result) + "_from_smelting_" + group)); + *///?} else { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, new ResourceLocation(Constants.MOD_ID, getItemName(result) + "_from_smelting_" + group)); + //?} + } + + @Override + public void buildBlasting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + //? if >1.20.1 { + /*SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(result) + "_from_blasting_" + group)); + *///?} else { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, new ResourceLocation(Constants.MOD_ID, getItemName(result) + "_from_blasting_" + group)); + //?} + } + + //? if >1.20.1 { + /*public static void oreCooking( + RecipeOutput pRecipeOutput, + RecipeSerializer pCookingSerializer, + AbstractCookingRecipe.Factory factory, + List pIngredients, + RecipeCategory pCategory, + ItemLike pResult, + float pExperience, + int pCookingTime, + String pGroup, + String pRecipeName + ) { + for(ItemLike itemlike : pIngredients) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), pCategory, pResult, pExperience, pCookingTime, pCookingSerializer, factory) + .group(pGroup).unlockedBy(getHasName(itemlike), has(itemlike)) + .save(pRecipeOutput, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(pResult) + pRecipeName + "_" + getItemName(itemlike))); + } + } + *///?} else { + protected static void oreCooking120(Consumer pRecipeOutput, RecipeSerializer pCookingSerializer, + List pIngredients, RecipeCategory pCategory, ItemLike pResult, float pExperience, int pCookingTime, String pGroup, String pRecipeName) { + for(ItemLike itemlike : pIngredients) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), pCategory, pResult, pExperience, pCookingTime, pCookingSerializer) + .group(pGroup).unlockedBy(getHasName(itemlike), has(itemlike)) + .save(pRecipeOutput, new ResourceLocation(Constants.MOD_ID, getItemName(pResult) + pRecipeName + "_" + getItemName(itemlike))); + } + } + //?} + + @Override + public void dnaExtracting(ItemLike testTube, ItemLike tissue, ItemLike dna, int count) { + //? if >1.20.1 { + /*new DNAExtractingRecipeBuilder(testTube, tissue, dna, count) + .unlockedBy("has_tissue", has(tissue)) + .save(output); + *///?} else { + new DNAExtractingRecipeBuilder(testTube, tissue, dna, count) + .unlockedBy("has_tissue", has(tissue)) + .save(output); + //?} + } + + @Override + public void dnaAnalyzing(ItemLike testTube, ItemLike material, ItemLike dna, int count) { + //? if >1.20.1 { + /*new DNAAnalyzingRecipeBuilder(testTube, material, dna, count) + .unlockedBy("has_material", has(material)) + .save(output); + *///?} else { + new DNAAnalyzingRecipeBuilder(testTube, material, dna, count) + .unlockedBy("has_material", has(material)) + .save(output); + //?} + } + + @Override + public void dnaHybridizing(ItemLike result, int count, ItemLike catalyst, ItemLike... ingredients) { + //? if >1.20.1 { + /*DNAHybridizingRecipeBuilder builder = new DNAHybridizingRecipeBuilder(result, count) + .setCatalyst(catalyst); + for (ItemLike ingredient : ingredients) { + builder.addIngredient(ingredient); + } + builder.unlockedBy("has_catalyst", has(catalyst)) + .save(output); + *///?} else { + DNAHybridizingRecipeBuilder builder = new DNAHybridizingRecipeBuilder(result, count) + .setCatalyst(catalyst); + for (ItemLike ingredient : ingredients) { + builder.addIngredient(ingredient); + } + builder.unlockedBy("has_catalyst", has(catalyst)) + .save(output); + //?} + } + + @Override + public void embryonicMachine(ItemLike syringe, ItemLike dna, ItemLike catalyst, ItemLike result, int count) { + //? if >1.20.1 { + /*new EmbryonicMachineRecipeBuilder(syringe, dna, catalyst, result, count) + .unlockedBy("has_dna", has(dna)) + .save(output); + *///?} else { + new EmbryonicMachineRecipeBuilder(syringe, dna, catalyst, result, count) + .unlockedBy("has_dna", has(dna)) + .save(output); + //?} + } + + @Override + public void embryoCalcification(ItemLike syringe, ItemLike egg, ItemLike result, int count) { + //? if >1.20.1 { + /*new EmbryoCalcificationMachiningRecipeBuilder(syringe, egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + *///?} else { + new EmbryoCalcificationMachiningRecipeBuilder(syringe, egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + //?} + } + + @Override + public void incubating(ItemLike egg, ItemLike result, int count) { + //? if >1.20.1 { + /*new IncubatingRecipeBuilder(egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + *///?} else { + new IncubatingRecipeBuilder(egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + //?} + } + + @Override + public void fossilGrinding(ItemLike fossil, ItemLike tissue, int count) { + //? if >1.20.1 { + /*FossilGrindingRecipeBuilder.fossilWeighted(fossil, tissue, count) + .unlockedBy("has_fossil", has(fossil)) + .saveFossil(output); + *///?} else { + FossilGrindingRecipeBuilder.fossilWeighted(fossil, tissue, count) + .unlockedBy("has_fossil", has(fossil)) + .saveFossil(output); + //?} + } + + @Override + public void skullToTissue(ItemLike skull, ItemLike tissue, int count) { + //? if >1.20.1 { + /*FossilGrindingRecipeBuilder.skullToTissue(skull, tissue, count) + .unlockedBy("has_skull", has(skull)) + .saveSkull(output); + *///?} else { + FossilGrindingRecipeBuilder.skullToTissue(skull, tissue, count) + .unlockedBy("has_skull", has(skull)) + .saveSkull(output); + //?} + } + + @Override + public void fossilCleaning(ItemLike fossilBlock, ItemLike result, int count) { + //? if >1.20.1 { + /*FossilCleaningRecipeBuilder.randomFossil(fossilBlock, result, count) + .unlockedBy("has_fossil_block", has(fossilBlock)) + .save(output); + *///?} else { + FossilCleaningRecipeBuilder.randomFossil(fossilBlock, result, count) + .unlockedBy("has_fossil_block", has(fossilBlock)) + .save(output); + //?} + } + + @Override + public void amberRandomDNA(ItemLike testTube, ItemLike amber, ItemLike defaultDna, int count) { + //? if >1.20.1 { + /*DNAExtractingRecipeBuilder.amberRandomDNAUniform(testTube, amber, defaultDna, count) + .unlockedBy("has_amber", has(amber)) + .save(output); + *///?} else { + DNAExtractingRecipeBuilder.amberRandomDNAUniform(testTube, amber, defaultDna, count) + .unlockedBy("has_amber", has(amber)) + .save(output); + //?} + } +} diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index dd04c45..002daf3 100644 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -39,5 +39,6 @@ public class DataGenerators { new LootTableProvider.SubProviderEntry(ForgeEntityLootTableProvider::new, LootContextParamSets.ENTITY) ) )); + generator.addProvider(event.includeServer(), new ForgeRecipeProvider(packOutput)); } } diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeRecipeProvider.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeRecipeProvider.java new file mode 100644 index 0000000..afa434a --- /dev/null +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/ForgeRecipeProvider.java @@ -0,0 +1,184 @@ +package net.cmr.jurassicrevived.datagen; + +import net.cmr.jurassicrevived.Constants; +import net.cmr.jurassicrevived.datagen.custom.*; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.ItemLike; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +public class ForgeRecipeProvider extends RecipeProvider implements ModRecipeProvider.RecipeHelper { + + public ForgeRecipeProvider(PackOutput output) { + super(output); + } + + private Consumer output; + + @Override + protected void buildRecipes(Consumer output) { + this.output = output; + ModRecipeProvider.registerRecipes(this); + this.output = null; + } + + @Override + public void buildShaped(RecipeCategory category, ItemLike result, int count, String[] patterns, Object... keys) { + ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(category, result, count); + for (String pattern : patterns) { + builder.pattern(pattern); + } + for (int i = 0; i < keys.length; i += 2) { + Character key = (Character) keys[i]; + Object ingredient = keys[i + 1]; + if (ingredient instanceof ItemLike) { + builder.define(key, (ItemLike) ingredient); + } else if (ingredient instanceof TagKey) { + builder.define(key, (TagKey) ingredient); + } else if (ingredient instanceof Ingredient) { + builder.define(key, (Ingredient) ingredient); + } + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, String name, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + builder.save(output, Constants.rl(name)); + } + + @Override + public void buildSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + oreCooking120(output, RecipeSerializer.SMELTING_RECIPE, ingredients, category, result, experience, cookingTime, group, "_from_smelting"); + } + + @Override + public void buildBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + oreCooking120(output, RecipeSerializer.BLASTING_RECIPE, ingredients, category, result, experience, cookingTime, group, "_from_blasting"); + } + + @Override + public void buildSmelting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, Constants.rl(getItemName(result) + "_from_smelting_" + group)); + } + + @Override + public void buildBlasting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, Constants.rl(getItemName(result) + "_from_blasting_" + group)); + } + + protected static void oreCooking120(Consumer pRecipeOutput, RecipeSerializer pCookingSerializer, + List pIngredients, RecipeCategory pCategory, ItemLike pResult, float pExperience, int pCookingTime, String pGroup, String pRecipeName) { + for(ItemLike itemlike : pIngredients) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), pCategory, pResult, pExperience, pCookingTime, pCookingSerializer) + .group(pGroup).unlockedBy(getHasName(itemlike), has(itemlike)) + .save(pRecipeOutput, Constants.rl(getItemName(pResult) + pRecipeName + "_" + getItemName(itemlike))); + } + } + + @Override + public void dnaExtracting(ItemLike testTube, ItemLike tissue, ItemLike dna, int count) { + new DNAExtractingRecipeBuilder(testTube, tissue, dna, count) + .unlockedBy("has_tissue", has(tissue)) + .save(output); + } + + @Override + public void dnaAnalyzing(ItemLike testTube, ItemLike material, ItemLike dna, int count) { + new DNAAnalyzingRecipeBuilder(testTube, material, dna, count) + .unlockedBy("has_material", has(material)) + .save(output); + } + + @Override + public void dnaHybridizing(ItemLike result, int count, ItemLike catalyst, ItemLike... ingredients) { + DNAHybridizingRecipeBuilder builder = new DNAHybridizingRecipeBuilder(result, count) + .setCatalyst(catalyst); + for (ItemLike ingredient : ingredients) { + builder.addIngredient(ingredient); + } + builder.unlockedBy("has_catalyst", has(catalyst)) + .save(output); + } + + @Override + public void embryonicMachine(ItemLike syringe, ItemLike dna, ItemLike catalyst, ItemLike result, int count) { + new EmbryonicMachineRecipeBuilder(syringe, dna, catalyst, result, count) + .unlockedBy("has_dna", has(dna)) + .save(output); + } + + @Override + public void embryoCalcification(ItemLike syringe, ItemLike egg, ItemLike result, int count) { + new EmbryoCalcificationMachiningRecipeBuilder(syringe, egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + } + + @Override + public void incubating(ItemLike egg, ItemLike result, int count) { + new IncubatingRecipeBuilder(egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + } + + @Override + public void fossilGrinding(ItemLike fossil, ItemLike tissue, int count) { + FossilGrindingRecipeBuilder.fossilWeighted(fossil, tissue, count) + .unlockedBy("has_fossil", has(fossil)) + .saveFossil(output); + } + + @Override + public void skullToTissue(ItemLike skull, ItemLike tissue, int count) { + FossilGrindingRecipeBuilder.skullToTissue(skull, tissue, count) + .unlockedBy("has_skull", has(skull)) + .saveSkull(output); + } + + @Override + public void fossilCleaning(ItemLike fossilBlock, ItemLike result, int count) { + FossilCleaningRecipeBuilder.randomFossil(fossilBlock, result, count) + .unlockedBy("has_fossil_block", has(fossilBlock)) + .save(output); + } + + @Override + public void amberRandomDNA(ItemLike testTube, ItemLike amber, ItemLike defaultDna, int count) { + DNAExtractingRecipeBuilder.amberRandomDNAUniform(testTube, amber, defaultDna, count) + .unlockedBy("has_amber", has(amber)) + .save(output); + } +} diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index 2df93dc..1ef5dfe 100644 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -40,7 +40,6 @@ public class DataGenerators { ), lookupProvider )); - - generator.addProvider(event.includeServer(), new NeoForgeGlobalLootModifierProvider(packOutput)); + generator.addProvider(event.includeServer(), new NeoForgeRecipeProvider(packOutput, lookupProvider)); } } diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeRecipeProvider.java b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeRecipeProvider.java new file mode 100644 index 0000000..10952a2 --- /dev/null +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/NeoForgeRecipeProvider.java @@ -0,0 +1,203 @@ +package net.cmr.jurassicrevived.datagen; + +import net.cmr.jurassicrevived.Constants; +import net.cmr.jurassicrevived.datagen.custom.*; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.ItemLike; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class NeoForgeRecipeProvider extends RecipeProvider implements ModRecipeProvider.RecipeHelper { + + public NeoForgeRecipeProvider(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + + private RecipeOutput output; + + @Override + protected void buildRecipes(RecipeOutput output) { + this.output = output; + ModRecipeProvider.registerRecipes(this); + this.output = null; + } + + @Override + public void buildShaped(RecipeCategory category, ItemLike result, int count, String[] patterns, Object... keys) { + ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(category, result, count); + for (String pattern : patterns) { + builder.pattern(pattern); + } + for (int i = 0; i < keys.length; i += 2) { + Character key = (Character) keys[i]; + Object ingredient = keys[i + 1]; + if (ingredient instanceof ItemLike) { + builder.define(key, (ItemLike) ingredient); + } else if (ingredient instanceof TagKey) { + builder.define(key, (TagKey) ingredient); + } else if (ingredient instanceof Ingredient) { + builder.define(key, (Ingredient) ingredient); + } + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + builder.save(output); + } + + @Override + public void buildShapeless(RecipeCategory category, ItemLike result, int count, String name, ItemLike... ingredients) { + ShapelessRecipeBuilder builder = ShapelessRecipeBuilder.shapeless(category, result, count); + for (ItemLike ingredient : ingredients) { + builder.requires(ingredient); + } + builder.unlockedBy("has_item", has(result)); + builder.save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, name)); + } + + @Override + public void buildSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + oreCooking(output, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new, ingredients, category, result, experience, cookingTime, group, "_from_smelting"); + } + + @Override + public void buildBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + oreCooking(output, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new, ingredients, category, result, experience, cookingTime, group, "_from_blasting"); + } + + @Override + public void buildSmelting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(result) + "_from_smelting_" + group)); + } + + @Override + public void buildBlasting(TagKey tag, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(tag), category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new) + .group(group).unlockedBy("has_" + group, has(tag)) + .save(output, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(result) + "_from_blasting_" + group)); + } + + protected static void oreCooking(RecipeOutput pRecipeOutput, RecipeSerializer pCookingSerializer, AbstractCookingRecipe.Factory factory, + List pIngredients, RecipeCategory pCategory, ItemLike pResult, float pExperience, int pCookingTime, String pGroup, String pRecipeName) { + for(ItemLike itemlike : pIngredients) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), pCategory, pResult, pExperience, pCookingTime, pCookingSerializer, factory) + .group(pGroup).unlockedBy(getHasName(itemlike), has(itemlike)) + .save(pRecipeOutput, ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, getItemName(pResult) + pRecipeName + "_" + getItemName(itemlike))); + } + } + + @Override + public void dnaExtracting(ItemLike testTube, ItemLike tissue, ItemLike dna, int count) { + //? if >1.20.1 { + new DNAExtractingRecipeBuilder(testTube, tissue, dna, count) + .unlockedBy("has_tissue", has(tissue)) + .save(output); + //?} + } + + @Override + public void dnaAnalyzing(ItemLike testTube, ItemLike material, ItemLike dna, int count) { + //? if >1.20.1 { + new DNAAnalyzingRecipeBuilder(testTube, material, dna, count) + .unlockedBy("has_material", has(material)) + .save(output); + //?} + } + + @Override + public void dnaHybridizing(ItemLike result, int count, ItemLike catalyst, ItemLike... ingredients) { + //? if >1.20.1 { + DNAHybridizingRecipeBuilder builder = new DNAHybridizingRecipeBuilder(result, count) + .setCatalyst(catalyst); + for (ItemLike ingredient : ingredients) { + builder.addIngredient(ingredient); + } + builder.unlockedBy("has_catalyst", has(catalyst)) + .save(output); + //?} + } + + @Override + public void embryonicMachine(ItemLike syringe, ItemLike dna, ItemLike catalyst, ItemLike result, int count) { + //? if >1.20.1 { + new EmbryonicMachineRecipeBuilder(syringe, dna, catalyst, result, count) + .unlockedBy("has_dna", has(dna)) + .save(output); + //?} + } + + @Override + public void embryoCalcification(ItemLike syringe, ItemLike egg, ItemLike result, int count) { + //? if >1.20.1 { + new EmbryoCalcificationMachiningRecipeBuilder(syringe, egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + //?} + } + + @Override + public void incubating(ItemLike egg, ItemLike result, int count) { + //? if >1.20.1 { + new IncubatingRecipeBuilder(egg, result, count) + .unlockedBy("has_egg", has(egg)) + .save(output); + //?} + } + + @Override + public void fossilGrinding(ItemLike fossil, ItemLike tissue, int count) { + //? if >1.20.1 { + FossilGrindingRecipeBuilder.fossilWeighted(fossil, tissue, count) + .unlockedBy("has_fossil", has(fossil)) + .saveFossil(output); + //?} + } + + @Override + public void skullToTissue(ItemLike skull, ItemLike tissue, int count) { + //? if >1.20.1 { + FossilGrindingRecipeBuilder.skullToTissue(skull, tissue, count) + .unlockedBy("has_skull", has(skull)) + .saveSkull(output); + //?} + } + + @Override + public void fossilCleaning(ItemLike fossilBlock, ItemLike result, int count) { + //? if >1.20.1 { + FossilCleaningRecipeBuilder.randomFossil(fossilBlock, result, count) + .unlockedBy("has_fossil_block", has(fossilBlock)) + .save(output); + //?} + } + + @Override + public void amberRandomDNA(ItemLike testTube, ItemLike amber, ItemLike defaultDna, int count) { + //? if >1.20.1 { + DNAExtractingRecipeBuilder.amberRandomDNAUniform(testTube, amber, defaultDna, count) + .unlockedBy("has_amber", has(amber)) + .save(output); + //?} + } +}