using System.Text.Json.Serialization; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Eft.Common; namespace SPTarkov.Server.Core.Models.Spt.Config; public record LocationConfig : BaseConfig { [JsonPropertyName("kind")] public override string Kind { get; set; } = "spt-location"; /// /// Rogues are classified as bosses and spawn immediately, this can result in no scavs spawning, delay rogues spawning to allow scavs to spawn first /// [JsonPropertyName("rogueLighthouseSpawnTimeSettings")] public required RogueLighthouseSpawnTimeSettings RogueLighthouseSpawnTimeSettings { get; set; } [JsonPropertyName("looseLootMultiplier")] public required Dictionary LooseLootMultiplier { get; set; } [JsonPropertyName("staticLootMultiplier")] public required Dictionary StaticLootMultiplier { get; set; } /// /// Custom bot waves to add to a locations base json on game start if addCustomBotWavesToMaps is true /// [JsonPropertyName("customWaves")] public CustomWaves? CustomWaves { get; set; } /// /// Open zones to add to map /// [JsonPropertyName("openZones")] public required Dictionary> OpenZones { get; set; } /// /// Key = map id, value = dict of item tpls that should only have x forced loot spawn position /// [JsonPropertyName("lootMaxSpawnLimits")] public required Dictionary> LootMaxSpawnLimits { get; set; } /// /// How many attempts should be taken to fit an item into a container before giving up /// [JsonPropertyName("fitLootIntoContainerAttempts")] public int FitLootIntoContainerAttempts { get; set; } /// /// Add all possible zones to each maps `OpenZones` property /// [JsonPropertyName("addOpenZonesToAllMaps")] public bool AddOpenZonesToAllMaps { get; set; } /// /// Allow addition of custom bot waves designed by SPT to be added to maps - defined in configs/location.json.customWaves /// [JsonPropertyName("addCustomBotWavesToMaps")] public bool AddCustomBotWavesToMaps { get; set; } /// /// Should the limits defined inside botTypeLimits to be applied to locations on game start /// [JsonPropertyName("enableBotTypeLimits")] public bool EnableBotTypeLimits { get; set; } /// /// Add limits to a locations base.MinMaxBots array if enableBotTypeLimits is true /// [JsonPropertyName("botTypeLimits")] public required Dictionary> BotTypeLimits { get; set; } /// /// Container randomisation settings /// [JsonPropertyName("containerRandomisationSettings")] public required ContainerRandomisationSettings ContainerRandomisationSettings { get; set; } /// /// How full must a random loose magazine be % /// [JsonPropertyName("minFillLooseMagazinePercent")] public int MinFillLooseMagazinePercent { get; set; } /// /// How full must a random static magazine be % /// [JsonPropertyName("minFillStaticMagazinePercent")] public int MinFillStaticMagazinePercent { get; set; } [JsonPropertyName("allowDuplicateItemsInStaticContainers")] public bool AllowDuplicateItemsInStaticContainers { get; set; } /// /// Chance loose magazines have ammo in them TODO - rename to dynamicMagazineLootHasAmmoChancePercent /// [JsonPropertyName("magazineLootHasAmmoChancePercent")] public int MagazineLootHasAmmoChancePercent { get; set; } /// /// Chance static magazines have ammo in them /// [JsonPropertyName("staticMagazineLootHasAmmoChancePercent")] public int StaticMagazineLootHasAmmoChancePercent { get; set; } /// /// Key: map, value: loose loot ids to ignore /// [JsonPropertyName("looseLootBlacklist")] public required Dictionary> LooseLootBlacklist { get; set; } /// /// Key: map, value: settings to control how long scav raids are /// [JsonPropertyName("scavRaidTimeSettings")] public required ScavRaidTimeSettings ScavRaidTimeSettings { get; set; } /// /// Settings to adjust mods for lootable equipment in raid /// [JsonPropertyName("equipmentLootSettings")] public required EquipmentLootSettings EquipmentLootSettings { get; set; } /// /// Min percentage to set raider spawns at, -1 makes no changes /// [JsonPropertyName("reserveRaiderSpawnChanceOverrides")] public required ReserveRaiderSpawnChanceOverrides ReserveRaiderSpawnChanceOverrides { get; set; } /// /// Containers to remove all children from when generating static/loose loot /// [JsonPropertyName("tplsToStripChildItemsFrom")] public required HashSet TplsToStripChildItemsFrom { get; set; } /// /// Map ids players cannot visit /// [JsonPropertyName("nonMaps")] public required HashSet NonMaps { get; set; } [JsonPropertyName("transitSettings")] public TransitSettings? TransitSettings { get; set; } } public record TransitSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("effectsToRemove")] public HashSet? EffectsToRemove { get; set; } [JsonPropertyName("adjustLimbHealthPoints")] public bool? AdjustLimbHealthPoints { get; set; } [JsonPropertyName("limbHealPercent")] public int? LimbHealPercent { get; set; } } public record ReserveRaiderSpawnChanceOverrides { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("nonTriggered")] public int NonTriggered { get; set; } [JsonPropertyName("triggered")] public int Triggered { get; set; } } public record EquipmentLootSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } /// /// Percentage chance item will be added to equipment /// [JsonPropertyName("modSpawnChancePercent")] public required Dictionary ModSpawnChancePercent { get; set; } } public record RogueLighthouseSpawnTimeSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("enabled")] public bool Enabled { get; set; } [JsonPropertyName("waitTimeSeconds")] public int WaitTimeSeconds { get; set; } } public record CustomWaves { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } /// /// Bosses spawn on raid start /// [JsonPropertyName("boss")] public Dictionary> Boss { get; set; } = []; [JsonPropertyName("normal")] public Dictionary> Normal { get; set; } = []; } public record BotTypeLimit : MinMax { [JsonPropertyName("type")] public new required string Type { get; set; } } public record ContainerRandomisationSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("enabled")] public bool Enabled { get; set; } /// /// What maps can use the container randomisation feature /// [JsonPropertyName("maps")] public required Dictionary Maps { get; set; } /// /// Some container types don't work when randomised /// [JsonPropertyName("containerTypesToNotRandomise")] public required HashSet ContainerTypesToNotRandomise { get; set; } [JsonPropertyName("containerGroupMinSizeMultiplier")] public double ContainerGroupMinSizeMultiplier { get; set; } [JsonPropertyName("containerGroupMaxSizeMultiplier")] public double ContainerGroupMaxSizeMultiplier { get; set; } } public record ScavRaidTimeSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("settings")] public required ScavRaidTimeConfigSettings Settings { get; set; } [JsonPropertyName("maps")] public required Dictionary Maps { get; set; } } public record ScavRaidTimeConfigSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } [JsonPropertyName("trainArrivalDelayObservedSeconds")] public int TrainArrivalDelayObservedSeconds { get; set; } } public record ScavRaidTimeLocationSettings { [JsonExtensionData] public Dictionary? ExtensionData { get; set; } /// /// Should loot be reduced by same percent length of raid is reduced by /// [JsonPropertyName("reduceLootByPercent")] public bool ReduceLootByPercent { get; set; } /// /// Smallest % of container loot that should be spawned /// [JsonPropertyName("minStaticLootPercent")] public double MinStaticLootPercent { get; set; } /// /// Smallest % of loose loot that should be spawned /// [JsonPropertyName("minDynamicLootPercent")] public double MinDynamicLootPercent { get; set; } /// /// Chance raid time is reduced /// [JsonPropertyName("reducedChancePercent")] public double ReducedChancePercent { get; set; } /// /// How much should raid time be reduced - weighted /// [JsonPropertyName("reductionPercentWeights")] public Dictionary ReductionPercentWeights { get; set; } = []; /// /// Should bot waves be removed / spawn times be adjusted /// [JsonPropertyName("adjustWaves")] public bool AdjustWaves { get; set; } }