check availability of plugins implicitly
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user