reznok/gmcabilitysystem/gmas-effect
Claude Code and agent skill by reznok/gmcabilitysystem
- community
Checking that the SKILL.md file is still in the repository.
Use when creating or modifying a UGMCAbilityEffect or FGMCAbilityEffectData - duration and periodic settings, granted tags, modifiers and conditions, queue type, runtime-built effects, removal.
Install
npx vskill@latest install reznok/gmcabilitysystem/gmas-effectSKILL.md
Behavior below was verified against GMC 2.3.x and GMAS 1.4. Confirm signatures in this project's own headers (paths are relative to each plugin's root, e.g.Source/GMCCore/Public/Components/GMCReplicationComponent.h); GMC's source is not part of this plugin.
An effect is the only sanctioned way to change what a UGMC_AbilitySystemComponent ("the ASC") owns: attributes, active tags, granted abilities. A UGMCAbilityEffect (Public/Effects/GMCAbilityEffect.h) is a class whose defaults carry one FGMCAbilityEffectData; applying it duplicates the class default object, initialises the copy with that data (or data you built at runtime) and registers it in the ASC's ActiveEffects. Active effects tick inside GenPredictionTick (TickActiveEffects, after the abilities, before ProcessAttributes recalculates attribute values) on every machine that runs the move, replays included. Which queue type reaches which machine and the server-operation funnel are in gmas:gmas-rules; modifier arithmetic and layering in gmas:gmas-attribute; costs and effects owned by an ability in gmas:gmas-ability. Seven worked effects: references/recipes.md. GMAS paths below are relative to Source/GMCAbilitySystem/.
Anatomy
FGMCAbilityEffectData, timing:
| Field | Default | Meaning | |
|---|---|---|---|
EffectType (EGMASEffectType) | Instant | Instant: modifiers once, ends in the same call. Persistent: modifiers once at start, lives until Duration or removal. Ticking: modifiers every prediction tick scaled by the tick's delta (values are per second). Periodic: the whole modifier value once per PeriodicInterval | |
Duration | 0 (infinite) | seconds from the start (after Delay); EndEffect fires in the tick where ActionTimer >= StartTime + Duration. Ignored by Instant | |
Delay | 0 | seconds before StartEffect: no tags, abilities or modifiers until then. 1.4.1+: no TickEvent, no duration and no ongoing tag checks either (1.4.0 already ran TickEvent and counted CurrentDuration below 0) | |
PeriodicInterval | 1.0 (min 0.1) | period in seconds, anchored on the start time: boundaries are detected statelessly from ActionTimer and the tick's delta, so a replay recounts the same crossings | |
bPeriodicFirstTick | true | apply once at start, then at every boundary | |
bNegateEffectAtEnd | false | Ticking / Persistent / Periodic only: modifiers become temporal entries layered on Value and vanish at the end, instead of permanent writes to RawValue | |
bReevaluateConditionsWhilePersistent (1.4+) | false | Persistent with negate: re-resolve every modifier's Conditions each tick, dropping and re-adding its single entry, so a buff toggles with tags without re-applying | |
PauseEffect | empty | while the owner has any of these tags, no modifier applications; Duration keeps running and periodic boundaries crossed meanwhile are dropped (logged at Verbose, 1.4+) | |
ClientGraceTime | 0 (= project default) | the bilateral defer window for removing a Ticking / Periodic effect (live on 1.4.1+); see the queue-type section |
Tags:
| Field | Default | Meaning | |
|---|---|---|---|
EffectTag | none | identity for queries, removal by tag and uniqueness; optional but use it (Effect.Buff.Haste) | |
GrantedTags | empty | added to the bound ActiveTags at start, removed at end (to the unbound client-auth container for ClientAuth effects, 1.4+). Useless on Instant | |
bPreserveGrantedTagsIfMultiple | true (1.4+; false before) | at end, keep each granted tag that any other live effect still grants (1.4+; before, only a sibling with the same EffectTag counted). The containers are set-like, so without it the first of two granters to end strips the tag | |
bUniqueByEffectTag (1.4+) | false | reject the apply while an effect with the same exact EffectTag is alive; replace semantics in its deferred-end window (reachable on 1.4.1+), see below | |
ApplicationMustHaveTags, ApplicationMustNotHaveTags | empty | checked once at start: at least one of the must-have tags, none of the must-not | |
MustHaveTags, MustNotHaveTags | empty | the same test at start and every tick: failing ends the effect | |
EffectDefinition, ActivationQuery, MustMaintainQuery, EndAbilityOnActivationQuery, EndAbilityOnEndQuery | empty | EffectDefinition describes the effect for query-based removal (RemoveEffectsByQuery); the two queries gate start and life against the owner's tags (1.4.1+: MustMaintainQuery is also checked at start, so an effect that would end on its first tick is refused instead); the two EndAbility* queries (editor names Cancel Abilities On Activation / On End Via Definition Query, 1.4.1+) cancel active abilities whose definition tags match on their next tick (1.4.1+; a pending natural end on 1.4.0) |
Abilities and chains:
| Field | Meaning | |
|---|---|---|
GrantedAbilities | input tags (ability-map keys) granted at start (GrantAbilityByTag) and removed at end. 1.4.1+: a tag another live effect still grants is kept (with bPreserveGrantedTagsIfMultiple); a tag granted directly with GrantAbilityByTag is not protected. On 1.4.0 the first of two granters to end removed it | |
CancelAbilityOnActivation, CancelAbilityOnEnd | CancelAbilitiesByTag on each entry at start / at end (1.4.1+: a cancel, no end event, no chain window; EndAbilitiesByTag, a natural end, on 1.4.0). Hierarchical match on the ability's AbilityTag | |
ApplyEffectOnEnd, RemoveEffectOnEnd (1.4+) | at end, apply these classes / remove every effect with these tags, Predicted inside a move or the ancillary tick (or standalone), otherwise PredictedQueued |
Modifiers: Modifiers, an array of FGMCAttributeModifier (next section). Networking and runtime (not editable): bServerAuth exempts a client instance from the confirmation timeout (the ServerAuth path marks its instances Validated instead; AddSynchronizedTag sets the flag); bClientAuth (1.4+) is set by the ClientAuth path; EffectID, StartTime, EndTime, CurrentDuration, SourceAbilityComponent, OwnerAbilityComponent are filled when the effect is applied.
Class hooks on UGMCAbilityEffect (all run inside the move, on the owner and the server, replays included):
| Hook | When | Typical use | |
|---|---|---|---|
StartEffect() (C++ virtual, protected) → StartEffectEvent() (BlueprintNativeEvent) | after the application checks, tags, abilities and the first modifiers | cosmetics on live moves, bookkeeping. StartEffect is the whole start: override the event, not it | |
TickEvent(float DeltaTime) ("Effect Tick", BlueprintNativeEvent) | every effect tick, before the ongoing tag checks and modifier application | polling a bound value, timers kept in CurrentDuration | |
AttributeDynamicCondition() ("Dynamic Condition", BlueprintNativeEvent, default true) | every tick, before applying modifiers | skip this tick's application (a drain only while moving) without ending the effect; periodic boundaries crossed while it is false are dropped | |
PeriodTickEvent() ("Period Tick", BlueprintNativeEvent) | once per tick in which a periodic boundary was crossed, after its modifiers; not for the bPeriodicFirstTick application | a per-period cue | |
OnAttributeModifierApplication(const FGMCAttributeModifier&) (C++ virtual, 1.4+) → K2_OnAttributeModifierApplication when bCallOnAttributeModifierApplication (class default, false) | after each ApplyAbilityAttributeModifier the effect makes, with the resolved copy (MetaTags, ActionTimer, DeltaTime filled) | damage-type reactions; the recalculated Value is visible only after ProcessAttributes later in the tick | |
EndEffect() (C++ virtual, BlueprintCallable; an intended override point, call Super) → EndEffectEvent() (BlueprintNativeEvent) | after temporal modifiers are dropped, abilities cancelled, tags and grants removed; then the chain fields run | cosmetics on live moves. Idempotent: bCompleted. It can run without a preceding StartEffectEvent (a listener removed the effect inside OnEffectApplied): free only what the start event allocated |
The ASC broadcasts OnEffectApplied / OnEffectRemoved (dynamic delegates) from the same points, replays included: presentation guards itself with !IsReplayingForGMASLogic() (1.4+; CL_IsReplaying() on the movement component before). OnEffectApplied fires after tags and abilities are granted and before the first modifiers are applied; on 1.4.1+ the instance already has its id and is queryable there.
Choosing the queue type
EGMCAbilityEffectQueueType (Public/Components/GMCAbilityComponent.h) is a parameter of the apply call, not of the effect. The full table of what each queue reaches is in gmas:gmas-rules; what matters when authoring:
| Queue type | Who calls | Who applies, when | What the client sees | On a server reject | |
|---|---|---|---|---|---|
Predicted | the same predicted logic on the owning client and the server, inside the move (or the ancillary tick; no runtime check on apply) | each machine at once; ids derive from ActionTimer, so both sides agree | its own instance immediately, Pending until the id shows up in the bound active-effect ids (1.4+), then Validated. The client writes its own id into that list, so it is normally Validated on its next tick, before any server verdict | not a rollback: the next correction restores the bound attributes and the replay purges temporal entries, but the client instance may keep running until the server ends it. ClientEffectApplicationTimeout (0.5 s, Public/Settings/GMASNetworkTimingSettings.h) only reaps an instance still Pending, which is rare; design so the server agrees | |
PredictedQueued | anywhere | as Predicted inside a move or the ancillary tick; outside, buffered per machine in PendingPredictedOperations and drained at the start of the next prediction or ancillary tick | the same, one tick later. A buffered apply returns true, the id it reserved (1.4.1+; -1 on 1.4.0) and no instance; a rejection inside a move returns false (1.4.1+) | as Predicted | |
ServerAuth | server only (a client call returns false silently) | the server reserves an id in its own range, the owning client receives the operation by RPC and applies it in the move that carries it, the server applies it when it processes that move; no acknowledgement → forced on the server after ServerOperationGraceSeconds (1 s; a setting on 1.4.1+); targets without an autonomous client get it on their next ancillary tick (1.4+) | the instance about one round trip after the server call, already Validated; a replay re-processes the operation idempotently (1.4+) | not applicable | |
ServerInstantAttribute (1.4+) | server only (Error + false on a client) | immediately in the current server tick, outside the move; Instant effects with no Delay whose class and inline data carry no GrantedTags, GrantedAbilities, CancelAbilityOn*, EndAbilityOn*Query, ApplyEffectOnEnd or RemoveEffectOnEnd (1.4.1+; 1.4.0 tested only the type, tags and abilities), otherwise an Error and a fallback to ServerAuth | nothing: no client instance; the modifiers arrive through the attribute's own replication (an unbound attribute) | not applicable | |
ClientAuth (hidden) | the owning client, for classes in ClientAuthorizedAbilityEffects (1.4+; Warning + false otherwise) | the client at once (Validated on the spot) and the server through the bound queue; granted tags go to the unbound client-auth container | its own instance; nothing is validated | none |
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingClaude/gmas/skills/gmas-effect/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/reznok/gmcabilitysystem/gmas-effect)