mirror of
https://github.com/EricPlayZ/EGameTools.git
synced 2025-07-18 17:37:53 +08:00
Fixed most Third Person bugs, added TPP model, cleaned the code up a bit
This commit is contained in:
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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(), [¶mName](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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
};
|
@ -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();
|
||||
|
@ -8,6 +8,7 @@ DisableSafezoneFOVReduction=1
|
||||
DistanceBehindPlayer=2
|
||||
Enabled=0
|
||||
HeightAbovePlayer=1.35
|
||||
UseTPPModel=1
|
||||
[Menu]
|
||||
Transparency=99
|
||||
[Menu:Keybinds]
|
||||
|
Reference in New Issue
Block a user