diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RepairHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RepairHelper.cs
index bd2811e3..e2ef70d4 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RepairHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RepairHelper.cs
@@ -60,7 +60,7 @@ public class RepairHelper(
newCurrentMaxDurability = itemMaxDurability;
}
- // Ensure new current isnt above items max
+ // Ensure new current isn't above items max
if (newCurrentDurability > itemMaxDurability)
{
newCurrentDurability = itemMaxDurability;
@@ -69,7 +69,7 @@ public class RepairHelper(
// Update Repairable properties with new values after repair
itemToRepair.Upd.Repairable = new UpdRepairable { Durability = newCurrentDurability, MaxDurability = newCurrentMaxDurability };
- // when modders set the repair coefficient to 0 it means that they dont want to lose durability on items
+ // when modders set the repair coefficient to 0 it means that they don't want to lose durability on items
// the code below generates a random degradation on the weapon durability
if (applyMaxDurabilityDegradation)
{
@@ -141,13 +141,13 @@ public class RepairHelper(
/// Weapon properties
/// Was a repair kit used
/// Max amount of durability item can have
- /// Different traders produce different loss values
+ /// Different traders produce different loss values
/// Amount to reduce max durability by
protected double GetRandomisedWeaponRepairDegradationValue(
Props itemProps,
bool isRepairKit,
double weaponMax,
- double traderQualityMultipler
+ double traderQualityMultiplier
)
{
var minRepairDeg = isRepairKit ? itemProps.MinRepairKitDegradation : itemProps.MinRepairDegradation;
@@ -160,7 +160,7 @@ public class RepairHelper(
}
var duraLossPercent = randomUtil.GetDouble((double)minRepairDeg, (double)maxRepairDeg);
- var duraLossMultipliedByTraderMultiplier = duraLossPercent * weaponMax * traderQualityMultipler;
+ var duraLossMultipliedByTraderMultiplier = duraLossPercent * weaponMax * traderQualityMultiplier;
return Math.Round(duraLossMultipliedByTraderMultiplier, 2);
}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs
index 582fbdcd..d1d5858b 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/RagfairConfig.cs
@@ -196,7 +196,7 @@ public record Dynamic
public required ArmorSettings Armor { get; set; }
///
- /// A multipler to apply to individual tpls price just prior to item quality adjustment
+ /// A multiplier to apply to individual tpls price just prior to item quality adjustment
///
[JsonPropertyName("itemPriceMultiplier")]
public Dictionary? ItemPriceMultiplier { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
index 97cfd367..cc979ef1 100644
--- a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
+++ b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
@@ -36,41 +36,52 @@ public class RagfairServer(
public void Update()
{
- // Generate/refresh trader offers
- var traders = GetUpdateableTraders();
- foreach (var traderId in traders)
- {
- // Edge case - skip generating fence offers
- if (traderId == Traders.FENCE)
- {
- continue;
- }
+ RefreshTraderOffers();
+ ProcessExpiredFleaOffers();
+ // Update requirements now the offers have been expired/regenerated to ensure they're accurate
+ _ragfairRequiredItemsService.BuildRequiredItemTable();
+ }
+
+ protected void RefreshTraderOffers()
+ {
+ // Generate/refresh trader offers - skip fence as his offers are separately handled
+ var tradersToProcess = GetUpdateableTraders().Where(trader => trader != Traders.FENCE);
+ foreach (var traderId in tradersToProcess)
+ {
+ // Each trader has its own expiry time
if (_ragfairOfferService.TraderOffersNeedRefreshing(traderId))
{
- // Trader has passed its offer cycle time, update stock and set offer times
+ // Trader has passed its offer expiry time, update stock and reset offer times
_ragfairOfferGenerator.GenerateFleaOffersForTrader(traderId);
}
}
+ }
- // Regenerate expired offers when over threshold limit
+ private void ProcessExpiredFleaOffers()
+ {
+ // Regenerate expired offers when over timestamp threshold
_ragfairOfferHolder.FlagExpiredOffersAfterDate(timeUtil.GetTimeStamp());
- if (_ragfairOfferService.EnoughExpiredOffersExistToProcess())
+ if (!_ragfairOfferService.EnoughExpiredOffersExistToProcess())
{
- // Must occur BEFORE "RemoveExpiredOffers" + clone items as they'll be purged by `RemoveExpiredOffers()`
- var expiredOfferItemsClone = cloner.Clone(_ragfairOfferHolder.GetExpiredOfferItems());
+ // Not enough expired offers to process, exit
+ return;
+ }
- _ragfairOfferService.RemoveExpiredOffers();
+ // Must occur BEFORE "RemoveExpiredOffers" + clone items as they'll be purged by `RemoveExpiredOffers()`
+ var expiredOfferItemsClone = cloner.Clone(_ragfairOfferHolder.GetExpiredOfferItems());
- // Force a cleanup+compact now all the expired offers are gone
- GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized, true, true);
+ _ragfairOfferService.RemoveExpiredOffers();
+ // Force a cleanup+compact now all the expired offers are gone
+ GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized, true, true);
+
+ if (expiredOfferItemsClone is not null)
+ {
// Replace the expired offers with new ones
_ragfairOfferGenerator.GenerateDynamicOffers(expiredOfferItemsClone);
}
-
- _ragfairRequiredItemsService.BuildRequiredItemTable();
}
///