Usage
Controls, settings, commands, the 3D prop editor, and custom radio layouts.
Controls
Navigation
| Button | Function |
|---|---|
| ZN | Select zone |
| CH | Browse channels |
| ST | Open settings |
Channel Operations
| Button | Function |
|---|---|
| CON | Connect to channel |
| DSC | Disconnect from channel |
| SCN | Toggle scanning |
| SGN | Toggle channel alert |
Push-to-Talk
Hold B (default) to transmit. Release to stop.
Blocked if:
- The radio is off or not connected
- The player is dead or swimming
Config.talkCheckreturns false- Another user is already talking (see bonking)
Keybinds
Defaults: B = PTT, F6 = toggle radio. Everything else is unbound by default. All configurable in Config.controls — see Keybinds configuration for the full list.
Settings Menu
Open via the ST button on the radio. Use BTN1 / BTN3 (or the channel knob) to change the highlighted option's value.
| Setting | Description |
|---|---|
| GPS | Toggle your location blip visibility for other players |
| Earbuds | Toggle nearby radio output (3D audio) — hidden when 3D audio is disabled server-side |
| VC Vol | Voice volume (0-100) |
| SFX Vol | Sound effects volume (0-100) |
| 3D Vol | Nearby radio volume (0-100) — hidden when 3D audio is disabled server-side |
| Style | Change radio model |
| DISP | Display theme: Auto, Light, or Dark |
| Move | Positioning mode. CHG activates move mode, RST resets the saved position for this model |
| MIC | Select microphone device |
| Anim | Radio animation — hidden when animations are disabled server-side |
For the full settings dialog with channel list, focus-layout toggle, and admin options, see /tradio Command.
Positioning Your Radio
From the on-radio menu: ST > Move > CHG. From the chat command: /tradio > Move Radio.
Once move mode is active:
- Click and drag to reposition the radio on the screen
- Scroll wheel to scale the radio between 0.5x and 1.5x
- Escape or the close button to save and exit
Positions and scale are saved per radio model. Use RST on the ST menu or Reset Position in /tradio to clear the saved position for the current model.
The channel list overlay uses the same drag/scroll flow — trigger it via Move Channel List in /tradio (Reset Channel List restores the default position).
/tradio Command
Opens the full settings dialog. Admins (tlib.admin) see extra options.
Player Settings
| Setting | Description |
|---|---|
| Voice Volume | Voice reception volume |
| SFX Volume | Sound effects volume |
| 3D Audio Volume | Nearby radio audio volume |
| Radio Style | Radio model for the current context (on-foot, vehicle, boat, air) |
| Theme | Auto, Light, or Dark |
| GPS Blips | Toggle your blip visibility |
| Earbuds | Toggle 3D audio from your radio |
| Separate On-Foot Focus Layout | When enabled, save a different radio model for focused vs. unfocused on-foot state (defaults to HandheldUnfocused from admin panel) |
| Channel List | Toggle the floating channel list overlay |
| Active Talkers Only | Only show transmitting users in the channel list |
| Animation | Radio use animation style (hidden when animations are disabled in admin) |
| Microphone | Select a microphone device (↻ re-enumerates and re-acquires the stream) |
| Move Radio / Reset Position | Enter move/scale mode for the radio / reset position for the current model |
| Move Channel List / Reset Channel List | Move/scale the channel list overlay / reset its position |
Admin Options
The following options are only visible to players with the tlib.admin ACE permission:
| Option | Description |
|---|---|
| Set as Default Layout for Vehicle | Save the current radio model as the default for this context (vehicle spawn code, on-foot, or focused/unfocused on-foot) |
| Set as Server Defaults | Save current volume settings and radio style as server-wide defaults for new players |
| 3D Prop Editor | Edit radio prop positions on vehicles (see 3D Prop Editor) |
| Admin Settings | Open the admin panel for server-wide configuration (see Configuration) |
3D Prop Editor
Admins with the tlib.admin ACE permission can place the dashboard radio prop per vehicle model via /tradio > 3D Prop Editor. The editor uses a full Three.js transform gizmo — not the 2D drag flow used for the radio HUD.
You must be in the vehicle you are editing. Entering the editor freezes the vehicle and attaches the AFX-1500 prop at its last saved position (or vehicle origin if none).
Camera controls
| Input | Action |
|---|---|
| Middle mouse + drag | Orbit camera around the prop |
| Shift + middle mouse + drag | Pan camera |
| Scroll wheel | Zoom the camera in/out (does not resize the prop) |
The editor panel also provides on-screen buttons for orbit, pan, zoom, six preset views (front/back/left/right/top/bottom), flip, focus-on-prop, focus-on-vehicle, and a perspective toggle.
Transform gizmo
Drag the coloured arrows (translate) or rings (rotate) on the prop to position and rotate it precisely. Toolbar controls:
| Button | Action |
|---|---|
| W | Translate mode (move along X/Y/Z) |
| R | Rotate mode (rotate around X/Y/Z) |
| X | Toggle between world and local coordinate space |
The right-side panel exposes numeric X / Y / Z and RX / RY / RZ inputs for pixel-perfect placement.
Save / Cancel / Remove
| Button | Action |
|---|---|
| Save | Save the new prop position for this vehicle model and broadcast the change to all clients |
| Cancel (Escape) | Discard changes and restore the previous position |
| Remove | Delete the prop placement for this vehicle model — the radio prop will no longer spawn on this model |
| Export Config | Copy the saved placement into another resource's config — useful for script authors who want to ship positions with their vehicle packs |
Positions are keyed by vehicle model, so every vehicle of that model uses the same prop placement.
Radio Layouts
The radio automatically switches layout based on the player's current context:
| Context | Default Layout |
|---|---|
| On foot | ATX-8000 (handheld) |
| On foot, unfocused (optional) | ATX-8000H (handheld, minimal) |
| In vehicle | AFX-1500 (mobile) |
| In aircraft | TXDF-9100 (aviation) |
| In boat | AFX-1500G (marine) |
Ten radio models ship by default: AFX-1500, AFX-1500G, ARX-4000X, ATX-8000, ATX-8000G, ATX-8000H, ATX-NOVA, TXDF-9100, XPR-6500, and XPR-6500S.
Admins can override defaults per-vehicle-type, per-spawn-code, or per-focus-state via the admin panel or /tradio > Set as Default Layout for Vehicle. When Separate On-Foot Focus Layout is enabled in /tradio, focused and unfocused on-foot layouts are saved independently.
Channel Types
- Conventional — single shared frequency; everyone connected hears everyone else
- Trunked — sub-frequencies auto-assigned by location; dispatch still reaches all units via the control frequency
Example
Four units on the same trunked CAR-TO-CAR channel — two at Mission Row, two at Sandy Shores — end up on separate sub-frequencies. Dispatch reaches all four at once.
See Zones & Channels for the schema.
Scanning
Navigate to a channel and press SCN to add it to the scan list (press again to remove). The scan icon appears on the display while scanning is active.

Priority: your connected channel wins transmit priority. Among scanned channels, first-heard transmission takes priority over later ones. Transmitting on your primary mutes scan traffic until PTT release.
Channel List
Floating HUD showing who's on your channel. Enable via /tradio > Channel List.
Features:
- Callsign badges colored by the channel's GPS blip color
- Dispatchers pinned to top with a DSP tag
- TX indicator (green pulse = transmitting, red = panic)
- Patch-aware, trunked-aware, scanned-talker-aware (SCAN tag)
- Auto-aligns content to whichever side of the screen it sits on
- List grows downward at the top of the screen, upward at the bottom
Settings (in /tradio):
| Setting | Description |
|---|---|
| Channel List | Enable/disable |
| Active Talkers Only | Hide idle users |
| Move Channel List / Reset Channel List | Position + scale / reset to top-right |
Header badges: zone/channel name, frequency, P for patched, T for trunked, alert colour when active, flashing PANIC during emergencies.
Emergency Features
Panic Button
Press emergencyBtnKey or the on-radio emergency button. Your GPS blip flashes red for everyone whose NAC ID is in the channel's gps.visibleToNacs. Auto-clears after panicTimeout (default 60 s); press again or have a dispatcher clear it.
Alerts (SGN Button)
SGN fires Config.alerts[1] on the connected channel (default: SIGNAL 100); press again to clear. Players with tlib.admin or whose NAC ID matches dispatchNacId get the button. Dispatchers can trigger any alert on any channel.
Bonking (Transmission Collision)
Keying up while someone else is already transmitting plays a short bonk tone.
With blockTransmission on, the second PTT is suppressed; with it off, both go through and first-in wins display priority. Double-tap PTT within doubleTapWindow ms forces the second transmission through either way.
Configure in admin panel > Bonking.
Battery & Signal
Battery
Battery shown on the radio as 0–100%. Defaults: charges 0.5%/s in a vehicle, drains 0.1%/s on foot. At 0% the radio powers off. Override via Config.batteryTick in config.lua.
Signal Strength
Signal bars (1–5) reflect proximity to the nearest tower in Config.signalTowerCoordinates. Closer = more bars. The falloff slope is controlled by signalFalloffRate in the admin panel — higher values make bars drop faster as you move away.
Signal strength is purely cosmetic by default — it affects the icon on the radio display but not audio.
When Signal Degradation is enabled (admin panel), low signal also degrades voice audio: the further you are from any tower, the more garbled and dropout-prone your transmissions become. The ceiling is controlled by signalDegradationIntensity (0–100). At full bars, audio is clean; at zero bars, degradation reaches the configured intensity.
3D Audio
When 3D audio is enabled, nearby players hear your radio output (voice, tones, sirens, heli, gunshots) spatially positioned at your location.
When you hear another player in 3D
- Server has
enable3DAudioon - The other player has Earbuds OFF
- You're within 100 m of them (or 200 m if their vehicle is acting as the source — see Vehicle Radio)
You don't need to be on their channel, and your radio doesn't need to be on — anyone nearby can overhear.
Earbuds toggle
Gates your outgoing 3D broadcast. Toggle via ST menu or /tradio.
- Off — your radio broadcasts in 3D; bystanders can overhear your traffic
- On — your radio is private; no 3D output from you
Only affects your outgoing broadcast. You still hear other players based on their earbud settings.
What broadcasts
Voice, tones, siren loop (bgSirenCheck), helicopter rotors (from an active heli), and gunshots fired during a transmission.
See 3D Audio configuration for admin setup.
Vehicle Radio Prop
An AFX-1500 dashboard prop with a live channel display. Auto-spawns when you enter a vehicle with a saved prop position (set by an admin via the 3D Prop Editor).


Vehicle Radio (3D Audio)
With vehicleRadio3DAudioEnabled on, a player entering a vehicle claims it as a 3D radio source. Inside → the player is the source (100 m). Walk out past vehicle3DActivationDistance m → the vehicle takes over at 200 m range. Walk back → source hands back. Disconnect or leave → ownership releases.
One vehicle, one owner at a time.
Callsign System
With useCallsignSystem on (admin panel), players set a callsign that replaces their game name on radio and in the dispatch panel.
/callsign 2L-319 -- Set
/callsign -- ClearCommand name is configurable via callsignCommand. Callsigns persist in KVP. Dispatchers can assign them remotely or via the setCallsign server export.
Custom Radio Layouts
Layout-designer reference. Skip this unless you're building a new radio model.
Radio models are subdirectories of client/radios/. Two layout systems are supported:
ui.html(recommended) — HTML/CSS withdata-hud-*bindings. Previewable in a browser.config.json(legacy) — JSON coordinate layout. Edited in-game via admin debug mode.
If both exist, ui.html wins.
Files
| File | Required | Purpose |
|---|---|---|
ui.html | Yes (HTML layout) | Markup, styles, button hit zones |
radio.png | Yes | Light theme background |
radio-dark.png | No | Dark theme background (falls back to radio.png) |
icons/ | No | Icon overrides (fall back to default/icons/) |
sounds/ | No | WAV overrides (fall back to default/sounds/) |
tones.json | No | Tone overrides (merged with default/tones.json) |
config.json | Alternative | Legacy JSON layout |
New folders are auto-discovered — they appear in the Style picker on next radio open.
Loading behaviour
<script>tags andon*event handlers are stripped fromui.html— layouts are pure markup + CSS, no JS- Relative
src=/url()paths are rewritten to/client/radios/<model>/at runtime - The root element gets
theme-dark/theme-lightclasses on theme change - Elements with
.fit-textauto-scale font size — putdata-hud-texton an inner<span>
Root Element
<div class="radio" data-radio-width="300" data-radio-height="406" data-radio-toneset="default">| Attribute | Description |
|---|---|
data-radio-width | Canvas width (px) |
data-radio-height | Canvas height (px) |
data-radio-toneset | Tone set (default or custom) |
Data Bindings
| Attribute | Purpose | Example |
|---|---|---|
data-hud-text | Set text content | data-hud-text="ln01" |
data-hud-led | Toggle .active from boolean | data-hud-led="leds.power" |
data-hud-btn | Clickable hit zone | data-hud-btn="power" |
data-hud-show | Show when state truthy | data-hud-show="scan" |
data-hud-hide | Hide when state truthy | data-hud-hide="scan" |
data-hud-eq | Toggle .active when state equals value | data-hud-eq="signal:3" |
data-hud-attr | Set a DOM attribute from state | data-hud-attr="battery:data-level" |
State Keys
| Key | Type | Description |
|---|---|---|
ln01, ln02 | string | Display lines 1 and 2 |
btn01–btn05 | string | Soft button labels (ZN, CH, ST, CON, DSC, SCN, SGN, ...) |
time | string | Clock |
leds.power / leds.connected / leds.transmit | boolean | LED states |
signal | string | "1"–"5" or "hidden" |
battery | string | "0"–"5", "c" (charging), or "hidden" |
gps, scan, trunk, warn | boolean | Status icons |
alertVisible, alertMessage | boolean / string | Alert overlay |
theme | string | "Dark" or "Light" |
Button Keys
Use data-hud-btn="keyName" for hit zones. Include only what your layout uses.
Core: power, close, home, emergency
Navigation: btnUp/up, btnDown/down, btnLeft, btnRight, chUp/channelUp, chDwn/channelDown, zoneUp, zoneDown
Soft buttons (context per page):
| Key | Main | Zones | Channels | Settings |
|---|---|---|---|---|
btn1 | Open Zones | — | CON | Decrease value |
btn2 | Open Channels | Select zone | DSC | — |
btn3 | Open Settings | — | SCN/SGN/CT | Increase value |
btn4 | — | — | — | — |
Setting shortcuts — setting:<name>:<direction>:
| Key | Action |
|---|---|
setting:volume:up/down | Voice volume |
setting:tonevolume:up/down | SFX volume |
setting:3dvolume:up/down | 3D audio volume |
setting:style:up/down | Radio model |
Theme CSS
The root element receives theme-dark / theme-light:
.theme-dark .display-line { color: #fff; }
.theme-light .display-line { color: #464d49; }
.dark-only { display: none; }
.light-only { display: block; }
.theme-dark .dark-only { display: block; }
.theme-dark .light-only { display: none; }Browser Preview & Devtools
<script src="../devtools.js"></script> near the bottom of ui.html loads a preview overlay when opened in a browser — in-game it's stripped by the sanitizer.
The devtools panel provides:
- Toggle LEDs / signal / battery / icons / alert banner
- Drag-and-resize
data-hud-btnhit zones, export CSS - Theme toggle, scale preview
Hardcoded preview defaults ("Statewide", "DISP", "ZN"/"CH"/"ST", 14:30) live in HtmlRadioLayout.tsx.
For legacy JSON layouts, enable the in-game debug mode from the admin panel to drag and resize hit zones.
