From a3dbd3176eacd290e59525dc5705377b6b60fe83 Mon Sep 17 00:00:00 2001 From: Chomp Date: Sat, 28 Jun 2025 11:58:50 +0100 Subject: [PATCH] Updated `FindAndReturnChildrenByItems` to be an extension method --- .../Controllers/QuestController.cs | 4 +-- .../Extensions/ItemExtensions.cs | 32 +++++++++++++++++++ .../Helpers/AssortHelper.cs | 3 +- .../Helpers/InventoryHelper.cs | 2 +- .../Helpers/ItemHelper.cs | 23 ------------- .../Helpers/ProfileHelper.cs | 4 +-- .../Helpers/SecureContainerHelper.cs | 6 ++-- .../Services/FenceService.cs | 5 ++- 8 files changed, 43 insertions(+), 36 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs b/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs index 6aca14b5..b6e22c32 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs @@ -1,4 +1,5 @@ using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Helpers; using SPTarkov.Server.Core.Models.Eft.Common; using SPTarkov.Server.Core.Models.Eft.Common.Tables; @@ -311,8 +312,7 @@ public class QuestController( else { // Remove item with children - var toRemove = _itemHelper.FindAndReturnChildrenByItems( - pmcData.Inventory.Items, + var toRemove = pmcData.Inventory.Items.FindAndReturnChildrenByItems( itemHandover.Id ); var index = pmcData.Inventory.Items.Count; diff --git a/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs index 7be8b784..40f0ac31 100644 --- a/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs +++ b/Libraries/SPTarkov.Server.Core/Extensions/ItemExtensions.cs @@ -191,5 +191,37 @@ namespace SPTarkov.Server.Core.Extensions return items; } + + /// + /// Recursive function that looks at every item from parameter and gets their children's Ids + includes parent item in results + /// + /// List of items (item + possible children) + /// Parent item's id + /// list of child item ids + public static List FindAndReturnChildrenByItems( + this IEnumerable items, + string baseItemId + ) + { + List list = []; + + foreach (var childItem in items) + { + if ( + string.Equals( + childItem.ParentId, + baseItemId, + StringComparison.OrdinalIgnoreCase + ) + ) + { + list.AddRange(FindAndReturnChildrenByItems(items, childItem.Id)); + } + } + + list.Add(baseItemId); // Required, push original item id onto array + + return list; + } } } diff --git a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs index f5e7a24d..24a201b2 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/AssortHelper.cs @@ -1,4 +1,5 @@ using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Enums; @@ -182,7 +183,7 @@ public class AssortHelper( assort.LoyalLevelItems.Remove(itemId); // The item being removed may have children linked to it, find and remove them too - var idsToRemove = _itemHelper.FindAndReturnChildrenByItems(assort.Items, itemId); + var idsToRemove = assort.Items.FindAndReturnChildrenByItems(itemId); assort.Items.RemoveAll(item => idsToRemove.Contains(item.Id)); return assort; diff --git a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs index e3fdacf3..0ae89c41 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/InventoryHelper.cs @@ -1182,7 +1182,7 @@ public class InventoryHelper( HandleCartridges(sourceItems, request); // Get all children item has, they need to move with item - var idsToMove = _itemHelper.FindAndReturnChildrenByItems(sourceItems, request.Item); + var idsToMove = sourceItems.FindAndReturnChildrenByItems(request.Item); foreach (var itemId in idsToMove) { var itemToMove = sourceItems.FirstOrDefault(item => item.Id == itemId); diff --git a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs index 76b811d1..1c3c8ec2 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs @@ -728,29 +728,6 @@ public class ItemHelper( return Math.Sqrt(durability ?? 0); } - /// - /// Recursive function that looks at every item from parameter and gets their children's Ids + includes parent item in results - /// - /// List of items (item + possible children) - /// Parent item's id - /// list of child item ids - public List FindAndReturnChildrenByItems(IEnumerable items, string baseItemId) - { - List list = []; - - foreach (var childItem in items) - { - if (string.Equals(childItem.ParentId, baseItemId, StringComparison.OrdinalIgnoreCase)) - { - list.AddRange(FindAndReturnChildrenByItems(items, childItem.Id)); - } - } - - list.Add(baseItemId); // Required, push original item id onto array - - return list; - } - /// /// A variant of FindAndReturnChildren where the output is list of item objects instead of their ids. /// diff --git a/Libraries/SPTarkov.Server.Core/Helpers/ProfileHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/ProfileHelper.cs index 889578f8..5a060e47 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/ProfileHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/ProfileHelper.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Eft.Profile; @@ -378,8 +379,7 @@ public class ProfileHelper( if (secureContainer is not null) { // Find and remove container + children - var childItemsInSecureContainer = _itemHelper.FindAndReturnChildrenByItems( - items, + var childItemsInSecureContainer = items.FindAndReturnChildrenByItems( secureContainer.Id ); diff --git a/Libraries/SPTarkov.Server.Core/Helpers/SecureContainerHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/SecureContainerHelper.cs index f9012fa8..661a8d0d 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/SecureContainerHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/SecureContainerHelper.cs @@ -1,4 +1,5 @@ using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common.Tables; namespace SPTarkov.Server.Core.Helpers; @@ -21,10 +22,7 @@ public class SecureContainerHelper(ItemHelper _itemHelper) return []; } - var itemsInSecureContainer = _itemHelper.FindAndReturnChildrenByItems( - items, - secureContainer.Id - ); + var itemsInSecureContainer = items.FindAndReturnChildrenByItems(secureContainer.Id); // Return all items returned and exclude the secure container item itself return itemsInSecureContainer.Where(x => x != secureContainer.Id).ToList(); diff --git a/Libraries/SPTarkov.Server.Core/Services/FenceService.cs b/Libraries/SPTarkov.Server.Core/Services/FenceService.cs index 02429611..3256ad89 100644 --- a/Libraries/SPTarkov.Server.Core/Services/FenceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/FenceService.cs @@ -1,5 +1,6 @@ using SPTarkov.Common.Extensions; using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Helpers; using SPTarkov.Server.Core.Models.Common; using SPTarkov.Server.Core.Models.Eft.Common; @@ -1497,9 +1498,7 @@ public class FenceService( } // Remove item and its sub-items to prevent orphans - toDelete.UnionWith( - itemHelper.FindAndReturnChildrenByItems(itemAndMods, itemMod.Id) - ); + toDelete.UnionWith(itemAndMods.FindAndReturnChildrenByItems(itemMod.Id)); } }