From ffcead3ed094ff54e27b3b31b2aab1a5c402ffe0 Mon Sep 17 00:00:00 2001 From: Milxnor Date: Fri, 24 Mar 2023 23:59:31 -0400 Subject: [PATCH] 2.5 semi supprt what --- Project Reboot 3.0/FortGameModeAthena.cpp | 2 +- Project Reboot 3.0/FortKismetLibrary.cpp | 15 +++++- Project Reboot 3.0/FortKismetLibrary.h | 2 + Project Reboot 3.0/FortPawn.cpp | 25 +++++++-- Project Reboot 3.0/FortPlayerPawn.cpp | 3 ++ .../InventoryManagementLibrary.h | 4 +- Project Reboot 3.0/addresses.cpp | 4 +- Project Reboot 3.0/dllmain.cpp | 39 +++++++++----- Project Reboot 3.0/finder.h | 51 +++++++++++++------ 9 files changed, 110 insertions(+), 35 deletions(-) diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index 4192439..9e50e19 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -972,7 +972,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena LOG_INFO(LogDev, "HandleStartingNewPlayer end"); - if (Engine_Version < 420) + if (Fortnite_Version <= 2.5) { static auto QuickBarsOffset = NewPlayer->GetOffset("QuickBars", false); diff --git a/Project Reboot 3.0/FortKismetLibrary.cpp b/Project Reboot 3.0/FortKismetLibrary.cpp index 26929ed..837d77b 100644 --- a/Project Reboot 3.0/FortKismetLibrary.cpp +++ b/Project Reboot 3.0/FortKismetLibrary.cpp @@ -66,6 +66,12 @@ void UFortKismetLibrary::ApplyCharacterCosmetics(UObject* WorldContextObject, co } } +void UFortKismetLibrary::PickLootDropsWithNamedWeightsHook(UObject* Context, FFrame& Stack, void* Ret) +{ + LOG_INFO(LogDev, __FUNCTION__); + return PickLootDropsWithNamedWeightsOriginal(Context, Stack, Ret); +} + void UFortKismetLibrary::SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret) { UObject* WorldContextObject; // 0x0(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) @@ -149,7 +155,7 @@ void UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHo LOG_INFO(LogDev, __FUNCTION__); - return CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal(Context, Stack, Ret); + // return CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal(Context, Stack, Ret); int Count = 1; @@ -167,9 +173,11 @@ void UFortKismetLibrary::GiveItemToInventoryOwnerHook(UObject* Context, FFrame& { static auto ItemLevelOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "ItemLevel", false); static auto PickupInstigatorHandleOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "PickupInstigatorHandle", false); + static auto ItemVariantGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.GiveItemToInventoryOwner", "ItemVariantGuid", false); TScriptInterface InventoryOwner; // = *(TScriptInterface*)(__int64(Params) + InventoryOwnerOffset); UFortWorldItemDefinition* ItemDefinition = nullptr; // *(UFortWorldItemDefinition**)(__int64(Params) + ItemDefinitionOffset); + FGuid ItemVariantGuid; int NumberToGive; // = *(int*)(__int64(Params) + NumberToGiveOffset); bool bNotifyPlayer; // = *(bool*)(__int64(Params) + bNotifyPlayerOffset); int ItemLevel; // = *(int*)(__int64(Params) + ItemLevelOffset); @@ -177,6 +185,7 @@ void UFortKismetLibrary::GiveItemToInventoryOwnerHook(UObject* Context, FFrame& Stack.StepCompiledIn(&InventoryOwner); Stack.StepCompiledIn(&ItemDefinition); + if (ItemVariantGuidOffset != -1) Stack.StepCompiledIn(&ItemVariantGuid); Stack.StepCompiledIn(&NumberToGive); Stack.StepCompiledIn(&bNotifyPlayer); @@ -293,15 +302,19 @@ void UFortKismetLibrary::K2_RemoveItemFromPlayerByGuidHook(UObject* Context, FFr void UFortKismetLibrary::K2_GiveItemToPlayerHook(UObject* Context, FFrame& Stack, void* Ret) { + static auto ItemVariantGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortKismetLibrary.K2_GiveItemToPlayer", "ItemVariantGuid", false); + auto Params = Stack.Locals; AFortPlayerController* PlayerController = nullptr; UFortWorldItemDefinition* ItemDefinition = nullptr; + FGuid ItemVariantGuid; int NumberToGive; bool bNotifyPlayer; Stack.StepCompiledIn(&PlayerController); Stack.StepCompiledIn(&ItemDefinition); + if (ItemVariantGuidOffset != -1) Stack.StepCompiledIn(&ItemVariantGuid); Stack.StepCompiledIn(&NumberToGive); Stack.StepCompiledIn(&bNotifyPlayer); diff --git a/Project Reboot 3.0/FortKismetLibrary.h b/Project Reboot 3.0/FortKismetLibrary.h index 93d5fb7..feb87d5 100644 --- a/Project Reboot 3.0/FortKismetLibrary.h +++ b/Project Reboot 3.0/FortKismetLibrary.h @@ -79,10 +79,12 @@ public: static inline void (*K2_SpawnPickupInWorldWithLootTierOriginal)(UObject* Context, FFrame& Stack, void* Ret); static inline bool (*SpawnInstancedPickupInWorldOriginal)(UObject* Context, FFrame& Stack, bool* Ret); static inline void (*SpawnItemVariantPickupInWorldOriginal)(UObject* Context, FFrame& Stack, void* Ret); + static inline void (*PickLootDropsWithNamedWeightsOriginal)(UObject* Context, FFrame& Stack, void* Ret); static UFortResourceItemDefinition* K2_GetResourceItemDefinition(EFortResourceType ResourceType); static void ApplyCharacterCosmetics(UObject* WorldContextObject, const TArray& CharacterParts, UObject* PlayerState, bool* bSuccess); + static void PickLootDropsWithNamedWeightsHook(UObject* Context, FFrame& Stack, void* Ret); static void SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret); static bool SpawnInstancedPickupInWorldHook(UObject* Context, FFrame& Stack, bool* Ret); static void K2_SpawnPickupInWorldWithLootTierHook(UObject* Context, FFrame& Stack, void* Ret); diff --git a/Project Reboot 3.0/FortPawn.cpp b/Project Reboot 3.0/FortPawn.cpp index af4ab9f..8ab2fdb 100644 --- a/Project Reboot 3.0/FortPawn.cpp +++ b/Project Reboot 3.0/FortPawn.cpp @@ -6,10 +6,29 @@ AFortWeapon* AFortPawn::EquipWeaponDefinition(UFortWeaponItemDefinition* WeaponD { static auto EquipWeaponDefinitionFn = FindObject("/Script/FortniteGame.FortPawn.EquipWeaponDefinition"); - struct { UObject* Def; FGuid Guid; AFortWeapon* Wep; } params{ WeaponData, ItemEntryGuid }; - this->ProcessEvent(EquipWeaponDefinitionFn, ¶ms); + FGuid TrackerGuid{}; - return params.Wep; + struct { UObject* Def; FGuid Guid; AFortWeapon* Wep; } params{ WeaponData, ItemEntryGuid }; + struct { UObject* Def; FGuid Guid; FGuid TrackerGuid; AFortWeapon* Wep; } S16_params{ WeaponData, ItemEntryGuid, TrackerGuid }; + struct { UObject* Def; FGuid Guid; FGuid TrackerGuid; bool bDisableEquipAnimation; AFortWeapon* Wep; } S17_params{ WeaponData, ItemEntryGuid, TrackerGuid, false }; + + if (Fortnite_Version < 16) + { + this->ProcessEvent(EquipWeaponDefinitionFn, ¶ms); + return params.Wep; + } + else if (std::floor(Fortnite_Version) == 16) + { + this->ProcessEvent(EquipWeaponDefinitionFn, &S16_params); + return S16_params.Wep; + } + else + { + this->ProcessEvent(EquipWeaponDefinitionFn, &S17_params); + return S17_params.Wep; + } + + return nullptr; } bool AFortPawn::PickUpActor(AActor* PickupTarget, UFortDecoItemDefinition* PlacementDecoItemDefinition) diff --git a/Project Reboot 3.0/FortPlayerPawn.cpp b/Project Reboot 3.0/FortPlayerPawn.cpp index 1963a31..3e78c9b 100644 --- a/Project Reboot 3.0/FortPlayerPawn.cpp +++ b/Project Reboot 3.0/FortPlayerPawn.cpp @@ -46,7 +46,10 @@ void AFortPlayerPawn::ServerHandlePickupHook(AFortPlayerPawn* Pawn, AFortPickup* static auto bPickedUpOffset = Pickup->GetOffset("bPickedUp"); if (Pickup->Get(bPickedUpOffset)) + { + LOG_INFO(LogDev, "Trying to pickup picked up weapon?"); return; + } static auto IncomingPickupsOffset = Pawn->GetOffset("IncomingPickups"); Pawn->Get>(IncomingPickupsOffset).Add(Pickup); diff --git a/Project Reboot 3.0/InventoryManagementLibrary.h b/Project Reboot 3.0/InventoryManagementLibrary.h index a643285..3385768 100644 --- a/Project Reboot 3.0/InventoryManagementLibrary.h +++ b/Project Reboot 3.0/InventoryManagementLibrary.h @@ -19,6 +19,6 @@ public: static void RemoveItemsHook(UObject* Context, FFrame& Stack, void* Ret); static void RemoveItemHook(UObject* Context, FFrame& Stack, void* Ret); static void GiveItemEntryToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret); - static void AddItemsHook(UObject* Context, FFrame& Stack, void* Ret); - static void AddItemHook(UObject* Context, FFrame& Stack, void* Ret); + static void AddItemsHook(UObject* Context, FFrame& Stack, void* Ret); // Return value changes + static void AddItemHook(UObject* Context, FFrame& Stack, void* Ret); // Return value changes }; \ No newline at end of file diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index 1f8f570..8949d1c 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -336,6 +336,8 @@ void Offsets::FindAll() Offsets::ReplicationFrame = 0x288; else if (Engine_Version == 419) Offsets::ReplicationFrame = 0xB2; + else if (Fortnite_Version == 2.5) + Offsets::ReplicationFrame = 0xCA; } void Offsets::Print() @@ -381,7 +383,7 @@ std::vector Addresses::GetFunctionsToNull() { std::vector toNull; - if (Engine_Version == 420) + if (Fortnite_Version > 2.5 && Engine_Version == 420) { toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 57 48 81 EC ? ? ? ? 4C 8B 82 ? ? ? ? 48 8B F9 0F 29 70 E8 0F 29 78 D8").Get()); // Pawn Overlap // toNull.push_back(Memcury::Scanner::FindPattern("E8 ? ? ? ? EB 26 40 38 3D ? ? ? ?").RelativeOffset(1).Get()); // collectgarbage diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 15c0299..1a54c79 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -87,6 +87,8 @@ DWORD WINAPI Main(LPVOID) Addresses::Init(); Addresses::Print(); + LOG_INFO(LogDev, "Version: {}", Fortnite_Version); + static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); @@ -201,16 +203,22 @@ DWORD WINAPI Main(LPVOID) AFortPlayerController::ServerAttemptInteractHook, (PVOID*)&AFortPlayerController::ServerAttemptInteractOriginal, false, true); } - static auto ServerRestartPlayerFn = FindObject(L"/Script/Engine.PlayerController.ServerRestartPlayer"); - auto ZoneServerRestartPlayer = FortPlayerControllerZoneDefault->VFTable[GetFunctionIdxOrPtr(ServerRestartPlayerFn) / 8]; - LOG_INFO(LogDev, "ZoneServerRestartPlayer: 0x{:x}", __int64(ZoneServerRestartPlayer) - __int64(GetModuleHandleW(0))); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/Engine.PlayerController.ServerAcknowledgePossession"), AFortPlayerControllerAthena::ServerAcknowledgePossessionHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerRestartPlayerFn, - // ZoneServerRestartPlayer, - AFortPlayerControllerAthena::ServerRestartPlayerHook, - nullptr, false); + + if (Engine_Version >= 424) + { + static auto ServerRestartPlayerFn = FindObject(L"/Script/Engine.PlayerController.ServerRestartPlayer"); + auto ZoneServerRestartPlayer = FortPlayerControllerZoneDefault->VFTable[GetFunctionIdxOrPtr(ServerRestartPlayerFn) / 8]; + + LOG_INFO(LogDev, "ZoneServerRestartPlayer: 0x{:x}", __int64(ZoneServerRestartPlayer) - __int64(GetModuleHandleW(0))); + + Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerRestartPlayerFn, + // ZoneServerRestartPlayer, + AFortPlayerControllerAthena::ServerRestartPlayerHook, + nullptr, false); + } + Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerDropAllItems"), AFortPlayerController::ServerDropAllItemsHook, nullptr, false); Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerAttemptInventoryDrop"), @@ -265,6 +273,10 @@ DWORD WINAPI Main(LPVOID) UFortKismetLibrary::SpawnInstancedPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnInstancedPickupInWorldOriginal, false, true); Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.SpawnItemVariantPickupInWorld"), UFortKismetLibrary::SpawnItemVariantPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnItemVariantPickupInWorldOriginal, false, true); + Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.PickLootDropsWithNamedWeights"), + UFortKismetLibrary::PickLootDropsWithNamedWeightsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsWithNamedWeightsOriginal, false, true); + + // TODO Add RemoveItemFromInventoryOwner Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.DropSpecificItem"), AFortPlayerController::DropSpecificItemHook, (PVOID*)&AFortPlayerController::DropSpecificItemOriginal, false, true); @@ -348,10 +360,13 @@ DWORD WINAPI Main(LPVOID) AFortPlayerController::ServerAttemptAircraftJumpHook, nullptr, false); } - /* Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"), - UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false); - Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"), - UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false); */ + if (false) + { + Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"), + UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false); + Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"), + UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false); + } Hooking::MinHook::Hook((PVOID)Addresses::GetPlayerViewpoint, (PVOID)AFortPlayerControllerAthena::GetPlayerViewPointHook, (PVOID*)&AFortPlayerControllerAthena::GetPlayerViewPointOriginal); Hooking::MinHook::Hook((PVOID)Addresses::TickFlush, (PVOID)UNetDriver::TickFlushHook, (PVOID*)&UNetDriver::TickFlushOriginal); diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index 406a04e..17aeb1b 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -217,6 +217,9 @@ static inline uint64 FindPauseBeaconRequests() static inline uint64 FindOnRep_ZiplineState() { + if (Fortnite_Version < 7) + return 0; + static auto Addrr = Memcury::Scanner::FindStringRef(L"ZIPLINES!! Role(%s) AFortPlayerPawn::OnRep_ZiplineState ZiplineState.bIsZiplining=%d", false).Get(); if (!Addrr) @@ -261,7 +264,7 @@ static inline uint64 FindGetMaxTickRate() // Uengine::getmaxtickrate if (!stringRef.Get()) return 0; - return FindBytes(stringRef, { 0x48, 0x89, 0x5C }, 1000, 0, true); + return FindBytes(stringRef, Fortnite_Version <= 2.5 ? std::vector{ 0x40, 0x53 } : std::vector{ 0x48, 0x89, 0x5C }, 1000, 0, true); } static inline uint64 FindGetPlayerViewpoint() @@ -277,6 +280,7 @@ static inline uint64 FindGetPlayerViewpoint() static inline uint64 FindSpawnActor() { + if (Engine_Version >= 427) { auto stat = Memcury::Scanner::FindStringRef(L"STAT_SpawnActorTime"); @@ -285,7 +289,7 @@ static inline uint64 FindSpawnActor() auto Addr = Memcury::Scanner::FindStringRef(L"SpawnActor failed because no class was specified"); - if (Engine_Version >= 416 && Engine_Version <= 419) + if (Engine_Version >= 416 && Fortnite_Version <= 2.5) return FindBytes(Addr, { 0x40, 0x55 }, 3000, 0, true); return FindBytes(Addr, { 0x4C, 0x8B, 0xDC }, 3000, 0, true); @@ -523,7 +527,9 @@ static inline uint64 FindActorGetNetMode() auto AActorGetNetmodeStrRef = Memcury::Scanner::FindStringRef(L"STAT_ServerUpdateCamera", false); if (!AActorGetNetmodeStrRef.Get()) - return 0; + { + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B 01 48 8B D9 FF 90 ? ? ? ? 4C 8B").Get(); + } return Memcury::Scanner(FindBytes(AActorGetNetmodeStrRef, { 0xE8 }, 255, 0, true)).RelativeOffset(1).Get(); } @@ -550,6 +556,15 @@ static inline uint64 FindTickFlush() } auto Addr = Memcury::Scanner::FindStringRef(L"STAT_NetTickFlush"); + + if (!Addr.Get()) + { + if (Engine_Version == 420) // 2.5 + { + return Memcury::Scanner::FindPattern("4C 8B DC 55 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 45 0F 29 43 ? 45 0F 29 4B ? 48 8B 05 ? ? ? ? 48 33").Get(); + } + } + return FindBytes(Addr, (Fortnite_Version < 18 ? std::vector{ 0x4C, 0x8B } : std::vector{ 0x48, 0x8B, 0xC4 }), 1000, 0, true); } @@ -619,6 +634,8 @@ static inline uint64 FindGIsServer() // if (Fortnite_Version == 19.10) // return __int64(GetModuleHandleW(0)) + 0xB30CF9D; + if (Fortnite_Version == 2.5) + return __int64(GetModuleHandleW(0)) + 0x46AD735; if (Fortnite_Version == 12.41) return __int64(GetModuleHandleW(0)) + 0x804B65A; @@ -706,6 +723,9 @@ static inline uint64 FindChangeGameSessionId() return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 70 4C 8B FA 4C").Get(); } + if (Fortnite_Version == 2.5) + return Memcury::Scanner::FindPattern("40 55 56 41 56 48 8B EC 48 81 EC ? ? ? ? 48 8B 01 4C 8B F2").Get(); + auto Addr = Memcury::Scanner::FindStringRef(L"Changing GameSessionId from '%s' to '%s'"); return FindBytes(Addr, { 0x40, 0x55 }, 2000, 0, true); } @@ -718,6 +738,8 @@ static inline uint64 FindDispatchRequest() static inline uint64 FindGIsClient() { + if (Fortnite_Version == 2.5) + return __int64(GetModuleHandleW(0)) + 0x46AD734; if (Fortnite_Version == 4.1) return __int64(GetModuleHandleW(0)) + 0x4BF6F17; @@ -857,7 +879,7 @@ static inline uint64 FindPickTeam() if (!Addr.Get()) Addr = Memcury::Scanner::FindStringRef(L"PickTeam for [%s] used beacon value [%s]"); - return FindBytes(Addr, { 0x40, 0x55 }, 1000, 0, true); + return FindBytes(Addr, Fortnite_Version <= 2.5 ? std::vector{ 0x48, 0x89, 0x6C } : std::vector{ 0x40, 0x55 }, 1000, 0, true); } static inline uint64 FindInternalTryActivateAbility() @@ -884,17 +906,14 @@ static inline uint64 FindInternalTryActivateAbility() static inline uint64 FindFrameStep() { return Memcury::Scanner::FindPattern("48 8B 41 20 4C 8B D2 48 8B D1 44 0F B6 08 48 FF").Get(); - - if (Engine_Version == 423) - return Memcury::Scanner::FindPattern("48 8B 41 20 4C 8B D2 48 8B D1 44 0F B6 08 48 FF").Get(); - if (Engine_Version == 426) - return Memcury::Scanner::FindPattern("48 8B 41 20 4C 8B D2 48 8B D1 44 0F B6 08 48 FF C0 48 89 41 20 41").Get(); - - return 0; } static inline uint64 FindCanActivateAbility() { + return 0; + + // this doesn't work on like >2.5 + if (Engine_Version == 421 || Engine_Version == 422) return Memcury::Scanner::FindPattern("4C 89 4C 24 20 55 56 57 41 56 48 8D 6C 24 D1").Get(); @@ -970,7 +989,7 @@ static inline uint64 FindReplaceBuildingActor() static inline uint64 FindSendClientAdjustment() { - if (Engine_Version >= 416 && Engine_Version < 420) + if (Fortnite_Version <= 2.5) return Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B 99 ? ? ? ? 48 39 99 ? ? ? ? 74 0A 48 83 B9").Get(); return 0; @@ -980,7 +999,7 @@ static inline uint64 FindReplicateActor() { if (Engine_Version == 416) return Memcury::Scanner::FindPattern("40 55 53 57 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8D 59 68 4C 8B F1 48 8B").Get(); - if (Engine_Version == 419) + if (Engine_Version >= 419 && Fortnite_Version <= 2.5) return Memcury::Scanner::FindPattern("40 55 56 41 54 41 55 41 56 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 4C 8B E9 48 8B 49 68 48").Get(); return 0; @@ -988,7 +1007,7 @@ static inline uint64 FindReplicateActor() static inline uint64 FindCreateChannel() { - if (Engine_Version == 416 && Engine_Version < 420) + if (Fortnite_Version <= 2.5) return Memcury::Scanner::FindPattern("40 56 57 41 54 41 55 41 57 48 83 EC 60 48 8B 01 41 8B F9 45 0F B6 E0").Get(); return 0; @@ -998,7 +1017,7 @@ static inline uint64 FindSetChannelActor() { if (Engine_Version == 416) return Memcury::Scanner::FindPattern("4C 8B DC 55 53 57 41 54 49 8D AB ? ? ? ? 48 81 EC ? ? ? ? 45 33").Get(); - if (Engine_Version == 419) + if (Engine_Version >= 419 && Fortnite_Version <= 2.5) return Memcury::Scanner::FindPattern("48 8B C4 55 53 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 89 70 E8 48 8B D9").Get(); return 0; @@ -1010,6 +1029,8 @@ static inline uint64 FindCallPreReplication() return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 8B C4 55 57 41 57 48 8D 68 A1 48 81 EC").Get(); if (Engine_Version == 419) return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 8B C4 55 57 41 54 48 8D 68 A1 48 81 EC ? ? ? ? 48 89 58 08 4C").Get(); + if (Fortnite_Version == 2.5) + return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 56 41 56 48 83 EC 38 4C 8B F2").Get(); return 0; } \ No newline at end of file