From 9c9ac638c01d85b80240926303b18af09b19cc8d Mon Sep 17 00:00:00 2001 From: Chomp Date: Sat, 28 Jun 2025 13:12:36 +0100 Subject: [PATCH] Added `TraderAssortExtensions` --- .../Extensions/TraderAssortExtensions.cs | 59 +++++++++++++++++++ .../Helpers/AssortHelper.cs | 39 +----------- .../Helpers/TraderAssortHelper.cs | 22 +------ 3 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 Libraries/SPTarkov.Server.Core/Extensions/TraderAssortExtensions.cs diff --git a/Libraries/SPTarkov.Server.Core/Extensions/TraderAssortExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/TraderAssortExtensions.cs new file mode 100644 index 00000000..2267743f --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Extensions/TraderAssortExtensions.cs @@ -0,0 +1,59 @@ +using SPTarkov.Server.Core.Models.Eft.Common.Tables; + +namespace SPTarkov.Server.Core.Extensions +{ + public static class TraderAssortExtensions + { + /// + /// 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 static TraderAssort RemoveItemFromAssort( + this TraderAssort assort, + string itemId, + bool isFlea = false + ) + { + // 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 listToUse.SelectMany(barterSchemes => barterSchemes)) + { + barterScheme.SptQuestLocked = true; + } + + return assort; + } + + assort.BarterScheme.Remove(itemId); + assort.LoyalLevelItems.Remove(itemId); + + // The item being removed may have children linked to it, find and remove them too + var idsToRemove = assort.Items.FindAndReturnChildrenByItems(itemId); + assort.Items.RemoveAll(item => idsToRemove.Contains(item.Id)); + + return assort; + } + + /// + /// Given the blacklist provided, remove root items from assort + /// + /// Trader assort to modify + /// Item TPLs the assort should not have + public static void RemoveItemsFromAssort( + this TraderAssort assortToFilter, + HashSet itemsTplsToRemove + ) + { + assortToFilter.Items = assortToFilter + .Items.Where(item => + item.ParentId == "hideout" && itemsTplsToRemove.Contains(item.Template) + ) + .ToList(); + } + } +} diff --git a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs index 24a201b2..6d9ffc37 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs @@ -64,7 +64,7 @@ public class AssortHelper( ); if (!unlockValues.Value.Value.Contains(questStatusInProfile)) { - strippedTraderAssorts = RemoveItemFromAssort(traderAssorts, assortId.Key, isFlea); + strippedTraderAssorts = traderAssorts.RemoveItemFromAssort(assortId.Key, isFlea); } } @@ -147,45 +147,10 @@ public class AssortHelper( && assort.LoyalLevelItems[item.Key] > info.LoyaltyLevel ) { - strippedAssort = RemoveItemFromAssort(assort, item.Key); + strippedAssort = assort.RemoveItemFromAssort(item.Key); } } return strippedAssort; } - - /// - /// 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 - ) - { - // 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 listToUse.SelectMany(barterSchemes => barterSchemes)) - { - barterScheme.SptQuestLocked = true; - } - - return assort; - } - - assort.BarterScheme.Remove(itemId); - assort.LoyalLevelItems.Remove(itemId); - - // The item being removed may have children linked to it, find and remove them too - var idsToRemove = assort.Items.FindAndReturnChildrenByItems(itemId); - assort.Items.RemoveAll(item => idsToRemove.Contains(item.Id)); - - return assort; - } } diff --git a/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs index e6a0d691..bec47347 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs @@ -1,4 +1,5 @@ using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Enums; using SPTarkov.Server.Core.Models.Utils; @@ -90,7 +91,7 @@ public class TraderAssortHelper( if (_logger.IsLogEnabled(LogLevel.Debug)) { _logger.Debug( - $"Unable to adjust assort {assortToAdjust.Id} item: {assortToAdjust.Template} BuyRestrictionCurrent value, assort has a null upd object" + $"Unable to adjust assort: {assortToAdjust.Id} item: {assortToAdjust.Template} BuyRestrictionCurrent value, assort has a null upd object" ); } @@ -113,29 +114,12 @@ public class TraderAssortHelper( // Filter out root assorts that are blacklisted for this profile if (fullProfile.SptData.BlacklistedItemTemplates?.Count > 0) { - RemoveItemsFromAssort(traderClone.Assort, fullProfile.SptData.BlacklistedItemTemplates); + traderClone.Assort.RemoveItemsFromAssort(fullProfile.SptData.BlacklistedItemTemplates); } return traderClone.Assort; } - /// - /// Given the blacklist provided, remove root items from assort - /// - /// Trader assort to modify - /// Item TPLs the assort should not have - protected void RemoveItemsFromAssort( - TraderAssort assortToFilter, - HashSet itemsTplsToRemove - ) - { - assortToFilter.Items = assortToFilter - .Items.Where(item => - item.ParentId == "hideout" && itemsTplsToRemove.Contains(item.Template) - ) - .ToList(); - } - /// /// Reset every traders root item `BuyRestrictionCurrent` property to 0 ///