public NavGrid(string id, Transition[] transitions, NavTypeData[] nav_type_data, CellOffset[] bounding_offsets, NavTableValidator[] validators, int update_range_x, int update_range_y, int max_links_per_cell) { this.id = id; Validators = validators; navTypeData = nav_type_data; this.transitions = transitions; boundingOffsets = bounding_offsets; List <NavType> list = new List <NavType>(); updateRangeX = update_range_x; updateRangeY = update_range_y; maxLinksPerCell = max_links_per_cell + 1; for (int i = 0; i < transitions.Length; i++) { DebugUtil.Assert(i >= 0 && i <= 255); transitions[i].id = (byte)i; if (!list.Contains(transitions[i].start)) { list.Add(transitions[i].start); } if (!list.Contains(transitions[i].end)) { list.Add(transitions[i].end); } } ValidNavTypes = list.ToArray(); DebugViewLinkType = new bool[ValidNavTypes.Length]; DebugViewValidCellsType = new bool[ValidNavTypes.Length]; NavType[] validNavTypes = ValidNavTypes; foreach (NavType nav_type in validNavTypes) { GetNavTypeData(nav_type); } Links = new Link[maxLinksPerCell * Grid.CellCount]; NavTable = new NavTable(Grid.CellCount); this.transitions = transitions; transitionsByNavType = new Transition[10][]; for (int k = 0; k < 10; k++) { List <Transition> list2 = new List <Transition>(); NavType navType = (NavType)k; for (int l = 0; l < transitions.Length; l++) { Transition item = transitions[l]; if (item.start == navType) { list2.Add(item); } } transitionsByNavType[k] = list2.ToArray(); } foreach (NavTableValidator navTableValidator in validators) { NavTableValidator navTableValidator2 = navTableValidator; navTableValidator2.onDirty = (Action <int>)Delegate.Combine(navTableValidator2.onDirty, new Action <int>(AddDirtyCell)); } potentialScratchPad = new PathFinder.PotentialScratchPad(maxLinksPerCell); InitializeGraph(); NavGraph = new NavGraph(Grid.CellCount, this); }
public void UpdateProbe(NavGrid nav_grid, int cell, NavType nav_type, PathFinderAbilities abilities, PathFinder.PotentialPath.Flags flags) { if (scratchPad == null) { scratchPad = new PathFinder.PotentialScratchPad(nav_grid.maxLinksPerCell); } bool flag = updateCount == -1; bool flag2 = Potentials.Count == 0 || flag; PathGrid.BeginUpdate(cell, !flag2); bool is_cell_in_range; if (flag2) { updateCount = 0; PathFinder.Cell cell_data = PathGrid.GetCell(cell, nav_type, out is_cell_in_range); PathFinder.PotentialPath potential_path = new PathFinder.PotentialPath(cell, nav_type, flags); PathFinder.AddPotential(potential_path, Grid.InvalidCell, NavType.NumNavTypes, 0, 0, -1, Potentials, PathGrid, ref cell_data); } int num = (potentialCellsPerUpdate > 0 && !flag) ? potentialCellsPerUpdate : 2147483647; updateCount++; while (Potentials.Count > 0 && num > 0) { KeyValuePair <int, PathFinder.PotentialPath> keyValuePair = Potentials.Next(); num--; PathFinder.Cell cell2 = PathGrid.GetCell(keyValuePair.Value, out is_cell_in_range); if (cell2.cost == keyValuePair.Key) { PathFinder.AddPotentials(scratchPad, keyValuePair.Value, cell2.cost, cell2.underwaterCost, ref abilities, null, nav_grid.maxLinksPerCell, nav_grid.Links, Potentials, PathGrid, cell2.parent, cell2.parentNavType); } } bool flag3 = Potentials.Count == 0; PathGrid.EndUpdate(flag3); if (flag3 && updateCount > 25) { KProfiler.AddEvent("PathProberUpdateCountExceeded"); } }