diff --git a/Project Reboot 3.0/BuildingFoundation.cpp b/Project Reboot 3.0/BuildingFoundation.cpp index 83eccd4..d16c29e 100644 --- a/Project Reboot 3.0/BuildingFoundation.cpp +++ b/Project Reboot 3.0/BuildingFoundation.cpp @@ -8,7 +8,7 @@ void ABuildingFoundation::SetDynamicFoundationTransformHook(UObject* Context, FF auto BuildingFoundation = (ABuildingFoundation*)Context; - LOG_INFO(LogDev, "Bruh: {}", BuildingFoundation->GetName()); + LOG_INFO(LogDev, "SetDynamicFoundationTransformHook: {}", BuildingFoundation->GetName()); SetFoundationTransform(BuildingFoundation, NewTransform); diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index c711a45..a32543e 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -797,6 +797,7 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game LOG_INFO(LogNet, "WorldLevel {}", GameState->GetWorldLevel()); +#ifndef ABOVE_S20 if (Globals::AmountOfListens == 1) // we only want to do this one time. { if (bEnableRebooting) @@ -900,18 +901,11 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game AllRebootVans.Free(); - if (Engine_Version >= 500) - { - GameState->Get("DefaultParachuteDeployTraceForGroundDistance") = 10000; - } - if (AmountOfBotsToSpawn != 0) { Bots::SpawnBotsAtPlayerStarts(AmountOfBotsToSpawn); } - UptimeWebHook.send_message(std::format("Server up! {} {}", Fortnite_Version, PlaylistName)); // PlaylistName sometimes isn't always what we use! - if (std::floor(Fortnite_Version) == 5) { auto NewFn = FindObject(L"/Game/Athena/Prototype/Blueprints/Cube/CUBE.CUBE_C.New"); @@ -979,6 +973,14 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game } } +#endif + if (Engine_Version >= 500) + { + GameState->Get("DefaultParachuteDeployTraceForGroundDistance") = 10000; + } + + UptimeWebHook.send_message(std::format("Server up! {} {}", Fortnite_Version, PlaylistName)); // PlaylistName sometimes isn't always what we use! + static auto ReplicationDriverOffset = GetWorld()->GetNetDriver()->GetOffset("ReplicationDriver", false); // If netdriver is null the world blows up Globals::bShouldUseReplicationGraph = (!(ReplicationDriverOffset == -1 || Fortnite_Version >= 20)) diff --git a/Project Reboot 3.0/GameModeBase.cpp b/Project Reboot 3.0/GameModeBase.cpp index 7f462c8..a9e6471 100644 --- a/Project Reboot 3.0/GameModeBase.cpp +++ b/Project Reboot 3.0/GameModeBase.cpp @@ -120,7 +120,7 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll static auto DefaultPawnClassOffset = GameMode->GetOffset("DefaultPawnClass"); GameMode->Get(DefaultPawnClassOffset) = PawnClass; - bool bUseSpawnActor = Fortnite_Version >= 20; + bool bUseSpawnActor = false; static auto SpawnDefaultPawnAtTransformFn = FindObject(L"/Script/Engine.GameModeBase.SpawnDefaultPawnAtTransform"); @@ -136,8 +136,12 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll struct { AController* NewPlayer; FTransform SpawnTransform; APawn* ReturnValue; } AGameModeBase_SpawnDefaultPawnAtTransform_Params{ NewPlayer, SpawnTransform }; + LOG_INFO(LogDev, "Calling SpawnDefaultPawnAtTransformFn!"); + GameMode->ProcessEvent(SpawnDefaultPawnAtTransformFn, &AGameModeBase_SpawnDefaultPawnAtTransform_Params); + LOG_INFO(LogDev, "Finished SpawnDefaultPawnAtTransformFn!"); + NewPawn = AGameModeBase_SpawnDefaultPawnAtTransform_Params.ReturnValue; } @@ -297,7 +301,7 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll bFirst = false; Calendar::SetSnow(100); } - // LOG_INFO(LogDev, "Finish SpawnDefaultPawnFor!"); + LOG_INFO(LogDev, "Finish SpawnDefaultPawnFor!"); return NewPawn; } \ No newline at end of file diff --git a/Project Reboot 3.0/Quat.h b/Project Reboot 3.0/Quat.h index db4d242..40d1e66 100644 --- a/Project Reboot 3.0/Quat.h +++ b/Project Reboot 3.0/Quat.h @@ -6,6 +6,7 @@ MS_ALIGN(16) struct FQuat { public: +#ifndef ABOVE_S20 /** The quaternion's X-component. */ float X; @@ -17,6 +18,12 @@ public: /** The quaternion's W-component. */ float W; +#else + double X; // 0x0000(0x0008)(Edit, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + double Y; // 0x0008(0x0008)(Edit, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + double Z; // 0x0010(0x0008)(Edit, ZeroConstructor, SaveGame, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + double W; +#endif struct FRotator Rotator() const; }; \ No newline at end of file diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index 7e06497..b79ea3d 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -319,6 +319,9 @@ void Addresses::FindAll() LOG_INFO(LogDev, "Finding StartAircraftPhase"); Addresses::StartAircraftPhase = FindStartAircraftPhase(); + LOG_INFO(LogDev, "Finding GIsClient"); + Addresses::GIsClient = FindGIsClient(); + // LOG_INFO(LogDev, "Finding GetSessionInterface"); // Addresses::GetSessionInterface = FindGetSessionInterface(); @@ -644,6 +647,11 @@ std::vector Addresses::GetFunctionsToNull() 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 } + if (Fortnite_Version >= 17) + { + toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 10 48 89 6C 24 20 56 57 41 54 41 56 41 57 48 81 EC ? ? ? ? 65 48 8B 04 25 ? ? ? ? 4C 8B F9").Get()); // Crash after 5 mins + } + if (Engine_Version == 500) { // toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 68 A1 48 81 EC ? ? ? ? 45 33 F6 0F 29 70 A8 44 38 35").Get()); // zone @@ -652,6 +660,21 @@ std::vector Addresses::GetFunctionsToNull() toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 55 41 55 41 56 48 8B EC 48 83 EC 50 83 65 28 00 40 B6 05 40 38 35 ? ? ? ? 4C").Get()); // InitializeUI } + if (Fortnite_Version >= 20) + { + if (Addresses::GIsClient) + { + // all from 20.40 + // 99% of these are renderer crashes + // toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8B EC 48 83 EC 50 83 65 28 00 40 B6 05 40 38 35").Get()); // InitializeUI + toNull.push_back(Memcury::Scanner::FindPattern("48 8B C4 48 89 58 08 4C 89 40 18 48 89 50 10 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 98 48 81 EC ? ? ? ? 49 8B 48 20 45 33").Get()); // Calls func below + toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B 41 20 48 8B FA 48 8B D9 BA ? ? ? ? 83 78 08 03 0F 8D").Get()); // some constructor crash + toNull.push_back(Memcury::Scanner::FindPattern("4C 89 44 24 ? 53 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 68 48 8D 05 ? ? ? ? 0F").Get()); // soem constructor crash (gets called by ^) + toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 30 48 8B F9 48 8B CA E8").Get()); + toNull.push_back(Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 55 41 56 48 83 EC 60 45 33 F6 4C 8D 2D ? ? ? ? 48 8B DA 48 8B E9 48 85").Get()); + } + } + toNull.push_back(Addresses::ChangeGameSessionId); return toNull; diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 37e1a51..54ab074 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -684,11 +684,15 @@ void ChangeLevels() LOG_INFO(LogDev, "Using {}.", bUseSwitchLevel ? Level.ToString() : LevelB.ToString()); + auto LocalPC = GetLocalPlayerController(); + + LOG_INFO(LogDev, "Got PC: {}", __int64(LocalPC)); + if (bUseSwitchLevel) { static auto SwitchLevel = FindObject(L"/Script/Engine.PlayerController.SwitchLevel"); - GetLocalPlayerController()->ProcessEvent(SwitchLevel, &Level); + LocalPC->ProcessEvent(SwitchLevel, &Level); if (FindGIsServer()) { @@ -728,7 +732,7 @@ void ChangeLevels() } else if (bUseRemovePlayer) { - UGameplayStatics::RemovePlayer((APlayerController*)GetLocalPlayerController(), true); + UGameplayStatics::RemovePlayer((APlayerController*)LocalPC, true); } } @@ -755,6 +759,46 @@ void ChangeLevels() } } +void ApplyNullAndRetTrues() +{ + static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); + + auto AddressesToNull = Addresses::GetFunctionsToNull(); + const auto AddressesToReturnTrue = Addresses::GetFunctionsToReturnTrue(); + + auto ServerCheatAllIndex = GetFunctionIdxOrPtr(FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCheatAll")); + + if (ServerCheatAllIndex) + AddressesToNull.push_back(__int64(FortPlayerControllerAthenaDefault->VFTable[ServerCheatAllIndex / 8])); + + for (auto func : AddressesToNull) + { + if (func == 0) + continue; + + LOG_INFO(LogDev, "Nulling 0x{:x}", func - __int64(GetModuleHandleW(0))); + + DWORD dwProtection; + VirtualProtect((PVOID)func, 1, PAGE_EXECUTE_READWRITE, &dwProtection); + + *(uint8_t*)func = 0xC3; + + DWORD dwTemp; + VirtualProtect((PVOID)func, 1, dwProtection, &dwTemp); + } + + for (auto func : AddressesToReturnTrue) + { + if (func == 0) + continue; + + LOG_INFO(LogDev, "Forcing return true on 0x{:x}", func - __int64(GetModuleHandleW(0))); + + MH_CreateHook((PVOID)func, ReturnTrueHook, nullptr); + MH_EnableHook((PVOID)func); + } +} + DWORD WINAPI Main(LPVOID) { InitLogger(); @@ -821,7 +865,6 @@ DWORD WINAPI Main(LPVOID) static auto GameModeDefault = 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 FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_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"); @@ -829,6 +872,9 @@ DWORD WINAPI Main(LPVOID) static auto AthenaMarkerComponentDefault = FindObject(L"/Script/FortniteGame.Default__AthenaMarkerComponent"); static auto FortWeaponDefault = FindObject(L"/Script/FortniteGame.Default__FortWeapon"); static auto FortOctopusVehicleDefault = FindObject(L"/Script/FortniteGame.Default__FortOctopusVehicle"); + static auto FortPlayerControllerAthenaDefault = FindObject(L"/Script/FortniteGame.Default__FortPlayerControllerAthena"); // FindObject(L"/Game/Athena/Athena_PlayerController.Default__Athena_PlayerController_C"); + + ApplyNullAndRetTrues(); // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNetPackageMap VeryVerbose", nullptr); // UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), L"log LogNetTraffic VeryVerbose", nullptr); @@ -870,7 +916,9 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook((PVOID)Addresses::ActorGetNetMode, (PVOID)GetNetModeHook2, nullptr); - if (Fortnite_Version > 13) // ermm + if (Fortnite_Version > 13 && // ermm + Fortnite_Version < 20 + ) { Hooking::MinHook::Hook(FindObject(L"/Script/FortniteGame.Default__BuildingFoundation"), FindObject(L"/Script/FortniteGame.BuildingFoundation.SetDynamicFoundationTransform"), @@ -961,15 +1009,6 @@ DWORD WINAPI Main(LPVOID) } } - if (Fortnite_Version >= 17.00) // Fixes random crash that happens a couple minutes after server starts for s17+ - { - uintptr_t ServerCrashFix = Memcury::Scanner::FindPattern("48 89 5C 24 10 48 89 6C 24 20 56 57 41 54 41 56 41 57 48 81 EC ? ? ? ? 65 48 8B 04 25 ? ? ? ? 4C 8B F9").Get(); - - LOG_INFO(LogDev, "ServerCrashFix: 0x{:x}", ServerCrashFix); - - Hooking::MinHook::Hook((PVOID)ServerCrashFix, (PVOID)ReturnFalseHook, nullptr); - } - /* if (Fortnite_Version == 6.21) @@ -985,41 +1024,6 @@ DWORD WINAPI Main(LPVOID) LOG_INFO(LogDev, "Switch levels."); - auto AddressesToNull = Addresses::GetFunctionsToNull(); - const auto AddressesToReturnTrue = Addresses::GetFunctionsToReturnTrue(); - - auto ServerCheatAllIndex = GetFunctionIdxOrPtr(FindObject(L"/Script/FortniteGame.FortPlayerController.ServerCheatAll")); - - if (ServerCheatAllIndex) - AddressesToNull.push_back(__int64(FortPlayerControllerAthenaDefault->VFTable[ServerCheatAllIndex / 8])); - - for (auto func : AddressesToNull) - { - if (func == 0) - continue; - - LOG_INFO(LogDev, "Nulling 0x{:x}", func - __int64(GetModuleHandleW(0))); - - DWORD dwProtection; - VirtualProtect((PVOID)func, 1, PAGE_EXECUTE_READWRITE, &dwProtection); - - *(uint8_t*)func = 0xC3; - - DWORD dwTemp; - VirtualProtect((PVOID)func, 1, dwProtection, &dwTemp); - } - - for (auto func : AddressesToReturnTrue) - { - if (func == 0) - continue; - - LOG_INFO(LogDev, "Forcing return true on 0x{:x}", func - __int64(GetModuleHandleW(0))); - - MH_CreateHook((PVOID)func, ReturnTrueHook, nullptr); - MH_EnableHook((PVOID)func); - } - if (Fortnite_Version != 22.4) { auto matchmaking = Memcury::Scanner::FindPattern("83 BD ? ? ? ? 01 7F 18 49 8D 4D D8 48 8B D6 E8 ? ? ? ? 48", false).Get(); @@ -1325,8 +1329,12 @@ DWORD WINAPI Main(LPVOID) AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook, (PVOID*)&AFortPawn::NetMulticast_Athena_BatchedDamageCuesOriginal, false, true); Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPawn.MovingEmoteStopped"), AFortPawn::MovingEmoteStoppedHook, (PVOID*)&AFortPawn::MovingEmoteStoppedOriginal, false, true); - Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") ? FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") : FindObject(L"/Script/FortniteGame.FortPlayerPawn.OnCapsuleBeginOverlap"), - AFortPlayerPawnAthena::OnCapsuleBeginOverlapHook, (PVOID*)&AFortPlayerPawnAthena::OnCapsuleBeginOverlapOriginal, false, true); + if (Fortnite_Version < 20) // todo + { + Hooking::MinHook::Hook(FortPlayerPawnAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") ? FindObject(L"/Script/FortniteGame.FortPlayerPawnAthena.OnCapsuleBeginOverlap") : FindObject(L"/Script/FortniteGame.FortPlayerPawn.OnCapsuleBeginOverlap"), + AFortPlayerPawnAthena::OnCapsuleBeginOverlapHook, (PVOID*)&AFortPlayerPawnAthena::OnCapsuleBeginOverlapOriginal, false, true); + } + Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_RemoveFortItemFromPlayer"), UFortKismetLibrary::K2_RemoveFortItemFromPlayerHook, (PVOID*)&UFortKismetLibrary::K2_RemoveFortItemFromPlayerOriginal, false, true); diff --git a/Project Reboot 3.0/events.h b/Project Reboot 3.0/events.h index 89d84e4..5dea094 100644 --- a/Project Reboot 3.0/events.h +++ b/Project Reboot 3.0/events.h @@ -641,7 +641,7 @@ static inline void LoadEvent(bool* bWereAllSuccessful = nullptr) // did i forget if (Fortnite_Version == 7.20) { static auto LoadMooneyMapOffset = Loader->GetOffset("LoadMooneyMap"); - static auto OnRep_LoadMooneyMapFn = FindObject("/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyLoader.BP_MooneyLoader_C.OnRep_LoadMooneyMap"); + static auto OnRep_LoadMooneyMapFn = FindObject(L"/Game/Athena/Prototype/Blueprints/Mooney/BP_MooneyLoader.BP_MooneyLoader_C.OnRep_LoadMooneyMap"); if (LoadMooneyMapOffset == -1 || !OnRep_LoadMooneyMapFn) { @@ -798,14 +798,14 @@ static inline void StartEvent() if (Fortnite_Version >= 17.30) { - static auto OnRep_RootStartTimeFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.OnRep_RootStartTime"); - static auto MeshRootStartEventFn = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.MeshRootStartEvent"); - auto SpecialEventScriptMeshActorClass = FindObject("/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor"); + static auto OnRep_RootStartTimeFn = FindObject(L"/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.OnRep_RootStartTime"); + static auto MeshRootStartEventFn = FindObject(L"/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor.MeshRootStartEvent"); + auto SpecialEventScriptMeshActorClass = FindObject(L"/Script/SpecialEventGameplayRuntime.SpecialEventScriptMeshActor"); auto AllSpecialEventScriptMeshActors = UGameplayStatics::GetAllActorsOfClass(GetWorld(), SpecialEventScriptMeshActorClass); if (Fortnite_Version == 17.50) { - auto Scripting = FindObject("/Kiwi/Levels/Kiwi_P.Kiwi_P:PersistentLevel.BP_Kiwi_Master_Scripting_2"); + auto Scripting = FindObject(L"/Kiwi/Levels/Kiwi_P.Kiwi_P:PersistentLevel.BP_Kiwi_Master_Scripting_2"); float SecondsSinceEventBegan = 0; @@ -821,7 +821,7 @@ static inline void StartEvent() { OnReadyParams.PlaylistContextTags = FGameplayTagContainer(); } - auto BB = FindObject("/Kiwi/Gameplay/BP_Kiwi_Master_Scripting.BP_Kiwi_Master_Scripting_C.OnReady_F1A32853487CB7603278E6847A5F2625"); + auto BB = FindObject(L"/Kiwi/Gameplay/BP_Kiwi_Master_Scripting.BP_Kiwi_Master_Scripting_C.OnReady_F1A32853487CB7603278E6847A5F2625"); Scripting->ProcessEvent(BB, &OnReadyParams); auto eventscript = FindObject("/Kiwi/Levels/Kiwi_P.Kiwi_P:PersistentLevel.Kiwi_EventScript_2"); diff --git a/Project Reboot 3.0/finder.cpp b/Project Reboot 3.0/finder.cpp index ae41c3b..3b83a9e 100644 --- a/Project Reboot 3.0/finder.cpp +++ b/Project Reboot 3.0/finder.cpp @@ -51,7 +51,7 @@ uint64 FindGIsClient() auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering"); std::vector> BytesArray = { - // {0x88, 0x05}, // Idk what version this is + {0x88, 0x05}, // 20.40 {0xC6, 0x05}, // mov cs X // Checked on 1.11, 12.41 {0x88, 0x1D}, // mov cs bl // Checked on 17.50, 19.10 // {0x44, 0x88} // IDK WHAT VERSION This for but it scuffs older builds diff --git a/Project Reboot 3.0/gui.h b/Project Reboot 3.0/gui.h index e191ae9..ecf6442 100644 --- a/Project Reboot 3.0/gui.h +++ b/Project Reboot 3.0/gui.h @@ -1456,7 +1456,7 @@ static inline DWORD WINAPI GuiThread(LPVOID) { WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"RebootClass", NULL }; ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindowExW(0L, wc.lpszClassName, L"Project Reboot", (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX), 100, 100, Width, Height, NULL, NULL, wc.hInstance, NULL); + HWND hwnd = ::CreateWindowExW(0L, wc.lpszClassName, (L"Project Reboot " + std::to_wstring(Fortnite_Version)).c_str(), (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX), 100, 100, Width, Height, NULL, NULL, wc.hInstance, NULL); if (false) // idk why this dont work {