package net.minecraft.advancements; import com.google.common.annotations.VisibleForTesting; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import java.util.Set; import org.jetbrains.annotations.Nullable; public class AdvancementNode { private final AdvancementHolder holder; @Nullable private final AdvancementNode parent; private final Set children = new ReferenceOpenHashSet<>(); @VisibleForTesting public AdvancementNode(AdvancementHolder holder, @Nullable AdvancementNode parent) { this.holder = holder; this.parent = parent; } public Advancement advancement() { return this.holder.value(); } public AdvancementHolder holder() { return this.holder; } @Nullable public AdvancementNode parent() { return this.parent; } public AdvancementNode root() { return getRoot(this); } public static AdvancementNode getRoot(AdvancementNode node) { AdvancementNode advancementNode = node; while (true) { AdvancementNode advancementNode2 = advancementNode.parent(); if (advancementNode2 == null) { return advancementNode; } advancementNode = advancementNode2; } } public Iterable children() { return this.children; } @VisibleForTesting public void addChild(AdvancementNode child) { this.children.add(child); } public boolean equals(Object object) { return this == object ? true : object instanceof AdvancementNode advancementNode && this.holder.equals(advancementNode.holder); } public int hashCode() { return this.holder.hashCode(); } public String toString() { return this.holder.id().toString(); } }