AdvancementTree.java

net.minecraft.advancements.AdvancementTree

信息

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

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

  • nodes

    • 类型: Map<Identifier,AdvancementNode>
    • 修饰符: private final
    • 源码定位: L18
    • 说明:

      TODO

  • roots

    • 类型: Set<AdvancementNode>
    • 修饰符: private final
    • 源码定位: L19
    • 说明:

      TODO

  • tasks

    • 类型: Set<AdvancementNode>
    • 修饰符: private final
    • 源码定位: L20
    • 说明:

      TODO

  • listener

    • 类型: AdvancementTree.Listener
    • 修饰符: private
    • 源码定位: L21
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.advancements.AdvancementTree.Listener
    • 类型: interface
    • 修饰符: public
    • 源码定位: L133
    • 说明:

      TODO

构造器

方法

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

private void remove(AdvancementNode node) @ L23

  • 方法名:remove
  • 源码定位:L23
  • 返回类型:void
  • 修饰符:private

参数:

  • node: AdvancementNode

说明:

TODO

public void remove(Set<Identifier> ids) @ L43

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

参数:

  • ids: Set

说明:

TODO

public void addAll(Collection<AdvancementHolder> advancements) @ L54

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

参数:

  • advancements: Collection

说明:

TODO

private boolean tryInsert(AdvancementHolder holder) @ L67

  • 方法名:tryInsert
  • 源码定位:L67
  • 返回类型:boolean
  • 修饰符:private

参数:

  • holder: AdvancementHolder

说明:

TODO

public void clear() @ L95

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

参数:

说明:

TODO

public Iterable<AdvancementNode> roots() @ L104

  • 方法名:roots
  • 源码定位:L104
  • 返回类型:Iterable
  • 修饰符:public

参数:

说明:

TODO

public Collection<AdvancementNode> nodes() @ L108

  • 方法名:nodes
  • 源码定位:L108
  • 返回类型:Collection
  • 修饰符:public

参数:

说明:

TODO

public AdvancementNode get(Identifier id) @ L112

  • 方法名:get
  • 源码定位:L112
  • 返回类型:AdvancementNode
  • 修饰符:public

参数:

  • id: Identifier

说明:

TODO

public AdvancementNode get(AdvancementHolder advancement) @ L116

  • 方法名:get
  • 源码定位:L116
  • 返回类型:AdvancementNode
  • 修饰符:public

参数:

  • advancement: AdvancementHolder

说明:

TODO

public void setListener(AdvancementTree.Listener listener) @ L120

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

参数:

  • listener: AdvancementTree.Listener

说明:

TODO

代码

public class AdvancementTree {
    private static final Logger LOGGER = LogUtils.getLogger();
    private final Map<Identifier, AdvancementNode> nodes = new Object2ObjectOpenHashMap<>();
    private final Set<AdvancementNode> roots = new ObjectLinkedOpenHashSet<>();
    private final Set<AdvancementNode> tasks = new ObjectLinkedOpenHashSet<>();
    private AdvancementTree.@Nullable Listener listener;
 
    private void remove(AdvancementNode node) {
        for (AdvancementNode child : node.children()) {
            this.remove(child);
        }
 
        LOGGER.info("Forgot about advancement {}", node.holder());
        this.nodes.remove(node.holder().id());
        if (node.parent() == null) {
            this.roots.remove(node);
            if (this.listener != null) {
                this.listener.onRemoveAdvancementRoot(node);
            }
        } else {
            this.tasks.remove(node);
            if (this.listener != null) {
                this.listener.onRemoveAdvancementTask(node);
            }
        }
    }
 
    public void remove(Set<Identifier> ids) {
        for (Identifier id : ids) {
            AdvancementNode advancement = this.nodes.get(id);
            if (advancement == null) {
                LOGGER.warn("Told to remove advancement {} but I don't know what that is", id);
            } else {
                this.remove(advancement);
            }
        }
    }
 
    public void addAll(Collection<AdvancementHolder> advancements) {
        List<AdvancementHolder> advancementsToAdd = new ArrayList<>(advancements);
 
        while (!advancementsToAdd.isEmpty()) {
            if (!advancementsToAdd.removeIf(this::tryInsert)) {
                LOGGER.error("Couldn't load advancements: {}", advancementsToAdd);
                break;
            }
        }
 
        LOGGER.info("Loaded {} advancements", this.nodes.size());
    }
 
    private boolean tryInsert(AdvancementHolder holder) {
        Optional<Identifier> parentId = holder.value().parent();
        AdvancementNode parentNode = parentId.map(this.nodes::get).orElse(null);
        if (parentNode == null && parentId.isPresent()) {
            return false;
        } else {
            AdvancementNode node = new AdvancementNode(holder, parentNode);
            if (parentNode != null) {
                parentNode.addChild(node);
            }
 
            this.nodes.put(holder.id(), node);
            if (parentNode == null) {
                this.roots.add(node);
                if (this.listener != null) {
                    this.listener.onAddAdvancementRoot(node);
                }
            } else {
                this.tasks.add(node);
                if (this.listener != null) {
                    this.listener.onAddAdvancementTask(node);
                }
            }
 
            return true;
        }
    }
 
    public void clear() {
        this.nodes.clear();
        this.roots.clear();
        this.tasks.clear();
        if (this.listener != null) {
            this.listener.onAdvancementsCleared();
        }
    }
 
    public Iterable<AdvancementNode> roots() {
        return this.roots;
    }
 
    public Collection<AdvancementNode> nodes() {
        return this.nodes.values();
    }
 
    public @Nullable AdvancementNode get(Identifier id) {
        return this.nodes.get(id);
    }
 
    public @Nullable AdvancementNode get(AdvancementHolder advancement) {
        return this.nodes.get(advancement.id());
    }
 
    public void setListener(AdvancementTree.@Nullable Listener listener) {
        this.listener = listener;
        if (listener != null) {
            for (AdvancementNode root : this.roots) {
                listener.onAddAdvancementRoot(root);
            }
 
            for (AdvancementNode task : this.tasks) {
                listener.onAddAdvancementTask(task);
            }
        }
    }
 
    public interface Listener {
        void onAddAdvancementRoot(AdvancementNode root);
 
        void onRemoveAdvancementRoot(AdvancementNode root);
 
        void onAddAdvancementTask(AdvancementNode task);
 
        void onRemoveAdvancementTask(AdvancementNode task);
 
        void onAdvancementsCleared();
    }
}

引用的其他类