diff --git a/Libraries/Core/Helpers/RagfairHelper.cs b/Libraries/Core/Helpers/RagfairHelper.cs index 1a942d22..fadb8b97 100644 --- a/Libraries/Core/Helpers/RagfairHelper.cs +++ b/Libraries/Core/Helpers/RagfairHelper.cs @@ -61,7 +61,7 @@ public class RagfairHelper( } // Case: category - if (request.HandbookId != null) { + if (!string.IsNullOrEmpty(request.HandbookId)) { var handbook = GetCategoryList(request.HandbookId); if (result.Count != null && result.Count > 0) { diff --git a/Libraries/Core/Services/RagfairLinkedItemService.cs b/Libraries/Core/Services/RagfairLinkedItemService.cs index 3eb7d433..513265be 100644 --- a/Libraries/Core/Services/RagfairLinkedItemService.cs +++ b/Libraries/Core/Services/RagfairLinkedItemService.cs @@ -1,4 +1,5 @@ -using Core.Helpers; +using System.Security.Cryptography; +using Core.Helpers; using SptCommon.Annotations; using Core.Models.Eft.Common.Tables; using Core.Models.Enums; @@ -18,11 +19,14 @@ public class RagfairLinkedItemService( public HashSet GetLinkedItems(string linkedSearchId) { - if (!linkedItemsCache.Keys.Any()) { + if (!linkedItemsCache.TryGetValue(linkedSearchId, out var set)) + { BuildLinkedItemTable(); + + return linkedItemsCache[linkedSearchId]; } - return linkedItemsCache[linkedSearchId]; + return set; } /** @@ -54,9 +58,9 @@ public class RagfairLinkedItemService( foreach (var item in databaseService.GetItems().Values) { var itemLinkedSet = GetLinkedItems(linkedItems, item.Id); - ApplyLinkedItems(GetFilters(item, "Slots"), item, itemLinkedSet); - ApplyLinkedItems(GetFilters(item, "Chambers"), item, itemLinkedSet); - ApplyLinkedItems(GetFilters(item, "Cartridges"), item, itemLinkedSet); + ApplyLinkedItems(GetSlotFilters(item), item, itemLinkedSet); + ApplyLinkedItems(GetChamberFilters(item), item, itemLinkedSet); + ApplyLinkedItems(GetCartridgeFilters(item), item, itemLinkedSet); // Edge case, ensure ammo for revolves is included if (item.Parent == BaseClasses.REVOLVER) { @@ -68,19 +72,15 @@ public class RagfairLinkedItemService( linkedItemsCache = linkedItems; } - protected void ApplyLinkedItems(List items, TemplateItem item, HashSet itemLinkedSet) + protected void ApplyLinkedItems(HashSet items, TemplateItem item, HashSet itemLinkedSet) { - foreach (var linkedItemId in items) { - itemLinkedSet.Add(linkedItemId); - GetLinkedItems(linkedItemId).Add(item.Id); - } + itemLinkedSet.UnionWith(items); } protected HashSet GetLinkedItems(Dictionary> linkedItems, string id) { - if (!linkedItems.ContainsKey(id)) { - linkedItems.Add(id, []); - } + linkedItems.TryAdd(id, []); + return linkedItems[id]; } @@ -97,41 +97,63 @@ public class RagfairLinkedItemService( var cylinderTpl = cylinderMod.Props?.Filters?[0].Filter?[0]; if (!string.IsNullOrEmpty(cylinderTpl)) { // Get db data for cylinder tpl, add found slots info (camora_xxx) to linked items on revolver weapon - var cylinderItem = itemHelper.GetItem(cylinderTpl).Value; - ApplyLinkedItems(GetFilters(cylinderItem, "Slots"), cylinder, itemLinkedSet); + var cylinderTemplate = itemHelper.GetItem(cylinderTpl).Value; + ApplyLinkedItems(GetSlotFilters(cylinderTemplate), cylinder, itemLinkedSet); } } } - /** - * Scans a given slot type for filters and returns them as a Set - * @param item - * @param slot - * @returns array of ids - */ - protected List GetFilters(TemplateItem item, string slot) + protected HashSet GetSlotFilters(TemplateItem item) { - var properties = item.Properties.GetAllPropsAsDict(); - if (!properties.TryGetValue(slot, out var value) || value == null) { - // item slot doesnt exist - return []; - } -/* - var filters = new List(); - // I have no fucking clue wtf is happening here... god help us all and anyone who has to read this code - foreach (var sub in properties[slot].GetAllPropsAsDict()) { - if (!("_props" in sub && "filters" in sub._props)) { - // not a filter - continue; - } + var result = new HashSet(); - for (var filter of sub._props.filters) { - for (var f of filter.Filter) { - filters.push(f); - } - } + var slots = item.Properties?.Slots; + if (slots is null) + { + return result; } -*/ - return new List(); + + foreach (var slot in slots) + { + result.UnionWith(slot.Props?.Filters?.FirstOrDefault()?.Filter); + } + + return result; + } + + protected HashSet GetChamberFilters(TemplateItem item) + { + var result = new HashSet(); + + var chambers = item.Properties?.Chambers; + if (chambers is null) + { + return result; + } + + foreach (var chamber in chambers) + { + result.UnionWith(chamber.Props?.Filters?.FirstOrDefault()?.Filter); + } + + return result; + } + + protected HashSet GetCartridgeFilters(TemplateItem item) + { + var result = new HashSet(); + + var cartridges = item.Properties?.Cartridges; + if (cartridges is null) + { + return result; + } + + foreach (var cartridge in cartridges) + { + result.UnionWith(cartridge.Props?.Filters?.FirstOrDefault()?.Filter); + } + + return result; } }