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()