Let's talk

Audit your GAS setup in five minutes

Most GAS multiplayer bugs come from a handful of settings: a net policy, a replication mode, an OnRep, a commit node in the wrong place. They are easy to fix and hard to spot by reading a hundred assets. This plugin reads them for you.

What it checks

The GAS Net Audit loads every Gameplay Ability, PlayerState and AttributeSet class in your project (Blueprint and C++, not engine or marketplace classes unless you ask) plus your network settings, and runs 15 checks:

AreaChecks
AbilitiesNet execution policy, input replication, replicated instances, triggers on predicted abilities, cooldown effect that never blocks, cost effect with a duration or no modifiers
Blueprint graphsCommitAbility that runs after a Delay, a montage task or any other latent node
PlayerStatesASC not replicated, Minimal or Full replication mode, low net update frequency
AttributeSetsAttributes without an OnRep, OnReps without GAMEPLAYATTRIBUTE_REPNOTIFY, registration without REPNOTIFY_Always, clamping only in PreAttributeChange
NetworkPer-client bandwidth cap set too low

Each finding has a severity, the class or asset it is about, what goes wrong in multiplayer, the fix, and a link to the tutorial that explains it. The report ends with an inventory of everything it read: every ability's net policy, cost and cooldown, every PlayerState ASC's replication mode, every attribute's OnRep. That page alone is a quick review of a GAS setup.

Install

  1. Download the ZIP from GAS Net Audit and unzip it into YourProject/Plugins/RSNetAudit.
  2. Regenerate project files and build the editor.

It is an editor-only module. Nothing ships with your game.

Run it three ways

From the editor. Tools > Multiplayer > Run GAS Net Audit. When it finishes, a notification shows the counts and an Open report link.

From the console. Type RSNetAudit.Run in the editor console. Same result.

Headless. For a build machine, or a quick check without opening the editor:

PowerShellCommand line
UnrealEditor-Cmd.exe MyGame.uproject -run=RSNetAudit -FailOn=Error

The commandlet exits with 1 when it finds an error, so a CI step fails on a new one. Use -FailOn=Warning to be stricter, or -FailOn=None to only write the report.

Read the report

Reports land in Saved/RSNetAudit/ as HTML, Markdown, JSON and JUnit XML. GASNetAudit-latest.html is always the newest; dated copies are kept so you can compare runs.

Fix errors first. They break multiplayer outright:

  • GA-03: a cooldown effect that is Instant, or grants no tags. The ability has no cooldown at all. See predicted cost and cooldown.
  • PS-02 / PS-03: a player ASC that does not replicate, or runs in Minimal mode. The owning client cannot confirm its own predictions. See ASC on the PlayerState.

Warnings cause the "it feels laggy" class of bug:

  • GA-05: commit after a latent node, so cost and cooldown jump a round trip late.
  • AS-02 / AS-03: OnReps that drop predicted values, so stamina and health bars snap back.
  • PS-01: a PlayerState that replicates a few times a second while it carries every ability.

Info findings are things that are often fine but worth a look, like a LocalOnly ability or a non-replicated meta attribute.

Checked a finding and it is fine, like a server-only Damage meta attribute? Copy the Ignore line shown under it into Config/RSNetAudit.ignore with a reason:

INIConfig/RSNetAudit.ignore
AS-01 UMyAttributeSet.Damage   # server-only meta attribute

It moves to a Suppressed list in the report and stops counting toward CI.

How the graph check works

GA-05 opens each Blueprint ability, finds every Commit Ability node, and walks the execution wires backwards to the event that starts the chain. If it passes through a latent node on the way (an ability task, a Delay, any async action), the commit runs after the prediction window has closed.

It does not read C++ abilities. For those, search your ActivateAbility implementations for CommitAbility calls inside task callbacks.

What it cannot see

A clean report is not a clean game. Static checks miss whether a triggered ability is also bound to input, side effects spawned on both client and server, InitAbilityActorInfo missing on the client, and abilities granted twice on respawn. The ability fires twice tutorial covers those, and the latency tutorial shows how to catch them.

Keep it clean

Run it in CI on every merge with -FailOn=Error, and point the test-report step at Saved/RSNetAudit/GASNetAudit-latest.junit.xml so each finding shows as a test. New abilities are where these mistakes come back: someone duplicates an old ability with an Instant cooldown, or adds an attribute without an OnRep. The build tells them before a playtest does.

Get the code

GAS Net Audit v0.2.0, free under the MIT license. Read the runner source to see exactly what each check does.

The audit finds settings. If your abilities still desync after the report is clean, the cause is in how the systems fit together, and that is what the Diagnostic is for.

Still desyncing in packaged builds?

Free code fixes one symptom. A Diagnostic finds the cause across your project in two days.