Fixed most Third Person bugs, added TPP model, cleaned the code up a bit

This commit is contained in:
EricPlayZ
2024-01-14 06:26:53 +02:00
parent e24e1c8dac
commit a6a09521f2
14 changed files with 590 additions and 425 deletions

View File

@ -4095,6 +4095,7 @@ namespace Config {
reader.InsertEntry("Camera:FreeCam", "Speed", 2.0f);
reader.InsertEntry("Camera:FreeCam", "TeleportPlayerToCamera", false);
reader.InsertEntry("Camera:ThirdPerson", "Enabled", false);
reader.InsertEntry("Camera:ThirdPerson", "UseTPPModel", true);
reader.InsertEntry("Camera:ThirdPerson", "DistanceBehindPlayer", 2.0f);
reader.InsertEntry("Camera:ThirdPerson", "HeightAbovePlayer", 1.35f);
reader.InsertEntry("Camera:Misc", "DisablePhotoModeLimits", true);
@ -4156,11 +4157,12 @@ namespace Config {
if (!loadSCRFilePath.empty() && !std::filesystem::is_directory(loadSCRFilePath.parent_path()))
Menu::Player::loadSCRFilePath = {};
Menu::Camera::FreeCamSpeed = reader.Get<float>("Camera:FreeCam", "Speed", 2.0f);
Menu::Camera::freeCamSpeed = reader.Get<float>("Camera:FreeCam", "Speed", 2.0f);
Menu::Camera::teleportPlayerToCameraEnabled = reader.Get<bool>("Camera:FreeCam", "TeleportPlayerToCamera", false);
Menu::Camera::thirdPersonCameraEnabled = reader.Get<bool>("Camera:ThirdPerson", "Enabled", false);
Menu::Camera::DistanceBehindPlayer = reader.Get<float>("Camera:ThirdPerson", "DistanceBehindPlayer", 2.0f);
Menu::Camera::HeightAbovePlayer = reader.Get<float>("Camera:ThirdPerson", "HeightAbovePlayer", 1.35f);
Menu::Camera::thirdPersonCameraEnabled.value = reader.Get<bool>("Camera:ThirdPerson", "Enabled", false);
Menu::Camera::tpUseTPPModel.value = reader.Get<bool>("Camera:ThirdPerson", "UseTPPModel", true);
Menu::Camera::tpDistanceBehindPlayer = reader.Get<float>("Camera:ThirdPerson", "DistanceBehindPlayer", 2.0f);
Menu::Camera::tpHeightAbovePlayer = reader.Get<float>("Camera:ThirdPerson", "HeightAbovePlayer", 1.35f);
Menu::Camera::disablePhotoModeLimitsEnabled.value = reader.Get<bool>("Camera:Misc", "DisablePhotoModeLimits", true);
Menu::Camera::disableSafezoneFOVReductionEnabled.value = reader.Get<bool>("Camera:Misc", "DisableSafezoneFOVReduction", true);
@ -4179,11 +4181,12 @@ namespace Config {
reader.UpdateEntry("Player:PlayerVariables", "LastSaveSCRPath", Menu::Player::saveSCRPath);
reader.UpdateEntry("Player:PlayerVariables", "LastLoadSCRFilePath", Menu::Player::loadSCRFilePath);
reader.UpdateEntry("Camera:FreeCam", "Speed", Menu::Camera::FreeCamSpeed);
reader.UpdateEntry("Camera:FreeCam", "Speed", Menu::Camera::freeCamSpeed);
reader.UpdateEntry("Camera:FreeCam", "TeleportPlayerToCamera", Menu::Camera::teleportPlayerToCameraEnabled);
reader.UpdateEntry("Camera:ThirdPerson", "Enabled", Menu::Camera::thirdPersonCameraEnabled);
reader.UpdateEntry("Camera:ThirdPerson", "DistanceBehindPlayer", Menu::Camera::DistanceBehindPlayer);
reader.UpdateEntry("Camera:ThirdPerson", "HeightAbovePlayer", Menu::Camera::HeightAbovePlayer);
reader.UpdateEntry("Camera:ThirdPerson", "Enabled", Menu::Camera::thirdPersonCameraEnabled.value);
reader.UpdateEntry("Camera:ThirdPerson", "UseTPPModel", Menu::Camera::tpUseTPPModel.value);
reader.UpdateEntry("Camera:ThirdPerson", "DistanceBehindPlayer", Menu::Camera::tpDistanceBehindPlayer);
reader.UpdateEntry("Camera:ThirdPerson", "HeightAbovePlayer", Menu::Camera::tpHeightAbovePlayer);
reader.UpdateEntry("Camera:Misc", "DisablePhotoModeLimits", Menu::Camera::disablePhotoModeLimitsEnabled.value);
reader.UpdateEntry("Camera:Misc", "DisableSafezoneFOVReduction", Menu::Camera::disableSafezoneFOVReductionEnabled.value);

View File

@ -90,7 +90,7 @@ namespace Core {
Sleep(250);
if (!pReadVideoSettings)
pReadVideoSettings = (decltype(pReadVideoSettings))Offsets::Get_ReadVideoSettingsOffset();
pReadVideoSettings = (decltype(pReadVideoSettings))Offsets::Get_ReadVideoSettings();
else if (!oReadVideoSettings && MH_CreateHook(pReadVideoSettings, &detourReadVideoSettings, reinterpret_cast<LPVOID*>(&oReadVideoSettings)) == MH_OK) {
MH_EnableHook(pReadVideoSettings);
break;
@ -120,9 +120,7 @@ namespace Core {
EnableConsole();
Config::InitConfig();
if (GamePH::PlayerVariables::playerVars.empty())
GamePH::PlayerVariables::SortPlayerVars();
GamePH::PlayerVariables::SortPlayerVars();
MH_Initialize();
LoopHookReadVideoSettings();
@ -135,7 +133,7 @@ namespace Core {
GamePH::LoopHookCalculateFreeCamCollision();
GamePH::LoopHookLifeSetHealth();
GamePH::LoopHookTogglePhotoMode();
GamePH::LoopHookMoveCamera();
GamePH::LoopHookMoveCameraFromForwardUpPos();
const HANDLE proc = GetCurrentProcess();
WaitForSingleObject(proc, INFINITE);
@ -150,9 +148,5 @@ namespace Core {
MH_DisableHook(MH_ALL_HOOKS);
MH_Uninitialize();
configSaveLoopThread.join();
configLoopThread.join();
hookRendererThread.join();
}
}

View File

@ -30,7 +30,7 @@ namespace GamePH {
Sleep(250);
if (!pCreatePlayerHealthModule)
pCreatePlayerHealthModule = (decltype(pCreatePlayerHealthModule))Offsets::Get_CreatePlayerHealthModuleOffset();
pCreatePlayerHealthModule = (decltype(pCreatePlayerHealthModule))Offsets::Get_CreatePlayerHealthModule();
else if (!oCreatePlayerHealthModule && MH_CreateHook(pCreatePlayerHealthModule, &detourCreatePlayerHealthModule, reinterpret_cast<LPVOID*>(&oCreatePlayerHealthModule)) == MH_OK) {
MH_EnableHook(pCreatePlayerHealthModule);
break;
@ -60,32 +60,32 @@ namespace GamePH {
break;
}
}
#pragma endregion
#pragma endregion
#pragma region CalculateFreeCamCollision
#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.value && !Menu::Camera::disablePhotoModeLimitsEnabled.value)
return oCalculateFreeCamCollision(pFreeCamera, finalPos);
return NULL;
return 0;
}
void LoopHookCalculateFreeCamCollision() {
while (true) {
Sleep(250);
if (!pCalculateFreeCamCollision)
pCalculateFreeCamCollision = (decltype(pCalculateFreeCamCollision))Offsets::Get_CalculateFreeCamCollisionOffset();
pCalculateFreeCamCollision = (decltype(pCalculateFreeCamCollision))Offsets::Get_CalculateFreeCamCollision();
else if (!oCalculateFreeCamCollision && MH_CreateHook(pCalculateFreeCamCollision, &detourCalculateFreeCamCollision, reinterpret_cast<LPVOID*>(&oCalculateFreeCamCollision)) == MH_OK) {
MH_EnableHook(pCalculateFreeCamCollision);
break;
}
}
}
#pragma endregion
#pragma endregion
#pragma region LifeSetHealth
#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) {
@ -108,13 +108,13 @@ namespace GamePH {
}
}
}
#pragma endregion
#pragma endregion
#pragma region TogglePhotoMode
#pragma region TogglePhotoMode
static void(*pTogglePhotoMode)(LPVOID guiPhotoModeData, bool enabled) = nullptr;
static void(*oTogglePhotoMode)(LPVOID guiPhotoModeData, bool enabled) = nullptr;
void detourTogglePhotoMode(LPVOID guiPhotoModeData, bool enabled) {
Menu::Camera::photoModeEnabled = enabled;
Menu::Camera::photoModeEnabled.value = enabled;
if (Menu::Camera::freeCamEnabled.value) {
GamePH::GameDI_PH* pGameDI_PH = GamePH::GameDI_PH::Get();
if (pGameDI_PH) {
@ -140,45 +140,79 @@ namespace GamePH {
}
}
}
#pragma endregion
#pragma endregion
#pragma region MoveCamera
static void(*pMoveCamera)(LPVOID pCBaseCamera, Vector3* pos, float* a3, float* a4) = nullptr;
static void(*oMoveCamera)(LPVOID pCBaseCamera, Vector3* pos, float* a3, float* a4) = nullptr;
void detourMoveCamera(LPVOID pCBaseCamera, Vector3* pos, float* a3, float* a4) {
if (Menu::Camera::thirdPersonCameraEnabled && !Menu::Camera::freeCamEnabled.value) {
GamePH::LevelDI* iLevel = GamePH::LevelDI::Get();
if (!iLevel) {
oMoveCamera(pCBaseCamera, pos, a3, a4);
return;
#pragma region MoveCameraFromForwardUpPos
static void(*pMoveCameraFromForwardUpPos)(LPVOID pCBaseCamera, float* a3, float* a4, Vector3* pos) = nullptr;
static void(*oMoveCameraFromForwardUpPos)(LPVOID pCBaseCamera, float* a3, float* a4, Vector3* pos) = nullptr;
void detourMoveCameraFromForwardUpPos(LPVOID pCBaseCamera, float* a3, float* a4, Vector3* pos) {
gen_TPPModel* pgen_TPPModel = gen_TPPModel::Get();
if (pgen_TPPModel) {
if (Menu::Camera::photoModeEnabled.previousValue != Menu::Camera::photoModeEnabled.value && !Menu::Camera::photoModeEnabled.value) {
Menu::Camera::tpUseTPPModel.previousValue = !Menu::Camera::tpUseTPPModel.value;
Menu::Camera::thirdPersonCameraEnabled.previousValue = Menu::Camera::thirdPersonCameraEnabled.value;
}
CameraFPPDI* viewCam = static_cast<CameraFPPDI*>(iLevel->GetViewCamera());
if (!viewCam) {
oMoveCamera(pCBaseCamera, pos, a3, a4);
return;
if (!Menu::Camera::photoModeEnabled.value && !Menu::Camera::freeCamEnabled.value) {
if ((Menu::Camera::tpUseTPPModel.previousValue != Menu::Camera::tpUseTPPModel.value && !Menu::Camera::tpUseTPPModel.value && Menu::Camera::thirdPersonCameraEnabled.value) || (Menu::Camera::thirdPersonCameraEnabled.previousValue != Menu::Camera::thirdPersonCameraEnabled.value && !Menu::Camera::thirdPersonCameraEnabled.value)) {
pgen_TPPModel->enableTPPModel2 = true;
pgen_TPPModel->enableTPPModel1 = true;
}
ShowTPPModel(Menu::Camera::tpUseTPPModel.value && Menu::Camera::thirdPersonCameraEnabled.value);
if (Menu::Camera::tpUseTPPModel.previousValue == Menu::Camera::tpUseTPPModel.value && Menu::Camera::thirdPersonCameraEnabled.previousValue == Menu::Camera::thirdPersonCameraEnabled.value && (Menu::Camera::tpUseTPPModel.value && Menu::Camera::thirdPersonCameraEnabled.value)) {
pgen_TPPModel->enableTPPModel2 = false;
pgen_TPPModel->enableTPPModel1 = false;
}
Menu::Camera::tpUseTPPModel.previousValue = Menu::Camera::tpUseTPPModel.value;
Menu::Camera::thirdPersonCameraEnabled.previousValue = Menu::Camera::thirdPersonCameraEnabled.value;
}
if (Menu::Camera::photoModeEnabled.previousValue != Menu::Camera::photoModeEnabled.value && Menu::Camera::photoModeEnabled.value) {
pgen_TPPModel->enableTPPModel2 = false;
pgen_TPPModel->enableTPPModel1 = false;
}
else if (Menu::Camera::photoModeEnabled.previousValue == Menu::Camera::photoModeEnabled.value && Menu::Camera::photoModeEnabled.value) {
ShowTPPModel(Menu::Camera::photoModeEnabled.value);
}
Engine::CBulletPhysicsCharacter* playerCharacter = Engine::CBulletPhysicsCharacter::Get();
Vector3 forwardVec{};
viewCam->GetForwardVector(&forwardVec);
const Vector3 normForwardVec = forwardVec.normalize();
Vector3 newCamPos = (!playerCharacter ? *pos : playerCharacter->playerPos) - normForwardVec * -Menu::Camera::DistanceBehindPlayer;
newCamPos.Y += Menu::Camera::HeightAbovePlayer - (!playerCharacter ? 1.0f : 0.0f);
*pos = newCamPos;
Menu::Camera::photoModeEnabled.previousValue = Menu::Camera::photoModeEnabled.value;
}
oMoveCamera(pCBaseCamera, pos, a3, a4);
if (!Menu::Camera::thirdPersonCameraEnabled.value || Menu::Camera::photoModeEnabled.value || Menu::Camera::freeCamEnabled.value || !pos || !GamePH::PlayerObjProperties::Get()) {
oMoveCameraFromForwardUpPos(pCBaseCamera, a3, a4, pos);
return;
}
GamePH::LevelDI* iLevel = GamePH::LevelDI::Get();
if (!iLevel) {
oMoveCameraFromForwardUpPos(pCBaseCamera, a3, a4, pos);
return;
}
CameraFPPDI* viewCam = static_cast<CameraFPPDI*>(iLevel->GetViewCamera());
if (!viewCam) {
oMoveCameraFromForwardUpPos(pCBaseCamera, a3, a4, pos);
return;
}
Vector3 forwardVec{};
viewCam->GetForwardVector(&forwardVec);
const Vector3 normForwardVec = forwardVec.normalize();
Vector3 newCamPos = *pos - normForwardVec * -Menu::Camera::tpDistanceBehindPlayer;
newCamPos.Y += Menu::Camera::tpHeightAbovePlayer - 1.5f;
*pos = newCamPos;
oMoveCameraFromForwardUpPos(pCBaseCamera, a3, a4, pos);
}
void LoopHookMoveCamera() {
void LoopHookMoveCameraFromForwardUpPos() {
while (true) {
Sleep(250);
if (!pMoveCamera)
pMoveCamera = (decltype(pMoveCamera))Offsets::Get_MoveCamera();
else if (!oMoveCamera && MH_CreateHook(pMoveCamera, &detourMoveCamera, reinterpret_cast<LPVOID*>(&oMoveCamera)) == MH_OK) {
MH_EnableHook(pMoveCamera);
if (!pMoveCameraFromForwardUpPos)
pMoveCameraFromForwardUpPos = (decltype(pMoveCameraFromForwardUpPos))Offsets::Get_MoveCameraFromForwardUpPos();
else if (!oMoveCameraFromForwardUpPos && MH_CreateHook(pMoveCameraFromForwardUpPos, &detourMoveCameraFromForwardUpPos, reinterpret_cast<LPVOID*>(&oMoveCameraFromForwardUpPos)) == MH_OK) {
MH_EnableHook(pMoveCameraFromForwardUpPos);
break;
}
}
@ -186,12 +220,130 @@ namespace GamePH {
#pragma endregion
#pragma endregion
#pragma region OtherFuncs
static DWORD64 ShowTPPModelFunc2(LPVOID a1) {
DWORD64(*pShowTPPModelFunc2)(LPVOID a1) = (decltype(pShowTPPModelFunc2))Offsets::Get_ShowTPPModelFunc2();
if (!pShowTPPModelFunc2)
return 0;
return pShowTPPModelFunc2(a1);
}
static void ShowTPPModelFunc3(DWORD64 a1, bool showTPPModel) {
void(*pShowTPPModelFunc3)(DWORD64 a1, bool showTPPModel) = (decltype(pShowTPPModelFunc3))Offsets::Get_ShowTPPModelFunc3();
if (!pShowTPPModelFunc3)
return;
pShowTPPModelFunc3(a1, showTPPModel);
}
void ShowTPPModel(bool showTPPModel) {
GameDI_PH* pGameDI_PH = GameDI_PH::Get();
if (!pGameDI_PH)
return;
DWORD64 tppFunc2Addr = ShowTPPModelFunc2(pGameDI_PH);
if (!tppFunc2Addr)
return;
gen_TPPModel* pgen_TPPModel = gen_TPPModel::Get();
if (!pgen_TPPModel)
return;
ShowTPPModelFunc3(tppFunc2Addr, showTPPModel);
}
#pragma endregion
#pragma region PlayerVariables
std::vector <std::pair<std::string, std::pair<LPVOID, std::string>>> PlayerVariables::playerVars;
std::vector <std::pair<std::string, std::pair<std::any, std::string>>> PlayerVariables::playerVarsDefault;
std::vector <std::pair<std::string, std::pair<std::any, std::string>>> PlayerVariables::playerCustomVarsDefault;
static const int FLOAT_VAR_OFFSET = 3;
static const int BOOL_VAR_OFFSET = 2;
static const int VAR_LOC_OFFSET = 1;
std::vector<std::pair<std::string, std::pair<LPVOID, std::string>>> PlayerVariables::playerVars;
std::vector<std::pair<std::string, std::pair<std::any, std::string>>> PlayerVariables::playerVarsDefault;
std::vector<std::pair<std::string, std::pair<std::any, std::string>>> PlayerVariables::playerCustomVarsDefault;
bool PlayerVariables::gotPlayerVars = false;
static PDWORD64 getFloatPlayerVariableVT() {
if (!Offsets::Get_InitializePlayerVariables())
return nullptr;
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariables() + Offsets::Get_initPlayerFloatVarsInstr_offset() + 0x3; // 0x3 is instruction size
const DWORD floatPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + floatPlayerVariableVTOffset);
}
static PDWORD64 getBoolPlayerVariableVT() {
if (!Offsets::Get_InitializePlayerVariables())
return nullptr;
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariables() + Offsets::Get_initPlayerBoolVarsInstr_offset() + 0x3; // 0x3 is instruction size
const DWORD boolPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + boolPlayerVariableVTOffset);
}
template <typename T>
static void updateDefaultVar(std::vector<std::pair<std::string, std::pair<std::any, std::string>>>& defaultVars, const std::string& varName, T varValue) {
static_assert(std::is_same<T, float>::value || std::is_same<T, bool>::value, "Invalid type: value must be float or bool");
auto it = std::find_if(defaultVars.begin(), defaultVars.end(), [&varName](const auto& pair) {
return pair.first == varName;
});
if (it == defaultVars.end())
return;
it->second.first.emplace<T>(varValue);
}
static void processPlayerVar(PDWORD64*& playerVarsMem, std::pair<std::string, std::pair<LPVOID, std::string>>& var) {
while (true) {
const bool isFloatPlayerVar = *playerVarsMem == getFloatPlayerVariableVT();
const bool isBoolPlayerVar = *playerVarsMem == getBoolPlayerVariableVT();
if (isFloatPlayerVar || isBoolPlayerVar) {
var.second.first = playerVarsMem + VAR_LOC_OFFSET;
const std::string& varName = var.first;
if (isFloatPlayerVar) {
float* varValue = reinterpret_cast<float*>(var.second.first);
updateDefaultVar(GamePH::PlayerVariables::playerVarsDefault, varName, *varValue);
updateDefaultVar(GamePH::PlayerVariables::playerCustomVarsDefault, varName, *varValue);
playerVarsMem += FLOAT_VAR_OFFSET;
}
else {
bool* varValue = reinterpret_cast<bool*>(var.second.first);
updateDefaultVar(GamePH::PlayerVariables::playerVarsDefault, varName, *varValue);
updateDefaultVar(GamePH::PlayerVariables::playerCustomVarsDefault, varName, *varValue);
playerVarsMem += BOOL_VAR_OFFSET;
}
break;
}
else
playerVarsMem += 1;
}
}
void PlayerVariables::GetPlayerVars() {
if (gotPlayerVars)
return;
if (!Get())
return;
if (playerVars.empty())
return;
if (!getFloatPlayerVariableVT())
return;
if (!getBoolPlayerVariableVT())
return;
PDWORD64* playerVarsMem = reinterpret_cast<PDWORD64*>(Get());
bool isFloatPlayerVar = false;
bool isBoolPlayerVar = false;
for (auto& var : playerVars) {
processPlayerVar(playerVarsMem, var);
}
gotPlayerVars = true;
}
void PlayerVariables::SortPlayerVars() {
if (!playerVars.empty())
return;
@ -199,6 +351,7 @@ namespace GamePH {
std::stringstream ss(Config::playerVars);
while (ss.good()) {
// separate the string by the , character to get each variable
std::string pVar{};
getline(ss, pVar, ',');
@ -208,6 +361,7 @@ namespace GamePH {
std::string varType{};
while (ssPVar.good()) {
// seperate the string by the : character to get name and type of variable
std::string subStr{};
getline(ssPVar, subStr, ':');
@ -223,79 +377,6 @@ namespace GamePH {
}
}
PDWORD64 PlayerVariables::GetFloatPlayerVariableVT() {
if (!Offsets::Get_InitializePlayerVariablesOffset())
return nullptr;
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariablesOffset() + Offsets::Get_initPlayerFloatVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD floatPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + floatPlayerVariableVTOffset);
}
PDWORD64 PlayerVariables::GetBoolPlayerVariableVT() {
if (!Offsets::Get_InitializePlayerVariablesOffset())
return nullptr;
const DWORD64 offsetToInstr = Offsets::Get_InitializePlayerVariablesOffset() + Offsets::Get_initPlayerBoolVarsInstrOffset() + 0x3; // 0x3 is instruction size
const DWORD boolPlayerVariableVTOffset = *reinterpret_cast<DWORD*>(offsetToInstr);
return reinterpret_cast<PDWORD64>(offsetToInstr + sizeof(DWORD) + boolPlayerVariableVTOffset);
}
void PlayerVariables::GetPlayerVars() {
if (gotPlayerVars)
return;
if (!Get())
return;
if (playerVars.empty())
return;
if (!GetFloatPlayerVariableVT())
return;
if (!GetBoolPlayerVariableVT())
return;
PDWORD64* playerVarsMem = reinterpret_cast<PDWORD64*>(Get());
bool isFloatPlayerVar = false;
bool isBoolPlayerVar = false;
for (auto it = playerVars.begin(); it != playerVars.end(); ++it) {
while (true) {
isFloatPlayerVar = *playerVarsMem == GetFloatPlayerVariableVT();
isBoolPlayerVar = *playerVarsMem == GetBoolPlayerVariableVT();
if (isFloatPlayerVar || isBoolPlayerVar) {
it->second.first = playerVarsMem + 1;
const std::string varName = it->first;
auto itDef = std::find_if(GamePH::PlayerVariables::playerVarsDefault.begin(), GamePH::PlayerVariables::playerVarsDefault.end(), [&varName](const auto& pair) {
return pair.first == varName;
});
if (itDef != GamePH::PlayerVariables::playerVarsDefault.end()) {
if (isFloatPlayerVar)
itDef->second.first = *reinterpret_cast<float*>(it->second.first);
else
itDef->second.first = *reinterpret_cast<bool*>(it->second.first);
}
auto itCustomDef = std::find_if(GamePH::PlayerVariables::playerCustomVarsDefault.begin(), GamePH::PlayerVariables::playerCustomVarsDefault.end(), [&varName](const auto& pair) {
return pair.first == varName;
});
if (itCustomDef != GamePH::PlayerVariables::playerCustomVarsDefault.end()) {
if (isFloatPlayerVar)
itCustomDef->second.first = *reinterpret_cast<float*>(it->second.first);
else
itCustomDef->second.first = *reinterpret_cast<bool*>(it->second.first);
}
playerVarsMem += isFloatPlayerVar ? 3 : 2;
break;
} else
playerVarsMem += 1;
}
}
gotPlayerVars = true;
}
PlayerVariables* PlayerVariables::Get() {
__try {
PlayerState* pPlayerState = PlayerState::Get();
@ -316,10 +397,10 @@ namespace GamePH {
#pragma region PlayerState
PlayerState* PlayerState::Get() {
__try {
if (!Offsets::Get_PlayerStateOffset())
if (!Offsets::Get_PlayerState())
return nullptr;
PlayerState* ptr = *reinterpret_cast<PlayerState**>(Offsets::Get_PlayerStateOffset());
PlayerState* ptr = *reinterpret_cast<PlayerState**>(Offsets::Get_PlayerState());
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
@ -347,28 +428,48 @@ namespace GamePH {
}
#pragma endregion
Vector3* (*pGetForwardVector)(LPVOID viewCam, Vector3* outForwardVec) = nullptr;
Vector3* (*pGetUpVector)(LPVOID viewCam, Vector3* outUpVec) = nullptr;
#pragma region CameraFPPDI
Vector3* CameraFPPDI::GetForwardVector(Vector3* outForwardVec) {
if (!pGetForwardVector) {
pGetForwardVector = (decltype(pGetForwardVector))Offsets::Get_GetForwardVector();
#pragma region TPPCameraDI
TPPCameraDI* TPPCameraDI::Get() {
__try {
FreeCamera* pFreeCam = FreeCamera::Get();
if (!pFreeCam)
return nullptr;
CoBaseCameraProxy* pCoBaseCameraProxy = pFreeCam->pCoBaseCameraProxy;
if (!pCoBaseCameraProxy)
return nullptr;
TPPCameraDI* ptr = pCoBaseCameraProxy->pTPPCameraDI;
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region CameraFPPDI
Vector3* CameraFPPDI::GetForwardVector(Vector3* outForwardVec) {
Vector3* (*pGetForwardVector)(LPVOID pCameraFPPDI, Vector3 * outForwardVec) = (decltype(pGetForwardVector))Offsets::Get_GetForwardVector();
if (!pGetForwardVector)
return nullptr;
return pGetForwardVector(this, outForwardVec);
}
Vector3* CameraFPPDI::GetUpVector(Vector3* outUpVec) {
if (!pGetUpVector) {
pGetUpVector = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
Vector3* (*pGetUpVector)(LPVOID pCameraFPPDI, Vector3 * outUpVec) = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
if (!pGetUpVector)
return nullptr;
}
return pGetUpVector(this, outUpVec);
}
Vector3* CameraFPPDI::GetPosition(Vector3* posIN) {
return Memory::CallVT<181, Vector3*>(this, posIN);
}
CameraFPPDI* CameraFPPDI::Get() {
/*CameraFPPDI* CameraFPPDI::Get() {
__try {
PDWORD64 pg_CameraFPPDI = Offsets::Get_g_CameraFPPDI();
if (!pg_CameraFPPDI)
@ -382,22 +483,22 @@ namespace GamePH {
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
}*/
#pragma endregion
#pragma region FreeCamera
Vector3* FreeCamera::GetForwardVector(Vector3* outForwardVec) {
if (!pGetForwardVector) {
pGetForwardVector = (decltype(pGetForwardVector))Offsets::Get_GetForwardVector();
Vector3* (*pGetForwardVector)(LPVOID pFreeCamera, Vector3 * outForwardVec) = (decltype(pGetForwardVector))Offsets::Get_GetForwardVector();
if (!pGetForwardVector)
return nullptr;
}
return pGetForwardVector(this, outForwardVec);
}
Vector3* FreeCamera::GetUpVector(Vector3* outUpVec) {
if (!pGetUpVector) {
pGetUpVector = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
Vector3* (*pGetUpVector)(LPVOID pFreeCamera, Vector3 * outUpVec) = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
if (!pGetUpVector)
return nullptr;
}
return pGetUpVector(this, outUpVec);
}
Vector3* FreeCamera::GetPosition(Vector3* posIN) {
@ -452,20 +553,20 @@ namespace GamePH {
namespace TimeWeather {
#pragma region CSystem
void CSystem::SetForcedWeather(int weather) {
if (!Offsets::Get_SetForcedWeatherOffset())
if (!Offsets::Get_SetForcedWeather())
return;
void(*pSetForcedWeather)(LPVOID timeWeatherSystem, int weather) = (decltype(pSetForcedWeather))Offsets::Get_SetForcedWeatherOffset();
void(*pSetForcedWeather)(LPVOID timeWeatherSystem, int weather) = (decltype(pSetForcedWeather))Offsets::Get_SetForcedWeather();
if (!pSetForcedWeather)
return;
pSetForcedWeather(this, weather);
}
int CSystem::GetCurrentWeather() {
if (!Offsets::Get_GetCurrentWeatherOffset())
if (!Offsets::Get_GetCurrentWeather())
return EWeather::TYPE::Default;
int(*pGetCurrentWeather)(LPVOID timeWeatherSystem) = (decltype(pGetCurrentWeather))Offsets::Get_GetCurrentWeatherOffset();
int(*pGetCurrentWeather)(LPVOID timeWeatherSystem) = (decltype(pGetCurrentWeather))Offsets::Get_GetCurrentWeather();
if (!pGetCurrentWeather)
return EWeather::TYPE::Default;
@ -492,25 +593,38 @@ namespace GamePH {
#pragma endregion
#pragma region LevelDI
float LevelDI::GetTimePlayed() {
return Memory::CallVT<317, float>(this);
bool LevelDI::IsLoading() {
if (!Offsets::Get_IsLoading())
return true;
bool(*pIsLoading)(LPVOID iLevel) = (decltype(pIsLoading))Offsets::Get_IsLoading();
if (!pIsLoading)
return true;
return pIsLoading(this);
}
LPVOID LevelDI::GetViewCamera() {
if (!Offsets::Get_GetViewCameraOffset())
if (!Offsets::Get_GetViewCamera())
return nullptr;
LPVOID(*pGetViewCamera)(LPVOID iLevel) = (decltype(pGetViewCamera))Offsets::Get_GetViewCameraOffset();
LPVOID(*pGetViewCamera)(LPVOID iLevel) = (decltype(pGetViewCamera))Offsets::Get_GetViewCamera();
if (!pGetViewCamera)
return nullptr;
return pGetViewCamera(this);
}
void LevelDI::SetViewCamera(LPVOID viewCam) {
Memory::CallVT<289, void>(this, viewCam);
}
float LevelDI::GetTimePlayed() {
return Memory::CallVT<317, float>(this);
}
TimeWeather::CSystem* LevelDI::GetTimeWeatherSystem() {
__try {
if (!Offsets::Get_GetTimeWeatherSystemOffset())
if (!Offsets::Get_GetTimeWeatherSystem())
return nullptr;
TimeWeather::CSystem*(*pGetTimeWeatherSystem)(LevelDI* iLevel) = (decltype(pGetTimeWeatherSystem))Offsets::Get_GetTimeWeatherSystemOffset();
TimeWeather::CSystem*(*pGetTimeWeatherSystem)(LevelDI* iLevel) = (decltype(pGetTimeWeatherSystem))Offsets::Get_GetTimeWeatherSystem();
if (!pGetTimeWeatherSystem)
return nullptr;
@ -537,6 +651,63 @@ namespace GamePH {
}
#pragma endregion
#pragma region gen_TPPModel
gen_TPPModel* gen_TPPModel::Get() {
__try {
LocalClientDI* pLocalClientDI = LocalClientDI::Get();
if (!pLocalClientDI)
return nullptr;
gen_TPPModel* ptr = pLocalClientDI->pgen_TPPModel;
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region LocalClientDI
LocalClientDI* LocalClientDI::Get() {
__try {
SessionCooperativeDI* pSessionCooperativeDI = SessionCooperativeDI::Get();
if (!pSessionCooperativeDI)
return nullptr;
LocalClientDI* ptr = pSessionCooperativeDI->pLocalClientDI;
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region SessionCooperativeDI
SessionCooperativeDI* SessionCooperativeDI::Get() {
__try {
GameDI_PH* pGameDI_PH = GameDI_PH::Get();
if (!pGameDI_PH)
return nullptr;
SessionCooperativeDI* ptr = pGameDI_PH->pSessionCooperativeDI;
if (!Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
return ptr;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
#pragma endregion
#pragma region GameDI_PH2
GameDI_PH2* GameDI_PH2::Get() {
__try {
@ -658,10 +829,10 @@ namespace Engine {
#pragma region CLobbySteam
CLobbySteam* CLobbySteam::Get() {
__try {
if (!Offsets::Get_CLobbySteamOffset())
if (!Offsets::Get_CLobbySteam())
return nullptr;
CLobbySteam* ptr = *reinterpret_cast<CLobbySteam**>(Offsets::Get_CLobbySteamOffset());
CLobbySteam* ptr = *reinterpret_cast<CLobbySteam**>(Offsets::Get_CLobbySteam());
if (!Memory::IsValidPtrMod(ptr, "engine_x64_rwdi.dll"))
return nullptr;

View File

@ -6,6 +6,7 @@
#include <memory>
#include <any>
#include "hook.h"
#include "utils.h"
#define STR_MERGE_IMPL(a, b) a##b
#define STR_MERGE(a, b) STR_MERGE_IMPL(a, b)
@ -17,6 +18,9 @@
struct Vector3 {
float X, Y, Z;
bool operator==(const Vector3& v) const {
return Utils::are_same(X, v.X) && Utils::are_same(Y, v.Y) && Utils::are_same(Z, v.Z);
}
Vector3& operator+=(const Vector3& v) {
X += v.X;
Y += v.Y;
@ -55,7 +59,7 @@ struct Vector3 {
}
bool isDefault() const {
return X == 0.0f && Y == 0.0f && Z == 0.0f;
return Utils::are_same(X, 0.0f) && Utils::are_same(Y, 0.0f) && Utils::are_same(Z, 0.0f);
}
};
namespace EWeather {
@ -82,7 +86,9 @@ namespace GamePH {
extern void LoopHookCalculateFreeCamCollision();
extern void LoopHookLifeSetHealth();
extern void LoopHookTogglePhotoMode();
extern void LoopHookMoveCamera();
extern void LoopHookMoveCameraFromForwardUpPos();
extern void ShowTPPModel(bool showTPPModel);
class PlayerVariables {
public:
@ -91,11 +97,44 @@ namespace GamePH {
static std::vector<std::pair<std::string, std::pair<std::any, std::string>>> playerCustomVarsDefault;
static bool gotPlayerVars;
static void GetPlayerVars();
static void SortPlayerVars();
static PDWORD64 GetFloatPlayerVariableVT();
static PDWORD64 GetBoolPlayerVariableVT();
static void GetPlayerVars();
template <typename T>
static void ChangePlayerVar(const std::string& playerVar, const T value) {
static_assert(std::is_same<T, bool>::value || std::is_same<T, float>::value || std::is_same<T, std::string>::value, "Invalid type: value must be bool, float or string");
auto it = std::find_if(PlayerVariables::playerVars.begin(), PlayerVariables::playerVars.end(), [&playerVar](const auto& pair) {
return pair.first == playerVar;
});
if (it == PlayerVariables::playerVars.end())
return;
if (std::is_same<T, std::string>::value) {
std::string valueStr = Utils::to_string(valueStr);
if (it->second.second == "float") {
float* const varValue = reinterpret_cast<float*>(it->second.first);
const float actualValue = std::stof(valueStr);
*varValue = actualValue;
*(varValue + 1) = actualValue;
}
else {
bool* const varValue = reinterpret_cast<bool*>(it->second.first);
const bool actualValue = valueStr == "true";
*varValue = actualValue;
*(varValue + 1) = actualValue;
}
}
else {
T* const varValue = reinterpret_cast<T*>(it->second.first);
*varValue = value;
*(varValue + 1) = value;
}
}
static PlayerVariables* Get();
};
@ -119,6 +158,11 @@ namespace GamePH {
static PlayerHealthModule* Get();
};
class TPPCameraDI {
public:
static TPPCameraDI* Get();
};
class CameraFPPDI {
public:
union {
@ -129,12 +173,20 @@ namespace GamePH {
Vector3* GetUpVector(Vector3* outUpVec);
Vector3* GetPosition(Vector3* posIN);
static CameraFPPDI* Get();
//static CameraFPPDI* Get();
};
class CoBaseCameraProxy {
public:
union {
DEFINE_MEMBER_N(TPPCameraDI*, pTPPCameraDI, 0xD0);
};
};
class FreeCamera {
public:
union {
DEFINE_MEMBER_N(CoBaseCameraProxy*, pCoBaseCameraProxy, 0x18);
DEFINE_MEMBER_N(Engine::CBaseCamera*, pCBaseCamera, 0x38);
DEFINE_MEMBER_N(bool, enableSpeedMultiplier1, 0x42);
DEFINE_MEMBER_N(bool, enableSpeedMultiplier2, 0x43);
@ -174,13 +226,43 @@ namespace GamePH {
class LevelDI {
public:
float GetTimePlayed();
bool IsLoading();
LPVOID GetViewCamera();
void SetViewCamera(LPVOID viewCam);
float GetTimePlayed();
TimeWeather::CSystem* GetTimeWeatherSystem();
static LevelDI* Get();
};
class gen_TPPModel {
public:
union {
DEFINE_MEMBER_N(bool, enableTPPModel1, 0x2CF9);
DEFINE_MEMBER_N(bool, enableTPPModel2, 0x2CFA);
};
static gen_TPPModel* Get();
};
class LocalClientDI {
public:
union {
DEFINE_MEMBER_N(gen_TPPModel*, pgen_TPPModel, 0x90);
};
static LocalClientDI* Get();
};
class SessionCooperativeDI {
public:
union {
DEFINE_MEMBER_N(LocalClientDI*, pLocalClientDI, 0xE08);
};
static SessionCooperativeDI* Get();
};
class GameDI_PH2 {
public:
static GameDI_PH2* Get();
@ -188,6 +270,11 @@ namespace GamePH {
class GameDI_PH {
public:
union {
DEFINE_MEMBER_N(SessionCooperativeDI*, pSessionCooperativeDI, 0xF0);
DEFINE_MEMBER_N(bool, blockPauseGameOnPlayerAfk, 0x830);
};
INT64 GetCurrentGameVersion();
void TogglePhotoMode(bool doNothing = false, bool setAsOptionalCamera = false);
@ -208,7 +295,7 @@ namespace Engine {
class CVideoSettings {
public:
union {
DEFINE_MEMBER_N(float, ExtraFOV, 0x7C);
DEFINE_MEMBER_N(float, extraFOV, 0x7C);
};
static CVideoSettings* Get();
@ -255,10 +342,10 @@ namespace Engine {
public:
union {
DEFINE_MEMBER_N(float, yaw, 0x48);
DEFINE_MEMBER_N(float, x, 0x4C);
DEFINE_MEMBER_N(float, X, 0x4C);
DEFINE_MEMBER_N(float, pitch, 0x58);
DEFINE_MEMBER_N(float, y, 0x5C);
DEFINE_MEMBER_N(float, z, 0x6C);
DEFINE_MEMBER_N(float, Y, 0x5C);
DEFINE_MEMBER_N(float, Z, 0x6C);
};
};

View File

@ -74,16 +74,14 @@ namespace Hook {
}
// Breakpoint hooking
static bool s_handlerCreated = false;
static std::vector<BreakpointHook*> s_hookList;
BreakpointHook::BreakpointHook(PDWORD64 addr, std::function<void(PEXCEPTION_POINTERS)> handler) {
m_addr = addr;
m_handler = handler;
m_originalBytes = *(BYTE*)m_addr;
m_originalBytes = *reinterpret_cast<BYTE*>(m_addr);
if (!s_handlerCreated)
AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)OnException);
AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)OnException);
s_hookList.push_back(this);
@ -93,14 +91,14 @@ namespace Hook {
DWORD oldProtection = 0;
VirtualProtect(m_addr, 1, PAGE_EXECUTE_READWRITE, &m_originalProtection);
*(BYTE*)m_addr = 0xCC;
*reinterpret_cast<BYTE*>(m_addr) = 0xCC;
VirtualProtect(m_addr, 1, m_originalProtection, &oldProtection);
}
void BreakpointHook::Disable() {
DWORD oldProtection = 0;
VirtualProtect(m_addr, 1, PAGE_EXECUTE_READWRITE, &oldProtection);
*(BYTE*)m_addr = m_originalBytes;
*reinterpret_cast<BYTE*>(m_addr) = m_originalBytes;
VirtualProtect(m_addr, 1, m_originalProtection, &oldProtection);
}
BreakpointHook::~BreakpointHook() {

View File

@ -1,26 +1,31 @@
#include <imgui.h>
#include "..\sigscan\offsets.h"
#include "..\game_classes.h"
#include "..\core.h"
#include "menu.h"
namespace Menu {
namespace Camera {
extern const int BaseFOV = 57;
int FOV = 57;
bool photoModeEnabled = false;
SMART_BOOL freeCamEnabled{};
float FreeCamSpeed = 2.0f;
SMART_BOOL photoModeEnabled;
bool thirdPersonCameraEnabled = false;
float DistanceBehindPlayer = 2.0f;
float HeightAbovePlayer = 1.35f;
SMART_BOOL freeCamEnabled{};
float freeCamSpeed = 2.0f;
SMART_BOOL thirdPersonCameraEnabled;
SMART_BOOL tpUseTPPModel;
float tpDistanceBehindPlayer = 2.0f;
float tpHeightAbovePlayer = 1.35f;
SMART_BOOL disablePhotoModeLimitsEnabled{};
bool teleportPlayerToCameraEnabled = false;
SMART_BOOL disableSafezoneFOVReductionEnabled{};
static float previousSafezoneFOVReductionVal = -50.0f;
static const int baseFOV = 57;
static const float baseSafezoneFOVReduction = -10.0f;
static LPVOID previousViewCam = nullptr;
static void UpdateFOVWhileMenuClosed() {
if (Menu::isOpen)
@ -30,10 +35,10 @@ namespace Menu {
if (!videoSettings)
return;
Menu::Camera::FOV = static_cast<int>(videoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
Menu::Camera::FOV = static_cast<int>(videoSettings->extraFOV) + Menu::Camera::baseFOV;
}
static void FreeCamUpdate() {
if (photoModeEnabled)
if (photoModeEnabled.value)
return;
GamePH::LevelDI* iLevel = GamePH::LevelDI::Get();
if (!iLevel)
@ -50,87 +55,45 @@ namespace Menu {
if (freeCamEnabled.value) {
if (viewCam == pFreeCam) {
if (!pFreeCam->enableSpeedMultiplier1)
pFreeCam->enableSpeedMultiplier1 = true;
if (pFreeCam->speedMultiplier != FreeCamSpeed)
pFreeCam->speedMultiplier = FreeCamSpeed;
pFreeCam->enableSpeedMultiplier1 = true;
pFreeCam->speedMultiplier = freeCamSpeed;
return;
}
pGameDI_PH->TogglePhotoMode();
pFreeCam->AllowCameraMovement(2);
GamePH::ShowTPPModel(true);
} else {
if (freeCamEnabled.previousValue) {
pFreeCam->enableSpeedMultiplier1 = false;
pFreeCam->speedMultiplier = 0.1f;
}
GamePH::FreeCamera* pFreeCam = GamePH::FreeCamera::Get();
if (!pFreeCam || viewCam != pFreeCam)
if (viewCam != pFreeCam)
return;
pGameDI_PH->TogglePhotoMode();
pFreeCam->AllowCameraMovement(0);
GamePH::ShowTPPModel(false);
}
}
static bool GetCamDisabledFlag() {
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;
}
static void UpdatePlayerVars() {
if (!GamePH::PlayerVariables::gotPlayerVars)
return;
if (disableSafezoneFOVReductionEnabled.value) {
auto it = std::find_if(GamePH::PlayerVariables::playerVars.begin(), GamePH::PlayerVariables::playerVars.end(), [](const auto& pair) {
return pair.first == "CameraDefaultFOVReduction";
});
if (it != GamePH::PlayerVariables::playerVars.end()) {
float* value = reinterpret_cast<float*>(it->second.first);
if (disableSafezoneFOVReductionEnabled.previousValue != disableSafezoneFOVReductionEnabled.value)
previousSafezoneFOVReductionVal = *value;
*value = 0.0f;
*(value + 1) = 0.0f;
}
GamePH::PlayerVariables::ChangePlayerVar("CameraDefaultFOVReduction", 0.0f);
disableSafezoneFOVReductionEnabled.previousValue = true;
} else if (disableSafezoneFOVReductionEnabled.previousValue != disableSafezoneFOVReductionEnabled.value) {
disableSafezoneFOVReductionEnabled.previousValue = false;
auto it = std::find_if(GamePH::PlayerVariables::playerVars.begin(), GamePH::PlayerVariables::playerVars.end(), [](const auto& pair) {
return pair.first == "CameraDefaultFOVReduction";
});
if (it != GamePH::PlayerVariables::playerVars.end()) {
float* value = reinterpret_cast<float*>(it->second.first);
*value = previousSafezoneFOVReductionVal;
*(value + 1) = previousSafezoneFOVReductionVal;
}
GamePH::PlayerVariables::ChangePlayerVar("CameraDefaultFOVReduction", baseSafezoneFOVReduction);
}
}
void Update() {
if (photoModeEnabled)
if (photoModeEnabled.value)
freeCamEnabled.Change(false);
else
freeCamEnabled.Restore();
@ -147,53 +110,36 @@ namespace Menu {
void Render() {
ImGui::SeparatorText("FreeCam");
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(photoModeEnabled); {
ImGui::Checkbox("Enabled##FreeCam", &freeCamEnabled.value);
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
ImGui::SliderFloat("Speed##FreeCam", &FreeCamSpeed, 0.0f, 100.0f);
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(photoModeEnabled); {
ImGui::Checkbox("Teleport Player to Camera", &teleportPlayerToCameraEnabled);
ImGui::EndDisabled();
}
ImGui::BeginDisabled(photoModeEnabled.value); {
ImGui::Checkbox("Enabled##FreeCam", &freeCamEnabled.value);
ImGui::EndDisabled();
}
ImGui::SliderFloat("Speed##FreeCam", &freeCamSpeed, 0.0f, 100.0f);
ImGui::Checkbox("Teleport Player to Camera", &teleportPlayerToCameraEnabled);
ImGui::SeparatorText("Third Person");
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(freeCamEnabled.value); {
ImGui::Checkbox("Enabled##ThirdPerson", &thirdPersonCameraEnabled);
ImGui::EndDisabled();
}
ImGui::SliderFloat("Distance behind player", &DistanceBehindPlayer, 1.0f, 10.0f);
ImGui::SliderFloat("Height above player", &HeightAbovePlayer, 1.0f, 3.0f);
ImGui::SeparatorText("Third Person Camera");
ImGui::BeginDisabled(freeCamEnabled.value || photoModeEnabled.value); {
ImGui::Checkbox("Enabled##ThirdPerson", &thirdPersonCameraEnabled.value);
ImGui::Checkbox("Use Third Person Player (TPP) Model", &tpUseTPPModel.value);
ImGui::EndDisabled();
}
ImGui::SliderFloat("Distance behind player", &tpDistanceBehindPlayer, 1.0f, 10.0f);
ImGui::SliderFloat("Height above player", &tpHeightAbovePlayer, 1.0f, 3.0f);
ImGui::SeparatorText("Misc");
Engine::CVideoSettings* pCVideoSettings = Engine::CVideoSettings::Get();
ImGui::BeginDisabled(!pCVideoSettings); {
if (ImGui::SliderInt("FOV", &FOV, 20, 160) && pCVideoSettings)
pCVideoSettings->ExtraFOV = static_cast<float>(FOV - BaseFOV);
pCVideoSettings->extraFOV = static_cast<float>(FOV - baseFOV);
else if (pCVideoSettings)
FOV = static_cast<int>(pCVideoSettings->ExtraFOV) + Menu::Camera::BaseFOV;
FOV = static_cast<int>(pCVideoSettings->extraFOV) + Menu::Camera::baseFOV;
ImGui::EndDisabled();
}
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(freeCamEnabled.value); {
ImGui::Checkbox("Disable PhotoMode Limits", &disablePhotoModeLimitsEnabled.value);
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
ImGui::BeginDisabled(!GamePH::PlayerVariables::gotPlayerVars); {
ImGui::Checkbox("Disable Safezone FOV Reduction", &disableSafezoneFOVReductionEnabled.value);
ImGui::BeginDisabled(freeCamEnabled.value); {
ImGui::Checkbox("Disable PhotoMode Limits", &disablePhotoModeLimitsEnabled.value);
ImGui::EndDisabled();
}
ImGui::Checkbox("Disable Safezone FOV Reduction", &disableSafezoneFOVReductionEnabled.value);
}
}
}

View File

@ -3,16 +3,17 @@
namespace Menu {
namespace Camera {
extern const int BaseFOV;
extern int FOV;
extern bool photoModeEnabled;
extern SMART_BOOL freeCamEnabled;
extern float FreeCamSpeed;
extern SMART_BOOL photoModeEnabled;
extern bool thirdPersonCameraEnabled;
extern float DistanceBehindPlayer;
extern float HeightAbovePlayer;
extern SMART_BOOL freeCamEnabled;
extern float freeCamSpeed;
extern SMART_BOOL thirdPersonCameraEnabled;
extern SMART_BOOL tpUseTPPModel;
extern float tpDistanceBehindPlayer;
extern float tpHeightAbovePlayer;
extern SMART_BOOL disablePhotoModeLimitsEnabled;
extern bool teleportPlayerToCameraEnabled;

View File

@ -11,9 +11,7 @@
namespace Menu {
namespace Player {
#pragma region PlayerVarsSCRString
extern const char playerVarsSCR[];
const char playerVarsSCR[] = { 0x73, 0x75, 0x62, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x09,
static const char playerVarsSCR[] = { 0x73, 0x75, 0x62, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x0D, 0x0A, 0x7B, 0x0D, 0x0A, 0x09,
0x50, 0x61, 0x72, 0x61, 0x6D, 0x28, 0x22, 0x41, 0x6E, 0x69, 0x6D, 0x47, 0x72, 0x61, 0x70, 0x68,
0x5F, 0x42, 0x61, 0x6E, 0x6B, 0x4E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x20, 0x22, 0x70, 0x6C, 0x61,
0x79, 0x65, 0x72, 0x22, 0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x28, 0x22,
@ -5995,9 +5993,6 @@ namespace Menu {
0x75, 0x72, 0x6E, 0x69, 0x6E, 0x67, 0x57, 0x65, 0x61, 0x70, 0x6F, 0x6E, 0x47, 0x72, 0x69, 0x70,
0x41, 0x75, 0x64, 0x69, 0x6F, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6E,
0x63, 0x65, 0x22, 0x2C, 0x20, 0x22, 0x38, 0x22, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0x0D, 0x0A };
#pragma endregion
static bool debugEnabled = false;
SMART_BOOL godModeEnabled{};
SMART_BOOL freezePlayerEnabled{};
@ -6006,45 +6001,33 @@ namespace Menu {
std::string saveSCRPath{};
std::string loadSCRFilePath{};
bool restoreVarsToSavedVarsEnabled = false;
static bool debugEnabled = false;
static bool restoreVarsToSavedVarsEnabled = false;
static char playerVarsSearchFilter[64];
static std::string getParamName(const std::string str) {
static std::string getParamName(const std::string &str) {
size_t firstQuotePos = str.find_first_of("\"");
size_t lastQuotePos = firstQuotePos;
if (firstQuotePos == std::string::npos)
return {};
bool foundQuote = false;
while (!foundQuote) {
lastQuotePos++;
char chr = str[lastQuotePos];
if (chr != '\"')
continue;
foundQuote = true;
}
size_t lastQuotePos = str.find_first_of("\"", firstQuotePos + 1);
if (lastQuotePos == std::string::npos)
return {};
return str.substr(firstQuotePos + 1, lastQuotePos - firstQuotePos - 1);
}
static std::string getParamValue(const std::string str) {
static std::string getParamValue(const std::string &str) {
size_t firstQuotePos = str.find_first_of("\"");
size_t lastQuotePos = firstQuotePos;
if (firstQuotePos == std::string::npos)
return {};
int foundQuote = 0;
while (foundQuote != 3) {
if (foundQuote < 2)
firstQuotePos++;
lastQuotePos++;
char chr = str[foundQuote < 2 ? firstQuotePos : lastQuotePos];
if (chr != '\"')
continue;
foundQuote++;
}
size_t secondQuotePos = str.find_first_of("\"", firstQuotePos + 1);
if (secondQuotePos == std::string::npos)
return {};
size_t thirdQuotePos = str.find_first_of("\"", secondQuotePos + 1);
if (thirdQuotePos == std::string::npos)
return {};
size_t lastQuotePos = str.find_first_of("\"", thirdQuotePos + 1);
if (lastQuotePos == std::string::npos)
return {};
return str.substr(firstQuotePos + 1, lastQuotePos - firstQuotePos - 1);
}
@ -6115,21 +6098,7 @@ namespace Menu {
if (paramValue.empty())
continue;
auto it = std::find_if(GamePH::PlayerVariables::playerVars.begin(), GamePH::PlayerVariables::playerVars.end(), [&paramName](const auto& pair) {
return pair.first == paramName;
});
if (it == GamePH::PlayerVariables::playerVars.end())
continue;
if (it->second.second == "float") {
float* value = reinterpret_cast<float*>(it->second.first);
*value = std::stof(paramValue);
*(value + 1) = *value;
} else {
bool* value = reinterpret_cast<bool*>(it->second.first);
*value = paramValue == "true";
*(value + 1) = *value;
}
GamePH::PlayerVariables::ChangePlayerVar(paramName, paramValue);
}
file.close();
@ -6148,15 +6117,10 @@ namespace Menu {
if (itDef == defVars.end())
continue;
if (val.second == "float") {
float* varAddr = reinterpret_cast<float*>(val.first);
*varAddr = std::any_cast<float>(itDef->second.first);
*(varAddr + 1) = *varAddr;
} else if (val.second == "bool") {
bool* varAddr = reinterpret_cast<bool*>(val.first);
*varAddr = std::any_cast<bool>(itDef->second.first);
*(varAddr + 1) = *varAddr;
}
if (val.second == "float")
GamePH::PlayerVariables::ChangePlayerVar(key, std::any_cast<float>(itDef->second.first));
else
GamePH::PlayerVariables::ChangePlayerVar(key, std::any_cast<bool>(itDef->second.first));
}
ImGui::OpenPopup("Restored player variables!");
@ -6173,39 +6137,28 @@ namespace Menu {
continue;
if (val.second == "float") {
float* varAddr = reinterpret_cast<float*>(val.first);
float* const varAddr = reinterpret_cast<float*>(val.first);
itCustomDef->second.first = *varAddr;
} else if (val.second == "bool") {
bool* varAddr = reinterpret_cast<bool*>(val.first);
bool* const varAddr = reinterpret_cast<bool*>(val.first);
itCustomDef->second.first = *varAddr;
}
}
ImGui::OpenPopup("Saved current player variables!");
}
static void RestoreVariableToDefault(LPVOID variable) {
auto it = std::find_if(GamePH::PlayerVariables::playerVars.begin(), GamePH::PlayerVariables::playerVars.end(), [&variable](const auto& pair) {
return pair.second.first == variable;
});
if (it == GamePH::PlayerVariables::playerVars.end())
return;
static void RestoreVariableToDefault(const std::string& varName) {
auto& defVars = restoreVarsToSavedVarsEnabled ? GamePH::PlayerVariables::playerCustomVarsDefault : GamePH::PlayerVariables::playerVarsDefault;
auto itDef = std::find_if(defVars.begin(), defVars.end(), [&it](const auto& pair) {
return pair.first == it->first;
auto itDef = std::find_if(defVars.begin(), defVars.end(), [&varName](const auto& pair) {
return pair.first == varName;
});
if (itDef == defVars.end())
return;
if (it->second.second == "float") {
float* varAddr = reinterpret_cast<float*>(it->second.first);
*varAddr = std::any_cast<float>(itDef->second.first);
*(varAddr + 1) = *varAddr;
} else if (it->second.second == "bool") {
bool* varAddr = reinterpret_cast<bool*>(it->second.first);
*varAddr = std::any_cast<bool>(itDef->second.first);
*(varAddr + 1) = *varAddr;
}
if (itDef->second.second == "float")
GamePH::PlayerVariables::ChangePlayerVar(varName, std::any_cast<float>(itDef->second.first));
else
GamePH::PlayerVariables::ChangePlayerVar(varName, std::any_cast<bool>(itDef->second.first));
}
static void PlayerPositionUpdate() {
@ -6213,30 +6166,32 @@ namespace Menu {
if (!playerCharacter)
return;
if (!Menu::Player::freezePlayerEnabled.value) {
Engine::CBulletPhysicsCharacter::posBeforeFreeze = playerCharacter->playerPos;
if (!Menu::Camera::freeCamEnabled.value)
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
if (Menu::Player::freezePlayerEnabled.value) {
playerCharacter->FreezeCharacter();
return;
}
Engine::CBulletPhysicsCharacter::posBeforeFreeze = playerCharacter->playerPos;
if (!Menu::Camera::freeCamEnabled.value || !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);
}
void UpdatePlayerVars() {
static void UpdatePlayerVars() {
if (!playerVariablesEnabled)
return;
auto bgn = GamePH::PlayerVariables::playerVars.begin();
for (auto it = bgn; it != GamePH::PlayerVariables::playerVars.end(); ++it) {
if (!it->second.first)
@ -6263,17 +6218,16 @@ namespace Menu {
void Update() {
if (Menu::Camera::freeCamEnabled.value)
godModeEnabled.Change(true);
else if (!Menu::Camera::freeCamEnabled.value)
else
godModeEnabled.Restore();
if (Menu::Camera::freeCamEnabled.value)
freezePlayerEnabled.Change(!Menu::Camera::teleportPlayerToCameraEnabled);
else if (!Menu::Camera::freeCamEnabled.value)
else
freezePlayerEnabled.Restore();
PlayerPositionUpdate();
if (playerVariablesEnabled)
UpdatePlayerVars();
UpdatePlayerVars();
}
void Render() {
@ -6290,7 +6244,10 @@ namespace Menu {
ImGui::SeparatorText("Player Variables");
ImGui::Checkbox("Enabled##PlayerVars", &playerVariablesEnabled);
ImGui::BeginDisabled(!playerVariablesEnabled || !GamePH::PlayerVariables::gotPlayerVars); {
if (!playerVariablesEnabled)
return;
ImGui::BeginDisabled(!GamePH::PlayerVariables::gotPlayerVars); {
if (ImGui::CollapsingHeader("Player variables list", ImGuiTreeNodeFlags_None)) {
ImGui::Indent();
if (ImGui::Button("Save variables to file"))
@ -6336,7 +6293,7 @@ namespace Menu {
ImGui::SameLine();
restoreBtnName = std::string("Restore##") + std::string(key);
if (ImGui::Button(restoreBtnName.c_str()))
RestoreVariableToDefault(val.first);
RestoreVariableToDefault(key);
if (debugEnabled) {
ImGui::SameLine();
ImGui::Text("0x%p", varAddr);
@ -6353,7 +6310,7 @@ namespace Menu {
ImGui::SameLine();
restoreBtnName = std::string("Restore##") + std::string(key);
if (ImGui::Button(restoreBtnName.c_str()))
RestoreVariableToDefault(val.first);
RestoreVariableToDefault(key);
if (debugEnabled) {
ImGui::SameLine();
ImGui::Text("0x%p", varAddr);

View File

@ -4,7 +4,6 @@
namespace Menu {
namespace Player {
extern const char playerVarsSCR[];
extern SMART_BOOL godModeEnabled;
extern SMART_BOOL freezePlayerEnabled;
extern bool playerVariablesEnabled;
@ -12,8 +11,6 @@ namespace Menu {
extern std::string saveSCRPath;
extern std::string loadSCRFilePath;
extern bool restoreVarsToSavedVarsEnabled;
extern void Update();
extern void Render();
}

View File

@ -10,48 +10,53 @@ static retType Get_## name () {\
}
#define AddStaticOffset(name, off) \
static DWORD64 Get_## name () {\
static DWORD64 name = NULL;\
static DWORD64 name = 0;\
if (name) return name; \
return name=static_cast<DWORD64>(off);\
}
struct Offsets {
// ntdll.dll
//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
//AddOffset(LdrpCallInitRoutine, "ntdll.dll", "[48 89 5C 24 08 44 89 44 24 18 48", PatternType::Address, PDWORD64)
//AddOffset(LdrpRunInitializeRoutines, "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_CInput, "engine_x64_rwdi.dll", "48 8B 0D [?? ?? ?? ?? 48 85 C9 74 0F 48 8B 01 84 D2", PatternType::RelativePointer, PDWORD64*)
// Player vars related
AddStaticOffset(LoadPlayerVariableFuncSize, 0x14E)
AddOffset(LoadPlayerFloatVariableOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B D0 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 94 24 ?? ?? ?? ?? 48 8B 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B 84 24 ?? ?? ?? ??", PatternType::RelativePointer, PDWORD64);
AddOffset(InitializePlayerVariablesOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B F0 48 8B CF", PatternType::RelativePointer, DWORD64)
AddStaticOffset(initPlayerFloatVarsInstrOffset, 0x99);
AddStaticOffset(initPlayerBoolVarsInstrOffset, 0x2E7);
AddOffset(PlayerStateOffset, "gamedll_ph_x64_rwdi.dll", "4C 8B 35 [?? ?? ?? ?? 4C 8B E2", PatternType::RelativePointer, LPVOID)
AddStaticOffset(LoadPlayerVariableFunc_size, 0x14E)
AddOffset(LoadPlayerFloatVariable, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B D0 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 94 24 ?? ?? ?? ?? 48 8B 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B 84 24 ?? ?? ?? ??", PatternType::RelativePointer, PDWORD64);
AddOffset(InitializePlayerVariables, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B F0 48 8B CF", PatternType::RelativePointer, DWORD64)
AddStaticOffset(initPlayerFloatVarsInstr_offset, 0x99);
AddStaticOffset(initPlayerBoolVarsInstr_offset, 0x2E7);
AddOffset(PlayerState, "gamedll_ph_x64_rwdi.dll", "4C 8B 35 [?? ?? ?? ?? 4C 8B E2", PatternType::RelativePointer, LPVOID)
// Game related
AddStaticOffset(gameDI_PH2_offset, 0x28)
AddOffset(CLobbySteamOffset, "engine_x64_rwdi.dll", "48 8B 05 [?? ?? ?? ?? 48 85 C0 74 05 48 83 C0 08 C3", PatternType::RelativePointer, LPVOID)
AddOffset(CLobbySteam, "engine_x64_rwdi.dll", "48 8B 05 [?? ?? ?? ?? 48 85 C0 74 05 48 83 C0 08 C3", PatternType::RelativePointer, LPVOID)
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_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)
AddOffset(CameraFPPDI_VT, "gamedll_ph_x64_rwdi.dll", "48 8D 05 [?? ?? ?? ?? 48 89 07 48 8D 4F 60", PatternType::RelativePointer, DWORD64)
// Functions
AddOffset(ReadVideoSettingsOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 4C 24 ?? FF 15 ?? ?? ?? ?? 48 C7 C2 ?? ?? ?? ??", PatternType::RelativePointer, LPVOID)
AddOffset(CalculateFreeCamCollisionOffset, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B 06 4C 8D 4C 24 ??", PatternType::RelativePointer, LPVOID)
AddOffset(GetViewCameraOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 85 C0 74 28 48 8B C8", 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(ReadVideoSettings, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8D 4C 24 ?? FF 15 ?? ?? ?? ?? 48 C7 C2 ?? ?? ?? ??", PatternType::RelativePointer, LPVOID)
AddOffset(CalculateFreeCamCollision, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B 06 4C 8D 4C 24 ??", PatternType::RelativePointer, LPVOID)
AddOffset(GetViewCamera, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 85 C0 74 28 48 8B C8", PatternType::RelativePointer, LPVOID)
AddOffset(CreatePlayerHealthModule, "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(TogglePhotoMode, "gamedll_ph_x64_rwdi.dll", "48 83 EC 48 38 91 ?? ?? ?? ??", PatternType::Address, LPVOID)
AddOffset(GetTimeWeatherSystemOffset, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 33 D2 48 8B C8 E8 ?? ?? ?? ?? 49 8D 4F 38", 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)
AddOffset(MoveCamera, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 41 8D 45 D6", PatternType::RelativePointer, LPVOID)
AddOffset(OnUpdate_ChangeMap, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 88 44 24 20 48 8B 84 24 ?? ?? ?? ?? 48 83 78 ?? ??", PatternType::RelativePointer, LPVOID)
AddOffset(ShowTPPModelFunc2, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 45 8D 45 40", PatternType::RelativePointer, LPVOID)
AddOffset(ShowTPPModelFunc3, "gamedll_ph_x64_rwdi.dll", "E9 [?? ?? ?? ?? 48 85 D2 74 0A", PatternType::RelativePointer, LPVOID)
AddOffset(GetTimeWeatherSystem, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 33 D2 48 8B C8 E8 ?? ?? ?? ?? 49 8D 4F 38", PatternType::RelativePointer, LPVOID)
AddOffset(SetForcedWeather, "engine_x64_rwdi.dll", "89 51 68 C3 CC CC CC CC CC CC CC CC CC CC CC CC", PatternType::Address, LPVOID)
AddOffset(GetCurrentWeather, "engine_x64_rwdi.dll", "48 8B 41 78 48 85 C0 75 0F", PatternType::Address, LPVOID)
AddOffset(MoveCameraFromForwardUpPos, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 48 8B 03 48 8B CB F3 0F 10 9B ?? ?? ?? ??", PatternType::RelativePointer, LPVOID)
AddOffset(GetForwardVector, "engine_x64_rwdi.dll", "4C 8B 41 38 41 8B 40 48", PatternType::Address, LPVOID)
AddOffset(GetUpVector, "engine_x64_rwdi.dll", "4C 8B 41 38 41 8B 40 44", PatternType::Address, LPVOID)
AddOffset(IsLoading, "engine_x64_rwdi.dll", "48 8B 05 ?? ?? ?? ?? 48 8B 51 38", PatternType::Address, LPVOID)
};
#undef AddOffset

View File

@ -161,7 +161,7 @@ LPVOID PatternScanner::FindPattern(LPVOID startAddress, DWORD64 searchSize, cons
return ret;
}
LPVOID PatternScanner::FindPattern(LPVOID startAddress, DWORD64 searchSize, Pattern *patterns, float *ratio) {
LPVOID PatternScanner::FindPattern(LPVOID startAddress, DWORD64 searchSize, const Pattern* patterns, float *ratio) {
int totalCount = 0;
struct result {
LPVOID addr;
@ -184,18 +184,16 @@ LPVOID PatternScanner::FindPattern(LPVOID startAddress, DWORD64 searchSize, Patt
continue;
bool found = false;
for (result &res : results) {
if (res.addr == addr) {
res.count++;
auto it = std::find_if(results.begin(), results.end(), [addr](result& res) { return res.addr == addr; });
if (it != results.end()) {
it->count++;
if (res.count > bestCount) {
ret = addr;
bestCount = res.count;
}
found = true;
break;
if (it->count > bestCount) {
ret = addr;
bestCount = it->count;
}
found = true;
}
if (!found) {

View File

@ -51,6 +51,6 @@ public:
static std::vector<LPVOID> FindPatterns(const std::string_view ModuleName, const Pattern &pattern);
static std::vector<LPVOID> FindPatterns(LPVOID startAddress, DWORD64 searchSize, const Pattern &pattern);
static LPVOID FindPattern(LPVOID startAddress, DWORD64 searchSize, Pattern *patterns, float *ratio = nullptr);
static LPVOID FindPattern(const std::string_view ModuleName, Pattern *patterns, float *ratio = nullptr);
static LPVOID FindPattern(LPVOID startAddress, DWORD64 searchSize, const Pattern* patterns, float *ratio = nullptr);
static LPVOID FindPattern(const std::string_view ModuleName, Pattern* patterns, float *ratio = nullptr);
};

View File

@ -11,6 +11,13 @@ namespace Utils {
extern bool are_same(float a, float b);
extern bool str_replace(std::string& str, const std::string& from, const std::string& to);
template <typename T>
auto to_string(T val) {
if constexpr (std::is_same<T, std::string>::value)
return static_cast<std::string>(val);
else
return std::to_string(val);
}
extern std::string_view GetDesktopDir();
extern WindowsVersion GetWindowsVersion();

View File

@ -8,6 +8,7 @@ DisableSafezoneFOVReduction=1
DistanceBehindPlayer=2
Enabled=0
HeightAbovePlayer=1.35
UseTPPModel=1
[Menu]
Transparency=99
[Menu:Keybinds]