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 /// /// /// public UserBuilds GetUserBuilds(string sessionID) { 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; } /// /// Handle client/builds/weapon/save /// /// /// public void SaveWeaponBuild(string sessionId, PresetBuildActionRequestData body) { throw new NotImplementedException(); } /// /// Handle client/builds/equipment/save event /// /// /// public void SaveEquipmentBuild(string sessionId, PresetBuildActionRequestData request) { throw new NotImplementedException(); } /// /// Handle client/builds/delete /// /// /// public void RemoveBuild(string sessionId, RemoveBuildRequestData request) { RemovePlayerBuild(request.Id, sessionId); } /// /// Handle client/builds/magazine/save /// /// /// public void CreateMagazineTemplate(string sessionId, SetMagazineRequest request) { throw new NotImplementedException(); } /// /// /// /// /// private void RemovePlayerBuild(string idToRemove, string sessionId) { throw new NotImplementedException(); } }