diff --git a/EGameTools/EGameTools.vcxproj b/EGameTools/EGameTools.vcxproj index ae5144e..25e38e7 100644 --- a/EGameTools/EGameTools.vcxproj +++ b/EGameTools/EGameTools.vcxproj @@ -37,6 +37,7 @@ + @@ -139,7 +140,9 @@ + + diff --git a/EGameTools/EGameTools.vcxproj.filters b/EGameTools/EGameTools.vcxproj.filters index 4553139..8834c63 100644 --- a/EGameTools/EGameTools.vcxproj.filters +++ b/EGameTools/EGameTools.vcxproj.filters @@ -206,6 +206,9 @@ game\GamePH + + game\GamePH + @@ -438,6 +441,12 @@ game\GamePH + + game\GamePH + + + game\GamePH + diff --git a/EGameTools/source/changelog.h b/EGameTools/source/changelog.h index 763597a..35d3c59 100644 --- a/EGameTools/source/changelog.h +++ b/EGameTools/source/changelog.h @@ -54,6 +54,7 @@ Thank you everyone for the support <3)" }, R"(- Added compatibility with v1.16.2 hotfix update - Added the ability of using .PAK mods inside "EGameTools\UserModFiles"; just drag and drop a .PAK inside the folder, rename it to whatever you like and enjoy! CREDITS TO @12brendon34 on Discord for finding out how to implement this feature! - Added "Player Immunity" slider (Player) +- Added "Old World Money" slider (Player) - Added "Unlimited Immunity" (Player) - Added "Unlimited Stamina" (Player) - Added "One-Hit Kill" (Player) diff --git a/EGameTools/source/game/GamePH/InventoryContainerDI.cpp b/EGameTools/source/game/GamePH/InventoryContainerDI.cpp new file mode 100644 index 0000000..6d098e0 --- /dev/null +++ b/EGameTools/source/game/GamePH/InventoryContainerDI.cpp @@ -0,0 +1,24 @@ +#include +#include "..\offsets.h" +#include "InventoryContainerDI.h" +#include "InventoryMoney.h" + +namespace GamePH { + InventoryMoney* InventoryContainerDI::GetInventoryMoney(UINT indexMaybe) { + __try { + LPVOID(*pPlayerGetInventoryMoney)(LPVOID pPlayerDI_PH, UINT indexMaybe) = (decltype(pPlayerGetInventoryMoney))Offsets::Get_PlayerGetInventoryMoney(); + if (!pPlayerGetInventoryMoney) + return nullptr; + + InventoryMoney* ptr = reinterpret_cast(pPlayerGetInventoryMoney(this, indexMaybe)); + if (!Utils::Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll")) + return nullptr; + if (*reinterpret_cast(ptr) != Offsets::GetVT_InventoryMoney()) + return nullptr; + + return ptr; + } __except (EXCEPTION_EXECUTE_HANDLER) { + return nullptr; + } + } +} \ No newline at end of file diff --git a/EGameTools/source/game/GamePH/InventoryContainerDI.h b/EGameTools/source/game/GamePH/InventoryContainerDI.h new file mode 100644 index 0000000..50eb18c --- /dev/null +++ b/EGameTools/source/game/GamePH/InventoryContainerDI.h @@ -0,0 +1,10 @@ +#pragma once +#include "..\buffer.h" +#include "InventoryMoney.h" + +namespace GamePH { + class InventoryContainerDI { + public: + InventoryMoney* GetInventoryMoney(UINT indexMaybe); + }; +} \ No newline at end of file diff --git a/EGameTools/source/game/GamePH/InventoryMoney.h b/EGameTools/source/game/GamePH/InventoryMoney.h new file mode 100644 index 0000000..a63c939 --- /dev/null +++ b/EGameTools/source/game/GamePH/InventoryMoney.h @@ -0,0 +1,9 @@ +#pragma once +#include "..\buffer.h" + +namespace GamePH { + class InventoryMoney { + public: + buffer<0x38, int> oldWorldMoney; + }; +} \ No newline at end of file diff --git a/EGameTools/source/game/GamePH/PlayerDI_PH.cpp b/EGameTools/source/game/GamePH/PlayerDI_PH.cpp index f6ef108..c7f5ccd 100644 --- a/EGameTools/source/game/GamePH/PlayerDI_PH.cpp +++ b/EGameTools/source/game/GamePH/PlayerDI_PH.cpp @@ -1,5 +1,6 @@ #include #include "..\offsets.h" +#include "InventoryContainerDI.h" #include "InventoryItem.h" #include "LevelDI.h" #include "PlayerDI_PH.h" @@ -40,4 +41,18 @@ namespace GamePH { return nullptr; } } + + InventoryContainerDI* PlayerDI_PH::GetInventoryContainer() { + __try { + InventoryContainerDI* ptr = reinterpret_cast(*reinterpret_cast(reinterpret_cast(this) + 0x470)); + if (!Utils::Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll")) + return nullptr; + if (*reinterpret_cast(ptr) != Offsets::GetVT_InventoryContainerDI()) + return nullptr; + + return ptr; + } __except (EXCEPTION_EXECUTE_HANDLER) { + return nullptr; + } + } } \ No newline at end of file diff --git a/EGameTools/source/game/GamePH/PlayerDI_PH.h b/EGameTools/source/game/GamePH/PlayerDI_PH.h index 4dc7410..4568153 100644 --- a/EGameTools/source/game/GamePH/PlayerDI_PH.h +++ b/EGameTools/source/game/GamePH/PlayerDI_PH.h @@ -1,12 +1,14 @@ #pragma once #include "..\buffer.h" #include "InventoryItem.h" +#include "InventoryContainerDI.h" namespace GamePH { class PlayerDI_PH { public: static PlayerDI_PH* Get(); - InventoryItem* GetCurrentWeapon(UINT a1); + InventoryItem* GetCurrentWeapon(UINT indexMaybe); + InventoryContainerDI* GetInventoryContainer(); }; } \ No newline at end of file diff --git a/EGameTools/source/menu/player.cpp b/EGameTools/source/menu/player.cpp index 58ff3dd..771e286 100644 --- a/EGameTools/source/menu/player.cpp +++ b/EGameTools/source/menu/player.cpp @@ -3,6 +3,7 @@ #include "..\game\Engine\CBulletPhysicsCharacter.h" #include "..\game\GamePH\FreeCamera.h" #include "..\game\GamePH\LevelDI.h" +#include "..\game\GamePH\PlayerDI_PH.h" #include "..\game\GamePH\PlayerHealthModule.h" #include "..\game\GamePH\PlayerInfectionModule.h" #include "..\game\GamePH\PlayerVariables.h" @@ -6435,6 +6436,7 @@ namespace Menu { float playerMaxHealth = 80.0f; float playerImmunity = 80.0f; float playerMaxImmunity = 80.0f; + int oldWorldMoney = 0; KeyBindOption godMode{ VK_F6 }; KeyBindOption freezePlayer{ VK_F7 }; KeyBindOption unlimitedImmunity{ VK_NONE }; @@ -6603,17 +6605,6 @@ namespace Menu { } } - Tab Tab::instance{}; - void Tab::Update() { - PlayerPositionUpdate(); - PlayerVarsUpdate(); - PlayerHealthUpdate(); - PlayerImmunityUpdate(); - UpdateDisabledOptions(); - UpdatePlayerVars(); - HandleToggles(); - } - static void SaveVariablesToSCR() { if (!std::filesystem::exists(saveSCRPath)) return; @@ -6895,6 +6886,46 @@ namespace Menu { } } + static void UpdateMoney(bool updateSlider) { + GamePH::LevelDI* iLevel = GamePH::LevelDI::Get(); + if (!iLevel || !iLevel->IsLoaded()) + return; + GamePH::PlayerDI_PH* player = GamePH::PlayerDI_PH::Get(); + if (!player) + return; + GamePH::InventoryContainerDI* invContainer = player->GetInventoryContainer(); + if (!invContainer) + return; + GamePH::InventoryMoney* invMoney = invContainer->GetInventoryMoney(0); + if (!invMoney) + return; + + updateSlider ? (oldWorldMoney = invMoney->oldWorldMoney) : (invMoney->oldWorldMoney = oldWorldMoney); + } + static bool isMoneyInteractionDisabled() { + GamePH::LevelDI* iLevel = GamePH::LevelDI::Get(); + if (!iLevel || !iLevel->IsLoaded()) + return true; + GamePH::PlayerDI_PH* player = GamePH::PlayerDI_PH::Get(); + if (!player) + return true; + GamePH::InventoryContainerDI* invContainer = player->GetInventoryContainer(); + if (!invContainer || !invContainer->GetInventoryMoney(0)) + return true; + + return false; + } + + Tab Tab::instance{}; + void Tab::Update() { + PlayerPositionUpdate(); + PlayerVarsUpdate(); + PlayerHealthUpdate(); + PlayerImmunityUpdate(); + UpdateDisabledOptions(); + UpdatePlayerVars(); + HandleToggles(); + } void Tab::Render() { ImGui::SeparatorText("Misc"); GamePH::PlayerHealthModule* playerHealthModule = GamePH::PlayerHealthModule::Get(); @@ -6913,6 +6944,13 @@ namespace Menu { playerImmunity = playerInfectionModule->immunity * 100.0f; ImGui::EndDisabled(); } + ImGui::BeginDisabled(isMoneyInteractionDisabled()); { + if (ImGui::DragInt("Old World Money", &oldWorldMoney, 2.0f, 0, 999999999)) + UpdateMoney(false); + else + UpdateMoney(true); + ImGui::EndDisabled(); + } ImGui::CheckboxHotkey("God Mode", &godMode, "Makes the player invincible"); ImGui::SameLine(); ImGui::BeginDisabled(freezePlayer.GetChangesAreDisabled()); { diff --git a/EGameTools/source/menu/player.h b/EGameTools/source/menu/player.h index 5785782..01f1700 100644 --- a/EGameTools/source/menu/player.h +++ b/EGameTools/source/menu/player.h @@ -8,6 +8,7 @@ namespace Menu { extern float playerMaxHealth; extern float playerImmunity; extern float playerMaxImmunity; + extern int oldWorldMoney; extern KeyBindOption godMode; extern KeyBindOption freezePlayer; extern KeyBindOption unlimitedImmunity; diff --git a/EGameTools/source/menu/weapon.cpp b/EGameTools/source/menu/weapon.cpp index 0c258cb..f578496 100644 --- a/EGameTools/source/menu/weapon.cpp +++ b/EGameTools/source/menu/weapon.cpp @@ -8,7 +8,7 @@ namespace Menu { namespace Weapon { - float currentWeaponDurability = 150.0f; + float currentWeaponDurability = 0.0f; KeyBindOption unlimitedDurability{ VK_NONE }; KeyBindOption unlimitedAmmo{ VK_NONE }; KeyBindOption noSpread{ VK_NONE }; @@ -98,7 +98,7 @@ namespace Menu { } void Tab::Render() { ImGui::SeparatorText("Current Weapon"); - ImGui::BeginDisabled(isWeaponInteractionDisabled()); { + ImGui::BeginDisabled(isWeaponInteractionDisabled() || currentWeaponDurability <= 0.0f); { if (ImGui::SliderFloat("Weapon Durability", "Currently only works while your weapon is physically equipped in your hand", ¤tWeaponDurability, 0.1f, 999.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp)) UpdateWeaponDurability(false); else diff --git a/EGameTools/source/offsets.h b/EGameTools/source/offsets.h index 24617d4..995f950 100644 --- a/EGameTools/source/offsets.h +++ b/EGameTools/source/offsets.h @@ -51,7 +51,9 @@ struct Offsets { AddVTOffset(DayNightCycle, "gamedll_ph_x64_rwdi.dll", "DayNightCycle", LPVOID) AddVTOffset(FreeCamera, "gamedll_ph_x64_rwdi.dll", "FreeCamera", LPVOID) AddVTOffset(GameDI_PH, "gamedll_ph_x64_rwdi.dll", "GameDI_PH", LPVOID) + AddVTOffset(InventoryContainerDI, "gamedll_ph_x64_rwdi.dll", "InventoryContainerDI", LPVOID) AddVTOffset(InventoryItem, "gamedll_ph_x64_rwdi.dll", "InventoryItem", LPVOID) + AddVTOffset(InventoryMoney, "gamedll_ph_x64_rwdi.dll", "InventoryMoney", LPVOID) AddVTOffset(ItemDescWithContext, "gamedll_ph_x64_rwdi.dll", "ItemDescWithContext", LPVOID) AddVTOffset(LevelDI, "gamedll_ph_x64_rwdi.dll", "LevelDI", LPVOID) AddVTOffset(LocalClientDI, "gamedll_ph_x64_rwdi.dll", "LocalClientDI", LPVOID) @@ -96,6 +98,7 @@ struct Offsets { AddOffset(CanUseGrappleHook, "gamedll_ph_x64_rwdi.dll", "48 89 5C 24 ?? 57 48 83 EC ?? 48 8B 01 0F B6 FA 48 8B D9 FF 90 ?? ?? ?? ?? F6 80", Utils::SigScan::PatternType::Address, LPVOID) AddOffset(ReadPlayerJumpParams, "gamedll_ph_x64_rwdi.dll", "40 55 56 57 41 56 41 57 48 8D AC 24 ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? 4C 8B B5", Utils::SigScan::PatternType::Address, LPVOID) AddOffset(PlayerGetCurrentWeapon, "gamedll_ph_x64_rwdi.dll", "8B C2 48 8D 14 80 48 83 BC D1 ?? ?? ?? ?? ?? 74 ?? 48 8B 84 D1 ?? ?? ?? ?? C3 33 C0 C3 CC CC CC 8B C2", Utils::SigScan::PatternType::Address, LPVOID) + AddOffset(PlayerGetInventoryMoney, "gamedll_ph_x64_rwdi.dll", "8B C2 48 8B 44 C1", Utils::SigScan::PatternType::Address, LPVOID) //AddOffset(CompareAndUpdateFloat, "gamedll_ph_x64_rwdi.dll", "0F 2F C1 73 ?? 0F 28 C1 C3", Utils::SigScan::PatternType::Address, LPVOID) //AddOffset(HandlePlayerImmunity, "gamedll_ph_x64_rwdi.dll", "48 8B C4 53 56 57 41 56 41 57", Utils::SigScan::PatternType::Address, LPVOID) //AddOffset(HandlePlayerImmunity2, "gamedll_ph_x64_rwdi.dll", "40 55 56 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B F1 45 0F B6 F0", Utils::SigScan::PatternType::Address, LPVOID)