From 8f0ce8919e867bd8034724cebf67055991b01744 Mon Sep 17 00:00:00 2001 From: Gray <84999745+Milxnor@users.noreply.github.com> Date: Fri, 18 Jul 2025 02:49:40 -0400 Subject: [PATCH] s20-s23 much better --- Project Reboot 3.0/Actor.cpp | 8 +- .../FortAthenaVehicleSpawner.cpp | 4 +- Project Reboot 3.0/FortLootPackage.cpp | 5 +- .../FortPlayerControllerAthena.cpp | 1 + Project Reboot 3.0/NetDriver.cpp | 43 +++---- Project Reboot 3.0/addresses.cpp | 8 ++ Project Reboot 3.0/bots.h | 2 + Project Reboot 3.0/dllmain.cpp | 71 +++++++++-- Project Reboot 3.0/finder.cpp | 17 +++ Project Reboot 3.0/finder.h | 118 ++++++++++++++++-- Project Reboot 3.0/gui.h | 2 +- Project Reboot 3.0/inc.h | 2 +- 12 files changed, 229 insertions(+), 52 deletions(-) diff --git a/Project Reboot 3.0/Actor.cpp b/Project Reboot 3.0/Actor.cpp index 03d18a4..1b4a815 100644 --- a/Project Reboot 3.0/Actor.cpp +++ b/Project Reboot 3.0/Actor.cpp @@ -178,8 +178,12 @@ bool AActor::IsActorBeingDestroyed() bool AActor::IsNetStartup() { - static auto bNetStartupOffset = GetOffset("bNetStartup"); - static auto bNetStartupFieldMask = GetFieldMask(GetProperty("bNetStartup")); + static auto bNetStartupOffset = GetOffset("bNetStartup", false) == -1 + ? GetOffset("bNetTemporary") // same bitfield, needed because bNetStartup is unreflected later on + : GetOffset("bNetStartup"); + static auto bNetStartupFieldMask = GetProperty("bNetStartup", false) + ? GetFieldMask(GetProperty("bNetStartup")) + : GetFieldMask(GetProperty("bNetTemporary")) * 2; // get the next one return ReadBitfieldValue(bNetStartupOffset, bNetStartupFieldMask); } diff --git a/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp b/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp index 070cbd0..62663c1 100644 --- a/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp +++ b/Project Reboot 3.0/FortAthenaVehicleSpawner.cpp @@ -4,8 +4,8 @@ void AFortAthenaVehicleSpawner::SpawnVehicleHook(AFortAthenaVehicleSpawner* VehicleSpawner) { - // literally doesnt get called!!!! + // literally doesnt get called!!!! (but on 22.30 it does!) - LOG_INFO(LogDev, "omgonmg call!!!!\n\n"); + LOG_INFO(LogDev, "SpawnVehicleHook!!!!"); // SpawnVehicleFromSpawner(VehicleSpawner); } \ No newline at end of file diff --git a/Project Reboot 3.0/FortLootPackage.cpp b/Project Reboot 3.0/FortLootPackage.cpp index 12e8307..ac2b919 100644 --- a/Project Reboot 3.0/FortLootPackage.cpp +++ b/Project Reboot 3.0/FortLootPackage.cpp @@ -27,6 +27,7 @@ void CollectDataTablesRows(const std::vector& DataTables, LOOTING_M { if (!Addresses::LoadAsset && !DataTable->IsValidLowLevel()) { + // LOG_INFO(LogDev, "INvalid table!"); continue; // Remove from vector? } @@ -627,7 +628,9 @@ std::vector PickLootDrops(FName TierGroupName, int WorldLevel, int For { if (Fortnite_Version <= 6 || std::floor(Fortnite_Version) == 9 - || Fortnite_Version == 10.00) // the tables unload! + || Fortnite_Version == 10.00 // the tables unload! + // || Fortnite_Version >= 22 + ) { LTDTables.clear(); LPTables.clear(); diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.cpp b/Project Reboot 3.0/FortPlayerControllerAthena.cpp index 81a2f37..cb52c03 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.cpp +++ b/Project Reboot 3.0/FortPlayerControllerAthena.cpp @@ -417,6 +417,7 @@ void AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook(AFor void AFortPlayerControllerAthena::ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn) { + LOG_INFO(LogDev, "ServerAcknowledgePossession!"); static auto AcknowledgedPawnOffset = Controller->GetOffset("AcknowledgedPawn"); const APawn* OldAcknowledgedPawn = Controller->Get(AcknowledgedPawnOffset); diff --git a/Project Reboot 3.0/NetDriver.cpp b/Project Reboot 3.0/NetDriver.cpp index e8a9f14..801086a 100644 --- a/Project Reboot 3.0/NetDriver.cpp +++ b/Project Reboot 3.0/NetDriver.cpp @@ -339,7 +339,7 @@ void UNetDriver::ServerReplicateActors_BuildConsiderList(std::vectorGetOffset("OpenChannels"); auto& OpenChannels = Connection->Get>(OpenChannelsOffset); @@ -376,20 +376,16 @@ static UActorChannel* FindChannel(AActor * Actor, UNetConnection * Connection) return nullptr; } -static bool IsActorRelevantToConnection(AActor * Actor, std::vector&ConnectionViewers) +static bool IsActorRelevantToConnection(AActor* Actor, std::vector&ConnectionViewers) { - for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); viewerIdx++) + for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); ++viewerIdx) { if (!ConnectionViewers[viewerIdx].ViewTarget) continue; - // static bool (*IsNetRelevantFor)(AActor*, AActor*, AActor*, FVector&) = decltype(IsNetRelevantFor)(__int64(GetModuleHandleW(0)) + 0x1ECC700); - - static auto index = Offsets::IsNetRelevantFor; - // if (Actor->IsNetRelevantFor(ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) // if (IsNetRelevantFor(Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) - if (reinterpret_cast(Actor->VFTable[index])( + if (reinterpret_cast(Actor->VFTable[Offsets::IsNetRelevantFor])( Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) { return true; @@ -556,7 +552,7 @@ void SetChannelActorForDestroy(UActorChannel* Channel, FActorDestructionInfo* De using UPackageMap = UObject; - reinterpret_cast(Connection->GetPackageMap()->VFTable[0x238 / 8])(Connection->GetPackageMap(), &CloseBunch, DestructInfo->ObjOuter.Get(), DestructInfo->NetGUID, DestructInfo->PathName); + reinterpret_cast(Connection->GetPackageMap()->VFTable[0x238 / 8])(Connection->GetPackageMap(), &CloseBunch, DestructInfo->ObjOuter.Get(), DestructInfo->NetGUID, DestructInfo->PathName); // UE_LOG(LogNetTraffic, Log, TEXT("SetChannelActorForDestroy: Channel %d. NetGUID <%s> Path: %s. Bits: %d"), ChIndex, *DestructInfo->NetGUID.ToString(), *DestructInfo->PathName, CloseBunch.GetNumBits()); // UE_LOG(LogNetDormancy, Verbose, TEXT("SetChannelActorForDestroy: Channel %d. NetGUID <%s> Path: %s. Bits: %d"), ChIndex, *DestructInfo->NetGUID.ToString(), *DestructInfo->PathName, CloseBunch.GetNumBits()); @@ -606,9 +602,11 @@ int32 UNetDriver::ServerReplicateActors() // bCPUSaturated = DeltaSeconds > 1.2f * ServerTickTime; } + bool bUseNetworkObjectList = ShouldUseNetworkObjectList(); + std::vector ConsiderList; - if (ShouldUseNetworkObjectList()) + if (bUseNetworkObjectList) ConsiderList.reserve(GetNetworkObjectList().ActiveNetworkObjects.Num()); auto World = GetWorld(); @@ -619,11 +617,12 @@ int32 UNetDriver::ServerReplicateActors() static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel); static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor); - static UObject* (*CreateChannelByName)(UNetConnection * Connection, FName * ChName, EChannelCreateFlags CreateFlags, int32_t ChannelIndex) = decltype(CreateChannelByName)(Addresses::CreateChannel); + static UObject* (*CreateChannelByName)(UNetConnection* Connection, FName* ChName, EChannelCreateFlags CreateFlags, int32_t ChannelIndex) = decltype(CreateChannelByName)(Addresses::CreateChannel); static __int64 (*SetChannelActor)(UActorChannel*, AActor*) = decltype(SetChannelActor)(Addresses::SetChannelActor); static __int64 (*SetChannelActor2)(UActorChannel*, AActor*, ESetChannelActorFlags) = decltype(SetChannelActor2)(Addresses::SetChannelActor); + static FName ActorName = UKismetStringLibrary::Conv_StringToName(L"Actor"); - for (int32 i = 0; i < this->GetClientConnections().Num(); i++) + for (int32 i = 0; i < this->GetClientConnections().Num(); ++i) { UNetConnection* Connection = this->GetClientConnections().at(i); @@ -694,7 +693,7 @@ int32 UNetDriver::ServerReplicateActors() for (FActorDestructionInfo* DeletionEntry : DeletionEntries) { - LOG_INFO(LogDev, "AA: {}", DeletionEntry->PathName.Data.Data ? DeletionEntry->PathName.ToString() : "Null"); + LOG_INFO(LogDev, "PathName: {}", DeletionEntry->PathName.Data.Data ? DeletionEntry->PathName.ToString() : "Null"); if (DeletionEntry->StreamingLevelName != -1) { @@ -719,9 +718,6 @@ int32 UNetDriver::ServerReplicateActors() if (Engine_Version >= 422) { - FString ActorStr = L"Actor"; - FName ActorName = UKismetStringLibrary::Conv_StringToName(ActorStr); - int ChannelIndex = -1; // 4294967295 Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex); } @@ -807,7 +803,6 @@ int32 UNetDriver::ServerReplicateActors() } } - if (!Channel) { if (Actor->IsA(APlayerController::StaticClass()) && Actor != Connection->GetPlayerController()) // isnetrelevantfor should handle this iirc @@ -817,9 +812,6 @@ int32 UNetDriver::ServerReplicateActors() { if (Engine_Version >= 422) { - FString ActorStr = L"Actor"; - FName ActorName = UKismetStringLibrary::Conv_StringToName(ActorStr); - int ChannelIndex = -1; // 4294967295 Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex); } @@ -845,9 +837,10 @@ int32 UNetDriver::ServerReplicateActors() if (Channel) { + // LOG_INFO(LogDev, "Actor: {}", Actor->GetFullName()); if (ReplicateActor(Channel)) { - if (ShouldUseNetworkObjectList()) + if (bUseNetworkObjectList) { // LOG_INFO(LogReplication, "Replicated Actor!"); auto TimeSeconds = UGameplayStatics::GetTimeSeconds(World); @@ -864,6 +857,14 @@ int32 UNetDriver::ServerReplicateActors() } } + if (!bUseNetworkObjectList) // BOOM + { + for (auto info : ConsiderList) + { + delete info; + } + } + // shuffle the list of connections if not all connections were ticked /* if (NumClientsToTick < NetDriver->ClientConnections.Num()) diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index aba9819..72c520c 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -514,6 +514,14 @@ void Offsets::FindAll() { Offsets::ReplicationFrame = 0x3D8; } + if (std::floor(Fortnite_Version) == 22) + { + Offsets::ReplicationFrame = 0x428; // checked only on 22.30 + } + if (Fortnite_Version >= 23) + { + Offsets::ReplicationFrame = 0x440; // checked only on 23.40 + } Offsets::IsNetRelevantFor = FindIsNetRelevantForOffset(); Offsets::Script = Offsets::Children + 8 + 4 + 4; diff --git a/Project Reboot 3.0/bots.h b/Project Reboot 3.0/bots.h index 94a9e40..d27c399 100644 --- a/Project Reboot 3.0/bots.h +++ b/Project Reboot 3.0/bots.h @@ -142,6 +142,8 @@ public: { auto& StartingItem = StartingItems.at(i, FItemAndCount::GetStructSize()); + // TODO: Check if it is FortSmartBuildingItemDefinition + (*Inventory)->AddItem(StartingItem.GetItem(), nullptr, StartingItem.GetCount()); } diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index fd565a9..65294ce 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -674,12 +674,12 @@ void ChangeLevels() LOG_INFO(LogDev, "FindGIsClient(): 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0))); // auto bruh = std::wstring(CustomMapName.begin(), CustomMapName.end()); - // auto bruhh = (L"open " + bruh); + // auto CustomMapOpenWStr = (L"open " + bruh); bool bShouldUseMoleMap = PlaylistName == "/MoleGame/Playlists/Playlist_MoleGame.Playlist_MoleGame"; - FString LevelB = /* bUseCustomMap ? bruhh.c_str() : */ (Engine_Version < 424 - ? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 + FString LevelB = /* bUseCustomMap ? CustomMapOpenWStr.c_str() : */ (Engine_Version < 424 + ? L"open Athena_Terrain" : Engine_Version >= 500 ? Fortnite_Version >= 23 ? L"open Asteria_Terrain" : Globals::bCreative ? L"open Creative_NoApollo_Terrain" : L"open Artemis_Terrain" @@ -687,7 +687,7 @@ void ChangeLevels() : L"open Apollo_Terrain"); FString Level = /* bUseCustomMap ? bruh.c_str() : */ (Engine_Version < 424 - ? L"Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 + ? L"Athena_Terrain" : Engine_Version >= 500 ? Fortnite_Version >= 23 ? L"Asteria_Terrain" : Globals::bCreative ? L"Creative_NoApollo_Terrain" : L"Artemis_Terrain" @@ -780,8 +780,35 @@ void ChangeLevels() } } +static inline char (*oFunc)(__int64) = nullptr; +static inline __int64 (*func2)(__int64) = nullptr; +char Func(__int64 a1) +{ + if (auto r = func2(a1)) + { + if (auto v5 = *(__int64*)(__int64(r) + 0x38)) + { + auto persisntelevle = *(__int64*)(__int64(v5) + 0x98); + if (!persisntelevle) + { + LOG_INFO(LogDev, "tralaleo trallala"); + return 0; + } + } + } + + return oFunc(a1); +} + void ApplyNullAndRetTrues() { + if (Fortnite_Version >= 23) + { + auto sig = Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 E8 ? ? ? ? 48 8B F8 48 8B 83 ? ? ? ? 48 85 C0").Get(); // 23.40 + func2 = decltype(func2)(Memcury::Scanner::FindPattern("48 83 EC 28 BA ? ? ? ? 4C 8B C1 E8 ? ? ? ? 84 C0 74 04 33 C0 EB 04 49 8B 40 20").Get()); + Hooking::MinHook::Hook((PVOID)sig, Func, (void**)&oFunc); + } + static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); auto AddressesToNull = Addresses::GetFunctionsToNull(); @@ -859,6 +886,23 @@ DWORD WINAPI Main(LPVOID) LOG_INFO(LogDev, "Fortnite_Version: {}", Fortnite_Version); LOG_INFO(LogDev, "Engine_Version: {}", Engine_Version); +#if 0 // CONSOLE ONLY (FOR CLIENT) + SetConsoleTitleA("Console"); + + // Spawn Console unreal engine Gameviewport + static UObject* Engine = GetEngine(); + auto GameViewport = Engine->Get("GameViewport"); + + if (!GameViewport) return 0; + + auto ViewportConsolePtr = GameViewport->GetPtr("ViewportConsole"); + *ViewportConsolePtr = UGameplayStatics::SpawnObject(FindObject(L"/Script/Engine.Console"), GameViewport); + + LOG_INFO(LogDev, "Spawned Console! Exiting"); + + return 0; +#endif + #ifdef ABOVE_S20 if (Fortnite_Version < 20) { @@ -886,7 +930,9 @@ DWORD WINAPI Main(LPVOID) // Globals::bAutoRestart = IsRestartingSupported(); - static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); + static auto GameModeDefault = FindObject(L"/Script/FortniteGame.Default__FortGameModeBR") + ? FindObject(L"/Script/FortniteGame.Default__FortGameModeBR") // 22.30 atleast + : FindObject(L"/Script/FortniteGame.Default__FortGameModeAthena"); static auto FortPlayerControllerZoneDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); static auto FortPlayerControllerDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerController"); static auto FortPlayerPawnAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerPawnAthena"); // FindObject(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); @@ -913,8 +959,8 @@ DWORD WINAPI Main(LPVOID) UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortTeams VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAI VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAIDirector VeryVerbose", nullptr); + UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortUIDirector Fatal", nullptr); // Temporary // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortQuest VeryVerbose", nullptr); - // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortUIDirector NoLogging", nullptr); // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogAbilitySystem VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogDataTable VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogMeshNetwork VeryVerbose", nullptr); @@ -1357,12 +1403,15 @@ DWORD WINAPI Main(LPVOID) AFortPlayerControllerAthena::ServerPlaySquadQuickChatMessageHook, nullptr, false); } - auto ServerTeleportToPlaygroundIslandFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"); - - if (ServerTeleportToPlaygroundIslandFn) + if (Fortnite_Version < 19) // jmp qword ptr idk why our dtc dont wrok { - Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerTeleportToPlaygroundIslandFn, - AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false); + auto ServerTeleportToPlaygroundIslandFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"); + + if (ServerTeleportToPlaygroundIslandFn) + { + Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerTeleportToPlaygroundIslandFn, + AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false); + } } // Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"), diff --git a/Project Reboot 3.0/finder.cpp b/Project Reboot 3.0/finder.cpp index 3fd27a1..c8c1cb3 100644 --- a/Project Reboot 3.0/finder.cpp +++ b/Project Reboot 3.0/finder.cpp @@ -50,6 +50,17 @@ uint64 FindGIsClient() auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); + if (!Addr.Get()) // pretty sure only 22+ since the string is split (we could maybe try just searching without the A?) + { + if (Fortnite_Version == 22.3) + { + // return __int64(GetModuleHandleW(0)) + 0xDCE9DFA; + } + + LOG_ERROR(LogDev, "[FindGIsClient] Failed to find AllowCommandletRendering! Returning 0"); + return 0; + } + std::vector> BytesArray = { {0x88, 0x05}, // 20.40 21.00 {0xC6, 0x05}, // mov cs X // Checked on 1.11, 12.41, 15.10 @@ -181,6 +192,12 @@ uint64 FindGetPlayerViewpoint() auto FailedToSpawnPawnStrRefAddr = Memcury::Scanner::FindStringRef(L"%s failed to spawn a pawn", true, 0, Fortnite_Version >= 19).Get(); + if (!FailedToSpawnPawnStrRefAddr) + { + LOG_ERROR(LogFinder, "Failed to find FailedToSpawnPawnStrRefAddr! Report to Milxnor immediately."); + return 0; + } + for (int i = 0; i < 1000; i++) { if (*(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i) == 0x40 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 1) == 0x53) diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index d7d830f..04d078b 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -69,6 +69,19 @@ static inline uint64 FindStaticFindObject(int StringSkip = 1) if (Engine_Version == 500) { + if (Fortnite_Version >= 22) // string ref is functionized + real func is chunked gg + { + auto addr = Memcury::Scanner::FindPattern("40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 33 F6 4C 8B E1 48 83 CB", false).Get(); // 22.30 + + if (!addr) // super functionized + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8B EC 48 83 EC 60 33 DB 4C 8B F1 48 8D 4D E8 41 8A F1", false).Get(); // 23.40 + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8B EC 48 83 EC 60 33 DB 4C 8B F9 48 8D 4D E8 45").Get(); // 24.40 + + return addr; + } + auto addr = Memcury::Scanner::FindPattern("40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 33 F6 4C 8B E1 45 0F B6 E9 49 8B F8 41 8B C6", false).Get(); if (!addr) @@ -106,8 +119,9 @@ static inline uint64 FindStaticFindObject(int StringSkip = 1) return iasdfk; } + // this never gets ran fyi 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(); + auto Final = FindBytes(Addr, { 0x48, 0x89, 0x5C }, 255, 0, true, 0, false); return Final; } @@ -535,17 +549,35 @@ static inline uint64 FindStepExplicitProperty() static inline uint64 FindIsNetRelevantForOffset() { - if (Engine_Version == 416 || Fortnite_Version == 3.3) // checked on 1.7.2, 1.8, 3.3 + if (Engine_Version == 416 || Fortnite_Version == 3.3) // checked 1.7.2, 1.8, 3.3 return 0x420 / 8; if (Fortnite_Version == 1.10 || Fortnite_Version == 1.11 || (Fortnite_Version >= 2.42 && Fortnite_Version <= 3.2)) // checked 1.10, 1.11, 2.4.2, 2.5, 3.0, 3.1, 3.2 return 0x418 / 8; + if (std::floor(Fortnite_Version) == 20) + return 0x4C8 / 8; // checked 20.40 + if (std::floor(Fortnite_Version) == 21) + return 0x4D0 / 8; // checked 21.00 + if (std::floor(Fortnite_Version) == 22) + return 0x4D8 / 8; // checked 22.30 + if (Fortnite_Version >= 23) + return 0x4E0 / 8; // checked 23.40 return 0; } static inline uint64 FindActorChannelClose() { - auto StringRef = Memcury::Scanner::FindStringRef(L"UActorChannel::Close: ChIndex: %d, Actor: %s"); + auto StringRef = Memcury::Scanner::FindStringRef(L"UActorChannel::Close: ChIndex: %d, Actor: %s", false); + + if (!StringRef.Get()) // 22.30 atleast (it just changed but also functionized im too lazy rn) + { + auto addr = Memcury::Scanner::FindPattern("40 55 53 56 57 41 56 48 8B EC 48 83 EC 40 4C 8B 41 68 40 8A F2 48 8B 51 28 48 8B D9 48 8D 4D 48 E8 ? ? ? ? 80").Get(); // 20.40 + + if (!addr) // TODO: Check 48 89 5C 24 ? 55 56 57 48 83 EC ? 4C 8B 41 ? 40 8A F2 48 8B 51 ? 48 8B + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 48 83 EC ? 4C 8B 41 ? 40 8A F2 48 8B 51 ? 48 8B ? 48 8D 4C 24 ? E8").Get(); // 22.30 + 23.40 + + return addr; + } return FindBytes(StringRef, { 0x48, 0x89, 0x5C }, 1000, 0, true); } @@ -592,6 +624,13 @@ static inline uint64 FindSetWorld() SetWorldIndex = 0x7B; if (Fortnite_Season == 21) SetWorldIndex = 0x7C; // 21.00 + if (Fortnite_Season == 22 || Fortnite_Season == 23) + SetWorldIndex = 0x7B; // 22.30 & 23.50 + + if (!SetWorldIndex) + { + MessageBoxA(0, "SetWorldIndex 0", "Error", MB_ICONERROR); + } // static auto DefaultNetDriver = FindObject("/Script/Engine.Default__NetDriver"); return SetWorldIndex; @@ -612,7 +651,14 @@ static inline uint64 FindInitListen() static inline uint64 FindOnDamageServer() { if (Fortnite_Version >= 20) // 8B 15 on name ref??? - return Memcury::Scanner::FindPattern("E8 ? ? ? ? 41 39 B4 24").RelativeOffset(1).Get(); // 20.40 (not 21.00) + { + auto addr = Memcury::Scanner::FindPattern("E8 ? ? ? ? 41 39 B4 24").RelativeOffset(1).Get(); // 20.40 (not 21.00) + + if (!addr) + addr = Memcury::Scanner::FindPattern("E8 ? ? ? ? 4C 8D 96 ? ? ? ? 49 8B CA E8 ? ? ? ? 45 33 E4").RelativeOffset(1).Get(); // 22.3 + + return addr; + } auto Addr = FindFunctionCall(L"OnDamageServer", Engine_Version == 416 ? std::vector{ 0x4C, 0x89, 0x4C } : @@ -862,9 +908,9 @@ static inline uint64 FindNoMCP() if (std::floor(Fortnite_Version) == 5) return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get(); - LOG_INFO(LogDev, "finding it"); + LOG_INFO(LogDev, "Finding Func IsRunningNoMCP"); auto fn = FindObject(L"/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP"); - LOG_INFO(LogDev, "fn: {}", __int64(fn)); + LOG_INFO(LogDev, "IsRunningNoMCP: {}", __int64(fn)); if (!fn) return 0; @@ -1474,7 +1520,10 @@ static inline uint64 FindDispatchRequest() if (!Addrr) { - return 0; + Addrr = Memcury::Scanner::FindStringRef(L"MCP-Profile: Dispatching request to %s - ContextCredentials: %s", false, 0, Fortnite_Version >= 19).Get(); + + if (!Addrr) + return 0; } for (int i = 0; i < 1000; i++) @@ -1733,7 +1782,14 @@ static inline uint64 FindGiveAbility() 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) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 56 48 83 EC 20 8B 81 ? ? ? ? 49 8B E8 4C").Get(); // idk why finder doesnt work + { + auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 56 48 83 EC 20 8B 81 ? ? ? ? 49 8B E8 4C", false).Get(); // idk why finder doesnt work + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 56 41 57 48 8B EC 48 83 EC ? 49 8B 40").Get(); // 22.3 + + return addr; + } // auto Addr = Memcury::Scanner::FindStringRef(L"GiveAbilityAndActivateOnce called on ability %s on the client, not allowed!"); // has 2 refs for some reason on some versions // auto realGiveAbility = Memcury::Scanner(FindBytes(Addr, { 0xE8 }, 500, 0, false, 0, true)).RelativeOffset(1).Get(); @@ -1787,7 +1843,15 @@ static inline uint64 FindReplaceBuildingActor() static inline uint64 FindSendClientAdjustment() { - return Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B 99 ? ? ? ? 48 39 99 ? ? ? ? 74 0A 48 83 B9", false).Get(); + auto addr = Memcury::Scanner::FindPattern("40 53 48 83 EC 20 48 8B 99 ? ? ? ? 48 39 99 ? ? ? ? 74 0A 48 83 B9", false).Get(); + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 8B 91 ? ? ? ? 48 8B D9 83 FA", false).Get(); // 22.3 (this was painful to find) + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 83 3D ? ? ? ? ? 48 8B D9 75 57 8B 91").Get(); + + return addr; } static inline uint64 FindReplicateActor() @@ -1806,10 +1870,21 @@ static inline uint64 FindReplicateActor() return addr; } + /// STAT_NetReplicateActorTime if (std::floor(Fortnite_Version) == 20) return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8D 69 68").Get(); - if (Fortnite_Version >= 21) // 21.00 - return Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 33 FF 4C 8D 69 68 44 38 3D").Get(); + if (Fortnite_Version >= 21) + { + auto addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 33 FF 4C 8D 69 68 44 38 3D", false).Get(); + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 8B C4 48 89 58 ? 48 89 70 ? 48 89 78 ? 55 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 45 33 FF 4C 8D 61 ? 44 38 3D ? ? ? ? 48 8D 05 ? ? ? ? 48 8B", false).Get(); // 22.30 + + if (!addr) + addr = Memcury::Scanner::FindPattern("40 55 41 54 41 55 41 56 41 57 48 81 EC ? ? ? ? 48 8D 6C 24 ? 48 89 9D ? ? ? ? 48 89 B5 ? ? ? ? 48 89 BD ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C5 48 89 85 ? ? ? ? 45 33 E4 4C 8D 69 68 44 38 25 ? ? ? ? 48 8D 05 ? ? ? ? 48 8B F9 49 8B 4D").Get(); // 23.40 + + return addr; + } return 0; } @@ -1845,7 +1920,14 @@ static inline uint64 FindSetChannelActor() if (std::floor(Fortnite_Version) == 20) return Memcury::Scanner::FindPattern("40 55 53 56 57 41 54 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 45 33 E4 48 8D 3D ? ? ? ? 44 89 A5").Get(); if (Fortnite_Version >= 21) - return Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 33 FF 4C 8D 35 ? ? ? ? 89 BD").Get(); + { + auto addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 33 FF 4C 8D 35 ? ? ? ? 89 BD", false).Get(); + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 55 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 45 33 F6 48 8D").Get(); // 22.30 & 23.40 + + return addr; + } return 0; } @@ -1861,7 +1943,17 @@ static inline uint64 FindCallPreReplication() if (std::floor(Fortnite_Version) == 20) return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 40 F6 41 58 30 48 8B EA 48 8B D9 40 B6 01").Get(); if (Fortnite_Version >= 21) - return Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 40 F6 41 58 30 4C 8B F2").Get(); + { + auto addr = Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 83 EC 40 F6 41 58 30 4C 8B F2", false).Get(); + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 8B C4 48 89 58 ? 48 89 70 ? 48 89 78 ? 4C 89 60 ? 55 41 56 41 57 48 8B EC 48 83 EC ? F6 41 ? ? 4C 8B FA 48 8B", false).Get(); // 22.30 + + if (!addr) + addr = Memcury::Scanner::FindPattern("48 85 D2 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 56 41 57 48 8B EC 48 83 EC 40 F6 41 58 30").Get(); // 23.40 + + return addr; + } return 0; } diff --git a/Project Reboot 3.0/gui.h b/Project Reboot 3.0/gui.h index e095582..e34b7d7 100644 --- a/Project Reboot 3.0/gui.h +++ b/Project Reboot 3.0/gui.h @@ -124,7 +124,7 @@ static inline void Restart() // todo move? InitBotNames(); FString LevelA = Engine_Version < 424 - ? L"open Athena_Terrain" : Engine_Version >= 500 ? Engine_Version >= 501 + ? L"open Athena_Terrain" : Engine_Version >= 500 ? Fortnite_Version >= 23 ? L"open Asteria_Terrain" : Globals::bCreative ? L"open Creative_NoApollo_Terrain" : L"open Artemis_Terrain" diff --git a/Project Reboot 3.0/inc.h b/Project Reboot 3.0/inc.h index 7ff98e1..f159ef8 100644 --- a/Project Reboot 3.0/inc.h +++ b/Project Reboot 3.0/inc.h @@ -21,7 +21,7 @@ extern inline double Fortnite_Version = 0; // For example, 4.1, 6.21, etc. // Pr extern inline int Fortnite_CL = 0; // #define PROD // this doesnt do anything besides remove processeventhook and some assert stuff -// DEPRACTERD ^^^ (see Globals::bDeveloperMode) +// DEPRECATED ^^^ (see Globals::bDeveloperMode) // #define ABOVE_S20