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 | ||||||
|         { |         { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 rootdarkarchon
					rootdarkarchon