AdvancementVisibilityEvaluator.java

net.minecraft.server.advancements.AdvancementVisibilityEvaluator

信息

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

    TODO

字段/常量

  • VISIBILITY_DEPTH
    • 类型: int
    • 修饰符: private static final
    • 源码定位: L12
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.advancements.AdvancementVisibilityEvaluator.Output

    • 类型: interface
    • 修饰符: public
    • 源码定位: L73
    • 说明:

      TODO

  • net.minecraft.server.advancements.AdvancementVisibilityEvaluator.VisibilityRule

    • 类型: enum
    • 修饰符: private static
    • 源码定位: L77
    • 说明:

      TODO

构造器

方法

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

private static AdvancementVisibilityEvaluator.VisibilityRule evaluateVisibilityRule(Advancement advancement, boolean isDone) @ L14

  • 方法名:evaluateVisibilityRule
  • 源码定位:L14
  • 返回类型:AdvancementVisibilityEvaluator.VisibilityRule
  • 修饰符:private static

参数:

  • advancement: Advancement
  • isDone: boolean

说明:

TODO

private static boolean evaluateVisiblityForUnfinishedNode(Stack<AdvancementVisibilityEvaluator.VisibilityRule> ascendants) @ L25

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

参数:

  • ascendants: Stack<AdvancementVisibilityEvaluator.VisibilityRule>

说明:

TODO

private static boolean evaluateVisibility(AdvancementNode node, Stack<AdvancementVisibilityEvaluator.VisibilityRule> ascendants, Predicate<AdvancementNode> isDoneTest, AdvancementVisibilityEvaluator.Output output) @ L40

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

参数:

  • node: AdvancementNode
  • ascendants: Stack<AdvancementVisibilityEvaluator.VisibilityRule>
  • isDoneTest: Predicate
  • output: AdvancementVisibilityEvaluator.Output

说明:

TODO

public static void evaluateVisibility(AdvancementNode node, Predicate<AdvancementNode> isDone, AdvancementVisibilityEvaluator.Output output) @ L61

  • 方法名:evaluateVisibility
  • 源码定位:L61
  • 返回类型:void
  • 修饰符:public static

参数:

  • node: AdvancementNode
  • isDone: Predicate
  • output: AdvancementVisibilityEvaluator.Output

说明:

TODO

代码

public class AdvancementVisibilityEvaluator {
    private static final int VISIBILITY_DEPTH = 2;
 
    private static AdvancementVisibilityEvaluator.VisibilityRule evaluateVisibilityRule(Advancement advancement, boolean isDone) {
        Optional<DisplayInfo> display = advancement.display();
        if (display.isEmpty()) {
            return AdvancementVisibilityEvaluator.VisibilityRule.HIDE;
        } else if (isDone) {
            return AdvancementVisibilityEvaluator.VisibilityRule.SHOW;
        } else {
            return display.get().isHidden() ? AdvancementVisibilityEvaluator.VisibilityRule.HIDE : AdvancementVisibilityEvaluator.VisibilityRule.NO_CHANGE;
        }
    }
 
    private static boolean evaluateVisiblityForUnfinishedNode(Stack<AdvancementVisibilityEvaluator.VisibilityRule> ascendants) {
        for (int i = 0; i <= 2; i++) {
            AdvancementVisibilityEvaluator.VisibilityRule visibility = ascendants.peek(i);
            if (visibility == AdvancementVisibilityEvaluator.VisibilityRule.SHOW) {
                return true;
            }
 
            if (visibility == AdvancementVisibilityEvaluator.VisibilityRule.HIDE) {
                return false;
            }
        }
 
        return false;
    }
 
    private static boolean evaluateVisibility(
        AdvancementNode node,
        Stack<AdvancementVisibilityEvaluator.VisibilityRule> ascendants,
        Predicate<AdvancementNode> isDoneTest,
        AdvancementVisibilityEvaluator.Output output
    ) {
        boolean isSelfDone = isDoneTest.test(node);
        AdvancementVisibilityEvaluator.VisibilityRule descendantVisibility = evaluateVisibilityRule(node.advancement(), isSelfDone);
        boolean isSelfOrDescendantDone = isSelfDone;
        ascendants.push(descendantVisibility);
 
        for (AdvancementNode child : node.children()) {
            isSelfOrDescendantDone |= evaluateVisibility(child, ascendants, isDoneTest, output);
        }
 
        boolean visiblity = isSelfOrDescendantDone || evaluateVisiblityForUnfinishedNode(ascendants);
        ascendants.pop();
        output.accept(node, visiblity);
        return isSelfOrDescendantDone;
    }
 
    public static void evaluateVisibility(AdvancementNode node, Predicate<AdvancementNode> isDone, AdvancementVisibilityEvaluator.Output output) {
        AdvancementNode root = node.root();
        Stack<AdvancementVisibilityEvaluator.VisibilityRule> visibilityStack = new ObjectArrayList<>();
 
        for (int i = 0; i <= 2; i++) {
            visibilityStack.push(AdvancementVisibilityEvaluator.VisibilityRule.NO_CHANGE);
        }
 
        evaluateVisibility(root, visibilityStack, isDone, output);
    }
 
    @FunctionalInterface
    public interface Output {
        void accept(AdvancementNode advancement, boolean visible);
    }
 
    private static enum VisibilityRule {
        SHOW,
        HIDE,
        NO_CHANGE;
    }
}

引用的其他类