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();
}
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);

View File

@ -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<LPVOID, ULONGLONG(WINAPI*)()> GetTickCount64Hook{ "GetTickCount64", &GetGetTickCount64, &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
@ -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<double>(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();

View File

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

View File

@ -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();
}