AttributeModifiersPredicate.java

net.minecraft.core.component.predicates.AttributeModifiersPredicate

信息

  • 全限定名:net.minecraft.core.component.predicates.AttributeModifiersPredicate
  • 类型:public record
  • 包:net.minecraft.core.component.predicates
  • 源码路径:src/main/java/net/minecraft/core/component/predicates/AttributeModifiersPredicate.java
  • 起始行号:L21
  • 实现:SingleComponentItemPredicate
  • 职责:

    TODO

字段/常量

  • CODEC
    • 类型: Codec<AttributeModifiersPredicate>
    • 修饰符: public static final
    • 源码定位: L23
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.core.component.predicates.AttributeModifiersPredicate.EntryPredicate
    • 类型: record
    • 修饰符: public
    • 源码定位: L43
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public DataComponentType<ItemAttributeModifiers> componentType() @ L34

  • 方法名:componentType
  • 源码定位:L34
  • 返回类型:DataComponentType
  • 修饰符:public

参数:

说明:

TODO

public boolean matches(ItemAttributeModifiers value) @ L39

  • 方法名:matches
  • 源码定位:L39
  • 返回类型:boolean
  • 修饰符:public

参数:

  • value: ItemAttributeModifiers

说明:

TODO

代码

public record AttributeModifiersPredicate(Optional<CollectionPredicate<ItemAttributeModifiers.Entry, AttributeModifiersPredicate.EntryPredicate>> modifiers)
    implements SingleComponentItemPredicate<ItemAttributeModifiers> {
    public static final Codec<AttributeModifiersPredicate> CODEC = RecordCodecBuilder.create(
        i -> i.group(
                CollectionPredicate.<ItemAttributeModifiers.Entry, AttributeModifiersPredicate.EntryPredicate>codec(
                        AttributeModifiersPredicate.EntryPredicate.CODEC
                    )
                    .optionalFieldOf("modifiers")
                    .forGetter(AttributeModifiersPredicate::modifiers)
            )
            .apply(i, AttributeModifiersPredicate::new)
    );
 
    @Override
    public DataComponentType<ItemAttributeModifiers> componentType() {
        return DataComponents.ATTRIBUTE_MODIFIERS;
    }
 
    public boolean matches(ItemAttributeModifiers value) {
        return !this.modifiers.isPresent() || this.modifiers.get().test(value.modifiers());
    }
 
    public record EntryPredicate(
        Optional<HolderSet<Attribute>> attribute,
        Optional<Identifier> id,
        MinMaxBounds.Doubles amount,
        Optional<AttributeModifier.Operation> operation,
        Optional<EquipmentSlotGroup> slot
    ) implements Predicate<ItemAttributeModifiers.Entry> {
        public static final Codec<AttributeModifiersPredicate.EntryPredicate> CODEC = RecordCodecBuilder.create(
            i -> i.group(
                    RegistryCodecs.homogeneousList(Registries.ATTRIBUTE)
                        .optionalFieldOf("attribute")
                        .forGetter(AttributeModifiersPredicate.EntryPredicate::attribute),
                    Identifier.CODEC.optionalFieldOf("id").forGetter(AttributeModifiersPredicate.EntryPredicate::id),
                    MinMaxBounds.Doubles.CODEC
                        .optionalFieldOf("amount", MinMaxBounds.Doubles.ANY)
                        .forGetter(AttributeModifiersPredicate.EntryPredicate::amount),
                    AttributeModifier.Operation.CODEC.optionalFieldOf("operation").forGetter(AttributeModifiersPredicate.EntryPredicate::operation),
                    EquipmentSlotGroup.CODEC.optionalFieldOf("slot").forGetter(AttributeModifiersPredicate.EntryPredicate::slot)
                )
                .apply(i, AttributeModifiersPredicate.EntryPredicate::new)
        );
 
        public boolean test(ItemAttributeModifiers.Entry value) {
            if (this.attribute.isPresent() && !this.attribute.get().contains(value.attribute())) {
                return false;
            } else if (this.id.isPresent() && !this.id.get().equals(value.modifier().id())) {
                return false;
            } else if (!this.amount.matches(value.modifier().amount())) {
                return false;
            } else {
                return this.operation.isPresent() && this.operation.get() != value.modifier().operation()
                    ? false
                    : !this.slot.isPresent() || this.slot.get() == value.slot();
            }
        }
    }
}

引用的其他类