diff --git a/r5dev/vscript/languages/squirrel_re/include/squirrel.h b/r5dev/vscript/languages/squirrel_re/include/squirrel.h index fc1b3822..f8b7441a 100644 --- a/r5dev/vscript/languages/squirrel_re/include/squirrel.h +++ b/r5dev/vscript/languages/squirrel_re/include/squirrel.h @@ -44,6 +44,9 @@ SQRESULT sq_pushstructure(HSQUIRRELVM v, const SQChar* name, const SQChar* membe SQRESULT sq_compilebuffer(HSQUIRRELVM v, SQBufState* bufferState, const SQChar* buffer, SQInteger context); SQRESULT sq_call(HSQUIRRELVM v, SQInteger params, SQBool retval, SQBool raiseerror); +SQRESULT sq_startconsttable(HSQUIRRELVM v); +SQRESULT sq_endconsttable(HSQUIRRELVM v); + /* ==== SQUIRREL ======================================================================================================================================================== */ inline SQRESULT(*v_sq_pushroottable)(HSQUIRRELVM v); inline void(*v_sq_pushbool)(HSQUIRRELVM v, SQBool b); @@ -57,6 +60,9 @@ inline SQRESULT(*v_sq_pushstructure)(HSQUIRRELVM v, const SQChar* name, const SQ inline SQRESULT(*v_sq_compilebuffer)(HSQUIRRELVM v, SQBufState* bufferstate, const SQChar* buffer, SQInteger level); inline SQRESULT(*v_sq_call)(HSQUIRRELVM v, SQInteger params, SQBool retval, SQBool raiseerror); +inline SQRESULT (*v_sq_startconsttable)(HSQUIRRELVM v); +inline SQRESULT (*v_sq_endconsttable)(HSQUIRRELVM v); + /////////////////////////////////////////////////////////////////////////////// class VSquirrelAPI : public IDetour { @@ -73,6 +79,9 @@ class VSquirrelAPI : public IDetour LogFunAdr("sq_pushstructure", v_sq_pushstructure); LogFunAdr("sq_compilebuffer", v_sq_compilebuffer); LogFunAdr("sq_call", v_sq_call); + + LogFunAdr("sq_startconsttable", v_sq_startconsttable); + LogFunAdr("sq_endconsttable", v_sq_endconsttable); } virtual void GetFun(void) const { @@ -87,6 +96,9 @@ class VSquirrelAPI : public IDetour g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 60 48 8B 59 60").GetPtr(v_sq_pushstructure); g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 41 56 41 57 48 83 EC 50 41 8B E9 49 8B F8").GetPtr(v_sq_compilebuffer); g_GameDll.FindPatternSIMD("4C 8B DC 49 89 5B 08 49 89 6B 10 49 89 73 18 57 48 83 EC 50 8B F2").GetPtr(v_sq_call); + + g_GameDll.FindPatternSIMD("8B 51 78 4C 8B 49 60 44 8B C2 49 C1 E0 04 4C 03 81 ?? ?? ?? ?? 8D 42 01 89 41 78 41 F7 81 ?? ?? ?? ?? ?? ?? ?? ?? 74 0A 49 8B 81 ?? ?? ?? ?? FF 40 08 41 F7 00 ?? ?? ?? ?? 41 0F 10 81 ?? ?? ?? ?? 74 15").GetPtr(v_sq_startconsttable); + g_GameDll.FindPatternSIMD("8B 41 78 45 33 C0 FF C8 8B D0 89 41 78 48 C1 E2 04 48 03 91 ?? ?? ?? ?? 8B 02 48 C7 02 ?? ?? ?? ?? 25 ?? ?? ?? ?? 74 15").GetPtr(v_sq_endconsttable); } virtual void GetVar(void) const { } virtual void GetCon(void) const { } diff --git a/r5dev/vscript/languages/squirrel_re/squirrel/sqapi.cpp b/r5dev/vscript/languages/squirrel_re/squirrel/sqapi.cpp index 4da272df..e7f00d4b 100644 --- a/r5dev/vscript/languages/squirrel_re/squirrel/sqapi.cpp +++ b/r5dev/vscript/languages/squirrel_re/squirrel/sqapi.cpp @@ -86,6 +86,16 @@ SQRESULT sq_call(HSQUIRRELVM v, SQInteger params, SQBool retval, SQBool raiseerr return v_sq_call(v, params, retval, raiseerror); } +SQRESULT sq_startconsttable(HSQUIRRELVM v) +{ + return v_sq_startconsttable(v); +} + +SQRESULT sq_endconsttable(HSQUIRRELVM v) +{ + return v_sq_endconsttable(v); +} + void VSquirrelAPI::Detour(const bool bAttach) const { DetourSetup(&v_sq_pushroottable, &sq_pushroottable, bAttach); @@ -99,4 +109,7 @@ void VSquirrelAPI::Detour(const bool bAttach) const DetourSetup(&v_sq_pushstructure, &sq_pushstructure, bAttach); DetourSetup(&v_sq_compilebuffer, &sq_compilebuffer, bAttach); DetourSetup(&v_sq_call, &sq_call, bAttach); + + DetourSetup(&v_sq_startconsttable, &sq_startconsttable, bAttach); + DetourSetup(&v_sq_endconsttable, &sq_endconsttable, bAttach); } diff --git a/r5dev/vscript/languages/squirrel_re/vsquirrel.h b/r5dev/vscript/languages/squirrel_re/vsquirrel.h index 97ad251f..2a45d061 100644 --- a/r5dev/vscript/languages/squirrel_re/vsquirrel.h +++ b/r5dev/vscript/languages/squirrel_re/vsquirrel.h @@ -69,6 +69,25 @@ inline CSquirrelVM* g_pClientScript; inline CSquirrelVM* g_pUIScript; #endif // !DEDICATED +#define DEFINE_SCRIPTENUM_NAMED(s, enumName, startValue, ...) \ + do { \ + HSQUIRRELVM const v = s->GetVM(); \ + const eDLL_T context = static_cast(s->GetContext());\ + sq_startconsttable(v); \ + sq_pushstring(v, enumName, -1); \ + sq_newtable(v); \ + const char* const enumFields[] = { __VA_ARGS__ }; \ + int enumValue = startValue; \ + for (int i = 0; i < V_ARRAYSIZE(enumFields); i++) { \ + sq_pushstring(v, enumFields[i], -1); \ + sq_pushinteger(v, enumValue++); \ + if (sq_newslot(v, -3) < 0) \ + Error(context, EXIT_FAILURE, "Error adding entry '%s' for enum '%s'.", enumFields[i], enumName); \ + } \ + if (sq_newslot(v, -3) < 0) \ + Error(context, EXIT_FAILURE, "Error adding enum '%s' to const table.", enumName); \ + sq_endconsttable(v); \ + } while (0) /////////////////////////////////////////////////////////////////////////////// class VSquirrel : public IDetour