reznok/gmcabilitysystem/gmas-upgrade

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 moving a project to a newer GMAS (for example 1.3 to 1.4, or 1.4 to 1.4.1) or when a build breaks after updating the GMAS submodule.

Install

npx vskill@latest install reznok/gmcabilitysystem/gmas-upgrade

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.

A GMAS upgrade is three jobs: data that silently changes meaning (clamps, flipped defaults), code that stops compiling (the bound queue, apply signatures, removed forwarders), and behaviour that compiles but acts differently (activation tick, tag preservation, timing). The tables below are built from the public header diff between the two release tags and the release notes; every old/new pair was checked against git show v1.3.0:<path> and the 1.4 headers. GMAS paths are relative to Source/GMCAbilitySystem/. The rules the new behaviour follows live in gmas:gmas-rules; the install mechanics in gmas:gmas-setup.

Find the installed generation

SignalWhereReads
VersionNameGMCAbilitySystem.uplugin at the plugin root"1.3", "1.4"; release tags are v1.3.0, v1.4.0 (git -C Plugins/GMCAbilitySystem describe --tags for a submodule)
the queue headerPublic/Utility/GMASBoundQueueV2.h present ⇒ 1.4+; Public/Utility/GMASBoundQueue.h present ⇒ 1.3 or olderthe two never coexist
the hookthis plugin's SessionStart hook prints VersionName and 1.4+ bound queue V2 or pre-1.4: bound queue V1 for the GMAS it finds under Plugins/
the test moduleSource/GMCAbilitySystemTests/ present ⇒ 1.4.1+ (VersionName stays "1.4" for patch releases)git -C Plugins/GMCAbilitySystem describe --tags names the patch

Everything the other gmas:* skills tag (1.4+) applies only after the move; a dev checkout between tags is "1.4+" with unreleased changes on top (git -C Plugins/GMCAbilitySystem log --oneline v1.4.0..HEAD -- Source/GMCAbilitySystem/Public).

1.3 → 1.4

Access is the C++ visibility on the 1.3 header; private virtual members were overridable from an ability-system-component subclass, so they are listed.

Bound queue (Public/Utility/, Public/Components/GMCAbilityComponent.h):

1.31.4What to change
Utility/GMASBoundQueue.h: TGMASBoundQueue<C, T, ClientAuth>, TGMASBoundQueueOperation<C, T>, EGMASBoundQueueOperationType, FGMASBoundQueueRPCHeader, FGMASBoundQueueAcknowledgement(s), FGMASBoundQueueOperationIdSet, FGMASBoundQueueEmptyDatathe header is gonedelete the include and every template instantiation. Game code should not touch the queue: QueueAbility, ApplyAbilityEffect*, AddImpulse, FireCustomEvent on the component are the API
–Utility/GMASBoundQueueV2.h: one untemplated FGMASBoundQueueV2 per component (BoundQueueV2, private). Utility/GMASBoundQueueV2_Operations.h: one USTRUCT per operation deriving from FGMASBoundQueueV2OperationBaseData (…AbilityActivationOperation, …ApplyEffectOperation, …RemoveEffectOperation, …AddImpulseOperation, …SetActorLocationOperation, …CustomEventOperation, …AcknowledgeOperation, batch and client-auth variants), carried as FInstancedStructnothing to write; the struct names matter only to a component subclass overriding ProcessOperation (below)
the component's queues QueuedAbilityOperations, QueuedEffectOperations, QueuedEffectOperations_ClientAuth, QueuedEventOperations (private) with the template's GetQueuedOperations, GetQueuedRPCOperations, Num, NumMatching, GetOperationById, BindToGMC, PreLocalMovement / PreRemoteMovementno public equivalent (BoundQueueV2.OperationQueue, ClientQueuedOperations, GetPayloadByID are reachable only through GetBoundQueueV2ForTest() under WITH_AUTOMATION_WORKER); the private helpers around them (ClientQueueOperation, ClientHandlePendingOperation, ServerHandlePendingEffect, RPCClientQueueEffectOperation) went with the templatedrop the inspection; diagnose with GMAS.LogApplyTrace and the [ProcessOp], [AckTrace:Client:GenTick], [AckTrace:Server:ProcessAck] lines (gmas:gmas-debug)
CreateEffectOperation(…), CreateSyncedEventOperation(…) (public)removed (two commented-out declarations remain)ApplyAbilityEffect with a queue type; FireCustomEvent
overridable ProcessOperation(const TGMASBoundQueueOperation<UGMCAbilityEffect, FGMCAbilityEffectData>&), ProcessOperation(const TGMASBoundQueueOperation<UGMASSyncedEvent, FGMASSyncedEventContainer>&) (private virtual)virtual bool ProcessOperation(FInstancedStruct OperationData, bool bFromMovementTick = true, bool bForce = false), virtual void ProcessEffectApplicationFromOperation(const FGMASBoundQueueV2ApplyEffectOperation&), virtual void ServerProcessOperation(const FInstancedStruct&, bool), virtual void ServerProcessAcknowledgedOperation(int, bool) (private virtual)re-implement on the instanced struct (OperationData.GetScriptStruct() == FGMASBoundQueueV2AddImpulseOperation::StaticStruct(), then GetPtr<T>()) and call Super: the base handles acknowledgements, batches and the consumed-activation guard
PreRemoteMoveExecution() (public, BlueprintCallable), forwarded by the movement componentremoved; PreLocalMoveExecution() is the only pre-move hookdelete the forwarder line (or Blueprint node) in UMyMovementCmp; the five remaining hooks are listed in gmas:gmas-rules
CheckRemovedEffects(), ActiveEffectsData (ReplicatedUsing = OnRep_ActiveEffectsData), the members EffectStatePrediction and QueuedEffectStates (private)the members are gone (the FEffectStatePrediction struct is still declared, unused); predicted effects are validated against the bound active-effect ids (FGMASActiveEffectIDsState) and reconnecting clients rehydrate from FGMCEffectSnapshot. TickActiveEffects(float) and ProcessAttributes(bool) survive and are public now (the specs drive them)nothing to call; code that read ActiveEffectsData reads GetActiveEffects()

Effects (Public/Components/GMCAbilityComponent.h, Public/Effects/GMCAbilityEffect.h):

1.31.4What to change
UGMCAbilityEffect* ApplyAbilityEffect(Class, Data, bool bOuterActivation = false) ("Apply Ability Effect (Legacy)"; false applied Predicted, true ServerAuth)removed, Blueprint node includedbool ApplyAbilityEffect(Class, Data, QueueType, int& OutEffectHandle, int& OutEffectId, UGMCAbilityEffect*& OutEffect), ApplyAbilityEffectSafe(…, bool& OutSuccess, …, UGMCAbility* HandlingAbility = nullptr) or ApplyAbilityEffectShort(Class, QueueType, HandlingAbility); keep OutEffectId or the EffectTag for removal (gmas:gmas-effect)
OutEffectHandle was a separate handle; RemoveActiveAbilityEffectByHandle(Handle, QueueType), RemoveEffectByHandle(Handle, QueueType)OutEffectHandle is an alias of OutEffectId; both *ByHandle removers are UE_DEPRECATED(5.7, …) and DeprecatedFunctionRemoveEffectByIdSafe({Id}, QueueType)
RemoveEffectByTag(Tag, Num, bOuterActivation), RemoveEffectById(Ids, bOuterActivation) ("Legacy")unchanged since 1.3: still compile, DeprecatedFunction for Blueprint only, no UE_DEPRECATED, so C++ emits no warningRemoveEffectByTagSafe(Tag, Num, QueueType), RemoveEffectByIdSafe(Ids, QueueType) with the queue type the apply used; grep for the callers yourself
EGMCAbilityEffectQueueType::ServerAuthMove: the server queued the operation into the move cycle with the effect's ClientGraceTime as RPC gracestill declared (hidden in the editor), shares the ServerAuth case: no separate behaviourwrite ServerAuth; the operation grace is QueueServerOperation's 1 s (Public/Utility/GMASBoundQueueV2.h), 0 for targets without a client
–ServerInstantAttribute (1.4+): server-only, applied in the current server tick, Instant attribute-only effects, no client instancefor damage and other server-owned stats on unbound attributes (gmas:gmas-rules); never for an attribute predicted logic reads
GetActiveEffectsByTag(FGameplayTag, bool), GetFirstActiveEffectByTag(FGameplayTag), RemoveActiveAbilityEffectByTag(FGameplayTag, QueueType, bool)const FGameplayTag&plain calls compile; re-bind function pointers and delegates
FGMCAbilityEffectData::operator== (compared StartTime and EndTime)removedTArray<FGMCAbilityEffectData>::Contains / Find / AddUnique and == on the struct stop compiling: compare EffectID or EffectTag yourself
FGMCAbilityEffectData::IsValid() true only with modifiers, tags, abilities or must-have / must-not tagsalso true with bUniqueByEffectTag or an EffectTagruntime-built data start from UGMCAbilityEffect::GetDefaultEffectData(Class) (1.4+); a struct carrying only a tag is now "complete" data, not a request for the class defaults
void EndEffect() (BlueprintCallable, non-virtual)virtual void EndEffect()a subclass that declared its own EndEffect() now overrides it and is called from the component: add override and call Super::EndEffect(), or rename
StartEffectEvent, EndEffectEvent: BlueprintImplementableEventBlueprintNativeEventBlueprint graphs keep their event nodes; C++ may override StartEffectEvent_Implementation
ClientEffectApplicationTimeout (private field, 1 s)UGMASNetworkTimingSettings::ClientEffectApplicationTimeout (0.5 s, Public/Settings/GMASNetworkTimingSettings.h; Project Settings → GMC Ability System → Network Timing, DefaultGame.ini); the field left on the component is deada project that raised it by editing GMAS sets the project setting instead
cpp
// 1.3: the bool chose the queue.
UGMCAbilityEffect* Burn = ASC->ApplyAbilityEffect(UMyEffect_Burn::StaticClass(), Data, /*bOuterActivation=*/true);
// 1.4: a queue type and out parameters; keep Id for RemoveEffectByIdSafe.
int Handle = -1, Id = -1; UGMCAbilityEffect* Burn = nullptr;
ASC->ApplyAbilityEffect(UMyEffect_Burn::StaticClass(), Data, EGMCAbilityEffectQueueType::ServerAuth, Handle, Id, Burn);

Abilities, tasks and the component (Public/Components/GMCAbilityComponent.h, Public/Ability/GMCAbility.h, Public/Ability/Tasks/GMCAbilityTaskBase.h):

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

Refreshed 30 Oct 2026, 9 days ago.

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-upgrade/badge)](https://verified-skill.com/skills/reznok/gmcabilitysystem/gmas-upgrade)

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