diff --git a/CustomizePlus/Api/CustomizePlusIpc.General.cs b/CustomizePlus/Api/CustomizePlusIpc.General.cs index b47b201..3402e13 100644 --- a/CustomizePlus/Api/CustomizePlusIpc.General.cs +++ b/CustomizePlus/Api/CustomizePlusIpc.General.cs @@ -4,7 +4,7 @@ namespace CustomizePlus.Api; public partial class CustomizePlusIpc { - private readonly (int Breaking, int Feature) _apiVersion = (5, 1); + private readonly (int Breaking, int Feature) _apiVersion = (5, 2); /// /// When there are breaking changes the first number is bumped up and second one is reset. diff --git a/CustomizePlus/Api/CustomizePlusIpc.Profile.cs b/CustomizePlus/Api/CustomizePlusIpc.Profile.cs index 80fc5b1..6eb17c5 100644 --- a/CustomizePlus/Api/CustomizePlusIpc.Profile.cs +++ b/CustomizePlus/Api/CustomizePlusIpc.Profile.cs @@ -283,24 +283,12 @@ public partial class CustomizePlusIpc else (activeProfile, oldProfile) = ((Profile?, Profile?))arg3; - if (activeProfile != null) - { - if (activeProfile == _profileManager.DefaultProfile || activeProfile.ProfileType == ProfileType.Editor) - { - //ignore any changes while player is in editor or if player changes between default profiles - //also do not send event if there were no active profile before - if (activeProfile == oldProfile || oldProfile == null) - return; + //do not send event if we are entering editor + if (activeProfile != null && activeProfile.ProfileType == ProfileType.Editor) + return; - OnProfileUpdateInternal(localPlayerCharacter, null); //send empty profile when player enters editor or turns on default profile - return; - } - } - - //do not send event if we are exiting editor or disabling default profile and don't have any active profile - if (oldProfile != null && - (oldProfile == _profileManager.DefaultProfile || oldProfile.ProfileType == ProfileType.Editor) && - activeProfile == null) + //do not send event if we are exiting editor + if (oldProfile != null && oldProfile.ProfileType == ProfileType.Editor) return; OnProfileUpdateInternal(localPlayerCharacter, activeProfile); @@ -309,8 +297,9 @@ public partial class CustomizePlusIpc if (type == ArmatureChanged.Type.Deleted) { - //Do not send event if default or editor profile was used - if (armature.Profile == _profileManager.DefaultProfile || armature.Profile.ProfileType == ProfileType.Editor) //todo: never send if ProfileType != normal? + //Do not send event if editor profile was used + //todo: never send if ProfileType != normal? + if (armature.Profile.ProfileType == ProfileType.Editor) return; OnProfileUpdateInternal(localPlayerCharacter, null); diff --git a/CustomizePlus/Armatures/Services/ArmatureManager.cs b/CustomizePlus/Armatures/Services/ArmatureManager.cs index 19e000e..aafac45 100644 --- a/CustomizePlus/Armatures/Services/ArmatureManager.cs +++ b/CustomizePlus/Armatures/Services/ArmatureManager.cs @@ -464,15 +464,17 @@ public unsafe sealed class ArmatureManager : IDisposable if (!profile.Enabled && profile.Armatures.Count == 0) return; - if (profile == _profileManager.DefaultProfile) + if (profile == _profileManager.DefaultProfile || + profile == _profileManager.DefaultLocalPlayerProfile) { foreach (var kvPair in Armatures) { var armature = kvPair.Value; - if (armature.Profile == profile) + if (armature.Profile == _profileManager.DefaultProfile || //not the best solution but w/e + armature.Profile == _profileManager.DefaultLocalPlayerProfile) armature.IsPendingProfileRebind = true; - _logger.Debug($"ArmatureManager.OnProfileChange default profile toggled, planning rebind for armature {armature}"); + _logger.Debug($"ArmatureManager.OnProfileChange default/default local player profile toggled, planning rebind for armature {armature}"); } return; diff --git a/CustomizePlus/Core/Services/CommandService.cs b/CustomizePlus/Core/Services/CommandService.cs index 5a1194d..8b8c770 100644 --- a/CustomizePlus/Core/Services/CommandService.cs +++ b/CustomizePlus/Core/Services/CommandService.cs @@ -14,6 +14,8 @@ using CustomizePlus.Profiles.Data; using CustomizePlus.Configuration.Data; using Dalamud.Interface.ImGuiNotification; using CustomizePlus.GameData.Extensions; +using System.Collections.Generic; +using ECommons; namespace CustomizePlus.Core.Services; @@ -168,8 +170,8 @@ public class CommandService : IDisposable break; } - //todo: support for multiple profiles Profile? targetProfile = null; + List profilesToDisable = new List(_profileManager.Profiles.Count); characterName = subArgumentList[0].Trim(); characterName = characterName switch @@ -184,12 +186,24 @@ public class CommandService : IDisposable if (!isTurningOffAllProfiles) { profileName = subArgumentList[1].Trim(); - targetProfile = _profileManager.Profiles.FirstOrDefault(x => x.Name == profileName && x.Characters.Any(x => x.ToNameWithoutOwnerName() == characterName)); + foreach(var profile in _profileManager.Profiles) + { + if (!profile.Characters.Any(x => x.ToNameWithoutOwnerName() == characterName)) + continue; + + if (profile.Name != profileName) + { + profilesToDisable.Add(profile); + continue; + } + + targetProfile = profile; + } } else - targetProfile = _profileManager.Profiles.FirstOrDefault(x => x.Characters.Any(x => x.ToNameWithoutOwnerName() == characterName) && x.Enabled); + profilesToDisable = _profileManager.Profiles.Where(x => x.Characters.Any(x => x.ToNameWithoutOwnerName() == characterName) && x.Enabled).ToList(); - if (targetProfile == null) + if (targetProfile == null || (isTurningOffAllProfiles && profilesToDisable.Count == 0)) { _chatService.PrintInChat(new SeStringBuilder() .AddText("Cannot execute command because profile ") @@ -219,6 +233,12 @@ public class CommandService : IDisposable else _profileManager.SetEnabled(targetProfile, !targetProfile.Enabled); + if(targetProfile.Enabled) + { + foreach (var profile in profilesToDisable) + _profileManager.SetEnabled(profile, false); + } + if (_pluginConfiguration.CommandSettings.PrintSuccessMessages) _chatService.PrintInChat(new SeStringBuilder() .AddText("Profile ") diff --git a/CustomizePlus/Core/Services/SupportLogBuilderService.cs b/CustomizePlus/Core/Services/SupportLogBuilderService.cs index 0114fff..063d42c 100644 --- a/CustomizePlus/Core/Services/SupportLogBuilderService.cs +++ b/CustomizePlus/Core/Services/SupportLogBuilderService.cs @@ -61,6 +61,7 @@ public class SupportLogBuilderService } sb.AppendLine("**Profiles**"); sb.Append($"> **`Default profile: `** {_profileManager.DefaultProfile?.ToString() ?? "None"}\n"); + sb.Append($"> **`Default local player profile: `** {_profileManager.DefaultLocalPlayerProfile?.ToString() ?? "None"}\n"); sb.Append($"> **`Count: `** {_profileManager.Profiles.Count}\n"); foreach (var profile in _profileManager.Profiles) { diff --git a/CustomizePlus/Profiles/ProfileManager.cs b/CustomizePlus/Profiles/ProfileManager.cs index 4db4f9e..d95a8a4 100644 --- a/CustomizePlus/Profiles/ProfileManager.cs +++ b/CustomizePlus/Profiles/ProfileManager.cs @@ -186,10 +186,6 @@ public partial class ProfileManager : IDisposable profile.Characters.Add(actorIdentifier); - //Called so all other active profiles for new character name get disabled - //saving is performed there - //SetEnabled(profile, profile.Enabled, true); //todo - SaveProfile(profile); _logger.Debug($"Add character for profile {profile.UniqueId}."); @@ -206,10 +202,6 @@ public partial class ProfileManager : IDisposable profile.Characters.Remove(actorIdentifier); - //Called so all other active profiles for new character name get disabled - //saving is performed there - //SetEnabled(profile, profile.Enabled, true); //todo - SaveProfile(profile); _logger.Debug($"Removed character from profile {profile.UniqueId}."); @@ -479,11 +471,6 @@ public partial class ProfileManager : IDisposable if (!actorIdentifier.IsValid) yield break; - var name = actorIdentifier.ToNameWithoutOwnerName(); - - if (name.IsNullOrWhitespace()) - yield break; - bool IsProfileAppliesToCurrentActor(Profile profile) { //default profile check is done later