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;
}