using System.Text.Json.Serialization; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Spt.Services; namespace SPTarkov.Server.Core.Models.Spt.Config; public record TraderConfig : BaseConfig { [JsonPropertyName("kind")] public override string Kind { get; set; } = "spt-trader"; [JsonPropertyName("updateTime")] public List UpdateTime { get; set; } = []; [JsonPropertyName("updateTimeDefault")] public int UpdateTimeDefault { get; set; } [JsonPropertyName("purchasesAreFoundInRaid")] public bool PurchasesAreFoundInRaid { get; set; } /// /// Should trader reset times be set based on server start time (false = bsg time - on the hour) /// [JsonPropertyName("tradersResetFromServerStart")] public bool TradersResetFromServerStart { get; set; } [JsonPropertyName("traderPriceMultiplier")] public double TraderPriceMultiplier { get; set; } [JsonPropertyName("fence")] public required FenceConfig Fence { get; set; } } public record UpdateTime { [JsonPropertyName("_name")] public string Name { get; set; } = string.Empty; [JsonPropertyName("traderId")] public MongoId TraderId { get; set; } = string.Empty; /// /// Seconds between trader resets /// [JsonPropertyName("seconds")] public required MinMax Seconds { get; set; } } public record FenceConfig { [JsonPropertyName("discountOptions")] public required DiscountOptions DiscountOptions { get; set; } [JsonPropertyName("partialRefreshTimeSeconds")] public int PartialRefreshTimeSeconds { get; set; } [JsonPropertyName("partialRefreshChangePercent")] public double PartialRefreshChangePercent { get; set; } [JsonPropertyName("assortSize")] public int AssortSize { get; set; } [JsonPropertyName("weaponPresetMinMax")] public required MinMax WeaponPresetMinMax { get; set; } [JsonPropertyName("equipmentPresetMinMax")] public required MinMax EquipmentPresetMinMax { get; set; } [JsonPropertyName("itemPriceMult")] public double ItemPriceMult { get; set; } [JsonPropertyName("presetPriceMult")] public double PresetPriceMult { get; set; } [JsonPropertyName("armorMaxDurabilityPercentMinMax")] public required ItemDurabilityCurrentMax ArmorMaxDurabilityPercentMinMax { get; set; } [JsonPropertyName("weaponDurabilityPercentMinMax")] public required ItemDurabilityCurrentMax WeaponDurabilityPercentMinMax { get; set; } /// /// Keyed to plate protection level /// [JsonPropertyName("chancePlateExistsInArmorPercent")] public required Dictionary ChancePlateExistsInArmorPercent { get; set; } /// /// Key: item tpl /// [JsonPropertyName("itemStackSizeOverrideMinMax")] public required Dictionary?> ItemStackSizeOverrideMinMax { get; set; } [JsonPropertyName("itemTypeLimits")] public required Dictionary ItemTypeLimits { get; set; } /// /// Prevent duplicate offers of items of specific categories by parentId /// [JsonPropertyName("preventDuplicateOffersOfCategory")] public required HashSet PreventDuplicateOffersOfCategory { get; set; } [JsonPropertyName("regenerateAssortsOnRefresh")] public bool RegenerateAssortsOnRefresh { get; set; } /// /// Max rouble price before item is not listed on flea /// [JsonPropertyName("itemCategoryRoublePriceLimit")] public required Dictionary ItemCategoryRoublePriceLimit { get; set; } /// /// Each slotid with % to be removed prior to listing on fence /// [JsonPropertyName("presetSlotsToRemoveChancePercent")] public required Dictionary PresetSlotsToRemoveChancePercent { get; set; } /// /// Block seasonal items from appearing when season is inactive /// [JsonPropertyName("blacklistSeasonalItems")] public bool BlacklistSeasonalItems { get; set; } /// /// Max pen value allowed to be listed on flea - affects ammo + ammo boxes /// [JsonPropertyName("ammoMaxPenLimit")] public double AmmoMaxPenLimit { get; set; } [JsonPropertyName("blacklist")] public required HashSet Blacklist { get; set; } [JsonPropertyName("coopExtractGift")] public required CoopExtractReward CoopExtractGift { get; set; } [JsonPropertyName("btrDeliveryExpireHours")] public int BtrDeliveryExpireHours { get; set; } /// /// Smallest value player rep with fence can fall to /// [JsonPropertyName("playerRepMin")] public double PlayerRepMin { get; set; } /// /// Highest value player rep with fence can climb to /// [JsonPropertyName("playerRepMax")] public double PlayerRepMax { get; set; } } public record ItemDurabilityCurrentMax { [JsonPropertyName("current")] public required MinMax Current { get; set; } [JsonPropertyName("max")] public required MinMax Max { get; set; } } public record CoopExtractReward : LootRequest { [JsonPropertyName("sendGift")] public bool SendGift { get; set; } [JsonPropertyName("useRewardItemBlacklist")] public new bool UseRewardItemBlacklist { get; set; } [JsonPropertyName("messageLocaleIds")] public required List MessageLocaleIds { get; set; } [JsonPropertyName("giftExpiryHours")] public int GiftExpiryHours { get; set; } } public record DiscountOptions { [JsonPropertyName("assortSize")] public int AssortSize { get; set; } [JsonPropertyName("itemPriceMult")] public double ItemPriceMult { get; set; } [JsonPropertyName("presetPriceMult")] public double PresetPriceMult { get; set; } [JsonPropertyName("weaponPresetMinMax")] public required MinMax WeaponPresetMinMax { get; set; } [JsonPropertyName("equipmentPresetMinMax")] public required MinMax EquipmentPresetMinMax { get; set; } }