GAS Net Audit v0.2.0
Free Unreal Engine 5 editor plugin that scans your Gameplay Ability System setup for multiplayer mistakes: ability net policies, commit after latent nodes, cooldown and cost effects, triggers, PlayerState ASC replication, attribute OnReps and clamping, and bandwidth settings. Writes HTML, Markdown, JSON and JUnit reports with a fix for each finding and an inventory of the setup.
- The problem
- GAS multiplayer mistakes (wrong net policy, commit after a latent node, ASC replication mode, unreplicated or unclamped attributes, low bandwidth caps) look fine in PIE and show up under real latency, often as Steam reviews.
- What it replaces
- A manual review of every ability, effect and AttributeSet, or a QA pass at 150 ms. The nearest paid tool is a generic replication analyser at $30+; it does not know GAS.
- What it saves
- Our estimate: a day or more of review per project, and each bug it catches before launch instead of after. Runs in CI, so the same mistake cannot come back.
- Who it is for
- Teams shipping a multiplayer UE5 game on GAS, especially before a playtest, Early Access or a co-dev handover.
A free editor plugin that scans your Unreal Engine 5 Gameplay Ability System setup for the mistakes that break multiplayer, and writes a report with a fix for each one. MIT licensed, no sign-up, nothing leaves your machine.
Written for Unreal Engine 5.0 to 5.8. Compiled clean on 5.3 to 5.8, run on a real 5.7 project, and covered by automation tests on 5.5 to 5.8 that plant one mistake per check and confirm the audit reports it. 5.0 to 5.2 have their own code path but are not compiled yet. This is a preview release: compile it in your project first, and send problems to contact@reignancestudios.com.
Run it
- Editor: Tools menu > Multiplayer > Run GAS Net Audit. A notification links to the report.
- Console:
RSNetAudit.Run - Headless / CI:
UnrealEditor-Cmd.exe MyGame.uproject -run=RSNetAudit -FailOn=ErrorReports go to Saved/RSNetAudit/ as HTML, Markdown, JSON and JUnit XML. GASNetAudit-latest.* is always the newest; dated copies are kept so you can compare runs. The commandlet exits with 1 when a finding at or above -FailOn exists, so a build can fail on new errors. Unreal also turns the exit code to 1 when anything else logs an Error while the editor loads (look for Failure - N error(s) at the end of the log), so if the audit summary says 0 errors and the exit code is still 1, fix that log line or have CI read GASNetAudit-latest.json instead. Point your CI test-report step at GASNetAudit-latest.junit.xml to see each finding as a test.
| Option | Default | Meaning |
|---|---|---|
-FailOn=Error|Warning|None | Error | Which findings make the exit code 1 |
-IncludeEngine | off | Also scan engine and marketplace classes |
-Out=<dir> | Saved/RSNetAudit | Report folder |
-MinPSRate=<n> | 30 | PlayerState update rate below which PS-01 warns |
-MinClientRate=<n> | 30000 | Bytes per second per client below which NET-01 warns |
-Ignore=<file> | Config/RSNetAudit.ignore | Suppression file |
Hide findings you have checked
Add one line per finding to Config/RSNetAudit.ignore (commit it with the project). The HTML report shows the exact line under each finding.
# CHECK-ID Subject (* is a wildcard) # reason
AS-01 UMyAttributeSet.Damage # server-only meta attribute
AS-01 UMyAttributeSet.Healing # server-only meta attribute
GA-07 /Game/Abilities/GA_HitReact* # event only sent by the serverSuppressed findings stay in the report under "Suppressed" with the reason, but they do not count, do not fail CI, and show as skipped in JUnit.
Inventory
Every report ends with what the audit read: network settings, every ability (net policy, instancing, replication, cost, cooldown, triggers), every PlayerState ASC (replication mode, update rate) and every attribute (replicated, OnRep, REPNOTIFY_Always). Useful as a one-page review of the GAS setup, even when there are no findings.
Checks
| Id | Severity | What it finds | Guide |
|---|---|---|---|
| GA-01 | Warning / Info | Abilities that are ServerInitiated, or ServerOnly / LocalOnly without triggers | Ability fires twice |
| GA-02 | Warning | Replicate Input Directly turned on | Ability fires twice |
| GA-03 | Error | Cooldown effect that is Instant, or grants no tags, so it never blocks | Cost and cooldown |
| GA-04 | Warning | Cost effect with a duration, or with no modifiers | Cost and cooldown |
| GA-05 | Warning | Blueprint ability that commits after a latent node (Delay, or the callback pin of PlayMontageAndWait, WaitTargetData...). A task's top exec pin fires at once and does not count | Cost and cooldown |
| GA-06 | Warning | Ability with Replication Policy ReplicateYes | Ability fires twice |
| GA-07 | Warning / Info | LocalPredicted ability with tag triggers (activates on both sides) or event triggers | Ability fires twice |
| PS-01 | Warning | PlayerState with an ASC and a low net update frequency | ASC on PlayerState |
| PS-02 | Error | ASC on a PlayerState that does not replicate | ASC on PlayerState |
| PS-03 | Error / Warning | Player ASC in Minimal (breaks prediction) or Full (bandwidth) replication mode | ASC on PlayerState |
| AS-01 | Info | Attribute that does not replicate | Cost and cooldown |
| AS-02 | Warning | Replicated attribute without an OnRep, or an OnRep without GAMEPLAYATTRIBUTE_REPNOTIFY | Cost and cooldown |
| AS-03 | Warning | Attribute registered without REPNOTIFY_Always | Cost and cooldown |
| AS-04 | Warning | Clamp in PreAttributeChange only, so the base value is never clamped | Cost and cooldown |
| NET-01 | Warning | Per-client bandwidth cap (MaxInternetClientRate / ConfiguredInternetSpeed) below 30000 bytes/s | Real latency |
AttributeSet checks read your C++ source (Source/ and project Plugins/), so they need the source on disk.
What it cannot see
Static checks miss runtime problems: whether a triggered ability is also bound to input, C++ abilities that commit after a latent task, projectiles spawned on both client and server, InitAbilityActorInfo missing on the client, abilities granted twice on respawn. Test those at real latency with the free UE Latency Kit.
Help
The report tells you where the setup is wrong. If abilities still desync in packaged builds after you fix it, the cause is usually spread across the project. A Diagnostic finds it in two days.
Changelog
v0.2.0 (2026-10-30)
- New checks: GA-06 (ReplicateYes abilities), GA-07 (triggers on LocalPredicted abilities), AS-04 (clamp only in PreAttributeChange), NET-01 (per-client bandwidth cap).
- Inventory section in every report: network settings, abilities, PlayerState ASCs and attributes.
- Suppressions:
Config/RSNetAudit.ignore, oneCHECK-ID Subject # reasonper line. The HTML report shows the line to copy. - JSON and JUnit XML reports next to HTML and Markdown, for CI.
- New options:
-MinClientRate=,-Ignore=. - Built clean on UE 5.3 to 5.8.
- Fixed: GA-05 flagged a Commit wired to an ability task's top exec pin. That pin fires as soon as the task starts, inside the prediction window; only the task's callback pins count as latent now.
- Fixed: Error findings were logged as engine errors, which made the commandlet exit with 1 even with
-FailOn=Noneor-FailOn=Warning. They are logged as warnings; the exit code follows-FailOn. - Fixed: AS-03 reported "GetLifetimeReplicatedProps not found" for AttributeSets with no replicated attributes.
FRSNetAuditRunner::CheckAbilityGraphsruns the Blueprint graph check on one ability Blueprint.- Automation tests: one deliberate mistake per check, plus Blueprint graphs built in the test for GA-05, run on UE 5.5 to 5.8.
v0.1.0 (2026-10-30)
- Tools menu entry compiles on UE 5.3: the two-argument
FindOrAddSectiononly exists from 5.4. - PS-03 reads the replication mode directly (it is not reflected). Adds a UE 5.0 class discovery path.
- First preview release: 11 checks (GA-01 to GA-05, PS-01 to PS-03, AS-01 to AS-03).
- Runs from the Tools menu, the
RSNetAudit.Runconsole command, or the-run=RSNetAuditcommandlet with a CI exit code. - Markdown and HTML reports in
Saved/RSNetAudit/, each finding linked to a guide.