diff --git a/NWN.Anvil/src/main/API/Events/Native/BarterEvents/OnBarterAddItem.cs b/NWN.Anvil/src/main/API/Events/Native/BarterEvents/OnBarterAddItem.cs
new file mode 100644
index 000000000..79155b6d3
--- /dev/null
+++ b/NWN.Anvil/src/main/API/Events/Native/BarterEvents/OnBarterAddItem.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Runtime.InteropServices;
+using Anvil.API.Events;
+using Anvil.Native;
+using Anvil.Services;
+using NWN.Native.API;
+
+namespace Anvil.API.Events
+{
+ public sealed class OnBarterBarterAddItem : IEvent
+ {
+ public NwPlayer BarterTarget { get; private init; } = null!;
+ public NwPlayer Initiator { get; private init; } = null!;
+
+ public NwItem Item { get; private init; } = null!;
+
+ ///
+ /// Gets or sets if the AddItem trigger event should be skipped.
+ ///
+ public bool Skip { get; set; }
+
+ NwObject IEvent.Context => Item;
+
+ public sealed unsafe class Factory : HookEventFactory
+ {
+ private static FunctionHook Hook { get; set; } = null!;
+
+ protected override IDisposable[] RequestHooks()
+ {
+ delegate* unmanaged pHook = &OnBarterBarterAddItem;
+ Hook = HookService.RequestHook(pHook, HookOrder.Early);
+ return [Hook];
+
+ }
+
+ [UnmanagedCallersOnly]
+ private static void OnBarterBarterAddItem(void* pInitiator, void* pTargetPlayer, uint oidItem)
+ {
+ OnBarterBarterAddItem eventData = new OnBarterBarterAddItem
+ {
+ Initiator = CNWSPlayer.FromPointer(pInitiator).ToNwPlayer()!,
+ BarterTarget = CNWSPlayer.FromPointer(pTargetPlayer).ToNwPlayer()!,
+ Item = oidItem.ToNwObject()!,
+ };
+
+ if (!eventData.Skip)
+ {
+ Hook.CallOriginal(pInitiator, pTargetPlayer, oidItem);
+ }
+ else
+ {
+ ProcessEvent(EventCallbackType.After, eventData);
+ }
+ }
+ }
+ }
+}
+
+namespace Anvil.API
+{
+ public sealed partial class NwPlayer
+ {
+ ///
+ public event Action OnBarterBarterAddItem
+ {
+ add => EventService.Subscribe(ControlledCreature, value);
+ remove => EventService.Unsubscribe(ControlledCreature, value);
+ }
+ }
+
+ public sealed partial class NwModule
+ {
+ ///
+ public event Action OnBarterBarterAddItem
+ {
+ add => EventService.SubscribeAll(value);
+ remove => EventService.UnsubscribeAll(value);
+ }
+ }
+}
diff --git a/NWN.Anvil/src/main/Native/Functions/Functions.CNWSBarter.cs b/NWN.Anvil/src/main/Native/Functions/Functions.CNWSBarter.cs
index 1e2bda0db..c0fbf14ed 100644
--- a/NWN.Anvil/src/main/Native/Functions/Functions.CNWSBarter.cs
+++ b/NWN.Anvil/src/main/Native/Functions/Functions.CNWSBarter.cs
@@ -9,6 +9,11 @@ public static class CNWSBarter
{
[NativeFunction("_ZN10CNWSBarter15SetListAcceptedEi", "?SetListAccepted@CNWSBarter@@QEAAHH@Z")]
public delegate int SetListAccepted(void* pBarter, int bAccepted);
+
+ [NativeFunction("_ZN11CNWSMessage34HandlePlayerToServerBarter_AddItemEP10CNWSPlayer", )]
+ public delegate void AddItem(void* pInitiator, void* pTargetPlayer, uint oidItem);
}
}
}
+
+