@@ -40,7 +40,10 @@ static_assert(sizeof(NWN2ParamsList) == 8);
40
40
static struct NWN2ParamsList * nwn2_scriptparams = (struct NWN2ParamsList *)(0x0086F15C );
41
41
// static size_t scriptparams_count = 0;
42
42
43
- struct CVirtualMachine { };
43
+ struct CVirtualMachine {
44
+ uint32_t _;
45
+ uint32_t execscript_ret_value;
46
+ };
44
47
static CVirtualMachine** nwn2_vm
45
48
= std::bit_cast<struct CVirtualMachine **>(NWN2_OFFSET_CVIRTUALMACHINE);
46
49
@@ -57,37 +60,41 @@ static CVirtualMachine_ExecuteScript_t CVirtualMachine_ExecuteScript
57
60
using CVirtualMachine_ExecuteScriptEnhanced_t
58
61
= int32_t (__thiscall*)(CVirtualMachine* thisVM,
59
62
const NWN::CExoString& scriptName,
60
- // const NWN::CExoString& scriptName,
61
63
NWN::OBJECTID objectID,
62
64
void * ParamList,
63
65
uint32_t unknow1,
64
66
uint32_t unknow2);
65
67
static CVirtualMachine_ExecuteScriptEnhanced_t CVirtualMachine_ExecuteScriptEnhanced
66
68
= std::bit_cast<CVirtualMachine_ExecuteScriptEnhanced_t>(NWN2_OFFSET_EXECUTESCRIPT_ENH);
67
69
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);
72
74
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);
77
79
78
80
namespace NWScript {
79
81
80
- void ExecuteScript (const char * sScript , NWN::OBJECTID oTarget)
82
+ void ExecuteScript (const char * sScript , NWN::OBJECTID oTarget, bool * outExecuted )
81
83
{
82
84
logger->Trace (" ExecuteScript %s, %lu" , sScript , oTarget);
83
- CVirtualMachine_ExecuteScript (
85
+ auto executed = CVirtualMachine_ExecuteScript (
84
86
*nwn2_vm,
85
87
NWN::CExoString {.m_sString = (char *)sScript , // un-const cast, safe as param is read only
86
88
.m_nBufferLength = strlen (sScript )},
87
89
oTarget, 1 , 1 );
90
+ if (outExecuted != nullptr )
91
+ *outExecuted = executed;
88
92
}
89
93
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)
91
98
{
92
99
logger->Trace (" ExecuteScriptEnhanced %s, %lu" , sScriptName , oTarget);
93
100
@@ -103,9 +110,12 @@ int32_t ExecuteScriptEnhanced(const char* sScriptName, NWN::OBJECTID oTarget, bo
103
110
int retValue
104
111
= CVirtualMachine_ExecuteScriptEnhanced (*nwn2_vm, script, oTarget, nwn2_scriptparams, 1 , 1 );
105
112
113
+ if (outExecuted != nullptr )
114
+ *outExecuted = retValue != 0 ;
115
+
106
116
// Is the script ok?
107
117
if (retValue != 0 )
108
- retValue = (( uint32_t *)* nwn2_vm)[ 1 ] ;
118
+ retValue = (* nwn2_vm)-> execscript_ret_value ;
109
119
else
110
120
retValue = -1 ;
111
121
0 commit comments