check availability of plugins implicitly

This commit is contained in:
rootdarkarchon
2023-02-09 00:15:17 +01:00
parent 9b46117db8
commit 55eb94f7da
2 changed files with 57 additions and 15 deletions

View File

@@ -11,23 +11,33 @@ using Object = FFXIVClientStructs.FFXIV.Client.Graphics.Scene.Object;
using Penumbra.String; using Penumbra.String;
using Weapon = MareSynchronos.Interop.Weapon; using Weapon = MareSynchronos.Interop.Weapon;
using MareSynchronos.FileCache; using MareSynchronos.FileCache;
using MareSynchronos.Mediator;
using System.Collections.Concurrent;
namespace MareSynchronos.Factories; namespace MareSynchronos.Factories;
public class CharacterDataFactory public class CharacterDataFactory : MediatorSubscriberBase
{ {
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly TransientResourceManager _transientResourceManager; private readonly TransientResourceManager _transientResourceManager;
private readonly FileCacheManager _fileCacheManager; private readonly FileCacheManager _fileCacheManager;
private ConcurrentQueue<Task<string>> _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)); Logger.Verbose("Creating " + nameof(CharacterDataFactory));
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_ipcManager = ipcManager; _ipcManager = ipcManager;
_transientResourceManager = transientResourceManager; _transientResourceManager = transientResourceManager;
_fileCacheManager = fileReplacementFactory; _fileCacheManager = fileReplacementFactory;
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) =>
{
while (_processingQueue.TryDequeue(out var result))
{
result.RunSynchronously();
}
});
} }
private unsafe bool CheckForNullDrawObject(IntPtr playerPointer) private unsafe bool CheckForNullDrawObject(IntPtr playerPointer)
@@ -74,10 +84,12 @@ public class CharacterDataFactory
try try
{ {
_processingQueue.Clear();
return await CreateCharacterData(previousData, playerRelatedObject, token).ConfigureAwait(false); return await CreateCharacterData(previousData, playerRelatedObject, token).ConfigureAwait(false);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
_processingQueue.Clear();
Logger.Debug("Cancelled creating Character data"); Logger.Debug("Cancelled creating Character data");
throw; throw;
} }
@@ -121,17 +133,23 @@ public class CharacterDataFactory
// gather up data from ipc // gather up data from ipc
previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations();
previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); previousData.HeelsOffset = _ipcManager.GetHeelsOffset();
previousData.GlamourerString[playerRelatedObject.ObjectKind] = await _dalamudUtil.RunOnFrameworkThread(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)) Task<string> getGlamourerData = new(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address));
.ConfigureAwait(false); _processingQueue.Enqueue(getGlamourerData);
previousData.CustomizePlusScale = await _dalamudUtil.RunOnFrameworkThread(_ipcManager.GetCustomizePlusScale).ConfigureAwait(false); Task<string> getCustomizeData = new(() => _ipcManager.GetCustomizePlusScale());
previousData.PalettePlusPalette = await _dalamudUtil.RunOnFrameworkThread(_ipcManager.PalettePlusBuildPalette).ConfigureAwait(false); _processingQueue.Enqueue(getCustomizeData);
Task<string> 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 // gather static replacements from render model
var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token);
Dictionary<string, List<string>> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve); Dictionary<string, List<string>> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve);
previousData.FileReplacements[objectKind] = previousData.FileReplacements[objectKind] =
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance)
.Where(p => p.HasFileReplacement).ToHashSet(); .Where(p => p.HasFileReplacement).ToHashSet();
Logger.Debug("== Static Replacements =="); Logger.Debug("== Static Replacements ==");
foreach (var replacement in previousData.FileReplacements[objectKind].Where(i => i.HasFileReplacement).OrderBy(i => i.GamePaths.First(), StringComparer.OrdinalIgnoreCase)) 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; if (string.IsNullOrEmpty(texPath)) return;
Logger.Verbose("Checking file Replacement for texture " + texPath);
if (doNotReverseResolve) if (doNotReverseResolve)
forwardResolve.Add(texPath); forwardResolve.Add(texPath);
else else

View File

@@ -64,6 +64,12 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
private readonly ConcurrentQueue<Action> _normalQueue = new(); private readonly ConcurrentQueue<Action> _normalQueue = new();
private readonly ConcurrentQueue<Action> _gposeActionQueue = new(); private readonly ConcurrentQueue<Action> _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) public IpcManager(DalamudPluginInterface pi, DalamudUtil dalamudUtil, MareMediator mediator) : base(mediator)
{ {
Logger.Verbose("Creating " + nameof(IpcManager)); Logger.Verbose("Creating " + nameof(IpcManager));
@@ -139,6 +145,11 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
private void CheckPenumbraModPath() private void CheckPenumbraModPath()
{ {
PenumbraModDirectory = GetPenumbraModDirectory(); PenumbraModDirectory = GetPenumbraModDirectory();
_glamourerAvailable = CheckGlamourerApiInternal();
_penumbraAvailable = CheckPenumbraApiInternal();
_heelsAvailable = CheckHeelsApiInternal();
_customizePlusAvailable = CheckCustomizePlusApiInternal();
_palettePlusAvailable = CheckPalettePlusApiInternal();
} }
private void HandleGposeActionQueue() private void HandleGposeActionQueue()
@@ -183,8 +194,11 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
} }
} }
public bool Initialized => CheckPenumbraApi() && CheckGlamourerApi(); public bool Initialized => CheckPenumbraApiInternal() && CheckGlamourerApiInternal();
public bool CheckGlamourerApi()
public bool CheckGlamourerApi() => _glamourerAvailable;
public bool CheckGlamourerApiInternal()
{ {
try try
{ {
@@ -196,7 +210,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
} }
} }
public bool CheckPenumbraApi() public bool CheckPenumbraApi() => _penumbraAvailable;
public bool CheckPenumbraApiInternal()
{ {
try try
{ {
@@ -208,7 +224,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
} }
} }
public bool CheckHeelsApi() public bool CheckHeelsApi() => _heelsAvailable;
public bool CheckHeelsApiInternal()
{ {
try try
{ {
@@ -220,7 +238,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
} }
} }
public bool CheckCustomizePlusApi() public bool CheckCustomizePlusApi() => _customizePlusAvailable;
public bool CheckCustomizePlusApiInternal()
{ {
try try
{ {
@@ -232,7 +252,9 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
} }
} }
public bool CheckPalettePlusApi() public bool CheckPalettePlusApi() => _palettePlusAvailable;
public bool CheckPalettePlusApiInternal()
{ {
try try
{ {
@@ -456,7 +478,7 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
var collName = "Mare_" + characterName; var collName = "Mare_" + characterName;
Logger.Verbose("Removing temp collection for " + collName); Logger.Verbose("Removing temp collection for " + collName);
var ret = _penumbraRemoveTemporaryMod.Invoke("MareChara", collName, 0); var ret = _penumbraRemoveTemporaryMod.Invoke("MareChara", collName, 0);
Logger.Verbose("RemoveTemporaryMod: " + ret); Logger.Verbose("RemoveTemporaryMod: " + ret);
var ret2 = _penumbraRemoveTemporaryCollection.Invoke(collName); var ret2 = _penumbraRemoveTemporaryCollection.Invoke(collName);
Logger.Verbose("RemoveTemporaryCollection: " + ret2); Logger.Verbose("RemoveTemporaryCollection: " + ret2);
}); });