Made RagfairRequiredItemsService cache generate on use instead of every Update()

This commit is contained in:
Chomp
2025-08-17 16:28:58 +01:00
parent cf35b9f66f
commit c87bace62c
2 changed files with 31 additions and 5 deletions
@@ -8,6 +8,8 @@ namespace SPTarkov.Server.Core.Services;
[Injectable(InjectionType.Singleton)]
public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService, PaymentHelper paymentHelper)
{
private bool _cacheIsStale = true;
/// <summary>
/// Key = tpl
/// </summary>
@@ -25,6 +27,11 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
/// <returns>Set of OfferIds</returns>
public IReadOnlySet<MongoId> GetRequiredOffersById(MongoId tpl)
{
if (_cacheIsStale)
{
BuildRequiredItemTable();
}
return RequiredItemsCache.TryGetValue(tpl, out var offerIds) ? offerIds : EmptyOfferIdSet;
}
@@ -33,13 +40,13 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
/// </summary>
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;
}
/// <summary>
/// Clear all data from cache
/// </summary>
public void Clear()
{
RequiredItemsCache.Clear();
}
/// <summary>
/// Flag the cache as stale
/// </summary>
public void CacheIsStale()
{
_cacheIsStale = true;
}
}