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); }
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); }