diff options
Diffstat (limited to 'NorthstarDLL/squirrel')
-rw-r--r-- | NorthstarDLL/squirrel/squirrel.cpp | 42 | ||||
-rw-r--r-- | NorthstarDLL/squirrel/squirrel.h | 28 | ||||
-rw-r--r-- | NorthstarDLL/squirrel/squirrelclasstypes.h | 2 | ||||
-rw-r--r-- | NorthstarDLL/squirrel/squirreldatatypes.h | 4 |
4 files changed, 71 insertions, 5 deletions
diff --git a/NorthstarDLL/squirrel/squirrel.cpp b/NorthstarDLL/squirrel/squirrel.cpp index 8761fb13..d594ede9 100644 --- a/NorthstarDLL/squirrel/squirrel.cpp +++ b/NorthstarDLL/squirrel/squirrel.cpp @@ -561,6 +561,45 @@ template <ScriptContext context> void SquirrelManager<context>::ProcessMessageBu _call(m_pSQVM->sqvm, message.args.size()); } +ADD_SQFUNC( + "string", + NSGetCurrentModName, + "", + "Returns the mod name of the script running this function", + ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER) +{ + int depth = g_pSquirrel<context>->getinteger(sqvm, 1); + if (auto mod = g_pSquirrel<context>->getcallingmod(sqvm, depth); mod == nullptr) + { + g_pSquirrel<context>->raiseerror(sqvm, "NSGetModName was called from a non-mod script. This shouldn't be possible"); + return SQRESULT_ERROR; + } + else + { + g_pSquirrel<context>->pushstring(sqvm, mod->Name.c_str()); + } + return SQRESULT_NOTNULL; +} + +ADD_SQFUNC( + "string", + NSGetCallingModName, + "int depth = 0", + "Returns the mod name of the script running this function", + ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER) +{ + int depth = g_pSquirrel<context>->getinteger(sqvm, 1); + if (auto mod = g_pSquirrel<context>->getcallingmod(sqvm, depth); mod == nullptr) + { + g_pSquirrel<context>->pushstring(sqvm, "Unknown"); + } + else + { + g_pSquirrel<context>->pushstring(sqvm, mod->Name.c_str()); + } + return SQRESULT_NOTNULL; +} + ON_DLL_LOAD_RELIESON("client.dll", ClientSquirrel, ConCommand, (CModule module)) { AUTOHOOK_DISPATCH_MODULE(client.dll) @@ -637,6 +676,8 @@ ON_DLL_LOAD_RELIESON("client.dll", ClientSquirrel, ConCommand, (CModule module)) g_pSquirrel<ScriptContext::UI>->messageBuffer = g_pSquirrel<ScriptContext::CLIENT>->messageBuffer; g_pSquirrel<ScriptContext::CLIENT>->__sq_getfunction = module.Offset(0x572FB0).As<sq_getfunctionType>(); g_pSquirrel<ScriptContext::UI>->__sq_getfunction = g_pSquirrel<ScriptContext::CLIENT>->__sq_getfunction; + g_pSquirrel<ScriptContext::CLIENT>->__sq_stackinfos = module.Offset(0x35970).As<sq_stackinfosType>(); + g_pSquirrel<ScriptContext::UI>->__sq_stackinfos = g_pSquirrel<ScriptContext::CLIENT>->__sq_stackinfos; MAKEHOOK( module.Offset(0x108E0), @@ -718,6 +759,7 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerSquirrel, ConCommand, (CModule module)) g_pSquirrel<ScriptContext::SERVER>->logger = NS::log::SCRIPT_SV; // Message buffer stuff g_pSquirrel<ScriptContext::SERVER>->__sq_getfunction = module.Offset(0x6C85).As<sq_getfunctionType>(); + g_pSquirrel<ScriptContext::SERVER>->__sq_stackinfos = module.Offset(0x35920).As<sq_stackinfosType>(); MAKEHOOK( module.Offset(0x1DD10), diff --git a/NorthstarDLL/squirrel/squirrel.h b/NorthstarDLL/squirrel/squirrel.h index 51fa93b3..82825b3c 100644 --- a/NorthstarDLL/squirrel/squirrel.h +++ b/NorthstarDLL/squirrel/squirrel.h @@ -1,9 +1,9 @@ #pragma once -#include "logging/logging.h" #include "squirrelclasstypes.h" #include "squirrelautobind.h" #include "core/math/vector.h" +#include "mods/modmanager.h" // stolen from ttf2sdk: sqvm types typedef float SQFloat; @@ -39,8 +39,6 @@ const char* SQTypeNameFromID(const int iTypeId); ScriptContext ScriptContextFromString(std::string string); -std::shared_ptr<ColoredLogger> getSquirrelLoggerByContext(ScriptContext context); - namespace NS::log { template <ScriptContext context> std::shared_ptr<spdlog::logger> squirrel_logger(); @@ -98,6 +96,8 @@ class SquirrelManagerBase sq_getthisentityType __sq_getthisentity; sq_getobjectType __sq_getobject; + sq_stackinfosType __sq_stackinfos; + sq_createuserdataType __sq_createuserdata; sq_setuserdatatypeidType __sq_setuserdatatypeid; sq_getfunctionType __sq_getfunction; @@ -230,6 +230,28 @@ class SquirrelManagerBase return __sq_getasset(sqvm, stackpos, result); } + inline long long sq_stackinfos(HSquirrelVM* sqvm, int level, SQStackInfos& out) + { + return __sq_stackinfos(sqvm, level, &out, sqvm->_callstacksize); + } + + inline Mod* getcallingmod(HSquirrelVM* sqvm, int depth = 0) + { + SQStackInfos stackInfo {}; + if (1 + depth >= sqvm->_callstacksize) + { + return nullptr; + } + sq_stackinfos(sqvm, 1 + depth, stackInfo); + std::string sourceName = stackInfo._sourceName; + std::replace(sourceName.begin(), sourceName.end(), '/', '\\'); + std::string filename = "scripts\\vscripts\\" + sourceName; + if (auto res = g_pModManager->m_ModFiles.find(filename); res != g_pModManager->m_ModFiles.end()) + { + return res->second.m_pOwningMod; + } + return nullptr; + } template <typename T> inline SQRESULT getuserdata(HSquirrelVM* sqvm, const SQInteger stackpos, T* data, uint64_t* typeId) { return __sq_getuserdata(sqvm, stackpos, (void**)data, typeId); // this sometimes crashes idk diff --git a/NorthstarDLL/squirrel/squirrelclasstypes.h b/NorthstarDLL/squirrel/squirrelclasstypes.h index 0672724c..efc80f15 100644 --- a/NorthstarDLL/squirrel/squirrelclasstypes.h +++ b/NorthstarDLL/squirrel/squirrelclasstypes.h @@ -224,6 +224,8 @@ typedef SQFloat* (*sq_getvectorType)(HSquirrelVM* sqvm, SQInteger iStackpos); typedef SQBool (*sq_getthisentityType)(HSquirrelVM*, void** ppEntity); typedef void (*sq_getobjectType)(HSquirrelVM*, SQInteger iStackPos, SQObject* pOutObj); +typedef long long (*sq_stackinfosType)(HSquirrelVM* sqvm, int iLevel, SQStackInfos* pOutObj, int iCallStackSize); + // sq stack userpointer funcs typedef void* (*sq_createuserdataType)(HSquirrelVM* sqvm, SQInteger iSize); typedef SQRESULT (*sq_setuserdatatypeidType)(HSquirrelVM* sqvm, SQInteger iStackpos, uint64_t iTypeId); diff --git a/NorthstarDLL/squirrel/squirreldatatypes.h b/NorthstarDLL/squirrel/squirreldatatypes.h index e9f88d08..b5025f6b 100644 --- a/NorthstarDLL/squirrel/squirreldatatypes.h +++ b/NorthstarDLL/squirrel/squirreldatatypes.h @@ -251,7 +251,7 @@ struct alignas(8) HSquirrelVM void* pointer_28; CallInfo* ci; CallInfo* _callstack; - int _callsstacksize; + int _callstacksize; int _stackbase; SQObject* _stackOfCurrentFunction; SQSharedState* sharedState; @@ -275,7 +275,7 @@ struct alignas(8) HSquirrelVM int _nnativecalls; int _suspended; int _suspended_root; - int _callstacksize; + int _unk; int _suspended_target; int trapAmount; int _suspend_varargs; |