Broadcast
Broadcast events are fire-and-forget server-to-client messages sent by broadcast:Emit() over an UnreliableRemoteEvent — individual events may be dropped, but bandwidth cost is minimal.
How broadcast events arrive
On the server you call broadcast:Emit(event, data). On the client you subscribe with the same listener:On(event, fn) used for push events. Listener automatically routes broadcast payloads alongside push payloads — you write one handler for both.
-- SERVER (Script)
local broadcast = RoExpress("Broadcast")
-- emit every heartbeat — drops are acceptable
game:GetService("RunService").Heartbeat:Connect(function()
for _, player in game.Players:GetPlayers() do
broadcast:Emit("position.hint", {
player = player.Name,
pos = player.Character and
player.Character:FindFirstChild("HumanoidRootPart") and
player.Character.HumanoidRootPart.Position
})
end
end)
-- CLIENT (LocalScript)
local listener = RoExpress("Listener")
listener:On("position.hint", function(data)
Minimap:UpdateDot(data.player, data.pos)
end)
Reliability
Broadcast uses Roblox's UnreliableRemoteEvent. Events are not retransmitted on packet loss — any given emission may never arrive at the client. This is intentional: for high-frequency data it is cheaper to accept occasional drops than to guarantee every packet.
| Property | Value |
|---|---|
| Transport | UnreliableRemoteEvent |
| Delivery | Best-effort — events may be dropped |
| Order | Not guaranteed |
| Server API | broadcast:Emit(event, data) |
Broadcast vs Push
| Broadcast | Push | |
|---|---|---|
| Transport | UnreliableRemoteEvent | RemoteEvent |
| Guaranteed delivery | No | Yes |
| Bandwidth cost | Lower (no ACKs) | Higher (retransmit until ACK) |
| Best for | Position hints, visual FX, cooldown ticks | Round events, inventory changes, match results |
Hit FX example
Visual effects are a perfect fit for broadcast — a missed frame is invisible to the player, and flooding the reliable channel for every shot is wasteful.
-- SERVER fires a hit effect for everyone nearby
broadcast:Emit("hit.fx", { pos = hitPos, weapon = "rifle" })
-- CLIENT plays it
listener:On("hit.fx", function(data)
FX:PlayImpact(data.pos, data.weapon)
end)
See also
← Listener · Subscribe | On, Once, Off reference · Server Push | reliable channel comparison · Broadcast module | server-side emit API · Gun Example | hit FX via broadcast