From 9ac747e7060f58c6b7eadddb163c932d4a207131 Mon Sep 17 00:00:00 2001 From: KitRifty Date: Fri, 9 Jun 2023 03:39:54 +0000 Subject: [PATCH 1/2] Add hScope argument to Execute Add VScript_ReleaseScript Fix gamedata --- gamedata/vscript.txt | 18 ++++++++++++++++++ scripting/include/vscript.inc | 15 ++++++++++++--- scripting/vscript.sp | 16 +++++++++++++++- scripting/vscript/execute.sp | 8 ++++---- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/gamedata/vscript.txt b/gamedata/vscript.txt index 2b13b05..6131489 100644 --- a/gamedata/vscript.txt +++ b/gamedata/vscript.txt @@ -174,6 +174,12 @@ "windows" "10" } + "IScriptVM::ReleaseScript" + { + "linux" "9" + "windows" "11" + } + "IScriptVM::ExecuteFunction" { "linux" "17" @@ -318,6 +324,18 @@ "linux" "60" "windows" "60" } + + "IScriptVM::CompileScript" + { + "linux" "9" + "windows" "11" + } + + "IScriptVM::ReleaseScript" + { + "linux" "10" + "windows" "12" + } } } } \ No newline at end of file diff --git a/scripting/include/vscript.inc b/scripting/include/vscript.inc index e147fd2..63f18a2 100644 --- a/scripting/include/vscript.inc +++ b/scripting/include/vscript.inc @@ -221,7 +221,8 @@ methodmap VScriptExecute < Handle // Creates a new handle to execute a script function // // @param script Script address to execute. - public native VScriptExecute(HSCRIPT script); + // @param scope The script scope to execute the script inside of. + public native VScriptExecute(HSCRIPT script, HSCRIPT scope = view_as(0)); // Adds a new parameter at the end // @@ -265,7 +266,7 @@ native void VScript_ResetScriptVM(); * @param script Script to compile * @param id Optional ID to set * - * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using HSCRIPT.Release() + * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using VScript_ReleaseScript(). */ native HSCRIPT VScript_CompileScript(const char[] script, const char[] id = NULL_STRING); @@ -274,11 +275,18 @@ native HSCRIPT VScript_CompileScript(const char[] script, const char[] id = NULL * * @param filepath Filepath to get a script, 'scripts/vscripts/' are automatically added to the filepath * - * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using HSCRIPT.Release() + * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using VScript_ReleaseScript(). * @error Invalid filepath. */ native HSCRIPT VScript_CompileScriptFile(const char[] filepath); +/** + * Releases a compiled script. + * + * @param hscript HSCRIPT of compiled script + */ +native void VScript_ReleaseScript(HSCRIPT hscript); + /** * Creates a new HSCRIPT table, it MUST be deleted when no longer needed by using HSCRIPT.Release() * @@ -423,6 +431,7 @@ public void __pl_vscript_SetNTVOptional() MarkNativeAsOptional("VScript_ResetScriptVM"); MarkNativeAsOptional("VScript_CompileScript"); MarkNativeAsOptional("VScript_CompileScriptFile"); + MarkNativeAsOptional("VScript_ReleaseScript"); MarkNativeAsOptional("VScript_CreateTable"); MarkNativeAsOptional("VScript_GetAllClasses"); MarkNativeAsOptional("VScript_GetClass"); diff --git a/scripting/vscript.sp b/scripting/vscript.sp index 3acf4b3..77eca8d 100644 --- a/scripting/vscript.sp +++ b/scripting/vscript.sp @@ -13,6 +13,7 @@ int g_iScriptVariant_type; static Handle g_hSDKGetScriptDesc; static Handle g_hSDKCallCompileScript; +static Handle g_hSDKCallReleaseScript; static Handle g_hSDKCallRegisterInstance; static Handle g_hSDKCallSetInstanceUniqeId; static Handle g_hSDKCallGetInstanceValue; @@ -91,6 +92,7 @@ public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iLen CreateNative("VScript_ResetScriptVM", Native_ResetScriptVM); CreateNative("VScript_CompileScript", Native_CompileScript); CreateNative("VScript_CompileScriptFile", Native_CompileScriptFile); + CreateNative("VScript_ReleaseScript", Native_ReleaseScript); CreateNative("VScript_CreateTable", Native_CreateTable); CreateNative("VScript_GetAllClasses", Native_GetAllClasses); CreateNative("VScript_GetClass", Native_GetClass); @@ -134,6 +136,7 @@ public void OnPluginStart() LogError("Failed to create SDKCall: CTFPlayer::GetScriptDesc"); g_hSDKCallCompileScript = CreateSDKCall(hGameData, "IScriptVM", "CompileScript", SDKType_PlainOldData, SDKType_String, SDKType_String); + g_hSDKCallReleaseScript = CreateSDKCall(hGameData, "IScriptVM", "ReleaseScript", _, SDKType_PlainOldData); g_hSDKCallRegisterInstance = CreateSDKCall(hGameData, "IScriptVM", "RegisterInstance", SDKType_PlainOldData, SDKType_PlainOldData, SDKType_CBaseEntity); g_hSDKCallSetInstanceUniqeId = CreateSDKCall(hGameData, "IScriptVM", "SetInstanceUniqeId", _, SDKType_PlainOldData, SDKType_String); g_hSDKCallGetInstanceValue = CreateSDKCall(hGameData, "IScriptVM", "GetInstanceValue", SDKType_CBaseEntity, SDKType_PlainOldData, SDKType_PlainOldData); @@ -398,7 +401,10 @@ public any Native_Class_CreateFunction(Handle hPlugin, int iNumParams) public any Native_Execute(Handle hPlugin, int iNumParams) { - VScriptExecute aExecute = Execute_Create(GetNativeCell(1)); + HSCRIPT hScript = GetNativeCell(1); + HSCRIPT hScope = iNumParams > 1 ? GetNativeCell(2) : view_as(0); + + VScriptExecute aExecute = Execute_Create(hScript, hScope); VScriptExecute aClone = view_as(CloneHandle(aExecute, hPlugin)); delete aExecute; @@ -510,6 +516,14 @@ public any Native_CompileScriptFile(Handle hPlugin, int iNumParams) } } +public any Native_ReleaseScript(Handle hPlugin, int iNumParams) +{ + HSCRIPT hScript = GetNativeCell(1); + + SDKCall(g_hSDKCallReleaseScript, GetScriptVM(), hScript); + return 0; +} + public any Native_CreateTable(Handle hPlugin, int iNumParams) { return HScript_CreateTable(); diff --git a/scripting/vscript/execute.sp b/scripting/vscript/execute.sp index 5b10c22..01c9c1b 100644 --- a/scripting/vscript/execute.sp +++ b/scripting/vscript/execute.sp @@ -11,6 +11,7 @@ enum struct Execute { HSCRIPT pHScript; ExecuteParam nReturn; + HSCRIPT hScope; } static Handle g_hSDKCallExecuteFunction; @@ -20,14 +21,13 @@ void Execute_LoadGamedata(GameData hGameData) g_hSDKCallExecuteFunction = CreateSDKCall(hGameData, "IScriptVM", "ExecuteFunction", SDKType_PlainOldData, SDKType_PlainOldData, SDKType_PlainOldData, SDKType_PlainOldData, SDKType_PlainOldData, SDKType_PlainOldData, SDKType_Bool); } -/* TODO execute a function from a scope, so we can pass scope param */ - -VScriptExecute Execute_Create(HSCRIPT pHScript) +VScriptExecute Execute_Create(HSCRIPT pHScript, HSCRIPT hScope) { ArrayList aExecute = new ArrayList(sizeof(Execute)); Execute execute; execute.pHScript = pHScript; + execute.hScope = hScope; aExecute.PushArray(execute); return view_as(aExecute); } @@ -101,7 +101,7 @@ ScriptStatus_t Execute_Execute(VScriptExecute aExecute) hArgs.StoreToOffset((iParam * g_iScriptVariant_sizeof) + g_iScriptVariant_union, nValue, NumberType_Int32); } - ScriptStatus_t nStatus = SDKCall(g_hSDKCallExecuteFunction, GetScriptVM(), execute.pHScript, hArgs ? hArgs.Address : Address_Null, iNumParams, pReturn.Address, 0, true); + ScriptStatus_t nStatus = SDKCall(g_hSDKCallExecuteFunction, GetScriptVM(), execute.pHScript, hArgs ? hArgs.Address : Address_Null, iNumParams, pReturn.Address, execute.hScope, true); execute.nReturn.nType = pReturn.nType; execute.nReturn.nValue = pReturn.nValue; From f3ce6fe9a84504d63936577181faf2e6acc99dc4 Mon Sep 17 00:00:00 2001 From: KitRifty Date: Sat, 10 Jun 2023 14:13:19 +0000 Subject: [PATCH 2/2] Update Compile/ReleaseScript offsets in #default Add HSCRIPT.ReleaseScript Use HSCRIPT_RootTable as default for scope --- gamedata/vscript.txt | 20 ++++---------------- scripting/include/vscript.inc | 20 ++++++++------------ scripting/vscript.sp | 20 ++++++++------------ scripting/vscript/hscript.sp | 7 +++++++ 4 files changed, 27 insertions(+), 40 deletions(-) diff --git a/gamedata/vscript.txt b/gamedata/vscript.txt index 6131489..ff8a00d 100644 --- a/gamedata/vscript.txt +++ b/gamedata/vscript.txt @@ -170,14 +170,14 @@ "IScriptVM::CompileScript" // vtable dumper got it wrong { - "linux" "8" - "windows" "10" + "linux" "9" + "windows" "11" } "IScriptVM::ReleaseScript" { - "linux" "9" - "windows" "11" + "linux" "10" + "windows" "12" } "IScriptVM::ExecuteFunction" @@ -324,18 +324,6 @@ "linux" "60" "windows" "60" } - - "IScriptVM::CompileScript" - { - "linux" "9" - "windows" "11" - } - - "IScriptVM::ReleaseScript" - { - "linux" "10" - "windows" "12" - } } } } \ No newline at end of file diff --git a/scripting/include/vscript.inc b/scripting/include/vscript.inc index 63f18a2..8403e46 100644 --- a/scripting/include/vscript.inc +++ b/scripting/include/vscript.inc @@ -87,6 +87,9 @@ methodmap HSCRIPT < Address // Frees a HSCRIPT memory public native void Release(); + + // Frees a HSCRIPT memory. This is only used for compiled scripts. + public native void ReleaseScript(); } // Several functions accept null HScript as g_pScriptVM for root table @@ -222,7 +225,7 @@ methodmap VScriptExecute < Handle // // @param script Script address to execute. // @param scope The script scope to execute the script inside of. - public native VScriptExecute(HSCRIPT script, HSCRIPT scope = view_as(0)); + public native VScriptExecute(HSCRIPT script, HSCRIPT scope = HSCRIPT_RootTable); // Adds a new parameter at the end // @@ -266,7 +269,7 @@ native void VScript_ResetScriptVM(); * @param script Script to compile * @param id Optional ID to set * - * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using VScript_ReleaseScript(). + * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using HSCRIPT.ReleaseScript(). */ native HSCRIPT VScript_CompileScript(const char[] script, const char[] id = NULL_STRING); @@ -275,18 +278,11 @@ native HSCRIPT VScript_CompileScript(const char[] script, const char[] id = NULL * * @param filepath Filepath to get a script, 'scripts/vscripts/' are automatically added to the filepath * - * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using VScript_ReleaseScript(). + * @return HSCRIPT of script, null if could not compile. This MUST be freed when not in use by using HSCRIPT.ReleaseScript(). * @error Invalid filepath. */ native HSCRIPT VScript_CompileScriptFile(const char[] filepath); -/** - * Releases a compiled script. - * - * @param hscript HSCRIPT of compiled script - */ -native void VScript_ReleaseScript(HSCRIPT hscript); - /** * Creates a new HSCRIPT table, it MUST be deleted when no longer needed by using HSCRIPT.Release() * @@ -410,7 +406,8 @@ public void __pl_vscript_SetNTVOptional() MarkNativeAsOptional("HSCRIPT.SetValue"); MarkNativeAsOptional("HSCRIPT.SetValueString"); MarkNativeAsOptional("HSCRIPT.Release"); - + MarkNativeAsOptional("HSCRIPT.ReleaseScript"); + MarkNativeAsOptional("VScriptFunction.GetScriptName"); MarkNativeAsOptional("VScriptFunction.GetDescription"); MarkNativeAsOptional("VScriptFunction.Binding.get"); @@ -431,7 +428,6 @@ public void __pl_vscript_SetNTVOptional() MarkNativeAsOptional("VScript_ResetScriptVM"); MarkNativeAsOptional("VScript_CompileScript"); MarkNativeAsOptional("VScript_CompileScriptFile"); - MarkNativeAsOptional("VScript_ReleaseScript"); MarkNativeAsOptional("VScript_CreateTable"); MarkNativeAsOptional("VScript_GetAllClasses"); MarkNativeAsOptional("VScript_GetClass"); diff --git a/scripting/vscript.sp b/scripting/vscript.sp index 77eca8d..41ef129 100644 --- a/scripting/vscript.sp +++ b/scripting/vscript.sp @@ -13,7 +13,6 @@ int g_iScriptVariant_type; static Handle g_hSDKGetScriptDesc; static Handle g_hSDKCallCompileScript; -static Handle g_hSDKCallReleaseScript; static Handle g_hSDKCallRegisterInstance; static Handle g_hSDKCallSetInstanceUniqeId; static Handle g_hSDKCallGetInstanceValue; @@ -56,6 +55,7 @@ public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iLen CreateNative("HSCRIPT.SetValueString", Native_HScript_SetValueString); CreateNative("HSCRIPT.SetValueVector", Native_HScript_SetValueVector); CreateNative("HSCRIPT.Release", Native_HScript_Release); + CreateNative("HSCRIPT.ReleaseScript", Native_HScript_ReleaseScript); CreateNative("VScriptFunction.GetScriptName", Native_Function_GetScriptName); CreateNative("VScriptFunction.SetScriptName", Native_Function_SetScriptName); @@ -92,7 +92,6 @@ public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iLen CreateNative("VScript_ResetScriptVM", Native_ResetScriptVM); CreateNative("VScript_CompileScript", Native_CompileScript); CreateNative("VScript_CompileScriptFile", Native_CompileScriptFile); - CreateNative("VScript_ReleaseScript", Native_ReleaseScript); CreateNative("VScript_CreateTable", Native_CreateTable); CreateNative("VScript_GetAllClasses", Native_GetAllClasses); CreateNative("VScript_GetClass", Native_GetClass); @@ -136,7 +135,6 @@ public void OnPluginStart() LogError("Failed to create SDKCall: CTFPlayer::GetScriptDesc"); g_hSDKCallCompileScript = CreateSDKCall(hGameData, "IScriptVM", "CompileScript", SDKType_PlainOldData, SDKType_String, SDKType_String); - g_hSDKCallReleaseScript = CreateSDKCall(hGameData, "IScriptVM", "ReleaseScript", _, SDKType_PlainOldData); g_hSDKCallRegisterInstance = CreateSDKCall(hGameData, "IScriptVM", "RegisterInstance", SDKType_PlainOldData, SDKType_PlainOldData, SDKType_CBaseEntity); g_hSDKCallSetInstanceUniqeId = CreateSDKCall(hGameData, "IScriptVM", "SetInstanceUniqeId", _, SDKType_PlainOldData, SDKType_String); g_hSDKCallGetInstanceValue = CreateSDKCall(hGameData, "IScriptVM", "GetInstanceValue", SDKType_CBaseEntity, SDKType_PlainOldData, SDKType_PlainOldData); @@ -226,6 +224,12 @@ public any Native_HScript_Release(Handle hPlugin, int iNumParams) return 0; } +public any Native_HScript_ReleaseScript(Handle hPlugin, int iNumParams) +{ + HScript_ReleaseScript(GetNativeCell(1)); + return 0; +} + public any Native_Function_GetScriptName(Handle hPlugin, int iNumParams) { int iLength = GetNativeCell(3); @@ -402,7 +406,7 @@ public any Native_Class_CreateFunction(Handle hPlugin, int iNumParams) public any Native_Execute(Handle hPlugin, int iNumParams) { HSCRIPT hScript = GetNativeCell(1); - HSCRIPT hScope = iNumParams > 1 ? GetNativeCell(2) : view_as(0); + HSCRIPT hScope = iNumParams > 1 ? GetNativeCell(2) : HSCRIPT_RootTable; VScriptExecute aExecute = Execute_Create(hScript, hScope); @@ -516,14 +520,6 @@ public any Native_CompileScriptFile(Handle hPlugin, int iNumParams) } } -public any Native_ReleaseScript(Handle hPlugin, int iNumParams) -{ - HSCRIPT hScript = GetNativeCell(1); - - SDKCall(g_hSDKCallReleaseScript, GetScriptVM(), hScript); - return 0; -} - public any Native_CreateTable(Handle hPlugin, int iNumParams) { return HScript_CreateTable(); diff --git a/scripting/vscript/hscript.sp b/scripting/vscript/hscript.sp index 41fce5d..bbca56b 100644 --- a/scripting/vscript/hscript.sp +++ b/scripting/vscript/hscript.sp @@ -4,6 +4,7 @@ static Handle g_hSDKCallGetValue; static Handle g_hSDKCallSetValueString; static Handle g_hSDKCallSetValue; static Handle g_hSDKCallReleaseValue; +static Handle g_hSDKCallReleaseScript; void HScript_LoadGamedata(GameData hGameData) { @@ -13,6 +14,7 @@ void HScript_LoadGamedata(GameData hGameData) g_hSDKCallSetValueString = CreateSDKCall(hGameData, "IScriptVM", "SetValueString", SDKType_Bool, SDKType_PlainOldData, SDKType_String, SDKType_String); g_hSDKCallSetValue = CreateSDKCall(hGameData, "IScriptVM", "SetValue", SDKType_Bool, SDKType_PlainOldData, SDKType_String, SDKType_PlainOldData); g_hSDKCallReleaseValue = CreateSDKCall(hGameData, "IScriptVM", "ReleaseValue", _, SDKType_PlainOldData); + g_hSDKCallReleaseScript = CreateSDKCall(hGameData, "IScriptVM", "ReleaseScript", _, SDKType_PlainOldData); } HSCRIPT HScript_CreateTable() @@ -154,3 +156,8 @@ void HScript_ReleaseValue(HSCRIPT pHScript) SDKCall(g_hSDKCallReleaseValue, GetScriptVM(), pValue.Address); delete pValue; } + +void HScript_ReleaseScript(HSCRIPT pHScript) +{ + SDKCall(g_hSDKCallReleaseScript, GetScriptVM(), pHScript); +} \ No newline at end of file