Example #1
0
        public PathfindResult Get(Pathfinder p)
        {
            if (p.StartRooms != null)
            {
                p.StartRooms = p.StartRooms.Where(val => val != null).ToArray();
            }
            if (p.StartRooms == null || p.StartRooms.Length == 0)
            {
                return new PathfindResult()
                       {
                           Success = false
                       }
            }
            ;

            for (int i = 0; i < _pGridMax; i++)
            {
                _pGrid[i].Clear();
            }
            _pExits[0].Clear();
            _pExits[1].Clear();
            _pGridMax = 0;
            foreach (KeyValuePair <uint, Room> x in IRooms)
            {
                x.Value.Mapper_OpenBy   = null;
                x.Value.Mapper_OpenCost = 0;
            }

            p.OnStartedPathfind();

            if (p.OverridePortals == null)
            {
                foreach (KeyValuePair <uint, Exit> x in IPortals)
                {
                    if (!x.Value.HasFlag("disabled") && CanUsePortal(x.Value, p))
                    {
                        _pExits[!x.Value.HasFlag("recallmechanic") ? 0 : 1].Add(x.Value);
                    }
                }
            }
            else
            {
                foreach (Exit x in p.OverridePortals)
                {
                    if (!x.HasFlag("disabled") && CanUsePortal(x, p))
                    {
                        _pExits[!x.HasFlag("recallmechanic") ? 0 : 1].Add(x);
                    }
                }
            }

            Room Finish = null;

            if (p.StartRooms != null)
            {
                foreach (Room r in p.StartRooms)
                {
                    r.Mapper_OpenCost = uint.MaxValue;
                    if (OpenRoom(r, null, 0, p))
                    {
                        Finish = r;
                        break;
                    }
                }
            }

            int itr1 = 0, itr2 = 0;

            if (Finish == null)
            {
                while (itr1 < _pGrid.Length && itr1 < _pGridMax)
                {
                    if (itr2 >= _pGrid[itr1].Count)
                    {
                        itr2 = 0;
                        itr1++;
                        continue;
                    }

                    if (OpenRoom(_pGrid[itr1][itr2].To, _pGrid[itr1][itr2], (uint)itr1, p))
                    {
                        Finish = _pGrid[itr1][itr2].To;
                        break;
                    }

                    itr2++;
                }
            }

            PathfindResult pr = new PathfindResult();

            pr.Success = Finish != null;
            pr.Cost    = itr1;
            pr.Target  = Finish;
            while (Finish != null && Finish.Mapper_OpenBy != null)
            {
                pr.Path.Insert(0, Finish.Mapper_OpenBy);
                Finish = Finish.Mapper_OpenBy.From;
            }
            pr.Start = pr.Path.Count != 0 ? pr.Path[0].From : Finish;

            p.OnEndedPathFind(pr);
            return(pr);
        }
Example #2
0
        private bool OpenRoom(Room r, Exit from, uint cost, Pathfinder p)
        {
            if (r.Mapper_OpenBy != null || (from != null && p.StartRooms.Contains(r)) || r.Area.Entry == uint.MaxValue)
            {
                return(false);
            }

            r.Mapper_OpenBy   = from;
            r.Mapper_OpenCost = cost;

            if (p.IsTargetRoom(r))
            {
                return(true);
            }

            if (_pExits[0].Count > 0 && !r.HasFlag("prison"))
            {
                for (int i = _pExits[0].Count - 1; i >= 0; i--)
                {
                    if (_pExits[0][i].To.Mapper_OpenBy != null)
                    {
                        _pExits[0].RemoveAt(i);
                    }
                    else if (GetScript(r).CanUsePortal(_pExits[0][i], r) && p.CanUsePortal(_pExits[0][i], r))
                    {
                        _pExits[0][i].From = r;
                        AddExit(_pExits[0][i], p, true);
                        _pExits[0].RemoveAt(i);
                    }
                }
            }
            if (_pExits[1].Count > 0 && !r.HasFlag("norecall"))
            {
                for (int i = _pExits[1].Count - 1; i >= 0; i--)
                {
                    if (_pExits[1][i].To.Mapper_OpenBy != null)
                    {
                        _pExits[1].RemoveAt(i);
                    }
                    else if (GetScript(r).CanUsePortal(_pExits[1][i], r) && p.CanUsePortal(_pExits[1][i], r))
                    {
                        _pExits[1][i].From = r;
                        AddExit(_pExits[1][i], p, true);
                        _pExits[1].RemoveAt(i);
                    }
                }
            }
            foreach (Exit e in r.exits)
            {
                if (e.To.Mapper_OpenBy != null)
                {
                    continue;
                }
                if (e.To.Area.Entry == uint.MaxValue)
                {
                    continue;
                }
                if (e.HasFlag("disabled"))
                {
                    continue;
                }
                if (!GetScript(r).CanUseExit(e))
                {
                    continue;
                }
                if (e.MinLevel > p.CharacterLevel)
                {
                    continue;
                }
                if (e.MaxLevel < p.CharacterLevel)
                {
                    continue;
                }
                if (!p.CanUseExit(e))
                {
                    continue;
                }
                AddExit(e, p, false);
            }

            return(false);
        }