static PiratesOnlineHexagonGrid CreateGrid(int x, int z, Vector3 position, PiratesOnlineNode node)
    {
        PiratesOnlineHexagonGrid grid = CreateGrid(x, z, position);

        if (grid != null)
        {
            grid.UpdateMesh(node);
        }

        return(grid);
    }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if (Application.isPlaying)
        {
            PiratesOnlineHexagonGrid grid = target as PiratesOnlineHexagonGrid;

            if (grid != null)
            {
                grid.GridX = (short)EditorGUILayout.IntField("Grid X", grid.GridX);
                grid.GridZ = (short)EditorGUILayout.IntField("Grid Z", grid.GridZ);
            }
        }
    }
    void SpawnAround(PiratesOnlineHexagonGrid grid)
    {
        // Only update if we got a new closest grid
        if (grid != null)
        {
            Vector3 pos = grid.transform.position;

            for (int x = -PiratesOnlineConstants.SpawnDistance; x <= PiratesOnlineConstants.SpawnDistance; ++x)
            {
                for (int z = -PiratesOnlineConstants.SpawnDistance; z <= PiratesOnlineConstants.SpawnDistance; ++z)
                {
                    Vector3 p = pos;

                    //
                    p.x += (x * PiratesOnlineConstants.GridWidth);
                    p.z += (z * PiratesOnlineConstants.GridHeight);

                    // Make sure we have this grid
                    CreateGrid(grid.GridX + x, grid.GridZ + z, p, testNode);
                }
            }

            // Find out-dated grids
            for (int i = 0; i < activeGrids.Count; ++i)
            {
                // Grab grid
                PiratesOnlineHexagonGrid neighbor = (PiratesOnlineHexagonGrid)activeGrids[i];

                // Calculate distances
                int xDist = grid.GridX - neighbor.GridX;
                int zDist = grid.GridZ - neighbor.GridZ;

                // Check x distance
                if (xDist > PiratesOnlineConstants.SpawnDistance || xDist < -PiratesOnlineConstants.SpawnDistance)
                {
                    RecycleGrid(neighbor);
                    --i;
                }

                // Check z distance
                else if (zDist > PiratesOnlineConstants.SpawnDistance || zDist < -PiratesOnlineConstants.SpawnDistance)
                {
                    RecycleGrid(neighbor);
                    --i;
                }
            }
        }
    }
    static void RecycleGrid(PiratesOnlineHexagonGrid grid)
    {
        // Remove from world
        keyMap.Remove((grid.GridX << 16) | grid.GridZ);

        // Remove from active grids
        activeGrids.Remove(grid);

        // Deactivate
        grid.gameObject.SetActiveRecursively(false);

        // Recycle
        recycledGrids.Enqueue(grid);

        //GameObject.Destroy(grid.gameObject);
    }
    static PiratesOnlineHexagonGrid CreateGrid(int x, int z, Vector3 position)
    {
        if (x < 0 || z < 0)
        {
            return(null);
        }

        if (x >= PiratesOnlineConstants.GridCount || z >= PiratesOnlineConstants.GridCount)
        {
            return(null);
        }

        if (HasGrid(x, z))
        {
            return(null);
        }

        PiratesOnlineHexagonGrid grid = null;

        if (recycledGrids.Count > 0)
        {
            grid = (PiratesOnlineHexagonGrid)recycledGrids.Dequeue();
            grid.gameObject.SetActiveRecursively(true);
        }
        else
        {
            // Create new grid object
            GameObject go = (GameObject)GameObject.Instantiate(instance.prefab, Vector3.zero, Quaternion.identity);

            // Grab new component
            grid = (PiratesOnlineHexagonGrid)go.GetComponent(typeof(PiratesOnlineHexagonGrid));

            // Init
            grid.InitMesh();
        }

        grid.GridX = x;
        grid.GridZ = z;
        grid.transform.position = position;

        AddGrid(grid);

        return(grid);
    }
    void Move(Vector3 m)
    {
        // If theres no movement, ignore
        if (m == Vector3.zero)
        {
            return;
        }

        // Never move further then 1.0 units per frame (really fast)
        m = Quaternion.Euler(0, 50, 0) * m;
        m = Vector3.ClampMagnitude(m * Time.deltaTime * scrollSpeed, 1f);

        // Squared distance, just start at max possible value
        float sqrDistance = float.MaxValue;

        //PiratesOnlineHexagonGrid previousGrid = closestGrid;

        for (int i = 0; i < activeGrids.Count; ++i)
        {
            // Grab grid
            PiratesOnlineHexagonGrid grid = (PiratesOnlineHexagonGrid)activeGrids[i];

            // Move!
            grid.transform.position += m;

            // Check if this grid is the closest one
            float sqrMagnitude = grid.transform.position.sqrMagnitude;

            // Check if this is the closest one so far
            if (sqrMagnitude < sqrDistance)
            {
                closestGrid = grid;
                sqrDistance = sqrMagnitude;
            }
        }

        // Spawn around closest grid
        SpawnAround(closestGrid);
    }
    static void RecycleGrid(PiratesOnlineHexagonGrid grid)
    {
        // Remove from world
        keyMap.Remove((grid.GridX << 16) | grid.GridZ);

        // Remove from active grids
        activeGrids.Remove(grid);

        // Deactivate
        grid.gameObject.SetActiveRecursively(false);

        // Recycle
        recycledGrids.Enqueue(grid);

        //GameObject.Destroy(grid.gameObject);
    }
    void SpawnAround(PiratesOnlineHexagonGrid grid)
    {
        // Only update if we got a new closest grid
        if (grid != null)
        {
            Vector3 pos = grid.transform.position;

            for (int x = -PiratesOnlineConstants.SpawnDistance; x <= PiratesOnlineConstants.SpawnDistance; ++x)
            {
                for (int z = -PiratesOnlineConstants.SpawnDistance; z <= PiratesOnlineConstants.SpawnDistance; ++z)
                {
                    Vector3 p = pos;

                    // 
                    p.x += (x * PiratesOnlineConstants.GridWidth);
                    p.z += (z * PiratesOnlineConstants.GridHeight);

                    // Make sure we have this grid
                    CreateGrid(grid.GridX + x, grid.GridZ + z, p, testNode);
                }
            }

            // Find out-dated grids
            for (int i = 0; i < activeGrids.Count; ++i)
            {
                // Grab grid
                PiratesOnlineHexagonGrid neighbor = (PiratesOnlineHexagonGrid)activeGrids[i];

                // Calculate distances
                int xDist = grid.GridX - neighbor.GridX;
                int zDist = grid.GridZ - neighbor.GridZ;

                // Check x distance
                if (xDist > PiratesOnlineConstants.SpawnDistance || xDist < -PiratesOnlineConstants.SpawnDistance)
                {
                    RecycleGrid(neighbor);
                    --i;
                }

                // Check z distance
                else if (zDist > PiratesOnlineConstants.SpawnDistance || zDist < -PiratesOnlineConstants.SpawnDistance)
                {
                    RecycleGrid(neighbor);
                    --i;
                }
            }
        }
    }
 public static void AddGrid(PiratesOnlineHexagonGrid grid)
 {
     keyMap[(grid.GridX << 16) | grid.GridZ] = grid;
     activeGrids.Add(grid);
 }
    void Move(Vector3 m)
    {
        // If theres no movement, ignore
        if (m == Vector3.zero)
        {
            return;
        }

        // Never move further then 1.0 units per frame (really fast)
        m = Quaternion.Euler(0, 50, 0) * m;
        m = Vector3.ClampMagnitude(m * Time.deltaTime * scrollSpeed, 1f);

        // Squared distance, just start at max possible value
        float sqrDistance = float.MaxValue;

        //PiratesOnlineHexagonGrid previousGrid = closestGrid;

        for (int i = 0; i < activeGrids.Count; ++i)
        {
            // Grab grid
            PiratesOnlineHexagonGrid grid = (PiratesOnlineHexagonGrid)activeGrids[i];
            
            // Move!
            grid.transform.position += m;

            // Check if this grid is the closest one
            float sqrMagnitude = grid.transform.position.sqrMagnitude;

            // Check if this is the closest one so far
            if (sqrMagnitude < sqrDistance)
            {
                closestGrid = grid;
                sqrDistance = sqrMagnitude;
            }
        }

        // Spawn around closest grid
        SpawnAround(closestGrid);
    }
 public static bool GetGrid(int x, int z, out PiratesOnlineHexagonGrid grid)
 {
     return keyMap.TryGetValue((x << 16) | z, out grid);
 }
 public static void AddGrid(PiratesOnlineHexagonGrid grid)
 {
     keyMap[(grid.GridX << 16) | grid.GridZ] = grid;
     activeGrids.Add(grid);
 }
 public static bool GetGrid(int x, int z, out PiratesOnlineHexagonGrid grid)
 {
     return(keyMap.TryGetValue((x << 16) | z, out grid));
 }