From c6bbaccf7f5c17707c1c7a3db17e2848188fe53a Mon Sep 17 00:00:00 2001 From: Milxnor Date: Sun, 2 Apr 2023 14:42:00 -0400 Subject: [PATCH] add butterfly event, add dropping to 1.11 and below, --- Project Reboot 3.0/FortGameModeAthena.cpp | 2 +- Project Reboot 3.0/FortInventory.cpp | 37 +++++++++++++---- Project Reboot 3.0/FortLootPackage.cpp | 2 +- Project Reboot 3.0/FortPlayerController.cpp | 41 +++++++------------ .../FortPlayerControllerAthena.cpp | 4 ++ Project Reboot 3.0/FortWeapon.cpp | 2 + Project Reboot 3.0/addresses.cpp | 9 +++- Project Reboot 3.0/die.h | 5 ++- Project Reboot 3.0/dllmain.cpp | 32 +++++++++------ Project Reboot 3.0/events.h | 26 +++++++++++- Project Reboot 3.0/finder.h | 35 +++++++++++++--- 11 files changed, 136 insertions(+), 59 deletions(-) diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index d49bda6..2a48eee 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -1062,7 +1062,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena if (Engine_Version <= 420) { static auto OverriddenBackpackSizeOffset = NewPlayer->GetOffset("OverriddenBackpackSize"); - // LOG_INFO(LogDev, "NewPlayer->Get(OverriddenBackpackSizeOffset): {}", NewPlayer->Get(OverriddenBackpackSizeOffset)); + LOG_INFO(LogDev, "NewPlayer->Get(OverriddenBackpackSizeOffset): {}", NewPlayer->Get(OverriddenBackpackSizeOffset)); NewPlayer->Get(OverriddenBackpackSizeOffset) = 5; } diff --git a/Project Reboot 3.0/FortInventory.cpp b/Project Reboot 3.0/FortInventory.cpp index 71d8123..a31bb33 100644 --- a/Project Reboot 3.0/FortInventory.cpp +++ b/Project Reboot 3.0/FortInventory.cpp @@ -2,6 +2,14 @@ #include "FortPlayerController.h" #include "FortPickup.h" +enum class EFortQuickBars : uint8_t +{ + Primary = 0, + Secondary = 1, + Max_None = 2, + EFortQuickBars_MAX = 3 +}; + UFortItem* CreateItemInstance(AFortPlayerController* PlayerController, UFortItemDefinition* ItemDefinition, int Count) { UFortItem* NewItemInstance = ItemDefinition->CreateTemporaryItemInstanceBP(Count); @@ -140,14 +148,6 @@ std::pair, std::vector> AFortInventory::AddI if (QuickBars) { - enum class EFortQuickBars : uint8_t - { - Primary = 0, - Secondary = 1, - Max_None = 2, - EFortQuickBars_MAX = 3 - }; - struct { FGuid Item; // (Parm, IsPlainOldData) @@ -256,6 +256,27 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int } } + auto FortPlayerController = Cast(GetOwner()); + + if (FortPlayerController && Engine_Version < 420) + { + static auto QuickBarsOffset = FortPlayerController->GetOffset("QuickBars", false); + auto QuickBars = FortPlayerController->Get(QuickBarsOffset); + + if (QuickBars) + { + static auto ServerRemoveItemInternalFn = FindObject("/Script/FortniteGame.FortQuickBars.ServerRemoveItemInternal"); + + struct + { + FGuid Item; // (Parm, IsPlainOldData) + bool bFindReplacement; // (Parm, ZeroConstructor, IsPlainOldData) + bool bForce; // (Parm, ZeroConstructor, IsPlainOldData) + } AFortQuickBars_ServerRemoveItemInternal_Params{ItemGuid, false, true}; + QuickBars->ProcessEvent(ServerRemoveItemInternalFn, &AFortQuickBars_ServerRemoveItemInternal_Params); + } + } + // todo remove from weaponlist if (bShouldUpdate) diff --git a/Project Reboot 3.0/FortLootPackage.cpp b/Project Reboot 3.0/FortLootPackage.cpp index ee30d1e..3677064 100644 --- a/Project Reboot 3.0/FortLootPackage.cpp +++ b/Project Reboot 3.0/FortLootPackage.cpp @@ -370,7 +370,7 @@ std::vector PickLootDrops(FName TierGroupName, bool bPrint, int recurs } } - if (Engine_Version < 420) // ahhh + if (Engine_Version <= 420) // ahhh { LTDTables.clear(); LPTables.clear(); diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index d15b1bc..b08f603 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -875,14 +875,20 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit) { + // LOG_INFO(LogDev, "ServerBeginEditingBuildingActorHook!"); + if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) return; auto Pawn = PlayerController->GetMyFortPawn(); + // LOG_INFO(LogDev, "ServerBeginEditingBuildingAc1341torHook!"); + if (!Pawn) return; + // LOG_INFO(LogDev, "ServerBeginEditingBuildingActorHook134!"); + static auto EditToolDef = FindObject("/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); /* auto WorldInventory = PlayerController->GetWorldInventory(); @@ -898,40 +904,19 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr if (auto EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()))) */ if (auto EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, FGuid{}))) { + // LOG_INFO(LogDev, "ServerBeginEditingBuild135415ingActorHook!"); + BuildingActorToEdit->GetEditingPlayer() = PlayerController->GetPlayerState(); // Onrep? EditTool->GetEditActor() = BuildingActorToEdit; // Onrep? } -} - -/* void AFortPlayerController::ServerEditBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit, UClass* NewBuildingClass, int RotationIterations, char bMirrored) -{ - auto PlayerState = (AFortPlayerState*)PlayerController->GetPlayerState(); - - if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->IsDestroyed() || BuildingActorToEdit->GetEditingPlayer() != PlayerState) - return; - - // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) - // return; - - BuildingActorToEdit->GetEditingPlayer() = nullptr; - - LOG_INFO(LogDev, "RotationIterations: {}", RotationIterations); - - static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) = - decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor); - - if (auto BuildingActor = BuildingSMActorReplaceBuildingActor(BuildingActorToEdit, 1, NewBuildingClass, - BuildingActorToEdit->GetCurrentBuildingLevel(), RotationIterations, bMirrored, PlayerController)) + else { - BuildingActor->SetPlayerPlaced(true); - - // if (auto PlayerState = Cast(PlayerController->GetPlayerState())) - // BuildingActor->SetTeam(PlayerState->GetTeamIndex()); + LOG_INFO(LogDev, "Failed to equip editing tool!"); } -} */ +} void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret) { @@ -954,7 +939,11 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame LOG_INFO(LogDev, "RotationIterations: {}", RotationIterations); if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->IsDestroyed() || BuildingActorToEdit->GetEditingPlayer() != PlayerState) + { + LOG_INFO(LogDev, "Cheater?"); + LOG_INFO(LogDev, "BuildingActorToEdit->GetEditingPlayer(): {} PlayerState: {} NewBuildingClass: {} BuildingActorToEdit: {}", __int64(BuildingActorToEdit->GetEditingPlayer()), __int64(PlayerState), __int64(NewBuildingClass), __int64(BuildingActorToEdit)); return ServerEditBuildingActorOriginal(Context, Stack, Ret); + } // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) //return ServerEditBuildingActorOriginal(Context, Frame, Ret); diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.cpp b/Project Reboot 3.0/FortPlayerControllerAthena.cpp index b2407ab..bbd7284 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.cpp +++ b/Project Reboot 3.0/FortPlayerControllerAthena.cpp @@ -128,6 +128,8 @@ void AFortPlayerControllerAthena::ServerReadyToStartMatchHook(AFortPlayerControl { auto& QuickBars = PlayerController->Get(QuickBarsOffset); + LOG_INFO(LogDev, "QuickBarsOld: {}", __int64(QuickBars)); + if (QuickBars) return ServerReadyToStartMatchOriginal(PlayerController); @@ -135,6 +137,8 @@ void AFortPlayerControllerAthena::ServerReadyToStartMatchHook(AFortPlayerControl QuickBars = GetWorld()->SpawnActor(FortQuickBarsClass); + LOG_INFO(LogDev, "QuickBarsNew: {}", __int64(QuickBars)); + if (!QuickBars) return ServerReadyToStartMatchOriginal(PlayerController); diff --git a/Project Reboot 3.0/FortWeapon.cpp b/Project Reboot 3.0/FortWeapon.cpp index 36ca07b..93c0de4 100644 --- a/Project Reboot 3.0/FortWeapon.cpp +++ b/Project Reboot 3.0/FortWeapon.cpp @@ -8,6 +8,8 @@ void AFortWeapon::OnPlayImpactFXHook(AFortWeapon* Weapon, __int64 HitResult, uin { // grappler + LOG_INFO(LogDev, "AAA!"); + auto Pawn = Cast(Weapon->GetOwner()); if (!Pawn) diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index a25b6a2..a15033a 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -334,9 +334,9 @@ void Offsets::FindAll() if (Engine_Version == 416) // checked on 1.7.2 & 1.8 Offsets::ReplicationFrame = 0x288; if (Fortnite_Version == 2.42) - Offsets::ReplicationFrame = 0xB2; + Offsets::ReplicationFrame = 0x2C8; if (Fortnite_Version == 2.5) - Offsets::ReplicationFrame = 0xCA; + Offsets::ReplicationFrame = 0x328; if (Fortnite_Version == 1.11) Offsets::ReplicationFrame = 0x2C8; @@ -425,6 +425,11 @@ std::vector Addresses::GetFunctionsToNull() toNull.push_back(Memcury::Scanner::FindPattern("40 55 57 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 0F B6 FA 44 8B F9 74 3B 80 3D ? ? ? ? ? 0F").Get()); } + if (Fortnite_Version == 16.50) + { + toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 60 20 55 41 56 41 57 48 8B EC 48 83 EC 60 49 8B D9 45 8A F8 4C 8B F2 48").Get()); // no reservation in gakme + } + if (std::floor(Fortnite_Version) == 17) { // toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 70 08 48 89 78 10 55 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 ED").Get()); // collectgarbage diff --git a/Project Reboot 3.0/die.h b/Project Reboot 3.0/die.h index 3c72d9e..df80f50 100644 --- a/Project Reboot 3.0/die.h +++ b/Project Reboot 3.0/die.h @@ -33,7 +33,7 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override LOG_INFO(LogDev, "SafeZoneDefinitionOffset: 0x{:x}", SafeZoneDefinitionOffset); - static auto ZoneDurationsOffset = std::floor(Fortnite_Version) == 17 ? 0x258 : std::floor(Fortnite_Version) >= 18 ? 0x248 : 0x1F8; + static auto ZoneDurationsOffset = Fortnite_Version == 16.50 || std::floor(Fortnite_Version) == 17 ? 0x258 : std::floor(Fortnite_Version) >= 18 ? 0x248 : 0x1F8; static auto ZoneHoldDurationsOffset = ZoneDurationsOffset - 0x10; auto& ZoneDurations = *(TArray*)(__int64(SafeZoneDefinition) + ZoneDurationsOffset); @@ -258,7 +258,8 @@ void ProcessEventHook(UObject* Object, UFunction* Function, void* Parameters) !strstr(ObjectName.c_str(), "CBGA_GreenGlop_WithGrav_C") && !strstr(ObjectName.c_str(), "FlopperSpawn") && !strstr(FunctionFullName.c_str(), "GCNL_EnvCampFire_Fire_C") && - !strstr(FunctionName.c_str(), "BlueprintGetAllHighlightableComponents")) + !strstr(FunctionName.c_str(), "BlueprintGetAllHighlightableComponents") && + !strstr(FunctionFullName.c_str(), "Primitive_Structure_AmbAudioComponent")) { LOG_INFO(LogDev, "Function called: {} with {}", FunctionFullName, ObjectName); } diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 6a9dcaf..4f8e328 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -95,7 +95,7 @@ DWORD WINAPI Main(LPVOID) 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"); - static auto FortPlayerPawnAthenaDefault = FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); + static auto FortPlayerPawnAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerPawnAthena"); // FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); static auto FortAbilitySystemComponentAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortAbilitySystemComponentAthena"); static auto FortPlayerStateAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerStateAthena"); static auto FortKismetLibraryDefault = FindObject(L"/Script/FortniteGame.Default__FortKismetLibrary"); @@ -271,22 +271,27 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook(FortWeaponDefault, FindObject(L"/Script/FortniteGame.FortWeapon.ServerReleaseWeaponAbility"), AFortWeapon::ServerReleaseWeaponAbilityHook, (PVOID*)&AFortWeapon::ServerReleaseWeaponAbilityOriginal, false, true); - auto OnPlayImpactFXFunctionPtr = Memcury::Scanner::FindStringRef(L"OnPlayImpactFX", true, 0).ScanFor({ 0x48, 0x8D, 0x0D }).RelativeOffset(3).GetAs(); - auto OnPlayImpactFXPtrRef = Memcury::Scanner::FindPointerRef(OnPlayImpactFXFunctionPtr).Get(); + auto OnPlayImpactFXStringRef = Memcury::Scanner::FindStringRef(L"OnPlayImpactFX", true, 0); __int64 OnPlayImpactFXAddr = 0; - for (int i = 0; i < 2000; i++) + if (OnPlayImpactFXStringRef.Get()) { - if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x48 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0x5C) - { - OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; - break; - } + auto OnPlayImpactFXFunctionPtr = OnPlayImpactFXStringRef.ScanFor({ 0x48, 0x8D, 0x0D }).RelativeOffset(3).GetAs(); + auto OnPlayImpactFXPtrRef = Memcury::Scanner::FindPointerRef(OnPlayImpactFXFunctionPtr).Get(); - if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x4C && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0xDC) + for (int i = 0; i < 2000; i++) { - OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; - break; + if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x48 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0x5C) + { + OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; + break; + } + + if (*(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i) == 0x4C && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(OnPlayImpactFXPtrRef - i + 2) == 0xDC) + { + OnPlayImpactFXAddr = OnPlayImpactFXPtrRef - i; + break; + } } } @@ -295,7 +300,8 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerDropAllItems"), AFortPlayerController::ServerDropAllItemsHook, nullptr, false); - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerAttemptInventoryDrop"), + Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, + FindObject("/Script/FortniteGame.FortPlayerController.ServerSpawnInventoryDrop") ? FindObject("/Script/FortniteGame.FortPlayerController.ServerSpawnInventoryDrop") : FindObject(L"/Script/FortniteGame.FortPlayerController.ServerAttemptInventoryDrop"), AFortPlayerController::ServerAttemptInventoryDropHook, nullptr, false); Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCheat"), ServerCheatHook, nullptr, false); diff --git a/Project Reboot 3.0/events.h b/Project Reboot 3.0/events.h index da50d3f..928d97c 100644 --- a/Project Reboot 3.0/events.h +++ b/Project Reboot 3.0/events.h @@ -21,6 +21,29 @@ struct Event static inline std::vector Events = { + Event + ( + "Butterfly", + "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C", + "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C.LoadButterflySublevel", + 1, + { + }, + { + { + { + true, + "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C.ButterflySequence" + }, + + 0 + } + }, + + "/Game/Athena/Prototype/Blueprints/Island/BP_Butterfly.BP_Butterfly_C", + "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", + 6.21 + ), Event ( "Astronomical", @@ -57,7 +80,8 @@ static inline std::vector Events = "/Game/Athena/Playlists/Music/Playlist_Music_High.Playlist_Music_High", 12.41 ), - Event( + Event + ( "Devourer of Worlds", "/Junior/Blueprints/BP_Junior_Loader.BP_Junior_Loader_C", "/Junior/Blueprints/BP_Junior_Loader.BP_Junior_Loader_C.LoadJuniorLevel", diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index e66aa7f..bcb9032 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -85,7 +85,14 @@ static inline uint64 FindStaticFindObject(int StringSkip = 1) return Memcury::Scanner::FindPattern("4C 8B DC 57 48 81 EC ? ? ? ? 80 3D ? ? ? ? ? 49 89 6B F0 49 89 73 E8").Get(); if (Engine_Version == 419) - return Memcury::Scanner::FindPattern("4C 8B DC 49 89 5B 08 49 89 6B 18 49 89 73 20 57 41 56 41 57 48 83 EC 60 80 3D").Get(); + { + auto iasdfk = Memcury::Scanner::FindPattern("4C 8B DC 49 89 5B 08 49 89 6B 18 49 89 73 20 57 41 56 41 57 48 83 EC 60 80 3D", false).Get(); + + if (!iasdfk) + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 54 41 56 41 57 48 8B EC 48 83 EC 60 80 3D ? ? ? ? ? 45 0F B6 F1 49 8B F8").Get(); + + return iasdfk; + } auto Addr = Memcury::Scanner::FindStringRef(L"Illegal call to StaticFindObject() while serializing object data!", true, StringSkip, Engine_Version >= 427); auto Final = FindBytes(Addr, { 0x48, 0x89, 0x5C }, 255, 0, true, 0, false); // Addr.ScanFor(bytes, false).Get(); @@ -922,8 +929,24 @@ static inline uint64 FindChangeGameSessionId() static inline uint64 FindDispatchRequest() { - auto Addr = Memcury::Scanner::FindStringRef(L"MCP-Profile: Dispatching request to %s", true, 0, Fortnite_Version >= 19); - return FindBytes(Addr, std::floor(Fortnite_Version) == 18 ? std::vector{0x48, 0x8B, 0xC4 } : std::vector{ 0x48, 0x89, 0x5C }, 300, 0, true); + auto Addrr = Memcury::Scanner::FindStringRef(L"MCP-Profile: Dispatching request to %s", true, 0, Fortnite_Version >= 19).Get(); + + for (int i = 0; i < 400; i++) + { + if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0x5C) + { + return Addrr - i; + } + + if (*(uint8_t*)(uint8_t*)(Addrr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addrr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addrr - i + 2) == 0xC4) + { + return Addrr - i; + } + } + + return 0; + + // return FindBytes(Addr, std::floor(Fortnite_Version) == 18 ? std::vector{0x48, 0x8B, 0xC4 } : std::vector{ 0x48, 0x89, 0x5C }, 300, 0, true); } static inline uint64 FindMcpIsDedicatedServerOffset() @@ -1185,12 +1208,14 @@ static inline uint64 FindGiveAbilityAndActivateOnce() static inline uint64 FindGiveAbility() { - if (Engine_Version == 416) + if (Engine_Version <= 420) + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9").Get(); + /* if (Engine_Version == 416) return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9").Get(); if (Fortnite_Version == 1.11) return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B F0").Get(); if (Engine_Version == 420) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B F0 4C 8B F2 48 8B D9 7E 61").Get(); + return Memcury::Scanner::FindPattern("48 89 5C 24 ? 56 57 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B F0 4C 8B F2 48 8B D9 7E 61").Get(); */ if (Engine_Version == 421) return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 7C 24 ? 41 56 48 83 EC 20 83 B9 ? ? ? ? ? 49 8B E8 4C 8B F2").Get(); if (Engine_Version == 500)