package net.minecraft.data.recipes; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import javax.annotation.Nullable; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementRequirements; import net.minecraft.advancements.AdvancementRewards; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; import net.minecraft.core.HolderGetter; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapelessRecipe; import net.minecraft.world.level.ItemLike; public class ShapelessRecipeBuilder implements RecipeBuilder { private final HolderGetter items; private final RecipeCategory category; private final ItemStack result; private final List ingredients = new ArrayList<>(); private final Map> criteria = new LinkedHashMap<>(); @Nullable private String group; private ShapelessRecipeBuilder(HolderGetter p_362903_, RecipeCategory p_250837_, ItemStack p_362773_) { this.items = p_362903_; this.category = p_250837_; this.result = p_362773_; } public static ShapelessRecipeBuilder shapeless(HolderGetter p_365884_, RecipeCategory p_250714_, ItemStack p_369160_) { return new ShapelessRecipeBuilder(p_365884_, p_250714_, p_369160_); } public static ShapelessRecipeBuilder shapeless(HolderGetter p_362305_, RecipeCategory p_368322_, ItemLike p_366832_) { return shapeless(p_362305_, p_368322_, p_366832_, 1); } public static ShapelessRecipeBuilder shapeless(HolderGetter p_361011_, RecipeCategory p_252339_, ItemLike p_250836_, int p_249928_) { return new ShapelessRecipeBuilder(p_361011_, p_252339_, p_250836_.asItem().getDefaultInstance().copyWithCount(p_249928_)); } public ShapelessRecipeBuilder requires(TagKey p_206420_) { return this.requires(Ingredient.of(this.items.getOrThrow(p_206420_))); } public ShapelessRecipeBuilder requires(ItemLike p_126210_) { return this.requires(p_126210_, 1); } public ShapelessRecipeBuilder requires(ItemLike p_126212_, int p_126213_) { for (int i = 0; i < p_126213_; i++) { this.requires(Ingredient.of(p_126212_)); } return this; } public ShapelessRecipeBuilder requires(Ingredient p_126185_) { return this.requires(p_126185_, 1); } public ShapelessRecipeBuilder requires(Ingredient p_126187_, int p_126188_) { for (int i = 0; i < p_126188_; i++) { this.ingredients.add(p_126187_); } return this; } public ShapelessRecipeBuilder unlockedBy(String p_176781_, Criterion p_300919_) { this.criteria.put(p_176781_, p_300919_); return this; } public ShapelessRecipeBuilder group(@Nullable String p_126195_) { this.group = p_126195_; return this; } @Override public Item getResult() { return this.result.getItem(); } @Override public void save(RecipeOutput p_300117_, ResourceKey> p_364714_) { this.ensureValid(p_364714_); Advancement.Builder advancement$builder = p_300117_.advancement() .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(p_364714_)) .rewards(AdvancementRewards.Builder.recipe(p_364714_)) .requirements(AdvancementRequirements.Strategy.OR); this.criteria.forEach(advancement$builder::addCriterion); ShapelessRecipe shapelessrecipe = new ShapelessRecipe( Objects.requireNonNullElse(this.group, ""), RecipeBuilder.determineBookCategory(this.category), this.result, this.ingredients ); p_300117_.accept( p_364714_, shapelessrecipe, advancement$builder.build(p_364714_.location().withPrefix("recipes/" + this.category.getFolderName() + "/")) ); } private void ensureValid(ResourceKey> p_368339_) { if (this.criteria.isEmpty()) { throw new IllegalStateException("No way of obtaining recipe " + p_368339_.location()); } } }