From 93c17e4972cf015760165c6504a96136cd1a7d60 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Mon, 20 May 2024 13:59:16 +0200 Subject: [PATCH] implement new penumbra and glamourer api probably --- .../Interop/Ipc/IpcCallerGlamourer.cs | 171 ++++++++++++------ .../Interop/Ipc/IpcCallerPenumbra.cs | 127 ++++++++++--- MareSynchronos/MareSynchronos.csproj | 2 +- .../PlayerData/Factories/PlayerDataFactory.cs | 2 +- 4 files changed, 221 insertions(+), 81 deletions(-) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs index fc11c98..2aa4dd9 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs @@ -1,6 +1,7 @@ using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Interface.Internal.Notifications; using Dalamud.Plugin; +using Dalamud.Plugin.Ipc; using Glamourer.Api.Helpers; using Glamourer.Api.IpcSubscribers; using MareSynchronos.PlayerData.Handlers; @@ -11,7 +12,13 @@ using Microsoft.Extensions.Logging; namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerGlamourer : IIpcCaller -{ +{ + private readonly ILogger _logger; + private readonly DalamudPluginInterface _pi; + private readonly DalamudUtilService _dalamudUtil; + private readonly MareMediator _mareMediator; + private readonly RedrawManager _redrawManager; + private readonly ApiVersion _glamourerApiVersions; private readonly ApplyState? _glamourerApplyAll; private readonly GetStateBase64? _glamourerGetAllCustomization; @@ -19,14 +26,19 @@ public sealed class IpcCallerGlamourer : IIpcCaller private readonly RevertStateName _glamourerRevertByName; private readonly UnlockState _glamourerUnlock; private readonly UnlockStateName _glamourerUnlockByName; - private readonly EventSubscriber _glamourerStateChanged; - private readonly ILogger _logger; - private readonly DalamudPluginInterface _pi; - private readonly DalamudUtilService _dalamudUtil; - private readonly MareMediator _mareMediator; - private readonly RedrawManager _redrawManager; + private readonly EventSubscriber? _glamourerStateChanged; + + private readonly Glamourer.Api.IpcSubscribers.Legacy.ApiVersions _glamourerApiVersionLegacy; + private readonly ICallGateSubscriber? _glamourerApplyAllLegacy; + private readonly ICallGateSubscriber? _glamourerGetAllCustomizationLegacy; + private readonly ICallGateSubscriber _glamourerRevertLegacy; + private readonly Glamourer.Api.IpcSubscribers.Legacy.RevertLock _glamourerRevertByNameLegacy; + private readonly Glamourer.Api.IpcSubscribers.Legacy.UnlockName _glamourerUnlockLegacy; + private readonly EventSubscriber>? _glamourerStateChangedLegacy; + private bool _shownGlamourerUnavailable = false; - private readonly uint LockCode = 0x6D617265; + private bool _useLegacyGlamourer = false; + private readonly uint LockCode = 0x6D617265; public IpcCallerGlamourer(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, RedrawManager redrawManager) @@ -37,16 +49,32 @@ public sealed class IpcCallerGlamourer : IIpcCaller _glamourerRevert = new RevertState(pi); _glamourerRevertByName = new RevertStateName(pi); _glamourerUnlock = new UnlockState(pi); - _glamourerUnlockByName = new UnlockStateName(pi); + _glamourerUnlockByName = new UnlockStateName(pi); - _glamourerStateChanged = StateChanged.Subscriber(pi, GlamourerChanged); - _glamourerStateChanged.Enable(); + _glamourerApiVersionLegacy = new(pi); + _glamourerApplyAllLegacy = pi.GetIpcSubscriber("Glamourer.ApplyAllToCharacterLock"); + _glamourerGetAllCustomizationLegacy = pi.GetIpcSubscriber("Glamourer.GetAllCustomizationFromCharacter"); + _glamourerRevertLegacy = pi.GetIpcSubscriber("Glamourer.RevertCharacterLock"); + _glamourerRevertByNameLegacy = new(pi); + _glamourerUnlockLegacy = new(pi); + _logger = logger; _pi = pi; _dalamudUtil = dalamudUtil; _mareMediator = mareMediator; _redrawManager = redrawManager; - CheckAPI(); + CheckAPI(); + + if (_useLegacyGlamourer) + { + _glamourerStateChangedLegacy = Glamourer.Api.IpcSubscribers.Legacy.StateChanged.Subscriber(pi, (t, a, c) => GlamourerChanged(a)); + _glamourerStateChangedLegacy.Enable(); + } + else + { + _glamourerStateChanged = StateChanged.Subscriber(pi, GlamourerChanged); + _glamourerStateChanged.Enable(); + } } public bool APIAvailable { get; private set; } @@ -56,13 +84,25 @@ public sealed class IpcCallerGlamourer : IIpcCaller bool apiAvailable = false; try { - var version = _glamourerApiVersions.Invoke(); bool versionValid = (_pi.InstalledPlugins .FirstOrDefault(p => string.Equals(p.InternalName, "Glamourer", StringComparison.OrdinalIgnoreCase)) - ?.Version ?? new Version(0, 0, 0, 0)) >= new Version(1, 2, 1, 4); - if (version is { Major: 1, Minor: >= 1 } && versionValid) - { - apiAvailable = true; + ?.Version ?? new Version(0, 0, 0, 0)) >= new Version(1, 0, 6, 1); + try + { + var version = _glamourerApiVersions.Invoke(); + if (version is { Major: 1, Minor: >= 1 } && versionValid) + { + apiAvailable = true; + } + } + catch + { + var version = _glamourerApiVersionLegacy.Invoke(); + if (version is { Major: 0, Minor: >= 1 } && versionValid) + { + apiAvailable = true; + _useLegacyGlamourer = true; + } } _shownGlamourerUnavailable = _shownGlamourerUnavailable && !apiAvailable; @@ -85,7 +125,8 @@ public sealed class IpcCallerGlamourer : IIpcCaller public void Dispose() { - _glamourerStateChanged.Dispose(); + _glamourerStateChanged?.Dispose(); + _glamourerStateChangedLegacy?.Dispose(); } public async Task ApplyAllAsync(ILogger logger, GameObjectHandler handler, string? customization, Guid applicationId, CancellationToken token, bool fireAndForget = false) @@ -101,12 +142,19 @@ public sealed class IpcCallerGlamourer : IIpcCaller { try { - logger.LogDebug("[{appid}] Calling on IPC: GlamourerApplyAll", applicationId); - _glamourerApplyAll!.Invoke(customization, chara.ObjectIndex, LockCode); + logger.LogDebug("[{appid}] Calling on IPC: GlamourerApplyAll", applicationId); + if (_useLegacyGlamourer) + { + _glamourerApplyAllLegacy.InvokeAction(customization, chara, LockCode); + } + else + { + _glamourerApplyAll!.Invoke(customization, chara.ObjectIndex, LockCode); + } } - catch (Exception) + catch (Exception ex) { - logger.LogWarning("[{appid}] Failed to apply Glamourer data", applicationId); + logger.LogWarning(ex, "[{appid}] Failed to apply Glamourer data", applicationId); } }).ConfigureAwait(false); } @@ -125,8 +173,11 @@ public sealed class IpcCallerGlamourer : IIpcCaller { var gameObj = _dalamudUtil.CreateGameObject(character); if (gameObj is Character c) - { - return _glamourerGetAllCustomization!.Invoke(c.ObjectIndex).Item2 ?? string.Empty; + { + if (_useLegacyGlamourer) + return _glamourerGetAllCustomizationLegacy.InvokeFunc(c) ?? string.Empty; + else + return _glamourerGetAllCustomization!.Invoke(c.ObjectIndex).Item2 ?? string.Empty; } return string.Empty; }).ConfigureAwait(false); @@ -146,12 +197,24 @@ public sealed class IpcCallerGlamourer : IIpcCaller await _redrawManager.PenumbraRedrawInternalAsync(logger, handler, applicationId, (chara) => { try - { - logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); - _glamourerUnlock.Invoke(chara.ObjectIndex, LockCode); - logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevert", applicationId); - _glamourerRevert.Invoke(chara.ObjectIndex, LockCode); - logger.LogDebug("[{appid}] Calling On IPC: PenumbraRedraw", applicationId); + { + if (_useLegacyGlamourer) + { + logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); + _glamourerUnlockLegacy.Invoke(name, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevert", applicationId); + _glamourerRevertLegacy.InvokeAction(chara, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: PenumbraRedraw", applicationId); + } + else + { + logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); + _glamourerUnlock.Invoke(chara.ObjectIndex, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevert", applicationId); + _glamourerRevert.Invoke(chara.ObjectIndex, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: PenumbraRedraw", applicationId); + } + _mareMediator.Publish(new PenumbraRedrawCharacterMessage(chara)); } catch (Exception ex) @@ -171,34 +234,36 @@ public sealed class IpcCallerGlamourer : IIpcCaller if ((!APIAvailable) || _dalamudUtil.IsZoning) return; await _dalamudUtil.RunOnFrameworkThread(() => - { - try - { - logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevertByName", applicationId); - _glamourerRevertByName.Invoke(name, LockCode); - logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); - _glamourerUnlockByName.Invoke(name, LockCode); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during Glamourer RevertByName"); - } + { + RevertByName(logger, name, applicationId); + }).ConfigureAwait(false); } public void RevertByName(ILogger logger, string name, Guid applicationId) { - if ((!APIAvailable) || _dalamudUtil.IsZoning) return; - try - { - logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevertByName", applicationId); - _glamourerRevertByName.Invoke(name, LockCode); - logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); - _glamourerUnlockByName.Invoke(name, LockCode); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Error during Glamourer RevertByName"); + if ((!APIAvailable) || _dalamudUtil.IsZoning) return; + + try + { + if (_useLegacyGlamourer) + { + logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevertByName", applicationId); + _glamourerRevertByNameLegacy.Invoke(name, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); + _glamourerUnlockLegacy.Invoke(name, LockCode); + } + else + { + logger.LogDebug("[{appid}] Calling On IPC: GlamourerRevertByName", applicationId); + _glamourerRevertByName.Invoke(name, LockCode); + logger.LogDebug("[{appid}] Calling On IPC: GlamourerUnlockName", applicationId); + _glamourerUnlockByName.Invoke(name, LockCode); + } + } + catch (Exception ex) + { + _logger.LogWarning(ex, "Error during Glamourer RevertByName"); } } diff --git a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs index c65966e..da29ee9 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs @@ -17,7 +17,8 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; private readonly RedrawManager _redrawManager; - private bool _shownPenumbraUnavailable = false; + private bool _shownPenumbraUnavailable = false; + private bool _useLegacyPenumbraApi = false; private string? _penumbraModDirectory; public string? ModDirectory { @@ -51,7 +52,16 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa private readonly RemoveTemporaryMod _penumbraRemoveTemporaryMod; private readonly GetModDirectory _penumbraResolveModDir; private readonly ResolvePlayerPathsAsync _penumbraResolvePaths; - private readonly GetGameObjectResourcePaths _penumbraResourcePaths; + private readonly GetGameObjectResourcePaths _penumbraResourcePaths; + private readonly ApiVersion _penumbraApiVersion; + + private readonly Penumbra.Api.IpcSubscribers.Legacy.AddTemporaryMod _penumbraAddTemporaryModLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.RemoveTemporaryMod _penumbraRemoveTemporaryModLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.CreateNamedTemporaryCollection _penumbraCreateNamedTemporaryCollectionLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.AssignTemporaryCollection _penumbraAssignTemporaryCollectionLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.RemoveTemporaryCollectionByName _penumbraRemoveTemporaryCollectionLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.RedrawObjectByIndex _penumbraRedrawLegacy; + private readonly Penumbra.Api.IpcSubscribers.Legacy.GetGameObjectResourcePaths _penumbraResourcePathsLegacy; public IpcCallerPenumbra(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, RedrawManager redrawManager) : base(logger, mareMediator) @@ -79,14 +89,29 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa _mareMediator.Publish(new PenumbraModSettingChangedMessage()); }); _penumbraConvertTextureFile = new ConvertTextureFile(pi); - _penumbraResourcePaths = new GetGameObjectResourcePaths(pi); + _penumbraResourcePaths = new GetGameObjectResourcePaths(pi); + _penumbraApiVersion = new(pi); + + _penumbraAddTemporaryModLegacy = new(pi); + _penumbraAssignTemporaryCollectionLegacy = new(pi); + _penumbraCreateNamedTemporaryCollectionLegacy = new(pi); + _penumbraRemoveTemporaryCollectionLegacy = new(pi); + _penumbraRedrawLegacy = new(pi); + _penumbraRemoveTemporaryModLegacy = new(pi); + _penumbraResourcePathsLegacy = new(pi); _penumbraGameObjectResourcePathResolved = GameObjectResourcePathResolved.Subscriber(pi, ResourceLoaded); CheckAPI(); CheckModDirectory(); - Mediator.Subscribe(this, (msg) => _penumbraRedraw.Invoke(msg.Character.ObjectIndex, RedrawType.AfterGPose)); + Mediator.Subscribe(this, (msg) => + { + if (_useLegacyPenumbraApi) + _penumbraRedrawLegacy.Invoke(msg.Character.ObjectIndex, RedrawType.AfterGPose); + else + _penumbraRedraw.Invoke(msg.Character.ObjectIndex, RedrawType.AfterGPose); + }); } public bool APIAvailable { get; private set; } = false; @@ -95,10 +120,19 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa { bool penumbraAvailable = false; try - { - penumbraAvailable = (_pi.InstalledPlugins + { + var penumbraVersion = (_pi.InstalledPlugins .FirstOrDefault(p => string.Equals(p.InternalName, "Penumbra", StringComparison.OrdinalIgnoreCase)) - ?.Version ?? new Version(0, 0, 0, 0)) >= new Version(1, 0, 2, 7); + ?.Version ?? new Version(0, 0, 0, 0)); + penumbraAvailable = penumbraVersion >= new Version(1, 0, 1, 0); + try + { + _ = _penumbraApiVersion.Invoke(); + } + catch + { + _useLegacyPenumbraApi = true; + } penumbraAvailable &= _penumbraEnabled.Invoke(); _shownPenumbraUnavailable = _shownPenumbraUnavailable && !penumbraAvailable; APIAvailable = penumbraAvailable; @@ -150,7 +184,9 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa await _dalamudUtil.RunOnFrameworkThread(() => { - var retAssign = _penumbraAssignTemporaryCollection.Invoke(collName, idx, forceAssignment: true); + var retAssign = _useLegacyPenumbraApi + ? _penumbraAssignTemporaryCollectionLegacy.Invoke(collName.ToString(), idx, true) + : _penumbraAssignTemporaryCollection.Invoke(collName, idx, forceAssignment: true); logger.LogTrace("Assigning Temp Collection {collName} to index {idx}, Success: {ret}", collName, idx, retAssign); return collName; }).ConfigureAwait(false); @@ -191,8 +227,11 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObject = await _dalamudUtil.CreateGameObjectAsync(await _dalamudUtil.GetPlayerPointerAsync().ConfigureAwait(false)).ConfigureAwait(false); - _penumbraRedraw.Invoke(gameObject!.ObjectIndex, setting: RedrawType.Redraw); + var gameObject = await _dalamudUtil.CreateGameObjectAsync(await _dalamudUtil.GetPlayerPointerAsync().ConfigureAwait(false)).ConfigureAwait(false); + if (_useLegacyPenumbraApi) + _penumbraRedrawLegacy.Invoke(gameObject!.ObjectIndex, RedrawType.Redraw); + else + _penumbraRedraw.Invoke(gameObject!.ObjectIndex, setting: RedrawType.Redraw); }).ConfigureAwait(false); } @@ -201,15 +240,26 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa if (!APIAvailable) return Guid.Empty; return await _dalamudUtil.RunOnFrameworkThread(() => - { - var collName = "Mare_" + uid; - var collId = _penumbraCreateNamedTemporaryCollection.Invoke(collName); - logger.LogTrace("Creating Temp Collection {collName}, GUID: {collId}", collName, collId); - return collId; + { + if (!_useLegacyPenumbraApi) + { + var collName = "Mare_" + uid; + var collId = _penumbraCreateNamedTemporaryCollection.Invoke(collName); + logger.LogTrace("Creating Temp Collection {collName}, GUID: {collId}", collName, collId); + return collId; + } + else + { + var collid = Guid.NewGuid(); + _penumbraCreateNamedTemporaryCollectionLegacy.Invoke(collid.ToString()); + logger.LogTrace("Creating Temp Collection {collName}", collid); + return collid; + } + }).ConfigureAwait(false); } - public async Task>?[]?> GetCharacterData(ILogger logger, GameObjectHandler handler) + public async Task>?> GetCharacterData(ILogger logger, GameObjectHandler handler) { if (!APIAvailable) return null; @@ -217,8 +267,17 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa { logger.LogTrace("Calling On IPC: Penumbra.GetGameObjectResourcePaths"); var idx = handler.GetGameObject()?.ObjectIndex; - if (idx == null) return null; - return _penumbraResourcePaths.Invoke(idx.Value); + if (idx == null) return null; + if (_useLegacyPenumbraApi) + { + IReadOnlyDictionary?[] ret = _penumbraResourcePathsLegacy.Invoke(idx.Value); + if (!ret.Any()) return null; + return ret[0]!.ToDictionary(r => r.Key, r => new HashSet(r.Value)); + } + else + { + return _penumbraResourcePaths.Invoke(idx.Value)[0]; + } }).ConfigureAwait(false); } @@ -236,8 +295,12 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa await _redrawManager.RedrawSemaphore.WaitAsync(token).ConfigureAwait(false); await _redrawManager.PenumbraRedrawInternalAsync(logger, handler, applicationId, (chara) => { - logger.LogDebug("[{appid}] Calling on IPC: PenumbraRedraw", applicationId); - _penumbraRedraw!.Invoke(chara.ObjectIndex, setting: RedrawType.Redraw); + logger.LogDebug("[{appid}] Calling on IPC: PenumbraRedraw", applicationId); + if (_useLegacyPenumbraApi) + _penumbraRedrawLegacy.Invoke(chara.ObjectIndex, RedrawType.Redraw); + else + _penumbraRedraw!.Invoke(chara.ObjectIndex, setting: RedrawType.Redraw); + }).ConfigureAwait(false); } finally @@ -252,7 +315,9 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa await _dalamudUtil.RunOnFrameworkThread(() => { logger.LogTrace("[{applicationId}] Removing temp collection for {collId}", applicationId, collId); - var ret2 = _penumbraRemoveTemporaryCollection.Invoke(collId); + var ret2 = _useLegacyPenumbraApi + ? _penumbraRemoveTemporaryCollectionLegacy.Invoke(collId.ToString()) + : _penumbraRemoveTemporaryCollection.Invoke(collId); logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2); }).ConfigureAwait(false); } @@ -269,7 +334,9 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa await _dalamudUtil.RunOnFrameworkThread(() => { logger.LogTrace("[{applicationId}] Manip: {data}", applicationId, manipulationData); - var retAdd = _penumbraAddTemporaryMod.Invoke("MareChara_Meta", collId, [], manipulationData, 0); + var retAdd = _useLegacyPenumbraApi + ? _penumbraAddTemporaryModLegacy.Invoke("MareChara_Meta", collId.ToString(), [], manipulationData, 0) + : _penumbraAddTemporaryMod.Invoke("MareChara_Meta", collId, [], manipulationData, 0); logger.LogTrace("[{applicationId}] Setting temp meta mod for {collId}, Success: {ret}", applicationId, collId, retAdd); }).ConfigureAwait(false); } @@ -284,9 +351,13 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa { logger.LogTrace("[{applicationId}] Change: {from} => {to}", applicationId, mod.Key, mod.Value); } - var retRemove = _penumbraRemoveTemporaryMod.Invoke("MareChara_Files", collId, 0); + var retRemove = _useLegacyPenumbraApi + ? _penumbraRemoveTemporaryModLegacy.Invoke("MareChara_Files", collId.ToString(), 0) + : _penumbraRemoveTemporaryMod.Invoke("MareChara_Files", collId, 0); logger.LogTrace("[{applicationId}] Removing temp files mod for {collId}, Success: {ret}", applicationId, collId, retRemove); - var retAdd = _penumbraAddTemporaryMod.Invoke("MareChara_Files", collId, modPaths, string.Empty, 0); + var retAdd = _useLegacyPenumbraApi + ? _penumbraAddTemporaryModLegacy.Invoke("MareChara_Files", collId.ToString(), modPaths, string.Empty, 0) + : _penumbraAddTemporaryMod.Invoke("MareChara_Files", collId, modPaths, string.Empty, 0); logger.LogTrace("[{applicationId}] Setting temp files mod for {collId}, Success: {ret}", applicationId, collId, retAdd); }).ConfigureAwait(false); } @@ -322,7 +393,11 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa { APIAvailable = true; ModDirectory = _penumbraResolveModDir.Invoke(); - _mareMediator.Publish(new PenumbraInitializedMessage()); - _penumbraRedraw!.Invoke(0, setting: RedrawType.Redraw); + _mareMediator.Publish(new PenumbraInitializedMessage()); + if (_useLegacyPenumbraApi) + _penumbraRedrawLegacy.Invoke(0, RedrawType.Redraw); + else + _penumbraRedraw!.Invoke(0, setting: RedrawType.Redraw); + } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 4107f94..9a07482 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -40,7 +40,7 @@ - + diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index c3bd996..288194c 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -149,7 +149,7 @@ public class PlayerDataFactory // penumbra call, it's currently broken Dictionary>? resolvedPaths; - resolvedPaths = (await _ipcManager.Penumbra.GetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))?[0]; + resolvedPaths = (await _ipcManager.Penumbra.GetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false)); if (resolvedPaths == null) throw new InvalidOperationException("Penumbra returned null data"); previousData.FileReplacements[objectKind] =