12{
14
15 if (IsValid(Data.TargetActor) == false || Data.AbilityTag.IsValid() == false)
16 {
17 return false;
18 }
19
20 UAbilitySystemComponent* AbilitySystemComponent = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Data.TargetActor);
21 if (IsValid(AbilitySystemComponent) == false || AbilitySystemComponent->AbilityActorInfo.IsValid() == false)
22 {
23 return false;
24 }
25
26 FGameplayTagContainer AbilityTags;
27 AbilityTags.AddTag(Data.AbilityTag);
28
29 TArray<FGameplayAbilitySpec*> MatchingAbilities;
30 AbilitySystemComponent->GetActivatableGameplayAbilitySpecsByAllMatchingTags(AbilityTags, MatchingAbilities, false);
31
32 bool bCanActivate = false;
33
34 for (FGameplayAbilitySpec* AbilitySpec : MatchingAbilities)
35 {
36 if (AbilitySpec == nullptr)
37 {
38 continue;
39 }
40
41 UGameplayAbility* Ability = AbilitySpec->GetPrimaryInstance();
42 if (IsValid(Ability) == false)
43 {
44 Ability = AbilitySpec->Ability;
45 }
46
47 if (IsValid(Ability) == false)
48 {
49 continue;
50 }
51
52 if (Ability->CanActivateAbility(AbilitySpec->Handle, AbilitySystemComponent->AbilityActorInfo.Get()))
53 {
54 bCanActivate = true;
55 break;
56 }
57 }
58
59 return Data.bInvert ? bCanActivate == false : bCanActivate;
60}
FCanActivateAbilityByTagInstanceData FInstanceDataType
Definition Condition_CanActivateAbilityByTag.h:31