# Quick Start Guide

AP Event Bus is a server-authoritative, replicated event messaging system for UE5 multiplayer. Any actor can publish a named event — identified by a Gameplay Tag — onto a bus. Any actor can listen for events by tag. No direct references required between publishers and subscribers.

Free product. No GAS dependency. 100% Blueprint accessible.

Support: discord.gg/n5HxmrkpC4


# 1. Installation

  1. Copy the AfterPrimeEventBus/ folder into your project's Plugins/ directory.
  2. Open your project in UE5.
  3. Go to Edit → Plugins, search for "AP Event Bus", enable it, and restart the editor.
  4. No additional configuration required.

# 2. Recommended Setup — Global Bus on GameState

The most common pattern is a single global bus placed on the GameState, making it accessible from any actor in the world at any time.

  1. Open (or create) your GameState Blueprint.
  2. In the Components panel, click Add and search for AP_EventBus.
  3. Add the component — it appears as AP_EventBus in the panel.
  4. Set this GameState in your GameMode under Class Defaults → Game State Class.

# Alternative — Per-Actor Bus

Place UAP_EventBusComponent on any individual Actor (Character, Pawn, PlayerState, etc.) to create a bus scoped to that actor. Each component instance is an independent bus — events published to one do not reach listeners on another.


# 3. Getting a Reference to the Bus

In your Character or Actor Blueprint, get a reference to the bus once in BeginPlay and store it in a variable.

Use the Get Event Bus from Game State node found under AP|EventBus|Utilities:


# 4. Publishing Events

Call Publish Event on your bus reference. This is the only publish node you need — it handles all client-to-server routing automatically.

Pin Description
Payload Event Tag Gameplay Tag identifying the event (e.g., Event.MyGame.PlayerDied)
Payload Instigator The actor that triggered the event (optional)
Payload Target The target actor (optional)
Payload Magnitude General-purpose numeric value (optional)
Scope How the event is delivered — see Delivery Scopes below

Use Make Event Payload (under AP|EventBus|Utilities) to construct payloads as a pure node without splitting struct pins manually.


# 5. Delivery Scopes

Scope What Fires
All Server fires + NetMulticast to all connected clients
OwnerOnly Server fires + Client RPC to the owning connection only
ServerOnly Server fires locally only — no replication, zero client cost
LocalOnly Fires on the calling machine only — zero network cost. Use for UI-only events.

# 6. Listening for Events

Two complementary approaches — use both simultaneously on the same component.

# Catch-All — OnEventReceived

Fires for every event published to the bus regardless of tag.

  1. Drag off your bus reference → Assign On Event Received
  2. Wire the generated event node to your logic

# Per-Tag Filtering — ListenForEvent + OnListenedEventReceived

Fires only for specific tags you register. Best when an actor only cares about a subset of bus traffic.

  1. Call Listen for Event on the bus with the tag you want to filter on
  2. Bind Assign On Listened Event Received
  3. The bound event fires only when that specific tag is published

Call StopListeningForEvent(Tag) or StopAllListening() to remove filters at any time. StopAllListening() is called automatically in EndPlay — no manual cleanup needed on actor destruction.


# 7. Late-Join Cache — Persistent Events

Some events represent state that late-joining clients should receive immediately on connect — a match phase change, a captured objective, a game state transition. Register these tags as persistent so their last payload is cached server-side and delivered to new clients automatically.

# Setup

In your GameState BeginPlay (server only), call Register Persistent Event for each tag you want to cache:

# Cache Query API

Query persistent event state directly without waiting for a delegate — useful for checking state on demand:

Function Returns Description
WasEventFired(Tag) bool True if this persistent tag has fired at least once
GetLastPayload(Tag, OutPayload) bool Retrieves the last cached payload for the tag
GetAllCachedEventTags() Tag Container All tags currently in the persistent cache

# 8. Gameplay Tag Setup

AP Event Bus uses Gameplay Tags as event identifiers. No tags are shipped with the plugin — you define your own.

To add tags: Project Settings → Project → Gameplay Tags → Add New Gameplay Tag


# 9. Multiplayer Checklist

  • Bus component is on the GameState (or relevant actor) and that actor replicates
  • Bus reference is fetched with a Delay (0.1s) in BeginPlay to ensure GameState is available
  • PublishEvent is used from all machines — no manual authority checks needed
  • Delegates are bound on both server and client — not gated behind HasAuthority
  • Persistent events are registered in GameState BeginPlay on the server before any events fire
  • Demo tags registered in your project's Gameplay Tags config before use

# 10. What the Plugin Does Not Do


# Next Steps

  • API Reference — complete class, function, delegate, enum, and struct documentation
  • Changelog — version history and roadmap

AfterPrime Systems — Building the Gameplay Foundation