void ANimModCharacter::PostInitializeComponents() { Super::PostInitializeComponents(); if (Role == ROLE_Authority) { Health = GetMaxHealth(); SpawnDefaultInventory(); } // set initial mesh visibility (3rd person view) UpdatePawnMeshes(); // create material instance for setting team colors (3rd person view) for (int32 iMat = 0; iMat < GetMesh()->GetNumMaterials(); iMat++) { MeshMIDs.Add(GetMesh()->CreateAndSetMaterialInstanceDynamic(iMat)); } // play respawn effects if (GetNetMode() != NM_DedicatedServer) { if (RespawnFX) { UGameplayStatics::SpawnEmitterAtLocation(this, RespawnFX, GetActorLocation(), GetActorRotation()); } if (RespawnSound) { UGameplayStatics::PlaySoundAtLocation(this, RespawnSound, GetActorLocation()); } } }
AShooterBot::AShooterBot(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP) { AIControllerClass = AShooterAIController::StaticClass(); UpdatePawnMeshes(); bUseControllerRotationYaw = true; }
void AAmethystCharacter::PawnClientRestart() { Super::PawnClientRestart(); // switch mesh to 1st person view UpdatePawnMeshes(); // reattach weapon if needed SetCurrentWeapon(CurrentWeapon); }
void ANimModCharacter::PawnClientRestart() { Super::PawnClientRestart(); // switch mesh to 1st person view UpdatePawnMeshes(); // reattach weapon if needed SetCurrentWeapon(CurrentWeapon); // set team colors for 1st person view //The material's index that we want is 1, not 0. UMaterialInstanceDynamic* Mesh1PMID = Mesh1P->CreateAndSetMaterialInstanceDynamic(1); UpdateTeamColors(Mesh1PMID); }
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(); } }