- Fixed having FreeCam enabled while in the Map view would cause a weird offset of the entire Map view

- Refactored the TPP model code
This commit is contained in:
EricPlayZ
2024-02-11 23:58:08 +02:00
parent 9c705ef652
commit 9459ddd9c7
11 changed files with 86 additions and 86 deletions
@@ -117,13 +117,13 @@
<ClInclude Include="source\game\Engine\CLobbySteam.h" />
<ClInclude Include="source\game\Engine\CoPhysicsProperty.h" />
<ClInclude Include="source\game\Engine\CVideoSettings.h" />
<ClInclude Include="source\game\Engine\engine_hooks.h" />
<ClInclude Include="source\game\GamePH\CoBaseCameraProxy.h" />
<ClInclude Include="source\game\GamePH\DayNightCycle.h" />
<ClInclude Include="source\game\GamePH\FreeCamera.h" />
<ClInclude Include="source\game\GamePH\GameDI_PH.h" />
<ClInclude Include="source\game\GamePH\GameDI_PH2.h" />
<ClInclude Include="source\game\GamePH\gen_TPPModel.h" />
<ClInclude Include="source\game\GamePH\game_hooks.h" />
<ClInclude Include="source\game\GamePH\LevelDI.h" />
<ClInclude Include="source\game\GamePH\LocalClientDI.h" />
<ClInclude Include="source\game\GamePH\LogicalPlayer.h" />
@@ -334,9 +334,6 @@
<ClInclude Include="source\game\GamePH\gen_TPPModel.h">
<Filter>game\GamePH</Filter>
</ClInclude>
<ClInclude Include="source\game\GamePH\game_hooks.h">
<Filter>game\GamePH</Filter>
</ClInclude>
<ClInclude Include="source\game\GamePH\LevelDI.h">
<Filter>game\GamePH</Filter>
</ClInclude>
@@ -377,6 +374,9 @@
<Filter>game\GamePH\TimeWeather</Filter>
</ClInclude>
<ClInclude Include="pch\pch.h" />
<ClInclude Include="source\game\Engine\engine_hooks.h">
<Filter>game\Engine</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="MinHook">
@@ -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<LPVOID, void(*)(LPVOID, float*, float*, Vector3*)> 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);
@@ -0,0 +1,9 @@
#pragma once
#include "..\Vector3.h"
namespace Engine {
namespace Hooks {
extern bool switchedFreeCamByGamePause;
extern Vector3 freeCamPosBeforeGamePause;
}
}
@@ -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");
@@ -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();
@@ -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<LPVOID, void(*)(DWORD64, bool)> 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
@@ -1,8 +0,0 @@
#pragma once
#include "..\core.h"
namespace GamePH {
namespace Hooks {
extern Option wannaUseTPPModel;
}
}
+26 -1
View File
@@ -1,10 +1,13 @@
#include <pch.h>
#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();
}
+5 -2
View File
@@ -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();
+2 -2
View File
@@ -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);
}