Fix broken squirrel function hooks (#869)

* Add checks for func overrides
* Fix incorrect sq function hook strings
This commit is contained in:
Jack 2025-09-01 19:16:14 +01:00 committed by GitHub
parent 4184cd34eb
commit 7739bef15d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 4 deletions

View file

@ -262,8 +262,9 @@ REPLACE_SQFUNC(GetDataTableColumnByName, (ScriptContext::UI | ScriptContext::CLI
return SQRESULT_NOTNULL;
}
// int function GetDataTableRowCount( var datatable )
REPLACE_SQFUNC(GetDataTableRowCount, (ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER))
// this function has casing that is inconsistent with the others...
// int function GetDatatableRowCount( var datatable )
REPLACE_SQFUNC(GetDatatableRowCount, (ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER))
{
CSVData** pData;
uint64_t typeId;
@ -466,7 +467,7 @@ REPLACE_SQFUNC(GetDataTableRowMatchingStringValue, (ScriptContext::UI | ScriptCo
}
// int function GetDataTableRowMatchingAssetValue( var datatable, int col, asset value )
REPLACE_SQFUNC(GetDataTableMatchingAssetValue, (ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER))
REPLACE_SQFUNC(GetDataTableRowMatchingAssetValue, (ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER))
{
CSVData** pData;
uint64_t typeId;

View file

@ -474,6 +474,15 @@ int64_t __fastcall RegisterSquirrelFunctionHook(CSquirrelVM* sqvm, SQFuncRegistr
return g_pSquirrel<context>->RegisterSquirrelFunc(sqvm, funcReg, unknown);
}
template <ScriptContext context> void CheckFuncOverrides()
{
for (auto& [name, func] : g_pSquirrel<context>->m_funcOverrides)
{
if (!g_pSquirrel<context>->m_funcOriginals.count(name))
g_pSquirrel<context>->logger->error("Failed to replace SQ function '{}' as it doesn't exist.", name);
}
}
template <ScriptContext context> bool (*CallScriptInitCallback)(void* sqvm, const char* callback);
template <ScriptContext context> bool __fastcall CallScriptInitCallbackHook(void* sqvm, const char* callback)
{
@ -490,6 +499,12 @@ template <ScriptContext context> bool __fastcall CallScriptInitCallbackHook(void
else if (context == ScriptContext::SERVER)
bShouldCallCustomCallbacks = !strcmp(callback, "CodeCallback_MapSpawn");
// check that all func overrides for this VM have been registered properly
if (realContext == ScriptContext::UI)
CheckFuncOverrides<ScriptContext::UI>();
else
CheckFuncOverrides<context>();
if (bShouldCallCustomCallbacks)
{
for (Mod mod : g_pModManager->m_LoadedMods)
@ -562,7 +577,7 @@ template <ScriptContext context> void StubUnsafeSQFuncs()
g_pSquirrel<context>->AddFuncOverride("DevTextBufferWrite", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("DevTextBufferClear", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("DevTextBufferDumpToFile", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("Dev_CommandLineAddParam", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("Dev_CommandLineAddParm", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("DevP4Checkout", SQ_StubbedFunc<context>);
g_pSquirrel<context>->AddFuncOverride("DevP4Add", SQ_StubbedFunc<context>);
}