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

View File

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

View File

@ -4,6 +4,8 @@
#include "BlasterGameMode.h"
#include "Blaster/Character/BlasterCharacter.h"
#include "GameFramework/PlayerStart.h"
#include "Kismet/GameplayStatics.h"
void ABlasterGameMode::PlayerEliminated(ABlasterCharacter* EliminatedCharacter, ABlasterPlayerController* VictimController,
ABlasterPlayerController* AttackerController)
@ -12,5 +14,21 @@ void ABlasterGameMode::PlayerEliminated(ABlasterCharacter* EliminatedCharacter,
{
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:
virtual void PlayerEliminated(class ABlasterCharacter* EliminatedCharacter, class ABlasterPlayerController* VictimController, class ABlasterPlayerController* AttackerController);
virtual void RequestRespawn(ACharacter* EliminatedCharacter, AController* EliminatedController);
};