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):
// All abilities tagged "Ability.Family.Fire" deal +10% damageASC->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:
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:
// Any ability with "Ability.Element.Fire" also gains Elemental + Damaging family tagsFGameplayTagContainer 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.