diff --git a/Glamourer/Events/PenumbraReloaded.cs b/Glamourer/Events/PenumbraReloaded.cs new file mode 100644 index 0000000..40a2527 --- /dev/null +++ b/Glamourer/Events/PenumbraReloaded.cs @@ -0,0 +1,23 @@ +using System; +using OtterGui.Classes; + +namespace Glamourer.Events; + +/// +/// Triggered when Penumbra is reloaded. +/// +public sealed class PenumbraReloaded : EventWrapper +{ + public enum Priority + { + /// + ChangeCustomizeService = 0, + } + + public PenumbraReloaded() + : base(nameof(PenumbraReloaded)) + { } + + public void Invoke() + => Invoke(this); +} diff --git a/Glamourer/Interop/ChangeCustomizeService.cs b/Glamourer/Interop/ChangeCustomizeService.cs index c494606..c12f608 100644 --- a/Glamourer/Interop/ChangeCustomizeService.cs +++ b/Glamourer/Interop/ChangeCustomizeService.cs @@ -3,6 +3,7 @@ using Dalamud.Hooking; using Dalamud.Utility.Signatures; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using Glamourer.Customization; +using Glamourer.Events; using Glamourer.Interop.Structs; using OtterGui.Classes; using CustomizeData = Penumbra.GameData.Structs.CustomizeData; @@ -16,30 +17,46 @@ namespace Glamourer.Interop; /// public unsafe class ChangeCustomizeService : EventWrapper>, ChangeCustomizeService.Priority> { + private readonly PenumbraReloaded _penumbraReloaded; + public enum Priority { /// StateListener = 0, } - public ChangeCustomizeService() + public ChangeCustomizeService(PenumbraReloaded penumbraReloaded) : base("ChangeCustomize") { - _changeCustomizeHook = - Hook.FromAddress((nint)Human.MemberFunctionPointers.UpdateDrawData, ChangeCustomizeDetour); - _changeCustomizeHook.Enable(); + _penumbraReloaded = penumbraReloaded; + _changeCustomizeHook = Create(); + _penumbraReloaded.Subscribe(Restore, PenumbraReloaded.Priority.ChangeCustomizeService); } public new void Dispose() { base.Dispose(); _changeCustomizeHook.Dispose(); + _penumbraReloaded.Unsubscribe(Restore); + } + + private void Restore() + { + _changeCustomizeHook.Dispose(); + _changeCustomizeHook = Create(); + } + + private Hook Create() + { + var ret = Hook.FromAddress((nint)Human.MemberFunctionPointers.UpdateDrawData, ChangeCustomizeDetour); + ret.Enable(); + return ret; } private delegate bool ChangeCustomizeDelegate(Human* human, byte* data, byte skipEquipment); [Signature(Sigs.ChangeCustomize, DetourName = nameof(ChangeCustomizeDetour))] - private readonly Hook _changeCustomizeHook; + private Hook _changeCustomizeHook; public bool UpdateCustomize(Model model, CustomizeData customize) { diff --git a/Glamourer/Interop/Penumbra/PenumbraService.cs b/Glamourer/Interop/Penumbra/PenumbraService.cs index 2e74630..b00aefd 100644 --- a/Glamourer/Interop/Penumbra/PenumbraService.cs +++ b/Glamourer/Interop/Penumbra/PenumbraService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using Dalamud.Logging; using Dalamud.Plugin; +using Glamourer.Events; using Glamourer.Interop.Structs; using Penumbra.Api; using Penumbra.Api.Enums; @@ -61,11 +62,15 @@ public unsafe class PenumbraService : IDisposable private readonly EventSubscriber _initializedEvent; private readonly EventSubscriber _disposedEvent; - public bool Available { get; private set; } - public PenumbraService(DalamudPluginInterface pi) + private readonly PenumbraReloaded _penumbraReloaded; + + public bool Available { get; private set; } + + public PenumbraService(DalamudPluginInterface pi, PenumbraReloaded penumbraReloaded) { _pluginInterface = pi; + _penumbraReloaded = penumbraReloaded; _initializedEvent = Ipc.Initialized.Subscriber(pi, Reattach); _disposedEvent = Ipc.Disposed.Subscriber(pi, Unattach); _tooltipSubscriber = Ipc.ChangedItemTooltip.Subscriber(pi); @@ -253,8 +258,8 @@ public unsafe class PenumbraService : IDisposable _setModPriority = Ipc.TrySetModPriority.Subscriber(_pluginInterface); _setModSetting = Ipc.TrySetModSetting.Subscriber(_pluginInterface); _setModSettings = Ipc.TrySetModSettings.Subscriber(_pluginInterface); - Available = true; + _penumbraReloaded.Invoke(); Glamourer.Log.Debug("Glamourer attached to Penumbra."); } catch (Exception e) diff --git a/Glamourer/Services/ServiceManager.cs b/Glamourer/Services/ServiceManager.cs index e0964be..4a02824 100644 --- a/Glamourer/Services/ServiceManager.cs +++ b/Glamourer/Services/ServiceManager.cs @@ -70,7 +70,8 @@ public static class ServiceManager .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddSingleton(); private static IServiceCollection AddData(this IServiceCollection services) => services.AddSingleton()