#
Authoring Effects
A designer-focused guide to creating, configuring, and balancing status effects without writing code.
#
Creating a New Effect
- In the Content Browser, navigate to where you want to store effects (recommend
Content/Effects/orContent/SFX_Defs/). - Right-click → Miscellaneous → Data Asset.
- Select AP StatusEffectDefinition as the class → click Select.
- Name the asset with the
SFX_Def_prefix: e.g.,SFX_Def_Chill,SFX_Def_Fortify. - Double-click to open and configure the Details panel.
Naming Convention
Using the SFX_Def_ prefix makes effects easy to filter in the Content Browser and keeps them separate from other Data Assets in the project. All demo content uses this convention.
#
Effect Tag
Every effect must have a unique Gameplay Tag set as its EffectTag.
#
Recommended Tag Hierarchy
Effect
├── Buff
│ ├── Effect.Buff.Regeneration
│ ├── Effect.Buff.SpeedBoost
│ ├── Effect.Buff.Shield
│ └── Effect.Buff.Fortify
├── Debuff
│ ├── Effect.Debuff.Poison
│ ├── Effect.Debuff.Burning
│ ├── Effect.Debuff.Slow
│ └── Effect.Debuff.Stun
└── CC
├── Effect.CC.Frozen
├── Effect.CC.Sleep
└── Effect.CC.Fear
Tags are registered in Project Settings → Gameplay Tags or via the plugin's Config/Tags/StatusFXTags.ini.
Tag Uniqueness
Two definitions using the same EffectTag will conflict — the system cannot distinguish between them. Always use a unique tag per effect type.
#
Duration Types
#
Choosing a Duration
Short (1–3s) — Crowd control, brief interrupts (Stun, Fear)
Medium (5–15s) — Damage-over-time, moderate buffs (Poison, SpeedBoost)
Long (30s+) — Persistent buffs, environmental hazards (Regeneration aura)
Infinite — Permanent states, passive bonuses, custom-removed effects
#
Tick Interval
Set TickInterval to have the effect fire OnEffectTick periodically. Common uses:
Server Only
OnEffectTick fires on the server only. Bind to it on the server to apply actual gameplay consequences (damage, healing). For client UI, use bIsTicking from the snapshot to show a pulsing indicator.
#
Stacking Policies
Choosing the right stacking policy is the most important design decision for each effect.
Behavior: Reapplication resets the duration timer. Stack count is always 1.
Use for: Buffs and debuffs where only the most recent application matters — speed boosts, damage buffs, shields.
Example — Speed Boost:
- Player applies Speed Boost (10s).
- Player applies Speed Boost again at 6s remaining.
- Result: Duration resets to 10s. Stack count stays at 1.
Behavior: Each application adds its full duration to the remaining time (up to no explicit cap by default).
Use for: Effects that "stack up" over time — channeled heals, sustained buffs from repeated casts.
Example — Hot Spring Aura:
- Player enters hot spring: Regeneration applied (15s).
- Player stays: Regeneration applied again → now 30s remaining.
- Each second the player stays, more duration accumulates.
Behavior: Each application adds one stack (up to MaxStacks). Duration is shared and refreshes on each application.
Use for: Escalating effects — poison that deals more damage per stack, bleeds, charge-based mechanics.
Example — Poison (MaxStacks: 5):
- Hit 1: Poison × 1 (10s)
- Hit 2: Poison × 2 (10s, refreshed)
- Hit 5: Poison × 5 (10s, refreshed) — maximum damage, maximum stacks
Your game logic reads GetStackCount() and scales damage accordingly.
Behavior: Each application creates a completely separate tracked instance with its own duration.
Use for: Effects where each source is tracked separately — multiple projectile DoTs, layered shields, multi-source bleeds.
Example — Layered Shield:
- Ability A applies Shield (15s).
- Ability B applies Shield (10s).
- Two separate shields exist simultaneously; they expire independently.
Configure GlobalMaxIndependentStacks in Project Settings as a safety cap (default: 50).
Behavior: Delegates all stacking logic to a UAP_StackingResolver subclass you provide.
Use for: Complex or unique stacking that doesn't fit the built-in models — charge systems, diminishing returns, gear-driven scaling.
Create a Blueprint subclass of UAP_StackingResolver, override ResolveStacking, and assign the class to CustomStackingResolverClass on the definition.
#
Interaction Rules
Effects can interact with each other in two ways:
#
Removes Effects With Tags
When this effect is applied, remove any currently active effect whose EffectTag is in this container.
Example: Antidote
RemovesEffectsWithTags:Effect.Debuff.Poison,Effect.Debuff.Disease- When Antidote is applied, all poison and disease effects are removed.
#
Blocked By Effects With Tags
This effect cannot be applied while any effect with these tags is active.
Example: Frozen (blocked by Invulnerability)
BlockedByEffectsWithTags:Effect.Buff.Invulnerability- While the target has Invulnerability, applying Frozen silently fails.
#
DataTable Rules (Complex Interactions)
For interactions that require immunity grants on removal, use a DataTable in Project Settings:
Result: Applying Frozen removes Burning and makes the target immune to Burning for 3 seconds.
#
Immunity on Expiry
Enable bGrantImmunityOnExpire and set ImmunityDuration to automatically grant immunity after an effect ends naturally.
Example: Stun with Tenacity
- Stun expires after 3 seconds.
bGrantImmunityOnExpire:true,ImmunityDuration:5.0- The target is immune to Stun for 5 seconds after recovery — prevents stunlock.
This is a common pattern in action games and MOBAs (crowd control diminishing returns).
#
Icon Setup
Set the Icon property on each definition to a 64×64 UTexture2D. The demo ships with 64×64 PNG icons for all 31 included effects — you can use these as a starting point or as placeholders while producing your own art.
Import icons via Content Browser → Import or by dragging PNG files directly into the editor.
#
Validation Warnings
The editor will show warnings in the Compiler Results panel if a definition has invalid configuration:
Fix any warnings before using the definition in gameplay.
#
Balancing Tips
Designer Notes
- Keep
TickIntervalat1.0for damage-per-second DoTs — it makes math obvious and easy to tune. - Use
MaxStacksliberally with Stack Intensity effects — without a cap, effects can grow without bound. - For crowd control, always set
bGrantImmunityOnExpire: truewith a reasonableImmunityDurationto prevent stunlocks. - Test stacking interactions in the demo map using the keyboard shortcut keys before integrating into your game.
#
Related Pages
- Quick Start — Create an Effect Definition
- Quick Start — Stacking Policies
- Quick Start — Interaction Rules
- API Reference — UAP_StatusEffectDefinition
AfterPrime Systems — Building the Gameplay Foundation