mirror of
https://github.com/EricPlayZ/EGameTools.git
synced 2025-07-18 17:37:53 +08:00
switch to new game speed handler
This commit is contained in:
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
namespace Engine {
|
||||
namespace GameSpeedHandler {
|
||||
extern float speed;
|
||||
extern bool initialized;
|
||||
|
||||
void Setup();
|
||||
void SetGameSpeed(float gameSpeed);
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user