[RESOURCE] SignalNet – Simple, Safe Signals with Built-In Two-Way Calls

:link: SignalNet Get It Here!

Version: 1.0.0
Author: dodo12w

A robust signal‑messaging system for Roblox, built on top of Sleitnick’s Signal. SignalNet lets scripts in the same execution context (server‑to‑server or client‑to‑client) communicate safely using named signals—with automatic queuing, two‑way request/response support, and fire‑before‑connect protection.


:sparkles: Why Use SignalNet?

Roblox developers often struggle when:

  • A signal fires before any listener is ready
  • They’re manually juggling lots of BindableEvents or RemoteFunctions
  • Game logic depends on perfect timing (and breaks when it isn’t)

SignalNet fixes this by providing:

  • Automatic queues for pre‑connect fires (never drop a call)
  • Clear separation of events (fire‑and‑forget) vs functions (request/response)
  • Named, reusable signals—no manual instantiation required

:hammer_and_wrench: Features

  • :speaker_high_volume: Event signals (fire‑and‑forget)
  • :repeat_button: Function signals (request/response, like RemoteFunction)
  • :zzz: Queues calls fired before listeners connect
  • :counterclockwise_arrows_button: Instant and deferred fire support

:rocket: Installation Get It Here: SignalNet - Creator Store

Place SignalNet and Sleitnick’s Signal module in ReplicatedStorage (or another shared folder):

local SignalNet = require(ReplicatedStorage.Shared.SignalNet)

:package: Basic Usage

:speaker_high_volume: Event Signals

-- Connect early
SignalNet.ConnectEvent("OpenMenu", function()
    print("Menu opened!")
end)

-- Fire the event
SignalNet.FireEvent("OpenMenu")

:repeat_button: Function Signals

SignalNet.ConnectFunction("GetGold", function(player)
    return player.leaderstats.Gold.Value
end)

local gold = SignalNet.FireFunction("GetGold", LocalPlayer)
print("You have", gold, "gold")

:stopwatch: Deferred Calls

SignalNet.FireDeferredEvent("PlaySound", "VictoryTheme")

:broom: Cleanup & Debugging

-- Disconnect all listeners for a signal
SignalNet.DisconnectAll("OpenMenu")

-- Destroy the signal completely
SignalNet.Destroy("GetGold")

-- Inspect active connections
local conns = SignalNet.GetConnections("OpenMenu")

:plus: Additional APIs

:repeat_single_button: One‑Shot Connections

-- Run the callback only the *next* time the function signal fires
SignalNet.ConnectOnceFunction("RequestSettings", function(player)
    return getPlayerSettings(player)
end)

-- Run the callback only the *next* time the event fires
SignalNet.ConnectOnceEvent("CountdownFinished", function()
    print("Round start!")
end)

:pause_button: Waiting for the Next Event

-- Yield until the event fires and capture its arguments
local winner = SignalNet.Wait("RoundEnded")
print("Winner:", winner)

:link: Wrapping RBXScriptSignals

-- Convert an existing RBXScriptSignal into a SignalNet‑style signal
local partTouched = SignalNet.Wrap(workspace.Part.Touched)
partTouched:Connect(function(hit)
    print(hit.Name, "touched the part")
end)

:raising_hands: Credits

Feedback & Contributions

Drop suggestions or comments below →
Happy signaling! :sparkles:

2 Likes