From 7f867221168daad378786e4335fd73c3d4445ff4 Mon Sep 17 00:00:00 2001 From: r-ex <67599507+r-ex@users.noreply.github.com> Date: Wed, 20 Oct 2021 17:04:21 +0100 Subject: [PATCH] changed paint hook for logsystem and fixed some issue (#58) * changed paint hook * Update gameclasses.cpp * fixed vector issue with logsystem (i think) --- r5dev/include/hooks.h | 10 +++++++--- r5dev/include/patterns.h | 6 +++--- r5dev/r5dev.vcxproj | 2 +- r5dev/r5dev.vcxproj.filters | 6 +++--- r5dev/src/cenginevgui.cpp | 29 +++++++++++++++++++++++++++++ r5dev/src/cfpspanel.cpp | 15 --------------- r5dev/src/gameclasses.cpp | 3 ++- r5dev/src/hooks/hooks.cpp | 6 +++--- r5dev/src/logsystem.cpp | 18 +++++++++++++----- 9 files changed, 61 insertions(+), 34 deletions(-) create mode 100644 r5dev/src/cenginevgui.cpp delete mode 100644 r5dev/src/cfpspanel.cpp diff --git a/r5dev/include/hooks.h b/r5dev/include/hooks.h index f5af6b96..2e37e077 100644 --- a/r5dev/include/hooks.h +++ b/r5dev/include/hooks.h @@ -127,10 +127,16 @@ namespace Hooks extern FrameUpdateFn originalFrameUpdate; #pragma endregion +#pragma region CEngineVGui + int CEngineVGui_Paint(void* thisptr, int mode); + + using CEngineVGui_PaintFn = int(*)(void*, int); + extern CEngineVGui_PaintFn originalCEngineVGui_Paint; +#pragma endregion + #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; @@ -138,8 +144,6 @@ namespace Hooks 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/patterns.h b/r5dev/include/patterns.h index f6182a38..e1c7d70d 100644 --- a/r5dev/include/patterns.h +++ b/r5dev/include/patterns.h @@ -150,9 +150,9 @@ 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 -#pragma region CFPSPanel - /*0x14074A230*/ - FUNC_AT_ADDRESS(addr_CFPSPanel_Paint, void(*)(void*), r5_patterns.PatternSearch("48 8B C4 55 56 41 55 48 8D A8 ? ? ? ?").GetPtr()); +#pragma region CEngineVGui + /*0x140283FD0*/ + FUNC_AT_ADDRESS(addr_CEngineVGui_Paint, int(*)(void*, int), r5_patterns.PatternSearch("41 55 41 56 48 83 EC 78 44 8B EA").GetPtr()); #pragma endregion diff --git a/r5dev/r5dev.vcxproj b/r5dev/r5dev.vcxproj index 5c04ce0a..2102780c 100644 --- a/r5dev/r5dev.vcxproj +++ b/r5dev/r5dev.vcxproj @@ -372,7 +372,7 @@ if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib ( - + Use pch.h diff --git a/r5dev/r5dev.vcxproj.filters b/r5dev/r5dev.vcxproj.filters index 8e2d1748..ed4a00fa 100644 --- a/r5dev/r5dev.vcxproj.filters +++ b/r5dev/r5dev.vcxproj.filters @@ -112,7 +112,7 @@ {a2663195-c4f2-4d5f-8d65-cfed54976e4c} - + {10a22c13-763e-4054-bf6a-8f4b61697520} @@ -219,8 +219,8 @@ hooks\src\cmatsystemsurface - - hooks\src\cfpspanel + + hooks\src\cenginevgui r5-sdk\src diff --git a/r5dev/src/cenginevgui.cpp b/r5dev/src/cenginevgui.cpp new file mode 100644 index 00000000..9b888f3e --- /dev/null +++ b/r5dev/src/cenginevgui.cpp @@ -0,0 +1,29 @@ +#include "pch.h" +#include "hooks.h" +#include "logsystem.h" + +namespace Hooks +{ + CEngineVGui_PaintFn originalCEngineVGui_Paint = nullptr; +} + +int Hooks::CEngineVGui_Paint(void* thisptr, int mode) +{ + int result = originalCEngineVGui_Paint(thisptr, mode); + + static void* g_pMatSystemSurface = MemoryAddress(0x14D40B3B0).RCast(); + static auto RenderStart = MemoryAddress(0x14053EFC0).RCast(); + static auto RenderEnd = MemoryAddress(0x14053F1B0).RCast(); + + if (mode == 1 || mode == 2) + { + RenderStart(g_pMatSystemSurface); + + g_LogSystem.Update(); + + RenderEnd(); + } + + + return result; +} \ No newline at end of file diff --git a/r5dev/src/cfpspanel.cpp b/r5dev/src/cfpspanel.cpp deleted file mode 100644 index 7aa209de..00000000 --- a/r5dev/src/cfpspanel.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#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/gameclasses.cpp b/r5dev/src/gameclasses.cpp index 26008da9..fb84fac5 100644 --- a/r5dev/src/gameclasses.cpp +++ b/r5dev/src/gameclasses.cpp @@ -414,6 +414,7 @@ namespace GameGlobals void* BanIDConCommand = CreateCustomConCommand("banid", "Bans a client from the Server via originID, userID or IP | Usage: banid (originID/ipAddress/userID)", 0, CustomCommandVariations::BanID_Callback, nullptr); ConVar* DrawConsoleOverlayConVar = CreateCustomConVar("cl_drawconsoleoverlay", "0", 0, "Draw the console overlay at the top of the screen", false, 0.f, false, 0.f, nullptr, nullptr); + ConVar* ConsoleOverlayLinesConVar = CreateCustomConVar("cl_consoleoverlay_lines", "3", 0, "Number of lines of console output to draw", false, 1.f, false, 50.f, nullptr, nullptr); } void* CreateCustomConCommand(const char* name, const char* helpString, int flags, void* callback, void* callbackAfterExecution) @@ -528,4 +529,4 @@ const char* KeyValues::GetName() { return GameGlobals::KeyValuesSystem->GetStringForSymbol(MAKE_3_BYTES_FROM_1_AND_2(m_iKeyNameCaseSensitive, m_iKeyNameCaseSensitive2)); } -#pragma endregion \ No newline at end of file +#pragma endregion diff --git a/r5dev/src/hooks/hooks.cpp b/r5dev/src/hooks/hooks.cpp index c2a20187..5c2c8611 100644 --- a/r5dev/src/hooks/hooks.cpp +++ b/r5dev/src/hooks/hooks.cpp @@ -59,7 +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)); + MH_CreateHook(addr_CEngineVGui_Paint, &Hooks::CEngineVGui_Paint, reinterpret_cast(&originalCEngineVGui_Paint)); /////////////////////////////////////////////////////////////////////////////// // Hook WinAPI @@ -122,7 +122,7 @@ void Hooks::InstallHooks() // Enabled Utility hooks MH_EnableHook(addr_MSG_EngineError); MH_EnableHook(addr_LoadPlaylist); - MH_EnableHook(addr_CFPSPanel_Paint); + MH_EnableHook(addr_CEngineVGui_Paint); } void Hooks::RemoveHooks() @@ -176,7 +176,7 @@ void Hooks::RemoveHooks() // Unhook Utility functions MH_RemoveHook(addr_MSG_EngineError); MH_RemoveHook(addr_LoadPlaylist); - MH_RemoveHook(addr_CFPSPanel_Paint); + MH_RemoveHook(addr_CEngineVGui_Paint); /////////////////////////////////////////////////////////////////////////////// // Unhook CBaseFileSystem functions. diff --git a/r5dev/src/logsystem.cpp b/r5dev/src/logsystem.cpp index 7f5564d9..7eb327d1 100644 --- a/r5dev/src/logsystem.cpp +++ b/r5dev/src/logsystem.cpp @@ -19,8 +19,13 @@ void LogSystem::Update() if (GameGlobals::Cvar->FindVar("cl_drawconsoleoverlay")->m_iValue < 1) return; - if (i < LOGSYSTEM_LINES_TO_SHOW) { + if (i < GameGlobals::Cvar->FindVar("cl_consoleoverlay_lines")->m_iValue) + { + if (i >= m_vLogs.size()) + { + break; + } float fadepct = fminf(float(m_vLogs[i].Ticks) / 64.f, 1.0); float ptc = (int)ceilf( fadepct * 255.f); @@ -32,6 +37,10 @@ void LogSystem::Update() MemoryAddress(0x140547900).RCast()(g_pMatSystemSurface, 0x13, fontHeight, 10, y, color[0], color[1], color[2], alpha, m_vLogs[i].Message.c_str()); } + else { + m_vLogs.erase(m_vLogs.begin()); + continue; + } m_vLogs[i].Ticks--; } @@ -48,9 +57,6 @@ void LogSystem::AddLog(LogType_t type, std::string message) 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); } @@ -64,5 +70,7 @@ std::array LogSystem::GetLogColorForType(LogType_t type) { return { 117, 116, 139 }; case LogType_t::SCRIPT_UI: return { 197, 160, 177 }; + default: + return { 255, 255, 255 }; } -} \ No newline at end of file +}