diff --git a/r5dev/include/hooks.h b/r5dev/include/hooks.h index f606e6bd..84257e22 100644 --- a/r5dev/include/hooks.h +++ b/r5dev/include/hooks.h @@ -13,6 +13,7 @@ extern bool g_bBlockInput; namespace Hooks { + extern std::vector g_vOutput; #pragma region CHLClient void __fastcall FrameStageNotify(CHLClient* rcx, ClientFrameStage_t curStage); @@ -130,12 +131,16 @@ namespace Hooks #pragma region Other int MSG_EngineError(char* fmt, va_list args); bool LoadPlaylist(const char* playlist); + void CFPSPanel_Paint(void* thisptr); using MSG_EngineErrorFn = int(*)(char*, va_list); extern MSG_EngineErrorFn originalMSG_EngineError; using LoadPlaylistFn = bool(*)(const char*); extern LoadPlaylistFn originalLoadPlaylist; + + using CFPSPanel_PaintFn = void(*)(void*); + extern CFPSPanel_PaintFn originalCFPSPanel_Paint; #pragma endregion void InstallHooks(); diff --git a/r5dev/include/logsystem.h b/r5dev/include/logsystem.h new file mode 100644 index 00000000..9f683da4 --- /dev/null +++ b/r5dev/include/logsystem.h @@ -0,0 +1,33 @@ +#pragma once + +#define LOGSYSTEM_LINES_TO_SHOW 3 + +enum LogType_t +{ + SCRIPT_SERVER, + SCRIPT_CLIENT, + SCRIPT_UI, + SCRIPT_WARNING, + NATIVE +}; + +struct Log +{ + std::string Message = ""; + int Ticks = 1024; + LogType_t Type = LogType_t::NATIVE; +}; + +class LogSystem +{ + +public: + void AddLog(LogType_t type, std::string text); + void Update(); + +private: + std::array GetLogColorForType(LogType_t type); + std::vector m_vLogs; +}; + +extern LogSystem g_LogSystem; \ No newline at end of file diff --git a/r5dev/include/patterns.h b/r5dev/include/patterns.h index 7575b145..756d8e3c 100644 --- a/r5dev/include/patterns.h +++ b/r5dev/include/patterns.h @@ -150,6 +150,10 @@ namespace FUNC_AT_ADDRESS(addr_KeyValues_FindKey, void*(*)(void*, const char*, bool), r5_patterns.PatternSearch("40 56 57 41 57 48 81 EC ?? ?? ?? ?? 45").GetPtr()); #pragma endregion + /*0x14074A230*/ + FUNC_AT_ADDRESS(addr_CFPSPanel_Paint, void(*)(void*), r5_patterns.PatternSearch("48 8B C4 55 56 41 55 48 8D A8 ? ? ? ?").GetPtr()); +#pragma endregion + void PrintHAddress() // Test the sigscan results { diff --git a/r5dev/r5dev.vcxproj b/r5dev/r5dev.vcxproj index cb9600f8..5c04ce0a 100644 --- a/r5dev/r5dev.vcxproj +++ b/r5dev/r5dev.vcxproj @@ -327,6 +327,7 @@ if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib ( + @@ -371,6 +372,7 @@ if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib ( + Use pch.h @@ -406,6 +408,7 @@ if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib ( pch.h + Use pch.h diff --git a/r5dev/r5dev.vcxproj.filters b/r5dev/r5dev.vcxproj.filters index 2b0ae6f1..8e2d1748 100644 --- a/r5dev/r5dev.vcxproj.filters +++ b/r5dev/r5dev.vcxproj.filters @@ -112,6 +112,9 @@ {a2663195-c4f2-4d5f-8d65-cfed54976e4c} + + {10a22c13-763e-4054-bf6a-8f4b61697520} + @@ -216,6 +219,12 @@ hooks\src\cmatsystemsurface + + hooks\src\cfpspanel + + + r5-sdk\src + @@ -591,6 +600,9 @@ r5-sdk\include + + r5-sdk\include + diff --git a/r5dev/src/cfpspanel.cpp b/r5dev/src/cfpspanel.cpp new file mode 100644 index 00000000..7aa209de --- /dev/null +++ b/r5dev/src/cfpspanel.cpp @@ -0,0 +1,15 @@ +#include "pch.h" +#include "hooks.h" +#include "logsystem.h" + +namespace Hooks +{ + CFPSPanel_PaintFn originalCFPSPanel_Paint = nullptr; +} + +void Hooks::CFPSPanel_Paint(void* thisptr) +{ + originalCFPSPanel_Paint(thisptr); + + g_LogSystem.Update(); +} \ No newline at end of file diff --git a/r5dev/src/hooks/hooks.cpp b/r5dev/src/hooks/hooks.cpp index 891e5504..78af56c1 100644 --- a/r5dev/src/hooks/hooks.cpp +++ b/r5dev/src/hooks/hooks.cpp @@ -59,6 +59,7 @@ void Hooks::InstallHooks() // Hook Utility functions MH_CreateHook(addr_MSG_EngineError, &Hooks::MSG_EngineError, reinterpret_cast(&originalMSG_EngineError)); MH_CreateHook(addr_LoadPlaylist, &Hooks::LoadPlaylist, reinterpret_cast(&originalLoadPlaylist)); + MH_CreateHook(addr_CFPSPanel_Paint, &Hooks::CFPSPanel_Paint, reinterpret_cast(&originalCFPSPanel_Paint)); /////////////////////////////////////////////////////////////////////////////// // Hook WinAPI @@ -121,6 +122,7 @@ void Hooks::InstallHooks() // Enabled Utility hooks MH_EnableHook(addr_MSG_EngineError); MH_EnableHook(addr_LoadPlaylist); + MH_EnableHook(addr_CFPSPanel_Paint); } void Hooks::RemoveHooks() @@ -175,6 +177,12 @@ void Hooks::RemoveHooks() MH_RemoveHook(ShowCursorPtr); } + /////////////////////////////////////////////////////////////////////////////// + // Unhook Utility functions + MH_RemoveHook(addr_MSG_EngineError); + MH_RemoveHook(addr_LoadPlaylist); + MH_RemoveHook(addr_CFPSPanel_Paint); + /////////////////////////////////////////////////////////////////////////////// // Unhook CBaseFileSystem functions. //MH_RemoveHook(addr_CBaseFileSystem_FileSystemWarning); diff --git a/r5dev/src/hooks/net.cpp b/r5dev/src/hooks/net.cpp index 21a1b259..096d33d4 100644 --- a/r5dev/src/hooks/net.cpp +++ b/r5dev/src/hooks/net.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "hooks.h" +#include "logsystem.h" namespace Hooks { @@ -48,6 +49,8 @@ void Hooks::NET_PrintFunc(const char* fmt, ...) std::string s = oss_print.str(); const char* c = s.c_str(); + g_LogSystem.AddLog(LogType_t::NATIVE, s); + Items.push_back(Strdup((const char*)c)); } diff --git a/r5dev/src/hooks/sqvm.cpp b/r5dev/src/hooks/sqvm.cpp index 13eab075..34a02f36 100644 --- a/r5dev/src/hooks/sqvm.cpp +++ b/r5dev/src/hooks/sqvm.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "hooks.h" +#include "logsystem.h" namespace Hooks { @@ -62,7 +63,10 @@ void* Hooks::SQVM_Print(void* sqvm, char* fmt, ...) std::string s = oss_print.str(); const char* c = s.c_str(); - Items.push_back(Strdup(c)); + g_LogSystem.AddLog((LogType_t)vmIdx, s); + + Items.push_back(Strdup(c)); + return NULL; } @@ -113,6 +117,8 @@ __int64 Hooks::SQVM_Warning(void* sqvm, int a2, int a3, int* stringSize, void** std::string s = oss_warning.str(); const char* c = s.c_str(); + g_LogSystem.AddLog((LogType_t)vmIdx, s); + Items.push_back(Strdup(c)); return result; diff --git a/r5dev/src/logsystem.cpp b/r5dev/src/logsystem.cpp new file mode 100644 index 00000000..7474b6b8 --- /dev/null +++ b/r5dev/src/logsystem.cpp @@ -0,0 +1,65 @@ +#include "pch.h" +#include "hooks.h" +#include "logsystem.h" + +LogSystem g_LogSystem; + +void LogSystem::Update() +{ + if (m_vLogs.empty()) + return; + + static void* g_pMatSystemSurface = MemoryAddress(0x14D40B360).RCast(); + + int fontHeight = 16; + + for (int i = 0; i < m_vLogs.size(); ++i) { + if (m_vLogs[i].Ticks >= 0) + { + if (i < LOGSYSTEM_LINES_TO_SHOW) { + + float fadepct = fminf(float(m_vLogs[i].Ticks) / 64.f, 1.0); + + float ptc = (int)ceilf( fadepct * 255.f); + int alpha = (int)ptc; + + int y = (10 + (fontHeight * i)); + + std::array color = GetLogColorForType(m_vLogs[i].Type); + + MemoryAddress(0x140547900).RCast()(g_pMatSystemSurface, 0x13, fontHeight, 10, y, color[0], color[1], color[2], alpha, m_vLogs[i].Message.c_str()); + } + + m_vLogs[i].Ticks--; + } + else { + m_vLogs.erase(m_vLogs.begin() + i); + } + + } +} + +void LogSystem::AddLog(LogType_t type, std::string message) +{ + Log log; + log.Message = message; + log.Type = type; + log.Ticks = 1024; + if (m_vLogs.size() > LOGSYSTEM_LINES_TO_SHOW-1) { + m_vLogs.erase(m_vLogs.begin()); + } + m_vLogs.push_back(log); +} + +std::array LogSystem::GetLogColorForType(LogType_t type) { + switch(type) { + case LogType_t::NATIVE: + return { 255, 255, 255 }; + case LogType_t::SCRIPT_SERVER: + return { 163, 156, 213 }; + case LogType_t::SCRIPT_CLIENT: + return { 117, 116, 139 }; + case LogType_t::SCRIPT_UI: + return { 117, 99, 98 }; + } +} \ No newline at end of file