From 215d7b81d08eba3b38616a77dbd58ee50211b5b0 Mon Sep 17 00:00:00 2001 From: Gray <84999745+Milxnor@users.noreply.github.com> Date: Thu, 14 Mar 2024 17:20:14 -0400 Subject: [PATCH] Try editing again, fix 1.7.2 zone --- Project Reboot 3.0/FortGameModeAthena.cpp | 17 +++++++---- Project Reboot 3.0/FortPlayerController.cpp | 15 ++++++---- Project Reboot 3.0/GameModeBase.cpp | 16 ++++++++++ Project Reboot 3.0/GameModeBase.h | 4 +++ Project Reboot 3.0/World.h | 33 +++++++++++++++++++-- Project Reboot 3.0/die.h | 3 +- Project Reboot 3.0/dllmain.cpp | 4 +++ Project Reboot 3.0/events.h | 2 +- Project Reboot 3.0/finder.h | 4 +-- 9 files changed, 81 insertions(+), 17 deletions(-) diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index 527d2cf..08ad073 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -416,6 +416,12 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game // SpawnIsland->RepData->Soemthing = FoundationSetup->LobbyLocation; } + if (Fortnite_Version == 14.60 && Globals::bGoingToPlayEvent) + { + // Auto with SetDynamicFoundationEnabled + // ShowFoundation(FindObject(L"/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation3")); // Aircraft Carrier + } + if (Fortnite_Version == 12.41) { ShowFoundation(FindObject("/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.LF_Athena_POI_19x19_2")); @@ -542,11 +548,6 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game } } - if (Fortnite_Version == 14.60 && Globals::bGoingToPlayEvent) - { - ShowFoundation(FindObject(L"/Game/Athena/Apollo/Maps/Apollo_POI_Foundations.Apollo_POI_Foundations.PersistentLevel.Lobby_Foundation3")); // Aircraft Carrier - } - AActor* TheBlock = nullptr; if (Fortnite_Version > 10) // todo only checked on 10.40 @@ -888,6 +889,10 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game WorldNamesToStreamAllFoundationsIn.push_back("/Temp/Game/Athena/Maps/POI/Athena_POI_CommunityPark_003_M_5c711338"); } + static auto PawnClass = FindObject(L"/Game/Athena/PlayerPawn_Athena.PlayerPawn_Athena_C"); + static auto DefaultPawnClassOffset = GameMode->GetOffset("DefaultPawnClass"); + GameMode->Get(DefaultPawnClassOffset) = PawnClass; // I think it would be better if we didn't talk about this. + if (WorldNamesToStreamAllFoundationsIn.size() > 0) { auto ObjectNum = ChunkedObjects ? ChunkedObjects->Num() : UnchunkedObjects ? UnchunkedObjects->Num() : 0; @@ -1095,7 +1100,7 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint } } - LOG_INFO(LogTeams, "Spreading Teams {} [{}] Player is going on team {} with {} members.", bShouldSpreadTeams, TeamsNum, NextTeamIndex, CurrentTeamMembers); + LOG_INFO(LogTeams, "Spreading Teams {} Player is going on team {}/{} with {} members.", bShouldSpreadTeams, NextTeamIndex, TeamsNum, CurrentTeamMembers); CurrentTeamMembers++; diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index 2b133c0..63a0c3d 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -834,8 +834,8 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra { auto PlayerController = (AFortPlayerController*)Context; - if (!PlayerController) // ?? - return ServerCreateBuildingActorOriginal(Context, Stack, Ret); + // if (!PlayerController) // ?? + // return ServerCreateBuildingActorOriginal(Context, Stack, Ret); auto WorldInventory = PlayerController->GetWorldInventory(); @@ -862,7 +862,7 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra bMirrored = CreateBuildingData->bMirrored; static auto BroadcastRemoteClientInfoOffset = PlayerController->GetOffset("BroadcastRemoteClientInfo"); - auto BroadcastRemoteClientInfo = PlayerController->Get(BroadcastRemoteClientInfoOffset); + UObject* BroadcastRemoteClientInfo = PlayerController->Get(BroadcastRemoteClientInfoOffset); static auto RemoteBuildableClassOffset = BroadcastRemoteClientInfo->GetOffset("RemoteBuildableClass"); BuildingClass = BroadcastRemoteClientInfo->Get(RemoteBuildableClassOffset); @@ -885,7 +885,7 @@ void AFortPlayerController::ServerCreateBuildingActorHook(UObject* Context, FFra if (!BuildingClass) return ServerCreateBuildingActorOriginal(Context, Stack, Ret); - auto GameState = Cast(((AFortGameMode*)GetWorld()->GetGameMode())->GetGameState()); + auto GameState = Cast(Cast(GetWorld()->GetGameMode(), false)->GetGameState(), false); auto StructuralSupportSystem = GameState->GetStructuralSupportSystem(); @@ -1766,13 +1766,18 @@ void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerControl AFortWeap_EditingTool* EditTool = nullptr; -#if 0 +#if 1 auto EditToolInstance = WorldInventory->FindItemInstance(EditToolDef); if (!EditToolInstance) return; +#if 1 EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid())); // ERM +#else + Cast(Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid())); // ERM + EditTool = Cast(Pawn->GetCurrentWeapon()); +#endif #else EditTool = Cast(Pawn->GetCurrentWeapon()); #endif diff --git a/Project Reboot 3.0/GameModeBase.cpp b/Project Reboot 3.0/GameModeBase.cpp index 19a1217..7f462c8 100644 --- a/Project Reboot 3.0/GameModeBase.cpp +++ b/Project Reboot 3.0/GameModeBase.cpp @@ -86,6 +86,22 @@ AActor* AGameModeBase::K2_FindPlayerStart(AController* Player, FString IncomingN return AGameModeBase_K2_FindPlayerStart_Params.ReturnValue; } +bool AGameModeBase::PlayerCanRestartHook(UObject* Context, FFrame& Stack, bool* Ret) +{ + auto ret = PlayerCanRestartOriginal(Context, Stack, Ret); + + LOG_INFO(LogDev, "PlayerCanRestartHook ret: {}", ret); + + if (Globals::bGoingToPlayEvent && Fortnite_Version == 14.60) + { + // 1:1 + ret = true; + *Ret = true; + } + + return ret; +} + APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AController* NewPlayer, AActor* StartSpot) { LOG_INFO(LogDev, "SpawnDefaultPawnForHook!"); diff --git a/Project Reboot 3.0/GameModeBase.h b/Project Reboot 3.0/GameModeBase.h index 86ebe3d..c1a646a 100644 --- a/Project Reboot 3.0/GameModeBase.h +++ b/Project Reboot 3.0/GameModeBase.h @@ -5,10 +5,13 @@ #include "Controller.h" #include "Pawn.h" #include "UnrealString.h" +#include "Stack.h" class AGameModeBase : public AActor // AInfo { public: + static inline bool (*PlayerCanRestartOriginal)(UObject* Context, FFrame& Stack, bool* Ret); + UClass* GetDefaultPawnClassForController(AController* InController); void ChangeName(AController* Controller, const FString& NewName, bool bNameChange); AActor* K2_FindPlayerStart(AController* Player, FString IncomingName); @@ -16,5 +19,6 @@ public: void RestartPlayerAtPlayerStart(AController* NewPlayer, AActor* StartSpot); void RestartPlayer(AController* NewPlayer); + static bool PlayerCanRestartHook(UObject* Context, FFrame& Stack, bool* Ret); static APawn* SpawnDefaultPawnForHook(AGameModeBase* GameMode, AController* NewPlayer, AActor* StartSpot); }; \ No newline at end of file diff --git a/Project Reboot 3.0/World.h b/Project Reboot 3.0/World.h index e101801..44ca210 100644 --- a/Project Reboot 3.0/World.h +++ b/Project Reboot 3.0/World.h @@ -65,10 +65,13 @@ struct FActorSpawnParametersUE500 TFunction CustomPreSpawnInitalization; // my favorite }; +// #define USE_VIRTUALALLOC_SPAWNPARAMS + static inline void* CreateSpawnParameters(ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::Undefined, bool bDeferConstruction = false, UObject* Owner = nullptr) { if (Engine_Version >= 500) { +#ifdef USE_VIRTUALALLOC_SPAWNPARAMS auto addr = (FActorSpawnParametersUE500*)VirtualAlloc(0, sizeof(FActorSpawnParametersUE500), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (!addr) @@ -78,9 +81,18 @@ static inline void* CreateSpawnParameters(ESpawnActorCollisionHandlingMethod Spa addr->bDeferConstruction = bDeferConstruction; addr->SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; return addr; +#else + FActorSpawnParametersUE500 addr{}; + + addr.Owner = Owner; + addr.bDeferConstruction = bDeferConstruction; + addr.SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; + return &addr; +#endif } else { +#ifdef USE_VIRTUALALLOC_SPAWNPARAMS auto addr = (FActorSpawnParameters*)VirtualAlloc(0, sizeof(FActorSpawnParameters), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (!addr) @@ -90,6 +102,14 @@ static inline void* CreateSpawnParameters(ESpawnActorCollisionHandlingMethod Spa addr->bDeferConstruction = bDeferConstruction; addr->SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; return addr; +#else + FActorSpawnParameters addr{}; + + addr.Owner = Owner; + addr.bDeferConstruction = bDeferConstruction; + addr.SpawnCollisionHandlingOverride = SpawnCollisionHandlingOverride; + return &addr; +#endif } return nullptr; @@ -134,12 +154,21 @@ public: template ActorType* SpawnActor(UClass* Class, FTransform UserTransformPtr = FTransform(), void* SpawnParameters = nullptr) { - if (!SpawnParameters) + const bool bCreatedSpawnParameters = !SpawnParameters; + + if (bCreatedSpawnParameters) + { SpawnParameters = CreateSpawnParameters(); + } auto actor = (ActorType*)SpawnActorOriginal(this, Class, &UserTransformPtr, SpawnParameters); - VirtualFree(SpawnParameters, 0, MEM_RELEASE); + // if (bCreatedSpawnParameters) + { +#ifdef USE_VIRTUALALLOC_SPAWNPARAMS + VirtualFree(SpawnParameters, 0, MEM_RELEASE); +#endif + } return actor; } diff --git a/Project Reboot 3.0/die.h b/Project Reboot 3.0/die.h index 755af24..277be65 100644 --- a/Project Reboot 3.0/die.h +++ b/Project Reboot 3.0/die.h @@ -156,7 +156,8 @@ static inline void ProcessEventHook(UObject* Object, UFunction* Function, void* !strstr(FunctionName.c_str(), "ServerTriggerCombatEvent") && !strstr(FunctionName.c_str(), "SpinCubeTimeline__UpdateFunc") && !strstr(ObjectName.c_str(), "FortPhysicsObjectComponent") && - !strstr(FunctionName.c_str(), "GetTextValue")) + !strstr(FunctionName.c_str(), "GetTextValue") && + !strstr(FunctionName.c_str(), "ExecuteUbergraph_BGA_Petrol_Pickup")) { 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 c29b576..71c0ad7 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -978,6 +978,8 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameModeBase.SpawnDefaultPawnFor"), AGameModeBase::SpawnDefaultPawnForHook, nullptr, false); + // Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameModeBase.PlayerCanRestart"), + // AGameModeBase::PlayerCanRestartHook, (PVOID*)&AGameModeBase::PlayerCanRestartOriginal, false, true); Hooking::MinHook::Hook(GameModeDefault, FindObject(L"/Script/Engine.GameModeBase.HandleStartingNewPlayer"), AFortGameModeAthena::Athena_HandleStartingNewPlayerHook, (PVOID*)&AFortGameModeAthena::Athena_HandleStartingNewPlayerOriginal, false); @@ -1405,9 +1407,11 @@ DWORD WINAPI Main(LPVOID) LOG_INFO(LogDev, "ClientOnPawnDiedCallAddr: 0x{:x}", ClientOnPawnDiedCallAddr - __int64(GetModuleHandleW(0))); Hooking::MinHook::Hook((PVOID)ClientOnPawnDiedCallAddr, AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal); +#if 0 auto OnSafeZoneStateChangeAddr = FindFunctionCall(L"OnSafeZoneStateChange", Engine_Version == 416 ? std::vector{ 0x48, 0x89, 0x54 } : std::vector{ 0x48, 0x89, 0x5C }); LOG_INFO(LogDev, "OnSafeZoneStateChangeAddr: 0x{:x}", OnSafeZoneStateChangeAddr - __int64(GetModuleHandleW(0))); Hooking::MinHook::Hook((PVOID)OnSafeZoneStateChangeAddr, AFortSafeZoneIndicator::OnSafeZoneStateChangeHook, (PVOID*)&AFortSafeZoneIndicator::OnSafeZoneStateChangeOriginal); +#endif LOG_INFO(LogDev, "PredictionKeySize: 0x{:x} {}", PredictionKeySize, PredictionKeySize); diff --git a/Project Reboot 3.0/events.h b/Project Reboot 3.0/events.h index 143c663..2e68b0b 100644 --- a/Project Reboot 3.0/events.h +++ b/Project Reboot 3.0/events.h @@ -297,7 +297,7 @@ static inline std::vector Events = }, "/Junior/Blueprints/BP_Junior_Scripting.BP_Junior_Scripting_C", - "/Game/Athena/Playlists/Music/Playlist_Junior_32.Playlist_Junior_32", + "/Game/Athena/Playlists/Music/Playlist_Junior_32.Playlist_Junior_32", // ? 14.60 ), Event( diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index a9d8465..1e411f2 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -532,7 +532,7 @@ static inline uint64 FindStepExplicitProperty() static inline uint64 FindIsNetRelevantForOffset() { - if (Engine_Version == 416) // checked on 1.7.2 & 1.8 + if (Engine_Version == 416 || Fortnite_Version == 3.3) // checked on 1.7.2 & 1.8 & 3.3 return 0x420 / 8; if (Fortnite_Version == 1.11 || (Fortnite_Version >= 2.42 && Fortnite_Version <= 3.2)) // checked 1.11, 2.4.2, 2.5, 3.0, 3.1 return 0x418 / 8; @@ -1476,7 +1476,7 @@ static inline uint64 FindDispatchRequest() static inline uint64 FindMcpIsDedicatedServerOffset() { - if (Engine_Version == 421 || Engine_Version == 422) // checked on 5.41 & 6.21 & 7.30 + if (Fortnite_Version >= 4.5 && Engine_Version <= 422) // checked on 4.5 & 5.41 & 6.21 & 7.30 return 0x28; return 0x60; // 1.7.2 & 1.11 3.3 & & 4.1