private void SetBioms()
    {
        float borderMin = 0.54f, borderMax = 0.55f;

        for (int x = 0; x < world.WorldAttributes.WorldSizeInBlocks; ++x)
        {
            for (int z = 0; z < world.WorldAttributes.WorldSizeInBlocks; ++z)
            {
                Vector2Int ColumnPos = new Vector2Int(x, z);

                float noise = PerlinNoise.Get2DPerlin(world, ColumnPos, 0.0f, world.WorldAttributes.WorldScale);

                if (noise < 0.5)
                {
                    world.Bioms[x, z] = 0;
                }
                else
                {
                    float borderNoise = PerlinNoise.Get2DPerlin(world, ColumnPos, 1f, world.WorldAttributes.WorldScale);

                    if (borderMin < borderNoise && borderMax > borderNoise)
                    {
                        world.Bioms[x, z] = -1;
                    }
                    else
                    {
                        world.Bioms[x, z] = -2;
                    }
                }
            }
        }

        PutBioms();
    }
    private void AddWater()
    {
        float borderMin = 0.54f, borderMax = 0.55f;

        for (int x = 0; x < world.WorldAttributes.WorldSizeInBlocks; ++x)
        {
            for (int z = 0; z < world.WorldAttributes.WorldSizeInBlocks; ++z)
            {
                if (world.Bioms[x, z] == 0)
                {
                    AddWaterColumn(new Vector2Int(x, z), world.WorldAttributes.OceanHeight);
                }
                else
                {
                    Vector2Int pos = new Vector2Int(x, z);

                    float riverNoise = PerlinNoise.Get2DPerlin(world, pos, 1f, world.WorldAttributes.WorldScale);

                    if (borderMin < riverNoise && borderMax > riverNoise)
                    {
                        SetRiverPoint(Vector2Int.FloorToInt(pos));
                    }
                    else if (world.Bioms[x, z] == -1)
                    {
                        world.Bioms[x, z] = 0;

                        SetRiverPoint(Vector2Int.FloorToInt(pos));
                    }
                }
            }
        }
    }
    private void AddWater(List <VoronoiDiagram.GraphEdge> Edges)
    {
        foreach (var edge in Edges)
        {
            int biomeA, biomeB;

            GetBorderingBioms(edge, out biomeA, out biomeB);

            if (biomeA != biomeB && biomeA != 0 && biomeB != 0)
            {
                Vector2 begin = new Vector2((float)edge.x1, (float)edge.y1);
                Vector2 end   = new Vector2((float)edge.x2, (float)edge.y2);

                do
                {
                    SetRiverPoint(Vector2Int.FloorToInt(begin));

                    begin = Vector2.MoveTowards(begin, end, 1f);
                } while (begin != end);
            }
        }

        for (int x = 0; x < world.WorldAttributes.WorldSizeInBlocks; ++x)
        {
            for (int z = 0; z < world.WorldAttributes.WorldSizeInBlocks; ++z)
            {
                if (world.Bioms[x, z] == 0)
                {
                    AddWaterColumn(new Vector2Int(x, z), world.WorldAttributes.OceanHeight);
                }
                else
                {
                    Vector2Int pos = new Vector2Int(x, z);

                    float riverNoise = PerlinNoise.Get2DPerlin(world, pos, 1f, world.WorldAttributes.WorldScale);

                    if (0.54f < riverNoise && 0.55f > riverNoise)
                    {
                        SetRiverPoint(Vector2Int.FloorToInt(pos));
                    }
                }
            }
        }
    }
    private void AddTrees()
    {
        for (int x = 0; x < world.WorldAttributes.WorldSizeInBlocks; ++x)
        {
            for (int z = 0; z < world.WorldAttributes.WorldSizeInBlocks; ++z)
            {
                Vector2Int pos = new Vector2Int(x, z);

                if (PerlinNoise.Get2DPerlin(world, pos, 0, world.WorldAttributes.BiomeAttributes[world.Bioms[x, z]].TreeZoneScale)
                    > world.WorldAttributes.BiomeAttributes[world.Bioms[x, z]].TreeZoneThrashold)
                {
                    if (waterMap[x, z] == 0)
                    {
                        if (PerlinNoise.Get2DPerlin(world, pos, 0, world.WorldAttributes.BiomeAttributes[world.Bioms[x, z]].TreePlacementScale)
                            > world.WorldAttributes.BiomeAttributes[world.Bioms[x, z]].TreePlacementThrashold)
                        {
                            AddTree(pos);
                        }
                    }
                }
            }
        }
    }
    private int GetTerrainHeight(Vector2Int pos)
    {
        BiomeAttributes biome = world.WorldAttributes.BiomeAttributes[world.Bioms[pos.x, pos.y]];

        int terrainHeight = biome.SolidGroundHeight;

        for (int i = 0; i < biome.OctavesNumber; ++i)
        {
            terrainHeight += Mathf.FloorToInt((1 / Mathf.Pow(2, i)) * biome.BiomeHeight * PerlinNoise.Get2DPerlin(world, pos, i, biome.BiomeScale * Mathf.Pow(2, i)));
        }

        return(terrainHeight);
    }