mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-01-03 06:13:45 +01:00
Add MaterialUI IPC and increase API Version to 6. No breaking changes, only additions.
This commit is contained in:
parent
53ff9a8ab3
commit
653e21e237
6 changed files with 242 additions and 25 deletions
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Dalamud.Game.ClientState.Objects.Types;
|
using Dalamud.Game.ClientState.Objects.Types;
|
||||||
using Lumina.Data;
|
using Lumina.Data;
|
||||||
|
using Penumbra.Collections;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
using Penumbra.Mods;
|
using Penumbra.Mods;
|
||||||
|
|
||||||
|
|
@ -16,7 +17,7 @@ public interface IPenumbraApiBase
|
||||||
public delegate void ChangedItemHover( object? item );
|
public delegate void ChangedItemHover( object? item );
|
||||||
public delegate void ChangedItemClick( MouseButton button, object? item );
|
public delegate void ChangedItemClick( MouseButton button, object? item );
|
||||||
public delegate void GameObjectRedrawn( IntPtr objectPtr, int objectTableIndex );
|
public delegate void GameObjectRedrawn( IntPtr objectPtr, int objectTableIndex );
|
||||||
|
public delegate void ModSettingChanged( ModSettingChange type, string collectionName, string modDirectory, bool inherited );
|
||||||
public enum PenumbraApiEc
|
public enum PenumbraApiEc
|
||||||
{
|
{
|
||||||
Success = 0,
|
Success = 0,
|
||||||
|
|
@ -47,6 +48,11 @@ public interface IPenumbraApi : IPenumbraApiBase
|
||||||
// Can be used to append tooltips.
|
// Can be used to append tooltips.
|
||||||
public event ChangedItemHover? ChangedItemTooltip;
|
public event ChangedItemHover? ChangedItemTooltip;
|
||||||
|
|
||||||
|
// Events that are fired before and after the content of a mod settings panel are drawn.
|
||||||
|
// Both are fired inside the child window of the settings panel itself.
|
||||||
|
public event Action<string>? PreSettingsPanelDraw;
|
||||||
|
public event Action<string>? PostSettingsPanelDraw;
|
||||||
|
|
||||||
// Triggered when the user clicks a listed changed object in a mod tab.
|
// Triggered when the user clicks a listed changed object in a mod tab.
|
||||||
public event ChangedItemClick? ChangedItemClicked;
|
public event ChangedItemClick? ChangedItemClicked;
|
||||||
public event GameObjectRedrawn? GameObjectRedrawn;
|
public event GameObjectRedrawn? GameObjectRedrawn;
|
||||||
|
|
@ -101,6 +107,16 @@ public interface IPenumbraApi : IPenumbraApiBase
|
||||||
// Obtain a list of all installed mods. The first string is their directory name, the second string is their mod name.
|
// 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();
|
public IList< (string, string) > GetModList();
|
||||||
|
|
||||||
|
// Try to reload an existing mod by its directory name or mod name.
|
||||||
|
// Can return ModMissing or success.
|
||||||
|
// Reload is the same as if triggered by button press and might delete the mod if it is not valid anymore.
|
||||||
|
public PenumbraApiEc ReloadMod( string modDirectory, string modName );
|
||||||
|
|
||||||
|
// Try to add a new mod inside the mod root directory (modDirectory should only be the name, not the full name).
|
||||||
|
// Returns FileMissing if the directory does not exist or success otherwise.
|
||||||
|
// Note that success does only imply a successful call, not a successful mod load.
|
||||||
|
public PenumbraApiEc AddMod( string modDirectory );
|
||||||
|
|
||||||
// Obtain a base64 encoded, zipped json-string with a prepended version-byte of the current manipulations
|
// Obtain a base64 encoded, zipped json-string with a prepended version-byte of the current manipulations
|
||||||
// for the given collection associated with the character name, or the default collection.
|
// for the given collection associated with the character name, or the default collection.
|
||||||
public string GetMetaManipulations( string characterName );
|
public string GetMetaManipulations( string characterName );
|
||||||
|
|
@ -139,6 +155,8 @@ public interface IPenumbraApi : IPenumbraApiBase
|
||||||
public PenumbraApiEc TrySetModSettings( string collectionName, string modDirectory, string modName, string optionGroupName,
|
public PenumbraApiEc TrySetModSettings( string collectionName, string modDirectory, string modName, string optionGroupName,
|
||||||
IReadOnlyList< string > options );
|
IReadOnlyList< string > options );
|
||||||
|
|
||||||
|
// This event gets fired when any setting in any collection changes.
|
||||||
|
public event ModSettingChanged? ModSettingChanged;
|
||||||
|
|
||||||
// Create a temporary collection without actual settings but with a cache.
|
// Create a temporary collection without actual settings but with a cache.
|
||||||
// If no character collection for this character exists or forceOverwriteCharacter is true,
|
// If no character collection for this character exists or forceOverwriteCharacter is true,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -12,6 +13,7 @@ using Dalamud.Plugin.Ipc;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
using OtterGui;
|
using OtterGui;
|
||||||
using OtterGui.Raii;
|
using OtterGui.Raii;
|
||||||
|
using Penumbra.Collections;
|
||||||
using Penumbra.GameData.ByteString;
|
using Penumbra.GameData.ByteString;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
using Penumbra.Mods;
|
using Penumbra.Mods;
|
||||||
|
|
@ -23,23 +25,32 @@ public class IpcTester : IDisposable
|
||||||
private readonly PenumbraIpc _ipc;
|
private readonly PenumbraIpc _ipc;
|
||||||
private readonly DalamudPluginInterface _pi;
|
private readonly DalamudPluginInterface _pi;
|
||||||
|
|
||||||
private readonly ICallGateSubscriber< object? > _initialized;
|
private readonly ICallGateSubscriber< object? > _initialized;
|
||||||
private readonly ICallGateSubscriber< object? > _disposed;
|
private readonly ICallGateSubscriber< object? > _disposed;
|
||||||
private readonly ICallGateSubscriber< IntPtr, int, object? > _redrawn;
|
private readonly ICallGateSubscriber< string, object? > _preSettingsDraw;
|
||||||
|
private readonly ICallGateSubscriber< string, object? > _postSettingsDraw;
|
||||||
|
private readonly ICallGateSubscriber< IntPtr, int, object? > _redrawn;
|
||||||
|
private readonly ICallGateSubscriber< ModSettingChange, string, string, bool, object? > _settingChanged;
|
||||||
|
|
||||||
private readonly List< DateTimeOffset > _initializedList = new();
|
private readonly List< DateTimeOffset > _initializedList = new();
|
||||||
private readonly List< DateTimeOffset > _disposedList = new();
|
private readonly List< DateTimeOffset > _disposedList = new();
|
||||||
|
|
||||||
public IpcTester( DalamudPluginInterface pi, PenumbraIpc ipc )
|
public IpcTester( DalamudPluginInterface pi, PenumbraIpc ipc )
|
||||||
{
|
{
|
||||||
_ipc = ipc;
|
_ipc = ipc;
|
||||||
_pi = pi;
|
_pi = pi;
|
||||||
_initialized = _pi.GetIpcSubscriber< object? >( PenumbraIpc.LabelProviderInitialized );
|
_initialized = _pi.GetIpcSubscriber< object? >( PenumbraIpc.LabelProviderInitialized );
|
||||||
_disposed = _pi.GetIpcSubscriber< object? >( PenumbraIpc.LabelProviderDisposed );
|
_disposed = _pi.GetIpcSubscriber< object? >( PenumbraIpc.LabelProviderDisposed );
|
||||||
_redrawn = _pi.GetIpcSubscriber< IntPtr, int, object? >( PenumbraIpc.LabelProviderGameObjectRedrawn );
|
_redrawn = _pi.GetIpcSubscriber< IntPtr, int, object? >( PenumbraIpc.LabelProviderGameObjectRedrawn );
|
||||||
|
_preSettingsDraw = _pi.GetIpcSubscriber< string, object? >( PenumbraIpc.LabelProviderPreSettingsDraw );
|
||||||
|
_postSettingsDraw = _pi.GetIpcSubscriber< string, object? >( PenumbraIpc.LabelProviderPostSettingsDraw );
|
||||||
|
_settingChanged = _pi.GetIpcSubscriber< ModSettingChange, string, string, bool, object? >( PenumbraIpc.LabelProviderModSettingChanged );
|
||||||
_initialized.Subscribe( AddInitialized );
|
_initialized.Subscribe( AddInitialized );
|
||||||
_disposed.Subscribe( AddDisposed );
|
_disposed.Subscribe( AddDisposed );
|
||||||
_redrawn.Subscribe( SetLastRedrawn );
|
_redrawn.Subscribe( SetLastRedrawn );
|
||||||
|
_preSettingsDraw.Subscribe( UpdateLastDrawnMod );
|
||||||
|
_postSettingsDraw.Subscribe( UpdateLastDrawnMod );
|
||||||
|
_settingChanged.Subscribe( UpdateLastModSetting );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|
@ -49,6 +60,9 @@ public class IpcTester : IDisposable
|
||||||
_redrawn.Subscribe( SetLastRedrawn );
|
_redrawn.Subscribe( SetLastRedrawn );
|
||||||
_tooltip?.Unsubscribe( AddedTooltip );
|
_tooltip?.Unsubscribe( AddedTooltip );
|
||||||
_click?.Unsubscribe( AddedClick );
|
_click?.Unsubscribe( AddedClick );
|
||||||
|
_preSettingsDraw.Unsubscribe( UpdateLastDrawnMod );
|
||||||
|
_postSettingsDraw.Unsubscribe( UpdateLastDrawnMod );
|
||||||
|
_settingChanged.Unsubscribe( UpdateLastModSetting );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddInitialized()
|
private void AddInitialized()
|
||||||
|
|
@ -111,7 +125,12 @@ public class IpcTester : IDisposable
|
||||||
ImGui.TableNextColumn();
|
ImGui.TableNextColumn();
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _currentConfiguration = string.Empty;
|
private string _currentConfiguration = string.Empty;
|
||||||
|
private string _lastDrawnMod = string.Empty;
|
||||||
|
private DateTimeOffset _lastDrawnModTime;
|
||||||
|
|
||||||
|
private void UpdateLastDrawnMod( string name )
|
||||||
|
=> ( _lastDrawnMod, _lastDrawnModTime ) = ( name, DateTimeOffset.Now );
|
||||||
|
|
||||||
private void DrawGeneral()
|
private void DrawGeneral()
|
||||||
{
|
{
|
||||||
|
|
@ -143,6 +162,8 @@ public class IpcTester : IDisposable
|
||||||
|
|
||||||
DrawList( PenumbraIpc.LabelProviderInitialized, "Last Initialized", _initializedList );
|
DrawList( PenumbraIpc.LabelProviderInitialized, "Last Initialized", _initializedList );
|
||||||
DrawList( PenumbraIpc.LabelProviderDisposed, "Last Disposed", _disposedList );
|
DrawList( PenumbraIpc.LabelProviderDisposed, "Last Disposed", _disposedList );
|
||||||
|
DrawIntro( PenumbraIpc.LabelProviderPostSettingsDraw, "Last Drawn Mod" );
|
||||||
|
ImGui.TextUnformatted( _lastDrawnMod.Length > 0 ? $"{_lastDrawnMod} at {_lastDrawnModTime}" : "None" );
|
||||||
DrawIntro( PenumbraIpc.LabelProviderApiVersion, "Current Version" );
|
DrawIntro( PenumbraIpc.LabelProviderApiVersion, "Current Version" );
|
||||||
ImGui.TextUnformatted( _pi.GetIpcSubscriber< int >( PenumbraIpc.LabelProviderApiVersion ).InvokeFunc().ToString() );
|
ImGui.TextUnformatted( _pi.GetIpcSubscriber< int >( PenumbraIpc.LabelProviderApiVersion ).InvokeFunc().ToString() );
|
||||||
DrawIntro( PenumbraIpc.LabelProviderGetModDirectory, "Current Mod Directory" );
|
DrawIntro( PenumbraIpc.LabelProviderGetModDirectory, "Current Mod Directory" );
|
||||||
|
|
@ -500,8 +521,23 @@ public class IpcTester : IDisposable
|
||||||
private IDictionary< string, (IList< string >, SelectType) >? _availableSettings;
|
private IDictionary< string, (IList< string >, SelectType) >? _availableSettings;
|
||||||
private IDictionary< string, IList< string > >? _currentSettings = null;
|
private IDictionary< string, IList< string > >? _currentSettings = null;
|
||||||
private PenumbraApiEc _lastSettingsError = PenumbraApiEc.Success;
|
private PenumbraApiEc _lastSettingsError = PenumbraApiEc.Success;
|
||||||
|
private ModSettingChange _lastSettingChangeType;
|
||||||
|
private string _lastSettingChangeCollection = string.Empty;
|
||||||
|
private string _lastSettingChangeMod = string.Empty;
|
||||||
|
private bool _lastSettingChangeInherited;
|
||||||
|
private DateTimeOffset _lastSettingChange;
|
||||||
|
private PenumbraApiEc _lastReloadEc = PenumbraApiEc.Success;
|
||||||
|
|
||||||
|
|
||||||
|
private void UpdateLastModSetting( ModSettingChange type, string collection, string mod, bool inherited )
|
||||||
|
{
|
||||||
|
_lastSettingChangeType = type;
|
||||||
|
_lastSettingChangeCollection = collection;
|
||||||
|
_lastSettingChangeMod = mod;
|
||||||
|
_lastSettingChangeInherited = inherited;
|
||||||
|
_lastSettingChange = DateTimeOffset.Now;
|
||||||
|
}
|
||||||
|
|
||||||
private void DrawSetting()
|
private void DrawSetting()
|
||||||
{
|
{
|
||||||
using var _ = ImRaii.TreeNode( "Settings IPC" );
|
using var _ = ImRaii.TreeNode( "Settings IPC" );
|
||||||
|
|
@ -522,7 +558,10 @@ public class IpcTester : IDisposable
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawIntro( "Last Error", _lastSettingsError.ToString() );
|
DrawIntro( "Last Error", _lastSettingsError.ToString() );
|
||||||
|
DrawIntro( PenumbraIpc.LabelProviderModSettingChanged, "Last Mod Setting Changed" );
|
||||||
|
ImGui.TextUnformatted( _lastSettingChangeMod.Length > 0
|
||||||
|
? $"{_lastSettingChangeType} of {_lastSettingChangeMod} in {_lastSettingChangeCollection}{( _lastSettingChangeInherited ? " (Inherited)" : string.Empty )} at {_lastSettingChange}"
|
||||||
|
: "None" );
|
||||||
DrawIntro( PenumbraIpc.LabelProviderGetAvailableModSettings, "Get Available Settings" );
|
DrawIntro( PenumbraIpc.LabelProviderGetAvailableModSettings, "Get Available Settings" );
|
||||||
if( ImGui.Button( "Get##Available" ) )
|
if( ImGui.Button( "Get##Available" ) )
|
||||||
{
|
{
|
||||||
|
|
@ -532,6 +571,16 @@ public class IpcTester : IDisposable
|
||||||
_lastSettingsError = _availableSettings == null ? PenumbraApiEc.ModMissing : PenumbraApiEc.Success;
|
_lastSettingsError = _availableSettings == null ? PenumbraApiEc.ModMissing : PenumbraApiEc.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DrawIntro( PenumbraIpc.LabelProviderReloadMod, "Reload Mod" );
|
||||||
|
if( ImGui.Button( "Reload" ) )
|
||||||
|
{
|
||||||
|
_lastReloadEc = _pi.GetIpcSubscriber< string, string, PenumbraApiEc >( PenumbraIpc.LabelProviderReloadMod )
|
||||||
|
.InvokeFunc( _settingsModDirectory, _settingsModName );
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextUnformatted( _lastReloadEc.ToString() );
|
||||||
|
|
||||||
DrawIntro( PenumbraIpc.LabelProviderGetCurrentModSettings, "Get Current Settings" );
|
DrawIntro( PenumbraIpc.LabelProviderGetCurrentModSettings, "Get Current Settings" );
|
||||||
if( ImGui.Button( "Get##Current" ) )
|
if( ImGui.Button( "Get##Current" ) )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -21,11 +21,17 @@ namespace Penumbra.Api;
|
||||||
public class PenumbraApi : IDisposable, IPenumbraApi
|
public class PenumbraApi : IDisposable, IPenumbraApi
|
||||||
{
|
{
|
||||||
public int ApiVersion
|
public int ApiVersion
|
||||||
=> 5;
|
=> 6;
|
||||||
|
|
||||||
private Penumbra? _penumbra;
|
private Penumbra? _penumbra;
|
||||||
private Lumina.GameData? _lumina;
|
private Lumina.GameData? _lumina;
|
||||||
|
|
||||||
|
private readonly Dictionary< ModCollection, ModCollection.ModSettingChangeDelegate > _delegates = new();
|
||||||
|
|
||||||
|
public event Action<string>? PreSettingsPanelDraw;
|
||||||
|
public event Action<string>? PostSettingsPanelDraw;
|
||||||
public event GameObjectRedrawn? GameObjectRedrawn;
|
public event GameObjectRedrawn? GameObjectRedrawn;
|
||||||
|
public event ModSettingChanged? ModSettingChanged;
|
||||||
|
|
||||||
public bool Valid
|
public bool Valid
|
||||||
=> _penumbra != null;
|
=> _penumbra != null;
|
||||||
|
|
@ -37,13 +43,27 @@ public class PenumbraApi : IDisposable, IPenumbraApi
|
||||||
.GetField( "gameData", BindingFlags.Instance | BindingFlags.NonPublic )
|
.GetField( "gameData", BindingFlags.Instance | BindingFlags.NonPublic )
|
||||||
?.GetValue( Dalamud.GameData );
|
?.GetValue( Dalamud.GameData );
|
||||||
_penumbra.ObjectReloader.GameObjectRedrawn += OnGameObjectRedrawn;
|
_penumbra.ObjectReloader.GameObjectRedrawn += OnGameObjectRedrawn;
|
||||||
|
foreach( var collection in Penumbra.CollectionManager )
|
||||||
|
{
|
||||||
|
SubscribeToCollection( collection );
|
||||||
|
}
|
||||||
|
|
||||||
|
Penumbra.CollectionManager.CollectionChanged += SubscribeToNewCollections;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_penumbra!.ObjectReloader.GameObjectRedrawn -= OnGameObjectRedrawn;
|
Penumbra.CollectionManager.CollectionChanged -= SubscribeToNewCollections;
|
||||||
_penumbra = null;
|
_penumbra!.ObjectReloader.GameObjectRedrawn -= OnGameObjectRedrawn;
|
||||||
_lumina = null;
|
_penumbra = null;
|
||||||
|
_lumina = null;
|
||||||
|
foreach( var collection in Penumbra.CollectionManager )
|
||||||
|
{
|
||||||
|
if( _delegates.TryGetValue( collection, out var del ) )
|
||||||
|
{
|
||||||
|
collection.ModSettingChanged -= del;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public event ChangedItemClick? ChangedItemClicked;
|
public event ChangedItemClick? ChangedItemClicked;
|
||||||
|
|
@ -214,6 +234,29 @@ public class PenumbraApi : IDisposable, IPenumbraApi
|
||||||
( shareSettings.Enabled, shareSettings.Priority, shareSettings.Settings, collection.Settings[ mod.Index ] != null ) );
|
( shareSettings.Enabled, shareSettings.Priority, shareSettings.Settings, collection.Settings[ mod.Index ] != null ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PenumbraApiEc ReloadMod( string modDirectory, string modName )
|
||||||
|
{
|
||||||
|
CheckInitialized();
|
||||||
|
if( !Penumbra.ModManager.TryGetMod( modDirectory, modName, out var mod ) )
|
||||||
|
{
|
||||||
|
return PenumbraApiEc.ModMissing;
|
||||||
|
}
|
||||||
|
|
||||||
|
Penumbra.ModManager.ReloadMod( mod.Index );
|
||||||
|
return PenumbraApiEc.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PenumbraApiEc AddMod( string modDirectory )
|
||||||
|
{
|
||||||
|
CheckInitialized();
|
||||||
|
var dir = new DirectoryInfo( Path.Combine(Penumbra.ModManager.BasePath.FullName, modDirectory) );
|
||||||
|
if( !dir.Exists )
|
||||||
|
return PenumbraApiEc.FileMissing;
|
||||||
|
|
||||||
|
Penumbra.ModManager.AddMod( dir );
|
||||||
|
return PenumbraApiEc.Success;
|
||||||
|
}
|
||||||
|
|
||||||
public PenumbraApiEc TryInheritMod( string collectionName, string modDirectory, string modName, bool inherit )
|
public PenumbraApiEc TryInheritMod( string collectionName, string modDirectory, string modName, bool inherit )
|
||||||
{
|
{
|
||||||
CheckInitialized();
|
CheckInitialized();
|
||||||
|
|
@ -572,4 +615,39 @@ public class PenumbraApi : IDisposable, IPenumbraApi
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SubscribeToCollection( ModCollection c )
|
||||||
|
{
|
||||||
|
var name = c.Name;
|
||||||
|
|
||||||
|
void Del( ModSettingChange type, int idx, int _, int _2, bool inherited )
|
||||||
|
=> ModSettingChanged?.Invoke( type, name, Penumbra.ModManager[ idx ].ModPath.Name, inherited );
|
||||||
|
|
||||||
|
_delegates[ c ] = Del;
|
||||||
|
c.ModSettingChanged += Del;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SubscribeToNewCollections( CollectionType type, ModCollection? oldCollection, ModCollection? newCollection, string? _ )
|
||||||
|
{
|
||||||
|
if( type != CollectionType.Inactive )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( oldCollection != null && _delegates.TryGetValue( oldCollection, out var del ) )
|
||||||
|
{
|
||||||
|
oldCollection.ModSettingChanged -= del;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( newCollection != null )
|
||||||
|
{
|
||||||
|
SubscribeToCollection( newCollection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokePreSettingsPanel(string modDirectory)
|
||||||
|
=> PreSettingsPanelDraw?.Invoke(modDirectory);
|
||||||
|
|
||||||
|
public void InvokePostSettingsPanel(string modDirectory)
|
||||||
|
=> PostSettingsPanelDraw?.Invoke(modDirectory);
|
||||||
}
|
}
|
||||||
|
|
@ -4,6 +4,7 @@ using Dalamud.Game.ClientState.Objects.Types;
|
||||||
using Dalamud.Logging;
|
using Dalamud.Logging;
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
using Dalamud.Plugin.Ipc;
|
using Dalamud.Plugin.Ipc;
|
||||||
|
using Penumbra.Collections;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
|
|
||||||
namespace Penumbra.Api;
|
namespace Penumbra.Api;
|
||||||
|
|
@ -48,12 +49,16 @@ public partial class PenumbraIpc
|
||||||
public const string LabelProviderApiVersion = "Penumbra.ApiVersion";
|
public const string LabelProviderApiVersion = "Penumbra.ApiVersion";
|
||||||
public const string LabelProviderGetModDirectory = "Penumbra.GetModDirectory";
|
public const string LabelProviderGetModDirectory = "Penumbra.GetModDirectory";
|
||||||
public const string LabelProviderGetConfiguration = "Penumbra.GetConfiguration";
|
public const string LabelProviderGetConfiguration = "Penumbra.GetConfiguration";
|
||||||
|
public const string LabelProviderPreSettingsDraw = "Penumbra.PreSettingsDraw";
|
||||||
|
public const string LabelProviderPostSettingsDraw = "Penumbra.PostSettingsDraw";
|
||||||
|
|
||||||
internal ICallGateProvider< object? >? ProviderInitialized;
|
internal ICallGateProvider< object? >? ProviderInitialized;
|
||||||
internal ICallGateProvider< object? >? ProviderDisposed;
|
internal ICallGateProvider< object? >? ProviderDisposed;
|
||||||
internal ICallGateProvider< int >? ProviderApiVersion;
|
internal ICallGateProvider< int >? ProviderApiVersion;
|
||||||
internal ICallGateProvider< string >? ProviderGetModDirectory;
|
internal ICallGateProvider< string >? ProviderGetModDirectory;
|
||||||
internal ICallGateProvider< string >? ProviderGetConfiguration;
|
internal ICallGateProvider< string >? ProviderGetConfiguration;
|
||||||
|
internal ICallGateProvider<string, object?>? ProviderPreSettingsDraw;
|
||||||
|
internal ICallGateProvider<string, object?>? ProviderPostSettingsDraw;
|
||||||
|
|
||||||
private void InitializeGeneralProviders( DalamudPluginInterface pi )
|
private void InitializeGeneralProviders( DalamudPluginInterface pi )
|
||||||
{
|
{
|
||||||
|
|
@ -104,6 +109,26 @@ public partial class PenumbraIpc
|
||||||
{
|
{
|
||||||
PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetConfiguration}:\n{e}" );
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetConfiguration}:\n{e}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProviderPreSettingsDraw = pi.GetIpcProvider<string, object?>( LabelProviderPreSettingsDraw );
|
||||||
|
Api.PreSettingsPanelDraw += InvokeSettingsPreDraw;
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderPreSettingsDraw}:\n{e}" );
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProviderPostSettingsDraw = pi.GetIpcProvider<string, object?>( LabelProviderPostSettingsDraw );
|
||||||
|
Api.PostSettingsPanelDraw += InvokeSettingsPostDraw;
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderPostSettingsDraw}:\n{e}" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisposeGeneralProviders()
|
private void DisposeGeneralProviders()
|
||||||
|
|
@ -195,13 +220,19 @@ public partial class PenumbraIpc
|
||||||
private void OnGameObjectRedrawn( IntPtr objectAddress, int objectTableIndex )
|
private void OnGameObjectRedrawn( IntPtr objectAddress, int objectTableIndex )
|
||||||
=> ProviderGameObjectRedrawn?.SendMessage( objectAddress, objectTableIndex );
|
=> ProviderGameObjectRedrawn?.SendMessage( objectAddress, objectTableIndex );
|
||||||
|
|
||||||
|
private void InvokeSettingsPreDraw( string modDirectory )
|
||||||
|
=> ProviderPreSettingsDraw!.SendMessage( modDirectory );
|
||||||
|
|
||||||
|
private void InvokeSettingsPostDraw( string modDirectory )
|
||||||
|
=> ProviderPostSettingsDraw!.SendMessage( modDirectory );
|
||||||
|
|
||||||
private void DisposeRedrawProviders()
|
private void DisposeRedrawProviders()
|
||||||
{
|
{
|
||||||
ProviderRedrawName?.UnregisterAction();
|
ProviderRedrawName?.UnregisterAction();
|
||||||
ProviderRedrawObject?.UnregisterAction();
|
ProviderRedrawObject?.UnregisterAction();
|
||||||
ProviderRedrawIndex?.UnregisterAction();
|
ProviderRedrawIndex?.UnregisterAction();
|
||||||
ProviderRedrawAll?.UnregisterAction();
|
ProviderRedrawAll?.UnregisterAction();
|
||||||
Api.GameObjectRedrawn -= OnGameObjectRedrawn;
|
Api.GameObjectRedrawn -= OnGameObjectRedrawn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -425,14 +456,21 @@ public partial class PenumbraIpc
|
||||||
public partial class PenumbraIpc
|
public partial class PenumbraIpc
|
||||||
{
|
{
|
||||||
public const string LabelProviderGetAvailableModSettings = "Penumbra.GetAvailableModSettings";
|
public const string LabelProviderGetAvailableModSettings = "Penumbra.GetAvailableModSettings";
|
||||||
|
public const string LabelProviderReloadMod = "Penumbra.ReloadMod";
|
||||||
|
public const string LabelProviderAddMod = "Penumbra.AddMod";
|
||||||
public const string LabelProviderGetCurrentModSettings = "Penumbra.GetCurrentModSettings";
|
public const string LabelProviderGetCurrentModSettings = "Penumbra.GetCurrentModSettings";
|
||||||
public const string LabelProviderTryInheritMod = "Penumbra.TryInheritMod";
|
public const string LabelProviderTryInheritMod = "Penumbra.TryInheritMod";
|
||||||
public const string LabelProviderTrySetMod = "Penumbra.TrySetMod";
|
public const string LabelProviderTrySetMod = "Penumbra.TrySetMod";
|
||||||
public const string LabelProviderTrySetModPriority = "Penumbra.TrySetModPriority";
|
public const string LabelProviderTrySetModPriority = "Penumbra.TrySetModPriority";
|
||||||
public const string LabelProviderTrySetModSetting = "Penumbra.TrySetModSetting";
|
public const string LabelProviderTrySetModSetting = "Penumbra.TrySetModSetting";
|
||||||
public const string LabelProviderTrySetModSettings = "Penumbra.TrySetModSettings";
|
public const string LabelProviderTrySetModSettings = "Penumbra.TrySetModSettings";
|
||||||
|
public const string LabelProviderModSettingChanged = "Penumbra.ModSettingChanged";
|
||||||
|
|
||||||
|
internal ICallGateProvider< ModSettingChange, string, string, bool, object? >? ProviderModSettingChanged;
|
||||||
|
|
||||||
internal ICallGateProvider< string, string, IDictionary< string, (IList< string >, Mods.SelectType) >? >? ProviderGetAvailableModSettings;
|
internal ICallGateProvider< string, string, IDictionary< string, (IList< string >, Mods.SelectType) >? >? ProviderGetAvailableModSettings;
|
||||||
|
internal ICallGateProvider< string, string, PenumbraApiEc >? ProviderReloadMod;
|
||||||
|
internal ICallGateProvider< string, PenumbraApiEc >? ProviderAddMod;
|
||||||
|
|
||||||
internal ICallGateProvider< string, string, string, bool, (PenumbraApiEc, (bool, int, IDictionary< string, IList< string > >, bool)?) >?
|
internal ICallGateProvider< string, string, string, bool, (PenumbraApiEc, (bool, int, IDictionary< string, IList< string > >, bool)?) >?
|
||||||
ProviderGetCurrentModSettings;
|
ProviderGetCurrentModSettings;
|
||||||
|
|
@ -445,6 +483,16 @@ public partial class PenumbraIpc
|
||||||
|
|
||||||
private void InitializeSettingProviders( DalamudPluginInterface pi )
|
private void InitializeSettingProviders( DalamudPluginInterface pi )
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProviderModSettingChanged = pi.GetIpcProvider< ModSettingChange, string, string, bool, object? >( LabelProviderModSettingChanged );
|
||||||
|
Api.ModSettingChanged += InvokeModSettingChanged;
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderModSettingChanged}:\n{e}" );
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ProviderGetAvailableModSettings =
|
ProviderGetAvailableModSettings =
|
||||||
|
|
@ -457,6 +505,26 @@ public partial class PenumbraIpc
|
||||||
PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetAvailableModSettings}:\n{e}" );
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderGetAvailableModSettings}:\n{e}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProviderReloadMod = pi.GetIpcProvider< string, string, PenumbraApiEc >( LabelProviderReloadMod );
|
||||||
|
ProviderReloadMod.RegisterFunc( Api.ReloadMod );
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderReloadMod}:\n{e}" );
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProviderAddMod = pi.GetIpcProvider< string, PenumbraApiEc >( LabelProviderAddMod );
|
||||||
|
ProviderAddMod.RegisterFunc( Api.AddMod );
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
PluginLog.Error( $"Error registering IPC provider for {LabelProviderChangedItemClick}:\n{e}" );
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ProviderGetCurrentModSettings =
|
ProviderGetCurrentModSettings =
|
||||||
|
|
@ -524,7 +592,10 @@ public partial class PenumbraIpc
|
||||||
|
|
||||||
private void DisposeSettingProviders()
|
private void DisposeSettingProviders()
|
||||||
{
|
{
|
||||||
|
Api.ModSettingChanged -= InvokeModSettingChanged;
|
||||||
ProviderGetAvailableModSettings?.UnregisterFunc();
|
ProviderGetAvailableModSettings?.UnregisterFunc();
|
||||||
|
ProviderReloadMod?.UnregisterFunc();
|
||||||
|
ProviderAddMod?.UnregisterFunc();
|
||||||
ProviderGetCurrentModSettings?.UnregisterFunc();
|
ProviderGetCurrentModSettings?.UnregisterFunc();
|
||||||
ProviderTryInheritMod?.UnregisterFunc();
|
ProviderTryInheritMod?.UnregisterFunc();
|
||||||
ProviderTrySetMod?.UnregisterFunc();
|
ProviderTrySetMod?.UnregisterFunc();
|
||||||
|
|
@ -532,6 +603,9 @@ public partial class PenumbraIpc
|
||||||
ProviderTrySetModSetting?.UnregisterFunc();
|
ProviderTrySetModSetting?.UnregisterFunc();
|
||||||
ProviderTrySetModSettings?.UnregisterFunc();
|
ProviderTrySetModSettings?.UnregisterFunc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InvokeModSettingChanged( ModSettingChange type, string collection, string mod, bool inherited )
|
||||||
|
=> ProviderModSettingChanged?.SendMessage( type, collection, mod, inherited );
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class PenumbraIpc
|
public partial class PenumbraIpc
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,15 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using System.Reflection;
|
|
||||||
using FFXIVClientStructs.FFXIV.Client.Game.Character;
|
using FFXIVClientStructs.FFXIV.Client.Game.Character;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
||||||
using FFXIVClientStructs.FFXIV.Client.System.Resource;
|
using FFXIVClientStructs.FFXIV.Client.System.Resource;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
using OtterGui;
|
using OtterGui;
|
||||||
using OtterGui.Raii;
|
using OtterGui.Raii;
|
||||||
using Penumbra.Api;
|
|
||||||
using Penumbra.Collections;
|
|
||||||
using Penumbra.Interop.Loader;
|
using Penumbra.Interop.Loader;
|
||||||
using Penumbra.Interop.Structs;
|
using Penumbra.Interop.Structs;
|
||||||
using Penumbra.Mods;
|
|
||||||
using CharacterUtility = Penumbra.Interop.CharacterUtility;
|
using CharacterUtility = Penumbra.Interop.CharacterUtility;
|
||||||
|
|
||||||
namespace Penumbra.UI;
|
namespace Penumbra.UI;
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ public partial class ConfigWindow
|
||||||
|
|
||||||
DrawInheritedWarning();
|
DrawInheritedWarning();
|
||||||
ImGui.Dummy( _window._defaultSpace );
|
ImGui.Dummy( _window._defaultSpace );
|
||||||
|
_window._penumbra.Api.InvokePreSettingsPanel( _mod.ModPath.Name );
|
||||||
DrawEnabledInput();
|
DrawEnabledInput();
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
DrawPriorityInput();
|
DrawPriorityInput();
|
||||||
|
|
@ -64,6 +65,8 @@ public partial class ConfigWindow
|
||||||
{
|
{
|
||||||
DrawMultiGroup( _mod.Groups[ idx ], idx );
|
DrawMultiGroup( _mod.Groups[ idx ], idx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_window._penumbra.Api.InvokePostSettingsPanel(_mod.ModPath.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue