Add typed event variants

This commit is contained in:
Soreepeong 2023-12-02 10:59:13 +09:00
parent b2fc0c4ad2
commit 35b0d53e80
2 changed files with 123 additions and 0 deletions

View file

@ -86,6 +86,24 @@ internal class GameInventory : IDisposable, IServiceType, IGameInventory
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate? ItemMerged;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemAddedArgs>? ItemAddedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemRemovedArgs>? ItemRemovedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemChangedArgs>? ItemChangedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemMovedArgs>? ItemMovedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemSplitArgs>? ItemSplitExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemMergedArgs>? ItemMergedExplicit;
/// <inheritdoc/>
public void Dispose()
{
@ -118,6 +136,19 @@ internal class GameInventory : IDisposable, IServiceType, IGameInventory
}
}
private static void InvokeSafely<T>(IGameInventory.InventoryChangedDelegate<T>? 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
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate? ItemMerged;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemAddedArgs>? ItemAddedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemRemovedArgs>? ItemRemovedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemChangedArgs>? ItemChangedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemMovedArgs>? ItemMovedExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemSplitArgs>? ItemSplitExplicit;
/// <inheritdoc/>
public event IGameInventory.InventoryChangedDelegate<InventoryItemMergedArgs>? ItemMergedExplicit;
/// <inheritdoc/>
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<InventoryEventArgs> 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);
}

View file

@ -25,6 +25,14 @@ public interface IGameInventory
/// <param name="data">Data for the triggered event.</param>
public delegate void InventoryChangedDelegate(GameInventoryEvent type, InventoryEventArgs data);
/// <summary>
/// Delegate function to be called for each change to inventories.
/// This delegate sends individual events for changes.
/// </summary>
/// <typeparam name="T">The event arg type.</typeparam>
/// <param name="data">Data for the triggered event.</param>
public delegate void InventoryChangedDelegate<in T>(T data) where T : InventoryEventArgs;
/// <summary>
/// Event that is fired when the inventory has been changed.<br />
/// Note that some events, such as <see cref="ItemAdded"/>, <see cref="ItemRemoved"/>, and <see cref="ItemChanged"/>
@ -77,4 +85,22 @@ public interface IGameInventory
/// Event that is fired when an item is merged from two stacks into one.
/// </summary>
public event InventoryChangedDelegate ItemMerged;
/// <inheritdoc cref="ItemAdded"/>
public event InventoryChangedDelegate<InventoryItemAddedArgs> ItemAddedExplicit;
/// <inheritdoc cref="ItemRemoved"/>
public event InventoryChangedDelegate<InventoryItemRemovedArgs> ItemRemovedExplicit;
/// <inheritdoc cref="ItemChanged"/>
public event InventoryChangedDelegate<InventoryItemChangedArgs> ItemChangedExplicit;
/// <inheritdoc cref="ItemMoved"/>
public event InventoryChangedDelegate<InventoryItemMovedArgs> ItemMovedExplicit;
/// <inheritdoc cref="ItemSplit"/>
public event InventoryChangedDelegate<InventoryItemSplitArgs> ItemSplitExplicit;
/// <inheritdoc cref="ItemMerged"/>
public event InventoryChangedDelegate<InventoryItemMergedArgs> ItemMergedExplicit;
}