[Home](../../Home.md) # Ability Status Implementation An ability status is a gameplay tag assigned to the dynamic tags of an ability spec. It can be one of the four values Tag | Meaning -|- `Ability.Status.Locked` | The ability cannot be learnt `Ability.Status.Eligible` | The ability can be learnt `Ability.Status.Unlocked` | Ability learnt from the book but not bind `Ability.Status.Equipped` | Ability has an input tag bind Each character has a class information that contains an ability book ```C++ AAuraBaseCharacter *MyCharacter; UAbilityInfo* Book = MyCharacter->GetClassInfo()->AbilitiesBook; ``` The Ability System Component has a list of ability specs. ```C++ UAuraAbilitySystemComponent *AuraASC; TArray Abilities = AuraASC->GetActivatableAbilities(); ``` We can fetch an ability status with ether an ability spec or an ability id tag ```C++ FGameplayAbilitySpec AbilitySpec; FGameplayTag StatusTag = UAuraAbilitySystemComponent::GetStatusTagFromAbilitySpec(AbilitySpec); bool StatusFound = AuraASC->GetStatusTagForAbilityIDTag(AbilityIDTag, FGameplayTag, StatusTag); ``` Status | In Active Abilities | Level > 0 | InputTag -|-|-|- Locked | ❌ | ❌ | ❌ Eligible | ✔️ | ❌ | ❌ Unlocked | ✔️ | ✔️ | ❌ Equipped | ✔️ | ✔️ | ✔️ To keep the status tag up to date, it is updated in the asc when - We recieve an ability with a matching tag of `Ability.ID`. in the `OnGiveAbility` - We assign an input tag to the ability spec. in the `AssignInputTagToAbilitySpec` and `RemoveInputTagFromAbilitySpec` - We modify an ability spec level with the function `SetLevelForAbilitySpec` or `AddLevelForAbilitySpec`