コード例 #1
0
ファイル: BatchEntitySpawner.cs プロジェクト: DanX100/Nitrox
        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);
        }
コード例 #2
0
ファイル: EntitySpawner.cs プロジェクト: m1ksu/Nitrox
        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);
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
                    }
                }
            }
        }
コード例 #6
0
        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);
                    }
                }
            }
        }