F5 StudioF5 Studio
Skip to main content

Commands

F5 Board exposes two commands. Both can be renamed, disabled, or gated independently.

CommandDefaultDescriptionDefault access
/board/boardOpen the board catalog (NUI grid)Admin
/badmin/badminOpen the admin panel (map view + board list)Admin

/board — Board Catalog

Opens a NUI grid showing all configured board models. The player picks one, the catalog closes, and the placer opens.

config/config.lua
Config.Command = {
name = 'board',
enabled = true,
suggestion = 'ui_cmd_board_help',

access = 'admin',
permission = 'admin',
jobs = nil,

requestCooldownMs = 700,
placeCooldownMs = 400,
requestTimeoutMs = 3000,

requireItem = false,
}

Access Modes

The access field controls who can open the catalog:

ValueBehaviour
'admin'Only players who pass the permission check (Config.Command.permission)
'job'Admins (by permission), or any player whose job matches Config.Command.jobs
'everyone'Everyone
anything elseFail-closed — treated as 'admin'

Access — Admin Only (default)

Config.Command = {
access = 'admin',
permission = 'admin',
}

The player must pass the admin permission check (see Permissions for how this is resolved per framework).

Access — Job-Based

Single job, all grades
Config.Command = {
access = 'job',
permission = 'admin', -- admins bypass the job check
jobs = { 'police' },
}
Multiple jobs + per-grade rules
Config.Command = {
access = 'job',
permission = 'admin',
jobs = {
police = { min = 2 }, -- police grade >= 2
sheriff = { 3, 4, 5 }, -- sheriff grades 3, 4 or 5
medic = true, -- any medic
mechanic = { max = 3 }, -- mechanic grade <= 3
},
}

Job-spec shape is the same as Config.AllowedJobs — see the Configuration page for the full grammar.

Access — Everyone

Config.Command = {
access = 'everyone',
}

permission and jobs are ignored. Cooldowns and MaxBoardsPerPlayer still apply.

Item Gating (requireItem)

By default, /board lets the player place any configured board for free — the catalog is just a picker. Enabling requireItem turns the catalog into an inventory view: the player only sees boards they actually carry, and placement consumes one item.

Config.Command = {
requireItem = true,
}

With requireItem = true:

  • Each board tile in the catalog shows the carried count (3 / 5 available).
  • Tiles for items the player doesn't carry are dimmed and labelled MISSING ITEM.
  • Confirming a placement removes one item from the inventory (Bridge.RemoveItem).
  • If the remove call fails (full slot conflict, race condition), placement is aborted and the player notified.

Cooldowns and Timeouts

OptionDefaultDescription
requestCooldownMs700Min interval (ms) between opening the catalog. Prevents NUI flicker spam
placeCooldownMs400Min interval (ms) between consecutive board placements
requestTimeoutMs3000If the server doesn't respond to the catalog open request within this window, the player sees notify_catalog_timeout

Both cooldowns are tracked per player citizen ID, not per server slot. They're cleared when the player disconnects.

Disabling /board

Config.Command = {
enabled = false,
}

The command is unregistered. Players who type /board see notify_catalog_disabled. Item-triggered placement (Bridge.CreateUseableItem) still works.

Renaming /board

Config.Command = {
name = 'placeboard',
}

The command becomes /placeboard. The chat suggestion picks the new name automatically.

/badmin — Admin Panel

Opens the admin panel — a fullscreen map view with all placed boards, a filterable list, and per-board detail preview.

config/config.lua
Config.AdminCommand = {
name = 'badmin',
enabled = true,
suggestion = 'admin_command_help',
permission = 'admin',
ownerCacheTtlMs = 30000,
}

What the Panel Shows

SectionContent
Map viewPannable, zoomable game map with a pin per placed board, colored by blip color. Double-click a pin to open its preview
Board listFilterable list (search by owner name). Click a row to preview, hover for tooltip
PreviewStatic render of the board content + owner details (citizen ID, source, Steam, Discord), online status, model, coords
ActionsTELEPORT in front of the board · DELETE this board · DELETE ALL (with double-confirm) · REFRESH the list

Offline-Owner Resolution

The panel resolves the owner's display name even when they're offline by reading their charinfo from the database. The result is cached per citizen ID for ownerCacheTtlMs ms (default 30 s) to avoid hammering the DB while the panel is open.

Permissions

ActionRequired permission
Open /badminConfig.AdminCommand.permission (default admin)
Delete a single boardSame as above
Delete all boardsSame as above
Teleport to a boardSame as above

All admin actions are also audit-logged to Discord via the delete webhook event when configured — see Webhooks.

Disabling /badmin

Config.AdminCommand = {
enabled = false,
}

The command is unregistered. The admin functionality stays accessible via the NUI callbacks but with no entry point — effectively turning the admin panel off.

Permission Resolution

When the script asks Bridge.HasPermission(src, 'admin'), the bridge resolves it like this:

FrameworkDefault mechanism
QBCoreQBCore.Functions.HasPermission(src, 'admin')
QBoxIsPlayerAceAllowed(src, 'admin')
ESXxPlayer.getGroup() ∈ { 'admin', 'superadmin' }
ox_coreIsPlayerAceAllowed(src, 'admin')

You can globally switch to ACE-only mode, enable ACE fallback, or define custom logical permissions — see Permissions.

Chat Suggestions

Both commands publish chat suggestions via chat:addSuggestion. The suggestion text is a locale key, not a literal string:

config/config.lua
Config.Command.suggestion      = 'ui_cmd_board_help'    -- → 'Open the board catalog'
Config.AdminCommand.suggestion = 'admin_command_help' -- → 'Open the boards admin panel'

Translate those keys in locales/<code>.lua to localize the suggestions.

See Also

  • Permissions — full permission-mapping reference (ACE, framework-native, mixed)
  • Configuration — every Config.Command and Config.AdminCommand field
  • Features — what each /badmin action does in detail
  • Webhooks — Discord audit logging for /badmin actions