Merge pull request #186 from Heliato/master

Add Respawn 14 >
This commit is contained in:
Gray
2025-03-15 21:21:14 -04:00
committed by GitHub
6 changed files with 85 additions and 0 deletions

View File

@@ -94,6 +94,14 @@ void AFortPawn::SetShield(float NewShield)
this->ProcessEvent(SetShieldFn, &NewShield);
}
void AFortPawn::SetMaxShield(float NewShieldVal)
{
static auto SetMaxShieldFn = FindObject<UFunction>("/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;

View File

@@ -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);

View File

@@ -646,4 +646,60 @@ void AFortPlayerControllerAthena::UpdateTrackedAttributesHook(AFortPlayerControl
if (ItemInstancesToRemove.size() > 0)
WorldInventory->Update();
}
void AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena)
{
AFortPlayerStateAthena* PlayerStateAthena = Cast<AFortPlayerStateAthena>(PlayerControllerAthena->GetPlayerState());
AFortGameModeAthena* GameModeAthena = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode());
if (!PlayerStateAthena || !GameModeAthena)
return;
AFortGameStateAthena* GameStateAthena = Cast<AFortGameStateAthena>(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<UFunction>(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<AFortPlayerPawn>(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");
}

View File

@@ -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()
{

View File

@@ -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

View File

@@ -1285,6 +1285,13 @@ DWORD WINAPI Main(LPVOID)
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerReadyToStartMatch"),
AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false);
if (Fortnite_Version >= 14)
{
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerClientIsReadyToRespawn"),
AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook, nullptr, false);
}
auto ServerRequestSeatChangeFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange");
if (ServerRequestSeatChangeFn)