public static List <ImprovedSpawnGroup> GetPlanetaryCargoShips(Vector3D playerCoords, List <string> eligibleNames, out Dictionary <string, List <string> > validFactions)
        {
            string specificGroup      = "";
            var    planetRestrictions = new List <string>(Settings.General.PlanetSpawnsDisableList.ToList());

            validFactions = new Dictionary <string, List <string> >();
            SpawnGroupSublists.Clear();
            EligibleSpawnsByModId.Clear();
            var environment = new EnvironmentEvaluation(playerCoords);

            if (environment.NearestPlanet != null && environment.IsOnPlanet)
            {
                if (planetRestrictions.Contains(environment.NearestPlanetName) == true)
                {
                    return(new List <ImprovedSpawnGroup>());
                }
            }

            bool specificSpawnRequest = false;

            if (SpawnGroupManager.AdminSpawnGroup != "")
            {
                specificGroup = SpawnGroupManager.AdminSpawnGroup;
                SpawnGroupManager.AdminSpawnGroup = "";
                specificSpawnRequest = true;
            }

            if (!environment.IsOnPlanet)
            {
                return(new List <ImprovedSpawnGroup>());
            }

            if (environment.NearestPlanet == null)
            {
                return(new List <ImprovedSpawnGroup>());
            }

            var eligibleGroups = new List <ImprovedSpawnGroup>();

            //Filter Eligible Groups To List
            foreach (var spawnGroup in SpawnGroupManager.SpawnGroups)
            {
                if (eligibleNames != null)
                {
                    if (!eligibleNames.Contains(spawnGroup.SpawnGroupName))
                    {
                        continue;
                    }
                }
                else
                {
                    if (specificGroup != "" && spawnGroup.SpawnGroup.Id.SubtypeName != specificGroup)
                    {
                        continue;
                    }

                    if (specificGroup == "" && spawnGroup.AdminSpawnOnly == true)
                    {
                        continue;
                    }
                }



                if (spawnGroup.AtmosphericCargoShip == false)
                {
                    continue;
                }

                if (SpawnResources.CheckCommonConditions(spawnGroup, playerCoords, environment, specificSpawnRequest) == false)
                {
                    continue;
                }

                var validFactionsList = SpawnResources.ValidNpcFactions(spawnGroup, playerCoords);

                if (validFactionsList.Count == 0)
                {
                    continue;
                }

                if (validFactions.ContainsKey(spawnGroup.SpawnGroupName) == false)
                {
                    validFactions.Add(spawnGroup.SpawnGroupName, validFactionsList);
                }

                if (spawnGroup.Frequency > 0)
                {
                    string modID = spawnGroup.SpawnGroup.Context.ModId;

                    if (string.IsNullOrEmpty(modID) == true)
                    {
                        modID = "KeenSWH";
                    }

                    if (SpawnGroupSublists.ContainsKey(modID) == false)
                    {
                        SpawnGroupSublists.Add(modID, new List <ImprovedSpawnGroup>());
                    }

                    if (EligibleSpawnsByModId.ContainsKey(modID) == false)
                    {
                        EligibleSpawnsByModId.Add(modID, 1);
                    }
                    else
                    {
                        EligibleSpawnsByModId[modID] += 1;
                    }

                    if (Settings.PlanetaryCargoShips.UseMaxSpawnGroupFrequency == true && spawnGroup.Frequency > Settings.PlanetaryCargoShips.MaxSpawnGroupFrequency * 10)
                    {
                        spawnGroup.Frequency = (int)Math.Round((double)Settings.PlanetaryCargoShips.MaxSpawnGroupFrequency * 10);
                    }

                    for (int i = 0; i < spawnGroup.Frequency; i++)
                    {
                        eligibleGroups.Add(spawnGroup);
                        SpawnGroupSublists[modID].Add(spawnGroup);
                    }
                }
            }

            return(eligibleGroups);
        }
Esempio n. 2
0
        public static List <ImprovedSpawnGroup> GetSpawnGroups(List <string> spawnGroups, Vector3D coords, string factionOverride, out Dictionary <string, List <string> > validFactions)
        {
            var planetRestrictions = new List <string>(Settings.General.PlanetSpawnsDisableList.ToList());

            validFactions = new Dictionary <string, List <string> >();
            var environment = new EnvironmentEvaluation(coords);

            if (environment.NearestPlanet != null)
            {
                if (planetRestrictions.Contains(environment.NearestPlanetName) && environment.IsOnPlanet)
                {
                    return(new List <ImprovedSpawnGroup>());
                }
            }

            var eligibleGroups = new List <ImprovedSpawnGroup>();

            //Filter Eligible Groups To List
            foreach (var spawnGroup in SpawnGroupManager.SpawnGroups)
            {
                if (!spawnGroups.Contains(spawnGroup.SpawnGroupName))
                {
                    continue;
                }

                if (spawnGroup.RivalAiAnySpawn == false && spawnGroup.RivalAiSpawn == false)
                {
                    if (environment.GravityAtPosition > 0 && spawnGroup.RivalAiSpaceSpawn)
                    {
                        continue;
                    }

                    if (environment.NearestPlanet != null)
                    {
                        if (spawnGroup.RivalAiAtmosphericSpawn == false || environment.NearestPlanet.HasAtmosphere == false || environment.AtmosphereAtPosition < 0.4f)
                        {
                            continue;
                        }
                    }
                }

                if (SpawnResources.CheckCommonConditions(spawnGroup, coords, environment, false) == false)
                {
                    continue;
                }

                var validFactionsList = SpawnResources.ValidNpcFactions(spawnGroup, coords, factionOverride);

                if (validFactionsList.Count == 0)
                {
                    continue;
                }

                if (validFactions.ContainsKey(spawnGroup.SpawnGroupName) == false)
                {
                    validFactions.Add(spawnGroup.SpawnGroupName, validFactionsList);
                }

                if (spawnGroup.Frequency > 0)
                {
                    if (Settings.SpaceCargoShips.UseMaxSpawnGroupFrequency == true && spawnGroup.Frequency > Settings.SpaceCargoShips.MaxSpawnGroupFrequency * 10)
                    {
                        spawnGroup.Frequency = (int)Math.Round((double)Settings.SpaceCargoShips.MaxSpawnGroupFrequency * 10);
                    }

                    for (int i = 0; i < spawnGroup.Frequency; i++)
                    {
                        eligibleGroups.Add(spawnGroup);
                    }
                }
            }

            return(eligibleGroups);
        }
        public static string EligibleSpawnGroupsAtPosition(Vector3D coords)
        {
            var sb            = new StringBuilder();
            var validFactions = new Dictionary <string, List <string> >();

            //Spawn Data Near Player
            var selectedSpawnGroup = new ImprovedSpawnGroup();

            SpawnResources.RefreshEntityLists();
            SpawnResources.LastThreatRefresh = SpawnResources.GameStartTime;
            var threatLevel = SpawnResources.GetThreatLevel(selectedSpawnGroup, coords);
            var pcuLevel    = SpawnResources.GetPCULevel(selectedSpawnGroup, coords);

            sb.Append("::: Spawn Data Near Player :::").AppendLine();
            sb.Append(" - Threat Score: ").Append(threatLevel.ToString()).AppendLine();
            sb.Append(" - PCU Score:    ").Append(pcuLevel.ToString()).AppendLine();

            sb.AppendLine();

            //Environment Data Near Player
            var environment = new EnvironmentEvaluation(coords);

            sb.Append("::: Environment Data Near Player :::").AppendLine();
            sb.Append(" - Distance From World Center:  ").Append(environment.DistanceFromWorldCenter.ToString()).AppendLine();
            sb.Append(" - Direction From World Center: ").Append(environment.DirectionFromWorldCenter.ToString()).AppendLine();
            sb.Append(" - Is On Planet:                ").Append(environment.IsOnPlanet.ToString()).AppendLine();
            sb.Append(" - Planet Name:                 ").Append(environment.IsOnPlanet ? environment.NearestPlanetName : "N/A").AppendLine();
            sb.Append(" - Planet Diameter:             ").Append(environment.IsOnPlanet ? environment.PlanetDiameter.ToString() : "N/A").AppendLine();
            sb.Append(" - Oxygen At Position:          ").Append(environment.IsOnPlanet ? environment.OxygenAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Atmosphere At Position:      ").Append(environment.IsOnPlanet ? environment.AtmosphereAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Gravity At Position:         ").Append(environment.IsOnPlanet ? environment.GravityAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Altitude At Position:        ").Append(environment.IsOnPlanet ? environment.AltitudeAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Is Night At Position:        ").Append(environment.IsOnPlanet ? environment.IsNight.ToString() : "N/A").AppendLine();
            sb.Append(" - Weather At Position:         ").Append(environment.IsOnPlanet && !string.IsNullOrWhiteSpace(environment.WeatherAtPosition) ? environment.WeatherAtPosition.ToString() : "N/A").AppendLine();
            sb.Append(" - Common Terrain At Position:  ").Append(environment.IsOnPlanet ? environment.CommonTerrainAtPosition.ToString() : "N/A").AppendLine();

            sb.AppendLine();

            //Space Cargo Ship
            sb.Append("::: Space / Lunar Cargo Ship Eligible Spawns :::").AppendLine();
            var spaceCargoList = SpaceCargoShipSpawner.GetSpaceCargoShips(coords, null, out validFactions);

            foreach (var sgroup in spaceCargoList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Random Encounter
            sb.Append("::: Random Encounter Eligible Spawns :::").AppendLine().AppendLine();
            var randEncounterList = RandomEncounterSpawner.GetRandomEncounters(coords, null, out validFactions);

            foreach (var sgroup in randEncounterList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Planetary Cargo Ship
            sb.Append("::: Planetary Cargo Ship Eligible Spawns :::").AppendLine().AppendLine();
            var planetCargoList = PlanetaryCargoShipSpawner.GetPlanetaryCargoShips(coords, null, out validFactions);

            foreach (var sgroup in planetCargoList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Planetary Installation
            sb.Append("::: Planetary Installation Eligible Spawns :::").AppendLine().AppendLine();
            var smallList         = new List <ImprovedSpawnGroup>();
            var mediumList        = new List <ImprovedSpawnGroup>();
            var largeList         = new List <ImprovedSpawnGroup>();
            var planetStationList = PlanetaryInstallationSpawner.GetPlanetaryInstallations(coords, null, out smallList, out mediumList, out largeList, out validFactions);

            foreach (var sgroup in planetStationList.Distinct().ToList())
            {
                sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
            }

            sb.AppendLine();

            //Boss Encounter
            sb.Append("::: Boss Encounter Eligible Spawns :::").AppendLine().AppendLine();

            var spawnCoords = Vector3D.Zero;

            if (BossEncounterSpawner.GetInitialSpawnCoords(coords, out spawnCoords) == true)
            {
                var bossList = BossEncounterSpawner.GetBossEncounters(coords, spawnCoords, null);

                foreach (var sgroup in bossList.Distinct().ToList())
                {
                    sb.Append(" - ").Append(sgroup.SpawnGroupName).AppendLine();
                }
            }

            return(sb.ToString());
        }
Esempio n. 4
0
        public static bool CheckCommonConditions(ImprovedSpawnGroup spawnGroup, Vector3D playerCoords, EnvironmentEvaluation environment, bool specificSpawnRequest)
        {
            if (spawnGroup.SpawnGroupEnabled == false)
            {
                if (spawnGroup.AdminSpawnOnly == false)
                {
                    Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Spawngroup Disabled");
                    return(false);
                }
            }

            if (spawnGroup.RandomNumberRoll > 1 && specificSpawnRequest == false)
            {
                var roll = rnd.Next(0, spawnGroup.RandomNumberRoll);

                if (roll != 0)
                {
                    Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Random Roll Failed");
                    return(false);
                }
            }

            if (SpawnGroupManager.ModRestrictionCheck(spawnGroup) == false)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Mod Restriction Check Failed");
                return(false);
            }

            if (SpawnGroupManager.IsSpawnGroupInBlacklist(spawnGroup.SpawnGroup.Id.SubtypeName) == true)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Spawngroup Blacklisted");
                return(false);
            }

            if (spawnGroup.UniqueEncounter == true && SpawnGroupManager.UniqueGroupsSpawned.Contains(spawnGroup.SpawnGroup.Id.SubtypeName) == true)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Unique Encounter Already Spawned");
                return(false);
            }

            if (SpawnGroupManager.DistanceFromCenterCheck(spawnGroup, environment) == false)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Distance From Center Check Failed");
                return(false);
            }

            if (SpawnGroupManager.DistanceFromSurfaceCheck(spawnGroup, environment) == false)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Distance From Surface Check Failed");
                return(false);
            }

            if (SpawnGroupManager.EnvironmentChecks(spawnGroup, environment) == false)
            {
                Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Environment Check Failed");
                return(false);
            }

            if (!string.IsNullOrWhiteSpace(environment.NearestPlanetName))
            {
                if (SpawnGroupManager.CheckSpawnGroupPlanetLists(spawnGroup, environment) == false)
                {
                    Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Planet Whitelist/Blacklist failed");
                    return(false);
                }
            }

            if (CheckSandboxVariables(spawnGroup.SandboxVariables, spawnGroup.FalseSandboxVariables) == false)
            {
                return(false);
            }

            if (spawnGroup.ModBlockExists.Count > 0)
            {
                foreach (var modID in spawnGroup.ModBlockExists)
                {
                    if (string.IsNullOrEmpty(modID) == true)
                    {
                        continue;
                    }

                    if (BlockDefinitionIdList.Contains(modID) == false)
                    {
                        return(false);
                    }
                }
            }

            if (spawnGroup.UseKnownPlayerLocations == true)
            {
                if (KnownPlayerLocationManager.IsPositionInKnownPlayerLocation(playerCoords, spawnGroup.KnownPlayerLocationMustMatchFaction, spawnGroup.FactionOwner) == false)
                {
                    return(false);
                }
            }

            if (TerritoryValidation(spawnGroup, playerCoords) == false)
            {
                return(false);
            }

            if (spawnGroup.RequiredPlayersOnline.Count > 0)
            {
                foreach (var playerSteamId in spawnGroup.RequiredPlayersOnline)
                {
                    if (playerSteamId == 0)
                    {
                        continue;
                    }

                    bool foundPlayer = false;

                    foreach (var player in MES_SessionCore.PlayerList)
                    {
                        if (player.SteamUserId == playerSteamId)
                        {
                            foundPlayer = true;
                            break;
                        }
                    }

                    if (foundPlayer == false)
                    {
                        return(false);
                    }
                }
            }

            if (spawnGroup.UsePlayerCountCheck == true)
            {
                int totalPlayers = 0;

                foreach (var player in MES_SessionCore.PlayerList)
                {
                    if (player.IsBot || player.Character == null)
                    {
                        continue;
                    }

                    if (Vector3D.Distance(playerCoords, player.GetPosition()) < spawnGroup.PlayerCountCheckRadius || spawnGroup.PlayerCountCheckRadius < 0)
                    {
                        totalPlayers++;
                    }
                }

                if (totalPlayers < spawnGroup.MinimumPlayers && spawnGroup.MinimumPlayers > 0)
                {
                    return(false);
                }

                if (totalPlayers > spawnGroup.MaximumPlayers && spawnGroup.MaximumPlayers > 0)
                {
                    return(false);
                }

                return(true);
            }

            if (spawnGroup.UsePCUCheck == true)
            {
                var pcuLevel = GetPCULevel(spawnGroup, playerCoords);

                if (pcuLevel < (float)spawnGroup.PCUMinimum && (float)spawnGroup.PCUMinimum > 0)
                {
                    return(false);
                }

                if (pcuLevel > (float)spawnGroup.PCUMaximum && (float)spawnGroup.PCUMaximum > 0)
                {
                    return(false);
                }
            }

            if (spawnGroup.UseThreatLevelCheck == true)
            {
                var threatLevel = GetThreatLevel(spawnGroup, playerCoords);
                threatLevel -= (float)Settings.General.ThreatReductionHandicap;

                if (threatLevel < (float)spawnGroup.ThreatScoreMinimum && (float)spawnGroup.ThreatScoreMinimum > 0)
                {
                    return(false);
                }

                if (threatLevel > (float)spawnGroup.ThreatScoreMaximum && (float)spawnGroup.ThreatScoreMaximum > 0)
                {
                    return(false);
                }
            }

            if (spawnGroup.UsePlayerCredits == true)
            {
                long          totalCredits         = 0;
                long          highestPlayerCredits = 0;
                List <string> CheckedFactions      = new List <string>();

                foreach (var player in MES_SessionCore.PlayerList)
                {
                    if (player.IsBot == true || player.Character == null)
                    {
                        continue;
                    }

                    if (Vector3D.Distance(player.GetPosition(), playerCoords) > spawnGroup.PlayerCreditsCheckRadius)
                    {
                        continue;
                    }

                    IMyFaction faction        = null;
                    long       factionBalance = 0;

                    if (spawnGroup.IncludeFactionBalance == true)
                    {
                        faction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(player.IdentityId);

                        if (faction != null)
                        {
                        }
                    }

                    long playerBalance = 0;
                    player.TryGetBalanceInfo(out playerBalance);

                    if (spawnGroup.IncludeAllPlayersInRadius == false)
                    {
                        if (factionBalance + playerBalance > totalCredits)
                        {
                            totalCredits = factionBalance + playerBalance;
                        }
                    }
                    else
                    {
                        if (faction != null)
                        {
                            if (CheckedFactions.Contains(faction.Tag) == false)
                            {
                                totalCredits += factionBalance;
                                CheckedFactions.Add(faction.Tag);
                            }

                            totalCredits += playerBalance;
                        }
                    }
                }

                if (totalCredits < spawnGroup.MinimumPlayerCredits && spawnGroup.MinimumPlayerCredits != -1)
                {
                    return(false);
                }

                if (totalCredits > spawnGroup.MaximumPlayerCredits && spawnGroup.MaximumPlayerCredits != -1)
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 5
0
        public static List <ImprovedSpawnGroup> GetBossEncounters(Vector3D playerCoords, Vector3D spawnCoords, List <string> eligibleNames)
        {
            bool   spaceSpawn         = false;
            bool   planetSpawn        = false;
            string specificGroup      = "";
            var    planetRestrictions = new List <string>(Settings.General.PlanetSpawnsDisableList.ToList());

            SpawnGroupSublists.Clear();
            EligibleSpawnsByModId.Clear();
            var environment = new EnvironmentEvaluation(playerCoords);

            if (environment.NearestPlanet != null)
            {
                if (planetRestrictions.Contains(environment.NearestPlanetName) && environment.IsOnPlanet)
                {
                    return(new List <ImprovedSpawnGroup>());
                }
            }

            bool specificSpawnRequest = false;

            if (SpawnGroupManager.AdminSpawnGroup != "")
            {
                specificGroup = SpawnGroupManager.AdminSpawnGroup;
                SpawnGroupManager.AdminSpawnGroup = "";
                specificSpawnRequest = true;
            }

            if (environment.IsOnPlanet)
            {
                if (environment.AtmosphereAtPosition > Settings.BossEncounters.MinAirDensity)
                {
                    planetSpawn = true;
                }
            }
            else
            {
                spaceSpawn = true;
            }

            var eligibleGroups = new List <ImprovedSpawnGroup>();

            //Filter Eligible Groups To List
            foreach (var spawnGroup in SpawnGroupManager.SpawnGroups)
            {
                if (eligibleNames != null)
                {
                    if (!eligibleNames.Contains(spawnGroup.SpawnGroupName))
                    {
                        continue;
                    }
                }
                else
                {
                    if (specificGroup != "" && spawnGroup.SpawnGroup.Id.SubtypeName != specificGroup)
                    {
                        continue;
                    }

                    if (specificGroup == "" && spawnGroup.AdminSpawnOnly == true)
                    {
                        continue;
                    }
                }

                bool eligibleGroup = false;

                if (spawnGroup.BossEncounterSpace == true && spaceSpawn == true)
                {
                    eligibleGroup = true;
                }

                if (spawnGroup.BossEncounterAtmo == true && planetSpawn == true)
                {
                    eligibleGroup = true;
                }

                if (spawnGroup.BossEncounterAny == true)
                {
                    eligibleGroup = true;
                }

                if (eligibleGroup == false)
                {
                    continue;
                }

                if (SpawnResources.CheckCommonConditions(spawnGroup, playerCoords, environment, specificSpawnRequest) == false)
                {
                    continue;
                }

                if (spawnGroup.Frequency > 0)
                {
                    string modID = spawnGroup.SpawnGroup.Context.ModId;

                    if (string.IsNullOrEmpty(modID) == true)
                    {
                        modID = "KeenSWH";
                    }

                    if (SpawnGroupSublists.ContainsKey(modID) == false)
                    {
                        SpawnGroupSublists.Add(modID, new List <ImprovedSpawnGroup>());
                    }

                    if (EligibleSpawnsByModId.ContainsKey(modID) == false)
                    {
                        EligibleSpawnsByModId.Add(modID, 1);
                    }
                    else
                    {
                        EligibleSpawnsByModId[modID] += 1;
                    }

                    if (Settings.BossEncounters.UseMaxSpawnGroupFrequency == true && spawnGroup.Frequency > Settings.BossEncounters.MaxSpawnGroupFrequency * 10)
                    {
                        spawnGroup.Frequency = (int)Math.Round((double)Settings.BossEncounters.MaxSpawnGroupFrequency * 10);
                    }

                    for (int i = 0; i < spawnGroup.Frequency; i++)
                    {
                        eligibleGroups.Add(spawnGroup);
                        SpawnGroupSublists[modID].Add(spawnGroup);
                    }
                }
            }

            return(eligibleGroups);
        }
Esempio n. 6
0
        public static List <ImprovedSpawnGroup> GetSpaceCargoShips(Vector3D playerCoords, List <string> eligibleNames, out Dictionary <string, List <string> > validFactions)
        {
            bool   allowLunar         = false;
            string specificGroup      = "";
            var    planetRestrictions = new List <string>(Settings.General.PlanetSpawnsDisableList.ToList());

            validFactions = new Dictionary <string, List <string> >();
            SpawnGroupSublists.Clear();
            EligibleSpawnsByModId.Clear();
            var environment = new EnvironmentEvaluation(playerCoords);

            if (environment.NearestPlanet != null)
            {
                if (planetRestrictions.Contains(environment.NearestPlanetName) && environment.IsOnPlanet)
                {
                    Logger.SpawnGroupDebug(Logger.DebugSpawnGroup, "Restricted Planet, No Spawns Allowed");
                    return(new List <ImprovedSpawnGroup>());
                }
            }

            bool specificSpawnRequest = false;

            if (SpawnGroupManager.AdminSpawnGroup != "")
            {
                specificGroup = SpawnGroupManager.AdminSpawnGroup;
                SpawnGroupManager.AdminSpawnGroup = "";
                specificSpawnRequest = true;
            }

            if (environment.IsOnPlanet)
            {
                if (SpawnResources.LunarSpawnEligible(playerCoords) == true)
                {
                    allowLunar = true;
                }
                else
                {
                    Logger.SpawnGroupDebug("[No Spawn Group]", "On Planet and Cannot Spawn As Lunar, No Spawns Allowed");
                    return(new List <ImprovedSpawnGroup>());
                }
            }

            var eligibleGroups = new List <ImprovedSpawnGroup>();

            //Filter Eligible Groups To List
            foreach (var spawnGroup in SpawnGroupManager.SpawnGroups)
            {
                if (eligibleNames != null)
                {
                    if (!eligibleNames.Contains(spawnGroup.SpawnGroupName))
                    {
                        Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Was not included in Groups From API Request");
                        continue;
                    }
                }
                else
                {
                    if (specificGroup != "" && spawnGroup.SpawnGroup.Id.SubtypeName != specificGroup)
                    {
                        Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Doesn't Match Admin Spawn");
                        continue;
                    }

                    if (specificGroup == "" && spawnGroup.AdminSpawnOnly == true)
                    {
                        Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Only Admin Spawn Allowed");
                        continue;
                    }
                }

                if (spawnGroup.SpaceCargoShip == false)
                {
                    if (allowLunar == true)
                    {
                        if (spawnGroup.LunarCargoShip == false)
                        {
                            Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Is Not Space Cargo Ship Or Lunar");
                            continue;
                        }
                    }
                    else
                    {
                        Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Is Not Space Cargo Ship");
                        continue;
                    }
                }

                if (SpawnResources.CheckCommonConditions(spawnGroup, playerCoords, environment, specificSpawnRequest) == false)
                {
                    Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "Common Conditions Failed");
                    continue;
                }

                var validFactionsList = SpawnResources.ValidNpcFactions(spawnGroup, playerCoords);

                if (validFactionsList.Count == 0)
                {
                    Logger.SpawnGroupDebug(spawnGroup.SpawnGroup.Id.SubtypeName, "No Valid Faction");
                    continue;
                }

                if (validFactions.ContainsKey(spawnGroup.SpawnGroupName) == false)
                {
                    validFactions.Add(spawnGroup.SpawnGroupName, validFactionsList);
                }

                if (spawnGroup.Frequency > 0)
                {
                    string modID = spawnGroup.SpawnGroup.Context.ModId;

                    if (string.IsNullOrEmpty(modID) == true)
                    {
                        modID = "KeenSWH";
                    }

                    if (SpawnGroupSublists.ContainsKey(modID) == false)
                    {
                        SpawnGroupSublists.Add(modID, new List <ImprovedSpawnGroup>());
                    }

                    if (EligibleSpawnsByModId.ContainsKey(modID) == false)
                    {
                        EligibleSpawnsByModId.Add(modID, 1);
                    }
                    else
                    {
                        EligibleSpawnsByModId[modID] += 1;
                    }

                    if (Settings.SpaceCargoShips.UseMaxSpawnGroupFrequency == true && spawnGroup.Frequency > Settings.SpaceCargoShips.MaxSpawnGroupFrequency * 10)
                    {
                        spawnGroup.Frequency = (int)Math.Round((double)Settings.SpaceCargoShips.MaxSpawnGroupFrequency * 10);
                    }

                    for (int i = 0; i < spawnGroup.Frequency; i++)
                    {
                        eligibleGroups.Add(spawnGroup);
                        SpawnGroupSublists[modID].Add(spawnGroup);
                    }
                }
            }

            return(eligibleGroups);
        }