private IEnumerable <Entity> SpawnEntitiesUsingRandomDistribution(EntitySpawnPoint entitySpawnPoint, List <UwePrefab> prefabs, DeterministicBatchGenerator deterministicBatchGenerator) { List <UwePrefab> allowedPrefabs = FilterAllowedPrefabs(prefabs, entitySpawnPoint); float rollingProbabilityDensity = allowedPrefabs.Sum(prefab => prefab.Probability / entitySpawnPoint.Density); if (rollingProbabilityDensity <= 0) { yield break; } double randomNumber = deterministicBatchGenerator.NextDouble(); if (rollingProbabilityDensity > 1f) { randomNumber *= rollingProbabilityDensity; } double rollingProbability = 0; UwePrefab selectedPrefab = allowedPrefabs.FirstOrDefault(prefab => { if (prefab.Probability == 0) { return(false); } float probabilityDensity = prefab.Probability / entitySpawnPoint.Density; rollingProbability += probabilityDensity; return(rollingProbability >= randomNumber); }); if (selectedPrefab == null) { yield break; } Optional <UweWorldEntity> opWorldEntity = worldEntityFactory.From(selectedPrefab.ClassId); if (opWorldEntity.IsPresent()) { UweWorldEntity uweWorldEntity = opWorldEntity.Get(); for (int i = 0; i < selectedPrefab.Count; i++) { IEnumerable <Entity> entities = CreateEntityWithChildren(entitySpawnPoint, uweWorldEntity.Scale, uweWorldEntity.TechType, uweWorldEntity.CellLevel, selectedPrefab.ClassId, deterministicBatchGenerator); foreach (Entity entity in entities) { yield return(entity); } } } }
private IEnumerable <Entity> SpawnEntitiesUsingRandomDistribution(EntitySpawnPoint entitySpawnPoint, DstData dstData, DeterministicBatchGenerator deterministicBatchGenerator) { List <PrefabData> allowedPrefabs = filterAllowedPrefabs(dstData.prefabs, entitySpawnPoint); float rollingProbabilityDensity = allowedPrefabs.Sum(prefab => prefab.probability / entitySpawnPoint.Density); if (rollingProbabilityDensity <= 0) { yield break; } double randomNumber = deterministicBatchGenerator.NextDouble(); if (rollingProbabilityDensity > 1f) { randomNumber *= rollingProbabilityDensity; } double rollingProbability = 0; PrefabData selectedPrefab = allowedPrefabs.FirstOrDefault(prefab => { if (prefab.probability == 0) { return(false); } float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbability += probabilityDensity; return(rollingProbability >= randomNumber); }); WorldEntityInfo worldEntityInfo; if (!ReferenceEquals(selectedPrefab, null) && worldEntitiesByClassId.TryGetValue(selectedPrefab.classId, out worldEntityInfo)) { for (int i = 0; i < selectedPrefab.count; i++) { IEnumerable <Entity> entities = CreateEntityWithChildren(entitySpawnPoint, worldEntityInfo.localScale, worldEntityInfo.techType, worldEntityInfo.cellLevel, selectedPrefab.classId, deterministicBatchGenerator); foreach (Entity entity in entities) { yield return(entity); } } } }