private static async Task GenerateFloraAsync(World world, Vector pos, DecoratorFeatures features, TerrainNoise noise) { foreach (var(flora, index) in features.Flora.Select((value, i) => (value, i))) { if (flora.Frequency == 0) { continue; } var floraInstance = Activator.CreateInstance(flora.FloraType, world) as BaseFlora; if (floraInstance is null) { continue; } var noiseVal = noise.Decoration(pos.X, -33 + (index * 22), pos.Z); var freq = flora.Frequency / 200.0; bool isFlora = noiseVal > 0.9 && noiseVal <= freq + 0.9; if (!isFlora) { continue; } await floraInstance.GenerateFloraAsync(pos, noise.settings.Seed, flora.Radius, flora.Density); } }
private static void GenerateTrees(World world, Vector pos, DecoratorFeatures features, TerrainNoise noise) { foreach (var(tree, index) in features.Trees.Select((value, i) => (value, i))) { if (tree.Frequency == 0) { continue; } var treeInstance = Activator.CreateInstance(tree.TreeType, world) as BaseTree; // Use a different noisemap for each tree type by setting another Y value. var noiseVal = noise.Decoration(pos.X, -45 + (index * 10), pos.Z); var freq = tree.Frequency / 100.0; bool isTree = noiseVal > 0.8 && noiseVal <= freq + 0.8; if (!isTree) { continue; } int heightVariance = (int)(((noiseVal - 0.8) * 100) - (freq / 2)); GrowTree(pos, treeInstance, heightVariance); } }