Let's talk

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:
PowerShell
UnrealEditor-Cmd.exe MyGame.uproject -run=RSNetAudit -FailOn=Error

Reports 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.

OptionDefaultMeaning
-FailOn=Error|Warning|NoneErrorWhich findings make the exit code 1
-IncludeEngineoffAlso scan engine and marketplace classes
-Out=<dir>Saved/RSNetAuditReport folder
-MinPSRate=<n>30PlayerState update rate below which PS-01 warns
-MinClientRate=<n>30000Bytes per second per client below which NET-01 warns
-Ignore=<file>Config/RSNetAudit.ignoreSuppression 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.

INI
# 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 server

Suppressed 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

IdSeverityWhat it findsGuide
GA-01Warning / InfoAbilities that are ServerInitiated, or ServerOnly / LocalOnly without triggersAbility fires twice
GA-02WarningReplicate Input Directly turned onAbility fires twice
GA-03ErrorCooldown effect that is Instant, or grants no tags, so it never blocksCost and cooldown
GA-04WarningCost effect with a duration, or with no modifiersCost and cooldown
GA-05WarningBlueprint 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 countCost and cooldown
GA-06WarningAbility with Replication Policy ReplicateYesAbility fires twice
GA-07Warning / InfoLocalPredicted ability with tag triggers (activates on both sides) or event triggersAbility fires twice
PS-01WarningPlayerState with an ASC and a low net update frequencyASC on PlayerState
PS-02ErrorASC on a PlayerState that does not replicateASC on PlayerState
PS-03Error / WarningPlayer ASC in Minimal (breaks prediction) or Full (bandwidth) replication modeASC on PlayerState
AS-01InfoAttribute that does not replicateCost and cooldown
AS-02WarningReplicated attribute without an OnRep, or an OnRep without GAMEPLAYATTRIBUTE_REPNOTIFYCost and cooldown
AS-03WarningAttribute registered without REPNOTIFY_AlwaysCost and cooldown
AS-04WarningClamp in PreAttributeChange only, so the base value is never clampedCost and cooldown
NET-01WarningPer-client bandwidth cap (MaxInternetClientRate / ConfiguredInternetSpeed) below 30000 bytes/sReal 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, one CHECK-ID Subject # reason per 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=None or -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::CheckAbilityGraphs runs 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 FindOrAddSection only 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.Run console command, or the -run=RSNetAudit commandlet with a CI exit code.
  • Markdown and HTML reports in Saved/RSNetAudit/, each finding linked to a guide.

Tutorials that use it

Still desyncing in packaged builds?

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