diff --git a/Libraries/Core/Controllers/PresetController.cs b/Libraries/Core/Controllers/PresetController.cs index 9064e64e..c5db5a86 100644 --- a/Libraries/Core/Controllers/PresetController.cs +++ b/Libraries/Core/Controllers/PresetController.cs @@ -1,4 +1,5 @@ using Core.Helpers; +using Core.Models.Spt.Presets; using Core.Models.Utils; using Core.Services; using SptCommon.Annotations; @@ -18,7 +19,7 @@ public class PresetController( public void Initialize() { var presets = _databaseService.GetGlobals().ItemPresets; - var result = new Dictionary>(); + var result = new Dictionary(); foreach (var (presetId, preset) in presets) { if (presetId != preset.Id) @@ -30,11 +31,17 @@ public class PresetController( continue; } + // Get root items tpl var tpl = preset.Items.FirstOrDefault()?.Template; - result.TryAdd(tpl, []); + result.TryAdd(tpl, new PresetCacheDetails{PresetIds = [] }); - result.TryGetValue(tpl, out var listToAddTo); - listToAddTo.Add(presetId); + result.TryGetValue(tpl, out var details); + details.PresetIds.Add(presetId); + if (preset.Encyclopedia is not null) + { + // Flag this preset as being the default for the weapon + details.DefaultId = preset.Id; + } } _presetHelper.HydratePresetStore(result); diff --git a/Libraries/Core/Helpers/PresetHelper.cs b/Libraries/Core/Helpers/PresetHelper.cs index 3cd30eea..4c0943e3 100644 --- a/Libraries/Core/Helpers/PresetHelper.cs +++ b/Libraries/Core/Helpers/PresetHelper.cs @@ -1,5 +1,6 @@ using Core.Models.Eft.Common; using Core.Models.Enums; +using Core.Models.Spt.Presets; using Core.Services; using Core.Utils.Cloners; using SptCommon.Annotations; @@ -14,14 +15,14 @@ public class PresetHelper( ) { protected Dictionary _defaultEquipmentPresets; - protected Dictionary? _defaultWeaponPresets; + protected Dictionary _defaultWeaponPresets; /// /// Preset cache - key = item tpl, value = preset ids /// - protected Dictionary> _lookup = new(); + protected Dictionary _lookup = new(); - public void HydratePresetStore(Dictionary> input) + public void HydratePresetStore(Dictionary input) { _lookup = input; } @@ -114,65 +115,73 @@ public class PresetHelper( return _cloner.Clone(_databaseService.GetGlobals().ItemPresets.Values.ToList()); } + /// + /// Get a clone of a tpls presets + /// + /// Tpl to get presets for + /// List public List GetPresets(string templateId) { - if (!HasPreset(templateId)) + // Try adn get preset ids from cache if they exist + if(!_lookup.TryGetValue(templateId, out var presetDetailsForTpl)) { + // None found, early exit return []; } - List presets = []; - var ids = _lookup[templateId]; - - foreach (var id in ids) - { - presets.Add(GetPreset(id)); - } - - return presets; + // Use gathered preset ids to get full preset objects, clone and return + return _cloner.Clone(presetDetailsForTpl.PresetIds + .Select(x => _databaseService.GetGlobals().ItemPresets[x]) + .ToList()); } - /** - * Get a cloned default preset for passed in item tpl - * @param templateId Item tpl to get preset for - * @returns null if no default preset, otherwise Preset - */ + /// + /// Get a cloned default preset for passed in item tpl + /// + /// Items tpl to get preset for + /// null if no default preset, otherwise Preset public Preset? GetDefaultPreset(string templateId) { - if (!HasPreset(templateId)) + // look in main cache for presets for this tpl + if (!_lookup.TryGetValue(templateId, out var presetDetails)) { return null; } - var allPresets = GetPresets(templateId); - - foreach (var preset in allPresets) + // Use default preset id from above cache to find the weapon/equipment preset + if (!_defaultWeaponPresets.TryGetValue(presetDetails.DefaultId, out var defaultPreset)) { - if (preset.Encyclopedia is not null) + if (!_defaultEquipmentPresets.TryGetValue(presetDetails.DefaultId, out defaultPreset)) { - return preset; + // Default not found in weapon or equipment, return first preset in list + return _cloner.Clone(_databaseService.GetGlobals().ItemPresets[presetDetails.PresetIds.First()]); } } - return allPresets[0]; + return _cloner.Clone(defaultPreset); } + /// + /// Get the presets root item tpl + /// + /// Preset id to look up + /// tpl mongoid public string GetBaseItemTpl(string presetId) { - if (IsPreset(presetId)) + if (!_databaseService.GetGlobals().ItemPresets.TryGetValue(presetId, out var preset)) { - var preset = GetPreset(presetId); - - foreach (var item in preset.Items) - { - if (preset.Parent == item.Id) - { - return item.Template; - } - } + // No preset exists + return ""; } - return ""; + var rootItem = preset.Items.FirstOrDefault(x => x.Id == preset.Parent); + if (rootItem is null) + { + // Cant find root item + return ""; + } + + return rootItem.Template; } /** diff --git a/Libraries/Core/Models/Spt/Presets/PresetCacheDetails.cs b/Libraries/Core/Models/Spt/Presets/PresetCacheDetails.cs new file mode 100644 index 00000000..fcb6182b --- /dev/null +++ b/Libraries/Core/Models/Spt/Presets/PresetCacheDetails.cs @@ -0,0 +1,19 @@ +namespace Core.Models.Spt.Presets +{ + public record PresetCacheDetails + { + // Preset Ids related to the tpl + public HashSet PresetIds + { + get; + set; + } + + // Id of the default preset for this tpl + public string DefaultId + { + get; + set; + } + } +}