diff --git a/deps/protobuf b/deps/protobuf index 3b001ca6..c44ca26f 160000 --- a/deps/protobuf +++ b/deps/protobuf @@ -1 +1 @@ -Subproject commit 3b001ca6ba6fb51f5e55b1596fb3ce09ee9981e8 +Subproject commit c44ca26fe89ed8a81d3ee475a2ccc1797141dbce diff --git a/src/Components/Modules/Logger.cpp b/src/Components/Modules/Logger.cpp index 7b0a66a3..98aa5e30 100644 --- a/src/Components/Modules/Logger.cpp +++ b/src/Components/Modules/Logger.cpp @@ -12,6 +12,11 @@ namespace Components return (IsWindow(*reinterpret_cast(0x64A3288)) != FALSE || (Dedicated::IsEnabled() && !Flags::HasFlag("console"))); } + void Logger::PrintStub(int channel, const char* message, ...) + { + return Logger::MessagePrint(channel, Logger::Format(&message)); + } + void Logger::Print(const char* message, ...) { return Logger::MessagePrint(0, Logger::Format(&message)); @@ -176,6 +181,11 @@ namespace Components Utils::Hook(0x4B0218, Logger::GameLogStub, HOOK_CALL).Install()->Quick(); Utils::Hook(Game::Com_PrintMessage, Logger::PrintMessageStub, HOOK_JUMP).Install()->Quick(); + if (Loader::PerformingUnitTests()) + { + Utils::Hook(Game::Com_Printf, Logger::PrintStub, HOOK_JUMP).Install()->Quick(); + } + Dvar::OnInit([] () { Command::AddSV("log_add", [] (Command::Params params) diff --git a/src/Components/Modules/Logger.hpp b/src/Components/Modules/Logger.hpp index ae375b4f..47e9fca8 100644 --- a/src/Components/Modules/Logger.hpp +++ b/src/Components/Modules/Logger.hpp @@ -19,6 +19,8 @@ namespace Components static void SoftError(const char* message, ...); static bool IsConsoleReady(); + static void PrintStub(int channel, const char* message, ...); + static void PipeOutput(void(*callback)(std::string)); private: diff --git a/src/Components/Modules/Node.cpp b/src/Components/Modules/Node.cpp index b2a0fc33..96e7fe07 100644 --- a/src/Components/Modules/Node.cpp +++ b/src/Components/Modules/Node.cpp @@ -831,7 +831,7 @@ namespace Components printf("ECDSA key seems invalid!\n"); return false; } - + printf("Success\n"); printf("Testing 10 valid signatures..."); @@ -885,45 +885,6 @@ namespace Components } printf("Success\n"); - - uint32_t randIntCount = 4'000'000; - printf("Generating %d random integers...", randIntCount); - - auto startTime = std::chrono::high_resolution_clock::now(); - - for (uint32_t i = 0; i < randIntCount; ++i) - { - Utils::Cryptography::Rand::GenerateInt(); - } - - auto duration = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startTime).count(); - Logger::Print("took %llims\n", duration); - - printf("Testing ZLib compression..."); - - std::string test = fmt::sprintf("%c", Utils::Cryptography::Rand::GenerateInt()); - - for (int i = 0; i < 21; ++i) - { - std::string compressed = Utils::Compression::ZLib::Compress(test); - std::string decompressed = Utils::Compression::ZLib::Decompress(compressed); - - if (test != decompressed) - { - printf("Error\n"); - printf("Compressing %d bytes and decompressing failed!\n", test.size()); - return false; - } - - auto size = test.size(); - for (unsigned int j = 0; j < size; ++j) - { - test.append(fmt::sprintf("%c", Utils::Cryptography::Rand::GenerateInt())); - } - } - - printf("Success\n"); - return true; } } diff --git a/src/Components/Modules/QuickPatch.cpp b/src/Components/Modules/QuickPatch.cpp index 779d2fed..8b84f6d1 100644 --- a/src/Components/Modules/QuickPatch.cpp +++ b/src/Components/Modules/QuickPatch.cpp @@ -424,4 +424,46 @@ namespace Components { QuickPatch::ShutdownSignal.clear(); } + + bool QuickPatch::UnitTest() + { + uint32_t randIntCount = 4'000'000; + printf("Generating %d random integers...", randIntCount); + + auto startTime = std::chrono::high_resolution_clock::now(); + + for (uint32_t i = 0; i < randIntCount; ++i) + { + Utils::Cryptography::Rand::GenerateInt(); + } + + auto duration = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startTime).count(); + Logger::Print("took %llims\n", duration); + + printf("Testing ZLib compression..."); + + std::string test = fmt::sprintf("%c", Utils::Cryptography::Rand::GenerateInt()); + + for (int i = 0; i < 21; ++i) + { + std::string compressed = Utils::Compression::ZLib::Compress(test); + std::string decompressed = Utils::Compression::ZLib::Decompress(compressed); + + if (test != decompressed) + { + printf("Error\n"); + printf("Compressing %d bytes and decompressing failed!\n", test.size()); + return false; + } + + auto size = test.size(); + for (unsigned int j = 0; j < size; ++j) + { + test.append(fmt::sprintf("%c", Utils::Cryptography::Rand::GenerateInt())); + } + } + + printf("Success\n"); + return true; + } } diff --git a/src/Components/Modules/QuickPatch.hpp b/src/Components/Modules/QuickPatch.hpp index c85fffae..83e3019b 100644 --- a/src/Components/Modules/QuickPatch.hpp +++ b/src/Components/Modules/QuickPatch.hpp @@ -12,6 +12,8 @@ namespace Components const char* GetName() { return "QuickPatch"; }; #endif + bool UnitTest(); + static void UnlockStats(); static void OnShutdown(Callback* callback); diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index eea68b0a..eda3e309 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -22,6 +22,7 @@ namespace Game Cmd_AddCommand_t Cmd_AddCommand = (Cmd_AddCommand_t)0x470090; Cmd_AddServerCommand_t Cmd_AddServerCommand = (Cmd_AddServerCommand_t)0x4DCE00; Cmd_ExecuteSingleCommand_t Cmd_ExecuteSingleCommand = (Cmd_ExecuteSingleCommand_t)0x609540; + Com_ClientPacketEvent_t Com_ClientPacketEvent = (Com_ClientPacketEvent_t)0x49F0B0; Com_Error_t Com_Error = (Com_Error_t)0x4B22D0; Com_Printf_t Com_Printf = (Com_Printf_t)0x402500; @@ -92,6 +93,8 @@ namespace Game Image_LoadFromFileWithReader_t Image_LoadFromFileWithReader = (Image_LoadFromFileWithReader_t)0x53ABF0; Image_Release_t Image_Release = (Image_Release_t)0x51F010; + LargeLocalInit_t LargeLocalInit = (LargeLocalInit_t)0x4A62A0; + Menus_CloseAll_t Menus_CloseAll = (Menus_CloseAll_t)0x4BA5B0; Menus_OpenByName_t Menus_OpenByName = (Menus_OpenByName_t)0x4CCE60; Menus_FindByName_t Menus_FindByName = (Menus_FindByName_t)0x487240; @@ -115,6 +118,7 @@ namespace Game NET_AdrToString_t NET_AdrToString = (NET_AdrToString_t)0x469880; NET_CompareAdr_t NET_CompareAdr = (NET_CompareAdr_t)0x4D0AA0; + NET_Init_t NET_Init = (NET_Init_t)0x491860; NET_IsLocalAddress_t NET_IsLocalAddress = (NET_IsLocalAddress_t)0x402BD0; NET_StringToAdr_t NET_StringToAdr = (NET_StringToAdr_t)0x409010; NET_OutOfBandPrint_t NET_OutOfBandPrint = (NET_OutOfBandPrint_t)0x4AEF00; diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 4e84c60a..637e202c 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -45,6 +45,9 @@ namespace Game typedef void(__cdecl * Cmd_ExecuteSingleCommand_t)(int localClientNum, int controllerIndex, const char* cmd); extern Cmd_ExecuteSingleCommand_t Cmd_ExecuteSingleCommand; + typedef void(__cdecl * Com_ClientPacketEvent_t)(); + extern Com_ClientPacketEvent_t Com_ClientPacketEvent; + typedef void(__cdecl * Com_Error_t)(int type, char* message, ...); extern Com_Error_t Com_Error; @@ -218,6 +221,9 @@ namespace Game typedef void(__cdecl * Image_Release_t)(GfxImage* image); extern Image_Release_t Image_Release; + typedef void(__cdecl * LargeLocalInit_t)(); + extern LargeLocalInit_t LargeLocalInit; + typedef void(__cdecl * Menus_CloseAll_t)(UiContext *dc); extern Menus_CloseAll_t Menus_CloseAll; @@ -278,6 +284,9 @@ namespace Game typedef bool(__cdecl * NET_CompareAdr_t)(netadr_t a, netadr_t b); extern NET_CompareAdr_t NET_CompareAdr; + typedef void(__cdecl * NET_Init_t)(); + extern NET_Init_t NET_Init; + typedef bool(__cdecl * NET_IsLocalAddress_t)(netadr_t adr); extern NET_IsLocalAddress_t NET_IsLocalAddress;