#
Troubleshooting
Common issues and their solutions for AP Timer Suite.
#
Events Not Firing on Clients
Common Mistake — Authority Gating
A frequent mistake is wrapping delegate bindings inside HasAuthority() checks. Do not do this.
Bind events on both server and clients unconditionally.
Checklist:
- Delegate bindings are NOT gated behind
HasAuthority() - The owning actor has Replicates enabled
- The Timer Suite component is set to replicate
-
BeginPlaybinding occurs on both server and client (it will if Actor Replicates is on)
#
Late Joiner Replays Old Thresholds
If a client joining mid-timer sees threshold events fire for thresholds that already passed, the elapsed baseline is not being set correctly.
Checklist:
-
PostReplicatedAddcomputes the elapsed threshold baseline correctly - The baseline is set before any threshold comparison runs
-
LastThresholdIndexFiredis being replicated correctly - Thresholds are normalized (sorted and clamped to
[0..1]) before storage
#
Inspector Shows 0 Snapshots Initially
The inspector widget may show an empty list on first open due to replication timing — the component may not have received its first update yet.
Bootstrap Refresh
Use a bootstrap retry loop in the inspector widget: poll GetAllTimerSnapshots() on a short timer until results are non-empty. Once initial state arrives, standard auto-refresh takes over.
Checklist:
- Bootstrap retry logic is implemented in the inspector widget
- The
PlayerControlleris finding the correct Timer Suite component (use tag-based lookup or an explicit reference) - The component's owning actor is fully replicated before the inspector opens
#
Timers Not Starting
-
AddTimer(Tag)is called beforeStartTimerSimpleorStartTimerAdvanced - Both calls are made on the server (or in a Server RPC)
- The Gameplay Tag is registered in Project Settings
AfterPrime Systems — Building the Gameplay Foundation