From 3ddb7d7070833e17e3463e4d833f1368ddc2ee7b Mon Sep 17 00:00:00 2001 From: pyro7r34d Date: Thu, 26 Feb 2026 16:28:41 -0500 Subject: [PATCH] Add On Barter Add Item First Draft -- not complete #858 --- .../Native/BarterEvents/OnBarterAddItem.cs | 80 +++++++++++++++++++ .../Native/Functions/Functions.CNWSBarter.cs | 5 ++ 2 files changed, 85 insertions(+) create mode 100644 NWN.Anvil/src/main/API/Events/Native/BarterEvents/OnBarterAddItem.cs 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); } } } + +