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