From 55eb94f7da01227348bb6653eba1ee4e92e36fc1 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Thu, 9 Feb 2023 00:15:17 +0100 Subject: [PATCH] check availability of plugins implicitly --- .../Factories/CharacterDataFactory.cs | 36 ++++++++++++++----- MareSynchronos/Managers/IpcManager.cs | 36 +++++++++++++++---- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 4c0f913..67a1e71 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -11,23 +11,33 @@ using Object = FFXIVClientStructs.FFXIV.Client.Graphics.Scene.Object; using Penumbra.String; using Weapon = MareSynchronos.Interop.Weapon; using MareSynchronos.FileCache; +using MareSynchronos.Mediator; +using System.Collections.Concurrent; namespace MareSynchronos.Factories; -public class CharacterDataFactory +public class CharacterDataFactory : MediatorSubscriberBase { private readonly DalamudUtil _dalamudUtil; private readonly IpcManager _ipcManager; private readonly TransientResourceManager _transientResourceManager; private readonly FileCacheManager _fileCacheManager; + private ConcurrentQueue> _processingQueue = new(); - public CharacterDataFactory(DalamudUtil dalamudUtil, IpcManager ipcManager, TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory) + public CharacterDataFactory(DalamudUtil dalamudUtil, IpcManager ipcManager, TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(CharacterDataFactory)); _dalamudUtil = dalamudUtil; _ipcManager = ipcManager; _transientResourceManager = transientResourceManager; _fileCacheManager = fileReplacementFactory; + Mediator.Subscribe(this, (_) => + { + while (_processingQueue.TryDequeue(out var result)) + { + result.RunSynchronously(); + } + }); } private unsafe bool CheckForNullDrawObject(IntPtr playerPointer) @@ -74,10 +84,12 @@ public class CharacterDataFactory try { + _processingQueue.Clear(); return await CreateCharacterData(previousData, playerRelatedObject, token).ConfigureAwait(false); } catch (OperationCanceledException) { + _processingQueue.Clear(); Logger.Debug("Cancelled creating Character data"); throw; } @@ -121,17 +133,23 @@ public class CharacterDataFactory // gather up data from ipc previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); - previousData.GlamourerString[playerRelatedObject.ObjectKind] = await _dalamudUtil.RunOnFrameworkThread(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)) - .ConfigureAwait(false); - previousData.CustomizePlusScale = await _dalamudUtil.RunOnFrameworkThread(_ipcManager.GetCustomizePlusScale).ConfigureAwait(false); - previousData.PalettePlusPalette = await _dalamudUtil.RunOnFrameworkThread(_ipcManager.PalettePlusBuildPalette).ConfigureAwait(false); + Task getGlamourerData = new(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)); + _processingQueue.Enqueue(getGlamourerData); + Task getCustomizeData = new(() => _ipcManager.GetCustomizePlusScale()); + _processingQueue.Enqueue(getCustomizeData); + Task getPalettePlusData = new(() => _ipcManager.PalettePlusBuildPalette()); + _processingQueue.Enqueue(getPalettePlusData); + Task.WaitAll(new[] { getGlamourerData, getCustomizeData, getPalettePlusData }, token); + previousData.GlamourerString[playerRelatedObject.ObjectKind] = getGlamourerData.Result; + previousData.CustomizePlusScale = getCustomizeData.Result; + previousData.PalettePlusPalette = getPalettePlusData.Result; // gather static replacements from render model var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); Dictionary> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve); previousData.FileReplacements[objectKind] = - new HashSet(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) - .Where(p => p.HasFileReplacement).ToHashSet(); + new HashSet(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) + .Where(p => p.HasFileReplacement).ToHashSet(); Logger.Debug("== Static Replacements =="); foreach (var replacement in previousData.FileReplacements[objectKind].Where(i => i.HasFileReplacement).OrderBy(i => i.GamePaths.First(), StringComparer.OrdinalIgnoreCase)) @@ -340,6 +358,8 @@ public class CharacterDataFactory { if (string.IsNullOrEmpty(texPath)) return; + Logger.Verbose("Checking file Replacement for texture " + texPath); + if (doNotReverseResolve) forwardResolve.Add(texPath); else diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index 13fb493..ae8ec69 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -64,6 +64,12 @@ public class IpcManager : MediatorSubscriberBase, IDisposable private readonly ConcurrentQueue _normalQueue = new(); private readonly ConcurrentQueue _gposeActionQueue = new(); + private bool _penumbraAvailable = false; + private bool _glamourerAvailable = false; + private bool _customizePlusAvailable = false; + private bool _heelsAvailable = false; + private bool _palettePlusAvailable = false; + public IpcManager(DalamudPluginInterface pi, DalamudUtil dalamudUtil, MareMediator mediator) : base(mediator) { Logger.Verbose("Creating " + nameof(IpcManager)); @@ -139,6 +145,11 @@ public class IpcManager : MediatorSubscriberBase, IDisposable private void CheckPenumbraModPath() { PenumbraModDirectory = GetPenumbraModDirectory(); + _glamourerAvailable = CheckGlamourerApiInternal(); + _penumbraAvailable = CheckPenumbraApiInternal(); + _heelsAvailable = CheckHeelsApiInternal(); + _customizePlusAvailable = CheckCustomizePlusApiInternal(); + _palettePlusAvailable = CheckPalettePlusApiInternal(); } private void HandleGposeActionQueue() @@ -183,8 +194,11 @@ public class IpcManager : MediatorSubscriberBase, IDisposable } } - public bool Initialized => CheckPenumbraApi() && CheckGlamourerApi(); - public bool CheckGlamourerApi() + public bool Initialized => CheckPenumbraApiInternal() && CheckGlamourerApiInternal(); + + public bool CheckGlamourerApi() => _glamourerAvailable; + + public bool CheckGlamourerApiInternal() { try { @@ -196,7 +210,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable } } - public bool CheckPenumbraApi() + public bool CheckPenumbraApi() => _penumbraAvailable; + + public bool CheckPenumbraApiInternal() { try { @@ -208,7 +224,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable } } - public bool CheckHeelsApi() + public bool CheckHeelsApi() => _heelsAvailable; + + public bool CheckHeelsApiInternal() { try { @@ -220,7 +238,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable } } - public bool CheckCustomizePlusApi() + public bool CheckCustomizePlusApi() => _customizePlusAvailable; + + public bool CheckCustomizePlusApiInternal() { try { @@ -232,7 +252,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable } } - public bool CheckPalettePlusApi() + public bool CheckPalettePlusApi() => _palettePlusAvailable; + + public bool CheckPalettePlusApiInternal() { try { @@ -456,7 +478,7 @@ public class IpcManager : MediatorSubscriberBase, IDisposable var collName = "Mare_" + characterName; Logger.Verbose("Removing temp collection for " + collName); var ret = _penumbraRemoveTemporaryMod.Invoke("MareChara", collName, 0); - Logger.Verbose("RemoveTemporaryMod: " + ret); + Logger.Verbose("RemoveTemporaryMod: " + ret); var ret2 = _penumbraRemoveTemporaryCollection.Invoke(collName); Logger.Verbose("RemoveTemporaryCollection: " + ret2); });