100 - Respawning

This commit is contained in:
Kingsmedia 2022-05-07 20:34:40 +02:00 committed by Bert
parent 659a9b30de
commit 767925f882
7 changed files with 46 additions and 4 deletions

Binary file not shown.

View File

@ -21,6 +21,7 @@ ABlasterCharacter::ABlasterCharacter()
{ {
PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.bCanEverTick = true;
SpawnCollisionHandlingMethod = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom")); CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(GetMesh()); CameraBoom->SetupAttachment(GetMesh());
CameraBoom->TargetArmLength = 350.f; CameraBoom->TargetArmLength = 350.f;
@ -105,17 +106,31 @@ void ABlasterCharacter::PlayEliminatedMontage()
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
if (AnimInstance && EliminatedMontage) if (AnimInstance && EliminatedMontage)
{ {
UE_LOG(LogTemp, Warning, TEXT("Playing Eliminated Montage, %s"), (bEliminated ? "true" : "false"));
AnimInstance->Montage_Play(EliminatedMontage); AnimInstance->Montage_Play(EliminatedMontage);
} }
} }
void ABlasterCharacter::Eliminated_Implementation() void ABlasterCharacter::Eliminated()
{
MulticastEliminated();
GetWorldTimerManager().SetTimer(EliminationTimer, this, &ABlasterCharacter::EliminationTimerFinished, EliminationDelay);
}
void ABlasterCharacter::MulticastEliminated_Implementation()
{ {
bEliminated = true; bEliminated = true;
PlayEliminatedMontage(); PlayEliminatedMontage();
} }
void ABlasterCharacter::EliminationTimerFinished()
{
ABlasterGameMode* GameMode = GetWorld()->GetAuthGameMode<ABlasterGameMode>();
if (GameMode)
{
GameMode->RequestRespawn(this, Controller);
}
}
void ABlasterCharacter::PlayHitReactMontage() void ABlasterCharacter::PlayHitReactMontage()
{ {
if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return; if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return;

View File

@ -23,8 +23,10 @@ public:
void PlayFireMontage(bool bAiming); void PlayFireMontage(bool bAiming);
void PlayEliminatedMontage(); void PlayEliminatedMontage();
UFUNCTION(NetMulticast, Reliable)
void Eliminated(); void Eliminated();
UFUNCTION(NetMulticast, Reliable)
void MulticastEliminated();
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
@ -115,6 +117,12 @@ private:
class ABlasterPlayerController* BlasterPlayerController; class ABlasterPlayerController* BlasterPlayerController;
bool bEliminated = false; bool bEliminated = false;
UPROPERTY(EditDefaultsOnly)
float EliminationDelay = 3.f;
FTimerHandle EliminationTimer;
void EliminationTimerFinished();
public: public:
void SetOverlappingWeapon(AWeapon* Weapon); void SetOverlappingWeapon(AWeapon* Weapon);

View File

@ -4,6 +4,8 @@
#include "BlasterGameMode.h" #include "BlasterGameMode.h"
#include "Blaster/Character/BlasterCharacter.h" #include "Blaster/Character/BlasterCharacter.h"
#include "GameFramework/PlayerStart.h"
#include "Kismet/GameplayStatics.h"
void ABlasterGameMode::PlayerEliminated(ABlasterCharacter* EliminatedCharacter, ABlasterPlayerController* VictimController, void ABlasterGameMode::PlayerEliminated(ABlasterCharacter* EliminatedCharacter, ABlasterPlayerController* VictimController,
ABlasterPlayerController* AttackerController) ABlasterPlayerController* AttackerController)
@ -12,5 +14,21 @@ void ABlasterGameMode::PlayerEliminated(ABlasterCharacter* EliminatedCharacter,
{ {
EliminatedCharacter->Eliminated(); EliminatedCharacter->Eliminated();
} }
}
void ABlasterGameMode::RequestRespawn(ACharacter* EliminatedCharacter, AController* EliminatedController)
{
if (EliminatedCharacter)
{
EliminatedCharacter->Reset();
EliminatedCharacter->Destroy();
}
if (EliminatedController)
{
TArray<AActor*> PlayerStarts;
UGameplayStatics::GetAllActorsOfClass(this, APlayerStart::StaticClass(), PlayerStarts);
const int32 Selection = FMath::RandRange(0, PlayerStarts.Num() - 1);
RestartPlayerAtPlayerStart(EliminatedController, PlayerStarts[Selection]);
}
} }

View File

@ -17,4 +17,5 @@ class BLASTER_API ABlasterGameMode : public AGameMode
public: public:
virtual void PlayerEliminated(class ABlasterCharacter* EliminatedCharacter, class ABlasterPlayerController* VictimController, class ABlasterPlayerController* AttackerController); virtual void PlayerEliminated(class ABlasterCharacter* EliminatedCharacter, class ABlasterPlayerController* VictimController, class ABlasterPlayerController* AttackerController);
virtual void RequestRespawn(ACharacter* EliminatedCharacter, AController* EliminatedController);
}; };