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 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<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));
_dalamudUtil = dalamudUtil;
_ipcManager = ipcManager;
_transientResourceManager = transientResourceManager;
_fileCacheManager = fileReplacementFactory;
Mediator.Subscribe<FrameworkUpdateMessage>(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<string> getGlamourerData = new(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address));
_processingQueue.Enqueue(getGlamourerData);
Task<string> getCustomizeData = new(() => _ipcManager.GetCustomizePlusScale());
_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
var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token);
Dictionary<string, List<string>> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve);
previousData.FileReplacements[objectKind] =
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance)
.Where(p => p.HasFileReplacement).ToHashSet();
new HashSet<FileReplacement>(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

View File

@@ -64,6 +64,12 @@ public class IpcManager : MediatorSubscriberBase, IDisposable
private readonly ConcurrentQueue<Action> _normalQueue = 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)
{
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
{