void AProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit) { LaunchBlast->Deactivate(); ImpactBlast->Activate(); ExplosionForce->FireImpulse(); SetRootComponent(ImpactBlast); CollisionMesh->DestroyComponent(); UGameplayStatics::ApplyRadialDamage( this, ProjectileDamage, GetActorLocation(), ExplosionForce->Radius, UDamageType::StaticClass(), TArray<AActor*>() // don't ignore any actors ); auto Timer = FTimerHandle(); GetWorld()->GetTimerManager().SetTimer(Timer, this, &AProjectile::OnTimerExpire, DestroyDelay, false); }
/** Finds a handle to a dynamic timer bound to a particular pointer and function name. */ FTimerHandle FTimerManager::K2_FindDynamicTimerHandle(FTimerDynamicDelegate InDynamicDelegate) const { if (CurrentlyExecutingTimer.TimerDelegate.FuncDynDelegate == InDynamicDelegate) { return CurrentlyExecutingTimer.TimerHandle; } if (auto* Timer = ActiveTimerHeap.FindByPredicate([=](const FTimerData& Data){ return Data.TimerDelegate.FuncDynDelegate == InDynamicDelegate; })) { return Timer->TimerHandle; } if (auto* Timer = PausedTimerList.FindByPredicate([=](const FTimerData& Data){ return Data.TimerDelegate.FuncDynDelegate == InDynamicDelegate; })) { return Timer->TimerHandle; } if (auto* Timer = PendingTimerList.FindByPredicate([=](const FTimerData& Data){ return Data.TimerDelegate.FuncDynDelegate == InDynamicDelegate; })) { return Timer->TimerHandle; } return FTimerHandle(); }