2025-08-28 06:27:27 +02:00
# include "Memory.hpp" ;
# include "Maths.hpp" ;
2025-09-17 11:16:33 +02:00
# include "UEngine.hpp" ;
2025-08-28 06:27:27 +02:00
# include "ObfuscateString.h"
# include <string>
# include <spdlog/spdlog.h>
# include <spdlog/sinks/rotating_file_sink.h>
# include <filesystem>
2025-09-03 12:10:43 +02:00
# include <thread>
2025-08-28 06:27:27 +02:00
# include <safetyhook.hpp>
2025-09-02 14:51:45 +02:00
# include "SDK/Engine_classes.hpp"
2025-08-28 06:27:27 +02:00
2025-09-02 14:51:45 +02:00
using namespace SDK ;
2025-08-28 06:27:27 +02:00
// Constants
const std : : string PLUGIN_NAME = " MGSDSE " ;
const std : : string PLUGIN_LOG = PLUGIN_NAME + " .log " ;
const std : : string gameExecutable = " MGSDelta-Win64-Shipping.exe " ;
const float baseAspect = 1.777777791 ;
// Logger
std : : shared_ptr < spdlog : : logger > logger ;
2025-09-03 12:10:43 +02:00
// UE console
static bool consoleCreated = false ;
2025-08-28 06:27:27 +02:00
// Screen informations
static int screenWidth = GetSystemMetrics ( SM_CXSCREEN ) ;
static int screenHeight = GetSystemMetrics ( SM_CYSCREEN ) ;
static float aspectRatio = ( float ) screenWidth / screenHeight ;
// Transform screen width into bytes little-endian
float floatWidth = static_cast < float > ( screenWidth ) ;
char * bytesWidth = reinterpret_cast < char * > ( & floatWidth ) ;
// Plugin states
static bool AOBScanDone = false ;
static bool g_fix_enabled = false ;
static bool g_fov_fix_enabled = false ;
static bool g_FPS_fix_enabled = false ;
static bool g_resolution_fix_enabled = false ;
static bool g_aspect_fix_enabled = false ;
static bool g_DOF_fix_enabled = false ;
2025-09-02 14:51:45 +02:00
static bool g_CA_fix_enabled = false ;
2025-08-28 06:27:27 +02:00
static bool g_Vignetting_fix_enabled = false ;
static bool g_Fog_fix_enabled = false ;
static int g_AdditionalFOVValue = 0 ;
// Shared values
static float g_FOV_In = 0 ;
static float g_Compensated_FOV = 0 ;
static float g_FOV_Out = 0 ;
2025-09-17 11:16:33 +02:00
static bool g_Console_Enabled = false ;
2025-08-28 06:27:27 +02:00
// AOB Scan pointers
static uint8_t * FOVaddress = nullptr ;
static uint8_t * FPSaddress = nullptr ;
static uint8_t * Resolutionaddress_1 = nullptr ;
static uint8_t * Resolutionaddress_2 = nullptr ;
static uint8_t * Aspectaddress = nullptr ;
static uint8_t * AspectMenuaddress = nullptr ;
static uint8_t * DOFaddress = nullptr ;
2025-09-02 14:51:45 +02:00
static uint8_t * CAaddress = nullptr ;
2025-08-28 06:27:27 +02:00
static uint8_t * Vignettingaddress = nullptr ;
static uint8_t * Fogaddress = nullptr ;
2025-09-17 11:16:33 +02:00
// AOB Unreal Engine offsets addresses
static uint8_t * GObjectsaddress = nullptr ;
static uint8_t * GNamesaddress = nullptr ;
static uint8_t * GetNameEntryaddress = nullptr ;
static uint8_t * AppendStringaddress = nullptr ;
static uint8_t * ProcessEventaddress = nullptr ;
2025-08-28 06:27:27 +02:00
// Hooking
static SafetyHookMid FOVHook { } ;
static SafetyHookMid FPSHook { } ;
2025-09-02 14:51:45 +02:00
static SafetyHookMid ResolutionHook_1 { } ;
static SafetyHookMid ResolutionHook_2 { } ;
2025-08-28 06:27:27 +02:00
static SafetyHookMid AspectHook { } ;
static SafetyHookMid AspectMenuHook { } ;
static SafetyHookMid FogHook { } ;
// Prototypes
static void FOVFixEnabled ( bool fix_enabled ) ;
static void FPSFixEnabled ( bool fix_enabled ) ;
static void ResolutionFixEnabled ( bool fix_enabled ) ;
static void AspectFixEnabled ( bool fix_enabled ) ;
static void DOFFixEnabled ( bool fix_enabled ) ;
2025-09-02 14:51:45 +02:00
static void CAFixEnabled ( bool fix_enabled ) ;
2025-08-28 06:27:27 +02:00
static void VignettingFixEnabled ( bool fix_enabled ) ;
static void FogFixEnabled ( bool fix_enabled ) ;
2025-09-03 12:10:43 +02:00
static void EnableConsole ( ) ;
2025-08-28 06:27:27 +02:00
2025-09-02 14:51:45 +02:00
uint8_t * basePtr = reinterpret_cast < uint8_t * > ( GetModuleHandleA ( nullptr ) ) ;
extern " C " __declspec ( dllexport ) void SetFixEnabled ( bool enabled , bool init )
2025-08-28 06:27:27 +02:00
{
g_fix_enabled = enabled ;
if ( g_fix_enabled & & ! AOBScanDone ) {
logger - > info ( " --------------- AOB scan started --------------- " ) ;
if ( FOVaddress = = nullptr ) {
constexpr auto FOVStringObfuscated = make_obfuscated < 0x4A > ( " 77 ?? 48 ?? ?? FF ?? ?? ?? ?? ?? F3 0F ?? ?? ?? 48 " ) ;
FOVaddress = Memory : : AOBScan ( gameExecutable , FOVStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 43A6B64 - 48 8B 01 - mov rax, [rcx]
//"MGSDelta-Win64-Shipping.exe" + 43A6B67 - FF 90 48 07 00 00 - call qword ptr[rax + 00000748]
//"MGSDelta-Win64-Shipping.exe" + 43A6B6D - F3 0F 10 40 30 - movss xmm0, [rax + 30]
//"MGSDelta-Win64-Shipping.exe" + 43A6B72 - 48 83 C4 28 - add rsp, 28
//"MGSDelta-Win64-Shipping.exe" + 43A6B76 - C3 - ret
if ( ! FOVaddress )
logger - > warn ( " FOV signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " FOV signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( FOVaddress ) ) ;
FOVaddress + = 0x10 ;
}
}
if ( Resolutionaddress_1 = = nullptr ) {
constexpr auto ResolutionStringObfuscated = make_obfuscated < 0x4A > ( " C7 44 ?? ?? ?? ?? ?? ?? 0F 11 ?? ?? ?? 48 8D ?? ?? ?? 48 89 ?? ?? ?? 89 ?? ?? ?? C6 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? 66 " ) ;
Resolutionaddress_1 = Memory : : AOBScan ( gameExecutable , ResolutionStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
2025-09-02 14:51:45 +02:00
//"MGSDelta-Win64-Shipping.exe" + 4EAC202 - 74 28 - je "MGSDelta-Win64-Shipping.exe" + 4EAC22C
//"MGSDelta-Win64-Shipping.exe" + 4EAC204 - 0F57 C9 - xorps xmm1, xmm1
//"MGSDelta-Win64-Shipping.exe" + 4EAC207 - C7 44 24 20 00 00 F0 44 - mov[rsp + 20], 44F00000
//"MGSDelta-Win64-Shipping.exe" + 4EAC20F - 0F 11 4C 24 28 - movups[rsp + 28], xmm1
//"MGSDelta-Win64-Shipping.exe" + 4EAC214 - 48 8D 54 24 20 - lea rdx, [rsp + 20]
2025-08-28 06:27:27 +02:00
if ( ! Resolutionaddress_1 )
logger - > warn ( " Resolution signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Resolution signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( Resolutionaddress_1 ) ) ;
Resolutionaddress_1 + = 4 ;
Resolutionaddress_2 = Resolutionaddress_1 + 0x3D ;
}
}
if ( FPSaddress = = nullptr ) {
constexpr auto FPSStringObfuscated = make_obfuscated < 0x4A > ( " F3 0F ?? ?? ?? EB ?? 0F ?? ?? 48 8B ?? ?? ?? 48 8B ?? ?? ?? 48 8B ?? ?? ?? 48 8B ?? ?? ?? 0F " ) ;
FPSaddress = Memory : : AOBScan ( gameExecutable , FPSStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 465256F - 74 02 - je "MGSDelta-Win64-Shipping.exe" + 4652573
//"MGSDelta-Win64-Shipping.exe" + 4652571 - 33 FF - xor edi, edi
//"MGSDelta-Win64-Shipping.exe" + 4652573 - F3 0F 10 04 3B - movss xmm0, [rbx + rdi]
//"MGSDelta-Win64-Shipping.exe" + 4652578 - EB 03 - jmp "MGSDelta-Win64-Shipping.exe" + 465257D
//"MGSDelta-Win64-Shipping.exe" + 465257A - 0F 28 C6 - movaps xmm0, xmm6
if ( ! FPSaddress )
logger - > warn ( " Frame time signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Frame time signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( FPSaddress ) ) ;
FPSaddress + = 0x5 ;
}
}
if ( Aspectaddress = = nullptr ) {
2025-09-04 10:58:30 +02:00
//constexpr auto AspectStringObfuscated = make_obfuscated<0x4A>("C3 CC CC CC CC CC CC CC CC CC 48 89 ?? ?? ?? 57 48 83 ?? ?? 0F ?? ?? 48 ?? ?? 48 ?? ?? 0F ?? ?? F2 0F ?? ?? ?? F2 0F ?? ?? ?? 0F");
2025-09-02 14:51:45 +02:00
constexpr auto AspectStringObfuscated = make_obfuscated < 0x4A > ( " F3 0F ?? ?? ?? ?? ?? ?? F3 0F ?? ?? ?? 8B 87 ?? ?? ?? ?? 89 ?? ?? 0F " ) ;
2025-08-28 06:27:27 +02:00
Aspectaddress = Memory : : AOBScan ( gameExecutable , AspectStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 3A03453 - 89 41 44 - mov[rcx + 44], eax
//"MGSDelta-Win64-Shipping.exe" + 3A03456 - 8B 42 48 - mov eax, [rdx + 48]
//"MGSDelta-Win64-Shipping.exe" + 3A03459 - 89 41 48 - mov[rcx + 48], eax
//"MGSDelta-Win64-Shipping.exe" + 3A0345C - 48 8D 42 4C - lea rax, [rdx + 4C]
//"MGSDelta-Win64-Shipping.exe" + 3A03460 - 48 83 C1 4C - add rcx, 4C
if ( ! Aspectaddress )
2025-09-02 14:51:45 +02:00
logger - > warn ( " Aspect ratio signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
2025-08-28 06:27:27 +02:00
else {
logger - > info ( " Aspect ratio signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( Aspectaddress ) ) ;
2025-09-02 14:51:45 +02:00
Aspectaddress = Aspectaddress + 0x13 ;
2025-08-28 06:27:27 +02:00
}
}
if ( AspectMenuaddress = = nullptr ) {
constexpr auto AspectMenuStringObfuscated = make_obfuscated < 0x4A > ( " 66 ?? ?? ?? 66 ?? ?? ?? 0F ?? ?? F2 ?? ?? ?? 0F 11 ?? ?? ?? F2 ?? ?? ?? 0F " ) ;
AspectMenuaddress = Memory : : AOBScan ( gameExecutable , AspectMenuStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 50155AF - F2 0F 10 05 39 88 84 07 - movsd xmm0, ["MGSDelta-Win64-Shipping.exe" + C85DDF0]
//"MGSDelta-Win64-Shipping.exe" + 50155B7 - 0F 28 DE - movaps xmm3, xmm6
//"MGSDelta-Win64-Shipping.exe" + 50155BA - F2 0F 5E 05 36888407 - divsd xmm0, ["MGSDelta-Win64-Shipping.exe" + C85DDF8]
//"MGSDelta-Win64-Shipping.exe" + 50155C2 - 66 0F 15 DE - unpckhpd xmm3, xmm6
//"MGSDelta-Win64-Shipping.exe" + 50155C6 - 66 0F 5A C8 - cvtpd2ps xmm1, xmm0
if ( ! AspectMenuaddress )
logger - > warn ( " Aspect ratio ratio signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Aspect ratio signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( AspectMenuaddress ) ) ;
}
}
if ( DOFaddress = = nullptr ) {
constexpr auto DOFStringObfuscated = make_obfuscated < 0x4A > ( " 7E ?? F6 ?? ?? ?? 74 ?? F6 83 " ) ;
DOFaddress = Memory : : AOBScan ( gameExecutable , DOFStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 2B90DE4 - 74 37 - je "MGSDelta-Win64-Shipping.exe" + 2B90E1D
//"MGSDelta-Win64-Shipping.exe" + 2B90DE6 - 83 3C 2F 00 - cmp dword ptr[rdi + rbp], 00
//"MGSDelta-Win64-Shipping.exe" + 2B90DEA - 7E 31 - jle "MGSDelta-Win64-Shipping.exe" + 2B90E1D
//"MGSDelta-Win64-Shipping.exe" + 2B90DEC - F6 40 38 08 - test byte ptr[rax + 38], 08
//"MGSDelta-Win64-Shipping.exe" + 2B90DF0 - 74 09 - je "MGSDelta-Win64-Shipping.exe" + 2B90DFB
if ( ! DOFaddress )
logger - > warn ( " DOF signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " DOF signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( DOFaddress ) ) ;
}
}
2025-09-02 14:51:45 +02:00
if ( CAaddress = = nullptr ) {
constexpr auto DOFStringObfuscated = make_obfuscated < 0x4A > ( " 7F ?? 89 B3 ?? ?? ?? ?? 8B ?? ?? 39 05 " ) ;
CAaddress = Memory : : AOBScan ( gameExecutable , DOFStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 4497760 - 48 8B 05 A1 05 04 10 - mov rax, ["MGSDelta-Win64-Shipping.exe" + 144D7D08]
//"MGSDelta-Win64-Shipping.exe" + 4497767 - 39 30 - cmp[rax], esi
//"MGSDelta-Win64-Shipping.exe" + 4497769 - 7F 06 - jg "MGSDelta-Win64-Shipping.exe" + 4497771
//"MGSDelta-Win64-Shipping.exe" + 449776B - 89 B3 EC 1E 00 00 - mov[rbx + 00001EEC], esi
//"MGSDelta-Win64-Shipping.exe" + 4497771 - 8B 04 2F - mov eax, [rdi + rbp]
if ( ! CAaddress )
logger - > warn ( " Chromatic aberrations signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Chromatic aberrations found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( CAaddress ) ) ;
}
}
2025-08-28 06:27:27 +02:00
if ( Vignettingaddress = = nullptr ) {
constexpr auto VignettingStringObfuscated = make_obfuscated < 0x4A > ( " 8B ?? 83 ?? ?? 7D ?? 89 B3 ?? ?? ?? ?? EB " ) ;
Vignettingaddress = Memory : : AOBScan ( gameExecutable , VignettingStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 4496C77 - C7 83 C8 20 00 00 00 00 80 3F - mov[rbx + 000020C8], 3F800000
//"MGSDelta-Win64-Shipping.exe" + 4496C81 - 48 8B 05 D8 94 D9 0F - mov rax, ["MGSDelta-Win64-Shipping.exe" + 14230160]
//"MGSDelta-Win64-Shipping.exe" + 4496C88 - 8B 08 - mov ecx, [rax]
//"MGSDelta-Win64-Shipping.exe" + 4496C8A - 83 F9 02 - cmp ecx, 02
//"MGSDelta-Win64-Shipping.exe" + 4496C8D - 7D 08 - jnl "MGSDelta-Win64-Shipping.exe" + 4496C97
if ( ! Vignettingaddress )
logger - > warn ( " Vignetting signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Vignetting signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( Vignettingaddress ) ) ;
}
}
if ( Fogaddress = = nullptr ) {
constexpr auto FogStringObfuscated = make_obfuscated < 0x4A > ( " 74 ?? 48 8B ?? ?? ?? ?? ?? 83 ?? ?? ?? 75 ?? B3 " ) ;
Fogaddress = Memory : : AOBScan ( gameExecutable , FogStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
//"MGSDelta-Win64-Shipping.exe" + 2696A3D - 48 8B 05 BC D7 B6 11 - mov rax, ["MGSDelta-Win64-Shipping.exe" + 14204200]
//"MGSDelta-Win64-Shipping.exe" + 2696A44 - 83 78 04 01 - cmp dword ptr[rax + 04], 01
//"MGSDelta-Win64-Shipping.exe" + 2696A48 - 75 04 - jne "MGSDelta-Win64-Shipping.exe" + 2696A4E
//"MGSDelta-Win64-Shipping.exe" + 2696A4A - B3 01 - mov bl, 01
//"MGSDelta-Win64-Shipping.exe" + 2696A4C - EB 02 - jmp "MGSDelta-Win64-Shipping.exe" + 2696A50
if ( ! Fogaddress )
logger - > warn ( " Fog signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
logger - > info ( " Fog signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( Fogaddress ) ) ;
Fogaddress + = 0xd ;
2025-09-17 11:16:33 +02:00
}
2025-08-28 06:27:27 +02:00
}
2025-09-02 14:51:45 +02:00
if ( FOVaddress & & Resolutionaddress_1 & & FPSaddress & & Aspectaddress & & AspectMenuaddress & &
DOFaddress & & CAaddress & & Vignettingaddress & & Fogaddress ) {
2025-08-28 06:27:27 +02:00
logger - > info ( " All AOB signatures found. Ready to patch... " ) ;
AOBScanDone = true ;
}
2025-09-17 11:16:33 +02:00
// Unreal Engine Offsets updates (needed when the game reveives an update and to prevent the fix from crashing the game)
if ( ! GObjectsaddress | | ! AppendStringaddress | | ! ProcessEventaddress ) {
logger - > info ( " ------------ UEngine offsets search ------------ " ) ;
constexpr auto GObjetcsStringObfuscated = make_obfuscated < 0x4A > ( " 48 8B ?? ?? ?? ?? ?? 48 8B ?? ?? 48 8D ?? ?? EB ?? 33 " ) ;
GObjectsaddress = Memory : : AOBScan ( gameExecutable , GObjetcsStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
constexpr auto GNamesStringObfuscated = make_obfuscated < 0x4A > ( " 8B 05 ?? ?? ?? ?? 0F B7 ?? ?? FF ?? 3B ?? 73 " ) ;
GNamesaddress = Memory : : AOBScan ( gameExecutable , GNamesStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
constexpr auto AppendStringStringObfuscated = make_obfuscated < 0x4A > ( " 48 89 ?? ?? ?? ?? ?? ?? 48 81 ?? ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? 48 ?? ?? 48 89 ?? ?? ?? ?? ?? ?? 0F ?? ?? 48 8B " ) ;
AppendStringaddress = Memory : : AOBScan ( gameExecutable , AppendStringStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
constexpr auto ProcessEventStringObfuscated = make_obfuscated < 0x4A > ( " 40 ?? 56 57 41 ?? 41 ?? 41 ?? 41 ?? 48 81 ?? ?? ?? ?? ?? 48 8D ?? ?? ?? 48 89 ?? ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? 48 33 ?? 48 89 ?? ?? ?? ?? ?? 4D ?? ?? 48 " ) ;
ProcessEventaddress = Memory : : AOBScan ( gameExecutable , ProcessEventStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
if ( ! GObjectsaddress )
logger - > warn ( " GObjects signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
uint32_t gObjectsOffset = static_cast < uint32_t > ( Memory : : GetOffsetFromOpcode ( GObjectsaddress + 0x3 ) -
reinterpret_cast < uint8_t * > ( GetModuleHandleA ( gameExecutable . c_str ( ) ) ) ) ;
logger - > info ( " GObjects offset is: 0x{:X}. " , gObjectsOffset ) ;
Offsets : : GObjects = static_cast < UC : : uint32 > ( gObjectsOffset ) ; // Update GObjects offset
}
if ( ! GNamesaddress )
logger - > warn ( " GNames signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
uint32_t gNamesOffset = static_cast < uint32_t > ( Memory : : GetOffsetFromOpcode ( GNamesaddress + 0x2 ) -
reinterpret_cast < uint8_t * > ( GetModuleHandleA ( gameExecutable . c_str ( ) ) ) ) ;
logger - > info ( " GNames offset is: 0x{:X}. " , gNamesOffset ) ;
Offsets : : GNames = static_cast < UC : : uint32 > ( gNamesOffset ) ; // Update GNames offset
}
if ( ! AppendStringaddress )
logger - > warn ( " AppendString signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
std : : optional < uint32_t > gAppendStringOffsetOpt = UE : : CalculateOffset ( gameExecutable , AppendStringaddress ) ; // Get Offset from opcode
uint32_t gAppendStringOffset = * gAppendStringOffsetOpt ;
logger - > info ( " AppendString offset is: 0x{:X}. " , gAppendStringOffset ) ;
Offsets : : AppendString = static_cast < UC : : uint32 > ( gAppendStringOffset ) ; // Update AppendString offset
}
if ( ! ProcessEventaddress )
logger - > warn ( " Process Event signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else {
std : : optional < uint32_t > gProcessEventOffsetOpt = UE : : CalculateOffset ( gameExecutable , ProcessEventaddress ) ;
uint32_t gProcessEventOffset = * gProcessEventOffsetOpt ;
logger - > info ( " Process Event offset is: 0x{:X}. " , gProcessEventOffset ) ;
Offsets : : ProcessEvent = static_cast < UC : : uint32 > ( gProcessEventOffset ) ; // Update ProcessEvent offset
}
}
2025-08-28 06:27:27 +02:00
2025-09-17 11:16:33 +02:00
logger - > info ( " -------------- Fixes initialisation ------------- " ) ;
2025-08-28 06:27:27 +02:00
}
if ( g_fix_enabled ) {
if ( FOVaddress ) FOVFixEnabled ( g_fov_fix_enabled | | g_aspect_fix_enabled ) ;
if ( FPSaddress ) FPSFixEnabled ( g_FPS_fix_enabled ) ;
if ( Resolutionaddress_1 ) ResolutionFixEnabled ( g_resolution_fix_enabled ) ;
if ( Aspectaddress ) AspectFixEnabled ( g_aspect_fix_enabled ) ;
if ( DOFaddress ) DOFFixEnabled ( g_DOF_fix_enabled ) ;
2025-09-02 14:51:45 +02:00
if ( CAaddress ) CAFixEnabled ( g_CA_fix_enabled ) ;
2025-08-28 06:27:27 +02:00
if ( Vignettingaddress ) VignettingFixEnabled ( g_Vignetting_fix_enabled ) ;
if ( Fogaddress ) FogFixEnabled ( g_Fog_fix_enabled ) ;
}
else {
if ( FOVaddress ) FOVFixEnabled ( false ) ;
if ( FPSaddress ) FPSFixEnabled ( false ) ;
if ( Resolutionaddress_1 ) ResolutionFixEnabled ( false ) ;
if ( Aspectaddress ) AspectFixEnabled ( false ) ;
if ( DOFaddress ) DOFFixEnabled ( false ) ;
2025-09-02 14:51:45 +02:00
if ( CAaddress ) CAFixEnabled ( false ) ;
2025-08-28 06:27:27 +02:00
if ( Vignettingaddress ) VignettingFixEnabled ( false ) ;
if ( Fogaddress ) FogFixEnabled ( false ) ;
logger - > info ( " All fixes disabled. " ) ;
}
2025-09-17 11:16:33 +02:00
if ( ! g_Console_Enabled & & GObjectsaddress & & GNamesaddress & & AppendStringaddress & & ProcessEventaddress )
2025-09-03 12:10:43 +02:00
EnableConsole ( ) ;
2025-08-28 06:27:27 +02:00
}
// Setters for Reshade addon calls
extern " C " __declspec ( dllexport ) void SetFOVFixEnabled ( bool enabled , bool init )
{
g_fov_fix_enabled = enabled ;
if ( ! init ) FOVFixEnabled ( g_fov_fix_enabled | | g_aspect_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetFPSFixEnabled ( bool enabled , bool init )
{
g_FPS_fix_enabled = enabled ;
if ( ! init ) FPSFixEnabled ( g_FPS_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetResolutionFixEnabled ( bool enabled , bool init )
{
g_resolution_fix_enabled = enabled ;
if ( ! init ) ResolutionFixEnabled ( g_resolution_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetAspectRatioFixEnabled ( bool enabled , bool init )
{
g_aspect_fix_enabled = enabled ;
if ( ! init ) AspectFixEnabled ( g_aspect_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetDOFFixEnabled ( bool enabled , bool init )
{
g_DOF_fix_enabled = enabled ;
if ( ! init ) DOFFixEnabled ( g_DOF_fix_enabled ) ;
}
2025-09-02 14:51:45 +02:00
extern " C " __declspec ( dllexport ) void SetCAFixEnabled ( bool enabled , bool init )
{
g_CA_fix_enabled = enabled ;
if ( ! init ) CAFixEnabled ( g_CA_fix_enabled ) ;
}
2025-08-28 06:27:27 +02:00
extern " C " __declspec ( dllexport ) void SetVignettingFixEnabled ( bool enabled , bool init )
{
g_Vignetting_fix_enabled = enabled ;
if ( ! init ) VignettingFixEnabled ( g_Vignetting_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetFogFixEnabled ( bool enabled , bool init )
{
g_Fog_fix_enabled = enabled ;
if ( ! init ) FogFixEnabled ( g_Fog_fix_enabled ) ;
}
extern " C " __declspec ( dllexport ) void SetFOV ( int fov )
{
g_AdditionalFOVValue = fov ;
}
// Getters for Reshade addon calls
extern " C " __declspec ( dllexport ) float GetFOVIn ( ) {
return g_FOV_In ;
}
extern " C " __declspec ( dllexport ) float GetCompensatedFOV ( ) {
return g_Compensated_FOV ;
}
extern " C " __declspec ( dllexport ) float GetFOVOut ( ) {
return g_FOV_Out ;
}
2025-09-17 11:16:33 +02:00
extern " C " __declspec ( dllexport ) bool GetConsoleEnabled ( ) {
return g_Console_Enabled ;
}
2025-08-28 06:27:27 +02:00
// Code injection functions
static void FOVFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & FOVaddress ) {
if ( ! FOVHook ) { // Hook only once
FOVHook = safetyhook : : create_mid ( FOVaddress ,
[ ] ( SafetyHookContext & ctx ) {
g_FOV_In = ctx . xmm0 . f32 [ 0 ] ;
if ( g_aspect_fix_enabled )
g_Compensated_FOV = ctx . xmm0 . f32 [ 0 ] = Maths : : CompensateHorizontalFOV ( g_FOV_In , baseAspect , aspectRatio ) ;
else
g_Compensated_FOV = ctx . xmm0 . f32 [ 0 ] ;
g_FOV_Out = ctx . xmm0 . f32 [ 0 ] + = ( g_fov_fix_enabled ? g_AdditionalFOVValue : 0 ) ;
} ) ;
}
else FOVHook . enable ( ) ;
2025-09-03 12:10:43 +02:00
2025-08-28 06:27:27 +02:00
logger - > info ( " FOV fix enabled " ) ;
}
if ( ! fix_enabled ) {
if ( FOVHook ) FOVHook . disable ( ) ;
logger - > info ( " FOV fix disabled " ) ;
}
}
static void ResolutionFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & Resolutionaddress_1 & & Resolutionaddress_2 ) {
Memory : : PatchBytes ( Resolutionaddress_1 , bytesWidth , 4 ) ; // patch scree nwidth in memory
2025-09-02 14:51:45 +02:00
if ( ! ResolutionHook_2 ) { // Hook only once
ResolutionHook_2 = safetyhook : : create_mid ( Resolutionaddress_2 ,
2025-08-28 06:27:27 +02:00
[ ] ( SafetyHookContext & ctx ) {
ctx . xmm0 . f32 [ 0 ] = ( float ) screenHeight ;
} ) ;
}
2025-09-02 14:51:45 +02:00
else ResolutionHook_2 . enable ( ) ;
2025-08-28 06:27:27 +02:00
logger - > info ( " Resolution fix enabled " ) ;
}
if ( ! fix_enabled ) {
2025-09-02 14:51:45 +02:00
if ( ResolutionHook_2 ) ResolutionHook_2 . disable ( ) ;
2025-08-28 06:27:27 +02:00
Memory : : RestoreBytes ( Resolutionaddress_1 ) ;
logger - > info ( " Resolution fix disabled " ) ;
}
}
static void FPSFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & FPSaddress ) {
if ( ! FPSHook ) { // Hook only once
FPSHook = safetyhook : : create_mid ( FPSaddress ,
[ ] ( SafetyHookContext & ctx ) {
ctx . xmm0 . f32 [ 0 ] = 0 ;
} ) ;
}
else FPSHook . enable ( ) ;
logger - > info ( " Frame time fix enabled " ) ;
}
if ( ! fix_enabled ) {
if ( FPSHook ) FPSHook . disable ( ) ;
logger - > info ( " Frame time fix disabled " ) ;
}
}
static void AspectFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & Aspectaddress ) {
if ( ! AspectHook ) {
AspectHook = safetyhook : : create_mid ( Aspectaddress ,
[ ] ( SafetyHookContext & ctx ) {
ctx . rax = * reinterpret_cast < uint32_t * > ( & aspectRatio ) ;
} ) ;
}
else AspectHook . enable ( ) ;
if ( ! AspectMenuHook ) {
AspectMenuHook = safetyhook : : create_mid ( AspectMenuaddress ,
[ ] ( SafetyHookContext & ctx ) {
2025-09-02 14:51:45 +02:00
if ( ! ctx . rbx ) return ;
auto obj = reinterpret_cast < UObject * > ( ctx . rbx ) ;
constexpr auto PauseBackScreenStringObfuscated = make_obfuscated < 0x4A > ( " WP_PauseBackScreen " ) ;
2025-09-03 12:10:43 +02:00
auto decrypted = PauseBackScreenStringObfuscated . decrypt ( ) ;
2025-09-03 12:57:10 +02:00
if ( ! decrypted . empty ( ) & & decrypted . back ( ) = = ' \0 ' ) // trim right nul terminated character
2025-09-03 12:10:43 +02:00
decrypted . pop_back ( ) ;
2025-09-03 12:57:10 +02:00
// This will force screen aspect ratio when pause menu is activated only
2025-09-03 12:10:43 +02:00
if ( obj - > GetName ( ) . find ( decrypted ) ! = std : : string : : npos )
2025-09-02 14:51:45 +02:00
ctx . xmm0 . f64 [ 0 ] = static_cast < double > ( aspectRatio ) ;
2025-08-28 06:27:27 +02:00
} ) ;
}
else AspectMenuHook . enable ( ) ;
logger - > info ( " Aspect fix enabled " ) ;
FOVFixEnabled ( fix_enabled ) ;
}
if ( ! fix_enabled ) {
if ( AspectHook ) AspectHook . disable ( ) ;
if ( AspectMenuHook ) AspectMenuHook . disable ( ) ;
logger - > info ( " Aspect ratio fix disabled " ) ;
if ( ! g_fov_fix_enabled )
FOVFixEnabled ( fix_enabled ) ;
}
}
// Memory patch fixes
static void DOFFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & DOFaddress ) {
Memory : : PatchBytes ( DOFaddress , " \xEB " , 1 ) ; // jle => jmp r.DepthOfFieldQuality = 0
logger - > info ( " Depth of field fix enabled " ) ;
}
if ( ! fix_enabled & & DOFaddress ) {
Memory : : RestoreBytes ( DOFaddress ) ;
logger - > info ( " Depth of field fix disabled " ) ;
}
}
2025-09-02 14:51:45 +02:00
static void CAFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & CAaddress ) {
Memory : : PatchBytes ( CAaddress , " \x90 \x90 " , 2 ) ; // jg => NOP r.SceneColorFringeQuality=0
logger - > info ( " Chromatic aberrations fix enabled " ) ;
}
if ( ! fix_enabled & & CAaddress ) {
Memory : : RestoreBytes ( CAaddress ) ;
logger - > info ( " Chromatic aberrations fix disabled " ) ;
}
}
2025-08-28 06:27:27 +02:00
static void VignettingFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & Vignettingaddress ) {
Memory : : PatchBytes ( Vignettingaddress , " \x31 \xC9 " , 2 ) ; // xor ecx,ecx r.Tonemapper.Quality=0
logger - > info ( " Vignetting fix enabled " ) ;
}
if ( ! fix_enabled & & Vignettingaddress ) {
Memory : : RestoreBytes ( Vignettingaddress ) ;
logger - > info ( " Vignetting fix disabled " ) ;
}
}
static void FogFixEnabled ( bool fix_enabled ) {
if ( g_fix_enabled & & fix_enabled & & Fogaddress ) {
Memory : : PatchBytes ( Fogaddress , " \xEB " , 1 ) ; // jle => jmp r.DepthOfFieldQuality = 0
logger - > info ( " Fog fix enabled " ) ;
}
}
2025-09-03 12:10:43 +02:00
// UE Console creation
static void EnableConsole ( )
{
2025-09-17 11:16:33 +02:00
logger - > info ( " -------------- Console re-enabling -------------- " ) ;
if ( ! GObjectsaddress | | ! GNamesaddress | | ! AppendStringaddress | | ! ProcessEventaddress ) {
logger - > warn ( " Could not re-enable console " ) ;
logger - > info ( " ------------------ User inputs ------------------ " ) ;
return ;
}
2025-09-03 12:10:43 +02:00
std : : thread ( [ & ] ( ) {
2025-09-17 11:16:33 +02:00
auto start = std : : chrono : : high_resolution_clock : : now ( ) ; // Measure the time to renable console
2025-09-03 12:10:43 +02:00
UEngine * Engine = nullptr ;
2025-09-03 12:57:10 +02:00
for ( int i = 0 ; i < 100 ; + + i ) { // gives 10 seconds to find UE Engine
2025-09-03 12:10:43 +02:00
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 100 ) ) ;
Engine = UEngine : : GetEngine ( ) ;
if ( Engine & & Engine - > ConsoleClass & & Engine - > GameViewport )
break ;
}
2025-09-17 11:16:33 +02:00
if ( ! Engine | | ! Engine - > ConsoleClass | | ! Engine - > GameViewport ) {
logger - > error ( " Console could not be found in engine. " ) ;
2025-09-03 12:10:43 +02:00
return ;
2025-09-17 11:16:33 +02:00
}
logger - > info ( " Console found in engine " ) ;
2025-09-03 12:10:43 +02:00
/* Creates a new UObject of class-type specified by Engine->ConsoleClass */
UObject * NewObject = UGameplayStatics : : SpawnObject ( Engine - > ConsoleClass , Engine - > GameViewport ) ;
if ( NewObject )
{
2025-09-17 11:16:33 +02:00
logger - > info ( " Successfully spawned console object " ) ;
2025-09-03 12:10:43 +02:00
// Set the console viewport so that it will be displayed
Engine - > GameViewport - > ViewportConsole = static_cast < UConsole * > ( NewObject ) ;
2025-09-17 11:16:33 +02:00
auto end = std : : chrono : : high_resolution_clock : : now ( ) ;
std : : chrono : : duration < double > elapsed = end - start ;
logger - > info ( " Console fully reactivated in {:.3f}s and bound to key Tilde " , elapsed . count ( ) ) ;
logger - > info ( " ------------------ User inputs ------------------ " ) ;
g_Console_Enabled = true ;
}
else {
logger - > error ( " Could not spawn console object " ) ;
2025-09-03 12:10:43 +02:00
}
} ) . detach ( ) ;
}
// Logging
2025-08-28 06:27:27 +02:00
static void InitializeLogger ( )
{
try
{
std : : filesystem : : path log_path = std : : filesystem : : absolute ( PLUGIN_LOG ) ;
if ( std : : filesystem : : exists ( log_path ) )
std : : filesystem : : remove ( log_path ) ;
logger = std : : make_shared < spdlog : : logger > ( " Metal Gear Solid Delta : Snake Eater " , std : : make_shared < spdlog : : sinks : : rotating_file_sink_st > ( PLUGIN_LOG , 10 * 1024 * 1024 , 1 ) ) ;
logger - > flush_on ( spdlog : : level : : debug ) ; // Flush automatically
}
catch ( const spdlog : : spdlog_ex & ex )
{
std : : string plugin_error_message = " Could not open " + PLUGIN_LOG ;
MessageBoxA ( nullptr , plugin_error_message . c_str ( ) , " Logger Error " , MB_ICONERROR | MB_OK ) ;
}
}
// Standard dll entry
BOOL APIENTRY DllMain ( HMODULE hModule , DWORD reason , LPVOID )
{
if ( reason = = DLL_PROCESS_ATTACH )
{
2025-09-02 14:51:45 +02:00
if ( reason = = DLL_PROCESS_ATTACH )
{
InitializeLogger ( ) ;
logger - > info ( " Plugin {} loaded. " , PLUGIN_NAME ) ;
}
2025-08-28 06:27:27 +02:00
}
else if ( reason = = DLL_PROCESS_DETACH )
{
logger - > info ( " Plugin {} unloaded. " , PLUGIN_NAME ) ;
spdlog : : drop_all ( ) ;
}
return TRUE ;
}