package net.minecraft.advancements.critereon; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import java.util.Optional; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.ItemEnchantments; public record EnchantmentPredicate(Optional> enchantments, MinMaxBounds.Ints level) { public static final Codec CODEC = RecordCodecBuilder.create( p_340753_ -> p_340753_.group( RegistryCodecs.homogeneousList(Registries.ENCHANTMENT).optionalFieldOf("enchantments").forGetter(EnchantmentPredicate::enchantments), MinMaxBounds.Ints.CODEC.optionalFieldOf("levels", MinMaxBounds.Ints.ANY).forGetter(EnchantmentPredicate::level) ) .apply(p_340753_, EnchantmentPredicate::new) ); public EnchantmentPredicate(Holder p_342794_, MinMaxBounds.Ints p_343999_) { this(Optional.of(HolderSet.direct(p_342794_)), p_343999_); } public EnchantmentPredicate(HolderSet p_343165_, MinMaxBounds.Ints p_30472_) { this(Optional.of(p_343165_), p_30472_); } public boolean containedIn(ItemEnchantments p_334667_) { if (this.enchantments.isPresent()) { for (Holder holder : this.enchantments.get()) { if (this.matchesEnchantment(p_334667_, holder)) { return true; } } return false; } else if (this.level != MinMaxBounds.Ints.ANY) { for (Entry> entry : p_334667_.entrySet()) { if (this.level.matches(entry.getIntValue())) { return true; } } return false; } else { return !p_334667_.isEmpty(); } } private boolean matchesEnchantment(ItemEnchantments p_342239_, Holder p_342249_) { int i = p_342239_.getLevel(p_342249_); if (i == 0) { return false; } else { return this.level == MinMaxBounds.Ints.ANY ? true : this.level.matches(i); } } }