diff --git a/TickTracker/Helpers/Utilities.cs b/TickTracker/Helpers/Utilities.cs index 6b44835..2a8158a 100644 --- a/TickTracker/Helpers/Utilities.cs +++ b/TickTracker/Helpers/Utilities.cs @@ -95,19 +95,22 @@ public bool WindowCondition(WindowType window) /// /// Saves the size and position for the indicated . /// - public void UpdateWindowConfig(Vector2 currentPos, Vector2 currentSize, WindowType window) + public bool UpdateWindowConfig(Vector2 currentPos, Vector2 currentSize, WindowType window) { + var configChanged = false; if (window is WindowType.HpWindow) { if (!currentPos.Equals(config.HPBarPosition)) { config.HPBarPosition = currentPos; config.Save(pluginInterface); + configChanged = true; } if (!currentSize.Equals(config.HPBarSize)) { config.HPBarSize = currentSize; config.Save(pluginInterface); + configChanged = true; } } if (window is WindowType.MpWindow) @@ -116,11 +119,13 @@ public void UpdateWindowConfig(Vector2 currentPos, Vector2 currentSize, WindowTy { config.MPBarPosition = currentPos; config.Save(pluginInterface); + configChanged = true; } if (!currentSize.Equals(config.MPBarSize)) { config.MPBarSize = currentSize; config.Save(pluginInterface); + configChanged = true; } } if (window is WindowType.GpWindow) @@ -129,13 +134,16 @@ public void UpdateWindowConfig(Vector2 currentPos, Vector2 currentSize, WindowTy { config.GPBarPosition = currentPos; config.Save(pluginInterface); + configChanged = true; } if (!currentSize.Equals(config.GPBarSize)) { config.GPBarSize = currentSize; config.Save(pluginInterface); + configChanged = true; } } + return configChanged; } /// diff --git a/TickTracker/IPC/PenumbraEnums.cs b/TickTracker/IPC/PenumbraEnums.cs index c00020d..ec84be1 100644 --- a/TickTracker/IPC/PenumbraEnums.cs +++ b/TickTracker/IPC/PenumbraEnums.cs @@ -29,12 +29,29 @@ public enum PenumbraApiEc public enum ModSettingChange { + /// It was set to inherit from other collections or not to inherit anymore. Inheritance, + + /// It was enabled or disabled. EnableState, + + /// Its priority was changed. Priority, + + /// A specific setting for an option group was changed. Setting, + + /// Multiple mods were set to inherit from other collections or not inherit anymore at once. MultiInheritance, + + /// Multiple mods were enabled or disabled at once. MultiEnableState, + + /// A temporary mod was enabled or disabled. + TemporaryMod, + + /// A mod was edited. Only invoked on edits affecting the current players collection and for that for now. + Edited, } public enum ApiCollectionType : byte @@ -132,5 +149,3 @@ public enum ApiCollectionType : byte Interface = 0xE1, Current = 0xE2, } - - diff --git a/TickTracker/IPC/PenumbraIpc.cs b/TickTracker/IPC/PenumbraIpc.cs index cf0184d..6242fd4 100644 --- a/TickTracker/IPC/PenumbraIpc.cs +++ b/TickTracker/IPC/PenumbraIpc.cs @@ -27,15 +27,6 @@ public sealed class PenumbraIpc : IDisposable private readonly ICallGateSubscriber modSettingsChanged; private readonly (Guid Id, string Name) interfaceCollection; - [Obsolete("Changed with Penumbra API rework")] - private readonly ICallGateSubscriber oldInterfaceCollection; - [Obsolete("Changed with Penumbra API rework")] - private readonly ICallGateSubscriber> oldModList; - [Obsolete("Changed with Penumbra API rework")] - private readonly ICallGateSubscriber> optionDetails, bool settingsInherited)? settings)> oldModSettings; - [Obsolete("Changed with Penumbra API rework")] - private readonly ICallGateSubscriber oldModSettingsChanged; - public bool NativeUiBanned { get; private set; } private bool penumbraModsEnabled @@ -68,21 +59,12 @@ private bool penumbraModsEnabled } } -#pragma warning disable CS8618 public PenumbraIpc(DalamudPluginInterface _pluginInterface, IPluginLog _pluginLog) { log = _pluginLog; + apiVersions = _pluginInterface.GetIpcSubscriber<(int, int)>("Penumbra.ApiVersion.V5"); - try - { - apiVersions = _pluginInterface.GetIpcSubscriber<(int, int)>("Penumbra.ApiVersions"); - } - catch - { - apiVersions = _pluginInterface.GetIpcSubscriber<(int, int)>("Penumbra.ApiVersion"); - } - - if (penumbraApiVersion.Breaking is not 4 and not 5) + if (penumbraApiVersion.Breaking is not 5) { throw new NotSupportedException("Penumbra API out of date. Version " + penumbraApiVersion.Breaking.ToString(CultureInfo.InvariantCulture)); } @@ -91,24 +73,13 @@ public PenumbraIpc(DalamudPluginInterface _pluginInterface, IPluginLog _pluginLo penumbraInit = _pluginInterface.GetIpcSubscriber("Penumbra.Initialized"); penumbraDispose = _pluginInterface.GetIpcSubscriber("Penumbra.Disposed"); penumbraEnabledChange = _pluginInterface.GetIpcSubscriber?>("Penumbra.EnabledChange"); - if (penumbraApiVersion.Breaking is 4) - { - oldInterfaceCollection = _pluginInterface.GetIpcSubscriber("Penumbra.GetInterfaceCollectionName"); - oldModList = _pluginInterface.GetIpcSubscriber>("Penumbra.GetMods"); - oldModSettings = _pluginInterface.GetIpcSubscriber> optionDetails, bool settingsInherited)? settings)>("Penumbra.GetCurrentModSettings"); - oldModSettingsChanged = _pluginInterface.GetIpcSubscriber("Penumbra.ModSettingChanged"); - oldModSettingsChanged.Subscribe(OldCheckModChanges); - } - else if (penumbraApiVersion.Breaking is 5) - { - interfaceCollection = _pluginInterface.GetIpcSubscriber("Penumbra.GetCollection").InvokeFunc(ApiCollectionType.Interface); - modList = _pluginInterface.GetIpcSubscriber>("Penumbra.GetModList"); - modSettings = _pluginInterface.GetIpcSubscriber> optionDetails, bool ignoreInheritance)? settings)> - ("Penumbra.GetCurrentModSettings"); - modSettingsChanged = _pluginInterface.GetIpcSubscriber("Penumbra.ModSettingChanged"); - modSettingsChanged.Subscribe(CheckModChanges); - } + interfaceCollection = _pluginInterface.GetIpcSubscriber("Penumbra.GetCollection").InvokeFunc(ApiCollectionType.Interface); + modList = _pluginInterface.GetIpcSubscriber>("Penumbra.GetModList"); + modSettings = _pluginInterface.GetIpcSubscriber> optionDetails, bool ignoreInheritance)? settings)> + ("Penumbra.GetCurrentModSettings.V5"); + modSettingsChanged = _pluginInterface.GetIpcSubscriber("Penumbra.ModSettingChanged.V5"); + modSettingsChanged.Subscribe(CheckModChanges); penumbraEnabledChange.Subscribe(CheckState); penumbraInit.Subscribe(PenumbraInit); @@ -116,17 +87,13 @@ public PenumbraIpc(DalamudPluginInterface _pluginInterface, IPluginLog _pluginLo if (penumbraModsEnabled) { - NativeUiBanned = penumbraApiVersion.Breaking is 4 ? OldCheckMUIPresence(oldModList!.InvokeFunc(), oldInterfaceCollection!.InvokeFunc()) - : CheckMUIPresence(modList!.InvokeFunc(), interfaceCollection.Id); + NativeUiBanned = CheckMUIPresence(modList!.InvokeFunc(), interfaceCollection.Id); } } -#pragma warning restore CS8618 private void CheckState(bool penumbraEnabled) { - NativeUiBanned = penumbraEnabled - && penumbraApiVersion.Breaking == 4 ? OldCheckMUIPresence(oldModList.InvokeFunc(), oldInterfaceCollection.InvokeFunc()) - : CheckMUIPresence(modList.InvokeFunc(), interfaceCollection.Id); + NativeUiBanned = penumbraEnabled && CheckMUIPresence(modList.InvokeFunc(), interfaceCollection.Id); } private void CheckModChanges(ModSettingChange type, Guid collectionId, string modDirectory, bool inherited) @@ -163,70 +130,20 @@ private bool CheckMUIPresence(Dictionary modList, Guid collectio return false; } - - private void OldCheckModChanges(ModSettingChange type, string collectionName, string modDirectory, bool inherited) - { - if ((type is not ModSettingChange.EnableState && type is not ModSettingChange.Inheritance) || !oldInterfaceCollection.InvokeFunc().Equals(collectionName, StringComparison.Ordinal)) - { - return; - } - var currentMods = oldModList.InvokeFunc().Where(currentMod => currentMod.modDirectory.Equals(modDirectory, StringComparison.Ordinal)); - NativeUiBanned = OldCheckMUIPresence(currentMods, collectionName); - } - - private bool OldCheckMUIPresence(IEnumerable<(string modDirectory, string modName)> modList, string collection) - { - if (!modList.Any()) - { - return false; - } - foreach (var mod in modList) - { - if (!mod.modName.Contains("Material UI", StringComparison.OrdinalIgnoreCase) && !mod.modDirectory.Contains("Material UI", StringComparison.OrdinalIgnoreCase)) - { - continue; - } - var modDetails = oldModSettings.InvokeFunc(collection, mod.modDirectory, mod.modName, arg4: false); - if (modDetails.status is not PenumbraApiEc.Success || !modDetails.settings.HasValue) - { - log.Error("Failed to retrieve mod details. {stat}", modDetails.status); - continue; - } - return modDetails.settings.Value.modEnabled; - } - return false; - } - - private void PenumbraInit() { penumbraEnabledChange.Subscribe(CheckState); - if (penumbraApiVersion.Breaking is 4) - { - oldModSettingsChanged.Subscribe(OldCheckModChanges); - } - else if (penumbraApiVersion.Breaking is 5) - { - modSettingsChanged.Subscribe(CheckModChanges); - } + modSettingsChanged.Subscribe(CheckModChanges); if (penumbraModsEnabled) { - NativeUiBanned = penumbraApiVersion.Breaking is 4 ? OldCheckMUIPresence(oldModList.InvokeFunc(), oldInterfaceCollection.InvokeFunc()) - : CheckMUIPresence(modList.InvokeFunc(), interfaceCollection.Id); + NativeUiBanned = CheckMUIPresence(modList.InvokeFunc(), interfaceCollection.Id); } } private void PenumbraDispose() { penumbraEnabledChange.Unsubscribe(CheckState); - if (penumbraApiVersion.Breaking is 4) - { - oldModSettingsChanged.Unsubscribe(OldCheckModChanges); - } - else if (penumbraApiVersion.Breaking is 5) - { - modSettingsChanged.Unsubscribe(CheckModChanges); - } + modSettingsChanged.Unsubscribe(CheckModChanges); NativeUiBanned = false; } diff --git a/TickTracker/Windows/BarWindowBase.cs b/TickTracker/Windows/BarWindowBase.cs index f8dbf48..e240016 100644 --- a/TickTracker/Windows/BarWindowBase.cs +++ b/TickTracker/Windows/BarWindowBase.cs @@ -36,6 +36,8 @@ public abstract class BarWindowBase : Window public double PreviousProgress { get; set; } public Vector2 WindowPosition { get; protected set; } public Vector2 WindowSize { get; protected set; } + protected Vector2 ConfigPos { get; set; } + protected Vector2 ConfigSize { get; set; } private const FontAwesomeIcon RegenIcon = FontAwesomeIcon.Forward; private const FontAwesomeIcon FastIcon = FontAwesomeIcon.FastForward; @@ -144,4 +146,37 @@ protected void DrawProgress(double progress, Vector4 backgroundColor, Vector4 fi pos = iconPair.Value == invalidSize ? pos : pos - (iconPair.Value / 2); drawList.AddText(UiBuilder.IconFont, currentFontSize * 0.85f, pos, color, iconPair.Key); } + + protected void UpdateWindow() + { + var windowPos = ImGui.GetWindowPos(); + var windowSize = ImGui.GetWindowSize(); + if (config.LockBar) + { + WindowPosition = windowPos; + WindowSize = windowSize; + return; + } + if (IsFocused) + { + if (utilities.UpdateWindowConfig(windowPos, windowSize, WindowType)) + { + ConfigSize = windowSize; + ConfigPos = windowPos; + } + } + else + { + if (windowPos != ConfigPos) + { + ImGui.SetWindowPos(ConfigPos); + } + if (windowSize != ConfigSize) + { + ImGui.SetWindowSize(ConfigSize); + } + } + WindowPosition = windowPos; + WindowSize = windowSize; + } } diff --git a/TickTracker/Windows/GPBar.cs b/TickTracker/Windows/GPBar.cs index 537b5b9..b1320a6 100644 --- a/TickTracker/Windows/GPBar.cs +++ b/TickTracker/Windows/GPBar.cs @@ -8,13 +8,11 @@ namespace TickTracker.Windows; public class GPBar : BarWindowBase { private readonly Configuration config; - private readonly Utilities utilities; public GPBar(IClientState _clientState, IPluginLog _pluginLog, Utilities _utilities, Configuration _config) : base(_clientState, _pluginLog, _utilities, _config, WindowType.GpWindow, "GPBarWindow") { config = _config; - utilities = _utilities; - Size = config.GPBarSize; - Position = config.GPBarPosition; + Size = ConfigSize = config.GPBarSize; + Position = ConfigPos = config.GPBarPosition; } public override void Draw() @@ -22,33 +20,4 @@ public override void Draw() UpdateWindow(); DrawProgress(Progress, config.GPBarBackgroundColor, config.GPBarFillColor, config.GPBarBorderColor, config.GPIconColor); } - - private void UpdateWindow() - { - var windowPos = ImGui.GetWindowPos(); - var windowSize = ImGui.GetWindowSize(); - if (config.LockBar) - { - WindowPosition = windowPos; - WindowSize = windowSize; - return; - } - if (IsFocused) - { - utilities.UpdateWindowConfig(windowPos, windowSize, WindowType); - } - else - { - if (windowPos != config.GPBarPosition) - { - ImGui.SetWindowPos(config.GPBarPosition); - } - if (windowSize != config.GPBarSize) - { - ImGui.SetWindowSize(config.GPBarSize); - } - } - WindowPosition = windowPos; - WindowSize = windowSize; - } } diff --git a/TickTracker/Windows/HPBar.cs b/TickTracker/Windows/HPBar.cs index 3bf445e..84c6077 100644 --- a/TickTracker/Windows/HPBar.cs +++ b/TickTracker/Windows/HPBar.cs @@ -8,13 +8,11 @@ namespace TickTracker.Windows; public class HPBar : BarWindowBase { private readonly Configuration config; - private readonly Utilities utilities; public HPBar(IClientState _clientState, IPluginLog _pluginLog, Utilities _utilities, Configuration _config) : base(_clientState, _pluginLog, _utilities, _config, WindowType.HpWindow, "HPBarWindow") { config = _config; - utilities = _utilities; - Size = config.HPBarSize; - Position = config.HPBarPosition; + Size = ConfigSize = config.HPBarSize; + Position = ConfigPos = config.HPBarPosition; } public override void Draw() @@ -22,33 +20,4 @@ public override void Draw() UpdateWindow(); DrawProgress(Progress, config.HPBarBackgroundColor, config.HPBarFillColor, config.HPBarBorderColor, config.HPIconColor); } - - private void UpdateWindow() - { - var windowPos = ImGui.GetWindowPos(); - var windowSize = ImGui.GetWindowSize(); - if (config.LockBar) - { - WindowPosition = windowPos; - WindowSize = windowSize; - return; - } - if (IsFocused) - { - utilities.UpdateWindowConfig(windowPos, windowSize, WindowType); - } - else - { - if (windowPos != config.HPBarPosition) - { - ImGui.SetWindowPos(config.HPBarPosition); - } - if (windowSize != config.HPBarSize) - { - ImGui.SetWindowSize(config.HPBarSize); - } - } - WindowPosition = windowPos; - WindowSize = windowSize; - } } diff --git a/TickTracker/Windows/MPBar.cs b/TickTracker/Windows/MPBar.cs index cfdb1dd..342044c 100644 --- a/TickTracker/Windows/MPBar.cs +++ b/TickTracker/Windows/MPBar.cs @@ -8,13 +8,11 @@ namespace TickTracker.Windows; public class MPBar : BarWindowBase { private readonly Configuration config; - private readonly Utilities utilities; public MPBar(IClientState _clientState, IPluginLog _pluginLog, Utilities _utilities, Configuration _config) : base(_clientState, _pluginLog, _utilities, _config, WindowType.MpWindow, "MPBarWindow") { config = _config; - utilities = _utilities; - Size = config.MPBarSize; - Position = config.MPBarPosition; + Size = ConfigSize = config.MPBarSize; + Position = ConfigPos = config.MPBarPosition; } public override void Draw() @@ -22,33 +20,4 @@ public override void Draw() UpdateWindow(); DrawProgress(Progress, config.MPBarBackgroundColor, config.MPBarFillColor, config.MPBarBorderColor, config.MPIconColor); } - - private void UpdateWindow() - { - var windowPos = ImGui.GetWindowPos(); - var windowSize = ImGui.GetWindowSize(); - if (config.LockBar) - { - WindowPosition = windowPos; - WindowSize = windowSize; - return; - } - if (IsFocused) - { - utilities.UpdateWindowConfig(windowPos, windowSize, WindowType); - } - else - { - if (windowPos != config.MPBarPosition) - { - ImGui.SetWindowPos(config.MPBarPosition); - } - if (windowSize != config.MPBarSize) - { - ImGui.SetWindowSize(config.MPBarSize); - } - } - WindowPosition = windowPos; - WindowSize = windowSize; - } }