reznok/gmcabilitysystem/gmas-upgrade
Claude Code and agent skill by reznok/gmcabilitysystem
- community
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-upgradeSKILL.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
| Signal | Where | Reads | |
|---|---|---|---|
VersionName | GMCAbilitySystem.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 header | Public/Utility/GMASBoundQueueV2.h present ⇒ 1.4+; Public/Utility/GMASBoundQueue.h present ⇒ 1.3 or older | the two never coexist | |
| the hook | this 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 module | Source/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.3 | 1.4 | What to change | |
|---|---|---|---|
Utility/GMASBoundQueue.h: TGMASBoundQueue<C, T, ClientAuth>, TGMASBoundQueueOperation<C, T>, EGMASBoundQueueOperationType, FGMASBoundQueueRPCHeader, FGMASBoundQueueAcknowledgement(s), FGMASBoundQueueOperationIdSet, FGMASBoundQueueEmptyData | the header is gone | delete 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 FInstancedStruct | nothing 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 / PreRemoteMovement | no 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 template | drop 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 component | removed; PreLocalMoveExecution() is the only pre-move hook | delete 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.3 | 1.4 | What to change | |
|---|---|---|---|
UGMCAbilityEffect* ApplyAbilityEffect(Class, Data, bool bOuterActivation = false) ("Apply Ability Effect (Legacy)"; false applied Predicted, true ServerAuth) | removed, Blueprint node included | bool 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 DeprecatedFunction | RemoveEffectByIdSafe({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 warning | RemoveEffectByTagSafe(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 grace | still declared (hidden in the editor), shares the ServerAuth case: no separate behaviour | write 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 instance | for 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) | removed | TArray<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 tags | also true with bUniqueByEffectTag or an EffectTag | runtime-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: BlueprintImplementableEvent | BlueprintNativeEvent | Blueprint 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 dead | a project that raised it by editing GMAS sets the project setting instead |
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
- SKILL.md in the repositoryCheckingClaude/gmas/skills/gmas-upgrade/SKILL.md
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
[](https://verified-skill.com/skills/reznok/gmcabilitysystem/gmas-upgrade)