switch to new game speed handler

This commit is contained in:
EricPlayZ
2024-04-29 21:19:55 +03:00
parent 4ca2ddf7b2
commit 4879e68867
4 changed files with 26 additions and 30 deletions

View File

@ -248,6 +248,13 @@ namespace Core {
}).detach(); }).detach();
} }
std::thread([]() {
while (!Engine::GameSpeedHandler::initialized)
Engine::GameSpeedHandler::Setup();
spdlog::info("GameSpeedHandler has been set up successfully!");
}).detach();
const HANDLE proc = GetCurrentProcess(); const HANDLE proc = GetCurrentProcess();
WaitForSingleObject(proc, INFINITE); WaitForSingleObject(proc, INFINITE);

View File

@ -3,7 +3,7 @@
namespace Engine { namespace Engine {
namespace GameSpeedHandler { namespace GameSpeedHandler {
float speed = 1.0; float speed = 1.0;
bool initialised = false; bool initialized = false;
#pragma region GetTickCount64Hook #pragma region GetTickCount64Hook
ULONGLONG GTC64_BaseTime = 0; ULONGLONG GTC64_BaseTime = 0;
@ -16,7 +16,7 @@ namespace Engine {
static Utils::Hook::MHook<LPVOID, ULONGLONG(WINAPI*)()> GetTickCount64Hook{ "GetTickCount64", &GetGetTickCount64, &detourGetTickCount64 }; static Utils::Hook::MHook<LPVOID, ULONGLONG(WINAPI*)()> GetTickCount64Hook{ "GetTickCount64", &GetGetTickCount64, &detourGetTickCount64 };
ULONGLONG WINAPI detourGetTickCount64() { ULONGLONG WINAPI detourGetTickCount64() {
return GTC64_OffsetTime + ((GetTickCount64Hook.pOriginal() - GTC64_BaseTime) * speed); return GTC64_OffsetTime + ((GetTickCount64Hook.pOriginal() - GTC64_BaseTime) * static_cast<double>(speed));
} }
#pragma endregion #pragma endregion
@ -33,24 +33,27 @@ namespace Engine {
BOOL WINAPI detourQueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount) { BOOL WINAPI detourQueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount) {
LARGE_INTEGER x; LARGE_INTEGER x;
QueryPerformanceCounterHook.pOriginal(&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<double>(speed));
return true; return true;
} }
#pragma endregion #pragma endregion
void Setup() { void Setup() {
if (!GetTickCount64Hook.pOriginal || !QueryPerformanceCounterHook.pOriginal || initialized)
return;
GTC64_BaseTime = GetTickCount64Hook.pOriginal(); GTC64_BaseTime = GetTickCount64Hook.pOriginal();
GTC64_OffsetTime = GTC64_BaseTime; GTC64_OffsetTime = GTC64_BaseTime;
QueryPerformanceCounterHook.pOriginal(&QPC_BaseTime); QueryPerformanceCounterHook.pOriginal(&QPC_BaseTime);
QPC_OffsetTime.QuadPart = QPC_BaseTime.QuadPart; QPC_OffsetTime.QuadPart = QPC_BaseTime.QuadPart;
initialised = true; initialized = true;
} }
void SetGameSpeed(float gameSpeed) { void SetGameSpeed(float gameSpeed) {
if (initialised) { if (initialized) {
GTC64_OffsetTime = detourGetTickCount64(); GTC64_OffsetTime = detourGetTickCount64();
GTC64_BaseTime = GetTickCount64Hook.pOriginal(); GTC64_BaseTime = GetTickCount64Hook.pOriginal();

View File

@ -2,6 +2,7 @@
namespace Engine { namespace Engine {
namespace GameSpeedHandler { namespace GameSpeedHandler {
extern float speed; extern float speed;
extern bool initialized;
void Setup(); void Setup();
void SetGameSpeed(float gameSpeed); void SetGameSpeed(float gameSpeed);

View File

@ -10,8 +10,6 @@ namespace Menu {
float time = 0.0f; float time = 0.0f;
static float timeBeforeFreeze = 0.0f; static float timeBeforeFreeze = 0.0f;
float gameSpeed = 1.0f; float gameSpeed = 1.0f;
static float actualGameSpeed = gameSpeed;
static float gameSpeedBeforeSlowMo = gameSpeed;
KeyBindOption freezeTime{ VK_NONE }; KeyBindOption freezeTime{ VK_NONE };
KeyBindOption slowMotion{ '4' }; KeyBindOption slowMotion{ '4' };
float slowMotionSpeed = 0.4f; float slowMotionSpeed = 0.4f;
@ -54,29 +52,25 @@ namespace Menu {
} }
static bool slowMoHasChanged = true; static bool slowMoHasChanged = true;
static float initialGameSpeed = Engine::GameSpeedHandler::speed;
if (slowMotion.HasChangedTo(false)) { if (slowMotion.HasChangedTo(false)) {
static float gameSpeedAfterChange = 0.0f;
if (slowMoHasChanged) if (slowMoHasChanged)
gameSpeedAfterChange = actualGameSpeed; initialGameSpeed = Engine::GameSpeedHandler::speed;
slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", gameSpeedAfterChange, gameSpeedBeforeSlowMo, slowMotionTransitionTime, slowMoHasChanged, &ImGui::AnimEaseInOutSine); slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", initialGameSpeed, gameSpeed, slowMotionTransitionTime, slowMoHasChanged, &ImGui::AnimEaseInOutSine);
iLevel->TimerSetSpeedUp(slowMotionSpeedLerp); Engine::GameSpeedHandler::SetGameSpeed(slowMotionSpeedLerp);
slowMoHasChanged = false; slowMoHasChanged = false;
if (Utils::Values::are_samef(actualGameSpeed, gameSpeedBeforeSlowMo)) { if (Utils::Values::are_samef(Engine::GameSpeedHandler::speed, gameSpeed)) {
slowMoHasChanged = true; slowMoHasChanged = true;
slowMotion.SetPrevValue(false); slowMotion.SetPrevValue(false);
} }
} else if (slowMotion.GetValue()) { } else if (slowMotion.GetValue()) {
static float gameSpeedAfterChange = 0.0f; if (slowMotion.HasChanged())
if (slowMotion.HasChanged()) { initialGameSpeed = Engine::GameSpeedHandler::speed;
if (slowMoHasChanged)
gameSpeedBeforeSlowMo = actualGameSpeed;
gameSpeedAfterChange = actualGameSpeed;
}
slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", gameSpeedAfterChange, slowMotionSpeed, slowMotionTransitionTime, slowMotion.HasChanged(), &ImGui::AnimEaseInOutSine); slowMotionSpeedLerp = ImGui::AnimateLerp("slowMotionSpeedLerp", initialGameSpeed, slowMotionSpeed, slowMotionTransitionTime, slowMotion.HasChanged(), &ImGui::AnimEaseInOutSine);
iLevel->TimerSetSpeedUp(slowMotionSpeedLerp); Engine::GameSpeedHandler::SetGameSpeed(slowMotionSpeedLerp);
if (slowMotion.HasChanged()) { if (slowMotion.HasChanged()) {
slowMoHasChanged = true; slowMoHasChanged = true;
@ -88,10 +82,6 @@ namespace Menu {
time = dayNightCycle->time1 * 24.0f; time = dayNightCycle->time1 * 24.0f;
if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze, 0.009999f)) if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze, 0.009999f))
dayNightCycle->SetDaytime(timeBeforeFreeze); dayNightCycle->SetDaytime(timeBeforeFreeze);
if (!slowMotion.GetValue() && !slowMotion.HasChanged() && !Utils::Values::are_samef(gameSpeed, 1.0f))
iLevel->TimerSetSpeedUp(gameSpeed);
actualGameSpeed = iLevel->TimerGetSpeedUp();
} }
} }
void Tab::Render() { void Tab::Render() {
@ -115,12 +105,7 @@ namespace Menu {
ImGui::BeginDisabled(slowMotion.GetValue()); { ImGui::BeginDisabled(slowMotion.GetValue()); {
if (ImGui::SliderFloat("Game Speed", &gameSpeed, 0.0f, 2.0f, "%.2fx")) if (ImGui::SliderFloat("Game Speed", &gameSpeed, 0.0f, 2.0f, "%.2fx"))
iLevel->TimerSetSpeedUp(gameSpeed); Engine::GameSpeedHandler::SetGameSpeed(gameSpeed);
else if (iLevel && iLevel->IsLoaded()) {
if (!slowMotion.GetValue() && !slowMotion.HasChanged() && !Utils::Values::are_samef(gameSpeed, 1.0f))
iLevel->TimerSetSpeedUp(gameSpeed);
actualGameSpeed = iLevel->TimerGetSpeedUp();
}
ImGui::EndDisabled(); ImGui::EndDisabled();
} }