void ASCharacter::OnDeath(float KillingDamage, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser) { if (bIsDying) { return; } DestroyInventory(); StopAllAnimMontages(); Super::OnDeath(KillingDamage, DamageEvent, PawnInstigator, DamageCauser); }
void AsbrPlayer::OnDeath() { if (PauseMenu) PauseMenu->GetWidgetFromName("ResumeButton")->SetIsEnabled(false); OnPausePressed(); APlayerController* playerController = GetWorld()->GetFirstPlayerController(); if (playerController) Controller->UnPossess(); DestroyInventory(); StopAllAnimMontages(); }
void ANimModCharacter::OnDeath(float KillingDamage, struct FDamageEvent const& DamageEvent, class APawn* PawnInstigator, class AActor* DamageCauser) { if (bIsDying) { return; } bReplicateMovement = false; bTearOff = true; bIsDying = true; if (Role == ROLE_Authority) { ReplicateHit(KillingDamage, DamageEvent, PawnInstigator, DamageCauser, true); // play the force feedback effect on the client player controller APlayerController* PC = Cast<APlayerController>(Controller); if (PC && DamageEvent.DamageTypeClass) { UNimModDamageType *DamageType = Cast<UNimModDamageType>(DamageEvent.DamageTypeClass->GetDefaultObject()); if (DamageType && DamageType->KilledForceFeedback) { PC->ClientPlayForceFeedback(DamageType->KilledForceFeedback, false, "Damage"); } } } // cannot use IsLocallyControlled here, because even local client's controller may be NULL here if (GetNetMode() != NM_DedicatedServer && DeathSound && Mesh1P && Mesh1P->IsVisible()) { UGameplayStatics::PlaySoundAtLocation(this, DeathSound, GetActorLocation()); } ANimModPlayerController *controller = GetNimModPlayerController(); if (controller) { ANimModPlayerCameraManager *cameraManager = controller->GetNimModPlayerCameraManager(); if (cameraManager) cameraManager->ResetFOV(); } // remove all weapons DestroyInventory(); // switch back to 3rd person view UpdatePawnMeshes(); DetachFromControllerPendingDestroy(); StopAllAnimMontages(); if (LowHealthWarningPlayer && LowHealthWarningPlayer->IsPlaying()) { LowHealthWarningPlayer->Stop(); } if (RunLoopAC) { RunLoopAC->Stop(); } // disable collisions on capsule GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision); GetCapsuleComponent()->SetCollisionResponseToAllChannels(ECR_Ignore); if (GetMesh()) { static FName CollisionProfileName(TEXT("Ragdoll")); GetMesh()->SetCollisionProfileName(CollisionProfileName); } SetActorEnableCollision(true); // Death anim float DeathAnimDuration = PlayAnimMontage(DeathAnim); // Ragdoll if (DeathAnimDuration > 0.f) { // Use a local timer handle as we don't need to store it for later but we don't need to look for something to clear FTimerHandle TimerHandle; GetWorldTimerManager().SetTimer(TimerHandle, this, &ANimModCharacter::SetRagdollPhysics, FMath::Min(0.1f, DeathAnimDuration), false); } else { SetRagdollPhysics(); } }