Quick answer: Set the ability’s CooldownGameplayEffectClass. Apply the cooldown via ApplyCooldown(). Configure AbilitySystemComponent with SetReplicationMode(Mixed) on player characters.

A multiplayer hero uses a Q ability with a 10s cooldown. Server’s cooldown tag tracks correctly; client UI says “ready” immediately and the player can try to spam the ability. The cooldown isn’t making it across the network.

GAS Cooldown Pipeline

Cooldowns are GameplayEffects with a duration. When an ability activates:

  1. Ability calls CommitAbility or ApplyCooldown.
  2. The Cooldown GE is applied to the owning ASC.
  3. The GE’s tags (e.g., Ability.Q.Cooldown) appear in OwnedTags.
  4. Tags replicate to clients per ReplicationMode.
  5. Client UI reads OwnedTags to display cooldown state.

Break in any step = client sees no cooldown.

Step 1: Cooldown GE on the Ability

Open the GameplayAbility BP. In Class Defaults:

If empty, the ability doesn’t apply a cooldown when activating.

Step 2: ApplyCooldown in Code/BP

// In ActivateAbility
CommitAbility(Handle, ActorInfo, ActivationInfo);
// Or explicitly:
ApplyCooldown(Handle, ActorInfo, ActivationInfo);

CommitAbility runs both cost and cooldown. ApplyCooldown alone applies cooldown only. Without one of these, the cooldown GE is never applied.

Step 3: ASC Replication Mode

// On the Pawn’s ASC at PossessedBy or BeginPlay
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);
AbilitySystemComponent->InitAbilityActorInfo(this, this);

Mixed replicates effects to owning clients (player sees their own cooldowns) and full data to server. InitAbilityActorInfo wires up replication properly.

Step 4: Verify on Client

Use a debug console command (in shipping or PIE):

AbilitySystem.Debug.NextCategory
// or via UI: showdebug abilitysystem

Shows active GEs and tags on each ASC. Compare server vs client. If server has the cooldown GE but client doesn’t, replication mode or ActorInfo setup is wrong.

Verifying

Use ability on the server. Client’s OwnedTags should contain the cooldown tag. UI should reflect cooldown. Cooldown should expire on both sides simultaneously.

“GAS cooldowns are GameplayEffects. Apply on commit; replicate via mode; check tag presence on client.”

Set ReplicationMode = Mixed on every player-controlled ASC at spawn — treat as boilerplate.