diff --git a/Penumbra.GameData/Enums/ChangedItemType.cs b/Penumbra.GameData/Enums/ChangedItemType.cs new file mode 100644 index 00000000..fa33382d --- /dev/null +++ b/Penumbra.GameData/Enums/ChangedItemType.cs @@ -0,0 +1,40 @@ +using System; +using Lumina.Excel.GeneratedSheets; +using Action = Lumina.Excel.GeneratedSheets.Action; + +namespace Penumbra.GameData.Enums +{ + public enum ChangedItemType + { + None, + Item, + Action, + Customization, + } + + public static class ChangedItemExtensions + { + public static (ChangedItemType, uint) ChangedItemToTypeAndId( object? item ) + { + return item switch + { + null => ( ChangedItemType.None, 0 ), + Item i => ( ChangedItemType.Item, i.RowId ), + Action a => ( ChangedItemType.Action, a.RowId ), + _ => ( ChangedItemType.Customization, 0 ), + }; + } + + public static object? GetObject( this ChangedItemType type, uint id ) + { + return type switch + { + ChangedItemType.None => null, + ChangedItemType.Item => ObjectIdentification.DataManager?.GetExcelSheet< Item >()?.GetRow( id ), + ChangedItemType.Action => ObjectIdentification.DataManager?.GetExcelSheet< Action >()?.GetRow( id ), + ChangedItemType.Customization => null, + _ => throw new ArgumentOutOfRangeException( nameof( type ), type, null ) + }; + } + } +} diff --git a/Penumbra.GameData/GameData.cs b/Penumbra.GameData/GameData.cs index a0241acf..cb294ca4 100644 --- a/Penumbra.GameData/GameData.cs +++ b/Penumbra.GameData/GameData.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using Dalamud; using Dalamud.Data; -using Dalamud.Plugin; using Lumina.Excel.GeneratedSheets; using Penumbra.GameData.Enums; using Penumbra.GameData.Structs; diff --git a/Penumbra.GameData/ObjectIdentification.cs b/Penumbra.GameData/ObjectIdentification.cs index 5e09b2b8..93e69b1d 100644 --- a/Penumbra.GameData/ObjectIdentification.cs +++ b/Penumbra.GameData/ObjectIdentification.cs @@ -13,6 +13,7 @@ namespace Penumbra.GameData { internal class ObjectIdentification : IObjectIdentifier { + public static DataManager? DataManager = null!; private readonly List< (ulong, HashSet< Item >) > _weapons; private readonly List< (ulong, HashSet< Item >) > _equipment; private readonly Dictionary< string, HashSet< Action > > _actions; @@ -66,6 +67,7 @@ namespace Penumbra.GameData public ObjectIdentification( DataManager dataManager, ClientLanguage clientLanguage ) { + DataManager = dataManager; var items = dataManager.GetExcelSheet< Item >( clientLanguage )!; SortedList< ulong, HashSet< Item > > weapons = new(); SortedList< ulong, HashSet< Item > > equipment = new(); diff --git a/Penumbra/Api/PenumbraIpc.cs b/Penumbra/Api/PenumbraIpc.cs index 6879c653..953906cf 100644 --- a/Penumbra/Api/PenumbraIpc.cs +++ b/Penumbra/Api/PenumbraIpc.cs @@ -2,6 +2,7 @@ using System; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Logging; using Dalamud.Plugin; +using Dalamud.Plugin.Ipc; using Penumbra.GameData.Enums; namespace Penumbra.Api @@ -18,14 +19,14 @@ namespace Penumbra.Api public const string LabelProviderChangedItemTooltip = "Penumbra.ChangedItemTooltip"; public const string LabelProviderChangedItemClick = "Penumbra.ChangedItemClick"; - 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< object?, object >? ProviderChangedItemTooltip; - internal ICallGateProvider< int, object?, object >? ProviderChangedItemClick; + 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 readonly IPenumbraApi Api; @@ -41,7 +42,16 @@ namespace Penumbra.Api } private void OnClick( MouseButton click, object? item ) - => ProviderChangedItemClick?.SendMessage( ( int )click, item ); + { + var (type, id) = ChangedItemExtensions.ChangedItemToTypeAndId( item ); + ProviderChangedItemClick?.SendMessage( click, type, id ); + } + + private void OnTooltip( object? item ) + { + var (type, id) = ChangedItemExtensions.ChangedItemToTypeAndId( item ); + ProviderChangedItemTooltip?.SendMessage( type, id ); + } public PenumbraIpc( DalamudPluginInterface pi, IPenumbraApi api ) @@ -114,8 +124,8 @@ namespace Penumbra.Api try { - ProviderChangedItemTooltip = pi.GetIpcProvider< object?, object >( LabelProviderChangedItemTooltip ); - api.ChangedItemTooltip += ProviderChangedItemTooltip.SendMessage; + ProviderChangedItemTooltip = pi.GetIpcProvider< ChangedItemType, uint, object >( LabelProviderChangedItemTooltip ); + api.ChangedItemTooltip += OnTooltip; } catch( Exception e ) { @@ -124,7 +134,7 @@ namespace Penumbra.Api try { - ProviderChangedItemClick = pi.GetIpcProvider< int, object?, object >( LabelProviderChangedItemClick ); + ProviderChangedItemClick = pi.GetIpcProvider< MouseButton, ChangedItemType, uint, object >( LabelProviderChangedItemClick ); api.ChangedItemClicked += OnClick; } catch( Exception e )