RPC Metadata Keys
This page lists the metadata you place on a CrowdyEvent receiver to control routing and, for a Blueprint custom event, to mark it as RPC-style in the first place.
Come here when you are writing or reviewing a CrowdyEvent receiver and need the exact key names, their
accepted values and defaults, and where each one is legal to place.
In C++ the keys go on the UFUNCTION(meta=(...)) line of your _Implementation function.
UFUNCTION(meta = (CrowdyEvent,
CrowdyRecipient = "SpatialMulticast",
CrowdyDecay = "Exponential_Decay",
CrowdyDistance = "Four_Chunks"))
void FireWeapon_Implementation(int32 Ammo, FVector Direction);
CROWDY_EVENT(FireWeapon)
Keys
The marker that turns a function into a CrowdyEvent receiver:
| Key | Symbol | Header |
|---|---|---|
CrowdyEvent | CrowdyMetaKeys::CrowdyEvent | CrowdyMetaKeys.h |
The routing keys that go alongside it, and the Blueprint-only markers that identify an RPC-style event to the compiler:
| Key | Symbol | Header |
|---|---|---|
CrowdyAction | CrowdyRpcMetaKeys::Action | CrowdyRPC.h |
CrowdyChannel | CrowdyRpcMetaKeys::Channel | CrowdyRPC.h |
CrowdyDecay | CrowdyRpcMetaKeys::Decay | CrowdyRPC.h |
CrowdyDistance | CrowdyRpcMetaKeys::Distance | CrowdyRPC.h |
CrowdyRecipient | CrowdyRpcMetaKeys::Recipient | CrowdyRPC.h |
CrowdyReplicate | CrowdyRpcMetaKeys::LegacyReplicate | CrowdyRPC.h |
CrowdyReplicates | CrowdyRpcMetaKeys::Replicates | CrowdyRPC.h |
The manifest carries the symbol and its header; the accepted values, defaults, and behavior below come from reading the header directly, since the manifest has no default or notes field for a meta key.
CrowdyEvent takes no value and is required on every receiver. Its legal place is any UFUNCTION, whether
you wrote the C++ by hand or the compiler generated it from a Blueprint custom event marked
CrowdyReplicates. Both a C++ receiver and a generated Blueprint one carry CrowdyEvent; only the
Blueprint one also needs CrowdyReplicates sitting next to it, because a Blueprint graph has no other way to
tell the router this custom event is RPC-style rather than a struct handler.
CrowdyRecipient takes an ECrowdyEventRecipient name and defaults to SpatialMulticast. The enumerators,
in declared order, are SpatialMulticast, Multicast, OwningClient, and Host. See
enums for the full type.
CrowdyDecay takes an ECrowdyDecayRate name and defaults to No_Decay. The enumerators are No_Decay,
Exponential_Decay, Linear_50, Linear_25, Linear_10, and Linear_5. It applies only to
SpatialMulticast; the SDK reads it unconditionally, but it only changes anything on the spatial send path.
CrowdyDistance takes an ECrowdyReplicationDistance name and defaults to Eight_Chunks, the maximum
range. It applies only to SpatialMulticast, same as CrowdyDecay.
CrowdyChannel takes a channel name string and defaults to empty, which means the app-wide default session
channel. It names the channel a Multicast event routes over by name rather than id, so the same event
resolves to the same channel in every environment your app is deployed to.
CrowdyAction takes no value. It declares that the receiver's parameters describe a one-shot action, an
attack swing, a flinch, an emote, rather than a body to run. The Crowdy Mass Rendering Backend plays it as an
animation action on a receiver that holds the entity as a crowd row rather than a live actor. On the
actor pool the declaration changes nothing. See
Play poses and one-shot actions.
CrowdyReplicates takes no value. It marks a Blueprint custom event as RPC-style ("Crowdy Replicates" in
the Blueprint dropdown), which is what tells the router to bind it through the RPC path rather than as a
struct handler, and lets the compiler inject the dispatch gate. A C++ receiver never sets this key;
CROWDY_EVENT is the C++ equivalent.
CrowdyReplicate is a legacy alias of CrowdyReplicates, kept so an older Blueprint asset still resolves.
It is deliberately not reused by Crowdy State: the same string already means "this is an RPC event," so a
state property never carries it. See state metadata keys.
:::caution[The receiver must be a real UFUNCTION. The CROWDY_EVENT(Name) macro only generates the call
site. It cannot emit the UFUNCTION, because UnrealHeaderTool does not expand macros when it scans for
reflected functions.]
:::
:::warning[CrowdyRecipient = "Host" addresses the elected host. Election is a convention, not an
enforcement boundary, so do not treat Host-only delivery as a security control.]
Anyone can hold the host role at some point in a session. If a call must only take effect for a
server-validated reason, check that reason on the receiving end; do not rely on the recipient filter alone
to keep an untrusted client from reaching the logic.
:::
Gotchas
CrowdyDecayandCrowdyDistanceare read unconditionally, but neither changes anything outside theSpatialMulticastrecipient.CrowdyReplicatesand its legacy aliasCrowdyReplicateonly ever appear on a Blueprint custom event; a C++ receiver never sets them.CrowdyActionis a declaration only. The actor pool ignores it; the Crowdy Mass Rendering Backend reads it to play the call as an action on a crowd row. See Play poses and one-shot actions.