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();
|
}).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);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user