package net.minecraft.data.recipes; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import javax.annotation.Nullable; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.critereon.EnterBlockTrigger; import net.minecraft.advancements.critereon.ImpossibleTrigger; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.BlockFamilies; import net.minecraft.data.BlockFamily; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.HoneycombItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; 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.Recipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.SmeltingRecipe; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.SuspiciousEffectHolder; public abstract class RecipeProvider { protected final HolderLookup.Provider registries; private final HolderGetter items; protected final RecipeOutput output; private static final Map SHAPE_BUILDERS = ImmutableMap.builder() .put(BlockFamily.Variant.BUTTON, (p_358405_, p_358406_, p_358407_) -> p_358405_.buttonBuilder(p_358406_, Ingredient.of(p_358407_))) .put( BlockFamily.Variant.CHISELED, (p_358408_, p_358409_, p_358410_) -> p_358408_.chiseledBuilder(RecipeCategory.BUILDING_BLOCKS, p_358409_, Ingredient.of(p_358410_)) ) .put( BlockFamily.Variant.CUT, (p_358435_, p_358436_, p_358437_) -> p_358435_.cutBuilder(RecipeCategory.BUILDING_BLOCKS, p_358436_, Ingredient.of(p_358437_)) ) .put(BlockFamily.Variant.DOOR, (p_358411_, p_358412_, p_358413_) -> p_358411_.doorBuilder(p_358412_, Ingredient.of(p_358413_))) .put(BlockFamily.Variant.CUSTOM_FENCE, (p_358423_, p_358424_, p_358425_) -> p_358423_.fenceBuilder(p_358424_, Ingredient.of(p_358425_))) .put(BlockFamily.Variant.FENCE, (p_358450_, p_358451_, p_358452_) -> p_358450_.fenceBuilder(p_358451_, Ingredient.of(p_358452_))) .put(BlockFamily.Variant.CUSTOM_FENCE_GATE, (p_358429_, p_358430_, p_358431_) -> p_358429_.fenceGateBuilder(p_358430_, Ingredient.of(p_358431_))) .put(BlockFamily.Variant.FENCE_GATE, (p_358417_, p_358418_, p_358419_) -> p_358417_.fenceGateBuilder(p_358418_, Ingredient.of(p_358419_))) .put(BlockFamily.Variant.SIGN, (p_358420_, p_358421_, p_358422_) -> p_358420_.signBuilder(p_358421_, Ingredient.of(p_358422_))) .put( BlockFamily.Variant.SLAB, (p_358414_, p_358415_, p_358416_) -> p_358414_.slabBuilder(RecipeCategory.BUILDING_BLOCKS, p_358415_, Ingredient.of(p_358416_)) ) .put(BlockFamily.Variant.STAIRS, (p_358426_, p_358427_, p_358428_) -> p_358426_.stairBuilder(p_358427_, Ingredient.of(p_358428_))) .put( BlockFamily.Variant.PRESSURE_PLATE, (p_358447_, p_358448_, p_358449_) -> p_358447_.pressurePlateBuilder(RecipeCategory.REDSTONE, p_358448_, Ingredient.of(p_358449_)) ) .put( BlockFamily.Variant.POLISHED, (p_358399_, p_358400_, p_358401_) -> p_358399_.polishedBuilder(RecipeCategory.BUILDING_BLOCKS, p_358400_, Ingredient.of(p_358401_)) ) .put(BlockFamily.Variant.TRAPDOOR, (p_358432_, p_358433_, p_358434_) -> p_358432_.trapdoorBuilder(p_358433_, Ingredient.of(p_358434_))) .put( BlockFamily.Variant.WALL, (p_358402_, p_358403_, p_358404_) -> p_358402_.wallBuilder(RecipeCategory.DECORATIONS, p_358403_, Ingredient.of(p_358404_)) ) .build(); protected RecipeProvider(HolderLookup.Provider p_361709_, RecipeOutput p_365321_) { this.registries = p_361709_; this.items = p_361709_.lookupOrThrow(Registries.ITEM); this.output = p_365321_; } protected abstract void buildRecipes(); protected void generateForEnabledBlockFamilies(FeatureFlagSet p_251836_) { BlockFamilies.getAllFamilies().filter(BlockFamily::shouldGenerateRecipe).forEach(p_358446_ -> this.generateRecipes(p_358446_, p_251836_)); } protected void oneToOneConversionRecipe(ItemLike p_176558_, ItemLike p_176559_, @Nullable String p_176560_) { this.oneToOneConversionRecipe(p_176558_, p_176559_, p_176560_, 1); } protected void oneToOneConversionRecipe(ItemLike p_176553_, ItemLike p_176554_, @Nullable String p_176555_, int p_369925_) { this.shapeless(RecipeCategory.MISC, p_176553_, p_369925_) .requires(p_176554_) .group(p_176555_) .unlockedBy(getHasName(p_176554_), this.has(p_176554_)) .save(this.output, getConversionRecipeName(p_176553_, p_176554_)); } protected void oreSmelting(List p_250172_, RecipeCategory p_250588_, ItemLike p_251868_, float p_250789_, int p_252144_, String p_251687_) { this.oreCooking(RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new, p_250172_, p_250588_, p_251868_, p_250789_, p_252144_, p_251687_, "_from_smelting"); } protected void oreBlasting(List p_251504_, RecipeCategory p_248846_, ItemLike p_249735_, float p_248783_, int p_250303_, String p_251984_) { this.oreCooking(RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new, p_251504_, p_248846_, p_249735_, p_248783_, p_250303_, p_251984_, "_from_blasting"); } private void oreCooking( RecipeSerializer p_251817_, AbstractCookingRecipe.Factory p_312098_, List p_249619_, RecipeCategory p_251154_, ItemLike p_250066_, float p_251871_, int p_251316_, String p_251450_, String p_249236_ ) { for (ItemLike itemlike : p_249619_) { SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), p_251154_, p_250066_, p_251871_, p_251316_, p_251817_, p_312098_) .group(p_251450_) .unlockedBy(getHasName(itemlike), this.has(itemlike)) .save(this.output, getItemName(p_250066_) + p_249236_ + "_" + getItemName(itemlike)); } } protected void netheriteSmithing(Item p_250046_, RecipeCategory p_248986_, Item p_250389_) { SmithingTransformRecipeBuilder.smithing( Ingredient.of(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE), Ingredient.of(p_250046_), this.tag(ItemTags.NETHERITE_TOOL_MATERIALS), p_248986_, p_250389_ ) .unlocks("has_netherite_ingot", this.has(ItemTags.NETHERITE_TOOL_MATERIALS)) .save(this.output, getItemName(p_250389_) + "_smithing"); } protected void trimSmithing(Item p_285461_, ResourceKey> p_364939_) { SmithingTrimRecipeBuilder.smithingTrim( Ingredient.of(p_285461_), this.tag(ItemTags.TRIMMABLE_ARMOR), this.tag(ItemTags.TRIM_MATERIALS), RecipeCategory.MISC ) .unlocks("has_smithing_trim_template", this.has(p_285461_)) .save(this.output, p_364939_); } protected void twoByTwoPacker(RecipeCategory p_250881_, ItemLike p_252184_, ItemLike p_249710_) { this.shaped(p_250881_, p_252184_, 1) .define('#', p_249710_) .pattern("##") .pattern("##") .unlockedBy(getHasName(p_249710_), this.has(p_249710_)) .save(this.output); } protected void threeByThreePacker(RecipeCategory p_259186_, ItemLike p_259360_, ItemLike p_259263_, String p_361463_) { this.shapeless(p_259186_, p_259360_).requires(p_259263_, 9).unlockedBy(p_361463_, this.has(p_259263_)).save(this.output); } protected void threeByThreePacker(RecipeCategory p_259247_, ItemLike p_259376_, ItemLike p_259717_) { this.threeByThreePacker(p_259247_, p_259376_, p_259717_, getHasName(p_259717_)); } protected void planksFromLog(ItemLike p_259052_, TagKey p_259045_, int p_259471_) { this.shapeless(RecipeCategory.BUILDING_BLOCKS, p_259052_, p_259471_) .requires(p_259045_) .group("planks") .unlockedBy("has_log", this.has(p_259045_)) .save(this.output); } protected void planksFromLogs(ItemLike p_259193_, TagKey p_259818_, int p_259807_) { this.shapeless(RecipeCategory.BUILDING_BLOCKS, p_259193_, p_259807_) .requires(p_259818_) .group("planks") .unlockedBy("has_logs", this.has(p_259818_)) .save(this.output); } protected void woodFromLogs(ItemLike p_126004_, ItemLike p_126005_) { this.shaped(RecipeCategory.BUILDING_BLOCKS, p_126004_, 3) .define('#', p_126005_) .pattern("##") .pattern("##") .group("bark") .unlockedBy("has_log", this.has(p_126005_)) .save(this.output); } protected void woodenBoat(ItemLike p_126023_, ItemLike p_126024_) { this.shaped(RecipeCategory.TRANSPORTATION, p_126023_) .define('#', p_126024_) .pattern("# #") .pattern("###") .group("boat") .unlockedBy("in_water", insideOf(Blocks.WATER)) .save(this.output); } protected void chestBoat(ItemLike p_236373_, ItemLike p_236374_) { this.shapeless(RecipeCategory.TRANSPORTATION, p_236373_) .requires(Blocks.CHEST) .requires(p_236374_) .group("chest_boat") .unlockedBy("has_boat", this.has(ItemTags.BOATS)) .save(this.output); } private RecipeBuilder buttonBuilder(ItemLike p_176659_, Ingredient p_176660_) { return this.shapeless(RecipeCategory.REDSTONE, p_176659_).requires(p_176660_); } protected RecipeBuilder doorBuilder(ItemLike p_176671_, Ingredient p_176672_) { return this.shaped(RecipeCategory.REDSTONE, p_176671_, 3).define('#', p_176672_).pattern("##").pattern("##").pattern("##"); } private RecipeBuilder fenceBuilder(ItemLike p_176679_, Ingredient p_176680_) { int i = p_176679_ == Blocks.NETHER_BRICK_FENCE ? 6 : 3; Item item = p_176679_ == Blocks.NETHER_BRICK_FENCE ? Items.NETHER_BRICK : Items.STICK; return this.shaped(RecipeCategory.DECORATIONS, p_176679_, i).define('W', p_176680_).define('#', item).pattern("W#W").pattern("W#W"); } private RecipeBuilder fenceGateBuilder(ItemLike p_176685_, Ingredient p_176686_) { return this.shaped(RecipeCategory.REDSTONE, p_176685_).define('#', Items.STICK).define('W', p_176686_).pattern("#W#").pattern("#W#"); } protected void pressurePlate(ItemLike p_176692_, ItemLike p_176693_) { this.pressurePlateBuilder(RecipeCategory.REDSTONE, p_176692_, Ingredient.of(p_176693_)) .unlockedBy(getHasName(p_176693_), this.has(p_176693_)) .save(this.output); } private RecipeBuilder pressurePlateBuilder(RecipeCategory p_251447_, ItemLike p_251989_, Ingredient p_249211_) { return this.shaped(p_251447_, p_251989_).define('#', p_249211_).pattern("##"); } protected void slab(RecipeCategory p_251848_, ItemLike p_249368_, ItemLike p_252133_) { this.slabBuilder(p_251848_, p_249368_, Ingredient.of(p_252133_)) .unlockedBy(getHasName(p_252133_), this.has(p_252133_)) .save(this.output); } protected RecipeBuilder slabBuilder(RecipeCategory p_251707_, ItemLike p_251284_, Ingredient p_248824_) { return this.shaped(p_251707_, p_251284_, 6).define('#', p_248824_).pattern("###"); } protected RecipeBuilder stairBuilder(ItemLike p_176711_, Ingredient p_176712_) { return this.shaped(RecipeCategory.BUILDING_BLOCKS, p_176711_, 4).define('#', p_176712_).pattern("# ").pattern("## ").pattern("###"); } protected RecipeBuilder trapdoorBuilder(ItemLike p_176721_, Ingredient p_176722_) { return this.shaped(RecipeCategory.REDSTONE, p_176721_, 2).define('#', p_176722_).pattern("###").pattern("###"); } private RecipeBuilder signBuilder(ItemLike p_176727_, Ingredient p_176728_) { return this.shaped(RecipeCategory.DECORATIONS, p_176727_, 3) .group("sign") .define('#', p_176728_) .define('X', Items.STICK) .pattern("###") .pattern("###") .pattern(" X "); } protected void hangingSign(ItemLike p_252355_, ItemLike p_250437_) { this.shaped(RecipeCategory.DECORATIONS, p_252355_, 6) .group("hanging_sign") .define('#', p_250437_) .define('X', Items.CHAIN) .pattern("X X") .pattern("###") .pattern("###") .unlockedBy("has_stripped_logs", this.has(p_250437_)) .save(this.output); } protected void colorBlockWithDye(List p_289675_, List p_289672_, String p_289641_) { this.colorWithDye(p_289675_, p_289672_, null, p_289641_, RecipeCategory.BUILDING_BLOCKS); } protected void colorWithDye(List p_368136_, List p_368703_, @Nullable Item p_362653_, String p_362940_, RecipeCategory p_368238_) { for (int i = 0; i < p_368136_.size(); i++) { Item item = p_368136_.get(i); Item item1 = p_368703_.get(i); Stream stream = p_368703_.stream().filter(p_288265_ -> !p_288265_.equals(item1)); if (p_362653_ != null) { stream = Stream.concat(stream, Stream.of(p_362653_)); } this.shapeless(p_368238_, item1) .requires(item) .requires(Ingredient.of(stream)) .group(p_362940_) .unlockedBy("has_needed_dye", this.has(item)) .save(this.output, "dye_" + getItemName(item1)); } } protected void carpet(ItemLike p_176718_, ItemLike p_176719_) { this.shaped(RecipeCategory.DECORATIONS, p_176718_, 3) .define('#', p_176719_) .pattern("##") .group("carpet") .unlockedBy(getHasName(p_176719_), this.has(p_176719_)) .save(this.output); } protected void bedFromPlanksAndWool(ItemLike p_126075_, ItemLike p_126076_) { this.shaped(RecipeCategory.DECORATIONS, p_126075_) .define('#', p_126076_) .define('X', ItemTags.PLANKS) .pattern("###") .pattern("XXX") .group("bed") .unlockedBy(getHasName(p_126076_), this.has(p_126076_)) .save(this.output); } protected void banner(ItemLike p_126083_, ItemLike p_126084_) { this.shaped(RecipeCategory.DECORATIONS, p_126083_) .define('#', p_126084_) .define('|', Items.STICK) .pattern("###") .pattern("###") .pattern(" | ") .group("banner") .unlockedBy(getHasName(p_126084_), this.has(p_126084_)) .save(this.output); } protected void stainedGlassFromGlassAndDye(ItemLike p_126087_, ItemLike p_126088_) { this.shaped(RecipeCategory.BUILDING_BLOCKS, p_126087_, 8) .define('#', Blocks.GLASS) .define('X', p_126088_) .pattern("###") .pattern("#X#") .pattern("###") .group("stained_glass") .unlockedBy("has_glass", this.has(Blocks.GLASS)) .save(this.output); } protected void stainedGlassPaneFromStainedGlass(ItemLike p_126091_, ItemLike p_126092_) { this.shaped(RecipeCategory.DECORATIONS, p_126091_, 16) .define('#', p_126092_) .pattern("###") .pattern("###") .group("stained_glass_pane") .unlockedBy("has_glass", this.has(p_126092_)) .save(this.output); } protected void stainedGlassPaneFromGlassPaneAndDye(ItemLike p_126095_, ItemLike p_126096_) { this.shaped(RecipeCategory.DECORATIONS, p_126095_, 8) .define('#', Blocks.GLASS_PANE) .define('$', p_126096_) .pattern("###") .pattern("#$#") .pattern("###") .group("stained_glass_pane") .unlockedBy("has_glass_pane", this.has(Blocks.GLASS_PANE)) .unlockedBy(getHasName(p_126096_), this.has(p_126096_)) .save(this.output, getConversionRecipeName(p_126095_, Blocks.GLASS_PANE)); } protected void coloredTerracottaFromTerracottaAndDye(ItemLike p_126099_, ItemLike p_126100_) { this.shaped(RecipeCategory.BUILDING_BLOCKS, p_126099_, 8) .define('#', Blocks.TERRACOTTA) .define('X', p_126100_) .pattern("###") .pattern("#X#") .pattern("###") .group("stained_terracotta") .unlockedBy("has_terracotta", this.has(Blocks.TERRACOTTA)) .save(this.output); } protected void concretePowder(ItemLike p_126103_, ItemLike p_126104_) { this.shapeless(RecipeCategory.BUILDING_BLOCKS, p_126103_, 8) .requires(p_126104_) .requires(Blocks.SAND, 4) .requires(Blocks.GRAVEL, 4) .group("concrete_powder") .unlockedBy("has_sand", this.has(Blocks.SAND)) .unlockedBy("has_gravel", this.has(Blocks.GRAVEL)) .save(this.output); } protected void candle(ItemLike p_176544_, ItemLike p_176545_) { this.shapeless(RecipeCategory.DECORATIONS, p_176544_) .requires(Blocks.CANDLE) .requires(p_176545_) .group("dyed_candle") .unlockedBy(getHasName(p_176545_), this.has(p_176545_)) .save(this.output); } protected void wall(RecipeCategory p_251148_, ItemLike p_250499_, ItemLike p_249970_) { this.wallBuilder(p_251148_, p_250499_, Ingredient.of(p_249970_)) .unlockedBy(getHasName(p_249970_), this.has(p_249970_)) .save(this.output); } private RecipeBuilder wallBuilder(RecipeCategory p_249083_, ItemLike p_250754_, Ingredient p_250311_) { return this.shaped(p_249083_, p_250754_, 6).define('#', p_250311_).pattern("###").pattern("###"); } protected void polished(RecipeCategory p_248719_, ItemLike p_250032_, ItemLike p_250021_) { this.polishedBuilder(p_248719_, p_250032_, Ingredient.of(p_250021_)) .unlockedBy(getHasName(p_250021_), this.has(p_250021_)) .save(this.output); } private RecipeBuilder polishedBuilder(RecipeCategory p_249131_, ItemLike p_251242_, Ingredient p_251412_) { return this.shaped(p_249131_, p_251242_, 4).define('S', p_251412_).pattern("SS").pattern("SS"); } protected void cut(RecipeCategory p_252306_, ItemLike p_249686_, ItemLike p_251100_) { this.cutBuilder(p_252306_, p_249686_, Ingredient.of(p_251100_)) .unlockedBy(getHasName(p_251100_), this.has(p_251100_)) .save(this.output); } private ShapedRecipeBuilder cutBuilder(RecipeCategory p_250895_, ItemLike p_251147_, Ingredient p_251563_) { return this.shaped(p_250895_, p_251147_, 4).define('#', p_251563_).pattern("##").pattern("##"); } protected void chiseled(RecipeCategory p_251604_, ItemLike p_251049_, ItemLike p_252267_) { this.chiseledBuilder(p_251604_, p_251049_, Ingredient.of(p_252267_)) .unlockedBy(getHasName(p_252267_), this.has(p_252267_)) .save(this.output); } protected void mosaicBuilder(RecipeCategory p_248788_, ItemLike p_251925_, ItemLike p_252242_) { this.shaped(p_248788_, p_251925_) .define('#', p_252242_) .pattern("#") .pattern("#") .unlockedBy(getHasName(p_252242_), this.has(p_252242_)) .save(this.output); } protected ShapedRecipeBuilder chiseledBuilder(RecipeCategory p_251755_, ItemLike p_249782_, Ingredient p_250087_) { return this.shaped(p_251755_, p_249782_).define('#', p_250087_).pattern("#").pattern("#"); } protected void stonecutterResultFromBase(RecipeCategory p_248911_, ItemLike p_251265_, ItemLike p_250033_) { this.stonecutterResultFromBase(p_248911_, p_251265_, p_250033_, 1); } protected void stonecutterResultFromBase(RecipeCategory p_250609_, ItemLike p_251254_, ItemLike p_249666_, int p_368611_) { SingleItemRecipeBuilder.stonecutting(Ingredient.of(p_249666_), p_250609_, p_251254_, p_368611_) .unlockedBy(getHasName(p_249666_), this.has(p_249666_)) .save(this.output, getConversionRecipeName(p_251254_, p_249666_) + "_stonecutting"); } private void smeltingResultFromBase(ItemLike p_176741_, ItemLike p_176742_) { SimpleCookingRecipeBuilder.smelting(Ingredient.of(p_176742_), RecipeCategory.BUILDING_BLOCKS, p_176741_, 0.1F, 200) .unlockedBy(getHasName(p_176742_), this.has(p_176742_)) .save(this.output); } protected void nineBlockStorageRecipes(RecipeCategory p_251203_, ItemLike p_251689_, RecipeCategory p_251376_, ItemLike p_248771_) { this.nineBlockStorageRecipes(p_251203_, p_251689_, p_251376_, p_248771_, getSimpleRecipeName(p_248771_), null, getSimpleRecipeName(p_251689_), null); } protected void nineBlockStorageRecipesWithCustomPacking(RecipeCategory p_250885_, ItemLike p_251651_, RecipeCategory p_250874_, ItemLike p_248576_, String p_250171_, String p_249386_) { this.nineBlockStorageRecipes(p_250885_, p_251651_, p_250874_, p_248576_, p_250171_, p_249386_, getSimpleRecipeName(p_251651_), null); } protected void nineBlockStorageRecipesRecipesWithCustomUnpacking(RecipeCategory p_248979_, ItemLike p_249101_, RecipeCategory p_252036_, ItemLike p_250886_, String p_248768_, String p_250847_) { this.nineBlockStorageRecipes(p_248979_, p_249101_, p_252036_, p_250886_, getSimpleRecipeName(p_250886_), null, p_248768_, p_250847_); } private void nineBlockStorageRecipes( RecipeCategory p_250083_, ItemLike p_250042_, RecipeCategory p_248977_, ItemLike p_251911_, String p_250475_, @Nullable String p_248641_, String p_252237_, @Nullable String p_250414_ ) { this.shapeless(p_250083_, p_250042_, 9) .requires(p_251911_) .group(p_250414_) .unlockedBy(getHasName(p_251911_), this.has(p_251911_)) .save(this.output, ResourceKey.create(Registries.RECIPE, ResourceLocation.parse(p_252237_))); this.shaped(p_248977_, p_251911_) .define('#', p_250042_) .pattern("###") .pattern("###") .pattern("###") .group(p_248641_) .unlockedBy(getHasName(p_250042_), this.has(p_250042_)) .save(this.output, ResourceKey.create(Registries.RECIPE, ResourceLocation.parse(p_250475_))); } protected void copySmithingTemplate(ItemLike p_345069_, ItemLike p_362058_) { this.shaped(RecipeCategory.MISC, p_345069_, 2) .define('#', Items.DIAMOND) .define('C', p_362058_) .define('S', p_345069_) .pattern("#S#") .pattern("#C#") .pattern("###") .unlockedBy(getHasName(p_345069_), this.has(p_345069_)) .save(this.output); } protected void copySmithingTemplate(ItemLike p_267133_, Ingredient p_363155_) { this.shaped(RecipeCategory.MISC, p_267133_, 2) .define('#', Items.DIAMOND) .define('C', p_363155_) .define('S', p_267133_) .pattern("#S#") .pattern("#C#") .pattern("###") .unlockedBy(getHasName(p_267133_), this.has(p_267133_)) .save(this.output); } protected void cookRecipes( String p_126008_, RecipeSerializer p_250529_, AbstractCookingRecipe.Factory p_312851_, int p_126010_ ) { this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.BEEF, Items.COOKED_BEEF, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.CHICKEN, Items.COOKED_CHICKEN, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.COD, Items.COOKED_COD, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.KELP, Items.DRIED_KELP, 0.1F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.SALMON, Items.COOKED_SALMON, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.MUTTON, Items.COOKED_MUTTON, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.PORKCHOP, Items.COOKED_PORKCHOP, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.POTATO, Items.BAKED_POTATO, 0.35F); this.simpleCookingRecipe(p_126008_, p_250529_, p_312851_, p_126010_, Items.RABBIT, Items.COOKED_RABBIT, 0.35F); } private void simpleCookingRecipe( String p_249709_, RecipeSerializer p_251876_, AbstractCookingRecipe.Factory p_311509_, int p_249258_, ItemLike p_250669_, ItemLike p_250224_, float p_252138_ ) { SimpleCookingRecipeBuilder.generic(Ingredient.of(p_250669_), RecipeCategory.FOOD, p_250224_, p_252138_, p_249258_, p_251876_, p_311509_) .unlockedBy(getHasName(p_250669_), this.has(p_250669_)) .save(this.output, getItemName(p_250224_) + "_from_" + p_249709_); } protected void waxRecipes(FeatureFlagSet p_312821_) { HoneycombItem.WAXABLES .get() .forEach( (p_358439_, p_358440_) -> { if (p_358440_.requiredFeatures().isSubsetOf(p_312821_)) { this.shapeless(RecipeCategory.BUILDING_BLOCKS, p_358440_) .requires(p_358439_) .requires(Items.HONEYCOMB) .group(getItemName(p_358440_)) .unlockedBy(getHasName(p_358439_), this.has(p_358439_)) .save(this.output, getConversionRecipeName(p_358440_, Items.HONEYCOMB)); } } ); } protected void grate(Block p_309854_, Block p_310802_) { this.shaped(RecipeCategory.BUILDING_BLOCKS, p_309854_, 4) .define('M', p_310802_) .pattern(" M ") .pattern("M M") .pattern(" M ") .unlockedBy(getHasName(p_310802_), this.has(p_310802_)) .save(this.output); } protected void copperBulb(Block p_312293_, Block p_312258_) { this.shaped(RecipeCategory.REDSTONE, p_312293_, 4) .define('C', p_312258_) .define('R', Items.REDSTONE) .define('B', Items.BLAZE_ROD) .pattern(" C ") .pattern("CBC") .pattern(" R ") .unlockedBy(getHasName(p_312258_), this.has(p_312258_)) .save(this.output); } protected void suspiciousStew(Item p_368852_, SuspiciousEffectHolder p_367042_) { ItemStack itemstack = new ItemStack( Items.SUSPICIOUS_STEW.builtInRegistryHolder(), 1, DataComponentPatch.builder().set(DataComponents.SUSPICIOUS_STEW_EFFECTS, p_367042_.getSuspiciousEffects()).build() ); this.shapeless(RecipeCategory.FOOD, itemstack) .requires(Items.BOWL) .requires(Items.BROWN_MUSHROOM) .requires(Items.RED_MUSHROOM) .requires(p_368852_) .group("suspicious_stew") .unlockedBy(getHasName(p_368852_), this.has(p_368852_)) .save(this.output, getItemName(itemstack.getItem()) + "_from_" + getItemName(p_368852_)); } protected void generateRecipes(BlockFamily p_176582_, FeatureFlagSet p_312313_) { p_176582_.getVariants() .forEach( (p_358443_, p_358444_) -> { if (p_358444_.requiredFeatures().isSubsetOf(p_312313_)) { RecipeProvider.FamilyRecipeProvider recipeprovider$familyrecipeprovider = SHAPE_BUILDERS.get(p_358443_); ItemLike itemlike = this.getBaseBlock(p_176582_, p_358443_); if (recipeprovider$familyrecipeprovider != null) { RecipeBuilder recipebuilder = recipeprovider$familyrecipeprovider.create(this, p_358444_, itemlike); p_176582_.getRecipeGroupPrefix() .ifPresent( p_296361_ -> recipebuilder.group(p_296361_ + (p_358443_ == BlockFamily.Variant.CUT ? "" : "_" + p_358443_.getRecipeGroup())) ); recipebuilder.unlockedBy(p_176582_.getRecipeUnlockedBy().orElseGet(() -> getHasName(itemlike)), this.has(itemlike)); recipebuilder.save(this.output); } if (p_358443_ == BlockFamily.Variant.CRACKED) { this.smeltingResultFromBase(p_358444_, itemlike); } } } ); } private Block getBaseBlock(BlockFamily p_176524_, BlockFamily.Variant p_176525_) { if (p_176525_ == BlockFamily.Variant.CHISELED) { if (!p_176524_.getVariants().containsKey(BlockFamily.Variant.SLAB)) { throw new IllegalStateException("Slab is not defined for the family."); } else { return p_176524_.get(BlockFamily.Variant.SLAB); } } else { return p_176524_.getBaseBlock(); } } private static Criterion insideOf(Block p_125980_) { return CriteriaTriggers.ENTER_BLOCK .createCriterion(new EnterBlockTrigger.TriggerInstance(Optional.empty(), Optional.of(p_125980_.builtInRegistryHolder()), Optional.empty())); } private Criterion has(MinMaxBounds.Ints p_176521_, ItemLike p_176522_) { return inventoryTrigger(ItemPredicate.Builder.item().of(this.items, p_176522_).withCount(p_176521_)); } protected Criterion has(ItemLike p_298497_) { return inventoryTrigger(ItemPredicate.Builder.item().of(this.items, p_298497_)); } protected Criterion has(TagKey p_299059_) { return inventoryTrigger(ItemPredicate.Builder.item().of(this.items, p_299059_)); } private static Criterion inventoryTrigger(ItemPredicate.Builder... p_299527_) { return inventoryTrigger(Arrays.stream(p_299527_).map(ItemPredicate.Builder::build).toArray(ItemPredicate[]::new)); } private static Criterion inventoryTrigger(ItemPredicate... p_297226_) { return CriteriaTriggers.INVENTORY_CHANGED .createCriterion(new InventoryChangeTrigger.TriggerInstance(Optional.empty(), InventoryChangeTrigger.TriggerInstance.Slots.ANY, List.of(p_297226_))); } protected static String getHasName(ItemLike p_176603_) { return "has_" + getItemName(p_176603_); } protected static String getItemName(ItemLike p_176633_) { return BuiltInRegistries.ITEM.getKey(p_176633_.asItem()).getPath(); } protected static String getSimpleRecipeName(ItemLike p_176645_) { return getItemName(p_176645_); } protected static String getConversionRecipeName(ItemLike p_176518_, ItemLike p_176519_) { return getItemName(p_176518_) + "_from_" + getItemName(p_176519_); } protected static String getSmeltingRecipeName(ItemLike p_176657_) { return getItemName(p_176657_) + "_from_smelting"; } protected static String getBlastingRecipeName(ItemLike p_176669_) { return getItemName(p_176669_) + "_from_blasting"; } protected Ingredient tag(TagKey p_365400_) { return Ingredient.of(this.items.getOrThrow(p_365400_)); } protected ShapedRecipeBuilder shaped(RecipeCategory p_365278_, ItemLike p_365955_) { return ShapedRecipeBuilder.shaped(this.items, p_365278_, p_365955_); } protected ShapedRecipeBuilder shaped(RecipeCategory p_365505_, ItemLike p_362162_, int p_368883_) { return ShapedRecipeBuilder.shaped(this.items, p_365505_, p_362162_, p_368883_); } protected ShapelessRecipeBuilder shapeless(RecipeCategory p_367419_, ItemStack p_369370_) { return ShapelessRecipeBuilder.shapeless(this.items, p_367419_, p_369370_); } protected ShapelessRecipeBuilder shapeless(RecipeCategory p_370012_, ItemLike p_361338_) { return ShapelessRecipeBuilder.shapeless(this.items, p_370012_, p_361338_); } protected ShapelessRecipeBuilder shapeless(RecipeCategory p_361742_, ItemLike p_365052_, int p_363232_) { return ShapelessRecipeBuilder.shapeless(this.items, p_361742_, p_365052_, p_363232_); } @FunctionalInterface interface FamilyRecipeProvider { RecipeBuilder create(RecipeProvider p_363045_, ItemLike p_362746_, ItemLike p_364674_); } protected abstract static class Runner implements DataProvider { private final PackOutput packOutput; private final CompletableFuture registries; protected Runner(PackOutput p_365720_, CompletableFuture p_365098_) { this.packOutput = p_365720_; this.registries = p_365098_; } @Override public final CompletableFuture run(CachedOutput p_363906_) { return this.registries .thenCompose( p_362805_ -> { final PackOutput.PathProvider packoutput$pathprovider = this.packOutput.createRegistryElementsPathProvider(Registries.RECIPE); final PackOutput.PathProvider packoutput$pathprovider1 = this.packOutput.createRegistryElementsPathProvider(Registries.ADVANCEMENT); final Set>> set = Sets.newHashSet(); final List> list = new ArrayList<>(); RecipeOutput recipeoutput = new RecipeOutput() { @Override public void accept(ResourceKey> p_361204_, Recipe p_363495_, @Nullable AdvancementHolder p_364191_) { if (!set.add(p_361204_)) { throw new IllegalStateException("Duplicate recipe " + p_361204_.location()); } else { this.saveRecipe(p_361204_, p_363495_); if (p_364191_ != null) { this.saveAdvancement(p_364191_); } } } @Override public Advancement.Builder advancement() { return Advancement.Builder.recipeAdvancement().parent(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT); } @Override public void includeRootAdvancement() { AdvancementHolder advancementholder = Advancement.Builder.recipeAdvancement() .addCriterion("impossible", CriteriaTriggers.IMPOSSIBLE.createCriterion(new ImpossibleTrigger.TriggerInstance())) .build(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT); this.saveAdvancement(advancementholder); } private void saveRecipe(ResourceKey> p_368864_, Recipe p_368184_) { list.add( DataProvider.saveStable( p_363906_, p_362805_, Recipe.CODEC, p_368184_, packoutput$pathprovider.json(p_368864_.location()) ) ); } private void saveAdvancement(AdvancementHolder p_361824_) { list.add( DataProvider.saveStable( p_363906_, p_362805_, Advancement.CODEC, p_361824_.value(), packoutput$pathprovider1.json(p_361824_.id()) ) ); } }; this.createRecipeProvider(p_362805_, recipeoutput).buildRecipes(); return CompletableFuture.allOf(list.toArray(CompletableFuture[]::new)); } ); } protected abstract RecipeProvider createRecipeProvider(HolderLookup.Provider p_364874_, RecipeOutput p_368090_); } }