From 1ef9ebd88a1763f711cdcfa3976751fe1be1f0d1 Mon Sep 17 00:00:00 2001 From: Chomp Date: Tue, 16 Sep 2025 22:24:35 +0100 Subject: [PATCH] Added system to generate item flea base prices based on handbook value --- .../SPT_Data/configs/ragfair.json | 11 ++++- .../Models/Spt/Config/RagfairConfig.cs | 27 ++++++++++++ .../Services/RagfairPriceService.cs | 42 +++++++++++++++++-- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json index faac4d8f..ba148b52 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json @@ -343,7 +343,16 @@ "newPriceHandbookMultiplier": 11 } }, - "useTraderPriceForOffersIfHigher": true + "useTraderPriceForOffersIfHigher": true, + "generateBaseFleaPrices": { + "useHandbookPrice": true, + "priceMultiplier": 1.5, + "itemTplMultiplierOverride": { + "5780cf7f2459777de4559322": 1.8, + "5c1d0efb86f7744baf2e7b7b": 2.5 + }, + "preventPriceBeingBelowTraderBuyPrice": true + } }, "runIntervalSeconds": 8, "runIntervalValues": { diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs index d454dde0..ce2190bb 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs @@ -227,6 +227,33 @@ public record Dynamic /// [JsonPropertyName("itemPriceOverrideRouble")] public required Dictionary ItemPriceOverrideRouble { get; set; } + + [JsonPropertyName("generateBaseFleaPrices")] + public GenerateFleaPrices GenerateBaseFleaPrices { get; set; } +} + +public record GenerateFleaPrices +{ + /// + /// Should handbook prices be used (true) as a base or the values already in prices.json (false) + /// + [JsonPropertyName("useHandbookPrice")] + public bool UseHandbookPrice { get; set; } + + /// + /// Multiplier to apply to handbook price + /// + [JsonPropertyName("priceMultiplier")] + public double PriceMultiplier { get; set; } + + /// + /// Don't allow prices being added that are below sell to trader price. Prevent ability to buy cheap items on flea and sell to traders for easy rep + /// + [JsonPropertyName("preventPriceBeingBelowTraderBuyPrice")] + public bool PreventPriceBeingBelowTraderBuyPrice { get; set; } + + [JsonPropertyName("itemTplMultiplierOverride")] + public Dictionary ItemTplMultiplierOverride { get; set; } } public record PriceRanges diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs index 9fa16001..5f4e9506 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs @@ -1,4 +1,5 @@ using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Helpers; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Eft.Common; @@ -24,6 +25,7 @@ public class RagfairPriceService( PresetHelper presetHelper, ItemHelper itemHelper, DatabaseService databaseService, + DatabaseServer databaseServer, ServerLocalisationService serverLocalisationService, ConfigServer configServer ) @@ -37,7 +39,10 @@ public class RagfairPriceService( public void Load() { RefreshStaticPrices(); - RefreshDynamicPrices(); + if (RagfairConfig.Dynamic.GenerateBaseFleaPrices.UseHandbookPrice) + { + ReplaceFleaBasePrices(); + } } public string GetRoute() @@ -62,11 +67,40 @@ public class RagfairPriceService( } /// - /// Copy the prices.json data into our dynamic price dictionary + /// Replace base item price used for flea + /// Use handbook as a base price /// - public void RefreshDynamicPrices() + public void ReplaceFleaBasePrices() { - // TODO: remove as redundant? + var pricePool = databaseServer.GetTables().Templates.Prices; + foreach (var (itemTpl, handbookPrice) in StaticPrices) + { + // Get new price to use + var newBasePrice = handbookPrice * RagfairConfig.Dynamic.GenerateBaseFleaPrices.PriceMultiplier; + if (newBasePrice == 0) + { + continue; + } + + // Specific item multiplier may exist, check for it + if (RagfairConfig.Dynamic.GenerateBaseFleaPrices.ItemTplMultiplierOverride.TryGetValue(itemTpl, out var specificItemMultiplier)) + { + newBasePrice = handbookPrice * specificItemMultiplier; + } + + if (RagfairConfig.Dynamic.GenerateBaseFleaPrices.PreventPriceBeingBelowTraderBuyPrice) + { + // Check if item can be sold to trader for a higher price than what we're going to set + var highestSellToTraderPrice = traderHelper.GetHighestSellToTraderPrice(itemTpl); + if (highestSellToTraderPrice > newBasePrice) + { + // Trader has higher sell price, use that value + newBasePrice = highestSellToTraderPrice; + } + } + + pricePool.AddOrUpdate(itemTpl, newBasePrice); + } } ///