diff --git a/Core/Controllers/BuildController.cs b/Core/Controllers/BuildController.cs index 19cbd15a..eb63146f 100644 --- a/Core/Controllers/BuildController.cs +++ b/Core/Controllers/BuildController.cs @@ -1,13 +1,31 @@ using Core.Annotations; +using Core.Helpers; using Core.Models.Eft.Builds; using Core.Models.Eft.PresetBuild; using Core.Models.Eft.Profile; +using Core.Models.Enums; +using Core.Services; +using Core.Utils.Cloners; namespace Core.Controllers; [Injectable] public class BuildController { + protected ProfileHelper _profileHelper; + protected DatabaseService _databaseService; + protected ICloner _cloner; + + public BuildController( + ProfileHelper profileHelper, + DatabaseService databaseService, + ICloner cloner) + { + _profileHelper = profileHelper; + _databaseService = databaseService; + _cloner = cloner; + } + /// /// Handle client/handbook/builds/my/list /// @@ -15,7 +33,45 @@ public class BuildController /// public UserBuilds GetUserBuilds(string sessionID) { - throw new NotImplementedException(); + var secureContainerSlotId = "SecuredContainer"; + var profile = _profileHelper.GetFullProfile(sessionID); + if (profile.UserBuildData is null) + { + profile.UserBuildData = new UserBuilds{ EquipmentBuilds = [], WeaponBuilds = [], MagazineBuilds = [] }; + } + + // Ensure the secure container in the default presets match what the player has equipped + var defaultEquipmentPresetsClone = _cloner.Clone( + _databaseService.GetTemplates().DefaultEquipmentPresets); + var playerSecureContainer = profile.CharacterData.PmcData.Inventory.Items?.FirstOrDefault( + (x) => x.SlotId == secureContainerSlotId); + var firstDefaultItemsSecureContainer = defaultEquipmentPresetsClone[0]?.Items?.FirstOrDefault( + (x) => x.SlotId == secureContainerSlotId); + if (playerSecureContainer is not null && playerSecureContainer?.Template != firstDefaultItemsSecureContainer?.Template) + { + // Default equipment presets' secure container tpl doesn't match players secure container tpl + foreach (var defaultPreset in defaultEquipmentPresetsClone) { + // Find presets secure container + var secureContainer = defaultPreset.Items.FirstOrDefault((item) => item.SlotId == secureContainerSlotId); + if (secureContainer is not null) + { + secureContainer.Template = playerSecureContainer.Template; + } + } + } + + // Clone player build data from profile and append the above defaults onto end + var userBuildsClone = _cloner.Clone(profile.UserBuildData); + userBuildsClone.EquipmentBuilds.AddRange(defaultEquipmentPresetsClone.Select(x => new EquipmentBuild + { + Id = x.Id, + BuildType = x.BuildType, + Items = x.Items, + Name = x.Name, + Root = x.Root + })); + + return userBuildsClone; } ///