From 6236a6402da29b278a2f47d9e188716b8b6061ff Mon Sep 17 00:00:00 2001 From: rexx <67599507+r-ex@users.noreply.github.com> Date: Mon, 20 Sep 2021 21:06:23 +0100 Subject: [PATCH 1/2] server script functions --- r5dev/include/gameclasses.h | 1 + r5dev/include/hooks.h | 4 ++++ r5dev/include/patterns.h | 4 ++++ r5dev/include/squirrel.h | 3 +++ r5dev/src/gameclasses.cpp | 10 ++++++++-- r5dev/src/hooks/hooks.cpp | 3 +++ r5dev/src/hooks/sqvm.cpp | 11 ++++++++++- r5dev/src/squirrel.cpp | 5 +++++ 8 files changed, 38 insertions(+), 3 deletions(-) diff --git a/r5dev/include/gameclasses.h b/r5dev/include/gameclasses.h index bc41c25f..05211aa2 100644 --- a/r5dev/include/gameclasses.h +++ b/r5dev/include/gameclasses.h @@ -505,6 +505,7 @@ namespace GameGlobals void Script_RegisterFunction(void* sqvm, const char* name, const char* helpString, const char* retValType, const char* argTypes, void* funcPtr); void RegisterUIScriptFunctions(void* sqvm); void RegisterClientScriptFunctions(void* sqvm); + void RegisterServerScriptFunctions(void* sqvm); // Init void InitGameGlobals(); diff --git a/r5dev/include/hooks.h b/r5dev/include/hooks.h index 735af5eb..14b2e67f 100644 --- a/r5dev/include/hooks.h +++ b/r5dev/include/hooks.h @@ -26,6 +26,7 @@ namespace Hooks __int64 SQVM_LoadRson(const char* rson_name); bool SQVM_LoadScript(void* sqvm, const char* script_path, const char* script_name, int flag); void SQVM_RegisterOriginFuncs(void* sqvm); + void SQVM_RegisterCreatePlayerTasklist(void* sqvm); using SQVM_WarningFn = __int64(*)(void*, int, int, int*, void**); extern SQVM_WarningFn originalSQVM_Warning; @@ -38,6 +39,9 @@ namespace Hooks using SQVM_RegisterOriginFuncsFn = void(*)(void*); extern SQVM_RegisterOriginFuncsFn originalSQVM_RegisterOriginFuncs; + + using SQVM_RegisterCreatePlayerTasklistFn = void(*)(void*); + extern SQVM_RegisterCreatePlayerTasklistFn originalSQVM_RegisterCreatePlayerTasklist; #pragma endregion #pragma region CServer diff --git a/r5dev/include/patterns.h b/r5dev/include/patterns.h index 9f7eb11f..040b044e 100644 --- a/r5dev/include/patterns.h +++ b/r5dev/include/patterns.h @@ -61,6 +61,9 @@ namespace /*0x140834A00*/ FUNC_AT_ADDRESS(addr_SQVM_RegisterOriginFuncs, void(*)(void*), r5_patterns.PatternSearch("E8 ? ? ? ? 48 8B 0D ? ? ? ? 48 8D 15 ? ? ? ? E8 ? ? ? ? 48 8B 05 ? ? ? ? C7 05 ? ? ? ? ? ? ? ?").FollowNearCall().GetPtr()); + + /*0x140C06B20*/ + FUNC_AT_ADDRESS(addr_SQVM_RegisterCreatePlayerTasklist, void(*)(void*), r5_patterns.PatternSearch("E8 ? ? ? ? 48 8B 0D ? ? ? ? E8 ? ? ? ? 48 8B CB").FollowNearCall().GetPtr()); #pragma endregion #pragma region NetChannel @@ -156,6 +159,7 @@ namespace PRINT_ADDRESS("SQVM_Warning", addr_SQVM_Warning); PRINT_ADDRESS("SQVM_Warning_ReturnAddr", addr_SQVM_Warning_ReturnAddr); PRINT_ADDRESS("SQVM_RegisterOriginFuncs", addr_SQVM_RegisterOriginFuncs); + PRINT_ADDRESS("SQVM_RegisterCreatePlayerTasklist", addr_SQVM_RegisterCreatePlayerTasklist); PRINT_ADDRESS("sq_arrayappend", addr_sq_arrayappend); PRINT_ADDRESS("sq_newarray", addr_sq_newarray); PRINT_ADDRESS("sq_newslot", addr_sq_newslot); diff --git a/r5dev/include/squirrel.h b/r5dev/include/squirrel.h index e49c4dc3..568fb824 100644 --- a/r5dev/include/squirrel.h +++ b/r5dev/include/squirrel.h @@ -4,7 +4,10 @@ char* sq_getstring(void* sqvm, int i); int sq_getinteger(void* sqvm, int i); void sq_pushbool(void* sqvm, int val); + void sq_pushstring(void* sqvm, char* string, int len); +void sq_pushstring(void* sqvm, const char* string, int len); + void sq_pushinteger(void* sqvm, int val); void sq_newarray(void* sqvm, int size); diff --git a/r5dev/src/gameclasses.cpp b/r5dev/src/gameclasses.cpp index 84adec90..44509499 100644 --- a/r5dev/src/gameclasses.cpp +++ b/r5dev/src/gameclasses.cpp @@ -3,6 +3,7 @@ #include "id3dx.h" #include "cgameconsole.h" #include "squirrel.h" +#include // Need this for a re-factor later. // Interface* interfaces = *reinterpret_cast(0x167F4FA48); @@ -486,12 +487,17 @@ namespace GameGlobals void RegisterUIScriptFunctions(void* sqvm) { - // Script_RegisterFunction(sqvm, "UINativeTest", "native ui function", "void", "", &Script_NativeTest); + //Script_RegisterFunction(sqvm, "UINativeTest", "native ui function", "void", "", &Script_NativeTest); } void RegisterClientScriptFunctions(void* sqvm) { - // Script_RegisterFunction(sqvm, "ClientNativeTest", "native client function", "void", "", &Script_NativeTest); + //Script_RegisterFunction(sqvm, "ClientNativeTest", "native client function", "void", "", &Script_NativeTest); + } + + void RegisterServerScriptFunctions(void* sqvm) + { + //Script_RegisterFunction(sqvm, "ServerNativeTest", "native server function", "void", "", &Script_NativeTest); } void DisconnectClient(CClient* client, const char* reason, unsigned __int8 unk1, char unk2) diff --git a/r5dev/src/hooks/hooks.cpp b/r5dev/src/hooks/hooks.cpp index 78d27de1..cec5aa27 100644 --- a/r5dev/src/hooks/hooks.cpp +++ b/r5dev/src/hooks/hooks.cpp @@ -22,6 +22,7 @@ void Hooks::InstallHooks() MH_CreateHook(addr_SQVM_LoadRson, &Hooks::SQVM_LoadRson, reinterpret_cast(&originalSQVM_LoadRson)); MH_CreateHook(addr_SQVM_LoadScript, &Hooks::SQVM_LoadScript, reinterpret_cast(&originalSQVM_LoadScript)); MH_CreateHook(addr_SQVM_RegisterOriginFuncs, &Hooks::SQVM_RegisterOriginFuncs, reinterpret_cast(&originalSQVM_RegisterOriginFuncs)); + MH_CreateHook(addr_SQVM_RegisterCreatePlayerTasklist, &Hooks::SQVM_RegisterCreatePlayerTasklist, reinterpret_cast(&originalSQVM_RegisterCreatePlayerTasklist)); /////////////////////////////////////////////////////////////////////////////// // Hook Game Functions @@ -79,6 +80,7 @@ void Hooks::InstallHooks() MH_EnableHook(addr_SQVM_LoadRson); MH_EnableHook(addr_SQVM_LoadScript); MH_EnableHook(addr_SQVM_RegisterOriginFuncs); + MH_EnableHook(addr_SQVM_RegisterCreatePlayerTasklist); /////////////////////////////////////////////////////////////////////////////// // Enable Game hooks @@ -114,6 +116,7 @@ void Hooks::RemoveHooks() MH_RemoveHook(addr_SQVM_LoadRson); MH_RemoveHook(addr_SQVM_LoadScript); MH_RemoveHook(addr_SQVM_RegisterOriginFuncs); + MH_RemoveHook(addr_SQVM_RegisterCreatePlayerTasklist); /////////////////////////////////////////////////////////////////////////////// // Unhook Game Functions diff --git a/r5dev/src/hooks/sqvm.cpp b/r5dev/src/hooks/sqvm.cpp index 5e0d06aa..154acfb0 100644 --- a/r5dev/src/hooks/sqvm.cpp +++ b/r5dev/src/hooks/sqvm.cpp @@ -7,6 +7,7 @@ namespace Hooks SQVM_LoadRsonFn originalSQVM_LoadRson = nullptr; SQVM_LoadScriptFn originalSQVM_LoadScript = nullptr; SQVM_RegisterOriginFuncsFn originalSQVM_RegisterOriginFuncs = nullptr; + SQVM_RegisterCreatePlayerTasklistFn originalSQVM_RegisterCreatePlayerTasklist = nullptr; } static std::ostringstream oss_print; @@ -181,7 +182,8 @@ bool Hooks::SQVM_LoadScript(void* sqvm, const char* script_path, const char* scr return originalSQVM_LoadScript(sqvm, script_path, script_name, flag); } -void Hooks::SQVM_RegisterOriginFuncs(void* sqvm) { +void Hooks::SQVM_RegisterOriginFuncs(void* sqvm) +{ static MemoryAddress UIVM = MemoryAddress(0x14D4151F0); originalSQVM_RegisterOriginFuncs(sqvm); @@ -192,4 +194,11 @@ void Hooks::SQVM_RegisterOriginFuncs(void* sqvm) { else { GameGlobals::RegisterClientScriptFunctions(sqvm); } +} + +void Hooks::SQVM_RegisterCreatePlayerTasklist(void* sqvm) +{ + GameGlobals::RegisterServerScriptFunctions(sqvm); + + originalSQVM_RegisterCreatePlayerTasklist(sqvm); } \ No newline at end of file diff --git a/r5dev/src/squirrel.cpp b/r5dev/src/squirrel.cpp index f0d107e7..584af969 100644 --- a/r5dev/src/squirrel.cpp +++ b/r5dev/src/squirrel.cpp @@ -25,6 +25,11 @@ void sq_pushstring(void* sqvm, char* string, int len) addr_sq_pushstring(sqvm, string, len); } +void sq_pushstring(void* sqvm, const char* string, int len) +{ + addr_sq_pushstring(sqvm, const_cast(string), len); +} + void sq_pushinteger(void* sqvm, int val) { addr_sq_pushinteger(sqvm, val); From 26d78c584ea3f2b17605f4d7deb493c6d783e831 Mon Sep 17 00:00:00 2001 From: rexx <67599507+r-ex@users.noreply.github.com> Date: Sat, 25 Sep 2021 22:54:11 +0100 Subject: [PATCH 2/2] temp dedi patches --- r5dedicated/opcodes.cpp | 21 +++++++++++++++++++++ r5dedicated/opcodes.h | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/r5dedicated/opcodes.cpp b/r5dedicated/opcodes.cpp index dbcd45fd..f53a53df 100644 --- a/r5dedicated/opcodes.cpp +++ b/r5dedicated/opcodes.cpp @@ -88,6 +88,7 @@ void Hooks::DedicatedPatch() *(uintptr_t*)0x14B3800D7 = 0x1; // bDedicated + DisableRenderer(); DisableClient(); DisableVGUI(); @@ -138,6 +139,26 @@ void Hooks::DedicatedPatch() // TODO: this is also used by server.dll library. e1.Offset(0x213).Patch({ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }); + //------------------------------------------------------------------------- + // RET + c4.Patch({ 0xC3 }); + c5.Patch({ 0xC3 }); + c7.Patch({ 0xC3 }); + + //------------------------------------------------------------------------- + // JNE --> JMP | + c6.Offset(0x23).Patch({ 0xEB, 0x23 }); + + + //------------------------------------------------------------------------- + // JNE --> JMP | (TEMP) jump over some settings block issues. not sure what to do here + s3.Offset(0x16C).Patch({ 0xE9, 0x47, 0x01, 0x00 }); + + + + + OnLevelLoadingStarted.Offset(0x61).Patch({ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }); + //------------------------------------------------------------------------- // ??? 1403DFC30 = 0x94490 ??? // an expensive stuff that wasted many CPU cycles, this one seems to be the best candidate to return } diff --git a/r5dedicated/opcodes.h b/r5dedicated/opcodes.h index 48d4c2f0..e32e3877 100644 --- a/r5dedicated/opcodes.h +++ b/r5dedicated/opcodes.h @@ -59,16 +59,22 @@ namespace MemoryAddress s0 = 0x0000000140237B00; // server Host_Init()? MemoryAddress s1 = 0x0000000140231C00; // _Host_RunFrame() with inlined CFrameTimer::MarkFrame()? MemoryAddress s2 = 0x00000001402312A0; // server HeartBeat? (baseserver.cpp) + MemoryAddress s3 = 0x0000000140FB36D0; // TEMP?? // CLIENT MemoryAddress c0 = 0x0000000140236640; // client Host_Init()? MemoryAddress c1 = 0x0000000140299100; // CreateGameWindowInit()? MemoryAddress c2 = 0x00000001403F4360; // 1403DF870 --> 1403F4360 MemoryAddress c3 = 0x00000001403F8A80; // 1403DF870 --> 1403F8A40 + MemoryAddress c4 = 0x00000001405C27B0; // CHLClient + 1000 + MemoryAddress c5 = 0x00000001405BAC00; // + MemoryAddress c6 = 0x00000001403CA2D0; // + MemoryAddress c7 = 0x00000001403CC750; // lightmaps? MemoryAddress CreateGameWindow = 0x0000000140343DE0; // VGUI MemoryAddress v0 = 0x0000000140282E40; // jumptable + MemoryAddress OnLevelLoadingStarted = 0x00000001402830D0; MemoryAddress SCR_BeginLoadingPlaque = 0x000000014023E870;