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.
Features
Section titled “Features”- 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.
Perfect For
Section titled “Perfect For”- 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:
- Vinewood Police Headquarters MLO - AshRigs
- Community Mission Row PD - SLB2k11
Requirements
Section titled “Requirements”- ox_lib: Must be version
v3.30.0or higher. - pma-voice fork (kf-voice): Our open source pma-voice fork (free).
- ox_target: optional for object-based interactions.
Want More Interiors or Maps?
Section titled “Want More Interiors or Maps?”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.
This resource is encrypted using Cfx.re asset escrow.
Commands
Section titled “Commands”/custodycomms: Opens the main management menu for the zone editor. Requireskf-custodycomms.commandorgroup.adminACE permission.
Example
add_principal identifier.fivem:1234 group.admin
or
add_ace group.group_name kf-custodycomms.command allowadd_principal identifier.fivem:1234 group.group_nameGetting Started
Section titled “Getting Started”-
Download the latest from Cfx.re Portal
Section titled “Download the latest from Cfx.re Portal” -
Download Dependencies
Section titled “Download Dependencies”- ox_lib: Must be version
v3.30.0or higher. - pma-voice fork (kf-voice): Our open source pma-voice fork (free).
- ox_target: optional for object-based interactions.
- ox_lib: Must be version
-
Ensure the pma-voice fork folder is named
Section titled “Ensure the pma-voice fork folder is named pma-voice”pma-voice -
Install
Section titled “Install”Move the dependencies and
kf-custodycommsfolders into your server’sresourcesdirectory. -
Add to
Section titled “Add to server.cfg”server.cfgAdd the following to your
server.cfg.server.cfg setr voice_useNativeAudio trueensure ox_libensure ox_targetensure pma-voiceensure kf-custodycomms
Configuration
Section titled “Configuration”The main configuration is located in config.lua. You can modify this file to suit your server’s needs.
Config = { -- Enables debug prints and visualizations for zones. debug = false,
-- The resource to use for voice context exports voiceProvider = 'pma-voice',
-- A list of job/group names that are allowed to use the listening posts. allowedJobs = { 'police', 'admin' },
-- The target resource to use, one of: 'ox_target', 'sleepless_interact', or 'qb-target' target = 'ox_target',
-- Toggles notifications -- entering or exiting zones. entryExitNotifications = false, -- toggling talk back state. toggleTalkNotifications = false, -- player lacks permission to use a zone. permissionErrorNotifications = false,
-- The notification resource to use, one of: 'ox_lib', 'esx_notify', 'qb-core', 'qbx_core', 'okokNotify', 'wasabi_notify', notify = 'ox_lib',
-- Enables or disables the key press input for communication rooms. interrogationInput = false, -- Enables or disables the key press input for listening posts. listeningPostInput = false, -- FiveM control key code https://docs.fivem.net/docs/game-references/controls/ defaultZoneInput = 38,}Zone Editor
Section titled “Zone Editor”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.
Accessing the Editor
Section titled “Accessing the Editor”To access the editor, you must have the appropriate permissions to use the command (see above).
- Open the command input in your chat window.
- Type
/custodycommsand press Enter. - A context menu will appear, providing options to either create a new zone or manage existing ones.
Creating/Editing a New Zone
Section titled “Creating/Editing a New Zone”- Select “Create a new zone” from the context menu.
- 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.
- Once you are satisfied with the shape, you can configure the zone’s properties in the UI.
- Click “Save” to create/edit the zone. The zone will be saved as a
.luafile in thezones/directory.
Zone Data Format
Section titled “Zone Data Format”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.
Example Zone File
Section titled “Example Zone File”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"}