From 6dd37425cc06460acd020db2276e03642dd8f360 Mon Sep 17 00:00:00 2001 From: CWX Date: Sat, 12 Apr 2025 10:58:18 +0100 Subject: [PATCH] Fix duplicates trying to be added --- .../Utils/RagfairOfferHolder.cs | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs index ee77c89a..47c0ff3c 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs @@ -27,7 +27,8 @@ public class RagfairOfferHolder( protected ConcurrentDictionary> _offersByTrader = new(); // key = traderId, value = list of offerIds protected HashSet _expiredOfferIds = []; - protected readonly Lock _expiredOfferIdsLock = new(); + protected readonly Lock _expiredOfferIdsLock = new Lock(); + protected readonly Lock _ragfairOperationLock = new Lock(); /// /// Get a ragfair offer by its id @@ -110,38 +111,41 @@ public class RagfairOfferHolder( /// Offer to add public void AddOffer(RagfairOffer offer) { - var sellerId = offer.User.Id; - // Keep generating IDs until we get a unique one - while (_offersById.ContainsKey(offer.Id)) + lock (_ragfairOperationLock) { - offer.Id = _hashUtil.Generate(); - } + var sellerId = offer.User.Id; + // Keep generating IDs until we get a unique one + while (_offersById.ContainsKey(offer.Id)) + { + offer.Id = _hashUtil.Generate(); + } - var itemTpl = offer.Items?.FirstOrDefault()?.Template; - // If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers - // for this template, just don't add in more - var sellerIsTrader = _ragfairServerHelper.IsTrader(sellerId); - if ( - itemTpl != null - && !(sellerIsTrader || _profileHelper.IsPlayer(sellerId)) - && _offersByTemplate.TryGetValue(itemTpl, out var offers) - && offers?.Count >= _maxOffersPerTemplate - ) - { - return; - } + var itemTpl = offer.Items?.FirstOrDefault()?.Template; + // If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers + // for this template, just don't add in more + var sellerIsTrader = _ragfairServerHelper.IsTrader(sellerId); + if ( + itemTpl != null + && !(sellerIsTrader || _profileHelper.IsPlayer(sellerId)) + && _offersByTemplate.TryGetValue(itemTpl, out var offers) + && offers?.Count >= _maxOffersPerTemplate + ) + { + return; + } - if (!_offersById.TryAdd(offer.Id, offer)) - { - _logger.Warning($"Unable to add offer: {offer.Id}"); - } + if (!_offersById.TryAdd(offer.Id, offer)) + { + _logger.Warning($"Offer: {offer.Id} already exists"); + } - if (sellerIsTrader) - { - AddOfferByTrader(sellerId, offer.Id); - } + if (sellerIsTrader) + { + AddOfferByTrader(sellerId, offer.Id); + } - AddOfferByTemplates(itemTpl, offer.Id); + AddOfferByTemplates(itemTpl, offer.Id); + } } ///