diff --git a/The Callisto Protocol/dllmain.cpp b/The Callisto Protocol/dllmain.cpp index aaaeacc..2e77727 100644 --- a/The Callisto Protocol/dllmain.cpp +++ b/The Callisto Protocol/dllmain.cpp @@ -49,6 +49,7 @@ static float g_LastCameraDeltaTime = 1.f / 60.f; // fallback static float g_HUDLeft = 0.f; static float g_HUDRight = 1.f; static bool g_Console = false; +static bool bIsInBenchmarkMode = false; static bool bIsInventoryOpen = false; static bool bIsInCinematicMode = false; static bool bIsInPrinterMode = false; @@ -78,6 +79,7 @@ static uint8_t* CAaddress = nullptr; static uint8_t* Vignettingaddress = nullptr; static uint8_t* Fogaddress = nullptr; static uint8_t* WorldTimedilationaddress = nullptr; +static uint8_t* SetBenchmarkModeaddress = nullptr; // Hooking static SafetyHookMid FOVHook{}; @@ -85,6 +87,7 @@ static SafetyHookMid CameraHook{}; static SafetyHookMid HUDHook{}; static SafetyHookMid FogHook{}; static SafetyHookMid WorldTimeDilationHook{}; +static SafetyHookMid BenchmarkHook{}; static SafetyHookMid PEHook{}; // Prototypes @@ -139,6 +142,16 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled, bool init) logger->info("Camera signature found at address: 0x{:X}.", reinterpret_cast(Cameraaddress)); } + if (!SetBenchmarkModeaddress) { + constexpr auto BenchMarkStringObfuscated = make_obfuscated<0x4A>("88 86 58 03 ?? ?? 48 8B ?? ?? ?? 48 83 ?? ?? 5F C3"); + SetBenchmarkModeaddress = Memory::AOBScan("", BenchMarkStringObfuscated.decrypt(), PAGE_EXECUTE_READ); + + if (!SetBenchmarkModeaddress) + logger->warn("Set BenchMark mode signature not found. Maybe your game has been updated and is no more compatible with this plugin."); + else + logger->info("Set BenchMark mode signature found at address: 0x{:X}.", reinterpret_cast(SetBenchmarkModeaddress)); + } + if (!HUDaddress) { constexpr auto HUDStringObfuscated = make_obfuscated<0x4A>("FF ?? 48 8B ?? ?? ?? 0F ?? ?? 48 ?? ?? 0F ?? ?? 48 83"); HUDaddress = Memory::AOBScan("", HUDStringObfuscated.decrypt(), PAGE_EXECUTE_READ); @@ -189,7 +202,8 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled, bool init) logger->info("World time dilation signature found at address: 0x{:X}.", reinterpret_cast(WorldTimedilationaddress)); } - if (FOVaddress && Cameraaddress && HUDaddress && CAaddress && Vignettingaddress && Fogaddress && WorldTimedilationaddress) + if (FOVaddress && Cameraaddress && SetBenchmarkModeaddress && HUDaddress && + CAaddress && Vignettingaddress && Fogaddress && WorldTimedilationaddress) logger->info("All AOB signatures found. Ready to patch..."); AOBScanDone = true; @@ -273,8 +287,7 @@ extern "C" __declspec(dllexport) void SetFixesEnabled(GameFixes fix, bool enable if (fix == GameFixes::WorldTimeDilation) { g_TimeDilation_fix_enabled = enabled; TimeDilation(); } } -extern "C" __declspec(dllexport) void SetFOV(int fov) -{ +extern "C" __declspec(dllexport) void SetFOV(int fov) { g_AdditionalFOVValue = fov; } @@ -303,10 +316,8 @@ extern "C" __declspec(dllexport) void SetCameraSmoothness(float smoothness) { // Unreal Engine functions /** * @brief Converts a rotator (Pitch, Yaw) to a forward direction vector. - * * Computes a normalized forward vector from the given FRotator, * using Pitch and Yaw angles (in degrees). - * * @param rotator Input rotation (degrees). * @return Forward direction vector. */ @@ -390,27 +401,30 @@ static void CameraFixEnabled() { if (object && func) { std::string funcName = func->GetName(); - std::string objectName = object->GetFullName(); + std::string objectName = object->GetName(); + std::string objectFullName = object->GetFullName(); static auto start = std::chrono::high_resolution_clock::now(); - + // Detect when benchmark or performance test is not launched + if (objectName.contains("WBP_MainMenu_C") && funcName == "OnInitialized") + bIsInBenchmarkMode = false; // Detect cinematics to disable temporarily camera fix - if (objectName.contains("CineCameraComponent") && funcName == "SetCurrentFocalLength") { + if (objectFullName.contains("CineCameraComponent") && funcName == "SetCurrentFocalLength") { bIsInCinematicMode = true; LastCineCallTime = NowSeconds(); } // Detect reforge station interactions to disable temporarily camera fix - if (objectName.contains("BP_PrinterTabs_C")) { + if (objectFullName.contains("BP_PrinterTabs_C")) { if (funcName == "Show") bIsInPrinterMode = true; if (funcName == "Hide") bIsInPrinterMode = false; } // Detect inventory interactions to disable temporarily camera fix - if (objectName.contains("BP_State_Inventory_C")) { + if (objectFullName.contains("BP_State_Inventory_C")) { if (funcName == "OnBegin") bIsInventoryOpen = true; if (funcName == "OnEnd") bIsInventoryOpen = false; } // Detect camera collisions to avoid world to vanish ending in character death - if (objectName.contains("CameraModifier_PhxCameraRig") && funcName == "BlueprintModifyCamera") + if (objectFullName.contains("CameraModifier_PhxCameraRig") && funcName == "BlueprintModifyCamera") { auto* cameraParams = reinterpret_cast(ctx.r8); if (!cameraParams) return; @@ -446,7 +460,7 @@ static void CameraFixEnabled() { g_NativeCameraDistance = engineBackDist; FVector backComponent = backward * engineBackDist; - if (bIsInCinematicMode || bIsAiming) return; + if (bIsInBenchmarkMode || bIsInCinematicMode || bIsAiming) return; // What we KEEP (height + lateral) FVector preservedOffset = engineOffset - backComponent; @@ -522,9 +536,8 @@ static void CameraFixEnabled() { } else PEHook.enable(); } - if (!(g_fix_enabled && g_camera_fix_enabled) && ProcessEventaddress) { + if (!(g_fix_enabled && g_camera_fix_enabled) && ProcessEventaddress) if (PEHook) PEHook.disable(); - } if (g_fix_enabled && g_camera_fix_enabled && Cameraaddress) { if (!CameraHook) { @@ -537,9 +550,7 @@ static void CameraFixEnabled() { } float dt = g_LastCameraDeltaTime; - float fadeInSpeed = g_CameraSmoothnessValue; // Camera speed when it's getting closer - float fadeOutSpeed = g_CameraSmoothnessValue; // Camera speed when it moves away - // sécurité + // Secure if (dt <= 0.f || dt > 0.1f) dt = 1.f / 60.f; float targetOffset = g_CameraOffset; @@ -547,10 +558,8 @@ static void CameraFixEnabled() { if (bIsInventoryOpen) targetOffset = INVENTORY_CAM_OFFSET; else if (bIsInPrinterMode) targetOffset = FORGE_CAM_OFFSET; - float interpSpeed = (targetOffset < g_TransitionCameraOffset) ? fadeInSpeed : fadeOutSpeed; - g_TransitionCameraOffset = UKismetMathLibrary::FInterpTo(g_TransitionCameraOffset, - targetOffset,dt,interpSpeed); + targetOffset,dt, g_CameraSmoothnessValue); }); } else CameraHook.enable(); @@ -560,6 +569,18 @@ static void CameraFixEnabled() { if (CameraHook) CameraHook.disable(); logger->info("Camera fix disabled"); } + + if (g_fix_enabled && g_camera_fix_enabled && SetBenchmarkModeaddress) { + if (!BenchmarkHook) { + BenchmarkHook = safetyhook::create_mid(SetBenchmarkModeaddress, + [](SafetyHookContext& ctx) { + bIsInBenchmarkMode = true; + }); + } + else BenchmarkHook.enable(); + } + if (!(g_fix_enabled && g_camera_fix_enabled) && SetBenchmarkModeaddress) + if (BenchmarkHook) BenchmarkHook.disable(); } static void HUDFixEnabled() { @@ -598,13 +619,11 @@ static void TimeDilation() { APawn* pawn = GetPawnFromWorld(world); if (!pawn) return; - for (int i = 0; i < world->Levels.Num(); i++) // Loop through level to find actors - { + for (int i = 0; i < world->Levels.Num(); i++) { // Loop through level to find actors ULevel* Level = world->Levels[i]; if (!Level) continue; - for (int j = 0; j < Level->Actors.Num(); j++) // Loop through actors - { + for (int j = 0; j < Level->Actors.Num(); j++) { // Loop through actors AActor* actor = Level->Actors[j]; if (!actor) continue; if (actor == pawn) continue; // We don't want to affect Jacob @@ -630,7 +649,7 @@ static void UltraWideFixEnabled() { static void CAFixEnabled() { if (g_fix_enabled && g_CA_fix_enabled && CAaddress) { - Memory::PatchBytes(CAaddress, "\x90\x90", 2); // NOP jg "HellIsUs-Win64-Shipping.exe"+3D73BD5 r.SceneColorFringeQuality = 0 + 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) {