Skip to content

CustodyComms

CustodyComms is an advanced FiveM Lua resource that adds realistic voice isolation and monitoring systems. It allows server admins to create interactive, location-based communication zones such as interrogation rooms, prison cells, or control centers, where voice chat automatically adapts to the environment by isolating conversations within defined areas, controlling who can hear or speak, and enabling monitoring or two-way communication from designated listening posts. This system brings a new level of immersion and realism to police, corrections, and security roleplay by simulating authentic audio behavior and controlled communication flow.

  • Voice-Isolated Zones: Set isolation and listening zones with automatic routing, isolation, and optional two-way talkback.
  • In-Game Zone Editor: Drag vertices, name zones, preview coverage, and save directly in-game, no file edits or restarts needed.
  • Immersive Interactions: Add animations, props, and targets so players “use” consoles or listening devices to tap into a room.
  • Permissions: Gate access by job/role (ESX, QBCore, QBox, Ox).
  • Optimised: In game 0.01-0.02ms client/server with 25 zones.
  • PD interview suites & interrogation rooms: Keep suspect audio contained while detectives monitor.
  • Prison cells & blocks: Isolate inmate comms per cell, allow monitoring from control rooms, enable per-cell talkback/overrides, and keep yard chatter contained.
  • More: Secure boardrooms, gang HQs, events.
  • Preconfigured Support: Includes ready-to-use zones for:

We’re always adding new supported interiors and maps.

Join our Discord and open a ticket to request a new location, or use the in-game editor to create and share your own zones.

  • /custodycomms: Opens the main management menu for the zone editor. Requires kf-custodycomms.command or group.admin ACE permission.

Example

server.cfg
add_principal identifier.fivem:1234 group.admin
or
add_ace identifier.fivem:1234 "kf-custodycomms.command" allow
    • ox_lib: Must be version v3.30.0 or higher.
    • kf-voice: Konflict Voice system (free)
    • ox_target: optional for object-based interactions.
  1. Move the dependencies and kf-custodycomms folders into your server’s resources directory.

  2. Add the following to your server.cfg.

    server.cfg
    setr voice_useNativeAudio true
    setr voice_useSendingRangeOnly true
    ensure kf-custodycomms

The main configuration is located in config.lua. You can modify this file to suit your server’s needs.

config.lua
Config = {
debug = true, -- Enables debug prints and visualizations for zones.
interrogationInput = false, -- Enables or disables the key press input for interrogation rooms.
listeningPostInput = false, -- Enables or disables the key press input for listening posts.
allowedJobs = { 'police', 'admin' }, -- A list of job/group names that are allowed to use the listening posts.
zoneNotifications = true, -- Toggles notifications when entering or exiting zones.
}

The primary way to create and manage zones is via the in-game editor. The editor allows for the creation, modification, and deletion of zones directly on your server.

To access the editor, you must have the appropriate permissions to use the command (see above).

  1. Open the command input in your chat window.
  2. Type /custodycomms and press Enter.
  3. A context menu will appear, providing options to either create a new zone or manage existing ones.
  1. Select “Create a new zone” from the context menu.
  2. The zone editor UI will appear, and you can begin drawing a polygon shape by clicking on the ground to place vertices, you can drag existing vertices to reshape the polygon, or delete them.
  3. Once you are satisfied with the shape, you can configure the zone’s properties in the UI.
  4. Click “Save” to create/edit the zone. The zone will be saved as a .lua file in the zones/ directory.

Zone files can also be created, modified, and deleted manually.

Zones are stored as individual Lua files in the /zones/ directory. Zone file names must be unique.

After editing a zone manually you should run the command /custodycomms rebuild to rebuild the zone-index.json file.

/zones/cell_1_1759674278.lua
return {
name = "unique_zone_id",
type = "poly",
points = { vector2(...), ... }, -- Minimum 3 points
thickness = 6, -- Vertical height
altitude = 68.4, -- Base Z coordinate
label = "Display Name",
-- Voice configuration
canTalk = false, -- Default talkback state
listens_to = {}, -- Array of zone names to monitor
isolateIncoming = false, -- Isolate incoming voice
isolateOutgoing = false, -- Isolate outgoing voice
-- Interaction
input = 38, -- FiveM control key (false to disable)
-- Optional features
animation = {
dictionary = "anim_dict",
name = "anim_name",
startCoords = vector3(...), -- Optional spawn point
prop = { ... } -- Optional prop configuration
},
objects = { -- Spawned props with optional targets
{
model = "prop_model",
coords = vector3(...),
rotation = vector3(0, 0, 0),
source = "spawned", -- "spawned" or "world"
target = "listen", -- "listen" or "toggleTalk" (optional)
label = "Interact Label" -- Optional target label
}
},
dependencies = { "resource_name" }, -- Required resources
category = "Category", -- Optional (auto-derived from path)
-- Metadata (auto-populated on save)
created_at = 1234567890,
created_by = "Player Name"
}