diff options
Diffstat (limited to 'NorthstarDedicatedTest/dedicatedmaterialsystem.cpp')
-rw-r--r-- | NorthstarDedicatedTest/dedicatedmaterialsystem.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp b/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp index 531885a7..67e5db94 100644 --- a/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp +++ b/NorthstarDedicatedTest/dedicatedmaterialsystem.cpp @@ -51,6 +51,86 @@ void InitialiseDedicatedMaterialSystem(HMODULE baseAddress) if (DisableDedicatedWindowCreation()) { { + // materialsystem rpak type registrations + char* ptr = (char*)baseAddress + 0x22B5; + TempReadWrite rw(ptr); + + // nop a call that crashes, not needed on dedi + *ptr = 0x90; + *(ptr + 1) = (char)0x90; + *(ptr + 2) = (char)0x90; + *(ptr + 3) = (char)0x90; + *(ptr + 4) = (char)0x90; + } + + // these don't work, they cause game to hang on rpak init, needs reworking + { + // materialsystem rpak type: texture + char* ptr = (char*)baseAddress + 0x2B00; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: material + char* ptr = (char*)baseAddress + 0x50AA0; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { + // materialsystem rpak type: shader + char* ptr = (char*)baseAddress + 0x2850; + TempReadWrite rw(ptr); + + // make it return 0 + // mov rax,0 + *ptr = 0x48; + *(ptr + 1) = (char)0xB8; + *(ptr + 2) = (char)0x00; + *(ptr + 3) = (char)0x00; + *(ptr + 4) = (char)0x00; + *(ptr + 5) = (char)0x00; + *(ptr + 6) = (char)0x00; + *(ptr + 7) = (char)0x00; + *(ptr + 8) = (char)0x00; + *(ptr + 9) = (char)0x00; + + // ret + *(ptr + 10) = (char)0xC3; + } + + { // some renderthread stuff char* ptr = (char*)baseAddress + 0x8C10; TempReadWrite rw(ptr); @@ -60,4 +140,45 @@ void InitialiseDedicatedMaterialSystem(HMODULE baseAddress) *(ptr + 1) = (char)0x90; } } +} + +// rpak pain +struct RpakTypeDefinition +{ + int64_t magic; + char* longName; + + // more fields but they don't really matter for what we use them for +}; + +typedef void*(*RegisterRpakTypeType)(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2); +RegisterRpakTypeType RegisterRpakType; + +typedef void(*RegisterMaterialSystemRpakTypes)(); + +void* RegisterRpakTypeHook(RpakTypeDefinition* rpakStruct, unsigned int a1, unsigned int a2) +{ + // make sure this prints right + char magicName[5]; + memcpy(magicName, &rpakStruct->magic, 4); + magicName[4] = 0; + + spdlog::info("rpak type {} {} registered {} {}", magicName, rpakStruct->longName, a1, a2); + + // reregister rpak types that aren't registered on a windowless dedi + if (IsDedicated() && DisableDedicatedWindowCreation() && rpakStruct->magic == 0x64636C72) // rlcd, this one is registered last + ((RegisterMaterialSystemRpakTypes)((char*)GetModuleHandleA("materialsystem_dx11.dll") + 0x22A0))(); // slightly hellish call + + return RegisterRpakType(rpakStruct, a1, a2); +} + +void InitialiseDedicatedRtechGame(HMODULE baseAddress) +{ + HookEnabler hook; + ENABLER_CREATEHOOK(hook, (char*)GetModuleHandleA("rtech_game.dll") + 0x7BE0, &RegisterRpakTypeHook, reinterpret_cast<LPVOID*>(&RegisterRpakType)); + + if (!IsDedicated()) + return; + + }
\ No newline at end of file |