package de.ellpeck.actuallyadditions.mod.crafting; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.crafting.IIngredientSerializer; import javax.annotation.Nonnull; import java.util.stream.Stream; public class TargetNBTIngredient extends Ingredient { public TargetNBTIngredient(Stream itemLists) { super(itemLists); } @Override @Nonnull public IIngredientSerializer getSerializer() { return SERIALIZER; } public static TargetNBTIngredient of(ItemLike itemProvider) { return new TargetNBTIngredient(Stream.of(new ItemValue(new ItemStack(itemProvider)))); } public static TargetNBTIngredient of(ItemStack itemStack) { return new TargetNBTIngredient(Stream.of(new ItemValue(itemStack))); } @Nonnull public static TargetNBTIngredient of(@Nonnull TagKey tag) { return new TargetNBTIngredient(Stream.of(new TagValue(tag))); } @Override @Nonnull public JsonElement toJson() { JsonObject tmp = super.toJson().getAsJsonObject(); tmp.addProperty("type", Serializer.NAME.toString()); return tmp; } public static Serializer SERIALIZER = new Serializer(); public static class Serializer implements IIngredientSerializer { public static ResourceLocation NAME = new ResourceLocation(ActuallyAdditions.MODID, "nbt_target"); @Override @Nonnull public TargetNBTIngredient parse(FriendlyByteBuf buffer) { return new TargetNBTIngredient(Stream.generate(() -> new ItemValue(buffer.readItem())).limit(buffer.readVarInt())); } @Override @Nonnull public TargetNBTIngredient parse(@Nonnull JsonObject json) { return new TargetNBTIngredient(Stream.of(Ingredient.valueFromJson(json))); } @Override public void write(FriendlyByteBuf buffer, TargetNBTIngredient ingredient) { ItemStack[] items = ingredient.getItems(); buffer.writeVarInt(items.length); for (ItemStack stack : items) buffer.writeItem(stack); } } }