Signal & Network
Signal towers define network coverage on the map. Without signal, calls fail and certain features are restricted. The voice system and WebRTC settings control how calls are routed.
Signal towers
lua
Config.Signals = {
{
id = "ls_central",
name = "Los Santos Central",
coords = vector3(0.0, 0.0, 0.0), -- antenna position
range = 3000, -- coverage radius in metres
signal = 100, -- signal strength inside range (0–100)
type = "5G", -- label shown in the phone UI
},
}Add as many towers as needed to cover your map. A player inside multiple tower ranges gets the highest signal value. Players outside all tower ranges are considered "no signal".
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier for this tower (used in exports) |
| name | string | Display name (admin/debug use) |
| coords | vector3 | World position of the antenna |
| range | number | Coverage radius in metres |
| signal | number (0–100) | Signal strength shown to players in this tower's range |
| type | string | Network type label: '5G', '4G', '3G', etc. |
Voice system
lua
Config.Voice = {
System = "pma", -- voice resource to use
CallEffects = true, -- apply telephone audio filter during calls
}| Value | Resource |
|---|---|
| "pma" | pma-voice |
| "mumble" | mumble-voip |
| "salty" | saltychat |
| "toko" | toko-voip |
CallEffects = true applies a low-pass audio filter that makes voices sound like they're coming through a phone — highly recommended for immersion.WebRTC config
Video calls use WebRTC peer connections. The default config uses Google's public STUN servers:
lua
Config.DynamicWebRTC = {
Enabled = false, -- auto-generate ICE config via a service
Service = "cloudflare", -- "cloudflare" (when Enabled = true)
RemoveStun = false, -- strip STUN servers from the config
}
Config.RTCConfig = {
iceServers = {
{ urls = "stun:stun.l.google.com:19302" },
{ urls = "stun:stun1.l.google.com:19302" },
},
}For production servers, replace Google STUN with a private TURN server. Public STUN servers don't relay traffic — if players are behind symmetric NAT, video calls may fail without TURN.
TURN server example:
lua
Config.RTCConfig = {
iceServers = {
{
urls = "turn:your-turn-server.com:3478",
username = "user",
credential = "password",
},
},
}Signal exports
GetSignalTowers() → tableServerReturns all currently registered signal towers.
lua
local towers = exports.quanticPhone:GetSignalTowers()CreateSignalTower(id, data)ServerAdds a new signal tower at runtime.
lua
exports.quanticPhone:CreateSignalTower("my_tower", {
coords = vector3(100.0, 200.0, 30.0),
range = 1500,
signal = 80,
type = "4G",
})RemoveSignalTower(id)ServerRemoves a signal tower by its ID.
lua
exports.quanticPhone:RemoveSignalTower("my_tower")