FHitResult UAbilitySystemBlueprintLibrary::EffectContextGetHitResult(FGameplayEffectContextHandle EffectContext) { if (EffectContext.GetHitResult()) { return *EffectContext.GetHitResult(); } return FHitResult(); }
void FGameplayAbilityTargetData::AddTargetDataToContext(FGameplayEffectContextHandle& Context, bool bIncludeActorArray) const { if (bIncludeActorArray && (GetActors().Num() > 0)) { Context.AddActors(GetActors()); } if (HasHitResult() && !Context.GetHitResult()) { Context.AddHitResult(*GetHitResult()); } if (HasOrigin()) { Context.AddOrigin(GetOrigin().GetLocation()); } }
bool UAbilitySystemBlueprintLibrary::EffectContextHasHitResult(FGameplayEffectContextHandle EffectContext) { return EffectContext.GetHitResult() != NULL; }
TSharedPtr<FGameplayCueViewEffects> FGameplayCueViewInfo::SpawnViewEffects(AActor *Owner, TArray<UObject*> *SpawnedObjects, const FGameplayEffectContextHandle& EffectContext) const { check(Owner); TSharedPtr<FGameplayCueViewEffects> SpawnedEffects = TSharedPtr<FGameplayCueViewEffects>(new FGameplayCueViewEffects()); if (Sound) { SpawnedEffects->AudioComponent = UGameplayStatics::PlaySoundAttached(Sound, Owner->GetRootComponent()); if (SpawnedObjects) { SpawnedObjects->Add(SpawnedEffects->AudioComponent.Get()); } } if (ParticleSystem) { if (EffectContext.GetHitResult()) { const FHitResult &HitResult = *EffectContext.GetHitResult(); if (AttachParticleSystem) { SpawnedEffects->ParticleSystemComponent = UGameplayStatics::SpawnEmitterAttached(ParticleSystem, Owner->GetRootComponent(), NAME_None, HitResult.Location, HitResult.Normal.Rotation(), EAttachLocation::KeepWorldPosition); } else { bool AutoDestroy = SpawnedObjects == nullptr; SpawnedEffects->ParticleSystemComponent = UGameplayStatics::SpawnEmitterAtLocation(Owner->GetWorld(), ParticleSystem, HitResult.Location, HitResult.Normal.Rotation(), AutoDestroy); } } else { if (AttachParticleSystem) { SpawnedEffects->ParticleSystemComponent = UGameplayStatics::SpawnEmitterAttached(ParticleSystem, Owner->GetRootComponent()); } else { bool AutoDestroy = SpawnedObjects == nullptr; SpawnedEffects->ParticleSystemComponent = UGameplayStatics::SpawnEmitterAtLocation(Owner->GetWorld(), ParticleSystem, Owner->GetActorLocation(), Owner->GetActorRotation(), AutoDestroy); } } if (SpawnedObjects) { SpawnedObjects->Add(SpawnedEffects->ParticleSystemComponent.Get()); } else if (SpawnedEffects->ParticleSystemComponent.IsValid()) { for (int32 EmitterIndx = 0; EmitterIndx < SpawnedEffects->ParticleSystemComponent->EmitterInstances.Num(); EmitterIndx++) { if (SpawnedEffects->ParticleSystemComponent->EmitterInstances[EmitterIndx] && SpawnedEffects->ParticleSystemComponent->EmitterInstances[EmitterIndx]->CurrentLODLevel && SpawnedEffects->ParticleSystemComponent->EmitterInstances[EmitterIndx]->CurrentLODLevel->RequiredModule && SpawnedEffects->ParticleSystemComponent->EmitterInstances[EmitterIndx]->CurrentLODLevel->RequiredModule->EmitterLoops == 0) { ABILITY_LOG(Warning, TEXT("%s - particle system has a looping emitter. This should not be used in a executed GameplayCue!"), *SpawnedEffects->ParticleSystemComponent->GetName()); break; } } } } if (ActorClass) { FVector Location = Owner->GetActorLocation(); FRotator Rotation = Owner->GetActorRotation(); SpawnedEffects->SpawnedActor = Cast<AGameplayCueActor>(Owner->GetWorld()->SpawnActor(ActorClass, &Location, &Rotation)); if (SpawnedObjects) { SpawnedObjects->Add(SpawnedEffects->SpawnedActor.Get()); } } return SpawnedEffects; }