AdvancementRequirements.java

net.minecraft.advancements.AdvancementRequirements

信息

  • 全限定名:net.minecraft.advancements.AdvancementRequirements
  • 类型:public record
  • 包:net.minecraft.advancements
  • 源码路径:src/main/java/net/minecraft/advancements/AdvancementRequirements.java
  • 起始行号:L13
  • 职责:

    TODO

字段/常量

  • CODEC

    • 类型: Codec<AdvancementRequirements>
    • 修饰符: public static final
    • 源码定位: L14
    • 说明:

      TODO

  • EMPTY

    • 类型: AdvancementRequirements
    • 修饰符: public static final
    • 源码定位: L18
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.advancements.AdvancementRequirements.Strategy
    • 类型: interface
    • 修饰符: public
    • 源码定位: L120
    • 说明:

      TODO

构造器

public AdvancementRequirements(FriendlyByteBuf input) @ L20

  • 构造器名:AdvancementRequirements
  • 源码定位:L20
  • 修饰符:public

参数:

  • input: FriendlyByteBuf

说明:

TODO

方法

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

public void write(FriendlyByteBuf output) @ L24

  • 方法名:write
  • 源码定位:L24
  • 返回类型:void
  • 修饰符:public

参数:

  • output: FriendlyByteBuf

说明:

TODO

public static AdvancementRequirements allOf(Collection<String> criteria) @ L28

  • 方法名:allOf
  • 源码定位:L28
  • 返回类型:AdvancementRequirements
  • 修饰符:public static

参数:

  • criteria: Collection

说明:

TODO

public static AdvancementRequirements anyOf(Collection<String> criteria) @ L32

  • 方法名:anyOf
  • 源码定位:L32
  • 返回类型:AdvancementRequirements
  • 修饰符:public static

参数:

  • criteria: Collection

说明:

TODO

public int size() @ L36

  • 方法名:size
  • 源码定位:L36
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public boolean test(Predicate<String> predicate) @ L40

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

参数:

  • predicate: Predicate

说明:

TODO

public int count(Predicate<String> predicate) @ L54

  • 方法名:count
  • 源码定位:L54
  • 返回类型:int
  • 修饰符:public

参数:

  • predicate: Predicate

说明:

TODO

private static boolean anyMatch(List<String> criteria, Predicate<String> predicate) @ L66

  • 方法名:anyMatch
  • 源码定位:L66
  • 返回类型:boolean
  • 修饰符:private static

参数:

  • criteria: List
  • predicate: Predicate

说明:

TODO

public DataResult<AdvancementRequirements> validate(Set<String> expectedCriteria) @ L76

  • 方法名:validate
  • 源码定位:L76
  • 返回类型:DataResult
  • 修饰符:public

参数:

  • expectedCriteria: Set

说明:

TODO

public boolean isEmpty() @ L101

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

参数:

说明:

TODO

public String toString() @ L105

  • 方法名:toString
  • 源码定位:L105
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

public Set<String> names() @ L110

  • 方法名:names
  • 源码定位:L110
  • 返回类型:Set
  • 修饰符:public

参数:

说明:

TODO

代码

public record AdvancementRequirements(List<List<String>> requirements) {
    public static final Codec<AdvancementRequirements> CODEC = Codec.STRING
        .listOf()
        .listOf()
        .xmap(AdvancementRequirements::new, AdvancementRequirements::requirements);
    public static final AdvancementRequirements EMPTY = new AdvancementRequirements(List.of());
 
    public AdvancementRequirements(FriendlyByteBuf input) {
        this(input.readList(in -> in.readList(FriendlyByteBuf::readUtf)));
    }
 
    public void write(FriendlyByteBuf output) {
        output.writeCollection(this.requirements, (out, set) -> out.writeCollection(set, FriendlyByteBuf::writeUtf));
    }
 
    public static AdvancementRequirements allOf(Collection<String> criteria) {
        return new AdvancementRequirements(criteria.stream().map(List::of).toList());
    }
 
    public static AdvancementRequirements anyOf(Collection<String> criteria) {
        return new AdvancementRequirements(List.of(List.copyOf(criteria)));
    }
 
    public int size() {
        return this.requirements.size();
    }
 
    public boolean test(Predicate<String> predicate) {
        if (this.requirements.isEmpty()) {
            return false;
        } else {
            for (List<String> set : this.requirements) {
                if (!anyMatch(set, predicate)) {
                    return false;
                }
            }
 
            return true;
        }
    }
 
    public int count(Predicate<String> predicate) {
        int count = 0;
 
        for (List<String> set : this.requirements) {
            if (anyMatch(set, predicate)) {
                count++;
            }
        }
 
        return count;
    }
 
    private static boolean anyMatch(List<String> criteria, Predicate<String> predicate) {
        for (String criterion : criteria) {
            if (predicate.test(criterion)) {
                return true;
            }
        }
 
        return false;
    }
 
    public DataResult<AdvancementRequirements> validate(Set<String> expectedCriteria) {
        Set<String> referencedCriteria = new ObjectOpenHashSet<>();
 
        for (List<String> set : this.requirements) {
            if (set.isEmpty() && expectedCriteria.isEmpty()) {
                return DataResult.error(() -> "Requirement entry cannot be empty");
            }
 
            referencedCriteria.addAll(set);
        }
 
        if (!expectedCriteria.equals(referencedCriteria)) {
            Set<String> missingCriteria = Sets.difference(expectedCriteria, referencedCriteria);
            Set<String> unknownCriteria = Sets.difference(referencedCriteria, expectedCriteria);
            return DataResult.error(
                () -> "Advancement completion requirements did not exactly match specified criteria. Missing: "
                    + missingCriteria
                    + ". Unknown: "
                    + unknownCriteria
            );
        } else {
            return DataResult.success(this);
        }
    }
 
    public boolean isEmpty() {
        return this.requirements.isEmpty();
    }
 
    @Override
    public String toString() {
        return this.requirements.toString();
    }
 
    public Set<String> names() {
        Set<String> names = new ObjectOpenHashSet<>();
 
        for (List<String> set : this.requirements) {
            names.addAll(set);
        }
 
        return names;
    }
 
    public interface Strategy {
        AdvancementRequirements.Strategy AND = AdvancementRequirements::allOf;
        AdvancementRequirements.Strategy OR = AdvancementRequirements::anyOf;
 
        AdvancementRequirements create(Collection<String> criteria);
    }
}

引用的其他类