From 4879e6886700c6e25f27079ce16654777db8b2f5 Mon Sep 17 00:00:00 2001 From: EricPlayZ Date: Mon, 29 Apr 2024 21:19:55 +0300 Subject: [PATCH] switch to new game speed handler --- EGameTools/source/core.cpp | 7 ++++ .../source/game/Engine/GameSpeedHandler.cpp | 13 ++++--- .../source/game/Engine/GameSpeedHandler.h | 1 + EGameTools/source/menu/world.cpp | 35 ++++++------------- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/EGameTools/source/core.cpp b/EGameTools/source/core.cpp index b8f04aa..42b4e53 100644 --- a/EGameTools/source/core.cpp +++ b/EGameTools/source/core.cpp @@ -248,6 +248,13 @@ namespace Core { }).detach(); } + std::thread([]() { + while (!Engine::GameSpeedHandler::initialized) + Engine::GameSpeedHandler::Setup(); + + spdlog::info("GameSpeedHandler has been set up successfully!"); + }).detach(); + const HANDLE proc = GetCurrentProcess(); WaitForSingleObject(proc, INFINITE); diff --git a/EGameTools/source/game/Engine/GameSpeedHandler.cpp b/EGameTools/source/game/Engine/GameSpeedHandler.cpp index f7ce59a..67eadf6 100644 --- a/EGameTools/source/game/Engine/GameSpeedHandler.cpp +++ b/EGameTools/source/game/Engine/GameSpeedHandler.cpp @@ -3,7 +3,7 @@ namespace Engine { namespace GameSpeedHandler { float speed = 1.0; - bool initialised = false; + bool initialized = false; #pragma region GetTickCount64Hook ULONGLONG GTC64_BaseTime = 0; @@ -16,7 +16,7 @@ namespace Engine { static Utils::Hook::MHook GetTickCount64Hook{ "GetTickCount64", &GetGetTickCount64, &detourGetTickCount64 }; ULONGLONG WINAPI detourGetTickCount64() { - return GTC64_OffsetTime + ((GetTickCount64Hook.pOriginal() - GTC64_BaseTime) * speed); + return GTC64_OffsetTime + ((GetTickCount64Hook.pOriginal() - GTC64_BaseTime) * static_cast(speed)); } #pragma endregion @@ -33,24 +33,27 @@ namespace Engine { BOOL WINAPI detourQueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount) { LARGE_INTEGER x; QueryPerformanceCounterHook.pOriginal(&x); - lpPerformanceCount->QuadPart = QPC_OffsetTime.QuadPart + ((x.QuadPart - QPC_BaseTime.QuadPart) * speed); + lpPerformanceCount->QuadPart = QPC_OffsetTime.QuadPart + ((x.QuadPart - QPC_BaseTime.QuadPart) * static_cast(speed)); return true; } #pragma endregion void Setup() { + if (!GetTickCount64Hook.pOriginal || !QueryPerformanceCounterHook.pOriginal || initialized) + return; + GTC64_BaseTime = GetTickCount64Hook.pOriginal(); GTC64_OffsetTime = GTC64_BaseTime; QueryPerformanceCounterHook.pOriginal(&QPC_BaseTime); QPC_OffsetTime.QuadPart = QPC_BaseTime.QuadPart; - initialised = true; + initialized = true; } void SetGameSpeed(float gameSpeed) { - if (initialised) { + if (initialized) { GTC64_OffsetTime = detourGetTickCount64(); GTC64_BaseTime = GetTickCount64Hook.pOriginal(); diff --git a/EGameTools/source/game/Engine/GameSpeedHandler.h b/EGameTools/source/game/Engine/GameSpeedHandler.h index 9d1b483..5bcbe21 100644 --- a/EGameTools/source/game/Engine/GameSpeedHandler.h +++ b/EGameTools/source/game/Engine/GameSpeedHandler.h @@ -2,6 +2,7 @@ namespace Engine { namespace GameSpeedHandler { extern float speed; + extern bool initialized; void Setup(); void SetGameSpeed(float gameSpeed); diff --git a/EGameTools/source/menu/world.cpp b/EGameTools/source/menu/world.cpp index 47f3bad..3aa51c5 100644 --- a/EGameTools/source/menu/world.cpp +++ b/EGameTools/source/menu/world.cpp @@ -10,8 +10,6 @@ namespace Menu { float time = 0.0f; static float timeBeforeFreeze = 0.0f; float gameSpeed = 1.0f; - static float actualGameSpeed = gameSpeed; - static float gameSpeedBeforeSlowMo = gameSpeed; KeyBindOption freezeTime{ VK_NONE }; KeyBindOption slowMotion{ '4' }; float slowMotionSpeed = 0.4f; @@ -54,29 +52,25 @@ namespace Menu { } static bool slowMoHasChanged = true; + static float initialGameSpeed = Engine::GameSpeedHandler::speed; if (slowMotion.HasChangedTo(false)) { - static float gameSpeedAfterChange = 0.0f; if (slowMoHasChanged) - gameSpeedAfterChange = actualGameSpeed; + initialGameSpeed = Engine::GameSpeedHandler::speed; - slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", gameSpeedAfterChange, gameSpeedBeforeSlowMo, slowMotionTransitionTime, slowMoHasChanged, &ImGui::AnimEaseInOutSine); - iLevel->TimerSetSpeedUp(slowMotionSpeedLerp); + slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", initialGameSpeed, gameSpeed, slowMotionTransitionTime, slowMoHasChanged, &ImGui::AnimEaseInOutSine); + Engine::GameSpeedHandler::SetGameSpeed(slowMotionSpeedLerp); slowMoHasChanged = false; - if (Utils::Values::are_samef(actualGameSpeed, gameSpeedBeforeSlowMo)) { + if (Utils::Values::are_samef(Engine::GameSpeedHandler::speed, gameSpeed)) { slowMoHasChanged = true; slowMotion.SetPrevValue(false); } } else if (slowMotion.GetValue()) { - static float gameSpeedAfterChange = 0.0f; - if (slowMotion.HasChanged()) { - if (slowMoHasChanged) - gameSpeedBeforeSlowMo = actualGameSpeed; - gameSpeedAfterChange = actualGameSpeed; - } + if (slowMotion.HasChanged()) + initialGameSpeed = Engine::GameSpeedHandler::speed; - slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", gameSpeedAfterChange, slowMotionSpeed, slowMotionTransitionTime, slowMotion.HasChanged(), &ImGui::AnimEaseInOutSine); - iLevel->TimerSetSpeedUp(slowMotionSpeedLerp); + slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", initialGameSpeed, slowMotionSpeed, slowMotionTransitionTime, slowMotion.HasChanged(), &ImGui::AnimEaseInOutSine); + Engine::GameSpeedHandler::SetGameSpeed(slowMotionSpeedLerp); if (slowMotion.HasChanged()) { slowMoHasChanged = true; @@ -88,10 +82,6 @@ namespace Menu { time = dayNightCycle->time1 * 24.0f; if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze, 0.009999f)) dayNightCycle->SetDaytime(timeBeforeFreeze); - - if (!slowMotion.GetValue() && !slowMotion.HasChanged() && !Utils::Values::are_samef(gameSpeed, 1.0f)) - iLevel->TimerSetSpeedUp(gameSpeed); - actualGameSpeed = iLevel->TimerGetSpeedUp(); } } void Tab::Render() { @@ -115,12 +105,7 @@ namespace Menu { ImGui::BeginDisabled(slowMotion.GetValue()); { if (ImGui::SliderFloat("Game Speed", &gameSpeed, 0.0f, 2.0f, "%.2fx")) - iLevel->TimerSetSpeedUp(gameSpeed); - else if (iLevel && iLevel->IsLoaded()) { - if (!slowMotion.GetValue() && !slowMotion.HasChanged() && !Utils::Values::are_samef(gameSpeed, 1.0f)) - iLevel->TimerSetSpeedUp(gameSpeed); - actualGameSpeed = iLevel->TimerGetSpeedUp(); - } + Engine::GameSpeedHandler::SetGameSpeed(gameSpeed); ImGui::EndDisabled(); }