using System.Text.Json.Serialization; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Eft.Hideout; namespace SPTarkov.Server.Core.Models.Spt.Config; public record HideoutConfig : BaseConfig { [JsonPropertyName("kind")] public override string Kind { get; set; } = "spt-hideout"; /// /// How many seconds should pass before hideout crafts / fuel usage is checked and processed /// [JsonPropertyName("runIntervalSeconds")] public int RunIntervalSeconds { get; set; } /// /// Default values used to hydrate `RunIntervalSeconds` with /// [JsonPropertyName("runIntervalValues")] public required RunIntervalValues RunIntervalValues { get; set; } [JsonPropertyName("hoursForSkillCrafting")] public int HoursForSkillCrafting { get; set; } [JsonPropertyName("expCraftAmount")] public int ExpCraftAmount { get; set; } [JsonPropertyName("overrideCraftTimeSeconds")] public int OverrideCraftTimeSeconds { get; set; } [JsonPropertyName("overrideBuildTimeSeconds")] public int OverrideBuildTimeSeconds { get; set; } /// /// Only process a profile's hideout crafts when it has been active in the last x minutes /// [JsonPropertyName("updateProfileHideoutWhenActiveWithinMinutes")] public int UpdateProfileHideoutWhenActiveWithinMinutes { get; set; } [JsonPropertyName("cultistCircle")] public required CultistCircleSettings CultistCircle { get; set; } [JsonPropertyName("hideoutCraftsToAdd")] public required List HideoutCraftsToAdd { get; set; } } public record HideoutCraftToAdd { /// /// The new mongoId for the craft to use /// [JsonPropertyName("newId")] public required string NewId { get; set; } [JsonPropertyName("requirements")] public required List Requirements { get; set; } [JsonPropertyName("craftIdToCopy")] public required string CraftIdToCopy { get; set; } [JsonPropertyName("craftOutputTpl")] public required string CraftOutputTpl { get; set; } } public record CultistCircleSettings { [JsonPropertyName("maxRewardItemCount")] public int MaxRewardItemCount { get; set; } [JsonPropertyName("maxAttemptsToPickRewardsWithinBudget")] public int MaxAttemptsToPickRewardsWithinBudget { get; set; } [JsonPropertyName("rewardPriceMultiplerMinMax")] public required MinMax RewardPriceMultiplierMinMax { get; set; } /// /// The odds that meeting the highest threshold gives you a bonus to crafting time /// [JsonPropertyName("bonusAmountMultiplier")] public double BonusAmountMultiplier { get; set; } [JsonPropertyName("bonusChanceMultiplier")] public double BonusChanceMultiplier { get; set; } /// /// What is considered a "high-value" item /// [JsonPropertyName("highValueThresholdRub")] public int HighValueThresholdRub { get; set; } /// /// Hideout/task reward crafts have a unique craft time /// [JsonPropertyName("hideoutTaskRewardTimeSeconds")] public int HideoutTaskRewardTimeSeconds { get; set; } /// /// Rouble amount player needs to sacrifice to get chance of hideout/task rewards /// [JsonPropertyName("hideoutCraftSacrificeThresholdRub")] public int HideoutCraftSacrificeThresholdRub { get; set; } [JsonPropertyName("craftTimeThreshholds")] public required List CraftTimeThreshholds { get; set; } /// /// -1 means no override, value in seconds /// [JsonPropertyName("craftTimeOverride")] public int CraftTimeOverride { get; set; } /// /// Specific reward pool when player sacrifices specific item(s) /// [JsonPropertyName("directRewards")] public required List DirectRewards { get; set; } /// /// Overrides for reward stack sizes, keyed by item tpl /// [JsonPropertyName("directRewardStackSize")] public required Dictionary> DirectRewardStackSize { get; set; } /// /// Item tpls to exclude from the reward pool /// [JsonPropertyName("rewardItemBlacklist")] public required List RewardItemBlacklist { get; set; } /// /// Item tpls to include in the reward pool /// [JsonPropertyName("additionalRewardItemPool")] public required List AdditionalRewardItemPool { get; set; } [JsonPropertyName("currencyRewards")] public required Dictionary> CurrencyRewards { get; set; } } public record CraftTimeThreshold : MinMax { [JsonPropertyName("craftTimeSeconds")] public int CraftTimeSeconds { get; set; } } public record DirectRewardSettings { [JsonPropertyName("reward")] public required List Reward { get; set; } [JsonPropertyName("requiredItems")] public required List RequiredItems { get; set; } [JsonPropertyName("craftTimeSeconds")] public required int CraftTimeSeconds { get; set; } /// /// Is the reward a one time reward or can it be given multiple times /// [JsonPropertyName("repeatable")] public required bool Repeatable { get; set; } }