Пример #1
0
        void DoPathFindRequests()
        {
            PathFindRequest request;

            while (true)
            {
                // get a request or sleep 1 ms and try again
                if (PathFindRequest.HighPriorityPathFindRequests.Count > 0)
                {
                    lock (PathFindRequest.HighPriorityPathFindRequests)
                    {
                        request = PathFindRequest.HighPriorityPathFindRequests.DeleteMax();
                    }
                }
                else if (PathFindRequest.LowPriorityPathFindRequests.Count > 0)
                {
                    lock (PathFindRequest.LowPriorityPathFindRequests)
                    {
                        request = PathFindRequest.LowPriorityPathFindRequests.DeleteMax();
                    }
                }
                else
                {
                    Thread.Sleep(1);
                    continue;
                }

                // if request is has been deactivated dont do it
                if (!request.Command.Active)
                {
                    continue;
                }

                DateTime startTime = DateTime.Now;

                // calculate path
                request.WayPoints = FindPath(request.StartNode, request.Command.Destination, request.Command.Unit, request.Target, request.AvoidUnits);

                // smooth path
                if (!request.AvoidUnits)
                {
                    //if (!(request.Command is AttackCommand))
                    {
                        //if (!(request.Command is AttackCommand))

                        Tools.SmoothPath(request.WayPoints, request.Command.Unit);
                        Tools.SmoothImmediatePath(request.WayPoints, request.Command.Unit, request.StartNode.Tile.CenterPoint, request.Queued);
                    }
                }

                // add finished request to the done queue
                lock (PathFindRequest.DonePathFindRequestsLock)
                {
                    PathFindRequest.DonePathFindRequests.Enqueue(request);
                }

                lock (TimeSpentPathFindingLock)
                {
                    TimeSpentPathFinding += (DateTime.Now - startTime);
                }
            }
        }