Modifiers & Dynamic Tags

The modifier pipeline lets external systems (items, buffs, game rules) adjust ability properties at runtime without touching ability code. Two scopes exist.

Tag-based modifiers

Apply to every ability whose family tags include the target tag. Replicated via FCrimsonTagBasedModifierArray (FFastArraySerializer):

cpp
// All abilities tagged "Ability.Family.Fire" deal +10% damage
ASC->AddTagBasedModifier(TAG_Ability_Family_Fire, TAG_Attribute_AttackPower, EGameplayModOp::Multiplicative, 0.1f);
ASC->RemoveTagBasedModifier(TAG_Ability_Family_Fire, TAG_Attribute_AttackPower, EGameplayModOp::Multiplicative, 0.1f);

Handle-specific modifiers

Apply to a single ability spec by handle - used internally by the augment equip path, also callable directly:

cpp
ASC->AddAbilitySpecificModifier(Handle, TAG_Attribute_CritChance, EGameplayModOp::Additive, 15.0f);
ASC->RemoveAbilitySpecificModifier(Handle, TAG_Attribute_CritChance, EGameplayModOp::Additive, 15.0f);

Dynamic tag rules

Rules that expand an ability's family tags at query time - when the ASC sees SourceTag on an ability, it grants GrantedTags to that ability's tag set:

cpp
// Any ability with "Ability.Element.Fire" also gains Elemental + Damaging family tags
FGameplayTagContainer ExtraTags;
ExtraTags.AddTag(TAG_Ability_Family_Elemental);
ExtraTags.AddTag(TAG_Ability_Family_Damaging);
ASC->AddDynamicTagRule(TAG_Ability_Element_Fire, ExtraTags);

Dynamic tag rules replicate (OnRep_DynamicTagRules) and immediately invalidate ability tag queries via OnDynamicTagRulesChanged.