Gameplay Ability System
Every Gameplay Ability System command in CodeFizz Editor Agent, with parameters and examples.
Every Gameplay Ability System command in CodeFizz Editor Agent, with parameters and examples.
25 commands. Each shows its parameters and an example, and has a copyable deep link, so you (or an AI agent) can jump straight to one.
get_gameplay_tagRead one tag's comment, sources, parent and children
Reports everything the editor knows about a tag: its developer comment, every source that declares it (a tag can be declared in more than one), whether it is explicit or restricted, its parent and its immediate children. An implicit tag is named as such with the reason, which is normally the answer to why a tag will not rename or delete.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tag | string | Yes | Fully qualified tag name, e.g. Character.State.Dead |
cfa get_gameplay_tag --tag Character.State.Deadadd_gameplay_tagAdd a gameplay tag to an ini source
Adds a tag through the engine's own IGameplayTagsEditorModule::AddNewGameplayTagToINI, so the write takes exactly the path the Project Settings tag editor takes. Parent tags are created implicitly. Pass --transient to add the tag for this editor session only, writing nothing to disk, the engine's own dry run for whether a name is accepted. The tag tree is re-read after the write and the result reflects what is actually there, so a reported success cannot mean a tag that was silently refused.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tag | string | Yes | Fully qualified tag to add, e.g. Character.State.Dead |
| comment | string | No | Developer comment shown in the tag picker |
| source | string | No | Tag source ini to write to; defaults to DefaultGameplayTags.ini |
| restricted | bool | No | Add as a restricted tag |
| allow_non_restricted_children | bool | No | Restricted tags only: allow ordinary child tags |
| transient | bool | No | Session only, writes nothing to disk |
cfa add_gameplay_tag --tag Character.State.Dead --comment "Set while the character is dead"
cfa add_gameplay_tag --tag Ability.Dash --source MyTags.ini
cfa add_gameplay_tag --tag Ability.Test --transientremove_gameplay_tagRemove a gameplay tag from its ini source
Removes a tag through the engine's own delete path. Refuses up front on an implicit tag, which has no ini entry to remove. When the engine declines, a tag with children, or one still referenced by loaded assets, this reports removed:false with the reason rather than a bare success, because the tag tree is re-read afterwards instead of the return value being trusted.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tag | string | Yes | Fully qualified tag to remove |
cfa remove_gameplay_tag --tag Character.State.Obsoleterename_gameplay_tagRename a tag, leaving a redirector behind
Renames a tag and leaves a redirector in the ini so assets referencing the old name keep resolving. --rename-children is UE 5.7 and later only: IGameplayTagsEditorModule::RenameTagInINI takes two arguments on 5.6 and three on 5.7/5.8, so on 5.6 asking to control it is refused by name rather than accepted and ignored.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tag | string | Yes | Fully qualified tag to rename |
| new_tag | string | Yes | New fully qualified name |
| rename_children | bool | No | Also rename child tags (UE 5.7+ only) |
cfa rename_gameplay_tag --tag Character.State.Dead --new-tag Character.Status.Deadadd_gameplay_tag_sourceCreate a new tag source ini
Creates a tag source so tags can be grouped away from DefaultGameplayTags.ini, which is what keeps a large project's tag library reviewable. The engine writes no file until the first tag is added to the source, so it will not appear in list_gameplay_tag_sources until then, this is reported rather than left to look like a failure.
| Parameter | Type | Required | Description |
|---|---|---|---|
| source | string | Yes | File name for the new source, e.g. MyTags.ini |
| root_dir | string | No | Directory to create it under; defaults to the project config directory |
cfa add_gameplay_tag_source --source MyTags.inilist_gameplay_tag_sourcesList tag sources and which are writable
Lists every tag source with its type, Native, DefaultTagList, TagList, RestrictedTagList or DataTable, and whether a tool can write to it. Native sources are declared in C++ and no tool can edit them. DataTable sources come from tables listed in GameplayTagTableList in project settings; a tag DataTable is an ordinary DataTable of FGameplayTagTableRow, so create_data_table and add_data_table_row author one and set_project_settings registers it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| source_type | string | No | Native, DefaultTagList, TagList, RestrictedTagList or DataTable |
cfa list_gameplay_tag_sources
cfa list_gameplay_tag_sources --source-type TagListlist_attribute_setsList AttributeSet classes, including unopened Blueprints
Lists every AttributeSet class with its attribute count, native and Blueprint alike. A scan of loaded classes alone misses any Blueprint attribute set the editor has never opened, so this also reads the asset registry and reports those separately without loading them. Needs the GameplayAbilities plugin, which ships DISABLED by default on 5.6, 5.7 and 5.8, when it is off the command says so and names where to enable it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Only sets whose class name contains this substring |
| include_attributes | bool | No | Include each set's attribute list |
| max_results | int | No | Maximum sets to return; truncation is always reported |
cfa list_attribute_sets
cfa list_attribute_sets --filter Health --include-attributeslist_attributesList an AttributeSet's attributes with defaults
Lists the attributes on an AttributeSet with their kind, default value and whether they replicate. What counts as an attribute is the engine's own test, reproduced exactly: any float property, or any property whose struct is FGameplayAttributeData or a subclass. It is never a naming convention, which is why a Blueprint variable of that struct type is a real attribute with no C++ at all. Accepts a class name, a class path, or the asset path of a Blueprint attribute set.
| Parameter | Type | Required | Description |
|---|---|---|---|
| attribute_set | string | Yes | Class name, class path, or Blueprint asset path |
| include_defaults | bool | No | Report each attribute's starting value from the class default object |
cfa list_attributes --attribute-set /Game/GAS/AS_Character
cfa list_attributes --attribute-set MyHealthSetcreate_attribute_setCreate a Blueprint AttributeSet, optionally with attributes
Creates a Blueprint AttributeSet and can create its attributes in the same call. UAttributeSet is declared Blueprintable on 5.6, 5.7 and 5.8, so a Blueprint attribute set is a first-class thing and not a workaround, no C++ is needed to define attributes. Attributes created this way are FGameplayAttributeData variables and are replicated by default.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Asset name, e.g. AS_Character |
| path | string | No | Content path to create it in; defaults to /Game/ |
| parent_class | string | No | Parent attribute set class; defaults to UAttributeSet |
| attributes | string | No | Comma separated attribute names to create immediately |
cfa create_attribute_set --name AS_Character --path /Game/GAS/ --attributes "Health,MaxHealth,Stamina"add_attributeAdd an attribute to a Blueprint AttributeSet
Adds an attribute as an FGameplayAttributeData variable on a Blueprint AttributeSet, replicated by default because an unreplicated attribute is a silent multiplayer bug. After the variable is created the engine's own attribute test is re-run against the recompiled class and the result reports whether the engine actually recognises it, a variable existing is not the same claim as an attribute existing. A C++ attribute set cannot gain attributes this way; that needs a property adding in code. On replication: this marks the variable Replicated, which is exactly what Epic's own AbilitySystemTestAttributeSet does. A C++ set can go further and pair ReplicatedUsing with the GAMEPLAYATTRIBUTE_REPNOTIFY macro, which calls SetBaseAttributeValueFromReplication so the AbilitySystemComponent rewinds its aggregator to the server's base value and re-evaluates. That function carries NO UFUNCTION on 5.6, 5.7 or 5.8, so it is unreachable from Blueprint and a Blueprint attribute set structurally cannot do it - a RepNotify can be added but has nothing useful to call. Consequence: fine for single player and server-authoritative play; for client-PREDICTED attributes under duration effects, declare the attribute set in C++.
| Parameter | Type | Required | Description |
|---|---|---|---|
| attribute_set | string | Yes | Blueprint asset path of the attribute set |
| name | string | Yes | Attribute name, e.g. Health |
| default_value | float | No | Starting value |
| replicated | bool | No | Mark the attribute replicated |
cfa add_attribute --attribute-set /Game/GAS/AS_Character --name Health --default-value 100validate_attribute_setCheck an AttributeSet and return a verdict
Checks an AttributeSet: that it defines any attributes at all, that none are raw floats where AttributeSet.h itself says FGameplayAttributeData is strongly encouraged (a raw float carries no base value and cannot be modified correctly by a duration effect), and that attributes replicate. Returns verdict pass/pass_with_warnings/fail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| attribute_set | string | Yes | Class name, class path, or Blueprint asset path |
cfa validate_attribute_set --attribute-set /Game/GAS/AS_Charactercreate_gameplay_effectCreate a GameplayEffect Blueprint
Creates a GameplayEffect Blueprint with an optional duration policy (Instant, Infinite, HasDuration). A gameplay effect is a DATA-ONLY Blueprint by Epic's own instruction in GameplayEffect.h, it is Blueprintable purely for templating and should contain no graph. Behaviour beyond modifiers has lived in gameplay effect components since 5.3; list_gameplay_effect_components shows which ones this engine version has.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Asset name, e.g. GE_Damage |
| path | string | No | Content path to create it in; defaults to /Game/ |
| parent_class | string | No | Parent effect class; defaults to UGameplayEffect |
| duration_policy | string | No | Instant, Infinite or HasDuration |
cfa create_gameplay_effect --name GE_Damage --path /Game/GAS/ --duration-policy Instant
cfa create_gameplay_effect --name GE_Regen --duration-policy HasDurationlist_gameplay_effect_componentsList the effect component classes this engine has
Lists the gameplay effect component classes THIS engine version actually has, and with --gameplay-effect given, the components attached to that effect. The set is not constant across the versions we support: CancelAbilityTagsGameplayEffectComponent exists on 5.7 and 5.8 and does not exist on 5.6. So the list is discovered from the class hierarchy at call time rather than hardcoded, which is the only way it can be right on all three.
| Parameter | Type | Required | Description |
|---|---|---|---|
| gameplay_effect | string | No | Effect asset path; omit to list only the available classes |
| component_class | string | No | Unused for listing; present so the flag set matches the add and remove commands |
cfa list_gameplay_effect_components
cfa list_gameplay_effect_components --gameplay-effect /Game/GAS/GE_Damageadd_gameplay_effect_componentAttach a gameplay effect component
Attaches a gameplay effect component, where all behaviour beyond modifiers lives since 5.3: granted tags, asset tags, immunity, chance to apply, additional effects, target tag requirements and the rest. Construction mirrors UGameplayEffect::AddComponent exactly, which is byte-identical on 5.6, 5.7 and 5.8, including the RF_PropagateToSubObjects | RF_Transactional flags it passes to NewObject. Those flags are the non-obvious half: without RF_Transactional the change is not undoable.
| Parameter | Type | Required | Description |
|---|---|---|---|
| gameplay_effect | string | Yes | Effect asset path |
| component_class | string | Yes | Component class name or path; run list_gameplay_effect_components first |
cfa add_gameplay_effect_component --gameplay-effect /Game/GAS/GE_Damage --component-class AssetTagsGameplayEffectComponentremove_gameplay_effect_componentRemove a gameplay effect component by class
Removes a gameplay effect component by class name, reporting the index removed and the remaining count. When the effect has no such component the error names what it does have, so there is no guess-and-retry loop.
| Parameter | Type | Required | Description |
|---|---|---|---|
| gameplay_effect | string | Yes | Effect asset path |
| component_class | string | Yes | Component class name to remove |
cfa remove_gameplay_effect_component --gameplay-effect /Game/GAS/GE_Damage --component-class AssetTagsGameplayEffectComponentset_gameplay_effect_modifierAdd or edit a modifier on a gameplay effect
Adds or edits a modifier: the attribute it changes, the operation (Additive, Multiplicitive, Division, Override) and the magnitude. Omit --index to append a new modifier. Writes go through the same reflected property path the rest of the tool uses, so whatever fields this engine version's modifier struct exposes are reachable and any that are not are reported per field rather than failing the whole call. That matters here more than elsewhere: 5.8 removed a batch of members deprecated in 5.0 and 5.3, so a gameplay effect's property set genuinely differs by version.
| Parameter | Type | Required | Description |
|---|---|---|---|
| gameplay_effect | string | Yes | Effect asset path |
| attribute | string | No | Attribute to modify, as SetClass.AttributeName or a unique AttributeName |
| operation | string | No | Additive, Multiplicitive, Division or Override |
| magnitude | float | No | Scalable float magnitude |
| index | int | No | Modifier index to edit; omit or -1 to append |
cfa set_gameplay_effect_modifier --gameplay-effect /Game/GAS/GE_Damage --attribute Health --operation Additive --magnitude -25validate_gameplay_effectRun the engine's own validation over an effect
Runs the ENGINE'S own validation over a gameplay effect and every component on it, through IsDataValid, which UGameplayEffect and UGameplayEffectComponent both override, so the verdict is Epic's rather than rules we invented. Adds one check of our own: an effect with neither modifiers nor components does nothing at all when applied, which the engine does not object to. Returns verdict pass/pass_with_warnings/fail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| gameplay_effect | string | Yes | Effect asset path |
cfa validate_gameplay_effect --gameplay-effect /Game/GAS/GE_Damagecreate_gameplay_abilityCreate a GameplayAbility Blueprint
Creates a GameplayAbility Blueprint. This deliberately does not go through create_blueprint: an ability asset must be a UGameplayAbilityBlueprint, not a plain UBlueprint, and GameplayAbilities registers no blueprint-type mapping for the generic path to find. The class pair passed here is exactly what the engine's own GameplayAbilitiesBlueprintFactory passes, which is byte-identical on 5.6, 5.7 and 5.8.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Asset name, e.g. GA_Dash |
| path | string | No | Content path to create it in; defaults to /Game/ |
| parent_class | string | No | Parent ability class; defaults to UGameplayAbility |
cfa create_gameplay_ability --name GA_Dash --path /Game/GAS/create_gameplay_cue_notifyCreate a cue notify Blueprint bound to its cue tag
Creates a gameplay cue notify Blueprint, static (no actor spawned), actor, burst or looping, and binds it to its cue tag. Binding writes BOTH GameplayCueTag and the AssetRegistrySearchable GameplayCueName mirror. That second field is what the cue manager actually discovers notifies by, so writing only the first produces an asset that looks correctly configured in the details panel and never fires. The mirror is read back after the write and reported as bound:true/false rather than assumed. Omit --cue-tag to derive it from the asset name using the engine's own rule (strip GC_, underscores become dots, prepend GameplayCue). The engine only ever REQUESTS an existing tag when deriving, so a missing tag would leave the notify unbound, this creates it unless --create-tag=false.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Asset name, e.g. GC_Buff_ExtraSpeed |
| path | string | No | Content path to create it in; defaults to /Game/ |
| cue_tag | string | No | Cue tag to bind to; omit to derive it from the asset name |
| notify_type | string | No | static, actor, burst or looping |
| create_tag | bool | No | Create the cue tag when it does not exist |
cfa create_gameplay_cue_notify --name GC_Buff_ExtraSpeed --path /Game/GAS/Cues/
cfa create_gameplay_cue_notify --name GC_Heal --cue-tag GameplayCue.Buff.Heal --notify-type actorlist_gameplay_cue_notifiesList cue notify assets and the tag each answers to
Lists gameplay cue notify assets with the cue tag each one answers to, read from the asset registry so a notify the editor has never opened still appears. Notifies with no cue tag at all are reported in a separate list, because those are invisible to the cue manager no matter what the asset looks like.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter | string | No | Only notifies whose cue tag contains this substring |
| max_results | int | No | Maximum notifies to return; truncation is always reported |
cfa list_gameplay_cue_notifies
cfa list_gameplay_cue_notifies --filter Buffvalidate_gameplay_cuesCross-check cue tags against notifies, both directions
Cross-checks cue tags against cue notify assets in BOTH directions, which is where cues actually break: a tag with no notify fires and produces nothing visible (warning), a notify with no tag is never discovered by the cue manager (error), and a notify bound to a tag that no longer exists is dead weight (error). Epic's own toolset reports only the first of those three. Returns verdict pass/pass_with_warnings/fail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| parent_tag | string | No | Only check cue tags under this parent |
cfa validate_gameplay_cues
cfa validate_gameplay_cues --parent-tag GameplayCue.Buffsearch_gasRanked bulk search across tags, attributes, effects and abilities
One ranked search across every gameplay tag and GAS domain: tags, cues, attributes, attribute sets, effects, abilities and gameplay effect components. Takes SEVERAL terms in a single call, "buff,protect,attack", and answers each with its own top-N list, so finding the real names of a set of things is one round trip instead of one per term. Ranking is fuzzy by default: an exact name beats a prefix, which beats a match at a tag or word boundary, which beats a plain substring, which beats a subsequence; shorter names win ties because a short name containing the term is a closer answer than a long one that merely includes it. --mode substring and --mode regex are there when you want literal control instead. Effects and abilities are read from the asset registry, so assets the editor has never opened are found without loading them. Every result carries its kind and owner, so a returned attribute name can be pasted straight into set_gameplay_effect_modifier. --under scopes tags and cues to a SUBTREE, so on a library of a hundred thousand tags you can ask what lives under Buff.Archer without listing anything else; the parent itself is included. --attribute-set does the same for attributes. Either one may be used with no --query at all, which means "show me what is in this scope", the way to explore a large library without dumping it. To create many tags at once use the batch command rather than calling add_gameplay_tag repeatedly: 100 tags in one batch is roughly 30x faster than 100 separate calls, and lands as ONE undo step. Tags and cues need no plugin; the rest needs GameplayAbilities, and when it is off the search narrows and says so rather than failing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | No | One or more terms, comma or semicolon separated; omit when using --under or --attribute-set to list a scope |
| kind | string | No | tags, cues, attributes, attribute_sets, effects, abilities, components, or all |
| top | int | No | Results per query term |
| under | string | No | Restrict tag and cue results to this subtree, e.g. Buff |
| attribute_set | string | No | Restrict attribute results to this AttributeSet |
| mode | string | No | fuzzy, substring or regex |
| explain | bool | No | Include the score and why each result matched |
cfa search_gas --query "buff,protect,attack" --top 10
cfa search_gas --under Buff.Archer --kind tags --top 20
cfa search_gas --query power --under Buff --top 5
cfa search_gas --query health --attribute-set AS_Hero --explain
cfa search_gas --query "^GameplayCue\..*Death$" --kind cues --mode regexget_ability_system_infoInspect an actor's AbilitySystemComponent
Inspects an actor's AbilitySystemComponent and reports its attribute sets and their values. Outside play the values are class defaults and the response says so explicitly, because active effects, granted abilities and owned tags only exist during PIE, reporting them as empty without that note would read as 'this actor has none' rather than 'the game is not running'. Omit --actor to use the current selection.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actor | string | No | Actor label; omit to use the selection |
| include | string | No | attributes, effects, abilities, tags or all |
cfa get_ability_system_info --actor BP_Character_1
cfa get_ability_system_info