s20-s23 much better

This commit is contained in:
Gray
2025-07-18 02:49:40 -04:00
parent d769fbc1b2
commit 8f0ce8919e
12 changed files with 229 additions and 52 deletions

View File

@@ -178,8 +178,12 @@ bool AActor::IsActorBeingDestroyed()
bool AActor::IsNetStartup() bool AActor::IsNetStartup()
{ {
static auto bNetStartupOffset = GetOffset("bNetStartup"); static auto bNetStartupOffset = GetOffset("bNetStartup", false) == -1
static auto bNetStartupFieldMask = GetFieldMask(GetProperty("bNetStartup")); ? 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); return ReadBitfieldValue(bNetStartupOffset, bNetStartupFieldMask);
} }

View File

@@ -4,8 +4,8 @@
void AFortAthenaVehicleSpawner::SpawnVehicleHook(AFortAthenaVehicleSpawner* VehicleSpawner) 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); // SpawnVehicleFromSpawner(VehicleSpawner);
} }

View File

@@ -27,6 +27,7 @@ void CollectDataTablesRows(const std::vector<UDataTable*>& DataTables, LOOTING_M
{ {
if (!Addresses::LoadAsset && !DataTable->IsValidLowLevel()) if (!Addresses::LoadAsset && !DataTable->IsValidLowLevel())
{ {
// LOG_INFO(LogDev, "INvalid table!");
continue; // Remove from vector? continue; // Remove from vector?
} }
@@ -627,7 +628,9 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, int WorldLevel, int For
{ {
if (Fortnite_Version <= 6 if (Fortnite_Version <= 6
|| std::floor(Fortnite_Version) == 9 || std::floor(Fortnite_Version) == 9
|| Fortnite_Version == 10.00) // the tables unload! || Fortnite_Version == 10.00 // the tables unload!
// || Fortnite_Version >= 22
)
{ {
LTDTables.clear(); LTDTables.clear();
LPTables.clear(); LPTables.clear();

View File

@@ -417,6 +417,7 @@ void AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook(AFor
void AFortPlayerControllerAthena::ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn) void AFortPlayerControllerAthena::ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn)
{ {
LOG_INFO(LogDev, "ServerAcknowledgePossession!");
static auto AcknowledgedPawnOffset = Controller->GetOffset("AcknowledgedPawn"); static auto AcknowledgedPawnOffset = Controller->GetOffset("AcknowledgedPawn");
const APawn* OldAcknowledgedPawn = Controller->Get<APawn*>(AcknowledgedPawnOffset); const APawn* OldAcknowledgedPawn = Controller->Get<APawn*>(AcknowledgedPawnOffset);

View File

@@ -339,7 +339,7 @@ void UNetDriver::ServerReplicateActors_BuildConsiderList(std::vector<FNetworkObj
} }
} }
static UActorChannel* FindChannel(AActor * Actor, UNetConnection * Connection) static UActorChannel* FindChannel(AActor* Actor, UNetConnection* Connection)
{ {
static auto OpenChannelsOffset = Connection->GetOffset("OpenChannels"); static auto OpenChannelsOffset = Connection->GetOffset("OpenChannels");
auto& OpenChannels = Connection->Get<TArray<UChannel*>>(OpenChannelsOffset); auto& OpenChannels = Connection->Get<TArray<UChannel*>>(OpenChannelsOffset);
@@ -376,20 +376,16 @@ static UActorChannel* FindChannel(AActor * Actor, UNetConnection * Connection)
return nullptr; return nullptr;
} }
static bool IsActorRelevantToConnection(AActor * Actor, std::vector<FNetViewer>&ConnectionViewers) static bool IsActorRelevantToConnection(AActor* Actor, std::vector<FNetViewer>&ConnectionViewers)
{ {
for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); viewerIdx++) for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); ++viewerIdx)
{ {
if (!ConnectionViewers[viewerIdx].ViewTarget) if (!ConnectionViewers[viewerIdx].ViewTarget)
continue; 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 (Actor->IsNetRelevantFor(ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
// if (IsNetRelevantFor(Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) // if (IsNetRelevantFor(Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
if (reinterpret_cast<bool(*)(AActor*, AActor*, AActor*, FVector&)>(Actor->VFTable[index])( if (reinterpret_cast<bool(*)(AActor*, AActor*, AActor*, const FVector&)>(Actor->VFTable[Offsets::IsNetRelevantFor])(
Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation)) Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
{ {
return true; return true;
@@ -556,7 +552,7 @@ void SetChannelActorForDestroy(UActorChannel* Channel, FActorDestructionInfo* De
using UPackageMap = UObject; using UPackageMap = UObject;
reinterpret_cast<bool(*)(UPackageMap*, FArchive * Ar, UObject * InOuter,FNetworkGUID NetGUID, FString ObjName)>(Connection->GetPackageMap()->VFTable[0x238 / 8])(Connection->GetPackageMap(), &CloseBunch, DestructInfo->ObjOuter.Get(), DestructInfo->NetGUID, DestructInfo->PathName); reinterpret_cast<bool(*)(UPackageMap*, FArchive* Ar, UObject* InOuter, FNetworkGUID NetGUID, FString ObjName)>(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(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()); // 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; // bCPUSaturated = DeltaSeconds > 1.2f * ServerTickTime;
} }
bool bUseNetworkObjectList = ShouldUseNetworkObjectList();
std::vector<FNetworkObjectInfo*> ConsiderList; std::vector<FNetworkObjectInfo*> ConsiderList;
if (ShouldUseNetworkObjectList()) if (bUseNetworkObjectList)
ConsiderList.reserve(GetNetworkObjectList().ActiveNetworkObjects.Num()); ConsiderList.reserve(GetNetworkObjectList().ActiveNetworkObjects.Num());
auto World = GetWorld(); auto World = GetWorld();
@@ -619,11 +617,12 @@ int32 UNetDriver::ServerReplicateActors()
static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel); static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel);
static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor); 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 (*SetChannelActor)(UActorChannel*, AActor*) = decltype(SetChannelActor)(Addresses::SetChannelActor);
static __int64 (*SetChannelActor2)(UActorChannel*, AActor*, ESetChannelActorFlags) = decltype(SetChannelActor2)(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); UNetConnection* Connection = this->GetClientConnections().at(i);
@@ -694,7 +693,7 @@ int32 UNetDriver::ServerReplicateActors()
for (FActorDestructionInfo* DeletionEntry : DeletionEntries) 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) if (DeletionEntry->StreamingLevelName != -1)
{ {
@@ -719,9 +718,6 @@ int32 UNetDriver::ServerReplicateActors()
if (Engine_Version >= 422) if (Engine_Version >= 422)
{ {
FString ActorStr = L"Actor";
FName ActorName = UKismetStringLibrary::Conv_StringToName(ActorStr);
int ChannelIndex = -1; // 4294967295 int ChannelIndex = -1; // 4294967295
Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex); Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex);
} }
@@ -807,7 +803,6 @@ int32 UNetDriver::ServerReplicateActors()
} }
} }
if (!Channel) if (!Channel)
{ {
if (Actor->IsA(APlayerController::StaticClass()) && Actor != Connection->GetPlayerController()) // isnetrelevantfor should handle this iirc if (Actor->IsA(APlayerController::StaticClass()) && Actor != Connection->GetPlayerController()) // isnetrelevantfor should handle this iirc
@@ -817,9 +812,6 @@ int32 UNetDriver::ServerReplicateActors()
{ {
if (Engine_Version >= 422) if (Engine_Version >= 422)
{ {
FString ActorStr = L"Actor";
FName ActorName = UKismetStringLibrary::Conv_StringToName(ActorStr);
int ChannelIndex = -1; // 4294967295 int ChannelIndex = -1; // 4294967295
Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex); Channel = (UActorChannel*)CreateChannelByName(Connection, &ActorName, EChannelCreateFlags::OpenedLocally, ChannelIndex);
} }
@@ -845,9 +837,10 @@ int32 UNetDriver::ServerReplicateActors()
if (Channel) if (Channel)
{ {
// LOG_INFO(LogDev, "Actor: {}", Actor->GetFullName());
if (ReplicateActor(Channel)) if (ReplicateActor(Channel))
{ {
if (ShouldUseNetworkObjectList()) if (bUseNetworkObjectList)
{ {
// LOG_INFO(LogReplication, "Replicated Actor!"); // LOG_INFO(LogReplication, "Replicated Actor!");
auto TimeSeconds = UGameplayStatics::GetTimeSeconds(World); 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 // shuffle the list of connections if not all connections were ticked
/* /*
if (NumClientsToTick < NetDriver->ClientConnections.Num()) if (NumClientsToTick < NetDriver->ClientConnections.Num())

View File

@@ -514,6 +514,14 @@ void Offsets::FindAll()
{ {
Offsets::ReplicationFrame = 0x3D8; 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::IsNetRelevantFor = FindIsNetRelevantForOffset();
Offsets::Script = Offsets::Children + 8 + 4 + 4; Offsets::Script = Offsets::Children + 8 + 4 + 4;

View File

@@ -142,6 +142,8 @@ public:
{ {
auto& StartingItem = StartingItems.at(i, FItemAndCount::GetStructSize()); auto& StartingItem = StartingItems.at(i, FItemAndCount::GetStructSize());
// TODO: Check if it is FortSmartBuildingItemDefinition
(*Inventory)->AddItem(StartingItem.GetItem(), nullptr, StartingItem.GetCount()); (*Inventory)->AddItem(StartingItem.GetItem(), nullptr, StartingItem.GetCount());
} }

View File

@@ -674,12 +674,12 @@ void ChangeLevels()
LOG_INFO(LogDev, "FindGIsClient(): 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0))); LOG_INFO(LogDev, "FindGIsClient(): 0x{:x}", FindGIsClient() - __int64(GetModuleHandleW(0)));
// auto bruh = std::wstring(CustomMapName.begin(), CustomMapName.end()); // 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"; bool bShouldUseMoleMap = PlaylistName == "/MoleGame/Playlists/Playlist_MoleGame.Playlist_MoleGame";
FString LevelB = /* bUseCustomMap ? bruhh.c_str() : */ (Engine_Version < 424 FString LevelB = /* bUseCustomMap ? CustomMapOpenWStr.c_str() : */ (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" ? L"open Asteria_Terrain"
: Globals::bCreative ? L"open Creative_NoApollo_Terrain" : Globals::bCreative ? L"open Creative_NoApollo_Terrain"
: L"open Artemis_Terrain" : L"open Artemis_Terrain"
@@ -687,7 +687,7 @@ void ChangeLevels()
: L"open Apollo_Terrain"); : L"open Apollo_Terrain");
FString Level = /* bUseCustomMap ? bruh.c_str() : */ (Engine_Version < 424 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" ? L"Asteria_Terrain"
: Globals::bCreative ? L"Creative_NoApollo_Terrain" : Globals::bCreative ? L"Creative_NoApollo_Terrain"
: L"Artemis_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() 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<AFortPlayerControllerAthena>(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject<UClass>(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); static auto FortPlayerControllerAthenaDefault = FindObject<AFortPlayerControllerAthena>(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject<UClass>(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C");
auto AddressesToNull = Addresses::GetFunctionsToNull(); auto AddressesToNull = Addresses::GetFunctionsToNull();
@@ -859,6 +886,23 @@ DWORD WINAPI Main(LPVOID)
LOG_INFO(LogDev, "Fortnite_Version: {}", Fortnite_Version); LOG_INFO(LogDev, "Fortnite_Version: {}", Fortnite_Version);
LOG_INFO(LogDev, "Engine_Version: {}", Engine_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<UClass>(L"/Script/Engine.Console"), GameViewport);
LOG_INFO(LogDev, "Spawned Console! Exiting");
return 0;
#endif
#ifdef ABOVE_S20 #ifdef ABOVE_S20
if (Fortnite_Version < 20) if (Fortnite_Version < 20)
{ {
@@ -886,7 +930,9 @@ DWORD WINAPI Main(LPVOID)
// Globals::bAutoRestart = IsRestartingSupported(); // Globals::bAutoRestart = IsRestartingSupported();
static auto GameModeDefault = FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeAthena"); static auto GameModeDefault = FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeBR")
? FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeBR") // 22.30 atleast
: FindObject<AFortGameModeAthena>(L"/Script/FortniteGame.Default__FortGameModeAthena");
static auto FortPlayerControllerZoneDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerControllerZone"); static auto FortPlayerControllerZoneDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerControllerZone");
static auto FortPlayerControllerDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerController"); static auto FortPlayerControllerDefault = FindObject<AFortPlayerController>(L"/Script/FortniteGame.Default__FortPlayerController");
static auto FortPlayerPawnAthenaDefault = FindObject<AFortPlayerPawn>(L"/Script/FortniteGame.Default__FortPlayerPawnAthena"); // FindObject<AFortPlayerPawn>(L"/Game/Athena/PlayerPawn_Athena.Default__PlayerPawn_Athena_C"); static auto FortPlayerPawnAthenaDefault = FindObject<AFortPlayerPawn>(L"/Script/FortniteGame.Default__FortPlayerPawnAthena"); // FindObject<AFortPlayerPawn>(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 LogFortTeams VeryVerbose", nullptr);
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAI VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAI VeryVerbose", nullptr);
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortAIDirector 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 LogFortQuest VeryVerbose", nullptr);
// UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogFortUIDirector NoLogging", nullptr);
// UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogAbilitySystem VeryVerbose", nullptr); // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogAbilitySystem VeryVerbose", nullptr);
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogDataTable VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogDataTable VeryVerbose", nullptr);
UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogMeshNetwork VeryVerbose", nullptr); UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogMeshNetwork VeryVerbose", nullptr);
@@ -1357,12 +1403,15 @@ DWORD WINAPI Main(LPVOID)
AFortPlayerControllerAthena::ServerPlaySquadQuickChatMessageHook, nullptr, false); AFortPlayerControllerAthena::ServerPlaySquadQuickChatMessageHook, nullptr, false);
} }
auto ServerTeleportToPlaygroundIslandFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"); if (Fortnite_Version < 19) // jmp qword ptr idk why our dtc dont wrok
if (ServerTeleportToPlaygroundIslandFn)
{ {
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerTeleportToPlaygroundIslandFn, auto ServerTeleportToPlaygroundIslandFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland");
AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false);
if (ServerTeleportToPlaygroundIslandFn)
{
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, ServerTeleportToPlaygroundIslandFn,
AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false);
}
} }
// Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"), // Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"),

View File

@@ -50,6 +50,17 @@ uint64 FindGIsClient()
auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); 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<std::vector<uint8_t>> BytesArray = { std::vector<std::vector<uint8_t>> BytesArray = {
{0x88, 0x05}, // 20.40 21.00 {0x88, 0x05}, // 20.40 21.00
{0xC6, 0x05}, // mov cs X // Checked on 1.11, 12.41, 15.10 {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(); 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++) for (int i = 0; i < 1000; i++)
{ {
if (*(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i) == 0x40 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 1) == 0x53) if (*(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i) == 0x40 && *(uint8_t*)(uint8_t*)(FailedToSpawnPawnStrRefAddr - i + 1) == 0x53)

View File

@@ -69,6 +69,19 @@ static inline uint64 FindStaticFindObject(int StringSkip = 1)
if (Engine_Version == 500) 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(); 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) if (!addr)
@@ -106,8 +119,9 @@ static inline uint64 FindStaticFindObject(int StringSkip = 1)
return iasdfk; 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 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; return Final;
} }
@@ -535,17 +549,35 @@ static inline uint64 FindStepExplicitProperty()
static inline uint64 FindIsNetRelevantForOffset() 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; 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 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; 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; return 0;
} }
static inline uint64 FindActorChannelClose() 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); return FindBytes(StringRef, { 0x48, 0x89, 0x5C }, 1000, 0, true);
} }
@@ -592,6 +624,13 @@ static inline uint64 FindSetWorld()
SetWorldIndex = 0x7B; SetWorldIndex = 0x7B;
if (Fortnite_Season == 21) if (Fortnite_Season == 21)
SetWorldIndex = 0x7C; // 21.00 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"); // static auto DefaultNetDriver = FindObject("/Script/Engine.Default__NetDriver");
return SetWorldIndex; return SetWorldIndex;
@@ -612,7 +651,14 @@ static inline uint64 FindInitListen()
static inline uint64 FindOnDamageServer() static inline uint64 FindOnDamageServer()
{ {
if (Fortnite_Version >= 20) // 8B 15 on name ref??? 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", auto Addr = FindFunctionCall(L"OnDamageServer",
Engine_Version == 416 ? std::vector<uint8_t>{ 0x4C, 0x89, 0x4C } : Engine_Version == 416 ? std::vector<uint8_t>{ 0x4C, 0x89, 0x4C } :
@@ -862,9 +908,9 @@ static inline uint64 FindNoMCP()
if (std::floor(Fortnite_Version) == 5) if (std::floor(Fortnite_Version) == 5)
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get(); 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<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP"); auto fn = FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP");
LOG_INFO(LogDev, "fn: {}", __int64(fn)); LOG_INFO(LogDev, "IsRunningNoMCP: {}", __int64(fn));
if (!fn) if (!fn)
return 0; return 0;
@@ -1474,7 +1520,10 @@ static inline uint64 FindDispatchRequest()
if (!Addrr) 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++) for (int i = 0; i < 1000; i++)
@@ -1733,7 +1782,14 @@ static inline uint64 FindGiveAbility()
if (Engine_Version == 421) 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(); 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) 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 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(); // 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() 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() static inline uint64 FindReplicateActor()
@@ -1806,10 +1870,21 @@ static inline uint64 FindReplicateActor()
return addr; return addr;
} }
/// STAT_NetReplicateActorTime
if (std::floor(Fortnite_Version) == 20) 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(); 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 if (Fortnite_Version >= 21)
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(); {
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; return 0;
} }
@@ -1845,7 +1920,14 @@ static inline uint64 FindSetChannelActor()
if (std::floor(Fortnite_Version) == 20) 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(); 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) 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; return 0;
} }
@@ -1861,7 +1943,17 @@ static inline uint64 FindCallPreReplication()
if (std::floor(Fortnite_Version) == 20) 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(); 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) 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; return 0;
} }

View File

@@ -124,7 +124,7 @@ static inline void Restart() // todo move?
InitBotNames(); InitBotNames();
FString LevelA = Engine_Version < 424 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" ? L"open Asteria_Terrain"
: Globals::bCreative ? L"open Creative_NoApollo_Terrain" : Globals::bCreative ? L"open Creative_NoApollo_Terrain"
: L"open Artemis_Terrain" : L"open Artemis_Terrain"

View File

@@ -21,7 +21,7 @@ extern inline double Fortnite_Version = 0; // For example, 4.1, 6.21, etc. // Pr
extern inline int Fortnite_CL = 0; extern inline int Fortnite_CL = 0;
// #define PROD // this doesnt do anything besides remove processeventhook and some assert stuff // #define PROD // this doesnt do anything besides remove processeventhook and some assert stuff
// DEPRACTERD ^^^ (see Globals::bDeveloperMode) // DEPRECATED ^^^ (see Globals::bDeveloperMode)
// #define ABOVE_S20 // #define ABOVE_S20