Attribute Modifiers
Table of contents
Overview
Attribute Modifiers are specialized abilities that change attributes with sophisticated rules. They’re the workhorses of SimpleGAS - the primary mechanism for modifying attributes during gameplay. Need to deal damage, apply a buff, or add a status effect? Attribute Modifiers are your go-to tool.
Attribute Modifiers come in two main types:
- Instant Modifiers: Apply their changes immediately and then end (like damage)
- Duration Modifiers: Persist for a period, potentially applying effects repeatedly (like damage over time)
Beyond simply changing values, Attribute Modifiers can:
- Chain multiple attribute modifications in a single operation
- Trigger side effects like visual effects, sounds, or animations
- Activate other abilities as side effects
- Apply or remove gameplay tags
- Cancel conflicting modifiers
Properties
General Configuration
| Name | Type | Description |
|---|---|---|
| Modifier Type | EAttributeModifierType | The behavior type: - Instant: Apply modifications immediately and end - Duration: Apply modifications over time |
| Modifier Application Policy | EAttributeModifierApplicationPolicy | Controls how the modifier is applied in multiplayer: - ApplyServerOnly: Runs only on server with replicated results - ApplyServerOnlyButReplicateSideEffects: Runs on server but side effects visible to clients - ApplyClientPredicted: Runs immediately on client, then verified by server |
| Modifier Tags | FGameplayTagContainer | Tags that categorize this modifier (e.g., “DamageOverTime”, “StatusEffect”) |
Duration Configuration
(Only used when Modifier Type is Duration)
| Name | Type | Description |
|---|---|---|
| Has Infinite Duration | bool | If true, the modifier will not expire until explicitly removed |
| Duration | float | How long the modifier persists (in seconds) if not infinite |
| Tick On Apply | bool | Whether to apply effects immediately when the modifier is first applied |
| Tick Interval | float | How often the modifier applies its effects (in seconds) |
| Tick Tag Requirement Behaviour | EDurationTickTagRequirementBehaviour | How to handle ticks when tag requirements aren’t met: - SkipOnTagRequirementFailed: Skip the tick but continue timer - PauseOnTagRequirementFailed: Pause timer until requirements are met again - CancelOnTagRequirementFailed: End the modifier entirely |
Stacking Configuration
(Only used when Modifier Type is Duration and CanStack is true)
| Name | Type | Description |
|---|---|---|
| Can Stack | bool | Whether multiple instances combine (e.g., stacking poison) |
| Stacks | int32 | Initial stack count (usually 1) |
| Has Max Stacks | bool | Whether there’s a limit to how many stacks can be applied |
| Max Stacks | int32 | Maximum allowed stacks if Has Max Stacks is true |
Tag Requirements
| Name | Type | Description |
|---|---|---|
| Target Required Tags | FGameplayTagContainer | Tags that must be present on the target for the modifier to apply |
| Target Blocking Tags | FGameplayTagContainer | Tags that prevent the modifier from applying if present on the target |
| Target Blocking Modifier Tags | FGameplayTagContainer | If another modifier with these tags is already applied, this modifier won’t apply |
After passing tag requirements
| Name | Type | Description |
|---|---|---|
| Cancel Abilities | TArray<TSubclassOf<USimpleGameplayAbility>> | Ability classes to cancel when this modifier is applied |
| Cancel Abilities With Ability Tags | FGameplayTagContainer | Cancel abilities with any of these tags when this modifier is applied |
| Cancel Modifiers With Tag | FGameplayTagContainer | Cancel other modifiers with these tags when this modifier is applied |
| Temporarily Applied Tags | FGameplayTagContainer | Tags added to the target when this modifier is active and removed when it ends |
| Permanently Applied Tags | FGameplayTagContainer | Tags added to the target when this modifier is applied (not automatically removed) |
| Remove Gameplay Tags | FGameplayTagContainer | Tags to remove from the target when this modifier is applied |
Attribute Modifications
This section defines how the modifier changes attributes. You can modify both float and struct attributes.
| Name | Type | Description |
|---|---|---|
| Float Attribute Modifications | TArray<FFloatAttributeModifier> | Configuration for modifying float attributes |
| Struct Attribute Modifications | TArray<FStructAttributeModifier> | Configuration for modifying struct attributes |
Side Effects
| Name | Type | Description |
|---|---|---|
| Ability Side Effects | TArray<FAbilitySideEffect> | Abilities to activate as side effects |
| Event Side Effects | TArray<FEventSideEffect> | Events to send as side effects |
| Attribute Modifier Side Effects | TArray<FAttributeModifierSideEffect> | Additional attribute modifiers to apply as side effects |
Blueprint Implementable Events
CanApplyModifier
Override this function to add custom validation rules for when the modifier can be applied.
Parameters:
| Input | Type | Description |
|---|---|---|
| ModifierContext | FInstancedStruct | Context data passed during modifier application |
| Output | Type | Description |
|---|---|---|
| Return Value | bool | True if the modifier can be applied, false otherwise |
OnPreApplyModifier
Called after passing tag requirements and CanApplyModifier checks but before the modifier’s effects are applied. Use this for setup or pre-application logic e.g. Applying resource costs.
Parameters: No parameters
OnPostApplyModifier
Called immediately after the modifier’s effects are applied. Use for post-application logic or effects.
Parameters: No parameters
OnModifierEnded
Called when the modifier ends, either by completing its duration or being cancelled.
Parameters:
| Input | Type | Description |
|---|---|---|
| EndingStatus | FGameplayTag | Tag indicating how the modifier ended |
| EndingContext | FInstancedStruct | Context data related to how the modifier ended |
OnStacksAdded
Called when stacks are added to a duration modifier.
Parameters:
| Input | Type | Description |
|---|---|---|
| AddedStacks | int32 | Number of stacks that were just added |
| CurrentStacks | int32 | Total number of stacks after addition |
OnMaxStacksReached
Called when a duration modifier reaches its maximum stack count. This will only be called if HasMaxStacks is true.
Parameters: No parameters
How Attribute Modification Works
Float Attribute Modifiers
Each float attribute modifier specifies:
- Which attribute to modify (by tag)
- What part of the attribute to change (current value, base value, etc.)
- The operation to perform (add, subtract, multiply, etc.)
- Where to get the input value from (fixed value, another attribute, overflow, etc.)
- How to handle attribute limits (min/max values)
Operations include:
- Add: Output = A + B
- Subtract: Output = A - B
- Multiply: Output = A * B
- Divide: Output = A / B
- Power: Output = A^B
- Override: Output = B
- Custom: Call a blueprint function to calculate the output
Struct Attribute Modifiers
Struct attribute modifiers work by calling a blueprint function you define. This gives you complete control over how to modify complex data structures. If you’ve set up a StructAttributeHandler, you will get events for each member of the struct that gets changed.