public static void CreateVegetation(TerrainData terrain, Random random, int vegetationLimit)
{
var grassMaterials = Materials.GetMaterials(MaterialCategory.Grass).ToArray();
var woodMaterials = Materials.GetMaterials(MaterialCategory.Wood).ToArray();
var berryMaterials = Materials.GetMaterials(MaterialCategory.Berry).ToArray();
int baseSeed = random.Next();
if (baseSeed == 0)
{
baseSeed = 1;
}
terrain.Size.Plane.Range().AsParallel().ForAll(p2d =>
{
int z = terrain.GetSurfaceLevel(p2d);
var p = new IntVector3(p2d, z);
if (z >= vegetationLimit)
{
return;
}
var td = terrain.GetTileData(p);
if (td.WaterLevel > 0)
{
return;
}
if (terrain.GetMaterial(p.Down).Category != MaterialCategory.Soil)
{
return;
}
var r = new MWCRandom(p, baseSeed);
int v = r.Next(100);
if (v >= 95)
{
td.ID = TileID.Sapling;
td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID;
}
else if (v >= 90)
{
td.ID = TileID.Tree;
td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID;
}
else if (v >= 80)
{
td.ID = TileID.Shrub;
td.MaterialID = berryMaterials[r.Next(berryMaterials.Length)].ID;
}
else
{
td.ID = TileID.Grass;
td.MaterialID = grassMaterials[r.Next(grassMaterials.Length)].ID;
}
terrain.SetTileDataNoHeight(p, td);
});
}