private void InitializeNewMapFinders(String index, Map map)
        {
            newPathFinder[] newFinders = new newPathFinder[ThreadingMod.NUM_THREADS_PER_MAP];

            for (int i = 0; i < ThreadingMod.NUM_THREADS_PER_MAP; i++)
            {
                newFinders[i] = new newPathFinder(map);
            }
            finders.Add(index, newFinders);
            numBusyFinders.Add(index, 0);
            busyFinders.Add(index, new bool[ThreadingMod.NUM_THREADS_PER_MAP]);
            findersBusy.Add(index, new EventWaitHandle(true, EventResetMode.ManualReset));
        }
        private newPathFinder SelectFinder(String index, ref int ticket)
        {
            newPathFinder reachability = null;

            lock (_syncObject)
            {
                for (int i = 0; i < ThreadingMod.NUM_THREADS_PER_MAP; i++)
                {
                    if (busyFinders[index][i] == false)
                    {
                        busyFinders[index][i] = true;
                        reachability          = finders[index][i];
                        ticket = i;
                        break;
                    }
                }
            }
            return(reachability);
        }
コード例 #3
0
        public static PawnPath NewFindPath(this PathFinder pf, IntVec3 start, LocalTargetInfo dest, TraverseParms traverseParms, PathEndMode peMode = PathEndMode.OnCell)
        {
            FieldInfo mapField = typeof(PathFinder).GetField("map", BindingFlags.NonPublic | BindingFlags.Instance);
            Map       map      = (Map)mapField.GetValue(pf);
            string    index    = map.GetUniqueLoadID();

            int           ticket = -1;
            newPathFinder finder = PathFinderInstanceContainer.GetInstance().requestFinder(index, ref ticket, map);
            var           val    = finder.FindPath(start, dest, traverseParms, peMode);

            PathFinderInstanceContainer.GetInstance().CheckInFinder(index, ticket);
            try
            {
                var someVal = val.LastNode;
            }
            catch (System.Exception)
            {
                Log.Message("Tried to return a path without an end.... ???");
                return(PawnPath.NotFound);
            }
            return(val);
        }