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