From cf79f47e08081b3171628c50ba24dcef2604e370 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sat, 4 Jun 2022 20:46:50 +0200 Subject: [PATCH] Extend some more IPC functions. --- Penumbra/Api/IPenumbraApi.cs | 96 +++-- Penumbra/Api/PenumbraApi.cs | 57 ++- Penumbra/Api/PenumbraIpc.cs | 410 +++++++++++++++------- Penumbra/Interop/Resolver/PathResolver.cs | 6 + 4 files changed, 411 insertions(+), 158 deletions(-) diff --git a/Penumbra/Api/IPenumbraApi.cs b/Penumbra/Api/IPenumbraApi.cs index 487cd568..14c3b8ea 100644 --- a/Penumbra/Api/IPenumbraApi.cs +++ b/Penumbra/Api/IPenumbraApi.cs @@ -1,51 +1,77 @@ +using System; using System.Collections.Generic; +using Dalamud.Configuration; using Dalamud.Game.ClientState.Objects.Types; using Lumina.Data; using Penumbra.GameData.Enums; -namespace Penumbra.Api +namespace Penumbra.Api; + +public interface IPenumbraApiBase { - public interface IPenumbraApiBase - { - public int ApiVersion { get; } - public bool Valid { get; } - } + public int ApiVersion { get; } + public bool Valid { get; } +} - public delegate void ChangedItemHover( object? item ); - public delegate void ChangedItemClick( MouseButton button, object? item ); +public delegate void ChangedItemHover( object? item ); +public delegate void ChangedItemClick( MouseButton button, object? item ); - public interface IPenumbraApi : IPenumbraApiBase - { - // Triggered when the user hovers over a listed changed object in a mod tab. - // Can be used to append tooltips. - public event ChangedItemHover? ChangedItemTooltip; - // Triggered when the user clicks a listed changed object in a mod tab. - public event ChangedItemClick? ChangedItemClicked; - - // Queue redrawing of all actors of the given name with the given RedrawType. - public void RedrawObject( string name, RedrawType setting ); +public interface IPenumbraApi : IPenumbraApiBase +{ + // Obtain the currently set mod directory from the configuration. + public string GetModDirectory(); - // Queue redrawing of the specific actor with the given RedrawType. Should only be used when the actor is sure to be valid. - public void RedrawObject( GameObject gameObject, RedrawType setting ); + // Obtain the entire current penumbra configuration. + public IPluginConfiguration GetConfiguration(); - // Queue redrawing of all currently available actors with the given RedrawType. - public void RedrawAll( RedrawType setting ); + // Triggered when the user hovers over a listed changed object in a mod tab. + // Can be used to append tooltips. + public event ChangedItemHover? ChangedItemTooltip; - // Resolve a given gamePath via Penumbra using the Default and Forced collections. - // Returns the given gamePath if penumbra would not manipulate it. - public string ResolvePath(string gamePath); + // Triggered when the user clicks a listed changed object in a mod tab. + public event ChangedItemClick? ChangedItemClicked; - // Resolve a given gamePath via Penumbra using the character collection for the given name (if it exists) and the Forced collections. - // Returns the given gamePath if penumbra would not manipulate it. - public string ResolvePath( string gamePath, string characterName ); + // Queue redrawing of all actors of the given name with the given RedrawType. + public void RedrawObject( string name, RedrawType setting ); - // Try to load a given gamePath with the resolved path from Penumbra. - public T? GetFile< T >( string gamePath ) where T : FileResource; + // Queue redrawing of the specific actor with the given RedrawType. Should only be used when the actor is sure to be valid. + public void RedrawObject( GameObject gameObject, RedrawType setting ); - // Try to load a given gamePath with the resolved path from Penumbra. - public T? GetFile( string gamePath, string characterName ) where T : FileResource; + // Queue redrawing of all currently available actors with the given RedrawType. + public void RedrawAll( RedrawType setting ); - // Gets a dictionary of effected items from a collection - public IReadOnlyDictionary< string, object? > GetChangedItemsForCollection(string collectionName); - } + // Resolve a given gamePath via Penumbra using the Default and Forced collections. + // Returns the given gamePath if penumbra would not manipulate it. + public string ResolvePath( string gamePath ); + + // Resolve a given gamePath via Penumbra using the character collection for the given name (if it exists) and the Forced collections. + // Returns the given gamePath if penumbra would not manipulate it. + public string ResolvePath( string gamePath, string characterName ); + + // Try to load a given gamePath with the resolved path from Penumbra. + public T? GetFile< T >( string gamePath ) where T : FileResource; + + // Try to load a given gamePath with the resolved path from Penumbra. + public T? GetFile< T >( string gamePath, string characterName ) where T : FileResource; + + // Gets a dictionary of effected items from a collection + public IReadOnlyDictionary< string, object? > GetChangedItemsForCollection( string collectionName ); + + // Obtain a list of the names of all currently installed collections. + public IList< string > GetCollections(); + + // Obtain the name of the currently selected collection. + public string GetCurrentCollection(); + + // Obtain the name of the default collection. + public string GetDefaultCollection(); + + // Obtain the name of the collection associated with characterName and whether it is configured or inferred from default. + public (string, bool) GetCharacterCollection( string characterName ); + + // Obtain the game object associated with a given draw object and the name of the collection associated with this game object. + public (IntPtr, string) GetDrawObjectInfo( IntPtr drawObject ); + + // Obtain a list of all installed mods. The first string is their directory name, the second string is their mod name. + public IList< (string, string) > GetModList(); } \ No newline at end of file diff --git a/Penumbra/Api/PenumbraApi.cs b/Penumbra/Api/PenumbraApi.cs index e0d85731..9238607c 100644 --- a/Penumbra/Api/PenumbraApi.cs +++ b/Penumbra/Api/PenumbraApi.cs @@ -3,9 +3,11 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using Dalamud.Configuration; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Logging; using Lumina.Data; +using Newtonsoft.Json; using Penumbra.Collections; using Penumbra.GameData.ByteString; using Penumbra.GameData.Enums; @@ -36,6 +38,19 @@ public class PenumbraApi : IDisposable, IPenumbraApi } public event ChangedItemClick? ChangedItemClicked; + + public string GetModDirectory() + { + CheckInitialized(); + return Penumbra.Config.ModDirectory; + } + + public IPluginConfiguration GetConfiguration() + { + CheckInitialized(); + return JsonConvert.DeserializeObject< Configuration >( JsonConvert.SerializeObject( Penumbra.Config ) ); + } + public event ChangedItemHover? ChangedItemTooltip; internal bool HasTooltip @@ -59,21 +74,18 @@ public class PenumbraApi : IDisposable, IPenumbraApi public void RedrawObject( string name, RedrawType setting ) { CheckInitialized(); - _penumbra!.ObjectReloader.RedrawObject( name, setting ); } public void RedrawObject( GameObject? gameObject, RedrawType setting ) { CheckInitialized(); - _penumbra!.ObjectReloader.RedrawObject( gameObject, setting ); } public void RedrawAll( RedrawType setting ) { CheckInitialized(); - _penumbra!.ObjectReloader.RedrawAll( setting ); } @@ -151,4 +163,43 @@ public class PenumbraApi : IDisposable, IPenumbraApi throw; } } + + public IList< string > GetCollections() + { + CheckInitialized(); + return Penumbra.CollectionManager.Skip( 1 ).Select( c => c.Name ).ToArray(); + } + + public string GetCurrentCollection() + { + CheckInitialized(); + return Penumbra.CollectionManager.Current.Name; + } + + public string GetDefaultCollection() + { + CheckInitialized(); + return Penumbra.CollectionManager.Default.Name; + } + + public (string, bool) GetCharacterCollection( string characterName ) + { + CheckInitialized(); + return Penumbra.CollectionManager.Characters.TryGetValue( characterName, out var collection ) + ? ( collection.Name, true ) + : ( Penumbra.CollectionManager.Default.Name, false ); + } + + public (IntPtr, string) GetDrawObjectInfo( IntPtr drawObject ) + { + CheckInitialized(); + var (obj, collection) = _penumbra!.PathResolver.IdentifyDrawObject( drawObject ); + return ( obj, collection.Name ); + } + + public IList< (string, string) > GetModList() + { + CheckInitialized(); + return Penumbra.ModManager.Select( m => ( m.ModPath.Name, m.Name.Text ) ).ToArray(); + } } \ No newline at end of file diff --git a/Penumbra/Api/PenumbraIpc.cs b/Penumbra/Api/PenumbraIpc.cs index 8d2575ce..d19d13b8 100644 --- a/Penumbra/Api/PenumbraIpc.cs +++ b/Penumbra/Api/PenumbraIpc.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Dalamud.Configuration; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Logging; using Dalamud.Plugin; @@ -8,34 +9,115 @@ using Penumbra.GameData.Enums; namespace Penumbra.Api; -public class PenumbraIpc : IDisposable +public partial class PenumbraIpc : IDisposable +{ + internal readonly IPenumbraApi Api; + + public PenumbraIpc( DalamudPluginInterface pi, IPenumbraApi api ) + { + Api = api; + + InitializeGeneralProviders( pi ); + InitializeResolveProviders( pi ); + InitializeRedrawProviders( pi ); + InitializeChangedItemProviders( pi ); + InitializeDataProviders( pi ); + ProviderInitialized?.SendMessage(); + } + + public void Dispose() + { + DisposeDataProviders(); + DisposeChangedItemProviders(); + DisposeRedrawProviders(); + DisposeResolveProviders(); + DisposeGeneralProviders(); + ProviderDisposed?.SendMessage(); + } +} + +public partial class PenumbraIpc { public const string LabelProviderInitialized = "Penumbra.Initialized"; public const string LabelProviderDisposed = "Penumbra.Disposed"; public const string LabelProviderApiVersion = "Penumbra.ApiVersion"; - public const string LabelProviderRedrawName = "Penumbra.RedrawObjectByName"; - public const string LabelProviderRedrawObject = "Penumbra.RedrawObject"; - public const string LabelProviderRedrawAll = "Penumbra.RedrawAll"; - public const string LabelProviderResolveDefault = "Penumbra.ResolveDefaultPath"; - public const string LabelProviderResolveCharacter = "Penumbra.ResolveCharacterPath"; + public const string LabelProviderGetModDirectory = "Penumbra.GetModDirectory"; + public const string LabelProviderGetConfiguration = "Penumbra.GetConfiguration"; - public const string LabelProviderChangedItemTooltip = "Penumbra.ChangedItemTooltip"; - public const string LabelProviderChangedItemClick = "Penumbra.ChangedItemClick"; - public const string LabelProviderGetChangedItems = "Penumbra.GetChangedItems"; + internal ICallGateProvider< object? >? ProviderInitialized; + internal ICallGateProvider< object? >? ProviderDisposed; + internal ICallGateProvider< int >? ProviderApiVersion; + internal ICallGateProvider< string >? ProviderGetModDirectory; + internal ICallGateProvider< IPluginConfiguration >? ProviderGetConfiguration; - internal ICallGateProvider< object? >? ProviderInitialized; - internal ICallGateProvider< object? >? ProviderDisposed; - internal ICallGateProvider< int >? ProviderApiVersion; - internal ICallGateProvider< string, int, object >? ProviderRedrawName; - internal ICallGateProvider< GameObject, int, object >? ProviderRedrawObject; - internal ICallGateProvider< int, object >? ProviderRedrawAll; - internal ICallGateProvider< string, string >? ProviderResolveDefault; - internal ICallGateProvider< string, string, string >? ProviderResolveCharacter; - internal ICallGateProvider< ChangedItemType, uint, object >? ProviderChangedItemTooltip; - internal ICallGateProvider< MouseButton, ChangedItemType, uint, object >? ProviderChangedItemClick; - internal ICallGateProvider< string, IReadOnlyDictionary< string, object? > >? ProviderGetChangedItems; + private void InitializeGeneralProviders( DalamudPluginInterface pi ) + { + try + { + ProviderInitialized = pi.GetIpcProvider< object? >( LabelProviderInitialized ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderInitialized}:\n{e}" ); + } - internal readonly IPenumbraApi Api; + try + { + ProviderDisposed = pi.GetIpcProvider< object? >( LabelProviderDisposed ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderDisposed}:\n{e}" ); + } + + try + { + ProviderApiVersion = pi.GetIpcProvider< int >( LabelProviderApiVersion ); + ProviderApiVersion.RegisterFunc( () => Api.ApiVersion ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderApiVersion}:\n{e}" ); + } + + try + { + ProviderGetModDirectory = pi.GetIpcProvider< string >( LabelProviderGetModDirectory ); + ProviderGetModDirectory.RegisterFunc( Api.GetModDirectory ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetModDirectory}:\n{e}" ); + } + + try + { + ProviderGetConfiguration = pi.GetIpcProvider< IPluginConfiguration >( LabelProviderGetConfiguration ); + ProviderGetConfiguration.RegisterFunc( Api.GetConfiguration ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetConfiguration}:\n{e}" ); + } + } + + private void DisposeGeneralProviders() + { + ProviderGetConfiguration?.UnregisterFunc(); + ProviderGetModDirectory?.UnregisterFunc(); + ProviderApiVersion?.UnregisterFunc(); + } +} + +public partial class PenumbraIpc +{ + public const string LabelProviderRedrawName = "Penumbra.RedrawObjectByName"; + public const string LabelProviderRedrawObject = "Penumbra.RedrawObject"; + public const string LabelProviderRedrawAll = "Penumbra.RedrawAll"; + + internal ICallGateProvider< string, int, object >? ProviderRedrawName; + internal ICallGateProvider< GameObject, int, object >? ProviderRedrawObject; + internal ICallGateProvider< int, object >? ProviderRedrawAll; private static RedrawType CheckRedrawType( int value ) { @@ -48,6 +130,108 @@ public class PenumbraIpc : IDisposable throw new Exception( "The integer provided for a Redraw Function was not a valid RedrawType." ); } + private void InitializeRedrawProviders( DalamudPluginInterface pi ) + { + try + { + ProviderRedrawName = pi.GetIpcProvider< string, int, object >( LabelProviderRedrawName ); + ProviderRedrawName.RegisterAction( ( s, i ) => Api.RedrawObject( s, CheckRedrawType( i ) ) ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawName}:\n{e}" ); + } + + try + { + ProviderRedrawObject = pi.GetIpcProvider< GameObject, int, object >( LabelProviderRedrawObject ); + ProviderRedrawObject.RegisterAction( ( o, i ) => Api.RedrawObject( o, CheckRedrawType( i ) ) ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawObject}:\n{e}" ); + } + + try + { + ProviderRedrawAll = pi.GetIpcProvider< int, object >( LabelProviderRedrawAll ); + ProviderRedrawAll.RegisterAction( i => Api.RedrawAll( CheckRedrawType( i ) ) ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawAll}:\n{e}" ); + } + } + + private void DisposeRedrawProviders() + { + ProviderRedrawName?.UnregisterAction(); + ProviderRedrawObject?.UnregisterAction(); + ProviderRedrawAll?.UnregisterAction(); + } +} + +public partial class PenumbraIpc +{ + public const string LabelProviderResolveDefault = "Penumbra.ResolveDefaultPath"; + public const string LabelProviderResolveCharacter = "Penumbra.ResolveCharacterPath"; + public const string LabelProviderGetDrawObjectInfo = "Penumbra.GetDrawObjectInfo"; + + internal ICallGateProvider< string, string >? ProviderResolveDefault; + internal ICallGateProvider< string, string, string >? ProviderResolveCharacter; + internal ICallGateProvider< IntPtr, (IntPtr, string) >? ProviderGetDrawObjectInfo; + + private void InitializeResolveProviders( DalamudPluginInterface pi ) + { + try + { + ProviderResolveDefault = pi.GetIpcProvider< string, string >( LabelProviderResolveDefault ); + ProviderResolveDefault.RegisterFunc( Api.ResolvePath ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderResolveDefault}:\n{e}" ); + } + + try + { + ProviderResolveCharacter = pi.GetIpcProvider< string, string, string >( LabelProviderResolveCharacter ); + ProviderResolveCharacter.RegisterFunc( Api.ResolvePath ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderResolveCharacter}:\n{e}" ); + } + + try + { + ProviderGetDrawObjectInfo = pi.GetIpcProvider< IntPtr, (IntPtr, string) >( LabelProviderGetDrawObjectInfo ); + ProviderGetDrawObjectInfo.RegisterFunc( Api.GetDrawObjectInfo ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetDrawObjectInfo}:\n{e}" ); + } + } + + private void DisposeResolveProviders() + { + ProviderGetDrawObjectInfo?.UnregisterFunc(); + ProviderResolveDefault?.UnregisterFunc(); + ProviderResolveCharacter?.UnregisterFunc(); + } +} + +public partial class PenumbraIpc +{ + public const string LabelProviderChangedItemTooltip = "Penumbra.ChangedItemTooltip"; + public const string LabelProviderChangedItemClick = "Penumbra.ChangedItemClick"; + public const string LabelProviderGetChangedItems = "Penumbra.GetChangedItems"; + + internal ICallGateProvider< ChangedItemType, uint, object >? ProviderChangedItemTooltip; + internal ICallGateProvider< MouseButton, ChangedItemType, uint, object >? ProviderChangedItemClick; + internal ICallGateProvider< string, IReadOnlyDictionary< string, object? > >? ProviderGetChangedItems; + private void OnClick( MouseButton click, object? item ) { var (type, id) = ChangedItemExtensions.ChangedItemToTypeAndId( item ); @@ -60,93 +244,12 @@ public class PenumbraIpc : IDisposable ProviderChangedItemTooltip?.SendMessage( type, id ); } - - public PenumbraIpc( DalamudPluginInterface pi, IPenumbraApi api ) + private void InitializeChangedItemProviders( DalamudPluginInterface pi ) { - Api = api; - - try - { - ProviderInitialized = pi.GetIpcProvider< object? >( LabelProviderInitialized ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderInitialized}:\n{e}" ); - } - - try - { - ProviderDisposed = pi.GetIpcProvider( LabelProviderDisposed ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderDisposed}:\n{e}" ); - } - - try - { - ProviderApiVersion = pi.GetIpcProvider< int >( LabelProviderApiVersion ); - ProviderApiVersion.RegisterFunc( () => api.ApiVersion ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderApiVersion}:\n{e}" ); - } - - try - { - ProviderRedrawName = pi.GetIpcProvider< string, int, object >( LabelProviderRedrawName ); - ProviderRedrawName.RegisterAction( ( s, i ) => api.RedrawObject( s, CheckRedrawType( i ) ) ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawName}:\n{e}" ); - } - - try - { - ProviderRedrawObject = pi.GetIpcProvider< GameObject, int, object >( LabelProviderRedrawObject ); - ProviderRedrawObject.RegisterAction( ( o, i ) => api.RedrawObject( o, CheckRedrawType( i ) ) ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawObject}:\n{e}" ); - } - - try - { - ProviderRedrawAll = pi.GetIpcProvider< int, object >( LabelProviderRedrawAll ); - ProviderRedrawAll.RegisterAction( i => api.RedrawAll( CheckRedrawType( i ) ) ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderRedrawAll}:\n{e}" ); - } - - try - { - ProviderResolveDefault = pi.GetIpcProvider< string, string >( LabelProviderResolveDefault ); - ProviderResolveDefault.RegisterFunc( api.ResolvePath ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderResolveDefault}:\n{e}" ); - } - - try - { - ProviderResolveCharacter = pi.GetIpcProvider< string, string, string >( LabelProviderResolveCharacter ); - ProviderResolveCharacter.RegisterFunc( api.ResolvePath ); - } - catch( Exception e ) - { - PluginLog.Error( $"Error registering IPC provider for {LabelProviderResolveCharacter}:\n{e}" ); - } - try { ProviderChangedItemTooltip = pi.GetIpcProvider< ChangedItemType, uint, object >( LabelProviderChangedItemTooltip ); - api.ChangedItemTooltip += OnTooltip; + Api.ChangedItemTooltip += OnTooltip; } catch( Exception e ) { @@ -156,7 +259,7 @@ public class PenumbraIpc : IDisposable try { ProviderChangedItemClick = pi.GetIpcProvider< MouseButton, ChangedItemType, uint, object >( LabelProviderChangedItemClick ); - api.ChangedItemClicked += OnClick; + Api.ChangedItemClicked += OnClick; } catch( Exception e ) { @@ -165,29 +268,96 @@ public class PenumbraIpc : IDisposable try { - ProviderGetChangedItems = pi.GetIpcProvider>( LabelProviderGetChangedItems ); - ProviderGetChangedItems.RegisterFunc( api.GetChangedItemsForCollection ); + ProviderGetChangedItems = pi.GetIpcProvider< string, IReadOnlyDictionary< string, object? > >( LabelProviderGetChangedItems ); + ProviderGetChangedItems.RegisterFunc( Api.GetChangedItemsForCollection ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); + } + } + + private void DisposeChangedItemProviders() + { + ProviderGetChangedItems?.UnregisterFunc(); + Api.ChangedItemClicked -= OnClick; + Api.ChangedItemTooltip -= OnTooltip; + } +} + +public partial class PenumbraIpc +{ + public const string LabelProviderGetMods = "Penumbra.GetMods"; + public const string LabelProviderGetCollections = "Penumbra.GetCollections"; + public const string LabelProviderCurrentCollectionName = "Penumbra.GetCurrentCollectionName"; + public const string LabelProviderDefaultCollectionName = "Penumbra.GetDefaultCollectionName"; + public const string LabelProviderCharacterCollectionName = "Penumbra.GetCharacterCollectionName"; + + internal ICallGateProvider< IList< (string, string) > >? ProviderGetMods; + internal ICallGateProvider< IList< string > >? ProviderGetCollections; + internal ICallGateProvider< string >? ProviderCurrentCollectionName; + internal ICallGateProvider< string >? ProviderDefaultCollectionName; + internal ICallGateProvider< string, (string, bool) >? ProviderCharacterCollectionName; + + private void InitializeDataProviders( DalamudPluginInterface pi ) + { + try + { + ProviderGetMods = pi.GetIpcProvider< IList< (string, string) > >( LabelProviderGetMods ); + ProviderGetMods.RegisterFunc( Api.GetModList ); } catch( Exception e ) { PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); } - ProviderInitialized?.SendMessage(); + try + { + ProviderGetCollections = pi.GetIpcProvider< IList< string > >( LabelProviderGetCollections ); + ProviderGetCollections.RegisterFunc( Api.GetCollections ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); + } + + try + { + ProviderCurrentCollectionName = pi.GetIpcProvider< string >( LabelProviderCurrentCollectionName ); + ProviderCurrentCollectionName.RegisterFunc( Api.GetCurrentCollection ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); + } + + try + { + ProviderDefaultCollectionName = pi.GetIpcProvider< string >( LabelProviderDefaultCollectionName ); + ProviderDefaultCollectionName.RegisterFunc( Api.GetDefaultCollection ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); + } + + try + { + ProviderCharacterCollectionName = pi.GetIpcProvider< string, ( string, bool) >( LabelProviderCharacterCollectionName ); + ProviderCharacterCollectionName.RegisterFunc( Api.GetCharacterCollection ); + } + catch( Exception e ) + { + PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" ); + } } - public void Dispose() + private void DisposeDataProviders() { - ProviderDisposed?.SendMessage(); - ProviderInitialized?.UnregisterFunc(); - ProviderApiVersion?.UnregisterFunc(); - ProviderRedrawName?.UnregisterAction(); - ProviderRedrawObject?.UnregisterAction(); - ProviderRedrawAll?.UnregisterAction(); - ProviderResolveDefault?.UnregisterFunc(); - ProviderResolveCharacter?.UnregisterFunc(); - ProviderGetChangedItems?.UnregisterFunc(); - Api.ChangedItemClicked -= OnClick; - Api.ChangedItemTooltip -= OnTooltip; + ProviderGetMods?.UnregisterFunc(); + ProviderGetCollections?.UnregisterFunc(); + ProviderCurrentCollectionName?.UnregisterFunc(); + ProviderDefaultCollectionName?.UnregisterFunc(); + ProviderCharacterCollectionName?.UnregisterFunc(); } } \ No newline at end of file diff --git a/Penumbra/Interop/Resolver/PathResolver.cs b/Penumbra/Interop/Resolver/PathResolver.cs index 97cecc57..b8d76c47 100644 --- a/Penumbra/Interop/Resolver/PathResolver.cs +++ b/Penumbra/Interop/Resolver/PathResolver.cs @@ -138,4 +138,10 @@ public partial class PathResolver : IDisposable DisposeDataHooks(); DisposeMetaHooks(); } + + public unsafe (IntPtr, ModCollection) IdentifyDrawObject( IntPtr drawObject ) + { + var parent = FindParent( drawObject, out var collection ); + return ( ( IntPtr )parent, collection ); + } } \ No newline at end of file