- Added "Old World Money" slider (Player)

This commit is contained in:
EricPlayZ
2024-05-10 05:47:33 +03:00
parent ba09473499
commit 1bd10e06d6
12 changed files with 129 additions and 14 deletions

View File

@ -37,6 +37,7 @@
<ClCompile Include="source\game\GamePH\GameDI_PH2.cpp" />
<ClCompile Include="source\game\GamePH\gen_TPPModel.cpp" />
<ClCompile Include="source\game\GamePH\game_hooks.cpp" />
<ClCompile Include="source\game\GamePH\InventoryContainerDI.cpp" />
<ClCompile Include="source\game\GamePH\InventoryItem.cpp" />
<ClCompile Include="source\game\GamePH\LevelDI.cpp" />
<ClCompile Include="source\game\GamePH\LocalClientDI.cpp" />
@ -139,7 +140,9 @@
<ClInclude Include="source\game\GamePH\GameDI_PH.h" />
<ClInclude Include="source\game\GamePH\GameDI_PH2.h" />
<ClInclude Include="source\game\GamePH\gen_TPPModel.h" />
<ClInclude Include="source\game\GamePH\InventoryContainerDI.h" />
<ClInclude Include="source\game\GamePH\InventoryItem.h" />
<ClInclude Include="source\game\GamePH\InventoryMoney.h" />
<ClInclude Include="source\game\GamePH\ItemDescWithContext.h" />
<ClInclude Include="source\game\GamePH\LevelDI.h" />
<ClInclude Include="source\game\GamePH\LocalClientDI.h" />

View File

@ -206,6 +206,9 @@
<ClCompile Include="source\game\GamePH\InventoryItem.cpp">
<Filter>game\GamePH</Filter>
</ClCompile>
<ClCompile Include="source\game\GamePH\InventoryContainerDI.cpp">
<Filter>game\GamePH</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="source\kiero.h" />
@ -438,6 +441,12 @@
<ClInclude Include="source\game\GamePH\ItemDescWithContext.h">
<Filter>game\GamePH</Filter>
</ClInclude>
<ClInclude Include="source\game\GamePH\InventoryContainerDI.h">
<Filter>game\GamePH</Filter>
</ClInclude>
<ClInclude Include="source\game\GamePH\InventoryMoney.h">
<Filter>game\GamePH</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="MinHook">

View File

@ -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)

View File

@ -0,0 +1,24 @@
#include <pch.h>
#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<InventoryMoney*>(pPlayerGetInventoryMoney(this, indexMaybe));
if (!Utils::Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
if (*reinterpret_cast<DWORD64**>(ptr) != Offsets::GetVT_InventoryMoney())
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
}

View File

@ -0,0 +1,10 @@
#pragma once
#include "..\buffer.h"
#include "InventoryMoney.h"
namespace GamePH {
class InventoryContainerDI {
public:
InventoryMoney* GetInventoryMoney(UINT indexMaybe);
};
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "..\buffer.h"
namespace GamePH {
class InventoryMoney {
public:
buffer<0x38, int> oldWorldMoney;
};
}

View File

@ -1,5 +1,6 @@
#include <pch.h>
#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<InventoryContainerDI*>(*reinterpret_cast<DWORD64*>(reinterpret_cast<DWORD64>(this) + 0x470));
if (!Utils::Memory::IsValidPtrMod(ptr, "gamedll_ph_x64_rwdi.dll"))
return nullptr;
if (*reinterpret_cast<DWORD64**>(ptr) != Offsets::GetVT_InventoryContainerDI())
return nullptr;
return ptr;
} __except (EXCEPTION_EXECUTE_HANDLER) {
return nullptr;
}
}
}

View File

@ -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();
};
}

View File

@ -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()); {

View File

@ -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;

View File

@ -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", &currentWeaponDurability, 0.1f, 999.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp))
UpdateWeaponDurability(false);
else

View File

@ -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)