Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

native server script functions #54

Merged
merged 2 commits into from Sep 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 21 additions & 0 deletions r5dedicated/opcodes.cpp
Expand Up @@ -88,6 +88,7 @@ void Hooks::DedicatedPatch()

*(uintptr_t*)0x14B3800D7 = 0x1; // bDedicated


DisableRenderer();
DisableClient();
DisableVGUI();
Expand Down Expand Up @@ -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
}
Expand Down
6 changes: 6 additions & 0 deletions r5dedicated/opcodes.h
Expand Up @@ -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;


Expand Down
1 change: 1 addition & 0 deletions r5dev/include/gameclasses.h
Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions r5dev/include/hooks.h
Expand Up @@ -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;
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions r5dev/include/patterns.h
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions r5dev/include/squirrel.h
Expand Up @@ -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);
Expand Down
10 changes: 8 additions & 2 deletions r5dev/src/gameclasses.cpp
Expand Up @@ -3,6 +3,7 @@
#include "id3dx.h"
#include "cgameconsole.h"
#include "squirrel.h"
#include <r5net.h>

// Need this for a re-factor later.
// Interface* interfaces = *reinterpret_cast<Interface**>(0x167F4FA48);
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions r5dev/src/hooks/hooks.cpp
Expand Up @@ -22,6 +22,7 @@ void Hooks::InstallHooks()
MH_CreateHook(addr_SQVM_LoadRson, &Hooks::SQVM_LoadRson, reinterpret_cast<void**>(&originalSQVM_LoadRson));
MH_CreateHook(addr_SQVM_LoadScript, &Hooks::SQVM_LoadScript, reinterpret_cast<void**>(&originalSQVM_LoadScript));
MH_CreateHook(addr_SQVM_RegisterOriginFuncs, &Hooks::SQVM_RegisterOriginFuncs, reinterpret_cast<void**>(&originalSQVM_RegisterOriginFuncs));
MH_CreateHook(addr_SQVM_RegisterCreatePlayerTasklist, &Hooks::SQVM_RegisterCreatePlayerTasklist, reinterpret_cast<void**>(&originalSQVM_RegisterCreatePlayerTasklist));

///////////////////////////////////////////////////////////////////////////////
// Hook Game Functions
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
11 changes: 10 additions & 1 deletion r5dev/src/hooks/sqvm.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
5 changes: 5 additions & 0 deletions r5dev/src/squirrel.cpp
Expand Up @@ -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<char*>(string), len);
}

void sq_pushinteger(void* sqvm, int val)
{
addr_sq_pushinteger(sqvm, val);
Expand Down