Files
DedicatedServerCourse/Source/FPSTemplate/Private/Game/ShooterGameModeBase.cpp
2026-02-24 22:39:26 -05:00

58 lines
1.7 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "Game/ShooterGameModeBase.h"
#include "GameFramework/Character.h"
#include "GameFramework/PlayerStart.h"
#include "Kismet/GameplayStatics.h"
AShooterGameModeBase::AShooterGameModeBase()
{
RespawnTime = 2.f;
}
void AShooterGameModeBase::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AShooterGameModeBase::StartPlayerElimination(float ElimTime, ACharacter* ElimmedCharacter,
APlayerController* VictimController, APlayerController* AttackerController)
{
FTimerDelegate ElimTimerDelegate;
FTimerHandle TimerHandle;
Timers.Add(VictimController, TimerHandle);
ElimTimerDelegate.BindLambda([this, ElimmedCharacter, VictimController, AttackerController]()
{
PlayerEliminated(ElimmedCharacter, VictimController, AttackerController);
GetWorldTimerManager().ClearTimer(Timers[VictimController]);
Timers.Remove(VictimController);
});
GetWorldTimerManager().SetTimer(TimerHandle, ElimTimerDelegate, ElimTime + RespawnTime, false);
}
void AShooterGameModeBase::PlayerEliminated(ACharacter* ElimmedCharacter, APlayerController* VictimController,
APlayerController* AttackerController)
{
RequestRespawn(ElimmedCharacter, VictimController);
}
void AShooterGameModeBase::RequestRespawn(ACharacter* ElimmedCharacter, AController* ElimmedController)
{
if (ElimmedCharacter)
{
ElimmedCharacter->Reset();
ElimmedCharacter->Destroy();
}
if (ElimmedController)
{
TArray<AActor*> PlayerStarts;
UGameplayStatics::GetAllActorsOfClass(this, APlayerStart::StaticClass(), PlayerStarts);
int32 Selection = FMath::RandRange(0, PlayerStarts.Num() - 1);
RestartPlayerAtPlayerStart(ElimmedController, PlayerStarts[Selection]);
}
}