diff --git a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
index f98d34ce..0633e773 100644
--- a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
+++ b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs
@@ -39,8 +39,8 @@ public class RagfairServer(
RefreshTraderOffers();
ProcessExpiredFleaOffers();
- // Update requirements now offers have been expired/regenerated, ensuring accuracy
- ragfairRequiredItemsService.BuildRequiredItemTable();
+ // Flag data as stale and in need of regeneration
+ ragfairRequiredItemsService.CacheIsStale();
}
protected void RefreshTraderOffers()
diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
index 3a96a4df..503b22e9 100644
--- a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
@@ -8,6 +8,8 @@ namespace SPTarkov.Server.Core.Services;
[Injectable(InjectionType.Singleton)]
public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService, PaymentHelper paymentHelper)
{
+ private bool _cacheIsStale = true;
+
///
/// Key = tpl
///
@@ -25,6 +27,11 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
/// Set of OfferIds
public IReadOnlySet GetRequiredOffersById(MongoId tpl)
{
+ if (_cacheIsStale)
+ {
+ BuildRequiredItemTable();
+ }
+
return RequiredItemsCache.TryGetValue(tpl, out var offerIds) ? offerIds : EmptyOfferIdSet;
}
@@ -33,13 +40,13 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
///
public void BuildRequiredItemTable()
{
- RequiredItemsCache.Clear();
+ Clear();
+
foreach (var offer in ragfairOfferService.GetOffers())
{
foreach (var requirement in offer.Requirements ?? [])
{
- // Skip offers for currency, it's too expensive to process
- // Only process barter offers
+ // Skip offers for currency, we only need barter offers as this cache is used by `GetOffersThatRequireItem`
if (paymentHelper.IsMoneyTpl(requirement.TemplateId))
{
continue;
@@ -52,5 +59,24 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
offerIds.Add(offer.Id);
}
}
+
+ // Cache is now fresh
+ _cacheIsStale = false;
+ }
+
+ ///
+ /// Clear all data from cache
+ ///
+ public void Clear()
+ {
+ RequiredItemsCache.Clear();
+ }
+
+ ///
+ /// Flag the cache as stale
+ ///
+ public void CacheIsStale()
+ {
+ _cacheIsStale = true;
}
}