Combat and Arts¶
All · 15 min · No code
Problems with Arts, cooldowns, hit feedback and the abilities you write yourself. For the model behind them, read Arts and Combat loop.
Using one Art puts another Art on cooldown too¶
Why: an Art's cooldown is identified by its Cooldown Tag. Two Arts with the same tag share one cooldown. This almost always happens because the new Art was made by duplicating another one and the tag came along with the copy.
The editor catches this. Saving an Art definition, or right-clicking it and choosing Asset Actions › Validate Assets, fails with "Cooldown Tag ... is also used by .... Arts sharing a tag share one cooldown", naming the other Arts. The check runs only when the asset is saved or validated, so an asset that never was can still carry a shared tag.
Fix:
- Open each Art definition named in the error and check Cooldown Tag.
- Give every Art its own tag, for example
Cooldown.MyGame.Art.StoneCleave, in your own tag file. - If you made a base Art by duplicating a finished one, clear the base's specifics (cooldown tag, effects, montage) so its children must set their own.
Avoid it next time: Create an attack art.
An Art never goes on cooldown and can be used again straight away¶
Why: one of three things:
- Cooldown Duration is
0. Zero means no cooldown, which is meant only for Talent Arts. - The Art definition has a duration but no Cooldown Tag. The cooldown is applied, but nothing
can see it, so the Art reads as ready. Saving the definition reports this as an error
("CooldownDuration is set but CooldownTag is not") whenever the duration is above zero at any
level, and at runtime it logs a warning:
<art> has a cooldown of <n>s but its art definition names NO CooldownTag. - It is your own ability Blueprint, and its graph never calls Commit Ability. A cooldown effect set on an ability does nothing on its own: the commit is the only thing that applies it. The shared Art ability and the auto-attack both commit; an ability you write from scratch must too.
Fix: set a duration and a unique Cooldown Tag on the Art definition. In your own ability's graph, call Commit Ability right after Event ActivateAbility, and end the ability if it returns false.
Avoid it next time: Create an attack art.
An Art plays no animation and its effect lands at once¶
Why: the Art definition has no Montage. That is allowed: with no montage the Art applies its effect the moment it is used and ends. Saving the definition shows a warning, "No Montage - the art plays no animation", not an error, so it is easy to miss.
Fix: set Montage on the Art definition, unless an instant Art is what you want.
Avoid it next time: Create an attack art.
An Art starts and stops on its first frame, with no hit¶
Fails silently
The Art goes on cooldown, nothing plays and no damage lands. Nothing is logged.
Why: the Art's Montage is the same asset as the auto-attack's swing. When an Art starts, the auto-attack stops its own montage by asset, and that stops the Art's montage too.
Fix: duplicate the clip's montage under the Art's own name and set that on the Art definition. Never point an Art at an auto-attack montage asset.
Avoid it next time: Create an attack art.
After an Art or a custom action, my character is frozen in place for good¶
Fails silently
The character stops responding to movement and nothing is logged.
Why: while an Art runs, it holds Gameplay.MovementStopped, and the tag goes away only when
the ability ends. If your own ability plays a montage with Play Montage and Wait and leaves
Allow Interrupt After Blend Out off, a montage interrupted during its blend-out reports
neither completed nor interrupted. The ability never ends, and the character keeps the tag.
The same happens if your ability adds a tag with Add Loose Gameplay Tags and some exit path (cancel, interrupt) never removes it.
Fix:
- Tick Allow Interrupt After Blend Out on every Play Montage and Wait that ends the ability.
- Bind On Completed, On Blend Out, On Interrupted and On Cancelled, and end the ability from each.
- Prefer Activation Owned Tags over loose tags: they are removed automatically when the ability ends. If you must add a loose tag, remove it in On End Ability, which runs on every exit.
Avoid it next time: Create an attack art.
After a fight my character can't turn, or keeps playing sideways and backwards walks¶
Fails silently
It looks like an animation problem. No animation asset is involved.
Why: three flags decide whether a character turns to face where it moves: Orient Rotation to Movement, Use Controller Rotation Yaw and Use Controller Desired Rotation. Target mode, the auto-attack and Arts each switch these off for a while. If your own ability saves "the current value" and restores it later, it can save another system's temporary value and write it back after that system has finished. The character is then left unable to turn, and the movement blend space plays its side and back clips forever.
Fix: never save and restore these flags yourself. Call Suppress Self Rotation to switch
them off and Restore Self Rotation to put them back (both in XenoCoreLocomotionStatics, under
XenoCore › Locomotion). The restore reads the values your pawn Blueprint was authored with, so
whichever system restores last is still right. Restore on every exit path, including cancel.
Avoid it next time: Subclass a mechanic.
A tag list I set on an ability Blueprint lost the tags the C++ class adds¶
Fails silently
The Blueprint shows exactly the tags you typed, which looks correct. The loss is invisible.
Why: when a Blueprint sets a list (an array or a tag container) that its C++ parent class already fills, the Blueprint's list replaces the parent's. It does not merge. For example, the flinch ability's C++ parent blocks the flinch while an Art is executing or a weapon is being drawn. A hit-react Blueprint that sets its own Activation Blocked Tags drops both, and flinches start interrupting Arts and weapon draws.
The same applies to Activation Owned Tags, Ability Tags and any other array a base class fills.
Fix:
- In the Blueprint, click the reset arrow next to the property to see what the class supplies, or compare the Blueprint's Class Defaults with its parent's.
- If you override the list, restate every tag the parent had, then add yours.
For a hit-react Blueprint that means
Status.XenoCore.ArtExecutingandStatus.XenoCore.Arming.
Topple and Daze reactions are deliberately not blocked on the base
The player's Topple and Daze abilities activate because their reaction tag was added. If the base class blocked those tags, each would refuse to start. That is why the flinch Blueprint lists them itself.
Avoid it next time: Subclass a mechanic.
My healing Art plays a blade trail, hit sounds or a hit reaction¶
Why: it was built from damage parts. An attack montage carries a melee-hit notify and a weapon trail; a damage gameplay cue plays hit sounds and a flinch. Emptying a cue's effect list removes the particles but not the sounds its graph plays.
Fix:
- Give the heal its own montage, with no notifies. An upper-body slot keeps the legs moving.
- Use a heal effect with its own heal cue, not a copy of a damage cue.
- Set Effect Type to heal on the Art definition.
Avoid it next time: Create a healing or support art.
Hits land but there's no camera shake or controller rumble¶
Why: one of three:
- You are on keyboard. Rumble is gamepad-only, and Lyra switches it off unless the active input type is Gamepad and the player's force-feedback setting is on.
- The shake is played by a cue that a gameplay effect triggers. Such a cue has no player
controller to shake, so camera shake and rumble silently do nothing. Particles and numbers still
work, which hides the problem. XenoCore's
GCN_XenoCore_Hitis invoked directly by the attack ability, on whichever side has a local player controller. - The cue is never found (next entry).
Fix: test on a gamepad. To force rumble while testing, run LyraPC.ShouldAlwaysPlayForceFeedback 1
in the console. Trigger your own shake the same way the auto-attack does: executed directly by the
ability, not through the damage effect.
Avoid it next time: Add hit feedback.
Hit numbers or hit sounds are missing¶
Fails silently
Sparks and blood decals still play, so the hit looks as if it landed normally. Nothing is logged.
Why: the number, the hit-confirm sound and the kill sound are drawn by XenoCore's damage cue,
GameplayCues/GCNL_XenoCore_DamageTaken (XenoCore's own copy of Lyra's, which knows XenoCore's attackers
are characters and that allies' hits count). It plays only when the damage effect carries the cue tag
GameplayCue.XenoCore.DamageTaken. Lyra's own GCNL_Character_DamageTaken cannot draw these hits.
| What you see | Likely cause |
|---|---|
| No number and no hit sound on hits from your own damage effect, while the sample's hits work | The effect fires GameplayCue.Character.DamageTaken (Lyra's), not GameplayCue.XenoCore.DamageTaken |
| No number on any hit | GCNL_XenoCore_DamageTaken was moved out of XenoCore/Content/GameplayCues, or deleted |
| CRITICAL HIT! shows, but the number is the normal colour | Same as the first row: Lyra's cue does not hear about XenoCore's critical hits |
Fix: open the damage effect, and in its Gameplay Cues section add an entry to Gameplay
Cues and set its Gameplay Cue Tags to GameplayCue.XenoCore.DamageTaken. Simplest is to duplicate Battle/Attributes/GE_XenoCore_Damage
for every new damage effect. If the cue asset itself is missing, restore it from your XenoCore download.
My new gameplay cue never plays¶
Fails silently
The cue asset looks correct and nothing is logged.
Why: cues are only found in folders registered with the cue manager. The registered folders are
XenoCore/Content/GameplayCues and the project's own Content/GameplayCues and
Content/GameplayCueNotifies. A cue saved anywhere else is never loaded.
Fix: save your cues under Content/GameplayCues/MyGame/. If you keep them in a Game Feature
plugin of your own, open that plugin's Game Feature Data asset (the one named after the plugin, at
its content root) and add an Add Gameplay Cue Path action. Paths are relative to the plugin's
content root: /GameplayCues, not the full /MyPlugin/... path.
Avoid it next time: Add hit feedback.
My code can't find an ability the character definitely has¶
Fails silently
The lookup returns nothing and logs nothing.
For programmers and advanced Blueprints.
Why: Find Ability Spec From Class compares classes for exact equality. Every granted ability in XenoCore is a Blueprint child, so asking for the C++ parent class matches nothing.
Fix: find abilities by tag instead. For the current target, use Get Current Target or
Get Target Mode Ability from XenoCoreTargetingStatics. For your own abilities, give each an
Ability Tags entry and search the granted specs for it.
Avoid it next time: Subclass a mechanic.
A tag-relationship row doesn't block my ability¶
Why: XenoCore blocks abilities during states such as looting or dialogue with rows in
Game/TagRelationships_XenoCore. Two things make a row miss:
- The ability is a plain Gameplay Ability, not a Lyra Gameplay Ability. Only Lyra's ability class reads the mapping.
- The ability has no Ability Tags. Rows match on ability tags, so an ability with none cannot be reached by any row.
Fix: base your ability on LyraGameplayAbility (or a XenoCore ability), and give it an
ability tag. A row keyed on a parent tag, such as Ability.XenoCore.Art, covers every child tag,
including Arts you add later.
Avoid it next time: Subclass a mechanic.
A skill for a new percentage stat makes it 100 %¶
Fails silently
You added a new stat channel to GE_XenoCore_SkillStats for an attribute that stores a 0–1
fraction, and the first point of a skill or trait maxes the stat out.
Why: skill data uses whole percentages (a trait of +2 means +2 %). The conversion to a 0–1 fraction is applied only to Critical Rate and Block Rate, so on any other fractional attribute +2 lands as +2.0, which the attribute clamps to 100 %.
Fix: store your stat as a whole percentage and convert where it is read. The list of fraction
stats is fixed in C++, so adding yours to it needs a programmer (AddStat in
XenoCoreProgressionComponent_Skills.cpp). The Skills screen shows a "%" after any stat whose tag
ends in Rate, so name the tag to match.
Avoid it next time: Skills.
The God cheat doesn't stop the player taking damage¶
Why: Lyra's God command gives god mode to the player state's ability system. XenoCore
characters carry their own ability system on the pawn, so the command changes nothing.
Fix: to keep a character alive while testing, add the Gameplay.DamageImmunity tag to the
pawn's ability system (Lyra's health set honours it), for example with Add Loose Gameplay Tags
on the pawn's ability system component from a debug Blueprint.