diff --git a/Project Reboot 3.0/FortPawn.cpp b/Project Reboot 3.0/FortPawn.cpp index f8aabe1..f1691e1 100644 --- a/Project Reboot 3.0/FortPawn.cpp +++ b/Project Reboot 3.0/FortPawn.cpp @@ -94,6 +94,14 @@ void AFortPawn::SetShield(float NewShield) this->ProcessEvent(SetShieldFn, &NewShield); } +void AFortPawn::SetMaxShield(float NewShieldVal) +{ + static auto SetMaxShieldFn = FindObject("/Script/FortniteGame.FortPawn.SetMaxShield"); + + if (SetMaxShieldFn) + this->ProcessEvent(SetMaxShieldFn, &NewShieldVal); +} + void AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret) { auto Pawn = (AFortPawn*)Context; diff --git a/Project Reboot 3.0/FortPawn.h b/Project Reboot 3.0/FortPawn.h index 0089f36..25c6ea7 100644 --- a/Project Reboot 3.0/FortPawn.h +++ b/Project Reboot 3.0/FortPawn.h @@ -49,6 +49,7 @@ public: void SetHealth(float NewHealth); void SetMaxHealth(float NewHealthVal); void SetShield(float NewShield); + void SetMaxShield(float NewShieldVal); static void NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret); static void MovingEmoteStoppedHook(UObject* Context, FFrame* Stack, void* Ret); diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.cpp b/Project Reboot 3.0/FortPlayerControllerAthena.cpp index 389e85c..81a2f37 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.cpp +++ b/Project Reboot 3.0/FortPlayerControllerAthena.cpp @@ -646,4 +646,60 @@ void AFortPlayerControllerAthena::UpdateTrackedAttributesHook(AFortPlayerControl if (ItemInstancesToRemove.size() > 0) WorldInventory->Update(); +} + +void AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena) +{ + AFortPlayerStateAthena* PlayerStateAthena = Cast(PlayerControllerAthena->GetPlayerState()); + AFortGameModeAthena* GameModeAthena = Cast(GetWorld()->GetGameMode()); + + if (!PlayerStateAthena || !GameModeAthena) + return; + + AFortGameStateAthena* GameStateAthena = Cast(GameModeAthena->GetGameState()); + if (!GameStateAthena) return; + + if (GameStateAthena->IsRespawningAllowed(PlayerStateAthena)) + { + FFortRespawnData* RespawnData = PlayerStateAthena->GetRespawnData(); + + if (RespawnData->IsServerReady() && RespawnData->IsRespawnDataAvailable()) + { + const FVector& RespawnLocation = RespawnData->GetRespawnLocation(); + const FRotator& RespawnRotation = RespawnData->GetRespawnRotation(); + + // RestartPlayer doesn't work, idk why + static auto SpawnDefaultPawnAtTransformFn = FindObject(L"/Script/Engine.GameModeBase.SpawnDefaultPawnAtTransform"); + + FTransform SpawnTransform{}; + SpawnTransform.Translation = RespawnLocation; + SpawnTransform.Rotation = RespawnRotation.Quaternion(); + SpawnTransform.Scale3D = FVector(1, 1, 1); + + struct { AController* NewPlayer; FTransform SpawnTransform; APawn* ReturnValue; } + AGameModeBase_SpawnDefaultPawnAtTransform_Params{ PlayerControllerAthena, SpawnTransform }; + + GameModeAthena->ProcessEvent(SpawnDefaultPawnAtTransformFn, &AGameModeBase_SpawnDefaultPawnAtTransform_Params); + + AFortPlayerPawn* PlayerPawn = Cast(AGameModeBase_SpawnDefaultPawnAtTransform_Params.ReturnValue); + + if (!PlayerPawn) + return; + + PlayerPawn->SetOwner(PlayerControllerAthena); + + PlayerControllerAthena->Possess(PlayerPawn); + + PlayerPawn->SetMaxHealth(100); + PlayerPawn->SetHealth(100); + PlayerPawn->SetMaxShield(100); + PlayerPawn->SetShield(100); + + PlayerControllerAthena->RespawnPlayerAfterDeath(true); + + RespawnData->IsClientReady() = true; + } + } + + printf_s(__FUNCTION__"\n"); } \ No newline at end of file diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.h b/Project Reboot 3.0/FortPlayerControllerAthena.h index 1731069..44a7807 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.h +++ b/Project Reboot 3.0/FortPlayerControllerAthena.h @@ -264,6 +264,7 @@ public: static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation); static void ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController); static void UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController); + static void ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena); // 1:1 static UClass* StaticClass() { diff --git a/Project Reboot 3.0/FortPlayerStateAthena.h b/Project Reboot 3.0/FortPlayerStateAthena.h index 60867d9..e3fff72 100644 --- a/Project Reboot 3.0/FortPlayerStateAthena.h +++ b/Project Reboot 3.0/FortPlayerStateAthena.h @@ -30,6 +30,18 @@ struct FFortRespawnData static auto bServerIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bServerIsReady"); return *(bool*)(__int64(this) + bServerIsReadyOffset); } + + FVector& GetRespawnLocation() + { + static auto RespawnLocationOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "RespawnLocation"); + return *(FVector*)(__int64(this) + RespawnLocationOffset); + } + + FRotator& GetRespawnRotation() + { + static auto RespawnRotationOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "RespawnRotation"); + return *(FRotator*)(__int64(this) + RespawnRotationOffset); + } }; struct FDeathInfo diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 82f2f26..03f51e2 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -1285,6 +1285,13 @@ DWORD WINAPI Main(LPVOID) Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.ServerReadyToStartMatch"), AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false); + if (Fortnite_Version >= 14) + { + Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerClientIsReadyToRespawn"), + AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook, nullptr, false); + } + + auto ServerRequestSeatChangeFn = FindObject(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange"); if (ServerRequestSeatChangeFn)