From 35071ccc94cd21907e523f9a0d06778221d9c69a Mon Sep 17 00:00:00 2001 From: Emmanuel AYME Date: Fri, 25 Jul 2025 15:07:43 +0200 Subject: [PATCH] Added Starfield. Removed unnecessary includes. --- Days Gone/DaysGone.vcxproj | 8 +- Days Gone/dllmain.cpp | 4 +- Dead Space 2023/Dead Space 2023.vcxproj | 8 +- Dead Space 2023/dllmain.cpp | 6 +- Empire Of The Ants/Empire Of The Ants.vcxproj | 8 +- Empire Of The Ants/dllmain.cpp | 4 +- ...Indiana Jones And The Great Circle.vcxproj | 8 +- .../dllmain.cpp | 6 +- Metro Exodus/Metro Exodus.vcxproj | 8 +- Metro Exodus/dllmain.cpp | 6 +- Mindseye/Mindseye.vcxproj | 8 +- Mindseye/dllmain.cpp | 6 +- Reshade Plugins Core.sln | 10 + Robocop UB/RobocopUB.vcxproj | 8 +- Robocop UB/dllmain.cpp | 6 +- South Of Midnight/South Of Midnight.vcxproj | 8 +- South Of Midnight/dllmain.cpp | 6 +- SpiritOfTheNorth/SpiritOfTheNorth.vcxproj | 8 +- SpiritOfTheNorth/dllmain.cpp | 6 +- Starfield/Starfield.vcxproj | 216 +++++++++++++ Starfield/dllmain.cpp | 292 ++++++++++++++++++ TLOU/TLOU.vcxproj | 8 +- TLOU/dllmain.cpp | 2 - TLOU2/TLOU2.vcxproj | 8 +- TLOU2/dllmain.cpp | 5 +- Uncharted LOTC/UnchartedLOTC.vcxproj | 8 +- Uncharted LOTC/dllmain.cpp | 8 +- 27 files changed, 590 insertions(+), 89 deletions(-) create mode 100644 Starfield/Starfield.vcxproj create mode 100644 Starfield/dllmain.cpp diff --git a/Days Gone/DaysGone.vcxproj b/Days Gone/DaysGone.vcxproj index 95ecfb9..53677a5 100644 --- a/Days Gone/DaysGone.vcxproj +++ b/Days Gone/DaysGone.vcxproj @@ -73,19 +73,19 @@ DaysGoneCore - .asi + .dll DaysGoneCore - .asi + .dll DaysGoneCore - .asi + .dll DaysGoneCore - .asi + .dll diff --git a/Days Gone/dllmain.cpp b/Days Gone/dllmain.cpp index 2fb893d..7fd936b 100644 --- a/Days Gone/dllmain.cpp +++ b/Days Gone/dllmain.cpp @@ -57,7 +57,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("F3 0F ?? ?? ?? 48 8D ?? ?? E8 ?? ?? ?? ?? 90 48 ?? ?? 48"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -107,7 +107,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) } if (FOVaddress && FOVfactorAddress && HUDaddress) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } } diff --git a/Dead Space 2023/Dead Space 2023.vcxproj b/Dead Space 2023/Dead Space 2023.vcxproj index e7c53d4..5f6d570 100644 --- a/Dead Space 2023/Dead Space 2023.vcxproj +++ b/Dead Space 2023/Dead Space 2023.vcxproj @@ -73,19 +73,19 @@ DeadSpace2023Core - .asi + .dll DeadSpace2023Core - .asi + .dll DeadSpace2023Core - .asi + .dll DeadSpace2023Core - .asi + .dll diff --git a/Dead Space 2023/dllmain.cpp b/Dead Space 2023/dllmain.cpp index 300bd67..113618f 100644 --- a/Dead Space 2023/dllmain.cpp +++ b/Dead Space 2023/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -40,7 +38,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("F3 0F ?? ?? ?? ?? ?? ?? 0F 2F ?? ?? ?? ?? ?? 77 ?? 48 8B ?? ?? ?? ?? ?? F3 0F ?? ?? ?? F3 0F ?? ?? ?? ?? ?? ??"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -51,7 +49,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) //Dead Space.exe + 1ACB640 - 5B - pop rbx if (!FOVaddress) { logger->warn("FOV signature not found. Maybe your game has been updated and is no more compatible with this plugin."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); } else { logger->info("FOV signature found at address: 0x{:X}.", reinterpret_cast(FOVaddress)); diff --git a/Empire Of The Ants/Empire Of The Ants.vcxproj b/Empire Of The Ants/Empire Of The Ants.vcxproj index 84f3e2d..0909de3 100644 --- a/Empire Of The Ants/Empire Of The Ants.vcxproj +++ b/Empire Of The Ants/Empire Of The Ants.vcxproj @@ -73,19 +73,19 @@ EmpireOfTheAntsCore - .asi + .dll EmpireOfTheAntsCore - .asi + .dll EmpireOfTheAntsCore - .asi + .dll EmpireOfTheAntsCore - .asi + .dll diff --git a/Empire Of The Ants/dllmain.cpp b/Empire Of The Ants/dllmain.cpp index c34ca59..5f381fb 100644 --- a/Empire Of The Ants/dllmain.cpp +++ b/Empire Of The Ants/dllmain.cpp @@ -53,7 +53,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("77 ?? 48 ?? ?? FF 90 ?? ?? ?? ?? F3 0F ?? ?? ?? 48 83"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -86,7 +86,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) } if (FOVaddress && Aspectaddress && DOFaddress) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } } diff --git a/Indiana Jones And The Great Circle/Indiana Jones And The Great Circle.vcxproj b/Indiana Jones And The Great Circle/Indiana Jones And The Great Circle.vcxproj index 17c454e..c62c46a 100644 --- a/Indiana Jones And The Great Circle/Indiana Jones And The Great Circle.vcxproj +++ b/Indiana Jones And The Great Circle/Indiana Jones And The Great Circle.vcxproj @@ -73,19 +73,19 @@ IndianaJonesTGCCore - .asi + .dll IndianaJonesTGCCore - .asi + .dll IndianaJonesTGCCore - .asi + .dll IndianaJonesTGCCore - .asi + .dll diff --git a/Indiana Jones And The Great Circle/dllmain.cpp b/Indiana Jones And The Great Circle/dllmain.cpp index 29a2422..fe731bc 100644 --- a/Indiana Jones And The Great Circle/dllmain.cpp +++ b/Indiana Jones And The Great Circle/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -57,6 +55,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("F3 44 ?? ?? ?? ?? 48 8B ?? ?? ?? 4C ?? ?? 49 0F ?? ?? ?? ?? ?? ?? 4C 8D"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -89,7 +88,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) } if (FOVaddress && CinematicsFOVaddress && CinematicsFTaddress) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } } @@ -157,6 +156,7 @@ extern "C" __declspec(dllexport) float GetCinematicsFOVOut() { return g_Cinematics_FOV_Out; } +// Injection functions static void FOVFixEnabled(bool fix_enabled) { if (g_fix_enabled && fix_enabled && FOVaddress != nullptr) { if (!FOVHook) { // Hook only once diff --git a/Metro Exodus/Metro Exodus.vcxproj b/Metro Exodus/Metro Exodus.vcxproj index 73e2df2..289b34f 100644 --- a/Metro Exodus/Metro Exodus.vcxproj +++ b/Metro Exodus/Metro Exodus.vcxproj @@ -73,19 +73,19 @@ MetroExodusCore - .asi + .dll MetroExodusCore - .asi + .dll MetroExodusCore - .asi + .dll MetroExodusCore - .asi + .dll diff --git a/Metro Exodus/dllmain.cpp b/Metro Exodus/dllmain.cpp index bda6715..f771ad4 100644 --- a/Metro Exodus/dllmain.cpp +++ b/Metro Exodus/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -54,7 +52,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("3C ?? 0F 86 ?? ?? ?? ?? F3 0F"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -100,7 +98,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) } if (FOVaddress && CutscenesFOVaddress && Aspectaddress_1 && Aspectaddress_2) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } } diff --git a/Mindseye/Mindseye.vcxproj b/Mindseye/Mindseye.vcxproj index f698986..a51041e 100644 --- a/Mindseye/Mindseye.vcxproj +++ b/Mindseye/Mindseye.vcxproj @@ -73,19 +73,19 @@ MindseyeCore - .asi + .dll MindseyeCore - .asi + .dll MindseyeCore - .asi + .dll MindseyeCore - .asi + .dll diff --git a/Mindseye/dllmain.cpp b/Mindseye/dllmain.cpp index 11af2f8..22caa89 100644 --- a/Mindseye/dllmain.cpp +++ b/Mindseye/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -53,7 +51,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("EB ?? F3 0F ?? ?? ?? ?? ?? ?? F3 0F ?? ?? ?? 8B 83 ?? ?? ?? ?? 89 ?? ?? 0F B6 8B"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -83,7 +81,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) if (FOVaddress != nullptr && Aspectaddress != nullptr && DOFaddress != nullptr) logger->info("All AOB signatures found. Ready to patch..."); if (FOVaddress && Aspectaddress && DOFaddress) AOBScanDone = true; - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); } } if (g_fix_enabled) { diff --git a/Reshade Plugins Core.sln b/Reshade Plugins Core.sln index 79a3d86..738e920 100644 --- a/Reshade Plugins Core.sln +++ b/Reshade Plugins Core.sln @@ -37,6 +37,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Robocop UB", "Robocop UB\Ro EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TLOU", "TLOU\TLOU.vcxproj", "{354D2D75-935B-4CF0-BDC6-98D1797F8AAB}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Starfield", "Starfield\Starfield.vcxproj", "{A41D75D0-D4F9-4688-93EE-C33CBC266F52}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -173,6 +175,14 @@ Global {354D2D75-935B-4CF0-BDC6-98D1797F8AAB}.Release|x64.Build.0 = Release|x64 {354D2D75-935B-4CF0-BDC6-98D1797F8AAB}.Release|x86.ActiveCfg = Release|Win32 {354D2D75-935B-4CF0-BDC6-98D1797F8AAB}.Release|x86.Build.0 = Release|Win32 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Debug|x64.ActiveCfg = Debug|x64 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Debug|x64.Build.0 = Debug|x64 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Debug|x86.ActiveCfg = Debug|Win32 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Debug|x86.Build.0 = Debug|Win32 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Release|x64.ActiveCfg = Release|x64 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Release|x64.Build.0 = Release|x64 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Release|x86.ActiveCfg = Release|Win32 + {A41D75D0-D4F9-4688-93EE-C33CBC266F52}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Robocop UB/RobocopUB.vcxproj b/Robocop UB/RobocopUB.vcxproj index 07ce785..d6b5bd9 100644 --- a/Robocop UB/RobocopUB.vcxproj +++ b/Robocop UB/RobocopUB.vcxproj @@ -73,19 +73,19 @@ RobocopUBCore - .asi + .dll RobocopUBCore - .asi + .dll RobocopUBCore - .asi + .dll RobocopUBCore - .asi + .dll diff --git a/Robocop UB/dllmain.cpp b/Robocop UB/dllmain.cpp index c052ddd..820abbb 100644 --- a/Robocop UB/dllmain.cpp +++ b/Robocop UB/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -53,7 +51,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("F3 0F ?? ?? ?? 48 8B ?? 48 8B ?? 4C 8D ?? ?? 48 8B"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -87,7 +85,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) if (FOVaddress != nullptr && Aspectaddress != nullptr && DOFaddress != nullptr) logger->info("All AOB signatures found. Ready to patch..."); if (FOVaddress && Aspectaddress && DOFaddress) AOBScanDone = true; - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); } } if (g_fix_enabled) { diff --git a/South Of Midnight/South Of Midnight.vcxproj b/South Of Midnight/South Of Midnight.vcxproj index ebb30bb..5d625ae 100644 --- a/South Of Midnight/South Of Midnight.vcxproj +++ b/South Of Midnight/South Of Midnight.vcxproj @@ -73,19 +73,19 @@ SouthOfMidnightCore - .asi + .dll SouthOfMidnightCore - .asi + .dll SouthOfMidnightCore - .asi + .dll SouthOfMidnightCore - .asi + .dll diff --git a/South Of Midnight/dllmain.cpp b/South Of Midnight/dllmain.cpp index 2a8d849..612c05e 100644 --- a/South Of Midnight/dllmain.cpp +++ b/South Of Midnight/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -51,7 +49,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("90 0F ?? ?? 48 8B 8C ?? ?? ?? ?? ?? 48 ?? ?? E8 ?? ?? ?? ?? 0F 28"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -85,7 +83,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) } if (FOVaddress != nullptr && Aspectaddress != nullptr) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } } diff --git a/SpiritOfTheNorth/SpiritOfTheNorth.vcxproj b/SpiritOfTheNorth/SpiritOfTheNorth.vcxproj index 9a138f7..0688991 100644 --- a/SpiritOfTheNorth/SpiritOfTheNorth.vcxproj +++ b/SpiritOfTheNorth/SpiritOfTheNorth.vcxproj @@ -73,19 +73,19 @@ SpiritOfTheNorthCore - .asi + .dll SpiritOfTheNorthCore - .asi + .dll SpiritOfTheNorthCore - .asi + .dll SpiritOfTheNorthCore - .asi + .dll diff --git a/SpiritOfTheNorth/dllmain.cpp b/SpiritOfTheNorth/dllmain.cpp index 0b78dfc..e87db5e 100644 --- a/SpiritOfTheNorth/dllmain.cpp +++ b/SpiritOfTheNorth/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include // Constants @@ -53,7 +51,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { constexpr auto FOVStringObfuscated = make_obfuscated<0x4A>("EB ?? F3 0F ?? ?? ?? ?? ?? ?? F3 0F ?? ?? ?? 8B 83 ?? ?? ?? ?? 89"); FOVaddress = Memory::aob_scan(gameExecutable, FOVStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -83,7 +81,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) if (FOVaddress != nullptr && Aspectaddress != nullptr && DOFaddress != nullptr) logger->info("All AOB signatures found. Ready to patch..."); if (FOVaddress && Aspectaddress && DOFaddress) AOBScanDone = true; - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); } } if (g_fix_enabled) { diff --git a/Starfield/Starfield.vcxproj b/Starfield/Starfield.vcxproj new file mode 100644 index 0000000..169b5b9 --- /dev/null +++ b/Starfield/Starfield.vcxproj @@ -0,0 +1,216 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {A41D75D0-D4F9-4688-93EE-C33CBC266F52} + Starfield + 10.0 + Starfield + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + StarfieldCore + .dll + + + StarfieldCore + .dll + + + StarfieldCore + .dll + + + StarfieldCore + .dll + + + + Level3 + true + + + true + NotUsing + + + + $(SolutionDir)Memory;$(SolutionDir)Maths;$(SolutionDir)Obfuscate;$(SolutionDir)external;$(SolutionDir)external\safetyhook\include;$(SolutionDir)external\zydis\dependencies\zycore\include;$(SolutionDir)external\zydis\include;$(SolutionDir)zydis\src;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + MultiThreadedDLL + stdcpp23 + true + + + Windows + true + false + $(SolutionDir)external\zydis\Libs;$(SolutionDir)external\Maths;%(AdditionalLibraryDirectories) + Zydis.lib;Maths.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + + + true + NotUsing + + + + $(SolutionDir)Memory;$(SolutionDir)Maths;$(SolutionDir)Obfuscate;$(SolutionDir)external;$(SolutionDir)external\safetyhook\include;$(SolutionDir)external\zydis\dependencies\zycore\include;$(SolutionDir)external\zydis\include;$(SolutionDir)zydis\src;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + MultiThreadedDLL + stdcpp23 + true + + + Windows + true + false + $(SolutionDir)external\zydis\Libs;$(SolutionDir)external\Maths;%(AdditionalLibraryDirectories) + Zydis.lib;Maths.lib;%(AdditionalDependencies) + + + + + Level3 + true + + + true + NotUsing + + + + $(SolutionDir)Memory;$(SolutionDir)Maths;$(SolutionDir)Obfuscate;$(SolutionDir)external;$(SolutionDir)external\safetyhook\include;$(SolutionDir)external\zydis\dependencies\zycore\include;$(SolutionDir)external\zydis\include;$(SolutionDir)zydis\src;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + MultiThreadedDLL + stdcpp23 + true + + + Windows + true + false + $(SolutionDir)external\zydis\Libs;$(SolutionDir)external\Maths;%(AdditionalLibraryDirectories) + Zydis.lib;Maths.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + + + true + NotUsing + + + + $(SolutionDir)Memory;$(SolutionDir)Maths;$(SolutionDir)Obfuscate;$(SolutionDir)external;$(SolutionDir)external\safetyhook\include;$(SolutionDir)external\zydis\dependencies\zycore\include;$(SolutionDir)external\zydis\include;$(SolutionDir)zydis\src;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + MultiThreadedDLL + stdcpp23 + true + + + Windows + true + false + $(SolutionDir)external\zydis\Libs;$(SolutionDir)external\Maths;%(AdditionalLibraryDirectories) + Zydis.lib;Maths.lib;%(AdditionalDependencies) + + + + + {f9b5bbc6-67d4-4290-986f-08c6bac41ba3} + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Starfield/dllmain.cpp b/Starfield/dllmain.cpp new file mode 100644 index 0000000..de58306 --- /dev/null +++ b/Starfield/dllmain.cpp @@ -0,0 +1,292 @@ +#include "Memory.hpp"; +#include "Maths.hpp"; +#include "ObfuscateString.h" +#include +#include +#include +#include + +// Constants +const std::string PLUGIN_NAME = "Starfield"; +const std::string PLUGIN_LOG = "Starfield.log"; +const std::string gameExecutable = "Starfield.exe"; + +// Logger +std::shared_ptr logger; + +// Screen informations +static int screenWidth = GetSystemMetrics(SM_CXSCREEN); +static int screenHeight = GetSystemMetrics(SM_CYSCREEN); +static float aspectRatio = (float)screenWidth / screenHeight; + +// Plugin states +static bool AOBScanDone = false; +static bool g_fix_enabled = false; +static bool g_dialog_fov_fix_enabled = false; +static bool g_weapon_fov_fix_enabled = false; +static bool g_HUD_fix_enabled = false; +static bool g_photomode_fix_enabled = false; +static int g_AdditionalDialogFOVValue = 0; +static int g_AdditionalWeaponFOVValue = 0; +static float g_HUDXValue = 0; +static float g_HUDYValue = 0; + +// Shared values +static float g_Dialog_FOV_In = 0; +static float g_Dialog_FOV_Out = 0; +static float g_Weapon_FOV_In = 0; +static float g_Weapon_FOV_Out = 0; + +// AOB Scan pointers +static uint8_t* DialogFOVAddress = nullptr; +static uint8_t* WeaponFOVAddress = nullptr; +static uint8_t* HUDAddress = nullptr; +static uint8_t* PhotomodeAddress = nullptr; + +// Hooking +static SafetyHookMid DialogFOVHook{}; +static SafetyHookMid WeaponFOVHook{}; +static SafetyHookMid HUDHook{}; + +// Prototypes +static void DialogFOVFixEnabled(bool fix_enabled); +static void WeaponFOVFixEnabled(bool fix_enabled); +static void HUDFixEnabled(bool fix_enabled); +static void PhotomodeFixEnabled(bool fix_enabled); + +extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) +{ + g_fix_enabled = enabled; + if (g_fix_enabled && !AOBScanDone) { + logger->info("--------------- AOB scan started ---------------"); + // === AOB Scans === + if (!DialogFOVAddress) { + constexpr auto DialogFOVPattern = make_obfuscated<0x4A>("E9 ?? ?? ?? ?? 49 ?? ?? E8 ?? ?? ?? ?? 84 ?? 0F 84 ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? 48 89"); + DialogFOVAddress = Memory::aob_scan(gameExecutable, DialogFOVPattern.decrypt(), PAGE_EXECUTE_READ); + if (DialogFOVAddress) + { + logger->info("Dialog FOV signature found at address: 0x{:X}.", reinterpret_cast(DialogFOVAddress)); + } + else logger->warn("Dialog FOV signature not found. Maybe the game was updated."); + } + if (!WeaponFOVAddress) { + constexpr auto WeaponFOVPattern = make_obfuscated<0x4A>("C5 FA ?? ?? ?? ?? ?? ?? 80 3D ?? ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? 74"); + WeaponFOVAddress = Memory::aob_scan(gameExecutable, WeaponFOVPattern.decrypt(), PAGE_EXECUTE_READ); + if (WeaponFOVAddress) + { + logger->info("Weapon FOV signature found at address: 0x{:X}.", reinterpret_cast(WeaponFOVAddress)); + } + else logger->warn("Weapon FOV signature not found. Maybe the game was updated."); + } + if (!HUDAddress) { + constexpr auto HUDPattern = make_obfuscated<0x4A>("C4 61 ?? ?? ?? ?? ?? ?? ?? C4 61 ?? ?? ?? ?? ?? ?? ?? 45 ?? ?? 74"); + HUDAddress = Memory::aob_scan(gameExecutable, HUDPattern.decrypt(), PAGE_EXECUTE_READ); + if (HUDAddress) + { + logger->info("HUD safe zone signature found at address: 0x{:X}.", reinterpret_cast(HUDAddress)); + HUDAddress += 0x12; + } + else logger->warn("HUD safe zone signature not found. Maybe the game was updated."); + } + if (!PhotomodeAddress) { + constexpr auto PhotomodePattern = make_obfuscated<0x4A>("74 ?? 0F BA ?? ?? 89 87 ?? ?? ?? ?? C6 87 ?? ?? ?? ?? ?? E8"); + PhotomodeAddress = Memory::aob_scan(gameExecutable, PhotomodePattern.decrypt(), PAGE_EXECUTE_READ); + if (PhotomodeAddress) + { + logger->info("Photo mode signature found at address: 0x{:X}.", reinterpret_cast(PhotomodeAddress)); + } + else logger->warn("Photo mode signature not found. Maybe the game was updated."); + if (DialogFOVAddress && WeaponFOVAddress && HUDAddress && PhotomodeAddress) { + logger->info("All AOB signatures found. Ready to patch..."); + logger->info("--------------- AOB scan finished ---------------"); + AOBScanDone = true; + } + else + logger->warn("Some AOB signatures could not be found. Fixes may be partially unavailable."); + } + } + // === Activer ou désactiver les patchs === + if (DialogFOVAddress && WeaponFOVAddress && HUDAddress && PhotomodeAddress) + { + if (g_fix_enabled) + { + DialogFOVFixEnabled(g_dialog_fov_fix_enabled); + WeaponFOVFixEnabled(g_weapon_fov_fix_enabled); + HUDFixEnabled(g_HUD_fix_enabled); + PhotomodeFixEnabled(g_photomode_fix_enabled); + } + else + { + DialogFOVFixEnabled(false); + WeaponFOVFixEnabled(false); + HUDFixEnabled(false); + PhotomodeFixEnabled(false); + logger->info("All fixes disabled."); + } + } +} + +// Setters for Reshade addon call +extern "C" __declspec(dllexport) void SetDialogFOVFixEnabled(bool enabled, bool init) +{ + g_dialog_fov_fix_enabled = enabled; + if (!init) DialogFOVFixEnabled(g_dialog_fov_fix_enabled); +} + +extern "C" __declspec(dllexport) void SetWeaponFOVFixEnabled(bool enabled, bool init) +{ + g_weapon_fov_fix_enabled = enabled; + if (!init) WeaponFOVFixEnabled(g_weapon_fov_fix_enabled); +} + +extern "C" __declspec(dllexport) void SetHUDFixEnabled(bool enabled, bool init) +{ + g_HUD_fix_enabled = enabled; + if (!init) HUDFixEnabled(g_HUD_fix_enabled); +} + +extern "C" __declspec(dllexport) void SetPhotoModeFixEnabled(bool enabled, bool init) +{ + g_photomode_fix_enabled = enabled; + if (!init) PhotomodeFixEnabled(g_photomode_fix_enabled); +} + +extern "C" __declspec(dllexport) void SetDialogFOV(int fov) +{ + g_AdditionalDialogFOVValue = fov; +} + +extern "C" __declspec(dllexport) void SetWeaponFOV(int fov) +{ + g_AdditionalWeaponFOVValue = fov; +} + +extern "C" __declspec(dllexport) void SetHUDX(int HUDX) +{ + g_HUDXValue = HUDX; +} + +extern "C" __declspec(dllexport) void SetHUDY(int HUDY) +{ + g_HUDYValue = HUDY; +} + +// Getters for Reshade addon call +extern "C" __declspec(dllexport) float GetDialogFOVIn() { + return g_Dialog_FOV_In; +} + +extern "C" __declspec(dllexport) float GetDialogFOVOut() { + return g_Dialog_FOV_Out; +} + +extern "C" __declspec(dllexport) float GetWeaponFOVIn() { + return g_Weapon_FOV_In; +} + +extern "C" __declspec(dllexport) float GetWeaponFOVOut() { + return g_Weapon_FOV_Out; +} + +// Assembly code injections functions +static void DialogFOVFixEnabled(bool fix_enabled) { + if (g_fix_enabled && fix_enabled && DialogFOVAddress != nullptr) { + if (!DialogFOVHook) { // Hook only once + DialogFOVHook = safetyhook::create_mid(DialogFOVAddress, + [](SafetyHookContext& ctx) { + g_Dialog_FOV_In = ctx.xmm6.f32[0]; + g_Dialog_FOV_Out = ctx.xmm6.f32[0] += (g_dialog_fov_fix_enabled ? g_AdditionalDialogFOVValue : 0); // World FOV + }); + } + else DialogFOVHook.enable(); + logger->info("FOV fix enabled"); + } + if (!fix_enabled && DialogFOVHook) { + DialogFOVHook.disable(); + logger->info("FOV fix disabled"); + } +} + +static void WeaponFOVFixEnabled(bool fix_enabled) { + if (g_fix_enabled && fix_enabled && WeaponFOVAddress != nullptr) { + if (!WeaponFOVHook) { + WeaponFOVHook = safetyhook::create_mid(WeaponFOVAddress, + [](SafetyHookContext& ctx) { + g_Weapon_FOV_In = ctx.xmm0.f32[0]; + g_Weapon_FOV_Out = ctx.xmm0.f32[0] += (g_weapon_fov_fix_enabled ? g_AdditionalWeaponFOVValue : 0); + }); + } + else WeaponFOVHook.enable(); + logger->info("Weapon FOV fix enabled"); + } + if (!fix_enabled && WeaponFOVHook) { + WeaponFOVHook.disable(); + logger->info("Weapon FOV fix disabled"); + } +} + +static void HUDFixEnabled(bool fix_enabled) { + if (g_fix_enabled && fix_enabled && HUDAddress) { + if (!HUDHook) { + HUDHook = safetyhook::create_mid(HUDAddress, + [](SafetyHookContext& ctx) { + int safeZoneX = (screenWidth / 2) * (g_HUDXValue / 100); + int safeZoneY = (screenHeight / 2) * (g_HUDYValue / 100); + ctx.r9 = *reinterpret_cast(&safeZoneX); // X axis + ctx.r8 = *reinterpret_cast(&safeZoneY); // Y axis + }); + } + else HUDHook.enable(); + logger->info("HUD fix enabled"); + } + if (!fix_enabled && HUDHook) { + HUDHook.disable(); + logger->info("HUD fix disabled"); + } +} + +static void PhotomodeFixEnabled(bool fix_enabled) { + if (g_fix_enabled && fix_enabled && PhotomodeAddress != nullptr) { + Memory::PatchBytes(PhotomodeAddress, "\xEB", 1); // je ==> jmp + logger->info("Photomode fix enabled"); + } + if (!fix_enabled && PhotomodeAddress) { + Memory::RestoreBytes(PhotomodeAddress); + logger->info("Photomode fix disabled"); + } +} + +// spdlog init with specific format +static void InitializeLogger() +{ + try + { + logger = spdlog::basic_logger_mt("Fixlib", PLUGIN_LOG, true); + spdlog::set_default_logger(logger); + // Format : [YYYY-MM-DD HH:MM:SS] [INFO] message + spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%^%l%$] %v"); + spdlog::set_level(spdlog::level::debug); + 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); + } +} + +// Entry point +BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) +{ + if (reason == DLL_PROCESS_ATTACH) + { + InitializeLogger(); + logger->info("Plugin {} loaded.", PLUGIN_NAME); + } + else if (reason == DLL_PROCESS_DETACH) + { + logger->info("Plugin {} unloaded.", PLUGIN_NAME); + spdlog::drop_all(); + } + return TRUE; +} \ No newline at end of file diff --git a/TLOU/TLOU.vcxproj b/TLOU/TLOU.vcxproj index 11df2c8..3218e3d 100644 --- a/TLOU/TLOU.vcxproj +++ b/TLOU/TLOU.vcxproj @@ -73,19 +73,19 @@ TLOUCore - .asi + .dll TLOUCore - .asi + .dll TLOUCore - .asi + .dll TLOUCore - .asi + .dll diff --git a/TLOU/dllmain.cpp b/TLOU/dllmain.cpp index 146c326..1bcf064 100644 --- a/TLOU/dllmain.cpp +++ b/TLOU/dllmain.cpp @@ -1,7 +1,6 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include @@ -242,7 +241,6 @@ static void InitializeLogger() MessageBoxA(nullptr, plugin_error_message.c_str(), "Logger Error", MB_ICONERROR | MB_OK); } } -HMODULE g_coreModule = nullptr; // Entry point BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID) diff --git a/TLOU2/TLOU2.vcxproj b/TLOU2/TLOU2.vcxproj index cc8fcb9..7feb127 100644 --- a/TLOU2/TLOU2.vcxproj +++ b/TLOU2/TLOU2.vcxproj @@ -73,19 +73,19 @@ TLOU2Core - .asi + .dll TLOU2Core - .asi + .dll TLOU2Core - .asi + .dll TLOU2Core - .asi + .dll diff --git a/TLOU2/dllmain.cpp b/TLOU2/dllmain.cpp index 8804f0d..a57e1e7 100644 --- a/TLOU2/dllmain.cpp +++ b/TLOU2/dllmain.cpp @@ -1,7 +1,6 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include @@ -53,7 +52,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) { g_fix_enabled = enabled; if (g_fix_enabled && !AOBScanDone) { - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); // === AOB Scans === if (!FOVAddress) { constexpr auto FOVPattern = make_obfuscated<0x4A>("E8 ?? ?? ?? ?? C5 FA ?? ?? ?? ?? ?? ?? C5 F8 ?? ?? E8 ?? ?? ?? ?? C5 7A"); @@ -85,7 +84,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled) else logger->warn("Sharpness signature not found. Maybe the game was updated."); if (FOVAddress && CameraAddress && SharpnessAddress) { logger->info("All AOB signatures found. Ready to patch..."); - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); AOBScanDone = true; } else diff --git a/Uncharted LOTC/UnchartedLOTC.vcxproj b/Uncharted LOTC/UnchartedLOTC.vcxproj index 3ba7e67..3815f1f 100644 --- a/Uncharted LOTC/UnchartedLOTC.vcxproj +++ b/Uncharted LOTC/UnchartedLOTC.vcxproj @@ -73,19 +73,19 @@ UnchartedLOTCCore - .asi + .dll UnchartedLOTCCore - .asi + .dll UnchartedLOTCCore - .asi + .dll UnchartedLOTCCore - .asi + .dll diff --git a/Uncharted LOTC/dllmain.cpp b/Uncharted LOTC/dllmain.cpp index dee9112..dd2c7ae 100644 --- a/Uncharted LOTC/dllmain.cpp +++ b/Uncharted LOTC/dllmain.cpp @@ -1,11 +1,9 @@ #include "Memory.hpp"; #include "Maths.hpp"; #include "ObfuscateString.h" -#include #include #include #include -#include #include #include @@ -80,7 +78,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled, bool init) if (g_fix_enabled && !AOBScanDone) { logger->info("Module {} detected", gameExecutable); - logger->info("--------------- AOB scanning started ---------------"); + logger->info("--------------- AOB scan started ---------------"); if (FOVaddress == nullptr) { if (gameExecutable == "u4.exe") { auto FOVStringObfuscated = make_obfuscated<0x4A>("C5 FA ?? ?? ?? ?? ?? ?? C5 F2 ?? ?? ?? ?? ?? ?? C5 7A ?? ?? ?? ?? ?? ?? C5 7A"); @@ -161,7 +159,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled, bool init) logger->info("All AOB signatures found. Ready to patch..."); } if (FOVaddress && PHOTOaddress && CINEMATICSASPECTaddress && Aspectaddress && DOFaddress && EFFECTSaddress) AOBScanDone = true; - logger->info("--------------- AOB scanning finished ---------------"); + logger->info("--------------- AOB scan finished ---------------"); } if (g_fix_enabled) { if (FOVaddress) FOVFixEnabled(g_fov_fix_enabled); @@ -269,6 +267,7 @@ static void FOVFixEnabled(bool fix_enabled) { } } +// Injection functions static void PhotoFOVFixEnabled (bool fix_enabled) { if (g_fix_enabled && fix_enabled && PHOTOaddress) { if (!PhotoFOVHook) { // Hook only once @@ -283,7 +282,6 @@ static void PhotoFOVFixEnabled (bool fix_enabled) { logger->info("Photo FOV fix enabled"); } if (!fix_enabled && PHOTOaddress && PhotoFOVHook) { - //if (PhotoFOVHook) PhotoFOVHook.disable(); logger->info("Photo FOV fix disabled"); }