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;
}