package net.minecraft.world.item.crafting; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import javax.annotation.Nullable; import net.minecraft.core.HolderLookup; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public abstract class SingleItemRecipe implements Recipe { private final Ingredient input; private final ItemStack result; private final String group; @Nullable private PlacementInfo placementInfo; public SingleItemRecipe(String p_44419_, Ingredient p_44420_, ItemStack p_44421_) { this.group = p_44419_; this.input = p_44420_; this.result = p_44421_; } @Override public abstract RecipeSerializer getSerializer(); @Override public abstract RecipeType getType(); public boolean matches(SingleRecipeInput p_365360_, Level p_370085_) { return this.input.test(p_365360_.item()); } @Override public String group() { return this.group; } public Ingredient input() { return this.input; } protected ItemStack result() { return this.result; } @Override public PlacementInfo placementInfo() { if (this.placementInfo == null) { this.placementInfo = PlacementInfo.create(this.input); } return this.placementInfo; } public ItemStack assemble(SingleRecipeInput p_343460_, HolderLookup.Provider p_330907_) { return this.result.copy(); } @FunctionalInterface public interface Factory { T create(String p_310227_, Ingredient p_313029_, ItemStack p_312409_); } public static class Serializer implements RecipeSerializer { private final MapCodec codec; private final StreamCodec streamCodec; protected Serializer(SingleItemRecipe.Factory p_311205_) { this.codec = RecordCodecBuilder.mapCodec( p_359863_ -> p_359863_.group( Codec.STRING.optionalFieldOf("group", "").forGetter(SingleItemRecipe::group), Ingredient.CODEC.fieldOf("ingredient").forGetter(SingleItemRecipe::input), ItemStack.STRICT_CODEC.fieldOf("result").forGetter(SingleItemRecipe::result) ) .apply(p_359863_, p_311205_::create) ); this.streamCodec = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, SingleItemRecipe::group, Ingredient.CONTENTS_STREAM_CODEC, SingleItemRecipe::input, ItemStack.STREAM_CODEC, SingleItemRecipe::result, p_311205_::create ); } @Override public MapCodec codec() { return this.codec; } @Override public StreamCodec streamCodec() { return this.streamCodec; } } }