Exemplo n.º 1
0
        // Token: 0x06001DF4 RID: 7668 RVA: 0x00080FE0 File Offset: 0x0007F1E0
        private void ReconstructPath(Path path, NodeGraph.LinkIndex[] cameFrom, NodeGraph.LinkIndex current, NodeGraph.PathRequest pathRequest)
        {
            int num = 1 << (int)pathRequest.hullClassification;

            path.Clear();
            if (current != NodeGraph.LinkIndex.invalid)
            {
                path.PushWaypointToFront(this.links[current.linkIndex].nodeIndexB, 0f);
            }
            while (current != NodeGraph.LinkIndex.invalid)
            {
                NodeGraph.NodeIndex nodeIndexB = this.links[current.linkIndex].nodeIndexB;
                float minJumpHeight            = 0f;
                if ((num & this.links[current.linkIndex].jumpHullMask) != 0 && this.links[current.linkIndex].minJumpHeight > 0f)
                {
                    Vector3 position  = this.nodes[this.links[current.linkIndex].nodeIndexA.nodeIndex].position;
                    Vector3 position2 = this.nodes[this.links[current.linkIndex].nodeIndexB.nodeIndex].position;
                    minJumpHeight = Trajectory.CalculateApex(Trajectory.CalculateInitialYSpeed(Trajectory.CalculateGroundTravelTime(pathRequest.maxSpeed, NodeGraph.DistanceXZ(position, position2)), position2.y - position.y));
                }
                path.PushWaypointToFront(nodeIndexB, minJumpHeight);
                if (cameFrom[this.links[current.linkIndex].nodeIndexA.nodeIndex] == NodeGraph.LinkIndex.invalid)
                {
                    path.PushWaypointToFront(this.links[current.linkIndex].nodeIndexA, 0f);
                }
                current = cameFrom[this.links[current.linkIndex].nodeIndexA.nodeIndex];
            }
            path.status = PathStatus.Valid;
        }
Exemplo n.º 2
0
 // Token: 0x06001DEC RID: 7660 RVA: 0x000808F2 File Offset: 0x0007EAF2
 public NodeGraph.NodeIndex GetLinkEndNode(NodeGraph.LinkIndex linkIndex)
 {
     if (linkIndex != NodeGraph.LinkIndex.invalid && linkIndex.linkIndex < this.links.Length)
     {
         return(this.links[linkIndex.linkIndex].nodeIndexB);
     }
     return(NodeGraph.NodeIndex.invalid);
 }
Exemplo n.º 3
0
 // Token: 0x06001DE8 RID: 7656 RVA: 0x00080718 File Offset: 0x0007E918
 public bool GetPositionAlongLink(NodeGraph.LinkIndex linkIndex, float t, out Vector3 position)
 {
     if (linkIndex != NodeGraph.LinkIndex.invalid && linkIndex.linkIndex < this.links.Length)
     {
         position = Vector3.LerpUnclamped(this.nodes[this.links[linkIndex.linkIndex].nodeIndexA.nodeIndex].position, this.nodes[this.links[linkIndex.linkIndex].nodeIndexB.nodeIndex].position, t);
         return(true);
     }
     position = Vector3.zero;
     return(false);
 }
Exemplo n.º 4
0
 // Token: 0x06001DF3 RID: 7667 RVA: 0x00080F68 File Offset: 0x0007F168
 private NodeGraph.LinkIndex Resolve(NodeGraph.LinkIndex[] cameFrom, NodeGraph.LinkIndex current)
 {
     if (current.linkIndex < 0 || current.linkIndex > this.links.Length)
     {
         Debug.LogFormat("Link {0} is out of range [0,{1})", new object[]
         {
             current.linkIndex,
             this.links.Length
         });
     }
     NodeGraph.NodeIndex nodeIndexA = this.links[current.linkIndex].nodeIndexA;
     return(cameFrom[nodeIndexA.nodeIndex]);
 }
Exemplo n.º 5
0
 // Token: 0x06001DE6 RID: 7654 RVA: 0x00080624 File Offset: 0x0007E824
 public NodeGraph.LinkIndex[] GetActiveNodeLinks(NodeGraph.NodeIndex nodeIndex)
 {
     if (nodeIndex != NodeGraph.NodeIndex.invalid && nodeIndex.nodeIndex < this.nodes.Length)
     {
         NodeGraph.LinkListIndex linkListIndex = this.nodes[nodeIndex.nodeIndex].linkListIndex;
         NodeGraph.LinkIndex[]   array         = new NodeGraph.LinkIndex[linkListIndex.size];
         int index = linkListIndex.index;
         int num   = 0;
         while ((long)num < (long)((ulong)linkListIndex.size))
         {
             array[num] = new NodeGraph.LinkIndex
             {
                 linkIndex = index++
             };
             num++;
         }
         return(array);
     }
     return(null);
 }
Exemplo n.º 6
0
        // Token: 0x06001DF2 RID: 7666 RVA: 0x00080B04 File Offset: 0x0007ED04
        public PathTask ComputePath(NodeGraph.PathRequest pathRequest)
        {
            PathTask pathTask = new PathTask(pathRequest.path);

            pathTask.status = PathTask.TaskStatus.Running;
            NodeGraph.NodeIndex nodeIndex  = this.FindClosestNode(pathRequest.startPos, pathRequest.hullClassification);
            NodeGraph.NodeIndex nodeIndex2 = this.FindClosestNode(pathRequest.endPos, pathRequest.hullClassification);
            if (nodeIndex.nodeIndex == NodeGraph.NodeIndex.invalid.nodeIndex || nodeIndex2.nodeIndex == NodeGraph.NodeIndex.invalid.nodeIndex)
            {
                pathRequest.path.Clear();
                pathTask.status = PathTask.TaskStatus.Complete;
                return(pathTask);
            }
            int num = 1 << (int)pathRequest.hullClassification;

            bool[] array  = new bool[this.nodes.Length];
            bool[] array2 = new bool[this.nodes.Length];
            array2[nodeIndex.nodeIndex] = true;
            int i = 1;

            NodeGraph.NodeIndex[] array3 = new NodeGraph.NodeIndex[this.nodes.Length];
            array3[0] = nodeIndex;
            NodeGraph.LinkIndex[] array4 = new NodeGraph.LinkIndex[this.nodes.Length];
            for (int j = 0; j < array4.Length; j++)
            {
                array4[j] = NodeGraph.LinkIndex.invalid;
            }
            float[] array5 = new float[this.nodes.Length];
            for (int k = 0; k < array5.Length; k++)
            {
                array5[k] = float.PositiveInfinity;
            }
            array5[nodeIndex.nodeIndex] = 0f;
            float[] array6 = new float[this.nodes.Length];
            for (int l = 0; l < array6.Length; l++)
            {
                array6[l] = float.PositiveInfinity;
            }
            array6[nodeIndex.nodeIndex] = this.HeuristicCostEstimate(pathRequest.startPos, pathRequest.endPos);
            while (i > 0)
            {
                NodeGraph.NodeIndex invalid = NodeGraph.NodeIndex.invalid;
                float num2 = float.PositiveInfinity;
                for (int m = 0; m < i; m++)
                {
                    int nodeIndex3 = array3[m].nodeIndex;
                    if (array6[nodeIndex3] <= num2)
                    {
                        num2    = array6[nodeIndex3];
                        invalid = new NodeGraph.NodeIndex(nodeIndex3);
                    }
                }
                if (invalid.nodeIndex == nodeIndex2.nodeIndex)
                {
                    this.ReconstructPath(pathRequest.path, array4, array4[invalid.nodeIndex], pathRequest);
                    pathTask.status = PathTask.TaskStatus.Complete;
                    return(pathTask);
                }
                array2[invalid.nodeIndex] = false;
                NodeGraph.ArrayRemoveNodeIndex(array3, invalid, i);
                i--;
                array[invalid.nodeIndex] = true;
                NodeGraph.LinkListIndex linkListIndex = this.nodes[invalid.nodeIndex].linkListIndex;
                NodeGraph.LinkIndex     linkIndex     = new NodeGraph.LinkIndex
                {
                    linkIndex = linkListIndex.index
                };
                NodeGraph.LinkIndex linkIndex2 = new NodeGraph.LinkIndex
                {
                    linkIndex = linkListIndex.index + (int)linkListIndex.size
                };
                while (linkIndex.linkIndex < linkIndex2.linkIndex)
                {
                    NodeGraph.Link      link       = this.links[linkIndex.linkIndex];
                    NodeGraph.NodeIndex nodeIndexB = link.nodeIndexB;
                    if (!array[nodeIndexB.nodeIndex])
                    {
                        if ((num & link.jumpHullMask) != 0 && this.links[linkIndex.linkIndex].minJumpHeight > 0f)
                        {
                            Vector3 position  = this.nodes[link.nodeIndexA.nodeIndex].position;
                            Vector3 position2 = this.nodes[link.nodeIndexB.nodeIndex].position;
                            if (Trajectory.CalculateApex(Trajectory.CalculateInitialYSpeed(Trajectory.CalculateGroundTravelTime(pathRequest.maxSpeed, NodeGraph.DistanceXZ(position, position2)), position2.y - position.y)) > pathRequest.maxJumpHeight)
                            {
                                goto IL_41A;
                            }
                        }
                        if ((link.hullMask & num) != 0 && (link.gateIndex == 0 || this.openGates[(int)link.gateIndex]))
                        {
                            float num3 = array5[invalid.nodeIndex] + link.distanceScore;
                            if (!array2[nodeIndexB.nodeIndex])
                            {
                                array2[nodeIndexB.nodeIndex] = true;
                                array3[i] = nodeIndexB;
                                i++;
                            }
                            else if (num3 >= array5[nodeIndexB.nodeIndex])
                            {
                                goto IL_41A;
                            }
                            array4[nodeIndexB.nodeIndex] = linkIndex;
                            array5[nodeIndexB.nodeIndex] = num3;
                            array6[nodeIndexB.nodeIndex] = array5[nodeIndexB.nodeIndex] + this.HeuristicCostEstimate(this.nodes[nodeIndexB.nodeIndex].position, this.nodes[nodeIndex2.nodeIndex].position);
                        }
                    }
IL_41A:
                    linkIndex.linkIndex++;
                }
            }
            pathRequest.path.Clear();
            pathTask.status = PathTask.TaskStatus.Complete;
            return(pathTask);
        }
Exemplo n.º 7
0
 // Token: 0x06001DEA RID: 7658 RVA: 0x00080838 File Offset: 0x0007EA38
 public bool IsLinkSuitableForHull(NodeGraph.LinkIndex linkIndex, HullMask hullMask)
 {
     return(linkIndex != NodeGraph.LinkIndex.invalid && linkIndex.linkIndex < this.links.Length && (this.links[linkIndex.linkIndex].hullMask & (int)hullMask) != 0 && (this.links[linkIndex.linkIndex].gateIndex == 0 || this.openGates[(int)this.links[linkIndex.linkIndex].gateIndex]));
 }