Added Third Person Camera mode with adjustable settings; added toggle for Player Variables in case of bad bugs, leaving the player with the ability to completely disable anything that writes to their values; organized the menu a tad bit more :D

This commit is contained in:
EricPlayZ
2024-01-08 06:08:20 +02:00
parent 8a432ff8e2
commit 8dddfd427c
12 changed files with 215 additions and 50 deletions
+34 -11
View File
@@ -1,4 +1,5 @@
#include <filesystem>
#include "..\menu\menu.h"
#include "..\menu\player.h"
#include "..\menu\camera.h"
#include "..\utils.h"
@@ -4075,26 +4076,29 @@ namespace Config {
static void LoadDefaultConfig() {
reader = inih::INIReader();
reader.InsertEntry("Menu", "Transparency", 99.5f);
reader.InsertEntry("Menu:Keybinds", "ToggleKey", "VK_F5");
menuToggleKey = VK_F5;
reader.InsertEntry("Player:PlayerVariables", "UseBACKUPPlayerVars", false);
reader.InsertEntry("Player:Misc", "GodMode", false);
reader.InsertEntry("Player:PlayerVariables", "Enabled", false);
const std::filesystem::path desktopPath = Utils::GetDesktopDir();
std::string desktopPathStr = desktopPath.string();
if (!desktopPath.empty() && !(std::filesystem::is_directory(desktopPath.parent_path()) && std::filesystem::is_directory(desktopPath)))
desktopPathStr = {};
reader.InsertEntry("Player:PlayerVariables", "LastSaveSCRPath", desktopPathStr);
Menu::Player::saveSCRPath = desktopPathStr;
const std::string loadSCRFilePath = desktopPathStr.empty() ? "" : desktopPathStr + "\\player_variables.scr";
reader.InsertEntry("Player:PlayerVariables", "LastLoadSCRFilePath", loadSCRFilePath);
Menu::Player::loadSCRFilePath = loadSCRFilePath;
reader.InsertEntry("Camera", "DisablePhotoModeLimits", true);
reader.InsertEntry("Camera", "DisableSafezoneFOVReduction", true);
reader.InsertEntry("Camera:FreeCam", "Speed", 2.0f);
reader.InsertEntry("Camera:FreeCam", "TeleportPlayerToCamera", false);
reader.InsertEntry("Camera:ThirdPerson", "Enabled", false);
reader.InsertEntry("Camera:ThirdPerson", "DistanceBehindPlayer", 2.0f);
reader.InsertEntry("Camera:ThirdPerson", "HeightAbovePlayer", 1.35f);
reader.InsertEntry("Camera:Misc", "DisablePhotoModeLimits", true);
reader.InsertEntry("Camera:Misc", "DisableSafezoneFOVReduction", true);
}
static void LoadAndWriteDefaultConfig() {
LoadDefaultConfig();
@@ -4116,6 +4120,9 @@ namespace Config {
static void ReadConfig(const bool configUpdate = false) {
try {
reader = inih::INIReader(configFileName);
Menu::transparency = reader.Get<float>("Menu", "Transparency", 99.5f);
const std::string toggleKey = reader.Get<std::string>("Menu:Keybinds", "ToggleKey");
auto it = virtualKeyCodes.find(toggleKey);
if (it != virtualKeyCodes.end())
@@ -4123,6 +4130,9 @@ namespace Config {
else
menuToggleKey = VK_F5;
Menu::Player::godModeEnabled.value = reader.Get<bool>("Player:Misc", "GodMode", false);
Menu::Player::playerVariablesEnabled = reader.Get<bool>("Player:PlayerVariables", "Enabled", false);
const std::filesystem::path desktopPath = Utils::GetDesktopDir();
std::string desktopPathStr = desktopPath.string();
if (!desktopPath.empty() && !(std::filesystem::is_directory(desktopPath.parent_path()) && std::filesystem::is_directory(desktopPath)))
@@ -4146,8 +4156,13 @@ namespace Config {
if (!loadSCRFilePath.empty() && !std::filesystem::is_directory(loadSCRFilePath.parent_path()))
Menu::Player::loadSCRFilePath = {};
Menu::Camera::disablePhotoModeLimitsEnabled.value = reader.Get<bool>("Camera", "DisablePhotoModeLimits", true);
Menu::Camera::disableSafezoneFOVReductionEnabled.value = reader.Get<bool>("Camera", "DisableSafezoneFOVReduction", true);
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::disablePhotoModeLimitsEnabled.value = reader.Get<bool>("Camera:Misc", "DisablePhotoModeLimits", true);
Menu::Camera::disableSafezoneFOVReductionEnabled.value = reader.Get<bool>("Camera:Misc", "DisableSafezoneFOVReduction", true);
configStatus = PrintSuccess(configUpdate ? "Successfully read updated config!" : "Successfully read config!");
} catch (const std::runtime_error& e) {
@@ -4158,11 +4173,19 @@ namespace Config {
}
void SaveConfig() {
reader.UpdateEntry("Menu", "Transparency", Menu::transparency);
reader.UpdateEntry("Player:Misc", "GodMode", Menu::Player::godModeEnabled.value);
reader.UpdateEntry("Player:PlayerVariables", "Enabled", Menu::Player::playerVariablesEnabled);
reader.UpdateEntry("Player:PlayerVariables", "LastSaveSCRPath", Menu::Player::saveSCRPath);
reader.UpdateEntry("Player:PlayerVariables", "LastLoadSCRFilePath", Menu::Player::loadSCRFilePath);
reader.UpdateEntry("Camera", "DisablePhotoModeLimits", Menu::Camera::disablePhotoModeLimitsEnabled.value);
reader.UpdateEntry("Camera", "DisableSafezoneFOVReduction", Menu::Camera::disableSafezoneFOVReductionEnabled.value);
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:Misc", "DisablePhotoModeLimits", Menu::Camera::disablePhotoModeLimitsEnabled.value);
reader.UpdateEntry("Camera:Misc", "DisableSafezoneFOVReduction", Menu::Camera::disableSafezoneFOVReductionEnabled.value);
try {
inih::INIWriter writer{};
+1 -1
View File
@@ -135,7 +135,7 @@ namespace Core {
GamePH::LoopHookCalculateFreeCamCollision();
GamePH::LoopHookLifeSetHealth();
GamePH::LoopHookTogglePhotoMode();
//GamePH::LoopHookMoveCamera();
GamePH::LoopHookMoveCamera();
const HANDLE proc = GetCurrentProcess();
WaitForSingleObject(proc, INFINITE);
+59 -5
View File
@@ -143,11 +143,31 @@ namespace GamePH {
#pragma endregion
#pragma region MoveCamera
static void(*pMoveCamera)(LPVOID pCBaseCamera, DWORD* pos, float* a3, float* a4) = nullptr;
static void(*oMoveCamera)(LPVOID pCBaseCamera, DWORD* pos, float* a3, float* a4) = nullptr;
void detourMoveCamera(LPVOID pCBaseCamera, DWORD* pos, float* a3, float* a4) {
if (Menu::Camera::freeCamEnabled.value)
return;
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;
}
CameraFPPDI* viewCam = static_cast<CameraFPPDI*>(iLevel->GetViewCamera());
if (!viewCam) {
oMoveCamera(pCBaseCamera, pos, a3, a4);
return;
}
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;
}
oMoveCamera(pCBaseCamera, pos, a3, a4);
}
@@ -327,7 +347,27 @@ 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();
return nullptr;
}
return pGetForwardVector(this, outForwardVec);
}
Vector3* CameraFPPDI::GetUpVector(Vector3* outUpVec) {
if (!pGetUpVector) {
pGetUpVector = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
return nullptr;
}
return pGetUpVector(this, outUpVec);
}
Vector3* CameraFPPDI::GetPosition(Vector3* posIN) {
return Memory::CallVT<181, Vector3*>(this, posIN);
}
CameraFPPDI* CameraFPPDI::Get() {
__try {
PDWORD64 pg_CameraFPPDI = Offsets::Get_g_CameraFPPDI();
@@ -346,6 +386,20 @@ namespace GamePH {
#pragma endregion
#pragma region FreeCamera
Vector3* FreeCamera::GetForwardVector(Vector3* outForwardVec) {
if (!pGetForwardVector) {
pGetForwardVector = (decltype(pGetForwardVector))Offsets::Get_GetForwardVector();
return nullptr;
}
return pGetForwardVector(this, outForwardVec);
}
Vector3* FreeCamera::GetUpVector(Vector3* outUpVec) {
if (!pGetUpVector) {
pGetUpVector = (decltype(pGetUpVector))Offsets::Get_GetUpVector();
return nullptr;
}
return pGetUpVector(this, outUpVec);
}
Vector3* FreeCamera::GetPosition(Vector3* posIN) {
return Memory::CallVT<181, Vector3*>(this, posIN);
}
+47 -8
View File
@@ -15,17 +15,46 @@
// Game structs
struct Vector3 {
float X;
float Y;
float Z;
float X, Y, Z;
Vector3() {
X = 0.0f;
Y = 0.0f;
Z = 0.0f;
Vector3& operator+=(const Vector3& v) {
X += v.X;
Y += v.Y;
Z += v.Z;
return *this;
}
Vector3& operator-=(const Vector3& v) {
X -= v.X;
Y -= v.Y;
Z -= v.Z;
return *this;
}
Vector3 operator+(const Vector3& v) const {
return { X + v.X, Y + v.Y, Z + v.Z };
}
Vector3 operator-(const Vector3& v) const {
return { X - v.X, Y - v.Y, Z - v.Z };
}
Vector3 operator*(float scalar) const {
return { X * scalar, Y * scalar, Z * scalar };
}
Vector3 operator/(float scalar) const {
return { X / scalar, Y / scalar, Z / scalar };
}
bool isDefault() {
Vector3 normalize() {
float length = std::sqrt(X * X + Y * Y + Z * Z);
return { X / length, Y / length, Z / length };
}
Vector3 cross(const Vector3& v) const {
return {
Y * v.Z - Z * v.Y,
Z * v.X - X * v.Z,
X * v.Y - Y * v.X
};
}
bool isDefault() const {
return X == 0.0f && Y == 0.0f && Z == 0.0f;
}
};
@@ -92,6 +121,14 @@ namespace GamePH {
class CameraFPPDI {
public:
union {
DEFINE_MEMBER_N(Engine::CBaseCamera*, pCBaseCamera, 0x38);
};
Vector3* GetForwardVector(Vector3* outForwardVec);
Vector3* GetUpVector(Vector3* outUpVec);
Vector3* GetPosition(Vector3* posIN);
static CameraFPPDI* Get();
};
@@ -104,6 +141,8 @@ namespace GamePH {
DEFINE_MEMBER_N(float, speedMultiplier, 0x1CC);
};
Vector3* GetForwardVector(Vector3* outForwardVec);
Vector3* GetUpVector(Vector3* outUpVec);
Vector3* GetPosition(Vector3* posIN);
void AllowCameraMovement(int mode = 2);
+31 -13
View File
@@ -7,10 +7,15 @@ namespace Menu {
namespace Camera {
extern const int BaseFOV = 57;
int FOV = 57;
float FreeCamSpeed = 1.0f;
bool photoModeEnabled = false;
SMART_BOOL freeCamEnabled{};
float FreeCamSpeed = 2.0f;
bool thirdPersonCameraEnabled = false;
float DistanceBehindPlayer = 2.0f;
float HeightAbovePlayer = 1.35f;
SMART_BOOL disablePhotoModeLimitsEnabled{};
bool teleportPlayerToCameraEnabled = false;
@@ -61,8 +66,8 @@ namespace Menu {
pFreeCam->speedMultiplier = 0.1f;
}
GamePH::CameraFPPDI* pPlayerCam = GamePH::CameraFPPDI::Get();
if (!pPlayerCam || viewCam == pPlayerCam)
GamePH::FreeCamera* pFreeCam = GamePH::FreeCamera::Get();
if (!pFreeCam || viewCam != pFreeCam)
return;
pGameDI_PH->TogglePhotoMode();
@@ -141,28 +146,35 @@ namespace Menu {
}
void Render() {
ImGui::SeparatorText("FreeCam");
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(photoModeEnabled); {
ImGui::Checkbox("FreeCam", &freeCamEnabled.value);
ImGui::Checkbox("Enabled##FreeCam", &freeCamEnabled.value);
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
ImGui::SameLine();
ImGui::SliderFloat("FreeCam Speed", &FreeCamSpeed, 0.0f, 100.0f);
ImGui::SliderFloat("Speed##FreeCam", &FreeCamSpeed, 0.0f, 100.0f);
ImGui::BeginDisabled(GetCamDisabledFlag()); {
ImGui::BeginDisabled(freeCamEnabled.value); {
ImGui::Checkbox("Disable PhotoMode Limits", &disablePhotoModeLimitsEnabled.value);
ImGui::EndDisabled();
}
ImGui::SameLine();
ImGui::BeginDisabled(photoModeEnabled); {
ImGui::Checkbox("Teleport Player to Camera", &teleportPlayerToCameraEnabled);
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
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::EndDisabled();
}
ImGui::SeparatorText("Misc");
Engine::CVideoSettings* pCVideoSettings = Engine::CVideoSettings::Get();
ImGui::BeginDisabled(!pCVideoSettings); {
if (ImGui::SliderInt("FOV", &FOV, 20, 160) && pCVideoSettings)
@@ -171,7 +183,13 @@ namespace Menu {
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::EndDisabled();
@@ -8,6 +8,12 @@ namespace Menu {
extern bool photoModeEnabled;
extern SMART_BOOL freeCamEnabled;
extern float FreeCamSpeed;
extern bool thirdPersonCameraEnabled;
extern float DistanceBehindPlayer;
extern float HeightAbovePlayer;
extern SMART_BOOL disablePhotoModeLimitsEnabled;
extern bool teleportPlayerToCameraEnabled;
+11 -3
View File
@@ -9,10 +9,14 @@ namespace Menu {
static const ImVec2 maxWndSize = ImVec2(900.0f, 675.0f);
bool isOpen = false;
float transparency = 99.5f;
void Render() {
ImGuiStyle* style = &ImGui::GetStyle();
style->Colors[ImGuiCol_WindowBg] = ImVec4(style->Colors[ImGuiCol_WindowBg].x, style->Colors[ImGuiCol_WindowBg].y, style->Colors[ImGuiCol_WindowBg].z, static_cast<float>(transparency) / 100.0f);
ImGui::SetNextWindowSizeConstraints(minWndSize, maxWndSize);
ImGui::Begin("EGameTools", &Menu::isOpen, windowFlags); {
ImGui::Begin("EGameTools", &Menu::isOpen, windowFlags); {
if (ImGui::BeginTabBar("##MainTabBar")) {
if (ImGui::BeginTabItem("Player")) {
Menu::Player::Render();
@@ -28,7 +32,11 @@ namespace Menu {
}
ImGui::EndTabBar();
}
ImGui::End();
}
ImGui::Separator();
ImGui::SliderFloat("Menu Transparency", &transparency, 0.0f, 100.0f, "%d%%%", ImGuiSliderFlags_AlwaysClamp);
ImGui::End();
}
}
}
+1
View File
@@ -3,6 +3,7 @@
namespace Menu {
extern bool isOpen;
extern float transparency;
extern void Render();
}
+9 -5
View File
@@ -6001,6 +6001,7 @@ namespace Menu {
SMART_BOOL godModeEnabled{};
SMART_BOOL freezePlayerEnabled{};
bool playerVariablesEnabled = false;
std::string saveSCRPath{};
std::string loadSCRFilePath{};
@@ -6271,12 +6272,12 @@ namespace Menu {
freezePlayerEnabled.Restore();
PlayerPositionUpdate();
UpdatePlayerVars();
if (playerVariablesEnabled)
UpdatePlayerVars();
}
void Render() {
ImGui::Checkbox("Debug", &debugEnabled);
ImGui::SeparatorText("Misc");
ImGui::BeginDisabled(!GamePH::PlayerHealthModule::Get() || Menu::Camera::freeCamEnabled.value); {
ImGui::Checkbox("God Mode", &godModeEnabled.value);
ImGui::EndDisabled();
@@ -6287,8 +6288,10 @@ namespace Menu {
ImGui::EndDisabled();
}
ImGui::BeginDisabled(!GamePH::PlayerVariables::gotPlayerVars); {
if (ImGui::CollapsingHeader("Player Variables", ImGuiTreeNodeFlags_None)) {
ImGui::SeparatorText("Player Variables");
ImGui::Checkbox("Enabled##PlayerVars", &playerVariablesEnabled);
ImGui::BeginDisabled(!playerVariablesEnabled || !GamePH::PlayerVariables::gotPlayerVars); {
if (ImGui::CollapsingHeader("Player variables list", ImGuiTreeNodeFlags_None)) {
ImGui::Indent();
if (ImGui::Button("Save variables to file"))
ImGuiFileDialog::Instance()->OpenDialog("ChooseSCRPath", "Choose Folder", nullptr, saveSCRPath.empty() ? "." : saveSCRPath);
@@ -6297,6 +6300,7 @@ namespace Menu {
ImGuiFileDialog::Instance()->OpenDialog("ChooseSCRLoadPath", "Choose File", ".scr", loadSCRFilePath.empty() ? "." : loadSCRFilePath);
ImGui::Checkbox("Restore variables to saved variables", &restoreVarsToSavedVarsEnabled);
ImGui::Checkbox("Debug (show memory addresses)", &debugEnabled);
if (ImGui::Button("Restore variables to default"))
RestoreVariablesToDefault();
@@ -7,6 +7,7 @@ namespace Menu {
extern const char playerVarsSCR[];
extern SMART_BOOL godModeEnabled;
extern SMART_BOOL freezePlayerEnabled;
extern bool playerVariablesEnabled;
extern std::string saveSCRPath;
extern std::string loadSCRFilePath;
@@ -17,8 +17,8 @@ static DWORD64 Get_## name () {\
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(LdrpCallInitRoutineOffset, "ntdll.dll", "[48 89 5C 24 08 44 89 44 24 18 48", PatternType::Address, PDWORD64)
//AddOffset(LdrpRunInitializeRoutinesOffset, "ntdll.dll", "[48 89 4C 24 08 53 56 57 41 54 41 55 41 56 41 57 48 81 EC 90", PatternType::Address, PDWORD64) // for win7
// Input related
AddOffset(g_CInput, "engine_x64_rwdi.dll", "48 8B 0D [?? ?? ?? ?? 48 85 C9 74 0F 48 8B 01 84 D2", PatternType::RelativePointer, PDWORD64*)
@@ -43,13 +43,15 @@ struct Offsets {
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(CreatePlayerHealthModuleOffset, "gamedll_ph_x64_rwdi.dll", "48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 4C 8B F1 E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ??", PatternType::Address, LPVOID)
AddOffset(LifeSetHealth, "gamedll_ph_x64_rwdi.dll", "E8 [?? ?? ?? ?? 49 8D 4C 24 ?? 49 03 CE", PatternType::RelativePointer, LPVOID)
AddOffset(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::Address, LPVOID)
AddOffset(MoveCamera, "engine_x64_rwdi.dll", "E8 [?? ?? ?? ?? 41 8D 45 D6", 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)
};
#undef AddOffset