reznok/gmcabilitysystem/gmas-setup

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 adding GMAS to a project or wiring a new GMC pawn or movement component to a GMC_AbilitySystemComponent, in C++ or Blueprint, including submodule install and Build.cs dependencies.

Install

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

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.

This skill gets GMAS (GMC Ability System) into a project and a first pawn wired to it, in C++ or Blueprint. The rules that govern what you build afterwards live in gmas:gmas-rules (where state lives, binding order, effects, server operations) and gmas:gmc-prediction (GMC's move cycle). GMAS paths below are relative to Source/GMCAbilitySystem/; GMC paths to the GMC plugin root.

Requirements

NeedDetail
a GMC licenseGMC (General Movement Component, GMCv2) is a paid plugin. Its source lives only in the project, under Plugins/GMC (module GMCCore); GMAS never ships it, and neither do the skills in this plugin. GMAS 1.4 is verified against GMC 2.3.x
Unreal 5.5 to 5.85.4 unverified. On 1.4.0 Public/Utility/GMASBoundQueueV2.h includes StructUtils/InstancedStruct.h without the ENGINE_MINOR_VERSION >= 5 guard the other GMAS headers carry (on 5.4 that header lives in the StructUtils plugin under a different path); 1.4.1 adds the guard
plugins enabled in .uprojectGMC and GMCAbilitySystem. GMAS's .uplugin declares GMC, StructUtils and Niagara (1.4+) as plugin dependencies, so enabling GMAS enables them: Niagara is on by default anyway; StructUtils is a real plugin on 5.4 and a deprecated shim from 5.5 that still exists in 5.8. GMC's own .uplugin pulls EnhancedInput and OnlineSubsystemSteam
GameplayTagsan engine module, not a plugin: your Build.cs lists it; the tag editor plugin GameplayTagsEditor is enabled by default
GMC controllersplayer controllers derive from AGMC_PlayerController, AI controllers from AGMC_AIController, and the game mode spawns exactly one AGMC_WorldTimeReplicator (gmas:gmc-prediction)

GMAS has two modules, GMCAbilitySystem (runtime) and GMCAbilitySystemEditor (editor), plus from 1.4.1 GMCAbilitySystemTests (UncookedOnly: the specs and test stubs, never in a cooked or Shipping game); all load at the Default phase.

Installing GMAS

Submodule (recommended: upgrades are a pointer bump, and you can read the exact tree you build against):

sh
git submodule add -b main https://github.com/reznok/GMCAbilitySystem.git Plugins/GMCAbilitySystem
git submodule update --init --recursive
  • -b main follows releases (tags v1.x.y); -b dev follows the integration branch, which the repository's docs/BRANCHING.md recipe uses and which moves daily. To pin a release: git -C Plugins/GMCAbilitySystem checkout v1.4.0, then commit the pointer. To update: git submodule update --remote Plugins/GMCAbilitySystem, rebuild, commit the pointer (gmas:gmas-upgrade).
  • Never patch inside the submodule: fix upstream, then bump the pointer. The plugin's name is GMCAbilitySystem whatever the folder is called.

Copied folder: download a release archive (or git clone --depth 1 -b v1.4.0) into Plugins/GMCAbilitySystem and drop its .git. You own updates from then on: diff against the release you copied when upgrading.

`.uproject`:

json
"Plugins": [
{ "Name": "GMC", "Enabled": true },
{ "Name": "GMCAbilitySystem", "Enabled": true }
]

`Build.cs` of every module that includes GMC or GMAS headers:

csharp
PublicDependencyModuleNames.AddRange(new string[] {
"Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayTags",
"GMCCore", "GMCAbilitySystem"
});

GMCAbilitySystem exports GMCCore, GameplayTags, GameplayTasks, EnhancedInput, StructUtils and NetCore as public dependencies (Source/GMCAbilitySystem/GMCAbilitySystem.Build.cs), so its headers compile in your module without more. List GMCCore and GameplayTags anyway: your own headers use them directly. List GameplayTasks yourself when you subclass the ability system component (a UGameplayTasksComponent) or write ability tasks. StructUtils is normally not needed on any version: on 5.5+ FInstancedStruct lives in CoreUObject (header StructUtils/InstancedStruct.h), and on 5.4 UBT propagates the module through GMAS's public dependencies; add it only if your 5.4 build complains.

Regenerate project files, build (a source plugin compiles with the project), open the editor: Edit → Plugins lists "GMAS - GMC Ability System" under the GMAS category.

C++ wiring

PieceClassNotes
pawnAGMC_Pawn (Source/GMCCore/Public/Actors/GMCPawn.h)an APawn that owns GMC's move pipeline: finds its replication component (GetReplicationComponent()), binds it from PostInitializeComponents (SetupReplicationComponent() calls BindReplicationData), and handles possession and move-state replication
convenience pawnAGMAS_Pawn (Public/Actors/GMAS_Pawn.h)AGMC_Pawn plus a capsule root, skeletal mesh, spring arm, camera, an ability system component (AbilitySystemComponent, subobject Ability Component) and an optional InputMappingContext added at priority 0. No movement component: you add yours. Purely optional
movement componentUGMC_OrganicMovementCmp (Source/GMCCore/Public/Components/GMCOrganicMovementComponent.h) for characters; UGMC_MovementUtilityCmp (GMCMovementUtilityComponent.h, same folder) for anything elseyour subclass overrides the five hooks below and forwards them
ability system component ("the ASC")UGMC_AbilitySystemComponent (Public/Components/GMCAbilityComponent.h), a UGameplayTasksComponent, replicated by defaultone per pawn. Set its GMCMovementComponent pointer (UGMC_MovementUtilityCmp*, BlueprintReadWrite) yourself before the bind. 1.4.1+ resolves a null pointer from the owner's UGMC_MovementUtilityCmp at the bind and binds nothing (Error) when there is none; 1.4.0 dereferenced it unchecked and crashed

Timing. AGMC_Pawn::PostInitializeComponents runs the bind, so your BindReplicationData_Implementation executes before any BeginPlay. The ASC reads AttributeDataAssets during the bind (InstantiateAttributes) and StartingAbilities, AbilityMaps, StartingTags in its own BeginPlay; StartingEffects go out from the server once the pawn has a controller. Fill all of them in class defaults, the constructor, or in the pawn's PostInitializeComponents before Super, identically on every machine (gmas:gmas-rules).

Movement component overrideForward to the ASC
BindReplicationData_Implementation()Super, your own Bind* calls, then GMCMovementComponent = this and BindReplicationData() as the last line
PreLocalMoveExecution_Implementation(const FGMC_Move& LocalMove)Super, then PreLocalMoveExecution()
GenPredictionTick_Implementation(float DeltaTime)Super, your predicted logic, then GenPredictionTick(DeltaTime)
GenSimulationTick_Implementation(float DeltaTime)Super, then GenSimulationTick(DeltaTime)
GenAncillaryTick_Implementation(float DeltaTime, bool bLocalMove, bool bCombinedClientMove)Super, then GenAncillaryTick(DeltaTime, bCombinedClientMove); bLocalMove is not forwarded

UGMC_OrganicMovementCmp implements four of the five itself (all but the ancillary tick), so always call Super first. Where the ASC call sits relative to your own logic inside a hook is yours to decide; keep it the same on every machine.

cpp
// MyMovementCmp.h
#pragma once
#include "Components/GMCOrganicMovementComponent.h"
#include "Components/GMCAbilityComponent.h"
#include "MyMovementCmp.generated.h"
UCLASS()
class UMyMovementCmp : public UGMC_OrganicMovementCmp
{
GENERATED_BODY()
public:
virtual void BindReplicationData_Implementation() override;
virtual void PreLocalMoveExecution_Implementation(const FGMC_Move& LocalMove) override;
virtual void GenPredictionTick_Implementation(float DeltaTime) override;
virtual void GenSimulationTick_Implementation(float DeltaTime) override;
virtual void GenAncillaryTick_Implementation(float DeltaTime, bool bLocalMove, bool bCombinedClientMove) override;
protected:
UPROPERTY(Transient) TObjectPtr<UGMC_AbilitySystemComponent> AbilitySystem;
};
// MyMovementCmp.cpp
void UMyMovementCmp::BindReplicationData_Implementation()
{
Super::BindReplicationData_Implementation();
// Your own Bind* calls go here (gmas:gmc-prediction).
AbilitySystem = GetOwner()->FindComponentByClass<UGMC_AbilitySystemComponent>();
check(AbilitySystem);
AbilitySystem->GMCMovementComponent = this; // explicit; 1.4.1+ would find it, 1.4.0 crashes without it
AbilitySystem->BindReplicationData(); // the ASC binds last
}
void UMyMovementCmp::PreLocalMoveExecution_Implementation(const FGMC_Move& LocalMove)
{
Super::PreLocalMoveExecution_Implementation(LocalMove);
AbilitySystem->PreLocalMoveExecution();
}
void UMyMovementCmp::GenPredictionTick_Implementation(float DeltaTime)
{
Super::GenPredictionTick_Implementation(DeltaTime);
// Predicted game logic that abilities depend on goes here (bound tags via MatchTagToBool).
AbilitySystem->GenPredictionTick(DeltaTime);
}
void UMyMovementCmp::GenSimulationTick_Implementation(float DeltaTime)
{
Super::GenSimulationTick_Implementation(DeltaTime);
AbilitySystem->GenSimulationTick(DeltaTime);
}
void UMyMovementCmp::GenAncillaryTick_Implementation(float DeltaTime, bool bLocalMove, bool bCombinedClientMove)
{
Super::GenAncillaryTick_Implementation(DeltaTime, bLocalMove, bCombinedClientMove);
AbilitySystem->GenAncillaryTick(DeltaTime, bCombinedClientMove);
}

The pawn adds the movement component (and, from a bare AGMC_Pawn, a root collision component plus CreateDefaultSubobject<UGMC_AbilitySystemComponent>); the pawn's root becomes GMC's updated component. Attribute data chosen at runtime (an archetype) is injected before the bind:

cpp
// MyPawn.h (includes: Actors/GMAS_Pawn.h, MyMovementCmp.h, Attributes/GMCAttributesData.h, InputAction.h;
// the .cpp adds EnhancedInputComponent.h)
UCLASS()
class AMyPawn : public AGMAS_Pawn
{
GENERATED_BODY()
public:
AMyPawn(const FObjectInitializer& Init);
virtual void PostInitializeComponents() override;
virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
protected:
void OnDash(const FInputActionInstance& Instance);
UPROPERTY(VisibleAnywhere) TObjectPtr<UMyMovementCmp> Movement;
UPROPERTY(EditDefaultsOnly) TObjectPtr<UGMCAttributesData> Attributes;
UPROPERTY(EditDefaultsOnly) TObjectPtr<UInputAction> DashAction;
};
// MyPawn.cpp
AMyPawn::AMyPawn(const FObjectInitializer& Init) : Super(Init)
{
Movement = CreateDefaultSubobject<UMyMovementCmp>(TEXT("Movement"));
}
void AMyPawn::PostInitializeComponents()
{
if (Attributes) { AbilitySystemComponent->AttributeDataAssets.AddUnique(Attributes); } // same asset everywhere
Super::PostInitializeComponents(); // GMC binds in here
}

Blueprint wiring

The same five events, in the movement component Blueprint (a child of GMC_OrganicMovementCmp), with the ASC on the character. Step by step with screenshots: https://github.com/reznok/GMCAbilitySystem/wiki/Getting-Started (the wiki is stale: since 1.0 the tag-to-class rows live in GMCAbilityMapData assets, below, not in an editable map, and its Ability.Jump map key and activation tag are an Input.* tag today).

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 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-setup/badge)](https://verified-skill.com/skills/reznok/gmcabilitysystem/gmas-setup)

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