2025-11-26 19:48:45 +01:00
# include "CommonHeaders.h"
# include "GameFixes.h"
# include "GameInformations.h"
# include "ObfuscateString.h"
# include "Memory.hpp"
# include "Maths.hpp"
# include "UEngine.hpp" ;
# include "SDK/Basic.hpp"
# include "SDK/Engine_classes.hpp"
using namespace SDK ;
// Constants
const std : : string PLUGIN_NAME = " LostRecords " ;
const std : : string PLUGIN_LOG = PLUGIN_NAME + " .log " ;
// Logger
std : : shared_ptr < spdlog : : logger > logger ;
// Screen informations
static int screenWidth = GetSystemMetrics ( SM_CXSCREEN ) ;
static int screenHeight = GetSystemMetrics ( SM_CYSCREEN ) ;
static float aspectRatio = ( float ) screenWidth / screenHeight ;
static float baseAspect = 1.777778f ;
// Plugin states
static bool AOBScanDone = false ;
static bool g_fix_enabled = false ;
static bool g_fov_fix_enabled = false ;
static bool g_ultrawide_fix_enabled = false ;
static bool g_DOF_fix_enabled = false ;
static bool g_CA_fix_enabled = false ;
static bool g_Vignetting_fix_enabled = false ;
static bool g_Fog_fix_enabled = false ;
static int g_AdditionalFOVValue = 0 ;
static int g_AdditionalCinematicsFOVValue = 0 ;
static bool b_IsCinematicMode = false ;
static uint8_t g_CamCorderState = 0 ;
static bool g_Console = true ;
// Shared values
static float g_FOV_In = 70.f ;
static float g_Compensated_FOV = 70.f ;
static float g_FOV_Out = 70.f ;
static bool g_Console_Enabled = false ;
// AOB Unreal Engine offsets addresses
static uint8_t * GObjectsaddress = nullptr ;
static uint8_t * AppendStringaddress = nullptr ;
static uint8_t * ProcessEventaddress = nullptr ;
// AOB Scan pointers
static uint8_t * FOVaddress = nullptr ;
static uint8_t * Ultrawideaddress = nullptr ;
static uint8_t * CinematicsUltrawideaddress = nullptr ;
static uint8_t * CinematicsModeaddress = nullptr ;
static uint8_t * CamCorderaddress = nullptr ;
static uint8_t * DOFaddress = nullptr ;
static uint8_t * CAaddress = nullptr ;
static uint8_t * Vignettingaddress = nullptr ;
static uint8_t * Fogaddress = nullptr ;
// Hooking
static SafetyHookMid FOVHook { } ;
static SafetyHookMid UltrawideHook { } ;
static SafetyHookMid CinematicsUltrawideHook { } ;
static SafetyHookMid CinematicsModeHook { } ;
static SafetyHookMid CamCorderStateHook { } ;
// Prototypes
static void FOVFixEnabled ( ) ;
static void UltraWideFixEnabled ( ) ;
static void GetCinematicsMode ( ) ;
static void GetCamcorderState ( ) ;
static void DOFFixEnabled ( ) ;
static void CAFixEnabled ( ) ;
static void VignettingFixEnabled ( ) ;
static void FogFixEnabled ( ) ;
static void EnableConsole ( ) ;
extern " C " __declspec ( dllexport ) void SetFixEnabled ( bool enabled , bool init )
{
g_fix_enabled = enabled ;
if ( g_fix_enabled & & ! AOBScanDone ) {
logger - > info ( " --------------- AOB scan started --------------- " ) ;
if ( ! FOVaddress ) { // Unreal Engine 5.2.0
constexpr auto FOVStringObfuscated = make_obfuscated < 0x4A > ( " 77 ?? 48 ?? ?? FF 90 ?? ?? ?? ?? F3 0F ?? ?? ?? 48 ?? ?? ?? C3 " ) ;
FOVaddress = Memory : : AOBScan ( " " , FOVStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ , logger ) ;
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 ) ) ;
}
if ( ! Ultrawideaddress ) {
constexpr auto UltrawideStringObfuscated = make_obfuscated < 0x4A > ( " F3 ?? ?? ?? 0F 54 ?? ?? ?? ?? ?? 0F 2F ?? ?? ?? ?? ?? 76 ?? 48 8D " ) ;
Ultrawideaddress = Memory : : AOBScan ( " " , UltrawideStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
if ( ! Ultrawideaddress )
logger - > warn ( " Ultrawide signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else
logger - > info ( " Ultrawide signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( Ultrawideaddress ) ) ;
}
if ( ! CinematicsUltrawideaddress ) {
constexpr auto CinematicsUltrawideStringObfuscated = make_obfuscated < 0x4A > ( " 74 ?? 8B 81 ?? ?? ?? ?? 89 ?? ?? 48 8B ?? ?? ?? ?? ?? 48 8B " ) ;
CinematicsUltrawideaddress = Memory : : AOBScan ( " " , CinematicsUltrawideStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
if ( ! CinematicsUltrawideaddress )
logger - > warn ( " Cinematics ultrawide signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else
logger - > info ( " Cinematics ultrawide signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( CinematicsUltrawideaddress ) ) ;
}
if ( ! CinematicsModeaddress ) {
constexpr auto CinematicsModeStringObfuscated = make_obfuscated < 0x4A > ( " 88 81 ?? ?? ?? ?? 48 ?? ?? 80 ?? ?? ?? 0F 84 " ) ;
CinematicsModeaddress = Memory : : AOBScan ( " " , CinematicsModeStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
if ( ! CinematicsModeaddress )
logger - > warn ( " Cinematics mode signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else
logger - > info ( " Cinematics mode signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( CinematicsModeaddress ) ) ;
}
if ( ! CamCorderaddress ) {
constexpr auto CamCorderStateStringObfuscated = make_obfuscated < 0x4A > ( " 0F B6 ?? C4 02 ?? ?? 41 ?? ?? C3 " ) ;
CamCorderaddress = Memory : : AOBScan ( " " , CamCorderStateStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
if ( ! CamCorderaddress )
logger - > warn ( " Cam corder state signature not found. Maybe your game has been updated and is no more compatible with this plugin. " ) ;
else
logger - > info ( " Cam corder state signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( CamCorderaddress ) ) ;
}
if ( ! DOFaddress ) {
constexpr auto DOFStringObfuscated = make_obfuscated < 0x4A > ( " 8B ?? ?? 48 ?? ?? E8 ?? ?? ?? ?? 0F ?? ?? 48 ?? ?? ?? 48 8D " ) ;
DOFaddress = Memory : : AOBScan ( " " , DOFStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
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 ) ) ;
}
if ( ! CAaddress ) {
constexpr auto CAStringObfuscated = make_obfuscated < 0x4A > ( " 7F ?? 89 B3 ?? ?? ?? ?? 8B ?? ?? 39 05 ?? ?? ?? ?? 0F " ) ;
CAaddress = Memory : : AOBScan ( " " , CAStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
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 signature found at address: 0x{:X}. " , reinterpret_cast < uintptr_t > ( CAaddress ) ) ;
}
if ( ! Vignettingaddress ) {
constexpr auto VignettingStringObfuscated = make_obfuscated < 0x4A > ( " 8B ?? 83 ?? ?? 7D ?? 89 B3 ?? ?? ?? ?? EB " ) ;
Vignettingaddress = Memory : : AOBScan ( " " , VignettingStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
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 ) {
constexpr auto FogStringObfuscated = make_obfuscated < 0x4A > ( " 48 8B ?? ?? ?? ?? ?? 83 ?? ?? ?? 75 ?? B3 ?? EB ?? 32 ?? 48 8B ?? ?? ?? 48 ?? ?? 74 ?? E8 ?? ?? ?? ?? 84 " ) ;
Fogaddress = Memory : : AOBScan ( " " , FogStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
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 ) ) ;
}
if ( FOVaddress & & Ultrawideaddress & & CinematicsUltrawideaddress & & CinematicsModeaddress & &
CamCorderaddress & & DOFaddress & & CAaddress & & Vignettingaddress & & Fogaddress )
logger - > info ( " All AOB signatures found. Ready to patch... " ) ;
AOBScanDone = true ;
if ( ! GObjectsaddress | | ! AppendStringaddress | | ! ProcessEventaddress ) {
logger - > info ( " ------------ UEngine offsets search ------------ " ) ;
uint8_t * baseModule = reinterpret_cast < uint8_t * > ( GetModuleHandleA ( nullptr ) ) ; // Get game base address
constexpr auto GObjetcsStringObfuscated = make_obfuscated < 0x4A > ( " 48 8B ?? ?? ?? ?? ?? 48 8B ?? ?? 48 8D ?? ?? EB ?? 33 " ) ;
GObjectsaddress = Memory : : AOBScan ( " " , GObjetcsStringObfuscated . decrypt ( ) , PAGE_EXECUTE_READ ) ;
constexpr auto AppendStringStringObfuscated = make_obfuscated < 0x4A > ( " C3 48 89 ?? ?? ?? 48 89 ?? ?? ?? 57 48 ?? ?? ?? 80 3D ?? ?? ?? ?? ?? 48 " ) ;
AppendStringaddress = Memory : : AOBScan ( " " , 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 ?? ?? 48 89 ?? ?? ?? ?? ?? 4D " ) ;
ProcessEventaddress = Memory : : AOBScan ( " " , 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 ) -
baseModule ) ;
logger - > info ( " GObjects offset is: 0x{:X}. " , gObjectsOffset ) ;
Offsets : : GObjects = static_cast < UC : : uint32 > ( gObjectsOffset ) ; // Update GObjects 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 ( " " , AppendStringaddress + 0x1 ) ; // 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 ( " " , 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-11-28 15:49:38 +01:00
if ( ! init )
logger - > info ( " -------------- Fixes initialisation ------------- " ) ;
2025-11-26 19:48:45 +01:00
}
}
2025-11-27 10:47:15 +01:00
if ( init & & g_fix_enabled )
2025-11-26 19:48:45 +01:00
logger - > info ( " -------------- Fixes initialisation ------------- " ) ;
if ( CinematicsModeaddress ) GetCinematicsMode ( ) ;
if ( CamCorderaddress ) GetCamcorderState ( ) ;
if ( ! init & & FOVaddress ) FOVFixEnabled ( ) ;
if ( ! init & & Ultrawideaddress ) UltraWideFixEnabled ( ) ;
if ( ! init & & DOFaddress ) DOFFixEnabled ( ) ;
if ( ! init & & CAaddress ) CAFixEnabled ( ) ;
if ( ! init & & Vignettingaddress ) VignettingFixEnabled ( ) ;
if ( ! init & & Fogaddress ) FogFixEnabled ( ) ;
if ( ! init & & GObjectsaddress & & AppendStringaddress & & ProcessEventaddress ) EnableConsole ( ) ;
}
// Setters for Reshade addon call
extern " C " __declspec ( dllexport ) void SetFixesEnabled ( GameFixes fix , bool enabled ) {
if ( fix = = GameFixes : : DevConsole ) { g_Console = enabled ; EnableConsole ( ) ; } ;
if ( fix = = GameFixes : : FOV ) { g_fov_fix_enabled = enabled ; FOVFixEnabled ( ) ; }
if ( fix = = GameFixes : : UltraWide ) { g_ultrawide_fix_enabled = enabled ; UltraWideFixEnabled ( ) ; }
if ( fix = = GameFixes : : DOF ) { g_DOF_fix_enabled = enabled ; DOFFixEnabled ( ) ; }
if ( fix = = GameFixes : : ChromaticAberrations ) { g_CA_fix_enabled = enabled ; CAFixEnabled ( ) ; }
if ( fix = = GameFixes : : Vignetting ) { g_Vignetting_fix_enabled = enabled ; VignettingFixEnabled ( ) ; }
if ( fix = = GameFixes : : Fog ) { g_Fog_fix_enabled = enabled ; FogFixEnabled ( ) ; }
}
extern " C " __declspec ( dllexport ) void SetFOV ( int fov )
{
g_AdditionalFOVValue = fov ;
}
extern " C " __declspec ( dllexport ) void SetCinematicsFOV ( int fov )
{
g_AdditionalCinematicsFOVValue = fov ;
}
// Getters for Reshade addon call
extern " C " __declspec ( dllexport ) void GetGameInfos ( GameInfos * infos ) {
if ( ! infos ) return ;
infos - > FOVIn = g_FOV_In ;
infos - > CompensatedFOV = g_Compensated_FOV ;
infos - > FOVOut = g_FOV_Out ;
infos - > consoleEnabled = g_Console_Enabled ;
}
// Code injection functions
static void GetCinematicsMode ( void ) {
if ( ! CinematicsModeHook ) {
CinematicsModeHook = safetyhook : : create_mid ( CinematicsModeaddress ,
[ ] ( SafetyHookContext & ctx ) {
b_IsCinematicMode = static_cast < bool > ( ctx . rax & 0xFF ) ; // 0 - in game mode, 1 - in cinematics mode
} ) ;
}
}
static void GetCamcorderState ( void ) {
if ( ! CamCorderStateHook ) {
CamCorderStateHook = safetyhook : : create_mid ( CamCorderaddress ,
[ ] ( SafetyHookContext & ctx ) {
if ( ! ctx . rcx ) return ;
2025-11-28 15:49:38 +01:00
//0 EUNICamcorderState::Down
//1 EUNICamcorderState::TransitioningToDown
//2 EUNICamcorderState::TransitioningToUp
//3 EUNICamcorderState::Up_Idle
//4 EUNICamcorderState::Up_Recording
//5 EUNICamcorderState::EUNICamcorderState_MAX
g_CamCorderState = * reinterpret_cast < uint8_t * > ( ctx . rcx + 0x2c4 ) ;
2025-11-26 19:48:45 +01:00
} ) ;
}
}
static void FOVFixEnabled ( ) {
if ( FOVaddress ) {
if ( g_fix_enabled & & ( g_fov_fix_enabled | | g_ultrawide_fix_enabled ) & & FOVaddress ) {
if ( ! FOVHook ) { // Hook only once
FOVHook = safetyhook : : create_mid ( FOVaddress + 0x10 ,
[ ] ( SafetyHookContext & ctx ) {
g_Compensated_FOV = g_FOV_In = ctx . xmm0 . f32 [ 0 ] ;
if ( b_IsCinematicMode & & g_CamCorderState = = 0 ) {
if ( g_ultrawide_fix_enabled )
g_Compensated_FOV = ctx . xmm0 . f32 [ 0 ] = Maths : : CompensateHorizontalFOV ( g_FOV_In , baseAspect , aspectRatio ) ;
if ( g_fov_fix_enabled )
ctx . xmm0 . f32 [ 0 ] + = g_AdditionalCinematicsFOVValue ;
}
if ( ! b_IsCinematicMode & & g_fov_fix_enabled & & g_CamCorderState = = 0 )
ctx . xmm0 . f32 [ 0 ] + = g_AdditionalFOVValue ;
g_FOV_Out = ctx . xmm0 . f32 [ 0 ] ;
} ) ;
}
else FOVHook . enable ( ) ;
logger - > info ( " FOV fix enabled " ) ;
}
2025-11-28 15:49:38 +01:00
if ( ! ( g_fix_enabled & & ( g_fov_fix_enabled | | g_ultrawide_fix_enabled ) ) & & FOVaddress ) {
2025-11-26 19:48:45 +01:00
if ( FOVHook ) FOVHook . disable ( ) ;
logger - > info ( " FOV fix disabled " ) ;
}
}
}
static void UltraWideFixEnabled ( ) {
if ( g_fix_enabled & & g_ultrawide_fix_enabled & & Ultrawideaddress & & CinematicsUltrawideaddress ) {
if ( ! UltrawideHook ) {
UltrawideHook = safetyhook : : create_mid ( Ultrawideaddress ,
[ ] ( SafetyHookContext & ctx ) {
ctx . xmm2 . f32 [ 0 ] = aspectRatio ;
2025-11-28 15:49:38 +01:00
b_IsCinematicMode = false ;
2025-11-26 19:48:45 +01:00
} ) ;
}
else UltrawideHook . enable ( ) ;
if ( ! CinematicsUltrawideHook ) {
CinematicsUltrawideHook = safetyhook : : create_mid ( CinematicsUltrawideaddress + 0x8 ,
[ ] ( SafetyHookContext & ctx ) {
2025-11-27 10:47:15 +01:00
if ( b_IsCinematicMode & & g_CamCorderState = = 0 ) // 0 - Camcorder down (if not down ultrawide must not be enabled or it will mess HUD & FOV)
2025-11-26 19:48:45 +01:00
ctx . rax = * ( uint32_t * ) & aspectRatio ;
} ) ;
}
else CinematicsUltrawideHook . enable ( ) ;
FOVFixEnabled ( ) ; // To compensate FOV
logger - > info ( " Ultrawide fix enabled " ) ;
}
if ( ! ( g_fix_enabled & & g_ultrawide_fix_enabled ) & & UltrawideHook & & CinematicsUltrawideaddress ) {
if ( UltrawideHook ) UltrawideHook . disable ( ) ;
if ( CinematicsUltrawideHook ) CinematicsUltrawideHook . disable ( ) ;
logger - > info ( " Ultrawide fix disabled " ) ;
}
}
// Memory patch fixes
static void DOFFixEnabled ( ) {
if ( g_fix_enabled & & g_DOF_fix_enabled & & DOFaddress ) {
Memory : : PatchBytes ( DOFaddress , " \x31 \xFF \x90 " , 3 ) ; // xor edi,edi r.DepthOfFieldQuality = 0
logger - > info ( " Depth of field fix enabled " ) ;
}
if ( ! ( g_fix_enabled & & g_DOF_fix_enabled ) & & DOFaddress ) {
Memory : : RestoreBytes ( DOFaddress ) ;
logger - > info ( " Depth of field fix disabled " ) ;
}
}
static void CAFixEnabled ( ) {
if ( g_fix_enabled & & g_CA_fix_enabled & & CAaddress ) {
Memory : : PatchBytes ( CAaddress , " \x90 \x90 " , 2 ) ; // NOP jg r.SceneColorFringeQuality = 0
logger - > info ( " Chromatic aberrations fix enabled " ) ;
}
if ( ! ( g_fix_enabled & & g_CA_fix_enabled ) & & CAaddress ) {
Memory : : RestoreBytes ( CAaddress ) ;
logger - > info ( " Chromatic aberrations fix disabled " ) ;
}
}
static void VignettingFixEnabled ( ) {
if ( g_fix_enabled & & g_Vignetting_fix_enabled & & Vignettingaddress ) {
Memory : : PatchBytes ( Vignettingaddress , " \x31 \xC9 " , 2 ) ; // xor ecx,ecx r.Tonemapper.Quality=0
logger - > info ( " Vignetting fix enabled " ) ;
}
if ( ! ( g_fix_enabled & & g_Vignetting_fix_enabled ) & & Vignettingaddress ) {
Memory : : RestoreBytes ( Vignettingaddress ) ;
logger - > info ( " Vignetting fix disabled " ) ;
}
}
static void FogFixEnabled ( ) {
if ( g_fix_enabled & & g_Fog_fix_enabled & & Fogaddress ) {
Memory : : PatchBytes ( Fogaddress + 0xb , " \xEB " , 1 ) ; // jne -> jmp r.Fog=0
logger - > info ( " Fog fix enabled " ) ;
}
if ( ! ( g_fix_enabled & & g_Fog_fix_enabled ) & & Fogaddress ) {
Memory : : RestoreBytes ( Fogaddress + 0xb ) ;
logger - > info ( " Fog fix disabled " ) ;
}
}
// UE Console creation
static void EnableConsole ( )
{
if ( g_Console_Enabled | | ! g_Console | | ! GObjectsaddress | | ! AppendStringaddress | | ! ProcessEventaddress ) {
if ( ! g_Console & & g_fix_enabled )
logger - > info ( " ------------------ User inputs ------------------ " ) ;
return ;
}
logger - > info ( " -------------- Console re-enabling -------------- " ) ;
std : : thread ( [ & ] ( ) {
auto start = std : : chrono : : high_resolution_clock : : now ( ) ; // Measure the time to renable console
UEngine * Engine = nullptr ;
for ( int i = 0 ; i < 10 ; + + i ) { // gives 10 seconds to find UE Engine
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 1000 ) ) ;
Engine = UEngine : : GetEngine ( ) ;
if ( Engine & & Engine - > ConsoleClass & & Engine - > GameViewport )
break ;
}
if ( ! Engine | | ! Engine - > ConsoleClass | | ! Engine - > GameViewport ) {
logger - > error ( " Console could not be found in engine. " ) ;
return ;
}
logger - > info ( " Console found in engine " ) ;
/* Creates a new UObject of class-type specified by Engine->ConsoleClass */
UObject * NewObject = UGameplayStatics : : SpawnObject ( Engine - > ConsoleClass , Engine - > GameViewport ) ;
if ( NewObject )
{
logger - > info ( " Successfully spawned console object " ) ;
// Set the console viewport so that it will be displayed
Engine - > GameViewport - > ViewportConsole = static_cast < UConsole * > ( NewObject ) ;
// Compute console enabling duration
auto end = std : : chrono : : high_resolution_clock : : now ( ) ;
std : : chrono : : duration < double > elapsed = end - start ;
// Set the all the console shortkey to F2
for ( int i = 0 ; i < UInputSettings : : GetDefaultObj ( ) - > ConsoleKeys . Num ( ) ; i + + )
{
UInputSettings : : GetDefaultObj ( ) - > ConsoleKeys [ i ] . KeyName = UKismetStringLibrary : : Conv_StringToName ( L " F2 " ) ;
}
logger - > info ( " Console fully reactivated in {:.3f}s and bound to key F2 " , elapsed . count ( ) ) ;
logger - > info ( " ------------------ User inputs ------------------ " ) ;
g_Console_Enabled = true ;
}
else {
logger - > error ( " Could not spawn console object " ) ;
logger - > info ( " ------------------ User inputs ------------------ " ) ;
}
} ) . detach ( ) ;
}
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 > ( " Lost Records Bloom & Rage " , std : : make_shared < spdlog : : sinks : : rotating_file_sink_st > ( PLUGIN_LOG , 10 * 1024 * 1024 , 1 ) ) ;
logger - > 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 ) ;
}
}
// Standard dll entry
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 ;
}