public List <Entity> LoadUnspawnedEntities(Int3 batchId) { lock (parsedBatches) { if (parsedBatches.Contains(batchId)) { return(new List <Entity>()); } parsedBatches.Add(batchId); } Log.Debug("Batch {0} not parsed yet; parsing...", batchId); List <Entity> entities = new List <Entity>(); foreach (EntitySpawnPoint esp in batchCellsParser.ParseBatchData(batchId)) { if (esp.Density > 0) { DstData dstData; if (lootDistributionData.GetBiomeLoot(esp.BiomeType, out dstData)) { entities.AddRange(SpawnEntitiesUsingRandomDistribution(esp, dstData)); } else if (esp.ClassId != null) { entities.AddRange(SpawnEntitiesStaticly(esp)); } } } return(entities); }
private IEnumerable <Entity> SpawnEntities(EntitySpawnPoint entitySpawnPoint) { DstData dstData; if (!lootDistributionData.GetBiomeLoot(entitySpawnPoint.BiomeType, out dstData)) { yield break; } float rollingProbabilityDensity = 0; PrefabData selectedPrefab = null; foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbabilityDensity += probabilityDensity; } double randomNumber = random.NextDouble(); double rollingProbability = 0; if (rollingProbabilityDensity > 0) { if (rollingProbabilityDensity > 1f) { randomNumber *= rollingProbabilityDensity; } foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbability += probabilityDensity; // This is pretty hacky, it rerolls until its hits a prefab of a correct type // What should happen is that we check wei first, then grab data from there bool isValidSpawn = IsValidSpawnType(prefab.classId, entitySpawnPoint.CanSpawnCreature); if (rollingProbability >= randomNumber && isValidSpawn) { selectedPrefab = prefab; break; } } } WorldEntityInfo worldEntityInfo; if (!ReferenceEquals(selectedPrefab, null) && worldEntitiesByClassId.TryGetValue(selectedPrefab.classId, out worldEntityInfo)) { for (int i = 0; i < selectedPrefab.count; i++) { Entity spawnedEntity = new Entity(entitySpawnPoint.Position, entitySpawnPoint.Rotation, worldEntityInfo.techType, Guid.NewGuid().ToString(), (int)worldEntityInfo.cellLevel); yield return(spawnedEntity); } } }
public List <Entity> LoadUnspawnedEntities(Int3 batchId) { lock (parsedBatches) { if (parsedBatches.Contains(batchId)) { return(new List <Entity>()); } parsedBatches.Add(batchId); } DeterministicBatchGenerator deterministicBatchGenerator = new DeterministicBatchGenerator(batchId); List <Entity> entities = new List <Entity>(); List <EntitySpawnPoint> spawnPoints = batchCellsParser.ParseBatchData(batchId); foreach (EntitySpawnPoint esp in spawnPoints) { if (esp.Density > 0) { DstData dstData; if (lootDistributionData.GetBiomeLoot(esp.BiomeType, out dstData)) { entities.AddRange(SpawnEntitiesUsingRandomDistribution(esp, dstData, deterministicBatchGenerator)); } else if (esp.ClassId != null) { entities.AddRange(SpawnEntitiesStaticly(esp, deterministicBatchGenerator)); } } } if (entities.Count == 0) { lock (emptyBatches) { emptyBatches.Add(batchId); } } else { Log.Info("Spawning " + entities.Count + " entities from " + spawnPoints.Count + " spawn points in batch " + batchId); } return(entities); }
public override List <UwePrefab> GetPossiblePrefabs(string biome) { List <UwePrefab> prefabs = new List <UwePrefab>(); if (biome == null) { return(prefabs); } BiomeType biomeType = (BiomeType)Enum.Parse(typeof(BiomeType), biome); if (lootDistributionData.GetBiomeLoot(biomeType, out DstData dstData)) { foreach (PrefabData prefabData in dstData.prefabs) { UwePrefab prefab = new UwePrefab(prefabData.classId, prefabData.probability, prefabData.count); prefabs.Add(prefab); } } return(prefabs); }
private void SpawnEntities() { Log.Info("Spawning entities..."); entitiesByAbsoluteCell = new Dictionary <AbsoluteEntityCell, List <Entity> >(); Random random = new Random(); foreach (EntitySpawnPoint entitySpawnPoint in entitySpawnPoints) { DstData dstData; if (!lootDistributionData.GetBiomeLoot(entitySpawnPoint.BiomeType, out dstData)) { continue; } float rollingProbabilityDensity = 0; PrefabData selectedPrefab = null; foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbabilityDensity += probabilityDensity; } double randomNumber = random.NextDouble(); double rollingProbability = 0; if (rollingProbabilityDensity > 0) { if (rollingProbabilityDensity > 1f) { randomNumber *= rollingProbabilityDensity; } foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbability += probabilityDensity; if (rollingProbability >= randomNumber) { selectedPrefab = prefab; break; } } } if (!ReferenceEquals(selectedPrefab, null) && worldEntitiesByClassId.ContainsKey(selectedPrefab.classId)) { WorldEntityInfo worldEntityInfo = worldEntitiesByClassId[selectedPrefab.classId]; for (int i = 0; i < selectedPrefab.count; i++) { Entity spawnedEntity = new Entity(entitySpawnPoint.Position, worldEntityInfo.techType, Guid.NewGuid().ToString(), (int)worldEntityInfo.cellLevel); AbsoluteEntityCell absoluteCellId = new AbsoluteEntityCell(entitySpawnPoint.BatchId, entitySpawnPoint.CellId); if (!entitiesByAbsoluteCell.ContainsKey(absoluteCellId)) { entitiesByAbsoluteCell[absoluteCellId] = new List <Entity>(); } entitiesByAbsoluteCell[absoluteCellId].Add(spawnedEntity); } } } }
private void SpawnEntities() { Log.Info("Spawning entities..."); entitiesByAbsoluteCell = new Dictionary <AbsoluteEntityCell, List <Entity> >(); Random random = new Random(); foreach (EntitySpawnPoint entitySpawnPoint in entitySpawnPoints) { DstData dstData; if (!lootDistributionData.GetBiomeLoot(entitySpawnPoint.BiomeType, out dstData)) { continue; } float rollingProbabilityDensity = 0; PrefabData selectedPrefab = null; foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbabilityDensity += probabilityDensity; } double randomNumber = random.NextDouble(); double rollingProbability = 0; if (rollingProbabilityDensity > 0) { if (rollingProbabilityDensity > 1f) { randomNumber *= rollingProbabilityDensity; } foreach (PrefabData prefab in dstData.prefabs) { float probabilityDensity = prefab.probability / entitySpawnPoint.Density; rollingProbability += probabilityDensity; //This is pretty hacky, it rerolls until its hits a prefab of a correct type //What should happen is that we check wei first, then grab data from there bool isValidSpawn = IsValidSpawnType(prefab.classId, entitySpawnPoint.CanSpawnCreature); if (rollingProbability >= randomNumber && isValidSpawn) { selectedPrefab = prefab; break; } } } if (!ReferenceEquals(selectedPrefab, null) && worldEntitiesByClassId.ContainsKey(selectedPrefab.classId)) { WorldEntityInfo worldEntityInfo = worldEntitiesByClassId[selectedPrefab.classId]; for (int i = 0; i < selectedPrefab.count; i++) { Entity spawnedEntity = new Entity(entitySpawnPoint.Position, entitySpawnPoint.Rotation, worldEntityInfo.techType, Guid.NewGuid().ToString(), (int)worldEntityInfo.cellLevel); AbsoluteEntityCell absoluteCellId = new AbsoluteEntityCell(entitySpawnPoint.BatchId, entitySpawnPoint.CellId); if (!entitiesByAbsoluteCell.ContainsKey(absoluteCellId)) { entitiesByAbsoluteCell[absoluteCellId] = new List <Entity>(); } entitiesByAbsoluteCell[absoluteCellId].Add(spawnedEntity); } } } }