Пример #1
0
        private Dictionary <string, ZoneNode> GenerateNodeGraph(ZonePathingData pathingData)
        {
            Dictionary <string, ZoneNode> dictionary = new Dictionary <string, ZoneNode>();

            for (int i = 0; i < pathingData.ZoneNodes.Length; i++)
            {
                if (pathingData.ZoneNodes[i].Zone != null)
                {
                    ZoneNode zoneNode = new ZoneNode();
                    zoneNode.ZoneName = pathingData.ZoneNodes[i].Zone.ZoneName;
                    dictionary.Add(zoneNode.ZoneName, zoneNode);
                }
            }
            for (int i = 0; i < pathingData.ZoneNodes.Length; i++)
            {
                if (!(pathingData.ZoneNodes[i].Zone != null))
                {
                    continue;
                }
                ZonePathingNode zonePathingNode = pathingData.ZoneNodes[i];
                ZoneNode[]      array           = new ZoneNode[zonePathingNode.ZoneTransitions.Length];
                for (int j = 0; j < zonePathingNode.ZoneTransitions.Length; j++)
                {
                    if (zonePathingNode.ZoneTransitions[j] != null)
                    {
                        array[j] = dictionary[zonePathingNode.ZoneTransitions[j].ZoneName];
                    }
                }
                ZoneNode zoneNode = dictionary[pathingData.ZoneNodes[i].Zone.ZoneName];
                zoneNode.ZoneTransitions = array;
                dictionary[pathingData.ZoneNodes[i].Zone.ZoneName] = zoneNode;
            }
            return(dictionary);
        }
Пример #2
0
        public string GetNextZoneInPath(string startZoneName, string targetZoneName)
        {
            if (startZoneName == targetZoneName)
            {
                return(targetZoneName);
            }
            if (nodeGraph == null)
            {
                ZonePathingData pathingData = Content.LoadImmediate(dataAssetKey);
                nodeGraph = GenerateNodeGraph(pathingData);
            }
            else
            {
                clearParentNodes();
            }
            ZoneNode         item  = nodeGraph[startZoneName];
            List <string>    list  = new List <string>();
            Queue <ZoneNode> queue = new Queue <ZoneNode>();

            queue.Enqueue(item);
            ZoneNode zoneNode = null;

            while (queue.Count != 0 && zoneNode == null)
            {
                ZoneNode zoneNode2 = queue.Dequeue();
                list.Add(zoneNode2.ZoneName);
                for (int i = 0; i < zoneNode2.ZoneTransitions.Length; i++)
                {
                    ZoneNode zoneNode3 = zoneNode2.ZoneTransitions[i];
                    if (zoneNode3 == null || list.Contains(zoneNode3.ZoneName))
                    {
                        continue;
                    }
                    if (zoneNode3.ZoneName == targetZoneName)
                    {
                        if (zoneNode2.ParentNode == null)
                        {
                            zoneNode = zoneNode3;
                            break;
                        }
                        zoneNode3.ParentNode = zoneNode2;
                        while (zoneNode2.ParentNode != null)
                        {
                            zoneNode2 = zoneNode2.ParentNode;
                        }
                        zoneNode = zoneNode2.ZoneTransitions[0];
                        break;
                    }
                    ZoneNode zoneNode4 = new ZoneNode();
                    zoneNode4.ZoneName        = zoneNode2.ZoneName;
                    zoneNode4.ZoneTransitions = new ZoneNode[1] {
                        zoneNode2.ZoneTransitions[i]
                    };
                    zoneNode4.ParentNode = zoneNode2.ParentNode;
                    ZoneNode zoneNode5 = new ZoneNode();
                    zoneNode5.ZoneName        = zoneNode2.ZoneTransitions[i].ZoneName;
                    zoneNode5.ParentNode      = zoneNode4;
                    zoneNode5.ZoneTransitions = zoneNode3.ZoneTransitions;
                    queue.Enqueue(zoneNode5);
                }
            }
            string result = "";

            if (zoneNode != null)
            {
                result = zoneNode.ZoneName;
            }
            return(result);
        }