TArray<AActor*> URPGEffectBase::SpreadEffect(URPGEffectBase* EffectIn, FVector FromLoc, float Radius, int32 MaxTargets) { TArray<AActor*> ActorHits; if ((!GetWorld())) return ActorHits; TWeakObjectPtr<URPGEffectPeriodic> PeriodicEffect = Cast<URPGEffectPeriodic>(EffectIn); float TargetCounter = 0; //EffectSpec.SetEffect(); FCollisionQueryParams SphereParams(this->GetFName(), false, CausedBy); //make sure we have world TArray<FOverlapResult> Overlaps; GetWorld()->OverlapMulti(Overlaps, FromLoc, FQuat::Identity, FCollisionShape::MakeSphere(Radius), SphereParams, FCollisionObjectQueryParams(FCollisionObjectQueryParams::InitType::AllDynamicObjects)); for (FOverlapResult& overlap : Overlaps) { ActorHits.AddUnique(overlap.GetActor()); } if (ActorHits.Num() > 0) { int32 TargetCounter = 0; if (MaxTargets > TargetCounter) { TargetCounter++; for (AActor* ActorHit : ActorHits) { URPGAttributeComponent* HitActorAttribute = ActorHit->FindComponentByClass<URPGAttributeComponent>(); if (HitActorAttribute) { if (PeriodicEffect.IsValid()) { PeriodicEffect->SetTarget(ActorHit); PeriodicEffect->PreInitialize(); PeriodicEffect->Initialize(); HitActorAttribute->ApplyPeriodicEffect(PeriodicEffect.Get()); continue; } EffectIn->SetTarget(ActorHit); EffectIn->PreInitialize(); EffectIn->Initialize(); } } } } return ActorHits; }