/** Handles cleaning up an object library if it matches the passed in object */ void UGameplayCueManager::HandleAssetDeleted(UObject *Object) { FStringAssetReference StringRefToRemove; UBlueprint* Blueprint = Cast<UBlueprint>(Object); if (Blueprint && Blueprint->GeneratedClass) { UGameplayCueNotify_Static* StaticCDO = Cast<UGameplayCueNotify_Static>(Blueprint->GeneratedClass->ClassDefaultObject); AGameplayCueNotify_Actor* ActorCDO = Cast<AGameplayCueNotify_Actor>(Blueprint->GeneratedClass->ClassDefaultObject); if (StaticCDO || ActorCDO) { StringRefToRemove.SetPath(Blueprint->GeneratedClass->GetPathName()); } } if (StringRefToRemove.IsValid()) { TArray<FStringAssetReference> StringRefs; StringRefs.Add(StringRefToRemove); check(GlobalCueSet); GlobalCueSet->RemoveCuesByStringRefs(StringRefs); OnGameplayCueNotifyAddOrRemove.Broadcast(); } }
// Backwards compat for map strings void FixMapAssetRef(FStringAssetReference& MapAssetReference) { const FString AssetRefStr = MapAssetReference.ToString(); int32 DummyIndex; if (!AssetRefStr.IsEmpty() && !AssetRefStr.FindLastChar(TEXT('.'), DummyIndex)) { FString MapName, MapPath; AssetRefStr.Split(TEXT("/"), &MapPath, &MapName, ESearchCase::IgnoreCase, ESearchDir::FromEnd); MapAssetReference.SetPath(FString::Printf(TEXT("%s/%s.%s"),*MapPath, *MapName, *MapName)); } };
void UGameplayCueManager::HandleAssetAdded(UObject *Object) { UBlueprint* Blueprint = Cast<UBlueprint>(Object); if (Blueprint && Blueprint->GeneratedClass) { UGameplayCueNotify_Static* StaticCDO = Cast<UGameplayCueNotify_Static>(Blueprint->GeneratedClass->ClassDefaultObject); AGameplayCueNotify_Actor* ActorCDO = Cast<AGameplayCueNotify_Actor>(Blueprint->GeneratedClass->ClassDefaultObject); if (StaticCDO || ActorCDO) { if (IsAssetInLoadedPaths(Object)) { FStringAssetReference StringRef; StringRef.SetPath(Blueprint->GeneratedClass->GetPathName()); TArray<FGameplayCueReferencePair> CuesToAdd; if (StaticCDO) { CuesToAdd.Add(FGameplayCueReferencePair(StaticCDO->GameplayCueTag, StringRef)); } else if (ActorCDO) { CuesToAdd.Add(FGameplayCueReferencePair(ActorCDO->GameplayCueTag, StringRef)); } check(GlobalCueSet); GlobalCueSet->AddCues(CuesToAdd); OnGameplayCueNotifyAddOrRemove.Broadcast(); } else { VerifyNotifyAssetIsInValidPath(Blueprint->GetOuter()->GetPathName()); } } } }
void UGameplayCueManager::BuildCuesToAddToGlobalSet(const TArray<FAssetData>& AssetDataList, FName TagPropertyName, bool bAsyncLoadAfterAdd, TArray<FGameplayCueReferencePair>& OutCuesToAdd, FOnGameplayCueNotifySetLoaded OnLoaded, FShouldLoadGCNotifyDelegate ShouldLoad) { IGameplayTagsModule& GameplayTagsModule = IGameplayTagsModule::Get(); TArray<FStringAssetReference> AssetsToLoad; AssetsToLoad.Reserve(AssetDataList.Num()); for (FAssetData Data: AssetDataList) { // If ShouldLoad delegate is bound and it returns false, don't load this one if (ShouldLoad.IsBound() && (ShouldLoad.Execute(Data) == false)) { continue; } const FString* FoundGameplayTag = Data.TagsAndValues.Find(TagPropertyName); if (FoundGameplayTag && FoundGameplayTag->Equals(TEXT("None")) == false) { const FString* GeneratedClassTag = Data.TagsAndValues.Find(TEXT("GeneratedClass")); if (GeneratedClassTag == nullptr) { ABILITY_LOG(Warning, TEXT("Unable to find GeneratedClass value for AssetData %s"), *Data.ObjectPath.ToString()); continue; } ABILITY_LOG(Log, TEXT("GameplayCueManager Found: %s / %s"), **FoundGameplayTag, **GeneratedClassTag); FGameplayTag GameplayCueTag = GameplayTagsModule.GetGameplayTagsManager().RequestGameplayTag(FName(**FoundGameplayTag), false); if (GameplayCueTag.IsValid()) { // Add a new NotifyData entry to our flat list for this one FStringAssetReference StringRef; StringRef.SetPath(FPackageName::ExportTextPathToObjectPath(*GeneratedClassTag)); OutCuesToAdd.Add(FGameplayCueReferencePair(GameplayCueTag, StringRef)); AssetsToLoad.Add(StringRef); } else { ABILITY_LOG(Warning, TEXT("Found GameplayCue tag %s in asset %s but there is no corresponding tag in the GameplayTagManager."), **FoundGameplayTag, *Data.PackageName.ToString()); } } } if (bAsyncLoadAfterAdd) { auto ForwardLambda = [](TArray<FStringAssetReference> AssetList, FOnGameplayCueNotifySetLoaded OnLoadedDelegate) { OnLoadedDelegate.ExecuteIfBound(AssetList); }; if (AssetsToLoad.Num() > 0) { StreamableManager.RequestAsyncLoad(AssetsToLoad, FStreamableDelegate::CreateStatic( ForwardLambda, AssetsToLoad, OnLoaded)); } else { // Still fire the delegate even if nothing was found to load OnLoaded.ExecuteIfBound(AssetsToLoad); } } }