Quick answer: NetMulticast must be invoked on an actor with bReplicates = true from a context where HasAuthority() is true. The actor must also be net-relevant to each receiver; objects beyond NetCullDistanceSquared are skipped. Use the listen-server safe pattern: call a Server RPC from the client, multicast from the server.

Here is how to fix Unreal NetMulticast RPCs that fire correctly on the server but never run on connected clients in a listen-server setup. The host (who is also a player) sees the effect, but other clients see nothing. The cause is usually one of: actor not replicated, called from a non-authority context, or the actor culled by relevancy distance for those clients.

The Symptom

An ability fires a particle and sound via NetMulticast. On the listen server’s screen, both effects play. Connected clients see nothing — no particles, no sound. No errors. UE_LOG inside the multicast confirms it runs only on the host.

What Causes This

Actor not replicated. A multicast can only travel to clients if the actor is replicated. bReplicates = true must be set, typically in the constructor.

Called without authority. NetMulticast functions ignored by the network layer if called from a client. Without HasAuthority(), the function runs locally only.

Net relevancy out of range. Each actor has NetCullDistanceSquared (default 225,000,000 = 15,000 cm). Beyond that, multicast deliveries are suppressed. Bullet impacts on a far-away wall may multicast to the server but never reach clients beyond 150m.

Listen-server confusion. The host is both server and client. A multicast called on the host’s pawn runs once locally (server side) and could appear to multicast from a client if you mistakenly call from the wrong path.

The Fix

Step 1: Mark the actor as replicated.

// Constructor
AAbilityActor::AAbilityActor()
{
    bReplicates = true;
    SetReplicateMovement(true);
}

Without bReplicates, the actor exists only on the spawning machine. Multicasts go nowhere.

Step 2: Call from authority only.

// In a Blueprint or C++ event called by gameplay code
void AAbilityActor::Activate()
{
    if (HasAuthority())
    {
        Multicast_PlayEffects();   // runs on server + replicates to all clients
    }
    else
    {
        Server_RequestActivate();  // client asks server to do it
    }
}

UFUNCTION(NetMulticast, Unreliable)
void Multicast_PlayEffects();

UFUNCTION(Server, Reliable)
void Server_RequestActivate();

Step 3: Tune NetCullDistance.

// Allow this effect to reach clients up to 50m away
NetCullDistanceSquared = 5000.0f * 5000.0f;

For long-range visual effects (gunshot, explosion seen from afar), bump this. For local pickups, leave default to save bandwidth.

Step 4: Use unreliable for cosmetic effects. Reliable multicasts go into the bounded reliable RPC queue. Spamming reliable cosmetic effects (footsteps, hit particles) can stall replication. Mark such functions Unreliable.

Step 5: For listen-server hosts, guard server-only logic.

UFUNCTION(NetMulticast, Unreliable)
void Multicast_PlayEffects()
{
    // Runs on server (host) and all clients
    PlayParticleAndSound();

    if (HasAuthority())
    {
        // Server-side bookkeeping (damage, score)
        ApplyServerSideEffects();
    }
}

This pattern lets you do per-machine cosmetic work plus authoritative work in one function without double-firing.

Verifying With Network Profiler

Run net dump in the console while connected. You will see RPC traffic flowing through. Check that your multicast entries appear at the server outbound and client inbound. If they appear outbound but not inbound, the actor is not relevant or the channel is closed.

Use showdebug net for an on-screen overlay of dropped/delivered RPCs per actor.

Common Mistakes

Spamming reliable multicasts for VFX. Causes connection saturation and disconnects under load. Always make cosmetic effects unreliable.

Calling multicast from a Blueprint Construction Script. Construction runs locally and not under authority semantics. Move to BeginPlay or a gameplay event.

Forgetting to call SetReplicates(true) on dynamically spawned actors. Spawned actors do not inherit the replicated flag from the spawner.

“Multicast = server origin + replicated actor + relevant client. All three or it goes nowhere.”

Related Issues

For Gameplay Cue replication, see GameplayCue Not Firing on Client. For replication-related streaming, see World Partition Streaming.

bReplicates true. HasAuthority gate. Adequate cull distance. Multicast lands.