diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json index 4f92c947..a57c8237 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/ragfair.json @@ -346,6 +346,7 @@ "useTraderPriceForOffersIfHigher": true, "generateBaseFleaPrices": { "useHandbookPrice": true, + "generatePresetPriceByChildren": true, "priceMultiplier": 1.5, "itemTplMultiplierOverride": { "5780cf7f2459777de4559322": 1.8 diff --git a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs index 245790b4..2d2d95ce 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs @@ -473,7 +473,7 @@ public class RagfairOfferGenerator( // Not barter or pack offer // Apply randomised properties RandomiseOfferItemUpdProperties(sellerId, itemWithChildren, itemToSellDetails, offerCreator); - barterScheme = CreateCurrencyBarterScheme(itemWithChildren, isPackOffer); + barterScheme = CreateCurrencyBarterScheme(itemWithChildren, false); } var createOfferDetails = new CreateFleaOfferDetails @@ -487,6 +487,7 @@ public class RagfairOfferGenerator( Creator = offerCreator, SellInOnePiece = isPackOffer, // sellAsOnePiece - pack offer }; + CreateAndAddFleaOffer(createOfferDetails); } diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs index fafb706f..52cc708c 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs @@ -269,6 +269,12 @@ public record GenerateFleaPrices [JsonPropertyName("hideoutCraftMultiplier")] public double HideoutCraftMultiplier { get; set; } + + /// + /// Should weapons/armors have their price generated by totalling its child items + /// + [JsonPropertyName("generatePresetPriceByChildren")] + public bool GeneratePresetPriceByChildren { get; set; } } public record PriceRanges diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs index 659f6edb..4c5668ea 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs @@ -272,7 +272,7 @@ public class RagfairPriceService( continue; } - price += GetDynamicItemPrice(item.Template, desiredCurrency, item, offerItems, isPackOffer).Value; + price += GetDynamicItemPrice(item.Template, desiredCurrency, item, offerItems, isPackOffer) ?? 0; // Check if the item is a weapon preset. if (item?.Upd?.SptPresetId is not null && presetHelper.IsPresetBaseClass(item.Upd.SptPresetId.Value, BaseClasses.WEAPON)) @@ -329,7 +329,11 @@ public class RagfairPriceService( && presetHelper.IsPresetBaseClass(item.Upd.SptPresetId.Value, BaseClasses.WEAPON) ) { - price = GetWeaponPresetPrice(item, offerItems, price); + price = + RagfairConfig.Dynamic.GenerateBaseFleaPrices.UseHandbookPrice + && RagfairConfig.Dynamic.GenerateBaseFleaPrices.GeneratePresetPriceByChildren + ? GetPresetPriceByChildren(offerItems) + : GetWeaponPresetPrice(item, offerItems, price); isPreset = true; } @@ -522,6 +526,28 @@ public class RagfairPriceService( return existingPrice + extraModsPrice; } + /// + /// Calculate the cost of a weapon preset by adding together the price of its mods + /// + /// weapon plus mods + /// price of weapon in roubles + protected double GetPresetPriceByChildren(IEnumerable weaponWithChildren) + { + var priceTotal = 0d; + foreach (var item in weaponWithChildren) + { + // Root item uses static price + if (item.ParentId == null) + { + priceTotal += GetStaticPriceForItem(item.Template) ?? 0; + } + + priceTotal += GetFleaPriceForItem(item.Template); + } + + return priceTotal; + } + /// /// Get the highest price for an item that is stored in handbook or trader assorts ///