From 9459ddd9c75ae7f7664addc3ccc69523c7954973 Mon Sep 17 00:00:00 2001 From: EricPlayZ Date: Sun, 11 Feb 2024 23:58:08 +0200 Subject: [PATCH] - Fixed having FreeCam enabled while in the Map view would cause a weird offset of the entire Map view - Refactored the TPP model code --- .../DL2GameOverhaulScript.vcxproj | 2 +- .../DL2GameOverhaulScript.vcxproj.filters | 6 +- .../source/game/Engine/engine_hooks.cpp | 66 +++---------------- .../source/game/Engine/engine_hooks.h | 9 +++ .../source/game/GamePH/LevelDI.cpp | 27 ++++++-- .../source/game/GamePH/LevelDI.h | 1 + .../source/game/GamePH/game_hooks.cpp | 15 +++-- .../source/game/GamePH/game_hooks.h | 8 --- DL2GameOverhaulScript/source/menu/camera.cpp | 27 +++++++- DL2GameOverhaulScript/source/menu/player.cpp | 7 +- DL2GameOverhaulScript/source/menu/world.cpp | 4 +- 11 files changed, 86 insertions(+), 86 deletions(-) create mode 100644 DL2GameOverhaulScript/source/game/Engine/engine_hooks.h delete mode 100644 DL2GameOverhaulScript/source/game/GamePH/game_hooks.h diff --git a/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj b/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj index 00ec525..9cccda5 100644 --- a/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj +++ b/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj @@ -117,13 +117,13 @@ + - diff --git a/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj.filters b/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj.filters index 44dd4e0..915b248 100644 --- a/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj.filters +++ b/DL2GameOverhaulScript/DL2GameOverhaulScript.vcxproj.filters @@ -334,9 +334,6 @@ game\GamePH - - game\GamePH - game\GamePH @@ -377,6 +374,9 @@ game\GamePH\TimeWeather + + game\Engine + diff --git a/DL2GameOverhaulScript/source/game/Engine/engine_hooks.cpp b/DL2GameOverhaulScript/source/game/Engine/engine_hooks.cpp index 4a7cb49..9cdcd04 100644 --- a/DL2GameOverhaulScript/source/game/Engine/engine_hooks.cpp +++ b/DL2GameOverhaulScript/source/game/Engine/engine_hooks.cpp @@ -2,7 +2,6 @@ #include "..\GamePH\GameDI_PH.h" #include "..\GamePH\LevelDI.h" #include "..\GamePH\Other.h" -#include "..\GamePH\game_hooks.h" #include "..\GamePH\gen_TPPModel.h" #include "..\core.h" #include "..\menu\camera.h" @@ -30,68 +29,19 @@ namespace Engine { static void detourMoveCameraFromForwardUpPos(LPVOID pCBaseCamera, float* a3, float* a4, Vector3* pos); static Utils::Hook::MHook MoveCameraFromForwardUpPosHook{ "MoveCameraFromForwardUpPos", &Offsets::Get_MoveCameraFromForwardUpPos, &detourMoveCameraFromForwardUpPos }; + bool switchedFreeCamByGamePause = false; + Vector3 freeCamPosBeforeGamePause{}; + static void detourMoveCameraFromForwardUpPos(LPVOID pCBaseCamera, float* a3, float* a4, Vector3* pos) { GamePH::LevelDI* iLevel = GamePH::LevelDI::Get(); - if (!iLevel || !iLevel->IsLoaded()) + if (!iLevel || !iLevel->IsLoaded() || iLevel->IsTimerFrozen()) return MoveCameraFromForwardUpPosHook.pOriginal(pCBaseCamera, a3, a4, pos); - GamePH::gen_TPPModel* pgen_TPPModel = GamePH::gen_TPPModel::Get(); - if (pgen_TPPModel) { - if (GamePH::Hooks::wannaUseTPPModel.GetValue()) { - GamePH::Hooks::wannaUseTPPModel.SetPrevValue(true); - if (Menu::Camera::thirdPersonCamera.GetValue() && Menu::Camera::tpUseTPPModel.GetValue()) { - pgen_TPPModel->enableTPPModel2 = false; - pgen_TPPModel->enableTPPModel1 = false; - } - } - - if (Menu::Camera::photoMode.HasChangedTo(false) && !GamePH::Hooks::wannaUseTPPModel.GetValue()) { - if (!Menu::Camera::freeCam.GetValue() && !Menu::Camera::tpUseTPPModel.GetValue()) { - Menu::Camera::photoMode.SetPrevValue(false); - GamePH::ShowTPPModel(false); - } else if (Menu::Camera::freeCam.GetValue() || (Menu::Camera::tpUseTPPModel.GetValue() && Menu::Camera::thirdPersonCamera.GetValue())) { - Menu::Camera::photoMode.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } - } else if (Menu::Camera::photoMode.HasChangedTo(true)) { - Menu::Camera::photoMode.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } else if (Menu::Camera::freeCam.HasChangedTo(false)) { - if (!Menu::Camera::photoMode.GetValue() && !Menu::Camera::thirdPersonCamera.GetValue()) { - Menu::Camera::freeCam.SetPrevValue(false); - GamePH::ShowTPPModel(false); - } else if (Menu::Camera::photoMode.GetValue() || (Menu::Camera::tpUseTPPModel.GetValue() && Menu::Camera::thirdPersonCamera.GetValue())) { - Menu::Camera::freeCam.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } - } else if (Menu::Camera::freeCam.HasChangedTo(true)) { - Menu::Camera::freeCam.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } else if (Menu::Camera::thirdPersonCamera.HasChangedTo(false)) { - if (!Menu::Camera::freeCam.GetValue() && !Menu::Camera::photoMode.GetValue()) { - Menu::Camera::thirdPersonCamera.SetPrevValue(false); - GamePH::ShowTPPModel(false); - } else if (Menu::Camera::freeCam.GetValue() || Menu::Camera::photoMode.GetValue()) { - Menu::Camera::thirdPersonCamera.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } - } else if (Menu::Camera::thirdPersonCamera.HasChangedTo(true) && Menu::Camera::tpUseTPPModel.GetValue()) { - Menu::Camera::thirdPersonCamera.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } else if (Menu::Camera::tpUseTPPModel.HasChangedTo(false)) { - if (!Menu::Camera::freeCam.GetValue() && !Menu::Camera::photoMode.GetValue()) { - Menu::Camera::tpUseTPPModel.SetPrevValue(false); - GamePH::ShowTPPModel(false); - } else if (Menu::Camera::freeCam.GetValue() || Menu::Camera::photoMode.GetValue()) { - Menu::Camera::tpUseTPPModel.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } - } else if (Menu::Camera::tpUseTPPModel.HasChangedTo(true) && Menu::Camera::thirdPersonCamera.GetValue()) { - Menu::Camera::tpUseTPPModel.SetPrevValue(true); - GamePH::ShowTPPModel(true); - } + if (Menu::Camera::freeCam.GetValue() && switchedFreeCamByGamePause) { + switchedFreeCamByGamePause = false; + *pos = freeCamPosBeforeGamePause; + return MoveCameraFromForwardUpPosHook.pOriginal(pCBaseCamera, a3, a4, pos); } - if (!Menu::Camera::thirdPersonCamera.GetValue() || Menu::Camera::photoMode.GetValue() || Menu::Camera::freeCam.GetValue() || !pos) return MoveCameraFromForwardUpPosHook.pOriginal(pCBaseCamera, a3, a4, pos); diff --git a/DL2GameOverhaulScript/source/game/Engine/engine_hooks.h b/DL2GameOverhaulScript/source/game/Engine/engine_hooks.h new file mode 100644 index 0000000..7cf2aab --- /dev/null +++ b/DL2GameOverhaulScript/source/game/Engine/engine_hooks.h @@ -0,0 +1,9 @@ +#pragma once +#include "..\Vector3.h" + +namespace Engine { + namespace Hooks { + extern bool switchedFreeCamByGamePause; + extern Vector3 freeCamPosBeforeGamePause; + } +} \ No newline at end of file diff --git a/DL2GameOverhaulScript/source/game/GamePH/LevelDI.cpp b/DL2GameOverhaulScript/source/game/GamePH/LevelDI.cpp index f13a8c6..13f8d1e 100644 --- a/DL2GameOverhaulScript/source/game/GamePH/LevelDI.cpp +++ b/DL2GameOverhaulScript/source/game/GamePH/LevelDI.cpp @@ -16,17 +16,19 @@ namespace GamePH { } } bool LevelDI::IsLoaded() { - static float loadDeltaTime = 0.0f; + static Utils::Time::Timer loadTimer{ 7500 }; + static bool isStillLoading = false; + if (IsLoading() || !GamePH::PlayerObjProperties::Get()) { - loadDeltaTime = 0.0f; + isStillLoading = true; return false; } + if (isStillLoading) { + isStillLoading = false; + loadTimer = Utils::Time::Timer(7500); + } - loadDeltaTime += GetTimeDelta(); - if (loadDeltaTime > 3.0f) - return true; - - return false; + return loadTimer.DidTimePass(); } LPVOID LevelDI::GetViewCamera() { __try { @@ -59,6 +61,17 @@ namespace GamePH { return; } } + bool LevelDI::IsTimerFrozen() { + __try { + bool(*pIsTimerFrozen)(LPVOID iLevel) = (decltype(pIsTimerFrozen))Utils::Memory::GetProcAddr("engine_x64_rwdi.dll", "?IsTimerFrozen@ILevel@@QEBA_NXZ"); + if (!pIsTimerFrozen) + return false; + + return pIsTimerFrozen(this); + } __except (EXCEPTION_EXECUTE_HANDLER) { + return false; + } + } float LevelDI::TimerGetSpeedUp() { __try { float(*pTimerGetSpeedUp)(LPVOID iLevel) = (decltype(pTimerGetSpeedUp))Utils::Memory::GetProcAddr("engine_x64_rwdi.dll", "?TimerGetSpeedUp@ILevel@@QEBAMXZ"); diff --git a/DL2GameOverhaulScript/source/game/GamePH/LevelDI.h b/DL2GameOverhaulScript/source/game/GamePH/LevelDI.h index a18042a..e1123f9 100644 --- a/DL2GameOverhaulScript/source/game/GamePH/LevelDI.h +++ b/DL2GameOverhaulScript/source/game/GamePH/LevelDI.h @@ -15,6 +15,7 @@ namespace GamePH { void SetViewCamera(LPVOID viewCam); float GetTimePlayed(); void ShowUIManager(bool enabled); + bool IsTimerFrozen(); float TimerGetSpeedUp(); void TimerSetSpeedUp(float timeScale); TimeWeather::CSystem* GetTimeWeatherSystem(); diff --git a/DL2GameOverhaulScript/source/game/GamePH/game_hooks.cpp b/DL2GameOverhaulScript/source/game/GamePH/game_hooks.cpp index 7c26cc2..96b8b0e 100644 --- a/DL2GameOverhaulScript/source/game/GamePH/game_hooks.cpp +++ b/DL2GameOverhaulScript/source/game/GamePH/game_hooks.cpp @@ -89,6 +89,9 @@ namespace GamePH { if (!Menu::Camera::freeCam.GetValue()) return TogglePhotoModeHook.pOriginal(guiPhotoModeData, enabled); + LevelDI* iLevel = LevelDI::Get(); + if (!iLevel || iLevel->IsTimerFrozen()) + return TogglePhotoModeHook.pOriginal(guiPhotoModeData, enabled); GameDI_PH* pGameDI_PH = GameDI_PH::Get(); if (!pGameDI_PH) return TogglePhotoModeHook.pOriginal(guiPhotoModeData, enabled); @@ -107,23 +110,27 @@ namespace GamePH { #pragma region ShowTPPModelFunc3 Option wannaUseTPPModel{}; + static bool prevUseTPPModel; static void detourShowTPPModelFunc3(DWORD64 tppFunc2Addr, bool showTPPModel); static Utils::Hook::MHook ShowTPPModelFunc3Hook{ "ShowTPPModelFunc3", &Offsets::Get_ShowTPPModelFunc3, &detourShowTPPModelFunc3 }; static void detourShowTPPModelFunc3(DWORD64 tppFunc2Addr, bool showTPPModel) { - wannaUseTPPModel.Set(showTPPModel); - gen_TPPModel* pgen_TPPModel = gen_TPPModel::Get(); if (!pgen_TPPModel) { ShowTPPModelFunc3Hook.pOriginal(tppFunc2Addr, showTPPModel); return; } - if (wannaUseTPPModel.HasChangedTo(false)) { - wannaUseTPPModel.SetPrevValue(false); + + if (!showTPPModel && prevUseTPPModel) { pgen_TPPModel->enableTPPModel2 = true; pgen_TPPModel->enableTPPModel1 = true; } ShowTPPModelFunc3Hook.pOriginal(tppFunc2Addr, showTPPModel); + if (showTPPModel && prevUseTPPModel) { + pgen_TPPModel->enableTPPModel2 = false; + pgen_TPPModel->enableTPPModel1 = false; + } else + prevUseTPPModel = showTPPModel; } #pragma endregion diff --git a/DL2GameOverhaulScript/source/game/GamePH/game_hooks.h b/DL2GameOverhaulScript/source/game/GamePH/game_hooks.h deleted file mode 100644 index bdf6126..0000000 --- a/DL2GameOverhaulScript/source/game/GamePH/game_hooks.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#include "..\core.h" - -namespace GamePH { - namespace Hooks { - extern Option wannaUseTPPModel; - } -} \ No newline at end of file diff --git a/DL2GameOverhaulScript/source/menu/camera.cpp b/DL2GameOverhaulScript/source/menu/camera.cpp index 2aff92c..670452f 100644 --- a/DL2GameOverhaulScript/source/menu/camera.cpp +++ b/DL2GameOverhaulScript/source/menu/camera.cpp @@ -1,10 +1,13 @@ #include #include "..\core.h" #include "..\game\Engine\CVideoSettings.h" +#include "..\game\Engine\engine_hooks.h" #include "..\game\GamePH\FreeCamera.h" #include "..\game\GamePH\GameDI_PH.h" #include "..\game\GamePH\LevelDI.h" +#include "..\game\GamePH\Other.h" #include "..\game\GamePH\PlayerVariables.h" +#include "..\game\GamePH\gen_TPPModel.h" #include "..\offsets.h" #include "camera.h" #include "menu.h" @@ -57,7 +60,7 @@ namespace Menu { if (!pFreeCam) return; - if (freeCam.GetValue()) { + if (freeCam.GetValue() && !iLevel->IsTimerFrozen()) { if (viewCam == pFreeCam) { pFreeCam->enableSpeedMultiplier1 = true; @@ -81,6 +84,8 @@ namespace Menu { else if (ImGui::IsKeyDown(ImGuiKey_LeftAlt)) pFreeCam->speedMultiplier /= 2.0f; + pFreeCam->GetPosition(&Engine::Hooks::freeCamPosBeforeGamePause); + return; } @@ -89,6 +94,8 @@ namespace Menu { freeCam.SetPrevValue(true); } else { + Engine::Hooks::switchedFreeCamByGamePause = freeCam.GetValue() && iLevel->IsTimerFrozen(); + if (freeCam.GetPrevValue()) { pFreeCam->enableSpeedMultiplier1 = false; pFreeCam->speedMultiplier = 0.1f; @@ -102,6 +109,23 @@ namespace Menu { freeCam.SetPrevValue(false); } } + static void UpdateTPPModel() { + GamePH::LevelDI* iLevel = GamePH::LevelDI::Get(); + if (!iLevel || !iLevel->IsLoaded()) + return; + + GamePH::gen_TPPModel* pgen_TPPModel = GamePH::gen_TPPModel::Get(); + if (pgen_TPPModel) { + if (Menu::Camera::photoMode.GetValue() || (Menu::Camera::freeCam.GetValue() && !iLevel->IsTimerFrozen())) + GamePH::ShowTPPModel(true); + else if (Menu::Camera::freeCam.GetValue() && iLevel->IsTimerFrozen() && !photoMode.GetValue()) + GamePH::ShowTPPModel(false); + else if (Menu::Camera::thirdPersonCamera.GetValue() && Menu::Camera::tpUseTPPModel.GetValue()) + GamePH::ShowTPPModel(true); + else if (!photoMode.GetValue()) + GamePH::ShowTPPModel(false); + } + } static void UpdatePlayerVars() { if (!GamePH::PlayerVariables::gotPlayerVars) return; @@ -120,6 +144,7 @@ namespace Menu { void Tab::Update() { UpdateFOV(); FreeCamUpdate(); + UpdateTPPModel(); UpdatePlayerVars(); UpdateDisabledOptions(); } diff --git a/DL2GameOverhaulScript/source/menu/player.cpp b/DL2GameOverhaulScript/source/menu/player.cpp index 2249531..fe051c2 100644 --- a/DL2GameOverhaulScript/source/menu/player.cpp +++ b/DL2GameOverhaulScript/source/menu/player.cpp @@ -6050,15 +6050,18 @@ namespace Menu { Engine::CBulletPhysicsCharacter* playerCharacter = Engine::CBulletPhysicsCharacter::Get(); if (!playerCharacter) return; + GamePH::LevelDI* iLevel = GamePH::LevelDI::Get(); + if (!iLevel) + return; - if (freezePlayer.GetValue() || (Camera::freeCam.GetValue() && !Camera::teleportPlayerToCamera.GetValue())) { + if ((freezePlayer.GetValue() || (Camera::freeCam.GetValue() && !Camera::teleportPlayerToCamera.GetValue())) && !iLevel->IsTimerFrozen()) { playerCharacter->FreezeCharacter(); return; } Engine::CBulletPhysicsCharacter::posBeforeFreeze = playerCharacter->playerPos; - if (!Camera::freeCam.GetValue() || !Camera::teleportPlayerToCamera.GetValue()) + if (iLevel->IsTimerFrozen() || !Camera::freeCam.GetValue() || !Camera::teleportPlayerToCamera.GetValue()) return; GamePH::FreeCamera* freeCam = GamePH::FreeCamera::Get(); diff --git a/DL2GameOverhaulScript/source/menu/world.cpp b/DL2GameOverhaulScript/source/menu/world.cpp index 6c3b89f..e319d78 100644 --- a/DL2GameOverhaulScript/source/menu/world.cpp +++ b/DL2GameOverhaulScript/source/menu/world.cpp @@ -75,7 +75,7 @@ namespace Menu { if (!menuToggle.GetValue()) { time = dayNightCycle->time1 * 24.0f; - if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze, 0.005f)) + if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze)) dayNightCycle->SetDaytime(timeBeforeFreeze); if (!slowMotion.GetValue() && !slowMotion.HasChanged()) @@ -99,7 +99,7 @@ namespace Menu { dayNightCycle->SetDaytime(time); } time = dayNightCycle->time1 * 24.0f; - if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze, 0.005f)) + if (freezeTime.GetValue() && !Utils::Values::are_samef(time, timeBeforeFreeze)) dayNightCycle->SetDaytime(timeBeforeFreeze); }