TArray<AActor*> URPGEffectBase::SpreadEffects(TArray<URPGEffectBase*> EffectsIn, 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) { for (URPGEffectBase* effect : EffectsIn) { TWeakObjectPtr<URPGEffectPeriodic> periodicEffect = Cast<URPGEffectPeriodic>(effect); if (periodicEffect.IsValid()) { periodicEffect->SetTarget(ActorHit); periodicEffect->SetCauser(CausedBy); periodicEffect->PreInitialize(); periodicEffect->Initialize(); HitActorAttribute->ApplyPeriodicEffect(periodicEffect.Get()); continue; } effect->SetTarget(ActorHit); effect->SetCauser(CausedBy); effect->PreInitialize(); effect->Initialize(); } } } } } return ActorHits; }