// Copyright Epic Games, Inc. All Rights Reserved. #include "Feedback/ContextEffects/LyraContextEffectsLibrary.h" #include "GameplayTagContainer.h" #include "NiagaraSystem.h" #include "Sound/SoundBase.h" #include "Templates/Casts.h" void ULyraContextEffectsLibrary::GetEffects(const FGameplayTag Effect, const FGameplayTagContainer Context, TArray& Sounds, TArray& NiagaraSystems) { // Make sure Effect is valid and Library is loaded if (Effect.IsValid() && Context.IsValid() && EffectsLoadState == EContextEffectsLibraryLoadState::Loaded) { // Loop through Context Effects for (const auto ActiveContextEffect : ActiveContextEffects) { // Make sure the Effect is an exact Tag Match and ensure the Context has all tags in the Effect (and neither or both are empty) if (Effect.MatchesTagExact(ActiveContextEffect->EffectTag) && Context.HasAllExact(ActiveContextEffect->Context) && (ActiveContextEffect->Context.IsEmpty() == Context.IsEmpty())) { // Get all Matching Sounds and Niagara Systems Sounds.Append(ActiveContextEffect->Sounds); NiagaraSystems.Append(ActiveContextEffect->NiagaraSystems); } } } } void ULyraContextEffectsLibrary::LoadEffects() { // Load Effects into Library if not currently loading if (EffectsLoadState != EContextEffectsLibraryLoadState::Loading) { // Set load state to loading EffectsLoadState = EContextEffectsLibraryLoadState::Loading; // Clear out any old Active Effects ActiveContextEffects.Empty(); // Call internal loading function LoadEffectsInternal(); } } EContextEffectsLibraryLoadState ULyraContextEffectsLibrary::GetContextEffectsLibraryLoadState() { // Return current Load State return EffectsLoadState; } void ULyraContextEffectsLibrary::LoadEffectsInternal() { // TODO Add Async Loading for Libraries // Copy data for async load TArray LocalContextEffects = ContextEffects; // Prepare Active Context Effects Array TArray ActiveContextEffectsArray; // Loop through Context Effects for (const FLyraContextEffects& ContextEffect : LocalContextEffects) { // Make sure Tags are Valid if (ContextEffect.EffectTag.IsValid() && ContextEffect.Context.IsValid()) { // Create new Active Context Effect ULyraActiveContextEffects* NewActiveContextEffects = NewObject(this); // Pass relevant tag data NewActiveContextEffects->EffectTag = ContextEffect.EffectTag; NewActiveContextEffects->Context = ContextEffect.Context; // Try to load and add Effects to New Active Context Effects for (const FSoftObjectPath& Effect : ContextEffect.Effects) { if (UObject* Object = Effect.TryLoad()) { if (Object->IsA(USoundBase::StaticClass())) { if (USoundBase* SoundBase = Cast(Object)) { NewActiveContextEffects->Sounds.Add(SoundBase); } } else if (Object->IsA(UNiagaraSystem::StaticClass())) { if (UNiagaraSystem* NiagaraSystem = Cast(Object)) { NewActiveContextEffects->NiagaraSystems.Add(NiagaraSystem); } } } } // Add New Active Context to the Active Context Effects Array ActiveContextEffectsArray.Add(NewActiveContextEffects); } } // TODO Call Load Complete after Async Load // Mark loading complete this->LyraContextEffectLibraryLoadingComplete(ActiveContextEffectsArray); } void ULyraContextEffectsLibrary::LyraContextEffectLibraryLoadingComplete( TArray LyraActiveContextEffects) { // Flag data as loaded EffectsLoadState = EContextEffectsLibraryLoadState::Loaded; // Append incoming Context Effects Array to current list of Active Context Effects ActiveContextEffects.Append(LyraActiveContextEffects); }