using System; using System.Collections; using System.Collections.Generic; using HG; using JetBrains.Annotations; namespace RoR2.Navigation; public class NodeGraphSpider { public class StepInfo { public NodeGraph.NodeIndex node; public StepInfo previousStep; } [NotNull] private NodeGraph nodeGraph; private List uncheckedSteps; private BitArray visitedNodes; public HullMask hullMask; [NotNull] public List collectedSteps { get; private set; } public NodeGraphSpider([NotNull] NodeGraph nodeGraph, HullMask hullMask) { if ((object)nodeGraph == null) { throw new ArgumentNullException("nodeGraph", "'nodeGraph' must be valid."); } this.nodeGraph = nodeGraph; this.hullMask = hullMask; collectedSteps = new List(); uncheckedSteps = new List(); visitedNodes = new BitArray(nodeGraph.GetNodeCount()); } public bool PerformStep() { List list = uncheckedSteps; uncheckedSteps = new List(); List list2 = CollectionPool>.RentCollection(); for (int i = 0; i < list.Count; i++) { StepInfo stepInfo = list[i]; list2.Clear(); nodeGraph.GetActiveNodeLinks(stepInfo.node, list2); for (int j = 0; j < list2.Count; j++) { NodeGraph.LinkIndex linkIndex = list2[j]; if (nodeGraph.IsLinkSuitableForHull(linkIndex, hullMask)) { NodeGraph.NodeIndex linkEndNode = nodeGraph.GetLinkEndNode(linkIndex); if (!visitedNodes[linkEndNode.nodeIndex]) { uncheckedSteps.Add(new StepInfo { node = linkEndNode, previousStep = stepInfo }); visitedNodes[linkEndNode.nodeIndex] = true; } } } collectedSteps.Add(stepInfo); } list2 = CollectionPool>.ReturnCollection(list2); return list.Count > 0; } public void AddNodeForNextStep(NodeGraph.NodeIndex nodeIndex) { if (!(nodeIndex == NodeGraph.NodeIndex.invalid) && !visitedNodes[nodeIndex.nodeIndex]) { uncheckedSteps.Add(new StepInfo { node = nodeIndex, previousStep = null }); visitedNodes[nodeIndex.nodeIndex] = true; } } }