diff --git a/Dalamud/Game/Inventory/GameInventory.cs b/Dalamud/Game/Inventory/GameInventory.cs index b8e81ced7..fffe95d53 100644 --- a/Dalamud/Game/Inventory/GameInventory.cs +++ b/Dalamud/Game/Inventory/GameInventory.cs @@ -86,6 +86,24 @@ internal class GameInventory : IDisposable, IServiceType, IGameInventory /// public event IGameInventory.InventoryChangedDelegate? ItemMerged; + /// + public event IGameInventory.InventoryChangedDelegate? ItemAddedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemRemovedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemChangedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemMovedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemSplitExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemMergedExplicit; + /// public void Dispose() { @@ -118,6 +136,19 @@ internal class GameInventory : IDisposable, IServiceType, IGameInventory } } + private static void InvokeSafely(IGameInventory.InventoryChangedDelegate? cb, T arg) + where T : InventoryEventArgs + { + try + { + cb?.Invoke(arg); + } + catch (Exception e) + { + Log.Error(e, "Exception during {argType} callback", arg.Type); + } + } + private void OnFrameworkUpdate(IFramework framework1) { for (var i = 0; i < this.inventoryTypes.Length; i++) @@ -279,22 +310,40 @@ internal class GameInventory : IDisposable, IServiceType, IGameInventory .Concat(this.mergedEvents))); foreach (var x in this.addedEvents) + { InvokeSafely(this.ItemAdded, x); + InvokeSafely(this.ItemAddedExplicit, x); + } foreach (var x in this.removedEvents) + { InvokeSafely(this.ItemRemoved, x); + InvokeSafely(this.ItemRemovedExplicit, x); + } foreach (var x in this.changedEvents) + { InvokeSafely(this.ItemChanged, x); + InvokeSafely(this.ItemChangedExplicit, x); + } foreach (var x in this.movedEvents) + { InvokeSafely(this.ItemMoved, x); + InvokeSafely(this.ItemMovedExplicit, x); + } foreach (var x in this.splitEvents) + { InvokeSafely(this.ItemSplit, x); + InvokeSafely(this.ItemSplitExplicit, x); + } foreach (var x in this.mergedEvents) + { InvokeSafely(this.ItemMerged, x); + InvokeSafely(this.ItemMergedExplicit, x); + } // We're done using the lists. Clean them up. this.addedEvents.Clear(); @@ -381,6 +430,24 @@ internal class GameInventoryPluginScoped : IDisposable, IServiceType, IGameInven /// public event IGameInventory.InventoryChangedDelegate? ItemMerged; + /// + public event IGameInventory.InventoryChangedDelegate? ItemAddedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemRemovedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemChangedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemMovedExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemSplitExplicit; + + /// + public event IGameInventory.InventoryChangedDelegate? ItemMergedExplicit; + /// public void Dispose() { @@ -392,6 +459,12 @@ internal class GameInventoryPluginScoped : IDisposable, IServiceType, IGameInven this.gameInventoryService.ItemMoved -= this.OnInventoryItemMovedForward; this.gameInventoryService.ItemSplit -= this.OnInventoryItemSplitForward; this.gameInventoryService.ItemMerged -= this.OnInventoryItemMergedForward; + this.gameInventoryService.ItemAddedExplicit -= this.OnInventoryItemAddedExplicitForward; + this.gameInventoryService.ItemRemovedExplicit -= this.OnInventoryItemRemovedExplicitForward; + this.gameInventoryService.ItemChangedExplicit -= this.OnInventoryItemChangedExplicitForward; + this.gameInventoryService.ItemMovedExplicit -= this.OnInventoryItemMovedExplicitForward; + this.gameInventoryService.ItemSplitExplicit -= this.OnInventoryItemSplitExplicitForward; + this.gameInventoryService.ItemMergedExplicit -= this.OnInventoryItemMergedExplicitForward; this.InventoryChanged = null; this.InventoryChangedRaw = null; @@ -401,6 +474,12 @@ internal class GameInventoryPluginScoped : IDisposable, IServiceType, IGameInven this.ItemMoved = null; this.ItemSplit = null; this.ItemMerged = null; + this.ItemAddedExplicit = null; + this.ItemRemovedExplicit = null; + this.ItemChangedExplicit = null; + this.ItemMovedExplicit = null; + this.ItemSplitExplicit = null; + this.ItemMergedExplicit = null; } private void OnInventoryChangedForward(IReadOnlyCollection events) @@ -426,4 +505,22 @@ internal class GameInventoryPluginScoped : IDisposable, IServiceType, IGameInven private void OnInventoryItemMergedForward(GameInventoryEvent type, InventoryEventArgs data) => this.ItemMerged?.Invoke(type, data); + + private void OnInventoryItemAddedExplicitForward(InventoryItemAddedArgs data) + => this.ItemAddedExplicit?.Invoke(data); + + private void OnInventoryItemRemovedExplicitForward(InventoryItemRemovedArgs data) + => this.ItemRemovedExplicit?.Invoke(data); + + private void OnInventoryItemChangedExplicitForward(InventoryItemChangedArgs data) + => this.ItemChangedExplicit?.Invoke(data); + + private void OnInventoryItemMovedExplicitForward(InventoryItemMovedArgs data) + => this.ItemMovedExplicit?.Invoke(data); + + private void OnInventoryItemSplitExplicitForward(InventoryItemSplitArgs data) + => this.ItemSplitExplicit?.Invoke(data); + + private void OnInventoryItemMergedExplicitForward(InventoryItemMergedArgs data) + => this.ItemMergedExplicit?.Invoke(data); } diff --git a/Dalamud/Plugin/Services/IGameInventory.cs b/Dalamud/Plugin/Services/IGameInventory.cs index 6e84e780a..cd289bc54 100644 --- a/Dalamud/Plugin/Services/IGameInventory.cs +++ b/Dalamud/Plugin/Services/IGameInventory.cs @@ -25,6 +25,14 @@ public interface IGameInventory /// Data for the triggered event. public delegate void InventoryChangedDelegate(GameInventoryEvent type, InventoryEventArgs data); + /// + /// Delegate function to be called for each change to inventories. + /// This delegate sends individual events for changes. + /// + /// The event arg type. + /// Data for the triggered event. + public delegate void InventoryChangedDelegate(T data) where T : InventoryEventArgs; + /// /// Event that is fired when the inventory has been changed.
/// Note that some events, such as , , and @@ -77,4 +85,22 @@ public interface IGameInventory /// Event that is fired when an item is merged from two stacks into one. ///
public event InventoryChangedDelegate ItemMerged; + + /// + public event InventoryChangedDelegate ItemAddedExplicit; + + /// + public event InventoryChangedDelegate ItemRemovedExplicit; + + /// + public event InventoryChangedDelegate ItemChangedExplicit; + + /// + public event InventoryChangedDelegate ItemMovedExplicit; + + /// + public event InventoryChangedDelegate ItemSplitExplicit; + + /// + public event InventoryChangedDelegate ItemMergedExplicit; }