API Reference
Exports, state bags, and network events for integrating with tELS from other scripts.
Client exports
Both exports return nil when the entity isn't a tELS-configured vehicle — useful for detecting tELS vehicles without hard-coding model lists.
IsSirenActive
Returns whether any siren is playing (main, aux, or burst).
local active = exports['tELS']:IsSirenActive(vehicle)
-- true | false | nil| Parameter | Type | Notes |
|---|---|---|
vehicle | number | Vehicle entity handle |
AreLightsActive
Returns whether emergency lights are on (any stage > 0).
local on = exports['tELS']:AreLightsActive(vehicle)
-- true | false | nil| Parameter | Type | Notes |
|---|---|---|
vehicle | number | Vehicle entity handle |
State bags
Lighting and siren state syncs via OneSync state bags, so any script on any client can read the current state of any vehicle — no server round-trip required.
Entity state bags
Read with Entity(vehicle).state['key'] from either client or server.
| Key | Type | Description |
|---|---|---|
tels:active | boolean | Emergency lights active |
tels:patternIdx | number | Pattern index (1-based; 0 = lights-only) |
tels:stage | number | Current stage (0 = off, 1–3) |
tels:sirenOn | boolean | Main siren playing |
tels:sirenTone | number | Main siren tone index |
tels:auxSirenOn | boolean | Aux siren playing |
tels:auxSirenTone | number | Aux siren tone index |
tels:sirenBurst | boolean | Burst tone currently held |
tels:hornActive | boolean | Horn / airhorn active |
tels:cruiseOn | boolean | Cruise mode on |
tels:takedownOn | boolean | Takedown mode on |
tels:taMode | string | "off", "left", "right", "center" |
tels:presenceEnabled | boolean | Presence detection armed |
tels:presenceDetected | boolean | Presence condition currently satisfied (pushed by the owning client) |
tels:chirpActive | boolean | Chirp tone running |
tels:rumblerOn | boolean | Rumbler variant active |
tels:argesOn | boolean | Arges spotlight active |
tels:argesAimYaw | number | Arges spotlight aim (horizontal, degrees) |
tels:argesAimPitch | number | Arges spotlight aim (vertical, degrees) |
tels:ownedBy | number | Server ID of the player who claimed ownership of this vehicle (set by tels:claimOwnership when a player takes control) |
Player state bag
| Key | Type | Description |
|---|---|---|
tels:owner | boolean | true on the local player while they own any tELS vehicle. Used to filter out other officers from presence detection. |
Example
-- On the client: react to a nearby vehicle going Code 3
CreateThread(function()
while true do
Wait(500)
local veh = GetClosestVehicle(coords.x, coords.y, coords.z, 30.0, 0, 71)
if veh ~= 0 and Entity(veh).state['tels:active']
and (Entity(veh).state['tels:stage'] or 0) >= 2
and Entity(veh).state['tels:sirenOn'] then
-- code 3 behavior
end
end
end)Network events
Server → client
| Event | Payload | Purpose |
|---|---|---|
tels:config_receive | configs (table: modelName → config) | Broadcast full vehicle configs after a save or server start |
tels:serverDefaults | defaults (table) | Admin display defaults + available layouts + isAdmin flag |
tels:stateSync | senderSrc, netId, delta | Relayed local-state delta for remote clients when ownership changes |
tels:presenceSyncClient | senderSrc, netId, detected | Presence state broadcast from the owning client |
tels:notify | msg | Server-initiated on-screen notification |
Client → server
| Event | Payload | ACE | Purpose |
|---|---|---|---|
tels:requestDefaults | — | — | Request current server defaults and available layouts |
tels:saveServerDefaults | data | tlib.admin | Persist new server defaults |
tels:claimOwnership | netId | — | Claim vehicle ownership for state relay |
tels:stateBagRelay | netId, delta | — | Relay a state delta when the client loses network-entity ownership |
tels:presenceSync | netId, detected | — | Owner client pushes its presence state for other clients |
tels:ref_edit_pattern_delta | model, patternName, editData | tlib.admin | Apply a pattern delta to a referenced source vehicle |
tels:ref_edit_trigger | model, triggerId, newTrigger | tlib.admin | Replace a trigger in a referenced source vehicle |
tels:ref_edit_siren | model, newSirenConfig | tlib.admin | Update siren tones / airhorn / chirp on a referenced source |
tels:ref_edit_settings | model, newConfig | tlib.admin | Update siren behavior settings on a referenced source |
Configs auto-registered by Discovery
tELS uses tLib's Discovery module, which registers its own event set in addition to the above. The relevant ones from a consumer's perspective:
| Event | Direction | Purpose |
|---|---|---|
tels:config_receive | S → C | Authoritative config broadcast |
tels:externalSourceInfo | S → C | Which resource bundled each model's config |
tels:exportTargets | S → C | List of models available for export / bundling |
Discovery metadata
Vehicle resources that ship a bundled config declare it via fxmanifest metadata:
| Field | Value |
|---|---|
| Metadata key | tels_config |
| Default filename | tels.json |
| Local storage | data.json at the tELS resource root |
| Event prefix | tels |
See Configuration → Vehicle-developer export for the full setup.
Internal globals (advanced)
These are Lua globals exposed across tELS client files. They're intended for internal use but can be read from scripts that merge into the tELS resource. Do not rely on them from other resources — signatures and names may change.
| Global | Source | Purpose |
|---|---|---|
lbarGetLocalState(vehicle) | cl_lights.lua | Local state table for a vehicle (returns nil for remote) |
lbarGetMaxStage(modelName) | cl_lights.lua | Max configured stage for a vehicle model |
getVehicleConfig(modelName) | cl_lights.lua | Full resolved config for a model |
getCustomPatterns(modelName) | cl_lights.lua | Resolved patterns list (refs dereferenced) |
getResolvedTriggers(modelName) | cl_lights.lua | Resolved triggers list |
getSirenConfig(modelName) | cl_lights.lua | Resolved siren config |
resolveColorIndex(led, index, frame) | shared/utils.lua | Pattern-cell lookup with legacy fallback |
renderLEDSet(veh, leds, colors, opts) | cl_renderer.lua | Unified LED render entry point |
If you're building tooling or extensions inside the tELS resource, these are the right hooks. External integrations should stick to the exports and state bags above.
