Added Teleport Player to Camera for FreeCam, added Freeze Player (automatically activated with FreeCam if Teleport Player to Camera is disabled), added Time and Weather control (the transitions with Time are extremely slow, so you'll only notice gameplay changes for the first few seconds until the lighting starts to change; Weather transitions are also slow, but way more consistent), fixed FreeCam option desync in-game if the option was enabled before player was alive, fixed game resetting player variables when doing certain actions, organized and cleaned the code a lil' bit more

This commit is contained in:
EricPlayZ
2023-08-02 00:54:12 +03:00
parent 6f3e5e807c
commit 41503ab8be
18 changed files with 618 additions and 196 deletions

View File

@ -31,6 +31,7 @@
<ClCompile Include="source\menu\camera.cpp" />
<ClCompile Include="source\menu\menu.cpp" />
<ClCompile Include="source\menu\player.cpp" />
<ClCompile Include="source\menu\world.cpp" />
<ClCompile Include="source\print.cpp" />
<ClCompile Include="source\sigscan\sigscan.cpp" />
<ClCompile Include="source\utils.cpp" />
@ -57,6 +58,7 @@
<ClInclude Include="source\menu\camera.h" />
<ClInclude Include="source\menu\menu.h" />
<ClInclude Include="source\menu\player.h" />
<ClInclude Include="source\menu\world.h" />
<ClInclude Include="source\MinHook\include\MinHook.h" />
<ClInclude Include="source\print.h" />
<ClInclude Include="source\sigscan\offsets.h" />

View File

@ -52,6 +52,7 @@
<Filter>sigscan</Filter>
</ClCompile>
<ClCompile Include="source\menu\player.cpp" />
<ClCompile Include="source\menu\world.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="source\memory.h" />
@ -116,6 +117,7 @@
</ClInclude>
<ClInclude Include="source\core.h" />
<ClInclude Include="source\menu\player.h" />
<ClInclude Include="source\menu\world.h" />
</ItemGroup>
<ItemGroup>
<Filter Include="MinHook">

View File

@ -7,6 +7,7 @@
#include "ImGui\impl\d3d11_impl.h"
#include "MinHook\include\MinHook.h"
#include "menu\menu.h"
#include "menu\player.h"
#include "menu\camera.h"
#include "game_classes.h"
#include "sigscan\offsets.h"
@ -57,7 +58,7 @@ namespace Core {
static std::unique_ptr<Hook::BreakpointHook> ldrpRoutineBpHook = nullptr;
static void HookLdrpInitRoutine() {
const WindowsVersion winVer = Utils::GetWindowsVersion();
DWORD64 pLdrpRoutineFunc = NULL;
PDWORD64 pLdrpRoutineFunc = nullptr;
if (winVer != WindowsVersion::Windows7)
pLdrpRoutineFunc = Offsets::Get_LdrpCallInitRoutineOffset();
@ -77,27 +78,25 @@ namespace Core {
});
}
static void OnUpdateFreeCam() {
}
void OnPostUpdate() {
if (!GamePH::PlayerVariables::gotPlayerVars)
GamePH::PlayerVariables::GetPlayerVars();
Engine::CVideoSettings* videoSettings = Engine::CVideoSettings::Get();
if (!Menu::isOpen && videoSettings)
Menu::Camera::FOV = static_cast<int>(videoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
Menu::Player::Update();
Menu::Camera::Update();
//if (GamePH::GameDI_PH::Get()) {
// INT64 gameVer = GamePH::GameDI_PH::Get()->GetCurrentGameVersion();
// std::cout << "Game Version:" << gameVer << std::endl;
//}
//if (GamePH::LevelDI::Get()) {
// float timePlayed = GamePH::LevelDI::Get()->GetTimePlayed();
// std::cout << "Time Played: " << timePlayed << std::endl;
//}
Engine::CBulletPhysicsCharacter* playerCharacter = Engine::CBulletPhysicsCharacter::Get();
if (playerCharacter) {
Vector3 pos{ 600.0f, 40.0f, -600.0f };
float* result = playerCharacter->MoveCharacter(&pos);
}
// INT64 gameVer = GamePH::GameDI_PH::Get()->GetCurrentGameVersion();
// std::cout << "Game Version:" << gameVer << std::endl;
//}
//if (GamePH::LevelDI::Get()) {
// float timePlayed = GamePH::LevelDI::Get()->GetTimePlayed();
// std::cout << "Time Played: " << timePlayed << std::endl;
//}
}
DWORD64 WINAPI MainThread(HMODULE hModule) {
@ -110,8 +109,10 @@ namespace Core {
// Hook renderer for ImGui
std::thread(HookRendererThread).detach();
GamePH::LoopHookCreatePlayerHealthModule();
GamePH::LoopHookOnUpdate();
GamePH::LoopHookCalculateFreeCamCollision();
GamePH::LoopHookLifeSetHealth();
const HANDLE proc = GetCurrentProcess();
WaitForSingleObject(proc, INFINITE);

View File

@ -12,22 +12,25 @@ struct SMART_BOOL {
value = false;
}
void Change(bool newValue) {
bool Change(bool newValue) {
if (changed && newValue == value)
return;
return false;
if (!changed)
previousValue = value;
changed = true;
previousValue = value;
value = newValue;
return true;
}
void Restore() {
bool Restore() {
if (!changed)
return;
return false;
changed = false;
value = previousValue;
return true;
}
private:

View File

@ -1,7 +1,9 @@
#include <iostream>
#include <string_view>
#include <thread>
#include "MinHook\include\MinHook.h"
#include "sigscan\offsets.h"
#include "menu\player.h"
#include "menu\camera.h"
#include "game_classes.h"
#include "memory.h"
@ -10,9 +12,32 @@ namespace Core {
extern void OnPostUpdate();
}
#pragma region GamePH
namespace GamePH {
#pragma region Misc
void(*oOnPostUpdate)(LPVOID pGameDI_PH2) = nullptr;
#pragma region Hooks
#pragma region CreatePlayerHealthModule
static DWORD64(*pCreatePlayerHealthModule)(DWORD64 playerHealthModule) = nullptr;
static DWORD64(*oCreatePlayerHealthModule)(DWORD64 playerHealthModule) = nullptr;
DWORD64 detourCreatePlayerHealthModule(DWORD64 playerHealthModule) {
PlayerHealthModule::pPlayerHealthModule = reinterpret_cast<PlayerHealthModule*>(playerHealthModule);
return oCreatePlayerHealthModule(playerHealthModule);
}
void LoopHookCreatePlayerHealthModule() {
while (true) {
Sleep(250);
if (!pCreatePlayerHealthModule)
pCreatePlayerHealthModule = (decltype(pCreatePlayerHealthModule))Offsets::Get_CreatePlayerHealthModuleOffset();
else if (!oCreatePlayerHealthModule && MH_CreateHook(pCreatePlayerHealthModule, &detourCreatePlayerHealthModule, reinterpret_cast<LPVOID*>(&oCreatePlayerHealthModule)) == MH_OK) {
MH_EnableHook(pCreatePlayerHealthModule);
break;
}
}
}
#pragma endregion
#pragma region OnPostUpdate
static void(*oOnPostUpdate)(LPVOID pGameDI_PH2) = nullptr;
void detourOnPostUpdate(LPVOID pGameDI_PH2) {
oOnPostUpdate(pGameDI_PH2);
Core::OnPostUpdate();
@ -32,9 +57,11 @@ namespace GamePH {
break;
}
}
#pragma endregion
DWORD64(*pCalculateFreeCamCollision)(LPVOID pFreeCamera, float* finalPos) = nullptr;
DWORD64(*oCalculateFreeCamCollision)(LPVOID pFreeCamera, float* finalPos) = nullptr;
#pragma region CalculateFreeCamCollision
static DWORD64(*pCalculateFreeCamCollision)(LPVOID pFreeCamera, float* finalPos) = nullptr;
static DWORD64(*oCalculateFreeCamCollision)(LPVOID pFreeCamera, float* finalPos) = nullptr;
DWORD64 detourCalculateFreeCamCollision(LPVOID pFreeCamera, float* finalPos) {
if (!Menu::Camera::freeCamEnabled && !Menu::Camera::disablePhotoModeLimitsEnabled.value)
return oCalculateFreeCamCollision(pFreeCamera, finalPos);
@ -45,21 +72,48 @@ namespace GamePH {
while (true) {
Sleep(250);
if (!GamePH::pCalculateFreeCamCollision)
GamePH::pCalculateFreeCamCollision = (decltype(GamePH::pCalculateFreeCamCollision))Offsets::Get_CalculateFreeCamCollisionOffset();
else if (!GamePH::oCalculateFreeCamCollision && MH_CreateHook(GamePH::pCalculateFreeCamCollision, &GamePH::detourCalculateFreeCamCollision, reinterpret_cast<LPVOID*>(&GamePH::oCalculateFreeCamCollision)) == MH_OK) {
MH_EnableHook(GamePH::pCalculateFreeCamCollision);
if (!pCalculateFreeCamCollision)
pCalculateFreeCamCollision = (decltype(pCalculateFreeCamCollision))Offsets::Get_CalculateFreeCamCollisionOffset();
else if (!oCalculateFreeCamCollision && MH_CreateHook(pCalculateFreeCamCollision, &detourCalculateFreeCamCollision, reinterpret_cast<LPVOID*>(&oCalculateFreeCamCollision)) == MH_OK) {
MH_EnableHook(pCalculateFreeCamCollision);
break;
}
}
}
#pragma endregion
#pragma region PlayerVariables
DWORD64 PlayerVariables::FloatPlayerVariableVT;
DWORD64 PlayerVariables::BoolPlayerVariableVT;
#pragma region LifeSetHealth
static void(*pLifeSetHealth)(float* pLifeHealth, float health) = nullptr;
static void(*oLifeSetHealth)(float* pLifeHealth, float health) = nullptr;
void detourLifeSetHealth(float* pLifeHealth, float health) {
if (Menu::Player::godModeEnabled.value) {
GamePH::PlayerHealthModule* playerHealthModule = GamePH::PlayerHealthModule::Get();
if (playerHealthModule && (pLifeHealth + 1) == &playerHealthModule->health && playerHealthModule->health != 0)
return;
}
oLifeSetHealth(pLifeHealth, health);
}
void LoopHookLifeSetHealth() {
while (true) {
Sleep(250);
std::vector <std::pair<std::string_view, std::pair<DWORD64, std::string_view>>> PlayerVariables::unorderedPlayerVars;
if (!pLifeSetHealth)
pLifeSetHealth = (decltype(pLifeSetHealth))Offsets::Get_LifeSetHealth();
else if (!oLifeSetHealth && MH_CreateHook(pLifeSetHealth, &detourLifeSetHealth, reinterpret_cast<LPVOID*>(&oLifeSetHealth)) == MH_OK) {
MH_EnableHook(pLifeSetHealth);
break;
}
}
}
#pragma endregion
#pragma endregion
#pragma region PlayerVariables
PDWORD64 PlayerVariables::FloatPlayerVariableVT;
PDWORD64 PlayerVariables::BoolPlayerVariableVT;
std::vector <std::pair<std::string_view, std::pair<LPVOID, std::string_view>>> PlayerVariables::unorderedPlayerVars;
std::vector <std::pair<std::string_view, std::pair<LPVOID, std::string_view>>> PlayerVariables::unorderedPlayerVarsDefault;
bool PlayerVariables::gotPlayerVars = false;
std::unique_ptr<Hook::BreakpointHook> PlayerVariables::loadPlayerFloatVarBpHook = nullptr;
@ -69,50 +123,50 @@ namespace GamePH {
void PlayerVariables::RunHooks() {
if (hooked)
return;
if (Offsets::Get_LoadPlayerFloatVariableOffset() == NULL)
if (!Offsets::Get_LoadPlayerFloatVariableOffset())
return;
if (Offsets::Get_LoadPlayerBoolVariableOffset() == NULL)
if (!Offsets::Get_LoadPlayerBoolVariableOffset())
return;
loadPlayerFloatVarBpHook = std::make_unique<Hook::BreakpointHook>(Offsets::Get_LoadPlayerFloatVariableOffset(), [&](PEXCEPTION_POINTERS info) -> void {
const char* tempName = reinterpret_cast<const char*>(info->ContextRecord->R8);
const std::string_view name = tempName;
PlayerVariables::unorderedPlayerVars.emplace_back(name, std::make_pair(0x0, "float"));
PlayerVariables::unorderedPlayerVars.emplace_back(name, std::make_pair(nullptr, "float"));
PlayerVariables::unorderedPlayerVarsDefault.emplace_back(name, std::make_pair(nullptr, "float"));
});
loadPlayerBoolVarBpHook = std::make_unique<Hook::BreakpointHook>(Offsets::Get_LoadPlayerBoolVariableOffset(), [&](PEXCEPTION_POINTERS info) -> void {
const char* tempName = reinterpret_cast<const char*>(info->ContextRecord->R8);
const std::string_view name = tempName;
PlayerVariables::unorderedPlayerVars.emplace_back(name, std::make_pair(0x0, "bool"));
PlayerVariables::unorderedPlayerVars.emplace_back(name, std::make_pair(nullptr, "bool"));
PlayerVariables::unorderedPlayerVarsDefault.emplace_back(name, std::make_pair(nullptr, "bool"));
});
hooked = true;
}
DWORD64 PlayerVariables::GetFloatPlayerVariableVT() {
if (FloatPlayerVariableVT != NULL)
PDWORD64 PlayerVariables::GetFloatPlayerVariableVT() {
if (FloatPlayerVariableVT)
return FloatPlayerVariableVT;
if (Offsets::Get_InitializePlayerVariablesOffset() == NULL)
return NULL;
if (!Offsets::Get_InitializePlayerVariablesOffset())
return nullptr;
const DWORD64 pInitializePlayerVariables = Offsets::Get_InitializePlayerVariablesOffset();
const DWORD64 offsetToInstr = pInitializePlayerVariables + Offsets::Get_initPlayerFloatVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariablesOffset() + Offsets::Get_initPlayerFloatVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD floatPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return FloatPlayerVariableVT = offsetToInstr + sizeof(DWORD) + floatPlayerVariableVTOffset;
return FloatPlayerVariableVT = reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + floatPlayerVariableVTOffset);
}
DWORD64 PlayerVariables::GetBoolPlayerVariableVT() {
if (BoolPlayerVariableVT != NULL)
PDWORD64 PlayerVariables::GetBoolPlayerVariableVT() {
if (BoolPlayerVariableVT)
return BoolPlayerVariableVT;
if (Offsets::Get_InitializePlayerVariablesOffset() == NULL)
return NULL;
if (!Offsets::Get_InitializePlayerVariablesOffset())
return nullptr;
const DWORD64 pInitializePlayerVariables = Offsets::Get_InitializePlayerVariablesOffset();
const DWORD64 offsetToInstr = pInitializePlayerVariables + Offsets::Get_initPlayerBoolVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariablesOffset() + Offsets::Get_initPlayerBoolVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD boolPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return BoolPlayerVariableVT = offsetToInstr + sizeof(DWORD) + boolPlayerVariableVTOffset;
return BoolPlayerVariableVT = reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + boolPlayerVariableVTOffset);
}
void PlayerVariables::GetPlayerVars() {
if (gotPlayerVars)
@ -126,23 +180,18 @@ namespace GamePH {
if (!GetBoolPlayerVariableVT())
return;
DWORD64** playerVars = reinterpret_cast<DWORD64**>(Get());
PDWORD64* playerVars = reinterpret_cast<PDWORD64*>(Get());
bool isFloatPlayerVar = false;
bool isBoolPlayerVar = false;
for (auto it = unorderedPlayerVars.begin(); it != unorderedPlayerVars.end(); ++it) {
while (true) {
DWORD64 variableAddr = NULL;
isFloatPlayerVar = *playerVars == GetFloatPlayerVariableVT();
isBoolPlayerVar = *playerVars == GetBoolPlayerVariableVT();
if (reinterpret_cast<DWORD64>(*playerVars) == GetFloatPlayerVariableVT()) {
variableAddr = reinterpret_cast<DWORD64>(playerVars + 1);
it->second.first = variableAddr;
playerVars += 3;
break;
} else if (reinterpret_cast<DWORD64>(*playerVars) == GetBoolPlayerVariableVT()) {
variableAddr = reinterpret_cast<DWORD64>(playerVars + 1);
it->second.first = variableAddr;
playerVars += 2;
if (isFloatPlayerVar || isBoolPlayerVar) {
it->second.first = playerVars + 1;
playerVars += isFloatPlayerVar ? 3 : 2;
break;
} else
playerVars += 1;
@ -174,7 +223,7 @@ namespace GamePH {
#pragma region PlayerState
PlayerState* PlayerState::Get() {
__try {
if (Offsets::Get_PlayerStateOffset() == NULL)
if (!Offsets::Get_PlayerStateOffset())
return nullptr;
PlayerState* ptr = *reinterpret_cast<PlayerState**>(Offsets::Get_PlayerStateOffset());
@ -188,18 +237,21 @@ namespace GamePH {
}
#pragma endregion
#pragma region FreeCamera
void FreeCamera::AllowCameraMovement(int mode) {
Memory::CallVT<203>(this, mode);
#pragma region PlayerHealthModule
PlayerHealthModule* PlayerHealthModule::pPlayerHealthModule = nullptr;
PlayerHealthModule* PlayerHealthModule::Get() {
return pPlayerHealthModule;
}
#pragma endregion
FreeCamera* FreeCamera::Get() {
#pragma region CameraFPPDI
CameraFPPDI* CameraFPPDI::Get() {
__try {
Engine::CBaseCamera* pCBaseCamera = Engine::CBaseCamera::Get();
if (!pCBaseCamera)
PDWORD64 pg_CameraFPPDI = Offsets::Get_g_CameraFPPDI();
if (!pg_CameraFPPDI)
return nullptr;
FreeCamera* ptr = pCBaseCamera->pFreeCamera;
CameraFPPDI* ptr = reinterpret_cast<CameraFPPDI*>(*pg_CameraFPPDI);
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
@ -210,10 +262,126 @@ namespace GamePH {
}
#pragma endregion
#pragma region FreeCamera
Vector3* FreeCamera::GetPosition(Vector3* posIN) {
return Memory::CallVT<198, Vector3*>(this, posIN);
}
void FreeCamera::AllowCameraMovement(int mode) {
Memory::CallVT<203>(this, mode);
}
FreeCamera* FreeCamera::Get() {
__try {
PDWORD64 pg_FreeCamera = Offsets::Get_g_FreeCamera();
if (!pg_FreeCamera)
return nullptr;
FreeCamera* ptr = reinterpret_cast<FreeCamera*>(*pg_FreeCamera);
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region DayNightCycle
void DayNightCycle::SetDaytime(float time) {
time /= 24;
time1 = time;
time2 = time;
time3 = time;
}
DayNightCycle* DayNightCycle::Get() {
__try {
if (!Offsets::Get_g_DayNightCycle())
return nullptr;
DayNightCycle* ptr = *reinterpret_cast<DayNightCycle**>(Offsets::Get_g_DayNightCycle());
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region TimeWeather
namespace TimeWeather {
#pragma region CSystem
void CSystem::SetForcedWeather(int weather) {
if (!Offsets::Get_SetForcedWeatherOffset())
return;
void(*pSetForcedWeather)(LPVOID timeWeatherSystem, int weather) = (decltype(pSetForcedWeather))Offsets::Get_SetForcedWeatherOffset();
if (!pSetForcedWeather)
return;
pSetForcedWeather(this, weather);
}
int CSystem::GetCurrentWeather() {
if (!Offsets::Get_GetCurrentWeatherOffset())
return EWeather::TYPE::Default;
int(*pGetCurrentWeather)(LPVOID timeWeatherSystem) = (decltype(pGetCurrentWeather))Offsets::Get_GetCurrentWeatherOffset();
if (!pGetCurrentWeather)
return EWeather::TYPE::Default;
return pGetCurrentWeather(this);
}
CSystem* CSystem::Get() {
__try {
LevelDI* pLevelDI = LevelDI::Get();
if (!pLevelDI)
return nullptr;
CSystem* ptr = pLevelDI->GetTimeWeatherSystem();
if (!Memory::IsValidPtr(ptr))
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
}
#pragma endregion
#pragma region LevelDI
float LevelDI::GetTimePlayed() {
return Memory::CallVT<334, float>(this);
}
LPVOID LevelDI::GetViewCamera() {
if (!Offsets::Get_GetViewCameraOffset())
return nullptr;
LPVOID(*pGetViewCamera)(LPVOID iLevel) = (decltype(pGetViewCamera))Offsets::Get_GetViewCameraOffset();
if (!pGetViewCamera)
return nullptr;
return pGetViewCamera(this);
}
TimeWeather::CSystem* LevelDI::GetTimeWeatherSystem() {
__try {
if (!Offsets::Get_GetTimeWeatherSystemOffset())
return nullptr;
TimeWeather::CSystem*(*pGetTimeWeatherSystem)(LevelDI* iLevel) = (decltype(pGetTimeWeatherSystem))Offsets::Get_GetTimeWeatherSystemOffset();
if (!pGetTimeWeatherSystem)
return nullptr;
return pGetTimeWeatherSystem(this);
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
LevelDI* LevelDI::Get() {
__try {
@ -251,8 +419,8 @@ namespace GamePH {
#pragma endregion
#pragma region GameDI_PH
DWORD64* GameDI_PH::GetLocalPlayerEntity() {
return Memory::CallVT<135, DWORD64*>(this);
PDWORD64 GameDI_PH::GetLocalPlayerEntity() {
return Memory::CallVT<135, PDWORD64>(this);
}
INT64 GameDI_PH::GetCurrentGameVersion() {
return Memory::CallVT<218, INT64>(this);
@ -281,7 +449,7 @@ namespace GamePH {
#pragma region PlayerObjProperties
PlayerObjProperties* PlayerObjProperties::Get() {
__try {
if (Offsets::Get_g_PlayerObjProperties() == NULL)
if (!Offsets::Get_g_PlayerObjProperties())
return nullptr;
PlayerObjProperties* ptr = *reinterpret_cast<PlayerObjProperties**>(Offsets::Get_g_PlayerObjProperties());
@ -295,7 +463,9 @@ namespace GamePH {
}
#pragma endregion
}
#pragma endregion
#pragma region Engine
namespace Engine {
#pragma region CVideoSettings
CVideoSettings* CVideoSettings::Get() {
@ -315,24 +485,6 @@ namespace Engine {
}
#pragma endregion
#pragma region CBaseCamera
CBaseCamera* CBaseCamera::Get() {
__try {
CLevel* pCLevel = CLevel::Get();
if (!pCLevel)
return nullptr;
CBaseCamera* ptr = pCLevel->pCBaseCamera;
if (!Memory::IsValidPtrMod(ptr, "engine_x64_rwdi.dll"))
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region CLevel
CLevel* CLevel::Get() {
__try {
@ -372,7 +524,7 @@ namespace Engine {
#pragma region CLobbySteam
CLobbySteam* CLobbySteam::Get() {
__try {
if (Offsets::Get_CLobbySteamOffset() == NULL)
if (!Offsets::Get_CLobbySteamOffset())
return nullptr;
CLobbySteam* ptr = *reinterpret_cast<CLobbySteam**>(Offsets::Get_CLobbySteamOffset());
@ -387,12 +539,15 @@ namespace Engine {
#pragma endregion
#pragma region CBulletPhysicsCharacter
float* CBulletPhysicsCharacter::MoveCharacter(Vector3* pos) {
float*(*MoveCharacter)(LPVOID, float*) = (decltype(MoveCharacter))Offsets::Get_MoveCharacterOffset();
if (!MoveCharacter)
return nullptr;
Vector3 CBulletPhysicsCharacter::posBeforeFreeze{};
return MoveCharacter(this, reinterpret_cast<float*>(pos));
void CBulletPhysicsCharacter::FreezeCharacter() {
MoveCharacter(posBeforeFreeze);
}
void CBulletPhysicsCharacter::MoveCharacter(const Vector3& pos) {
playerDownwardVelocity = 0.0f;
playerPos = pos;
playerPos2 = pos;
}
CBulletPhysicsCharacter* CBulletPhysicsCharacter::Get() {
@ -429,4 +584,5 @@ namespace Engine {
}
}
#pragma endregion
}
}
#pragma endregion

View File

@ -17,7 +17,28 @@ struct Vector3 {
float X;
float Y;
float Z;
Vector3() {
X = 0.0f;
Y = 0.0f;
Z = 0.0f;
}
bool isDefault() {
return X == 0.0f && Y == 0.0f && Z == 0.0f;
}
};
namespace EWeather {
enum TYPE {
Default = 0,
Foggy = 1,
Clear = 2,
Overcast = 3,
Cloudy = 4,
Rainy = 5,
Stormy = 6
};
}
// Forward decl
namespace Engine {
@ -25,15 +46,18 @@ namespace Engine {
}
namespace GamePH {
extern void LoopHookCreatePlayerHealthModule();
extern void LoopHookOnUpdate();
extern void LoopHookCalculateFreeCamCollision();
extern void LoopHookLifeSetHealth();
class PlayerVariables {
private:
static DWORD64 FloatPlayerVariableVT;
static DWORD64 BoolPlayerVariableVT;
static PDWORD64 FloatPlayerVariableVT;
static PDWORD64 BoolPlayerVariableVT;
public:
static std::vector<std::pair<std::string_view, std::pair<DWORD64, std::string_view>>> unorderedPlayerVars;
static std::vector<std::pair<std::string_view, std::pair<LPVOID, std::string_view>>> unorderedPlayerVars;
static std::vector<std::pair<std::string_view, std::pair<LPVOID, std::string_view>>> unorderedPlayerVarsDefault;
static bool gotPlayerVars;
static std::unique_ptr<Hook::BreakpointHook> loadPlayerFloatVarBpHook;
@ -42,8 +66,8 @@ namespace GamePH {
static bool hooked;
static void RunHooks();
static DWORD64 GetFloatPlayerVariableVT();
static DWORD64 GetBoolPlayerVariableVT();
static PDWORD64 GetFloatPlayerVariableVT();
static PDWORD64 GetBoolPlayerVariableVT();
static void GetPlayerVars();
static PlayerVariables* Get();
@ -58,16 +82,57 @@ namespace GamePH {
static PlayerState* Get();
};
class PlayerHealthModule {
public:
union {
DEFINE_MEMBER_N(float, health, 0x2C);
};
static PlayerHealthModule* pPlayerHealthModule;
static PlayerHealthModule* Get();
};
class CameraFPPDI {
public:
static CameraFPPDI* Get();
};
class FreeCamera {
public:
Vector3* GetPosition(Vector3* posIN);
void AllowCameraMovement(int mode = 2);
static FreeCamera* Get();
};
class DayNightCycle {
public:
union {
DEFINE_MEMBER_N(float, time1, 0x10);
DEFINE_MEMBER_N(float, time2, 0x20);
DEFINE_MEMBER_N(float, time3, 0x5C);
};
void SetDaytime(float time);
static DayNightCycle* Get();
};
namespace TimeWeather {
class CSystem {
public:
void SetForcedWeather(int weather);
int GetCurrentWeather();
static CSystem* Get();
};
}
class LevelDI {
public:
float GetTimePlayed();
LPVOID GetViewCamera();
TimeWeather::CSystem* GetTimeWeatherSystem();
static LevelDI* Get();
};
@ -79,7 +144,7 @@ namespace GamePH {
class GameDI_PH {
public:
DWORD64* GetLocalPlayerEntity();
PDWORD64 GetLocalPlayerEntity();
INT64 GetCurrentGameVersion();
void TogglePhotoMode(bool doNothing = false, bool setAsOptionalCamera = false);
@ -106,20 +171,10 @@ namespace Engine {
static CVideoSettings* Get();
};
class CBaseCamera {
public:
union {
DEFINE_MEMBER_N(GamePH::FreeCamera*, pFreeCamera, 0x20);
};
static CBaseCamera* Get();
};
class CLevel {
public:
union {
DEFINE_MEMBER_N(GamePH::LevelDI*, pLevelDI, 0x20);
DEFINE_MEMBER_N(CBaseCamera*, pCBaseCamera, 0x28);
};
static CLevel* Get();
@ -147,7 +202,16 @@ namespace Engine {
class CBulletPhysicsCharacter {
public:
float* MoveCharacter(Vector3* pos);
union {
DEFINE_MEMBER_N(Vector3, playerPos2, 0x87C);
DEFINE_MEMBER_N(Vector3, playerPos, 0x894);
DEFINE_MEMBER_N(float, playerDownwardVelocity, 0xC28);
};
static Vector3 posBeforeFreeze;
void FreezeCharacter();
void MoveCharacter(const Vector3& pos);
static CBulletPhysicsCharacter* Get();
};

View File

@ -5,30 +5,29 @@
namespace Hook {
// VTable hooking
static int VTHookUnprotect(LPVOID region) {
static int VTHookUnprotect(LPCVOID region) {
MEMORY_BASIC_INFORMATION mbi{};
VirtualQuery(static_cast<LPCVOID>(region), &mbi, sizeof(mbi));
VirtualQuery(region, &mbi, sizeof(mbi));
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &mbi.Protect);
return mbi.Protect;
}
static void VTHookProtect(LPVOID region, int protection) {
static void VTHookProtect(LPCVOID region, int protection) {
MEMORY_BASIC_INFORMATION mbi{};
VirtualQuery(static_cast<LPCVOID>(region), &mbi, sizeof(mbi));
VirtualQuery(region, &mbi, sizeof(mbi));
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, protection, &mbi.Protect);
}
void VTHook(LPVOID instance, LPVOID pDetour, LPVOID* ppOriginal, const DWORD offset) {
const DWORD64 vtable = *static_cast<DWORD64*>(instance);
DWORD64** entry = reinterpret_cast<DWORD64**>(vtable + offset);
PDWORD64* entry = reinterpret_cast<PDWORD64*>(*reinterpret_cast<DWORD64*>(instance) + offset);
*ppOriginal = *entry;
const int original_protection = VTHookUnprotect(entry);
*entry = static_cast<DWORD64*>(pDetour);
*entry = reinterpret_cast<PDWORD64>(pDetour);
VTHookProtect(entry, original_protection);
}
// Trampoline hooking
DETOUR_INFO MidFuncHook(DWORD64* pTarget, DWORD64* pHookedFunc, const size_t nops, const size_t bytesToSkip) {
DETOUR_INFO MidFuncHook(LPVOID pTarget, LPVOID pHookedFunc, const size_t nops, const size_t bytesToSkip) {
DWORD dwOldProtect, dwBkup{};
const size_t finalHookSize = 13 + nops;
@ -47,10 +46,9 @@ namespace Hook {
temp_target++;
// mov rax, hookedFuncAddr
const DWORD64 hookedFuncAddr = reinterpret_cast<DWORD64>(pHookedFunc);
*temp_target = 0x48;
*(temp_target + 1) = 0xB8;
*reinterpret_cast<DWORD64*>(temp_target + 2) = hookedFuncAddr + bytesToSkip;
*reinterpret_cast<PDWORD64>(temp_target + 2) = reinterpret_cast<DWORD64>(pHookedFunc) + bytesToSkip;
temp_target += 2 + sizeof(DWORD64);
// jmp rax
@ -66,7 +64,7 @@ namespace Hook {
}
}
detour.jmpBack = reinterpret_cast<DWORD64*>(temp_target);
detour.jmpBack = reinterpret_cast<PDWORD64>(temp_target);
temp_target = reinterpret_cast<BYTE*>(pTarget);
std::copy(temp_target, temp_target + finalHookSize, detour.patchedBytes.begin());
@ -79,7 +77,7 @@ namespace Hook {
static bool s_handlerCreated = false;
static std::vector<BreakpointHook*> s_hookList;
BreakpointHook::BreakpointHook(DWORD64 addr, std::function<void(PEXCEPTION_POINTERS)> handler) {
BreakpointHook::BreakpointHook(PDWORD64 addr, std::function<void(PEXCEPTION_POINTERS)> handler) {
m_addr = addr;
m_handler = handler;
m_originalBytes = *(BYTE*)m_addr;
@ -94,16 +92,16 @@ namespace Hook {
void BreakpointHook::Enable() {
DWORD oldProtection = 0;
VirtualProtect((LPVOID)m_addr, 1, PAGE_EXECUTE_READWRITE, &m_originalProtection);
VirtualProtect(m_addr, 1, PAGE_EXECUTE_READWRITE, &m_originalProtection);
*(BYTE*)m_addr = 0xCC;
VirtualProtect((LPVOID)m_addr, 1, m_originalProtection, &oldProtection);
VirtualProtect(m_addr, 1, m_originalProtection, &oldProtection);
}
void BreakpointHook::Disable() {
DWORD oldProtection = 0;
VirtualProtect((LPVOID)m_addr, 1, PAGE_EXECUTE_READWRITE, &oldProtection);
VirtualProtect(m_addr, 1, PAGE_EXECUTE_READWRITE, &oldProtection);
*(BYTE*)m_addr = m_originalBytes;
VirtualProtect((LPVOID)m_addr, 1, m_originalProtection, &oldProtection);
VirtualProtect(m_addr, 1, m_originalProtection, &oldProtection);
}
BreakpointHook::~BreakpointHook() {
Disable();
@ -114,12 +112,12 @@ namespace Hook {
s_hookList.erase(it);
}
static DWORD64 lastBpAddress = NULL;
static PDWORD64 lastBpAddress = nullptr;
long WINAPI BreakpointHook::OnException(PEXCEPTION_POINTERS info) {
for (auto it = s_hookList.begin(); it != s_hookList.end(); it++) {
BreakpointHook* bp = *it;
if (bp->m_addr == reinterpret_cast<DWORD64>(info->ExceptionRecord->ExceptionAddress)) {
if (bp->m_addr == info->ExceptionRecord->ExceptionAddress) {
bp->Disable();
lastBpAddress = bp->m_addr;

View File

@ -4,14 +4,14 @@
namespace Hook {
struct DETOUR_INFO {
DWORD64* target;
DWORD64* hookedFunc;
DWORD64* jmpBack;
LPVOID target;
LPVOID hookedFunc;
PDWORD64 jmpBack;
std::vector<BYTE> oBytes;
std::vector<BYTE> patchedBytes;
DETOUR_INFO() = default;
DETOUR_INFO(DWORD64* pTarget, DWORD64* pHookedFunc) {
DETOUR_INFO(LPVOID pTarget, LPVOID pHookedFunc) {
target = pTarget;
hookedFunc = pHookedFunc;
jmpBack = nullptr;
@ -20,18 +20,18 @@ namespace Hook {
extern void VTHook(LPVOID instance, LPVOID pDetour, LPVOID* ppOriginal, const DWORD offset);
extern DETOUR_INFO MidFuncHook(DWORD64* pTarget, DWORD64* hookedFunc, const size_t nops = 0, const size_t bytesToSkip = 0);
extern DETOUR_INFO MidFuncHook(LPVOID pTarget, LPVOID hookedFunc, const size_t nops = 0, const size_t bytesToSkip = 0);
class BreakpointHook {
private:
DWORD64 m_addr;
PDWORD64 m_addr;
BYTE m_originalBytes;
std::function<void(PEXCEPTION_POINTERS)> m_handler;
DWORD m_originalProtection;
static long WINAPI OnException(PEXCEPTION_POINTERS info);
public:
BreakpointHook(DWORD64 addr, std::function<void(PEXCEPTION_POINTERS)> handler);
BreakpointHook(PDWORD64 addr, std::function<void(PEXCEPTION_POINTERS)> handler);
void Enable();
void Disable();
~BreakpointHook();

View File

@ -17,6 +17,6 @@ namespace Memory {
const DWORD64 moduleEntryPoint = reinterpret_cast<DWORD64>(moduleInf.EntryPoint);
const DWORD64 moduleEndPoint = moduleEntryPoint + moduleInf.SizeOfImage;
return ptr != NULL && (ptr <= moduleEndPoint && ptr >= moduleEntryPoint);
return ptr && (ptr <= moduleEndPoint && ptr >= moduleEntryPoint);
}
}

View File

@ -14,7 +14,7 @@ namespace Memory {
template<typename ptrT = LPVOID>
bool IsValidPtrMod(ptrT ptr, const char* moduleName, const bool checkForVT = true) {
return IsValidPtr<ptrT>(ptr) && IsAddressValidMod(checkForVT ? *(DWORD64*)(ptr) : (DWORD64)(ptr), moduleName);
return IsValidPtr<ptrT>(ptr) && IsAddressValidMod(checkForVT ? *(PDWORD64)(ptr) : (DWORD64)(ptr), moduleName);
}
template <std::size_t Index, typename ReturnType = void, typename... Args> __forceinline ReturnType CallVT(LPVOID instance, Args... args) {

View File

@ -1,6 +1,7 @@
#include "..\ImGui\imgui.h"
#include "..\game_classes.h"
#include "..\core.h"
#include "menu.h"
namespace Menu {
namespace Camera {
@ -9,39 +10,101 @@ namespace Menu {
bool freeCamEnabled = false;
SMART_BOOL disablePhotoModeLimitsEnabled{};
bool teleportPlayerToCameraEnabled = false;
static void ToggleFreeCam() {
static void UpdateFOVWhileMenuClosed() {
if (Menu::isOpen)
return;
Engine::CVideoSettings* videoSettings = Engine::CVideoSettings::Get();
if (!videoSettings)
return;
Menu::Camera::FOV = static_cast<int>(videoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
}
static void FreeCamUpdate() {
GamePH::LevelDI* iLevel = GamePH::LevelDI::Get();
if (!iLevel)
return;
LPVOID viewCam = iLevel->GetViewCamera();
if (!viewCam)
return;
GamePH::GameDI_PH* pGameDI_PH = GamePH::GameDI_PH::Get();
GamePH::FreeCamera* pFreeCamera = GamePH::FreeCamera::Get();
if (!pGameDI_PH)
return;
if (!pFreeCamera)
GamePH::FreeCamera* pFreeCam = GamePH::FreeCamera::Get();
if (!pFreeCam)
return;
GamePH::GameDI_PH::Get()->TogglePhotoMode();
GamePH::FreeCamera::Get()->AllowCameraMovement(freeCamEnabled ? 2 : 0);
if (freeCamEnabled) {
if (viewCam == pFreeCam)
return;
GamePH::GameDI_PH::Get()->TogglePhotoMode();
GamePH::FreeCamera::Get()->AllowCameraMovement(2);
} else {
GamePH::CameraFPPDI* pPlayerCam = GamePH::CameraFPPDI::Get();
if (!pPlayerCam || viewCam == pPlayerCam)
return;
GamePH::GameDI_PH::Get()->TogglePhotoMode();
GamePH::FreeCamera::Get()->AllowCameraMovement(0);
}
}
void Render() {
if (ImGui::Checkbox("FreeCam", &freeCamEnabled))
ToggleFreeCam();
ImGui::SameLine();
ImGui::BeginDisabled(freeCamEnabled); {
if (freeCamEnabled)
disablePhotoModeLimitsEnabled.Change(true);
else
disablePhotoModeLimitsEnabled.Restore();
void Update() {
if (freeCamEnabled)
disablePhotoModeLimitsEnabled.Change(true);
else
disablePhotoModeLimitsEnabled.Restore();
ImGui::Checkbox("Disable PhotoMode Limits", &disablePhotoModeLimitsEnabled.value);
UpdateFOVWhileMenuClosed();
FreeCamUpdate();
}
static bool GetFreeCamDisabledFlag() {
GamePH::LevelDI* iLevel = GamePH::LevelDI::Get();
if (!iLevel)
return true;
LPVOID viewCam = iLevel->GetViewCamera();
if (!viewCam)
return true;
GamePH::FreeCamera* pFreeCam = GamePH::FreeCamera::Get();
if (!pFreeCam)
return true;
GamePH::CameraFPPDI* pPlayerCam = GamePH::CameraFPPDI::Get();
if (!pPlayerCam)
return false;
DWORD64 viewCamVT = *reinterpret_cast<DWORD64*>(viewCam);
DWORD64 freeCamVT = *reinterpret_cast<DWORD64*>(pFreeCam);
DWORD64 playerCamVT = *reinterpret_cast<DWORD64*>(pPlayerCam);
if (viewCamVT != freeCamVT && viewCamVT != playerCamVT)
return true;
return false;
}
void Render() {
ImGui::BeginDisabled(GetFreeCamDisabledFlag()); {
ImGui::Checkbox("FreeCam", &freeCamEnabled);
ImGui::SameLine();
ImGui::BeginDisabled(freeCamEnabled); {
ImGui::Checkbox("Disable PhotoMode Limits", &disablePhotoModeLimitsEnabled.value);
ImGui::EndDisabled();
}
ImGui::Checkbox("Teleport Player to Camera", &teleportPlayerToCameraEnabled);
ImGui::EndDisabled();
}
Engine::CVideoSettings* pCVideoSettings = Engine::CVideoSettings::Get();
if (ImGui::SliderInt("FOV", &FOV, 20, 160) && pCVideoSettings) {
pCVideoSettings->ExtraFOV = static_cast<float>(FOV - BaseFOV);
} else if (pCVideoSettings)
FOV = static_cast<int>(pCVideoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
ImGui::BeginDisabled(!pCVideoSettings); {
if (ImGui::SliderInt("FOV", &FOV, 20, 160) && pCVideoSettings)
pCVideoSettings->ExtraFOV = static_cast<float>(FOV - BaseFOV);
else if (pCVideoSettings)
FOV = static_cast<int>(pCVideoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
ImGui::EndDisabled();
}
}
}
}

View File

@ -8,7 +8,9 @@ namespace Menu {
extern bool freeCamEnabled;
extern SMART_BOOL disablePhotoModeLimitsEnabled;
extern bool teleportPlayerToCameraEnabled;
extern void Update();
extern void Render();
}
}

View File

@ -1,6 +1,7 @@
#include "..\ImGui\imgui.h"
#include "camera.h"
#include "player.h"
#include "world.h"
namespace Menu {
static const ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize;
@ -19,6 +20,7 @@ namespace Menu {
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem("World")) {
Menu::World::Render();
ImGui::EndTabItem();
}
ImGui::EndTabBar();

View File

@ -1,34 +1,95 @@
#include <algorithm>
#include "..\ImGui\imgui.h"
#include "..\game_classes.h"
#include <algorithm>
#include "..\core.h"
#include "camera.h"
namespace Menu {
namespace Player {
char searchFilter[64];
SMART_BOOL godModeEnabled{};
SMART_BOOL freezePlayerEnabled{};
static char searchFilter[64];
void PlayerPositionUpdate() {
Engine::CBulletPhysicsCharacter* playerCharacter = Engine::CBulletPhysicsCharacter::Get();
if (!playerCharacter)
return;
if (!Menu::Player::freezePlayerEnabled.value) {
Engine::CBulletPhysicsCharacter::posBeforeFreeze = playerCharacter->playerPos;
if (!Menu::Camera::freeCamEnabled)
return;
if (!Menu::Camera::teleportPlayerToCameraEnabled)
return;
GamePH::FreeCamera* freeCam = GamePH::FreeCamera::Get();
if (!freeCam)
return;
Vector3 camPos{};
freeCam->GetPosition(&camPos);
if (camPos.isDefault())
return;
playerCharacter->MoveCharacter(camPos);
} else
playerCharacter->FreezeCharacter();
}
void Update() {
if (Menu::Camera::freeCamEnabled)
godModeEnabled.Change(true);
else if (!Menu::Camera::freeCamEnabled)
godModeEnabled.Restore();
if (Menu::Camera::freeCamEnabled)
freezePlayerEnabled.Change(!Menu::Camera::teleportPlayerToCameraEnabled);
else if (!Menu::Camera::freeCamEnabled)
freezePlayerEnabled.Restore();
PlayerPositionUpdate();
}
void Render() {
if (ImGui::CollapsingHeader("Player Variables", ImGuiTreeNodeFlags_None)) {
ImGui::InputText("##VarsSearch", searchFilter, 32);
ImGui::BeginDisabled(!GamePH::PlayerHealthModule::Get() || Menu::Camera::freeCamEnabled); {
ImGui::Checkbox("God Mode", &godModeEnabled.value);
ImGui::EndDisabled();
}
ImGui::SameLine();
ImGui::BeginDisabled(!Engine::CBulletPhysicsCharacter::Get() || Menu::Camera::freeCamEnabled); {
ImGui::Checkbox("Freeze Player", &freezePlayerEnabled.value);
ImGui::EndDisabled();
}
ImGui::BeginDisabled(!GamePH::PlayerVariables::gotPlayerVars); {
if (ImGui::CollapsingHeader("Player Variables", ImGuiTreeNodeFlags_None)) {
ImGui::InputText("##VarsSearch", searchFilter, 32);
for (auto const& [key, val] : GamePH::PlayerVariables::unorderedPlayerVars) {
if (val.first == NULL)
continue;
for (auto const& [key, val] : GamePH::PlayerVariables::unorderedPlayerVars) {
if (!val.first)
continue;
std::string lowerSearch = key.data();
std::string lowerFilter = searchFilter;
std::transform(lowerSearch.begin(), lowerSearch.end(), lowerSearch.begin(), tolower);
std::transform(lowerFilter.begin(), lowerFilter.end(), lowerFilter.begin(), tolower);
if (lowerSearch.find(std::string(lowerFilter)) == std::string::npos)
continue;
std::string lowerSearch = key.data();
std::string lowerFilter = searchFilter;
std::transform(lowerSearch.begin(), lowerSearch.end(), lowerSearch.begin(), tolower);
std::transform(lowerFilter.begin(), lowerFilter.end(), lowerFilter.begin(), tolower);
if (lowerSearch.find(std::string(lowerFilter)) == std::string::npos)
continue;
if (val.second == "float") {
float* varAddr = reinterpret_cast<float*>(val.first);
ImGui::InputFloat(key.data(), &*varAddr);
} else if (val.second == "bool") {
bool* varAddr = reinterpret_cast<bool*>(val.first);
ImGui::Checkbox(key.data(), &*varAddr);
if (val.second == "float") {
float* varAddr = reinterpret_cast<float*>(val.first);
ImGui::InputFloat(key.data(), &*varAddr);
*(varAddr + 1) = *varAddr;
} else if (val.second == "bool") {
bool* varAddr = reinterpret_cast<bool*>(val.first);
ImGui::Checkbox(key.data(), &*varAddr);
*(varAddr + 1) = *varAddr;
}
}
}
ImGui::EndDisabled();
}
}
}

View File

@ -1,6 +1,12 @@
#pragma once
#include "..\core.h"
namespace Menu {
namespace Player {
extern SMART_BOOL godModeEnabled;
extern SMART_BOOL freezePlayerEnabled;
extern void Update();
extern void Render();
}
}

View File

@ -0,0 +1,41 @@
#include "..\ImGui\imgui.h"
#include "..\game_classes.h"
namespace Menu {
namespace World {
float time = 0.0f;
EWeather::TYPE weather = EWeather::TYPE::Default;
static const char* const weatherItems[7] = {
"Default",
"Foggy",
"Clear",
"Overcast",
"Cloudy",
"Rainy",
"Stormy"
};
void Render() {
GamePH::DayNightCycle* dayNightCycle = GamePH::DayNightCycle::Get();
ImGui::BeginDisabled(!Engine::CBulletPhysicsCharacter::Get() || !dayNightCycle || dayNightCycle->time1 == 0.0f); {
if (ImGui::SliderFloat("Time", &time, 0.01f, 24.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp) && dayNightCycle)
dayNightCycle->SetDaytime(time);
else if (dayNightCycle)
time = dayNightCycle->time1 * 24;
ImGui::EndDisabled();
}
GamePH::TimeWeather::CSystem* timeWeatherSystem = GamePH::TimeWeather::CSystem::Get();
const bool weatherDisabledFlag = !Engine::CBulletPhysicsCharacter::Get() || !timeWeatherSystem;
ImGui::BeginDisabled(weatherDisabledFlag); {
ImGui::Text("Setting weather to: %s", !weatherDisabledFlag ? weatherItems[weather] : "");
ImGui::Text("Current weather: %s", !weatherDisabledFlag ? weatherItems[timeWeatherSystem->GetCurrentWeather() + 1] : "");
if (ImGui::Combo("Weather", reinterpret_cast<int*>(&weather), weatherItems, IM_ARRAYSIZE(weatherItems)) && timeWeatherSystem)
timeWeatherSystem->SetForcedWeather(static_cast<EWeather::TYPE>(weather - 1));
ImGui::EndDisabled();
}
}
}
}

View File

@ -0,0 +1,12 @@
#pragma once
#include "..\game_classes.h"
namespace Menu {
namespace World {
extern float time;
extern EWeather::TYPE weather;
extern void Render();
}
}

View File

@ -14,37 +14,46 @@ static retType Get_## name () {\
#define AddStaticOffset(name, off) \
static DWORD64 Get_## name () {\
static DWORD64 name = NULL;\
if (name != NULL) return name; \
if (name) return name; \
return name=static_cast<DWORD64>(off);\
}
// Static offsets go here
struct Offsets {
// ntdll.dll
AddOffset(LdrpCallInitRoutineOffset, "ntdll.dll", "[48 89 5C 24 08 44 89 44 24 18 48", PatternType::Address, DWORD64)
AddOffset(LdrpRunInitializeRoutinesOffset, "ntdll.dll", "[48 89 4C 24 08 53 56 57 41 54 41 55 41 56 41 57 48 81 EC 90", PatternType::Address, DWORD64) // for win7
AddOffset(LdrpCallInitRoutineOffset, "ntdll.dll", "[48 89 5C 24 08 44 89 44 24 18 48", PatternType::Address, PDWORD64)
AddOffset(LdrpRunInitializeRoutinesOffset, "ntdll.dll", "[48 89 4C 24 08 53 56 57 41 54 41 55 41 56 41 57 48 81 EC 90", PatternType::Address, PDWORD64) // for win7
// Input related
AddOffset(g_gui__CActionNodeOffset, "engine_x64_rwdi.dll", "C3 48 8B 0D [?? ?? ?? ?? E8 ?? ?? ?? ?? 33 C0", PatternType::RelativePointer, LPVOID*)
AddOffset(DoGameWindowStuffOnLostFocusOffset, "engine_x64_rwdi.dll", "C3 48 8B 0D ?? ?? ?? ?? E8 [?? ?? ?? ?? 33 C0", PatternType::RelativePointer, DWORD64)
AddOffset(DoGameWindowStuffOnGainFocusOffset, "engine_x64_rwdi.dll", "48 8B 0D ?? ?? ?? ?? E8 [?? ?? ?? ?? BA ?? ?? ?? ?? 48 8B CE E8 ?? ?? ?? ??", PatternType::RelativePointer, DWORD64)
AddOffset(DoGameWindowStuffOnLostFocusOffset, "engine_x64_rwdi.dll", "C3 48 8B 0D ?? ?? ?? ?? E8 [?? ?? ?? ?? 33 C0", PatternType::RelativePointer, LPVOID)
AddOffset(DoGameWindowStuffOnGainFocusOffset, "engine_x64_rwdi.dll", "48 8B 0D ?? ?? ?? ?? E8 [?? ?? ?? ?? BA ?? ?? ?? ?? 48 8B CE E8 ?? ?? ?? ??", PatternType::RelativePointer, LPVOID)
// Player vars related
AddOffset(LoadPlayerFloatVariableOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 55 80 48 8B 08", PatternType::RelativePointer, DWORD64);
AddOffset(LoadPlayerBoolVariableOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 55 98 48 8B 08", PatternType::RelativePointer, DWORD64);
AddOffset(LoadPlayerFloatVariableOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 55 80 48 8B 08", PatternType::RelativePointer, PDWORD64);
AddOffset(LoadPlayerBoolVariableOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 55 98 48 8B 08", PatternType::RelativePointer, PDWORD64);
AddOffset(InitializePlayerVariablesOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B E8 48 8B CF 48 89 AF ?? ?? ?? ??", PatternType::RelativePointer, DWORD64)
AddStaticOffset(initPlayerFloatVarsInstrOffset, 0xE);
AddStaticOffset(initPlayerBoolVarsInstrOffset, 0x234);
AddOffset(PlayerStateOffset, "gamedll_ph_x64_rwdi.dll", "48 8B 3D [?? ?? ?? ?? 4C 8B EA", PatternType::RelativePointer, DWORD64)
AddOffset(PlayerStateOffset, "gamedll_ph_x64_rwdi.dll", "48 8B 3D [?? ?? ?? ?? 4C 8B EA", PatternType::RelativePointer, LPVOID)
// Game related
AddOffset(CLobbySteamOffset, "engine_x64_rwdi.dll", "48 8B 05 [?? ?? ?? ?? 48 85 C0 74 05 48 83 C0 08 C3", PatternType::RelativePointer, DWORD64)
AddOffset(CLobbySteamOffset, "engine_x64_rwdi.dll", "48 8B 05 [?? ?? ?? ?? 48 85 C0 74 05 48 83 C0 08 C3", PatternType::RelativePointer, LPVOID)
AddStaticOffset(gameDI_PH2Offset, 0x18)
AddOffset(g_PlayerObjProperties, "gamedll_ph_x64_rwdi.dll", "48 8B D9 48 89 0D [?? ?? ?? ??", PatternType::RelativePointer, DWORD64)
AddOffset(g_PlayerObjProperties, "gamedll_ph_x64_rwdi.dll", "48 8B D9 48 89 0D [?? ?? ?? ??", PatternType::RelativePointer, LPVOID)
AddOffset(g_DayNightCycle, "gamedll_ph_x64_rwdi.dll", "48 8B 0D [?? ?? ?? ?? 48 85 C9 74 10 E8 ?? ?? ?? ?? 84 C0 74 07 B0 01 48 83 C4 28 C3 32 C0", PatternType::RelativePointer, LPVOID)
AddOffset(g_CameraFPPDI, "gamedll_ph_x64_rwdi.dll", "48 89 05 [?? ?? ?? ?? 40 84 FF", PatternType::RelativePointer, PDWORD64)
AddOffset(g_FreeCamera, "gamedll_ph_x64_rwdi.dll", "48 89 05 [?? ?? ?? ?? 48 89 4C 24 ??", PatternType::RelativePointer, PDWORD64)
// Functions
AddOffset(CalculateFreeCamCollisionOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B 06 4C 8D 4C 24 ??", PatternType::RelativePointer, LPVOID)
AddOffset(MoveCharacterOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 80 BB ?? ?? ?? ?? ?? 74 4E", PatternType::RelativePointer, DWORD64)
AddOffset(GetViewCameraOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 85 C0 74 28 48 8B C8", PatternType::RelativePointer, LPVOID)
AddOffset(MoveCharacterOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 80 BB ?? ?? ?? ?? ?? 74 4E", PatternType::RelativePointer, LPVOID)
AddOffset(CreatePlayerHealthModuleOffset, "gamedll_ph_x64_rwdi.dll", "[48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 4C 8B F1 E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ??", PatternType::Address, LPVOID)
AddOffset(LifeSetHealth, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 49 8D 4C 24 ?? 49 03 CE", PatternType::RelativePointer, LPVOID)
AddOffset(GetTimeWeatherSystemOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 33 D2 48 8B C8 E8 ?? ?? ?? ?? 4C 8B C8", PatternType::RelativePointer, LPVOID)
AddOffset(SetForcedWeatherOffset, "engine_x64_rwdi.dll", "89 51 68 C3 CC CC CC CC CC CC CC CC CC CC CC CC", PatternType::Address, LPVOID)
AddOffset(GetCurrentWeatherOffset, "engine_x64_rwdi.dll", "48 8B 41 78 48 85 C0 75 0F", PatternType::Address, LPVOID)
};
#undef AddFuncCall