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); }
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()); }
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); }
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); }
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); }