Skip to content

Commit 851e3b7

Browse files
committed
Better documentation, added outExecuted params for ExecuteScript*
1 parent 35db225 commit 851e3b7

File tree

6 files changed

+76
-23
lines changed

6 files changed

+76
-23
lines changed

include/nwnx_cplugin.h

+24-3
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,41 @@ struct NWNXCPlugin_InitInfo {
2222
const char* nwn2_module_path;
2323
/// Path to the NWNX4 user directory, where nwnx4_controller.exe is located.
2424
const char* nwnx_install_path;
25-
25+
/// Function pointers to interact with the nwn2server instance
2626
const struct NWNXCPlugin_NWN2Hooks* nwn2_hooks;
2727
};
2828

29-
typedef void(ExecuteScriptFn)(const char* sScript, uint32_t oTarget);
29+
/// Bound to NWScript ExecuteScript function
30+
/// @param outExecuted If not null, the bool will be set to true if the script
31+
/// has been successfully executed.
32+
typedef void(ExecuteScriptFn)(const char* sScript, uint32_t oTarget, bool* outExecuted);
33+
/// Bound to NWScript ExecuteScriptEnhanced function
34+
/// @param outExecuted If not null, the bool will be set to true if the script
35+
/// has been successfully executed. This is used to differenciate between a
36+
/// script returning the value -1 and a script not being executed.
3037
typedef int32_t(ExecuteScriptEnhancedFn)(const char* sScriptName,
3138
uint32_t oTarget,
32-
bool bClearParams);
39+
bool bClearParams,
40+
bool* outExecuted);
41+
/// Bound to NWScript AddScriptParameterInt function. Bound values are not
42+
/// shared between the NWScript and CPlugin environments
3343
typedef void(AddScriptParameterIntFn)(int32_t nParam);
44+
/// Bound to NWScript AddScriptParameterString function. Bound values are not
45+
/// shared between the NWScript and CPlugin environments.
46+
/// @warning The string value is only borrowed and must live at least until
47+
/// ExecuteScriptEnhanced is called
3448
typedef void(AddScriptParameterStringFn)(const char* sParam);
49+
/// Bound to NWScript AddScriptParameterFloat function. Bound values are not
50+
/// shared between the NWScript and CPlugin environments
3551
typedef void(AddScriptParameterFloatFn)(float fParam);
52+
/// Bound to NWScript AddScriptParameterObject function. Bound values are not
53+
/// shared between the NWScript and CPlugin environments
3654
typedef void(AddScriptParameterObjectFn)(uint32_t oParam);
55+
/// Bound to NWScript ClearScriptParams function. Only clears the bound values
56+
/// from the CPlugin environment
3757
typedef void(ClearScriptParamsFn)();
3858

59+
/// Function pointers to interact with the nwn2server instance
3960
struct NWNXCPlugin_NWN2Hooks {
4061
ExecuteScriptFn* ExecuteScript;
4162
ExecuteScriptEnhancedFn* ExecuteScriptEnhanced;

src/hook/scriptManagement.cpp

+24-14
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ static_assert(sizeof(NWN2ParamsList) == 8);
4040
static struct NWN2ParamsList* nwn2_scriptparams = (struct NWN2ParamsList*)(0x0086F15C);
4141
// static size_t scriptparams_count = 0;
4242

43-
struct CVirtualMachine { };
43+
struct CVirtualMachine {
44+
uint32_t _;
45+
uint32_t execscript_ret_value;
46+
};
4447
static CVirtualMachine** nwn2_vm
4548
= std::bit_cast<struct CVirtualMachine**>(NWN2_OFFSET_CVIRTUALMACHINE);
4649

@@ -57,37 +60,41 @@ static CVirtualMachine_ExecuteScript_t CVirtualMachine_ExecuteScript
5760
using CVirtualMachine_ExecuteScriptEnhanced_t
5861
= int32_t(__thiscall*)(CVirtualMachine* thisVM,
5962
const NWN::CExoString& scriptName,
60-
// const NWN::CExoString& scriptName,
6163
NWN::OBJECTID objectID,
6264
void* ParamList,
6365
uint32_t unknow1,
6466
uint32_t unknow2);
6567
static CVirtualMachine_ExecuteScriptEnhanced_t CVirtualMachine_ExecuteScriptEnhanced
6668
= std::bit_cast<CVirtualMachine_ExecuteScriptEnhanced_t>(NWN2_OFFSET_EXECUTESCRIPT_ENH);
6769

68-
//
69-
using CVirtualMachine_InitParam_t = void(__thiscall*)(void* paramLst, uint32_t iNb);
70-
static CVirtualMachine_InitParam_t CVirtualMachine_InitParam
71-
= std::bit_cast<CVirtualMachine_InitParam_t>(NWN2_OFFSET_InitParam);
70+
// //
71+
// using CVirtualMachine_InitParam_t = void(__thiscall*)(void* paramLst, uint32_t iNb);
72+
// static CVirtualMachine_InitParam_t CVirtualMachine_InitParam
73+
// = std::bit_cast<CVirtualMachine_InitParam_t>(NWN2_OFFSET_InitParam);
7274

73-
//
74-
using CVirtualMachine_CleanParam_t = void(__thiscall*)(void* paramLst);
75-
static CVirtualMachine_CleanParam_t CVirtualMachine_CleanParam
76-
= std::bit_cast<CVirtualMachine_CleanParam_t>(NWN2_OFFSET_CleanParam);
75+
// //
76+
// using CVirtualMachine_CleanParam_t = void(__thiscall*)(void* paramLst);
77+
// static CVirtualMachine_CleanParam_t CVirtualMachine_CleanParam
78+
// = std::bit_cast<CVirtualMachine_CleanParam_t>(NWN2_OFFSET_CleanParam);
7779

7880
namespace NWScript {
7981

80-
void ExecuteScript(const char* sScript, NWN::OBJECTID oTarget)
82+
void ExecuteScript(const char* sScript, NWN::OBJECTID oTarget, bool* outExecuted)
8183
{
8284
logger->Trace("ExecuteScript %s, %lu", sScript, oTarget);
83-
CVirtualMachine_ExecuteScript(
85+
auto executed = CVirtualMachine_ExecuteScript(
8486
*nwn2_vm,
8587
NWN::CExoString {.m_sString = (char*)sScript, // un-const cast, safe as param is read only
8688
.m_nBufferLength = strlen(sScript)},
8789
oTarget, 1, 1);
90+
if (outExecuted != nullptr)
91+
*outExecuted = executed;
8892
}
8993

90-
int32_t ExecuteScriptEnhanced(const char* sScriptName, NWN::OBJECTID oTarget, bool bClearParams)
94+
int32_t ExecuteScriptEnhanced(const char* sScriptName,
95+
NWN::OBJECTID oTarget,
96+
bool bClearParams,
97+
bool* outExecuted)
9198
{
9299
logger->Trace("ExecuteScriptEnhanced %s, %lu", sScriptName, oTarget);
93100

@@ -103,9 +110,12 @@ int32_t ExecuteScriptEnhanced(const char* sScriptName, NWN::OBJECTID oTarget, bo
103110
int retValue
104111
= CVirtualMachine_ExecuteScriptEnhanced(*nwn2_vm, script, oTarget, nwn2_scriptparams, 1, 1);
105112

113+
if (outExecuted != nullptr)
114+
*outExecuted = retValue != 0;
115+
106116
// Is the script ok?
107117
if (retValue != 0)
108-
retValue = ((uint32_t*)*nwn2_vm)[1];
118+
retValue = (*nwn2_vm)->execscript_ret_value;
109119
else
110120
retValue = -1;
111121

src/hook/scriptManagement.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
namespace NWScript {
1111

1212
extern "C" {
13-
void ExecuteScript(const char* sScript, NWN::OBJECTID oTarget);
14-
int32_t ExecuteScriptEnhanced(const char* sScriptName, NWN::OBJECTID oTarget, bool bClearParams);
13+
void ExecuteScript(const char* sScript, NWN::OBJECTID oTarget, bool* outExecuted = NULL);
14+
int32_t ExecuteScriptEnhanced(const char* sScriptName,
15+
NWN::OBJECTID oTarget,
16+
bool bClearParams,
17+
bool* outExecuted = NULL);
1518
void AddScriptParameterInt(int32_t nParam);
1619
void AddScriptParameterString(const char* sParam);
1720
void AddScriptParameterFloat(float fParam);

src/plugins/xp_example_cplugin/cplugin_example.cpp

+20-4
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,35 @@ NWNXCPlugin_GetInt(void* cplugin, const char* sFunction, const char* sParam1, in
105105
return plugin->counter;
106106
} else if (function == "TEST_EXECUTESCRIPT") {
107107
constexpr uint32_t OBJID_MODULE = 0;
108-
plugin->hooks.ExecuteScript("gui_test_executescript", OBJID_MODULE);
109-
return 12;
108+
bool executed = false;
109+
plugin->hooks.ExecuteScript("gui_test_executescript", OBJID_MODULE, &executed);
110+
return executed == true ? 12 : 0;
111+
} else if (function == "TEST_EXECUTESCRIPTBAD") {
112+
constexpr uint32_t OBJID_MODULE = 0;
113+
bool executed = true;
114+
plugin->hooks.ExecuteScript("euqsgdihohcqsc", OBJID_MODULE, &executed);
115+
return executed == false ? 13 : 0;
110116
} else if (function == "TEST_EXECUTESCRIPTENH") {
111117
constexpr uint32_t OBJID_MODULE = 0;
112118
plugin->hooks.ClearScriptParams();
113119
plugin->hooks.AddScriptParameterString(sParam1);
114120
plugin->hooks.AddScriptParameterFloat(13.37f);
115121
plugin->hooks.AddScriptParameterInt(-1234);
116122
plugin->hooks.AddScriptParameterObject(0x01020304);
117-
return plugin->hooks.ExecuteScriptEnhanced("gui_test_executescriptenh", OBJID_MODULE, true);
123+
bool executed = false;
124+
auto res = plugin->hooks.ExecuteScriptEnhanced("gui_test_executescriptenh", OBJID_MODULE,
125+
true, &executed);
126+
if (!executed)
127+
res -= 1000;
128+
return res;
118129
} else if (function == "TEST_EXECUTESCRIPTENHBAD") {
119130
constexpr uint32_t OBJID_MODULE = 0;
120-
return plugin->hooks.ExecuteScriptEnhanced("euqsgdihohcqsc", OBJID_MODULE, true);
131+
bool executed = true;
132+
auto res
133+
= plugin->hooks.ExecuteScriptEnhanced("euqsgdihohcqsc", OBJID_MODULE, true, &executed);
134+
if (executed)
135+
res -= 1000;
136+
return res;
121137
} else {
122138
plugin->logFile << " ERROR: NWNXCPlugin_GetInt: unknown function \"" << function << "\""
123139
<< std::endl;
102 Bytes
Binary file not shown.

test/modules/NWNX4UnitTests/onmoduleload.nss

+3
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ void xp_example_cplugin(){
198198
AssertEqS(GetLocalString(GetModule(), "testexescript"), "executed", __FUNCTION__, __LINE__);
199199
DeleteLocalString(GetModule(), "testexescript");
200200

201+
// CPlugin call
202+
AssertEqI(NWNXGetInt("CPluginExample", "TEST_EXECUTESCRIPTBAD", "", 0), 13, __FUNCTION__, __LINE__);
203+
201204
// CPlugin call
202205
AssertEqI(NWNXGetInt("CPluginExample", "TEST_EXECUTESCRIPTENH", "hellow orld", 0), 20, __FUNCTION__, __LINE__);
203206
AssertEqS(GetLocalString(GetModule(), "testexescriptenh_string"), "hellow orld", __FUNCTION__, __LINE__);

0 commit comments

Comments
 (0)