diff options
Diffstat (limited to 'NorthstarDedicatedTest/logging.cpp')
-rw-r--r-- | NorthstarDedicatedTest/logging.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/NorthstarDedicatedTest/logging.cpp b/NorthstarDedicatedTest/logging.cpp index 721c00f5..f94a878f 100644 --- a/NorthstarDedicatedTest/logging.cpp +++ b/NorthstarDedicatedTest/logging.cpp @@ -2,6 +2,7 @@ #include "logging.h" #include "sourceconsole.h" #include "spdlog/sinks/basic_file_sink.h" +#include "hookutils.h" #include <iomanip> #include <sstream> @@ -23,4 +24,130 @@ void InitialiseLogging() // create logger spdlog::default_logger()->sinks().push_back(std::make_shared<spdlog::sinks::basic_file_sink_mt>(stream.str(), false)); +} + +enum SpewType_t +{ + SPEW_MESSAGE = 0, + SPEW_WARNING, + SPEW_ASSERT, + SPEW_ERROR, + SPEW_LOG, + SPEW_TYPE_COUNT +}; + +typedef void(*EngineSpewFuncType)(); +EngineSpewFuncType EngineSpewFunc; + +void EngineSpewFuncHook(void* engineServer, SpewType_t type, const char* format, va_list args) +{ + const char* typeStr; + switch (type) + { + case SPEW_MESSAGE: + { + typeStr = "SPEW_MESSAGE"; + break; + } + + case SPEW_WARNING: + { + typeStr = "SPEW_WARNING"; + break; + } + + case SPEW_ASSERT: + { + typeStr = "SPEW_ASSERT"; + break; + } + + case SPEW_ERROR: + { + typeStr = "SPEW_ERROR"; + break; + } + + case SPEW_LOG: + { + typeStr = "SPEW_LOG"; + break; + } + + default: + { + typeStr = "SPEW_UNKNOWN"; + break; + } + } + + char formatted[2048]; + bool shouldFormat = true; + + // because titanfall 2 is quite possibly the worst thing to yet exist, it sometimes gives invalid specifiers which will crash + // ttf2sdk had a way to prevent them from crashing but it doesnt work in debug builds + // so we use this instead + for (int i = 0; format[i]; i++) + { + if (format[i] == '%') + { + switch (format[i + 1]) + { + // this is fucking awful lol + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'f': + case 'F': + case 'g': + case 'G': + case 'a': + case 'A': + case 'c': + case 's': + case 'p': + case 'n': + case '%': + case '-': + case '+': + case ' ': + case '#': + case '*': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + break; + + default: + { + shouldFormat = false; + break; + } + } + } + } + + if (shouldFormat) + vsnprintf(formatted, sizeof(formatted), format, args); + else + { + spdlog::warn("Failed to format {} \"{}\"", typeStr, format); + } + + spdlog::info("[SERVER {}] {}", typeStr, formatted); +} + +void InitialiseEngineSpewFuncHooks(HMODULE baseAddress) +{ + HookEnabler hook; + ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x11CA80, EngineSpewFuncHook, reinterpret_cast<LPVOID*>(&EngineSpewFunc)); }
\ No newline at end of file |