diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
index 0bea2005..3a96a4df 100644
--- a/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/RagfairRequiredItemsService.cs
@@ -11,43 +11,46 @@ public class RagfairRequiredItemsService(RagfairOfferService ragfairOfferService
///
/// Key = tpl
///
- protected readonly ConcurrentDictionary> _requiredItemsCache = new();
+ protected readonly ConcurrentDictionary> RequiredItemsCache = new();
+
+ ///
+ /// Empty hashset to be returned when no keys found by GetRequiredOffersById (reduces memory allocations)
+ ///
+ protected readonly IReadOnlySet EmptyOfferIdSet = new HashSet();
///
/// Get the offerId of offers that require the supplied tpl
///
/// Tpl to find offers ids for
- ///
- public HashSet GetRequiredOffersById(MongoId tpl)
+ /// Set of OfferIds
+ public IReadOnlySet GetRequiredOffersById(MongoId tpl)
{
- if (_requiredItemsCache.TryGetValue(tpl, out var offerIds))
- {
- return offerIds;
- }
-
- return [];
+ return RequiredItemsCache.TryGetValue(tpl, out var offerIds) ? offerIds : EmptyOfferIdSet;
}
///
- /// Create a cache of requirements to purchase item
+ /// Create a cache of offer Ids keyed against the item tpl they require
///
public void BuildRequiredItemTable()
{
- _requiredItemsCache.Clear();
+ RequiredItemsCache.Clear();
foreach (var offer in ragfairOfferService.GetOffers())
- foreach (var requirement in offer.Requirements)
{
- if (paymentHelper.IsMoneyTpl(requirement.TemplateId))
- // This would just be too noisy
+ foreach (var requirement in offer.Requirements ?? [])
{
- continue;
+ // Skip offers for currency, it's too expensive to process
+ // Only process barter offers
+ if (paymentHelper.IsMoneyTpl(requirement.TemplateId))
+ {
+ continue;
+ }
+
+ // Ensure cache has Hashset init for this tpl
+ var offerIds = RequiredItemsCache.GetOrAdd(requirement.TemplateId, _ => []);
+
+ // Add offer id against the tpl key
+ offerIds.Add(offer.Id);
}
-
- // Ensure key is init
- _requiredItemsCache.TryAdd(requirement.TemplateId, []);
-
- // Add matching offer
- _requiredItemsCache.GetValueOrDefault(requirement.TemplateId)?.Add(offer.Id);
}
}
}