From 7b82230ae571b10422292de08d793557161cd2bb Mon Sep 17 00:00:00 2001 From: Redline <> Date: Mon, 29 Sep 2025 07:00:00 +0200 Subject: [PATCH] Built in FPS counter --- mc2hook/mc2hook/age/gfx/font.cpp | 6 ++++ mc2hook/mc2hook/age/gfx/font.h | 8 +++++ mc2hook/mc2hook/age/gfx/pipeline.cpp | 4 +++ mc2hook/mc2hook/age/gfx/pipeline.h | 9 ++++++ .../mc2hook/handlers/FPSCounterHandler.cpp | 29 +++++++++++++++++++ mc2hook/mc2hook/handlers/FPSCounterHandler.h | 11 +++++++ mc2hook/mc2hook/handlers/handlers.h | 2 ++ mc2hook/mc2hook/mc2hook.vcxproj | 6 ++++ mc2hook/mc2hook/mc2hook.vcxproj.filters | 18 ++++++++++++ 9 files changed, 93 insertions(+) create mode 100644 mc2hook/mc2hook/age/gfx/font.cpp create mode 100644 mc2hook/mc2hook/age/gfx/font.h create mode 100644 mc2hook/mc2hook/age/gfx/pipeline.cpp create mode 100644 mc2hook/mc2hook/age/gfx/pipeline.h create mode 100644 mc2hook/mc2hook/handlers/FPSCounterHandler.cpp create mode 100644 mc2hook/mc2hook/handlers/FPSCounterHandler.h diff --git a/mc2hook/mc2hook/age/gfx/font.cpp b/mc2hook/mc2hook/age/gfx/font.cpp new file mode 100644 index 0000000..98d2d80 --- /dev/null +++ b/mc2hook/mc2hook/age/gfx/font.cpp @@ -0,0 +1,6 @@ +#include "font.h" + +void gfxFont::DrawFont(int x, int y, const char* string, void* a4) +{ + hook::StaticThunk<0x5F9E40>::Call(x, y, string, a4); +} diff --git a/mc2hook/mc2hook/age/gfx/font.h b/mc2hook/mc2hook/age/gfx/font.h new file mode 100644 index 0000000..e593f5b --- /dev/null +++ b/mc2hook/mc2hook/age/gfx/font.h @@ -0,0 +1,8 @@ +#pragma once +#include + +class gfxFont +{ +public: + static void DrawFont(int x, int y, const char* string, void* a4); +}; diff --git a/mc2hook/mc2hook/age/gfx/pipeline.cpp b/mc2hook/mc2hook/age/gfx/pipeline.cpp new file mode 100644 index 0000000..cf33785 --- /dev/null +++ b/mc2hook/mc2hook/age/gfx/pipeline.cpp @@ -0,0 +1,4 @@ +#include "pipeline.h" + +declfield(gfxPipeline::m_iWidth) = 0x674FAC; +declfield(gfxPipeline::m_iHeight) = 0x674FB0; diff --git a/mc2hook/mc2hook/age/gfx/pipeline.h b/mc2hook/mc2hook/age/gfx/pipeline.h new file mode 100644 index 0000000..34f6ad2 --- /dev/null +++ b/mc2hook/mc2hook/age/gfx/pipeline.h @@ -0,0 +1,9 @@ +#pragma once +#include + +class gfxPipeline +{ +public: + static hook::TypeProxy m_iWidth; + static hook::TypeProxy m_iHeight; +}; diff --git a/mc2hook/mc2hook/handlers/FPSCounterHandler.cpp b/mc2hook/mc2hook/handlers/FPSCounterHandler.cpp new file mode 100644 index 0000000..df42300 --- /dev/null +++ b/mc2hook/mc2hook/handlers/FPSCounterHandler.cpp @@ -0,0 +1,29 @@ +#include "FPSCounterHandler.h" +#include +#include + +declfield(FPSCounterHandler::s_FrameTime) = 0x858348; + +char fpsString[64]; +float fps; + +void FPSCounterHandler::DrawFontHook(int x, int y, void* a3, void* a4) +{ + fps = 1000.0f / s_FrameTime; // Originally in the code it divides 1010.0f? + sprintf(fpsString, "%.0f", fps); + gfxFont::DrawFont(gfxPipeline::m_iWidth - (8 * strlen(fpsString) + 40), y, fpsString, a4); +} + +void FPSCounterHandler::Install() +{ + bool enableFPSCounter = HookConfig::GetBool("Graphics", "EnableFPSCounter", false); + + if (enableFPSCounter) + { + mem::write(0x858330, static_cast(1)); // Forces -frametime on + InstallCallback("FPS Counter", "FPS Counter", + &DrawFontHook, { + cb::call(0x5ED1A1) + }); + } +} diff --git a/mc2hook/mc2hook/handlers/FPSCounterHandler.h b/mc2hook/mc2hook/handlers/FPSCounterHandler.h new file mode 100644 index 0000000..7221976 --- /dev/null +++ b/mc2hook/mc2hook/handlers/FPSCounterHandler.h @@ -0,0 +1,11 @@ +#pragma once +#include + +class FPSCounterHandler +{ +private: + static hook::TypeProxy s_FrameTime; +public: + void DrawFontHook(int x, int y, void* a3, void* a4); + static void Install(); +}; diff --git a/mc2hook/mc2hook/handlers/handlers.h b/mc2hook/mc2hook/handlers/handlers.h index ea7a661..a57f1ab 100644 --- a/mc2hook/mc2hook/handlers/handlers.h +++ b/mc2hook/mc2hook/handlers/handlers.h @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -50,6 +51,7 @@ static void InstallMainHandlers() InstallHandler("Chat Handler"); InstallHandler("Game Init Handler"); InstallHandler("Reflection Fidelity Handller"); + InstallHandler("FPS Counter Handler"); InstallHandler("SRH"); } \ No newline at end of file diff --git a/mc2hook/mc2hook/mc2hook.vcxproj b/mc2hook/mc2hook/mc2hook.vcxproj index 056702b..73d2459 100644 --- a/mc2hook/mc2hook/mc2hook.vcxproj +++ b/mc2hook/mc2hook/mc2hook.vcxproj @@ -158,6 +158,8 @@ + + @@ -192,6 +194,7 @@ + @@ -224,6 +227,8 @@ + + @@ -245,6 +250,7 @@ + diff --git a/mc2hook/mc2hook/mc2hook.vcxproj.filters b/mc2hook/mc2hook/mc2hook.vcxproj.filters index 027b650..a7bfa91 100644 --- a/mc2hook/mc2hook/mc2hook.vcxproj.filters +++ b/mc2hook/mc2hook/mc2hook.vcxproj.filters @@ -219,6 +219,15 @@ Header Files + + Header Files + + + Header Files + + + Header Files + @@ -341,5 +350,14 @@ Source Files + + Source Files + + + Source Files + + + Source Files + \ No newline at end of file