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));
}
}