reznok/gmcabilitysystem/gmas-effect

Claude Code and agent skill by reznok/gmcabilitysystem

Trust tier 3
  • community
Source check pending

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-effect

SKILL.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:

FieldDefaultMeaning
EffectType (EGMASEffectType)InstantInstant: 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
Duration0 (infinite)seconds from the start (after Delay); EndEffect fires in the tick where ActionTimer >= StartTime + Duration. Ignored by Instant
Delay0seconds 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)
PeriodicInterval1.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
bPeriodicFirstTicktrueapply once at start, then at every boundary
bNegateEffectAtEndfalseTicking / Persistent / Periodic only: modifiers become temporal entries layered on Value and vanish at the end, instead of permanent writes to RawValue
bReevaluateConditionsWhilePersistent (1.4+)falsePersistent 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
PauseEffectemptywhile 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+)
ClientGraceTime0 (= project default)the bilateral defer window for removing a Ticking / Periodic effect (live on 1.4.1+); see the queue-type section

Tags:

FieldDefaultMeaning
EffectTagnoneidentity for queries, removal by tag and uniqueness; optional but use it (Effect.Buff.Haste)
GrantedTagsemptyadded to the bound ActiveTags at start, removed at end (to the unbound client-auth container for ClientAuth effects, 1.4+). Useless on Instant
bPreserveGrantedTagsIfMultipletrue (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+)falsereject 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, ApplicationMustNotHaveTagsemptychecked once at start: at least one of the must-have tags, none of the must-not
MustHaveTags, MustNotHaveTagsemptythe same test at start and every tick: failing ends the effect
EffectDefinition, ActivationQuery, MustMaintainQuery, EndAbilityOnActivationQuery, EndAbilityOnEndQueryemptyEffectDefinition 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:

FieldMeaning
GrantedAbilitiesinput 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, CancelAbilityOnEndCancelAbilitiesByTag 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):

HookWhenTypical use
StartEffect() (C++ virtual, protected) → StartEffectEvent() (BlueprintNativeEvent)after the application checks, tags, abilities and the first modifierscosmetics 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 applicationpolling a bound value, timers kept in CurrentDuration
AttributeDynamicCondition() ("Dynamic Condition", BlueprintNativeEvent, default true)every tick, before applying modifiersskip 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 applicationa 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 runcosmetics 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 typeWho callsWho applies, whenWhat the client seesOn a server reject
Predictedthe 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 agreeits 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 verdictnot 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
PredictedQueuedanywhereas 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 tickthe 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
ServerAuthserver 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 ServerAuthnothing: 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 containerits own instance; nothing is validatednone

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

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
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/reznok/gmcabilitysystem/gmas-effect/badge)](https://verified-skill.com/skills/reznok/gmcabilitysystem/gmas-effect)

Something wrong with this skill or its page? Tell us.