package net.minecraft.advancements.critereon; import com.mojang.serialization.Codec; import java.util.List; import java.util.function.Function; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.ItemEnchantments; public abstract class ItemEnchantmentsPredicate implements SingleComponentItemPredicate { private final List enchantments; protected ItemEnchantmentsPredicate(List enchantments) { this.enchantments = enchantments; } public static Codec codec(Function, T> predicateFactory) { return EnchantmentPredicate.CODEC.listOf().xmap(predicateFactory, ItemEnchantmentsPredicate::enchantments); } protected List enchantments() { return this.enchantments; } public boolean matches(ItemStack stack, ItemEnchantments enchantments) { for (EnchantmentPredicate enchantmentPredicate : this.enchantments) { if (!enchantmentPredicate.containedIn(enchantments)) { return false; } } return true; } public static ItemEnchantmentsPredicate.Enchantments enchantments(List enchantments) { return new ItemEnchantmentsPredicate.Enchantments(enchantments); } public static ItemEnchantmentsPredicate.StoredEnchantments storedEnchantments(List enchantments) { return new ItemEnchantmentsPredicate.StoredEnchantments(enchantments); } public static class Enchantments extends ItemEnchantmentsPredicate { public static final Codec CODEC = codec(ItemEnchantmentsPredicate.Enchantments::new); protected Enchantments(List list) { super(list); } @Override public DataComponentType componentType() { return DataComponents.ENCHANTMENTS; } } public static class StoredEnchantments extends ItemEnchantmentsPredicate { public static final Codec CODEC = codec(ItemEnchantmentsPredicate.StoredEnchantments::new); protected StoredEnchantments(List list) { super(list); } @Override public DataComponentType componentType() { return DataComponents.STORED_ENCHANTMENTS; } } }