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)