diff --git a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs index b9acf0e8..06983144 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs @@ -24,14 +24,14 @@ public class AssortHelper( /// Traders id the assort belongs to /// All assort items from same trader /// Dict of quest assort to quest id unlocks for all traders (key = started/failed/complete) - /// TODO: what is this for + /// Is the trader assort being modified the flea market /// items minus locked quest assorts public TraderAssort StripLockedQuestAssort( PmcData pmcProfile, string traderId, TraderAssort traderAssorts, Dictionary> mergedQuestAssorts, - bool flea = false) + bool isFlea = false) { var strippedTraderAssorts = traderAssorts; @@ -57,7 +57,7 @@ public class AssortHelper( var questStatusInProfile = _questHelper.GetQuestStatus(pmcProfile, unlockValues.Value.Key); if (!unlockValues.Value.Value.Contains(questStatusInProfile)) { - strippedTraderAssorts = RemoveItemFromAssort(traderAssorts, assortId.Key, flea); + strippedTraderAssorts = RemoveItemFromAssort(traderAssorts, assortId.Key, isFlea); } } @@ -102,13 +102,13 @@ public class AssortHelper( return null; } - /** - * Remove assorts from a trader that have not been unlocked yet - * @param pmcProfile player profile - * @param traderId traders id - * @param assort traders assorts - * @returns traders assorts minus locked loyalty assorts - */ + /// + /// Remove assorts from a trader that have not been unlocked yet + /// + /// Player profile + /// Traders id + /// Traders assorts + /// Trader assorts minus locked loyalty assorts public TraderAssort StripLockedLoyaltyAssort(PmcData pmcProfile, string traderId, TraderAssort assort) { var strippedAssort = assort; @@ -133,19 +133,20 @@ public class AssortHelper( return strippedAssort; } - /** - * Remove an item from an assort - * @param assort assort to modify - * @param itemID item id to remove from assort - * @returns Modified assort - */ - public TraderAssort RemoveItemFromAssort(TraderAssort assort, string itemID, bool flea = false) + /// + /// Remove an item from an assort + /// Must be removed from the assorts; items + barterScheme + LoyaltyLevel + /// + /// Assort to remove item from + /// Id of item to remove from assort + /// Is the assort being modified the flea market assort + /// Modified assort + public TraderAssort RemoveItemFromAssort(TraderAssort assort, string itemId, bool isFlea = false) { - var idsToRemove = _itemHelper.FindAndReturnChildrenByItems(assort.Items, itemID); - - if (assort.BarterScheme.TryGetValue(itemID, out var lisToUse) && flea) + // Flea assort needs special handling, item must remain in assort but be flagged as locked + if (isFlea && assort.BarterScheme.TryGetValue(itemId, out var listToUse)) { - foreach (var barterScheme in lisToUse.SelectMany(barterSchemes => barterSchemes)) + foreach (var barterScheme in listToUse.SelectMany(barterSchemes => barterSchemes)) { barterScheme.SptQuestLocked = true; } @@ -153,13 +154,12 @@ public class AssortHelper( return assort; } - assort.BarterScheme.Remove(itemID); - assort.LoyalLevelItems.Remove(itemID); + assort.BarterScheme.Remove(itemId); + assort.LoyalLevelItems.Remove(itemId); - foreach (var item in idsToRemove.SelectMany(i => assort.Items.ToList().Where(a => a.Id == i))) - { - assort.Items.Remove(item); - } + // The item being removed may have children linked to it, find and remove them too + var idsToRemove = _itemHelper.FindAndReturnChildrenByItems(assort.Items, itemId); + assort.Items.RemoveAll(item => idsToRemove.Contains(item.Id)); return assort; }