Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding new functions: NWNX_ON_PLACEABLE_OPEN_{OPEN|CLOSE}_{BEFORE|AFTER} #1691

Merged
merged 15 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from 4 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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ https://github.com/nwnxee/unified/compare/build8193.35.40...HEAD
- Events: added event `NWNX_ON_SPELL_FAILED_{BEFORE|AFTER}` which fires when the casting of a spell did not finish for any reason.
- Tweaks: added `NWNX_TWEAKS_FIX_AUTOMAP_CRASH` which fixes a server crash that happens when automap data is outdated for a player.
- Events: added event `NWNX_ON_ATTACK_TARGET_CHANGE_{BEFORE|AFTER}` which fires when a creature changes its attack target.
- Events: added `NWNX_ON_OBJECT_OPEN_{BEFORE|AFTER}` which fires when player opens a placeable.
- Events: added `NWNX_ON_OBJECT_CLOSE_{BEFORE|AFTER}` which fires when player closes a placeable.

##### New Plugins
- Resources: Adds `RESOURCES_*` variables for adding NWSync as a resource source, and specifying a replacement hak list.
Expand Down
67 changes: 67 additions & 0 deletions Plugins/Events/Events/ObjectEvents.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "Events.hpp"
#include "API/CNWSObject.hpp"
#include "API/CNWSPlaceable.hpp"

namespace Events {

Expand All @@ -10,11 +11,15 @@ using namespace NWNXLib::API::Constants;
static NWNXLib::Hooks::Hook s_AddLockObjectActionHook;
static NWNXLib::Hooks::Hook s_AddUnlockObjectActionHook;
static NWNXLib::Hooks::Hook s_AddUseObjectActionHook;
static NWNXLib::Hooks::Hook s_AddOpenObjectActionHook;
static NWNXLib::Hooks::Hook s_AddCloseObjectActionHook;
static NWNXLib::Hooks::Hook s_BroadcastSafeProjectileHook;

static int32_t AddLockObjectActionHook(CNWSObject*, ObjectID);
static int32_t AddUnlockObjectActionHook(CNWSObject*, ObjectID, ObjectID, int32_t);
static int32_t AddUseObjectActionHook(CNWSObject*, ObjectID);
static int32_t AddOpenObjectActionHook(CNWSObject*, ObjectID);
static int32_t AddCloseObjectActionHook(CNWSObject*, ObjectID);
static void BroadcastSafeProjectileHook(CNWSObject*, ObjectID, ObjectID, Vector, Vector, uint32_t, uint8_t, uint32_t, uint8_t, uint8_t);

void ObjectEvents() __attribute__((constructor));
Expand All @@ -34,6 +39,16 @@ void ObjectEvents()
s_AddUseObjectActionHook = Hooks::HookFunction(&CNWSObject::AddUseObjectAction,
(void*)&AddUseObjectActionHook, Hooks::Order::Early);
});

InitOnFirstSubscribe("NWNX_ON_OBJECT_OPEN_.*", []() {
s_AddOpenObjectActionHook = Hooks::HookFunction(&CNWSPlaceable::OpenInventory,
(void*)&AddOpenObjectActionHook, Hooks::Order::Early);
});

InitOnFirstSubscribe("NWNX_ON_OBJECT_CLOSE_.*", []() {
s_AddCloseObjectActionHook = Hooks::HookFunction(&CNWSPlaceable::CloseInventory,
(void*)&AddCloseObjectActionHook, Hooks::Order::Early);
});

InitOnFirstSubscribe("NWNX_ON_BROADCAST_SAFE_PROJECTILE_.*", []() {
s_BroadcastSafeProjectileHook = Hooks::HookFunction(&CNWSObject::BroadcastSafeProjectile,
Expand Down Expand Up @@ -117,6 +132,58 @@ int32_t AddUseObjectActionHook(CNWSObject *thisPtr, ObjectID oidObjectToUse)
return retVal;
}

int32_t AddOpenObjectActionHook(CNWSObject *thisPtr, ObjectID oidObjectToOpen)
{
int32_t retVal;

auto PushAndSignal = [&](const std::string& ev) -> bool {
PushEventData("OBJECT", Utils::ObjectIDToString(thisPtr->m_idSelf));
return SignalEvent(ev, oidObjectToOpen);
};

if (PushAndSignal("NWNX_ON_OBJECT_OPEN_BEFORE"))
{
retVal = s_AddOpenObjectActionHook->CallOriginal<int32_t>(thisPtr, oidObjectToOpen);
}
else
{
retVal = false;
}


PushEventData("ACTION_RESULT", std::to_string(retVal));
PushAndSignal("NWNX_ON_OBJECT_OPEN_AFTER");

return retVal;
}

int32_t AddCloseObjectActionHook(CNWSObject *thisPtr, ObjectID oidObjectToClose)
{
int32_t retVal;

auto PushAndSignal = [&](const std::string& ev) -> bool {
PushEventData("OBJECT", Utils::ObjectIDToString(thisPtr->m_idSelf));
return SignalEvent(ev, oidObjectToClose);
};

if (PushAndSignal("NWNX_ON_OBJECT_CLOSE_BEFORE"))
{
retVal = s_AddCloseObjectActionHook->CallOriginal<int32_t>(thisPtr, oidObjectToClose);
}
else
{
retVal = false;
}


PushEventData("ACTION_RESULT", std::to_string(retVal));
PushAndSignal("NWNX_ON_OBJECT_CLOSE_AFTER");

return retVal;
}



void BroadcastSafeProjectileHook(CNWSObject *thisPtr, ObjectID oidOriginator, ObjectID oidTarget, Vector vOriginator, Vector vTarget, uint32_t nDelta,
uint8_t nProjectileType, uint32_t nSpellID, uint8_t nAttackResult, uint8_t nProjectilePathType)
{
Expand Down
24 changes: 24 additions & 0 deletions Plugins/Events/NWScript/nwnx_events.nss
Original file line number Diff line number Diff line change
Expand Up @@ -1602,6 +1602,26 @@ _______________________________________
Event Data Tag | Type | Notes
----------------------|--------|-------
OBJECT | object | The Object being used |
_______________________________________
## Object Open Events (Placeables)
- NWNX_ON_OBJECT_OPEN_BEFORE
- NWNX_ON_OBJECT_OPEN_AFTER

`OBJECT_SELF` = The player using the object

Event Data Tag | Type | Notes
----------------------|--------|-------
OBJECT | object | The Object being opened |
_______________________________________
## Object Close Events (Placeables)
- NWNX_ON_OBJECT_CLOSE_BEFORE
- NWNX_ON_OBJECT_CLOSE_AFTER

`OBJECT_SELF` = The player using the object

Event Data Tag | Type | Notes
----------------------|--------|-------
OBJECT | object | The Object being closed |
_______________________________________
## Broadcast Safe Projectile Events
- NWNX_ON_BROADCAST_SAFE_PROJECTILE_BEFORE
Expand Down Expand Up @@ -2002,6 +2022,10 @@ const string NWNX_ON_RUN_EVENT_SCRIPT_BEFORE = "NWNX_ON_RUN_EVENT_SCRIPT_BEFORE"
const string NWNX_ON_RUN_EVENT_SCRIPT_AFTER = "NWNX_ON_RUN_EVENT_SCRIPT_AFTER";
const string NWNX_ON_OBJECT_USE_BEFORE = "NWNX_ON_OBJECT_USE_BEFORE";
const string NWNX_ON_OBJECT_USE_AFTER = "NWNX_ON_OBJECT_USE_AFTER";
const string NWNX_ON_OBJECT_OPEN_BEFORE = "NWNX_ON_OBJECT_OPEN_BEFORE";
const string NWNX_ON_OBJECT_OPEN_AFTER = "NWNX_ON_OBJECT_OPEN_AFTER";
const string NWNX_ON_OBJECT_CLOSE_BEFORE = "NWNX_ON_OBJECT_CLOSE_BEFORE";
const string NWNX_ON_OBJECT_CLOSE_AFTER = "NWNX_ON_OBJECT_CLOSE_AFTER";
const string NWNX_ON_BROADCAST_SAFE_PROJECTILE_BEFORE = "NWNX_ON_BROADCAST_SAFE_PROJECTILE_BEFORE";
const string NWNX_ON_BROADCAST_SAFE_PROJECTILE_AFTER = "NWNX_ON_BROADCAST_SAFE_PROJECTILE_AFTER";
const string NWNX_ON_BROADCAST_ATTACK_OF_OPPORTUNITY_BEFORE = "NWNX_ON_BROADCAST_ATTACK_OF_OPPORTUNITY_BEFORE";
Expand Down
Empty file modified Plugins/SWIG/SWIG_DotNET/postprocess.sh
100644 → 100755
Empty file.