Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ https://github.com/nwnxee/unified/compare/build8193.37.13...HEAD
- Events: Added events `NWNX_ON_ABILITY_CHANGE_{BEFORE|AFTER}` which fire when an ability of a player changes.
- Events: Added `NWNX_EVENT_INIT_ON_FIRST_SUBSCRIBE` messagebus message as a wrapper for the `InitOnFirstSubscribe` function. Broadcasts `NWNX_EVENT_INIT_ON_FIRST_SUBSCRIBE_CALLBACK` message when a registered event gets subscribed to.
- Tweaks: Added `NWNX_TWEAKS_CHARLIST_SORT_BY_LAST_PLAYED_DATE` to enable character list sorting by last played date
- Events: Added events `NWNX_ON_DECREMENT_REMAINING_FEAT_USES_{BEFORE|AFTER}` which fire when the remaining uses of a feat are decremented

##### New Plugins
- N/A
Expand Down
25 changes: 25 additions & 0 deletions Plugins/Events/Events/FeatEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,23 @@ using namespace NWNXLib::Services;

static Hooks::Hook s_UseFeatHook;
static Hooks::Hook s_HasFeatHook;
static Hooks::Hook s_DecrementFeatRemainingUsesHook;

static int32_t UseFeatHook(CNWSCreature*, uint16_t, uint16_t, ObjectID, ObjectID, Vector*);
static int32_t HasFeatHook(CNWSCreatureStats*, uint16_t);
static void DecrementFeatRemainingUsesHook(CNWSCreatureStats*, uint16_t);

void FeatEvents() __attribute__((constructor));
void FeatEvents()
{
InitOnFirstSubscribe("NWNX_ON_USE_FEAT_.*", []() {
s_UseFeatHook = Hooks::HookFunction(&CNWSCreature::UseFeat, &UseFeatHook, Hooks::Order::Early);
});

InitOnFirstSubscribe("NWNX_ON_DECREMENT_REMAINING_FEAT_USES_.*", []() {
s_DecrementFeatRemainingUsesHook = Hooks::HookFunction(&CNWSCreatureStats::DecrementFeatRemainingUses, &DecrementFeatRemainingUsesHook, Hooks::Order::Early);
});

InitOnFirstSubscribe("NWNX_ON_HAS_FEAT_.*", []() {
ForceEnableWhitelist("NWNX_ON_HAS_FEAT");
s_HasFeatHook = Hooks::HookFunction(&CNWSCreatureStats::HasFeat, &HasFeatHook, Hooks::Order::Early);
Expand Down Expand Up @@ -56,6 +63,24 @@ int32_t UseFeatHook(CNWSCreature* thisPtr, uint16_t nFeat, uint16_t nSubFeat, Ob
return retVal;
}

static void DecrementFeatRemainingUsesHook(CNWSCreatureStats* thisPtr, uint16_t nFeat)
{
uint8_t nRemainingUses = thisPtr->GetFeatRemainingUses(nFeat);
auto PushAndSignal = [&](const std::string& ev, int nRemaining) -> bool {
PushEventData("FEAT_ID", std::to_string(nFeat));
PushEventData("REMAINING_USES", std::to_string(nRemaining));
return SignalEvent(ev, thisPtr->m_pBaseCreature->m_idSelf);
};

if (PushAndSignal("NWNX_ON_DECREMENT_REMAINING_FEAT_USES_BEFORE", nRemainingUses))
{
s_DecrementFeatRemainingUsesHook->CallOriginal<void>(thisPtr, nFeat);
nRemainingUses = thisPtr->GetFeatRemainingUses(nFeat);
}

PushAndSignal("NWNX_ON_DECREMENT_REMAINING_FEAT_USES_AFTER", nRemainingUses);
}

int32_t HasFeatHook(CNWSCreatureStats* thisPtr, uint16_t nFeat)
{
int32_t retVal;
Expand Down
17 changes: 17 additions & 0 deletions Plugins/Events/NWScript/nwnx_events.nss
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,20 @@ _______________________________________
TARGET_POSITION_Z | float | |
ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events

_______________________________________
## Feat Decrement Remaining Uses Events
- NWNX_ON_DECREMENT_REMAINING_FEAT_USES_BEFORE
- NWNX_ON_DECREMENT_REMAINING_FEAT_USES_AFTER

`OBJECT_SELF` = The object owning the feat

Event Data Tag | Type | Notes |
----------------------|--------|-------|
FEAT_ID | int | |
REMAINING_USES | int | Decremented by 1 in the _AFTER event if the _BEFORE event wasn't skipped |

@note Skipping the _BEFORE event will prevent the feat uses being decremented

_______________________________________
## Has Feat Events
- NWNX_ON_HAS_FEAT_BEFORE
Expand Down Expand Up @@ -1856,6 +1870,8 @@ const string NWNX_ON_ITEM_ACQUIRE_BEFORE = "NWNX_ON_ITEM_ACQUIRE_BEFORE";
const string NWNX_ON_ITEM_ACQUIRE_AFTER = "NWNX_ON_ITEM_ACQUIRE_AFTER";
const string NWNX_ON_USE_FEAT_BEFORE = "NWNX_ON_USE_FEAT_BEFORE";
const string NWNX_ON_USE_FEAT_AFTER = "NWNX_ON_USE_FEAT_AFTER";
const string NWNX_ON_DECREMENT_REMAINING_FEAT_USES_BEFORE = "NWNX_ON_DECREMENT_REMAINING_FEAT_USES_BEFORE";
const string NWNX_ON_DECREMENT_REMAINING_FEAT_USES_AFTER = "NWNX_ON_DECREMENT_REMAINING_FEAT_USES_AFTER";
const string NWNX_ON_HAS_FEAT_BEFORE = "NWNX_ON_HAS_FEAT_BEFORE";
const string NWNX_ON_HAS_FEAT_AFTER = "NWNX_ON_HAS_FEAT_AFTER";
const string NWNX_ON_DM_GIVE_GOLD_BEFORE = "NWNX_ON_DM_GIVE_GOLD_BEFORE";
Expand Down Expand Up @@ -2309,6 +2325,7 @@ string NWNX_Events_GetEventData(string tag);
/// - CharacterSheetPermitted event
/// - Input Drop Item
/// - Decrement Spell Count event
/// - Decrement Remaining Feat Uses event
/// - Play Visual Effect event
/// - EventScript event
/// - Broadcast Safe Projectile event
Expand Down