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
///