> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revoscripts.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuration

> Customize Revo HUD for your server: every option in config.lua explained.

> [!NOTE]
>
> Configuration is done in the `config.lua` file located in the `revo_hud` directory. It is never locked by escrow, so you can edit it freely. Restart the resource after changing it.

`config.lua` holds the **server-wide** settings. Each player's own look (colors, styles, layout and sounds) is picked in the in-game menu, `/hud`, and saved on their PC. The options are grouped into seven numbered sections:

1. [Framework](#1-framework)
2. [Customization, Branding and Presets](#2-customization-branding-and-presets)
3. [Jobs and Vehicle Classes](#3-jobs-and-vehicle-classes)
4. [HUD Elements](#4-hud-elements)
5. [Vehicles](#5-vehicles)
6. [Player Status and Effects](#6-player-status-and-effects)
7. [Advanced](#7-advanced)

> [!TIP]
>
> Most servers only touch a handful of options: your server name and logo (`Config.PlayerInfo`), the starting look (`Config.Customization.defaultPreset`), `Config.VoiceSystem`, `Config.DefaultSpeedUnit` and `Config.Locale`.

***

## 1. Framework

### Framework

```lua theme={null}
Config.Framework = 'auto'
```

Which framework the HUD reads player data from.

* `'auto'`: detects it for you (Qbox, then QBCore, then ESX)
* `'qbox'`, `'qbcore'`, `'esx'`: force a framework
* `'standalone'`: no framework

Where the HUD reads from for each framework:

| | ESX Legacy | QBCore | Qbox |
| - | - | - | - |
| Cash and bank | `accounts` (`money`, `bank`) | `money.cash`, `money.bank` | `money.cash`, `money.bank` |
| Dirty money | `black_money` account | `markedbills` item | `black_money` item |
| Hunger and thirst | `esx_status` | player metadata | state bags |
| Society boss | grades in `Config.Money.bossGrades` | `job.isboss` | `job.isboss` |

If nothing on your server supplies hunger or thirst, feed the bars with `exports['revo_hud']:setStatus` (see [Exports](/products/hud/exports#status-bars)).

### Visibility

```lua theme={null}
Config.Visibility = {
    waitForCharacter    = true,
    hideDuringScenes    = true,
    ignoreScriptCameras = false,
    settleMs            = 1500,
    onboardingDelayMs   = 3000,
}
```

Controls when the HUD appears after a player joins.

* `waitForCharacter`: wait for the framework to load a character before showing the HUD. On a custom framework, set this to `false` or call `exports['revo_hud']:setCharacterLoaded(true)` when the character loads.
* `hideDuringScenes`: step aside during fades, script cameras and cutscenes.
* `ignoreScriptCameras`: set to `true` if a camera script is always on and the HUD never appears. The HUD may then show over appearance creators.
* `settleMs`: milliseconds the screen must stay clear before the HUD comes back.
* `onboardingDelayMs`: milliseconds before the first-join setup opens.

### Speed Unit

```lua theme={null}
Config.DefaultSpeedUnit = 'kmh'
```

The speed unit new players start with: `'kmh'` or `'mph'`. Each player can switch in the menu.

> [!NOTE]
>
> Every speed value inside `config.lua` is always in **km/h**, whatever unit players see.

### Language

```lua theme={null}
Config.Locale = 'en'
```

The language everyone starts in: `'en'`, `'es'`, `'fr'`, `'de'`, `'pt-br'`, `'tr'`, `'pl'`, `'nl'` or `'it'`. Each player can pick their own in **/hud > General > Language**. See [Customization](/products/hud/customization#languages) to change a word or add a language.

### Debug Mode

```lua theme={null}
Config.Debug = false
```

Prints what the HUD detects and does to the F8 console (and the server side to the server console), and adds the `/revohud_debug` command. Leave it off on a live server. See [Troubleshooting](/products/hud/troubleshooting#debug-mode).

***

## 2. Customization, Branding and Presets

### Settings Command

```lua theme={null}
Config.SettingsCommand = 'hud'
Config.SettingsAliases = { 'hudmenu' }
```

* `Config.SettingsCommand`: the command that opens the HUD settings menu
* `Config.SettingsAliases`: other commands that open it too

### Customization

```lua theme={null}
Config.Customization = {
    allowPlayersToEditLayout   = true,
    allowPlayersToEditSettings = true,
    defaultPreset              = 'sleek-modern',
    forcePreset                = false,
    adminAce                   = 'revo_hud.admin',
    adminsBypassLocks          = true,
}
```

Decides what players may change and what look they start with.

* `allowPlayersToEditLayout`: players can open Edit Mode and move elements.
* `allowPlayersToEditSettings`: players can change colors, styles and options. When `false`, `/hud` does nothing for players.
* `defaultPreset`: the look new players start with, and what **Reset Defaults** restores. See the options below.
* `forcePreset`: re-apply `defaultPreset` on every join, overwriting players' edits.
* `adminAce`: the ACE that marks staff.
* `adminsBypassLocks`: staff can still edit while players are locked out.

`defaultPreset` accepts:

* A built-in preset id: `'sleek-modern'`, `'white-blocks'`, `'aurora-minimal'`, `'toxic-horizon'`, `'tactical-chamfered'`, `'center-console'`, `'raid-frame'`, `'radar-dock'`, `'cockpit'`, `'halo'`, `'neon-vice'`, `'pit-wall'`, `'skyline'`, `'night-rack'`, `'wraparound'`, `'apex'` or `'triple-screen'`
* A name from `Config.Presets.custom`
* A `REVO1-...` share code, copied from the Presets tab in game
* `''` for the plain built-in layout

> [!NOTE]
>
> Staff are found by an ACE. Add it in `server.cfg`: `add_ace group.admin revo_hud.admin allow`

### Branding

```lua theme={null}
Config.Branding = {
    lockLogo         = false,
    adminsBypassLock = false,
    defaultLogoSize  = 120,
}
```

Controls the brand element (server name or logo) in the Player Info panel.

* `lockLogo`: players cannot hide, move or resize it.
* `adminsBypassLock`: let staff move it anyway.
* `defaultLogoSize`: starting scale in percent (10 to 200).

### Presets

```lua theme={null}
Config.Presets = {
    enabled            = true,
    showBundled        = true,
    allowPlayerPresets = true,
    label              = nil,
    custom             = {
        -- { name = 'Nightshift', code = 'REVO1-...' },
    },
}
```

Controls preset sharing and the presets library.

* `enabled`: turn preset sharing and the library on or off.
* `showBundled`: show the 17 built-in preset designs.
* `allowPlayerPresets`: players can save their own presets.
* `label`: the badge label (`nil` uses your server name).
* `custom`: your own presets, added to every player's list. Each entry is a `name` and a `REVO1-...` share code.

See [Customization](/products/hud/customization#create-and-share-your-own-preset) for how to create a share code.

### Onboarding

```lua theme={null}
Config.Onboarding = {
    enabled = true,
    command = 'onboard',
    skin    = 'auto',
    steps = {
        look   = true,
        theme  = true,
        shape  = true,
        status = true,
    },
}
```

The welcome wizard shown on a first join.

* `enabled`: turn the wizard on or off.
* `command`: opens it again any time. Use `false` or `''` for no command.
* `skin`: `'auto'` matches `defaultPreset`, or force `'standard'` or `'aurora'`.
* `steps`: switch off any question that `defaultPreset` already answers. With every step off, the wizard is skipped.
  * `look`: a complete look (colors, styles and layout)
  * `theme`: accent color
  * `shape`: minimap, round or square
  * `status`: status bar style

***

## 3. Jobs and Vehicle Classes

Nearly every feature in the config takes the same `audience` list, which decides who gets that feature. An empty list means everyone.

```lua theme={null}
audience = {
    jobs = {}, exceptJobs = {},
    classes = {}, exceptClasses = {},
    models = {}, exceptModels = {},
    onDuty = nil,
}
```

* `jobs` / `exceptJobs`: a job name (`'police'`), a job type (`'leo'`), or a group name defined below.
* `classes` / `exceptClasses`: a vehicle class name or id.
* `models` / `exceptModels`: vehicle spawn names, such as `'police3'`.
* `onDuty`: set to `true` and the job only counts while the player is clocked on.

Vehicle classes you can use:

| Id | Class | Id | Class |
| - | - | - | - |
| 0 | `compacts` | 12 | `vans` |
| 1 | `sedans` | 13 | `cycles` |
| 2 | `suvs` | 14 | `boats` |
| 3 | `coupes` | 15 | `helicopters` |
| 4 | `muscle` | 16 | `planes` |
| 5 | `sportsClassics` | 17 | `service` |
| 6 | `sports` | 18 | `emergency` |
| 7 | `super` | 19 | `military` |
| 8 | `motorcycles` | 20 | `commercial` |
| 9 | `offRoad` | 21 | `trains` |
| 10 | `industrial` | 22 | `openWheel` |
| 11 | `utility` | | |

### Job Groups

```lua theme={null}
Config.Jobs = {
    groups = {
        emergency = { 'police', 'sheriff', 'bcso', 'sast', 'sasp', 'leo',
                      'ambulance', 'ems', 'doctor', 'fire' },
        transport = { 'trucker', 'taxi', 'bus' },
    },
    matchJobType = true,
    onDutyOnly   = false,
}
```

* `groups`: name a set of jobs once, then use the name in any `jobs` or `exceptJobs` list.
* `matchJobType`: a job type (`'leo'`, `'ems'`) matches as well as the job name.
* `onDutyOnly`: jobs only count while clocked on. ESX has no duty state.

**Example:** let responders off the seatbelt rule, and give nitrous only to mechanics and racers:

```lua theme={null}
Config.Seatbelt.audience.exceptJobs = { 'emergency' }
Config.Nitro.audience.jobs = { 'mechanic', 'racer' }
```

> [!TIP]
>
> With `Config.Debug = true`, run `/revohud_debug audience` in game to see your job, vehicle class and which features you get.

***

## 4. HUD Elements

### Components

```lua theme={null}
Config.Components = {
    PlayerHUD  = true,
    VehicleHUD = true,
    Minimap    = true,
    Compass    = true,
    StreetName = true,
    WeaponHUD  = true,
    Crosshair  = true,
    Health  = true,
    Armor   = true,
    Hunger  = true,
    Thirst  = true,
    Stamina = true,
    Stress  = true,
    Oxygen  = true,
    Voice   = true,
}
```

Switch an element off **for everyone**. Players can hide more in `/hud`, but can never bring back what is off here.

* `PlayerHUD`: the status bars
* `VehicleHUD`: speedometer, speed limit sign, drift counter
* `Minimap`, `Compass`, `StreetName`, `WeaponHUD`, `Crosshair`
* `Health`, `Armor`, `Hunger`, `Thirst`, `Stamina`, `Stress`, `Oxygen`, `Voice`: the single status bars

### GTA HUD Components

```lua theme={null}
Config.HideGTAComponents = true
Config.HiddenGTAComponents = {
    [1] = false, -- Wanted stars
    [2] = false, -- Weapon icon
    [3] = true,  -- Cash
    [4] = true,  -- MP cash
    [6] = true,  -- Vehicle name
    [7] = true,  -- Area name
    [8] = true,  -- Stock speedometer
    [9] = true,  -- Cash change
}
```

GTA's own HUD parts to hide (`true` means hidden), so they do not double up with this HUD. Set `Config.HideGTAComponents = false` to leave all of them alone.

### Player Info

```lua theme={null}
Config.PlayerInfo = {
    enabled           = true,
    serverName        = 'SERVER NAME',
    logoType          = 'image',
    logoPath          = 'server-logo.png',
    logoText          = 'LOGO',
    showServerId      = true,
    showName          = true,
    showJob           = true,
    showCash          = true,
    showBank          = true,
    showPing          = true,
    showTime          = true,
    showOnlinePlayers = true,
    showDirtyMoney    = true,
    showSociety       = true,
}
```

What the Player Info panel may show.

* `serverName`: your server's name, shown in setup and on the Presets tab.
* `logoType`: `'image'`, or `'text'` to use `logoText` instead.
* `logoPath`: a file in `revo_hud/html/dist/` (capital letters count), or a full `https://` link.
* `logoText`: the text logo, and the fallback if the image is missing.
* `showDirtyMoney`: shown only while the player carries any.
* `showSociety`: the job's society balance, shown to its boss only.
* All other `show...` options toggle that line.

### Money

```lua theme={null}
Config.Money = {
    esxCashAccount = 'money',
    esxBankAccount = 'bank',
    qbCashKey      = 'cash',
    qbBankKey      = 'bank',
    dirtyAccount   = 'black_money',
    dirtyItem      = 'auto',
    societyBanking = 'auto',
    bossGrades     = { 'boss' },
}
```

Where cash and bank are read from. These are stock names, so change them only if your server renamed one.

* `esxCashAccount` / `esxBankAccount`: ESX accounts in `PlayerData.accounts`.
* `qbCashKey` / `qbBankKey`: QBCore and Qbox keys in `PlayerData.money`.
* `dirtyAccount`: the ESX dirty money account.
* `dirtyItem`: the QBCore and Qbox dirty money item. `'auto'` uses `markedbills` on QBCore and `black_money` on Qbox.
* `societyBanking`: `'auto'` tries each banking resource that is running (`Renewed-Banking`, `qb-banking`, `qb-management`, `okokBanking`, `esx_addonaccount`).
* `bossGrades`: ESX grades that are shown the society balance. QBCore and Qbox use `isboss`.

### Minimap

```lua theme={null}
Config.Minimap = {
    defaultShape      = 'square',
    defaultVisibility = 'always',
    requiredItem      = 'phone',
    itemCheckInterval = 2000,
    mapStyle          = 'stock',
    zoomLevel         = 1000,
    sizeScale         = 1.0,
}
```

* `defaultShape`: `'square'` or `'circle'`. Players can change it.
* `defaultVisibility`: `'always'`, `'vehicle'` (only in vehicles) or `'item'` (only while carrying `requiredItem`).
* `requiredItem`: the item for `'item'` visibility.
* `itemCheckInterval`: milliseconds between inventory checks for `'item'` visibility.
* `mapStyle`: `'stock'`, `'postal'` or `'satellite'`. The last two need a map pack, see [Minimap styles](/products/hud/customization#minimap-styles).
* `zoomLevel`: `1000` is stock GTA V, `1100` is for the satellite or postal atlas.
* `sizeScale`: minimap size multiplier.

### Big Map

```lua theme={null}
Config.BigMap = {
    enabled = true,
    command = 'bigmap',
    key     = '',
    hold    = false,
}
```

An expanded radar. `command` toggles it, `key` is an optional keybind (for example `'CAPS'`), and `hold = true` makes the key expand the map only while held instead of toggling it.

### Postals

```lua theme={null}
Config.Postals = {
    enabled        = true,
    file           = 'data/postals.json',
    resource       = nil,
    exportName     = 'getPostal',
    updateInterval = 500,
}
```

The postal code shown beside the street name.

* `file`: the bundled postal grid.
* `resource`: read another resource instead, for example `'nearest-postal'`.
* `exportName`: that resource's export.
* `updateInterval`: milliseconds between updates.

### Keybind Hints

```lua theme={null}
Config.KeybindHints = {
    enabled = true,
    entries = {
        { id = 'seatbelt',    label = 'Seatbelt', key = 'B' },
        { id = 'engine',      label = 'Engine',   key = 'G' },
        { id = 'vehcontrols', label = 'Controls', key = 'F7' },
        { id = 'cruise',      label = 'Cruise',   key = 'CAPS' },
        { id = 'nitro',       label = 'Nitrous',  key = 'LSHIFT' },
        { id = 'shiftup',     label = 'Shift Up', key = 'E' },
        { id = 'shiftdown',   label = 'Shift Dn', key = 'Q' },
    },
}
```

The hint panel. `key` is the default, but players see the key **they** bound. To show another resource's keybind, add its command, for example `command = 'emotes'`.

> [!NOTE]
>
> Cruise control has no key bound by default (`Config.VehicleControls.cruiseControl.key = ''`), although the hint shows `CAPS`. Set the cruise key to match, or remove the cruise hint.

### Notifications

```lua theme={null}
Config.Notifications = {
    enabled         = true,
    defaultDuration = 4000,
    overrideESX        = true,
    overrideQBCore     = false,
    bridgeLegacyEvents = true,
    suppressNativeFeed = true,
}
```

Style, sound and how many show at once are each player's choice in `/hud`.

* `defaultDuration`: milliseconds, for a notification that does not set one.
* `overrideESX`: show `esx:showNotification` in the HUD's style, while `esx_notify` is not running.
* `overrideQBCore`: show `QBCore:Notify` in the HUD's style. QBCore and Qbox draw it themselves, so turn this on only after removing theirs.
* `bridgeLegacyEvents`: pick up okokNotify, mythic\_notify, pNotify and t-notify notifications while that script is not installed.
* `suppressNativeFeed`: hide GTA's own feed above the radar.

To send the **framework's own** notifications to the HUD, change one function in the framework. A framework's notify function runs inside the framework, so the HUD cannot replace it from outside.

> [!WARNING]
>
> Back up the file first. A framework update puts the original back.

**ESX**

In `es_extended/client/functions.lua`:

```lua theme={null}
function ESX.ShowNotification(message, notifyType, length, title, position)
    return exports.revo_hud:Notify(title, message, notifyType or 'info', length)
end
```

**QBCore**

In `qb-core/client/functions.lua`. Leave `overrideQBCore = false` (the default) so nothing shows twice:

```lua theme={null}
function QBCore.Functions.Notify(text, texttype, length, icon)
    if type(text) == 'table' then
        return exports.revo_hud:Notify(text.caption and text.text or nil, text.caption or text.text, texttype or 'primary', length)
    end
    exports.revo_hud:Notify(nil, text, texttype or 'primary', length)
end
```

**Qbox**

In `qbx_core/client/functions.lua`, the `Notify` function:

```lua theme={null}
function Notify(text, notifyType, duration, subTitle)
    if type(text) == 'table' then
        return exports.revo_hud:Notify(text.text, text.caption, notifyType, duration)
    end
    if subTitle then
        return exports.revo_hud:Notify(text, subTitle, notifyType, duration)
    end
    exports.revo_hud:Notify(nil, text, notifyType, duration)
end
```

Types are matched for you: QBCore's `primary` and Qbox's `inform` show as `info`. Your own scripts can send notifications too, see [Exports](/products/hud/exports#notifications).

### Voice

```lua theme={null}
Config.VoiceSystem = 'pma-voice'

Config.VoiceIndicator = {
    mode        = 'auto',
    showKey     = true,
    key         = 'N',
    hideWhenOff = true,
}

Config.VoiceRanges = {
    [1.5] = { pct = 33,  label = 'Whisper' },
    [3.0] = { pct = 66,  label = 'Normal'  },
    [6.0] = { pct = 100, label = 'Shout'   },
}
```

* `Config.VoiceSystem`: `'pma-voice'`, `'saltychat'`, `'mumble-voip'` or `'none'`.
* `mode`: `'auto'` works out push to talk or open mic from play, or force `'ptt'` or `'open'`.
* `showKey`: for push to talk, show the key to hold beside the mic.
* `key`: the key shown if the game does not name it.
* `hideWhenOff`: hide the mic while voice chat is off (`false` shows it crossed out).
* `Config.VoiceRanges`: maps each voice range in meters to the bar fill and the label shown.

### Cinematic Mode

```lua theme={null}
Config.CinematicMode = {
    enabled = true,
    command = 'cinematic',
}
```

`/cinematic` toggles black bars with the HUD hidden. You can also add a `key` to the table to give it a keybind.

### Crosshair

```lua theme={null}
Config.Crosshair = {
    hideGameReticle = true,
}
```

The custom crosshair is switched on by each player in `/hud`. `hideGameReticle` hides GTA's own reticle while it is up.

***

## 5. Vehicles

### Fuel

```lua theme={null}
Config.FuelSystem = 'auto'
```

The fuel gauge source. `'auto'` finds a running fuel script, and `'native'` reads the game's own level. Supported: `ox_fuel`, `LegacyFuel`, `cdn-fuel`, `ps-fuel`, `lj-fuel`, `okokGasStation`, `qs-fuelstations` and `lc_fuel`. Any resource with a `GetFuel(vehicle)` export also works by name.

### Seatbelt

```lua theme={null}
Config.Seatbelt = {
    enabled    = true,
    key        = 'B',
    ejectSpeed = 80,
    warning    = true,
    warningInterval = 25000,
    warningSpeed    = 20,
    sound      = true,
    audience   = {
        exceptClasses = { 'motorcycles', 'cycles', 'boats', 'trains' },
        exceptJobs    = {},
        exceptModels  = {},
    },
}
```

* `key`: the default key. Players can rebind it.
* `ejectSpeed`: km/h above which an unbelted driver can go through the windscreen.
* `warning`: remind a driver who is not buckled up.
* `warningInterval`: milliseconds between reminders.
* `warningSpeed`: km/h, only remind once the car is moving.
* `sound`: buckle and unbuckle sound.
* `audience`: who has to buckle up.

### Harness

```lua theme={null}
Config.Harness = {
    enabled     = true,
    defaultTier = 0,
    tiers = {
        { label = 'Basic Harness',  ejectChance = 0.5, speedBonus = 20  },
        { label = 'Sport Harness',  ejectChance = 0.2, speedBonus = 45  },
        { label = 'Racing Harness', ejectChance = 0.0, speedBonus = 100 },
    },
}
```

Racing harness tiers give a lower chance of ejection and need a higher speed for it.

* `defaultTier`: `0` means no harness is fitted.
* `ejectChance`: chance of ejection (0 to 1).
* `speedBonus`: extra km/h needed before ejection can happen.

Your own scripts can fit a harness with `exports['revo_hud']:setHarnessTier(tier)`.

### Crash Impact

```lua theme={null}
Config.CrashImpact = {
    enabled = true,
    preset = 'realistic',
    effects = {
        cameraShake = true,
        blur        = 'heavy',
        darkEdges   = 'medium',
        earRinging  = true,
        muffle      = true,
        heartbeat   = true,
        ragdoll     = true,
        ejection    = true,
    },
    volume     = 0.8,
    seatbelt   = true,
    headOnOnly = true,
}
```

What a driver feels when the car hits something. Each crash is graded by how hard and from which side it was: **light** (a knock), **medium** (a jolt and dark edges) or **heavy** (a bad head-on with deep blur, ringing ears, a quiet world and a heartbeat).

`preset` sets how hard a hit must be to count and how strong the effects are:

| Preset | Behavior |
| - | - |
| `'subtle'` | Only proper crashes register. Short and soft (about 3.5 s). |
| `'realistic'` | Everyday bumps stay light, real crashes hurt (about 4.5 s). |
| `'intense'` | Smaller hits count, with stronger effects (about 5 s). |

Each entry in `effects` is `true` (every crash), `false` (never), or the lightest crash it appears at: `'light'`, `'medium'` or `'heavy'`.

* `cameraShake`: the camera jolts on impact.
* `blur`: vision blurs and pushes in.
* `darkEdges`: the screen darkens from the side that was hit.
* `earRinging`: ears ring after a heavy crash.
* `muffle`: world sounds go quiet while the ears ring.
* `heartbeat`: a heartbeat after a heavy crash.
* `ragdoll`: an unbelted driver is thrown about on heavy crashes.
* `ejection`: an unbelted driver can go through the windscreen.

Other options:

* `volume`: crash sounds (0.0 to 1.0). Each player's own audio setting applies on top.
* `seatbelt`: a belt makes crashes one level lighter, no belt one level heavier.
* `headOnOnly`: only head-on crashes can be heavy or eject. Side and rear stay medium at most.

### Engine Toggle and Boat Anchor

```lua theme={null}
Config.EngineToggle = {
    enabled = true,
    key     = 'G',
}

Config.BoatAnchor = {
    enabled = true,
    key     = 'N',
}
```

Default keys to switch the engine on and off, and to drop or raise the anchor on boats. Players can rebind them.

### Vehicle Controls

```lua theme={null}
Config.VehicleControls = {
    enabled = true,
    command = 'vehcontrols',
    key     = 'F7',

    audience = {
        jobs       = {},
        exceptJobs = {},
    },

    show = {
        engine       = true,
        handbrake    = true,
        doors        = true,
        windows      = true,
        roof         = true,
        indicators   = true,
        seatbelt     = true,
        cruise       = true,
        limiter      = true,
        transmission = true,
        landingGear  = true,
        anchor       = true,
        seats        = true,
        lights       = true,
        ambience     = true,
        extras       = true,
        livery       = true,
    },

    seatSwap = {
        maxSpeed        = 10,
        allowDriverSeat = true,
    },

    ambience = {
        requireNeonKit   = false,
        headlightColours = true,
        effects          = true,
    },

    extrasMinBodyHealth = 950,

    cruiseControl = {
        enabled  = true,
        command  = 'revo_cruise',
        key      = '',
        minSpeed = 30,
    },

    speedLimiter = {
        enabled = true,
        min     = 20,
        max     = 300,
        default = 80,
        step    = 10,
    },
}
```

The vehicle control panel. Each control hides itself when the vehicle has no use for it.

* `command` and `key`: the command and default key that open the panel.
* `audience`: who can open it. Empty means everyone, for example `jobs = { 'mechanic' }`.
* `show`: which controls it offers. Set any to `false` to remove that control.
  * `doors`: doors, hood and trunk
  * `roof`: convertibles
  * `indicators`: left, hazards and right
  * `seatbelt`: belt and harness
  * `cruise`, `limiter`, `transmission`: need their own feature to be enabled
  * `landingGear`: aircraft
  * `anchor`: boats
  * `seats`: move to a free seat
  * `lights`: headlights off, low or high
  * `ambience`: the Lights page (underglow, headlight colour, cabin light)
  * `extras`: vehicle extras such as light bars and racks
  * `livery`: livery, where the car has more than one
* `seatSwap.maxSpeed`: km/h, above this a player stays in their seat.
* `seatSwap.allowDriverSeat`: passengers may climb into a free driver's seat.
* `ambience.requireNeonKit`: `true` means underglow only works on cars that had neon fitted at a tuning shop.
* `ambience.headlightColours`: fit xenon for free when a headlight color is picked (`false` hides the colors).
* `ambience.effects`: Breathe, pulse, rainbow and flash effects.
* `extrasMinBodyHealth`: toggling an extra repairs the car, so it is refused below this body health (0 to 1000).
* `cruiseControl`: `minSpeed` is the km/h needed to engage, and `key` is an optional keybind.
* `speedLimiter`: the `min`, `max`, `default` and `step` of the limiter in km/h.

### Media Player

```lua theme={null}
Config.MediaPlayer = {
    enabled  = true,
    controls = 'front',
    distance        = 30,
    maxVolume       = 100,
    defaultVolume   = 60,
    closedCarVolume = 0.35,
    otherCarVolume  = 0.5,
    maxQueue        = 25,
    allowStreams = false,
    audience = {
        exceptClasses = { 'cycles', 'trains' },
    },
}
```

The vehicle panel's Media tab: YouTube playback synced for everyone in and near the car. **Needs OneSync.**

* `controls`: who can change what plays: `'driver'`, `'front'` (driver and front passenger) or `'anyone'`.
* `distance`: meters the sound carries outside the car.
* `maxVolume`: the loudest the car can be set (0 to 100).
* `defaultVolume`: the starting volume.
* `closedCarVolume`: volume heard from outside with the doors and windows shut (0 to 1).
* `otherCarVolume`: volume heard from inside a different vehicle (0 to 1).
* `maxQueue`: the maximum queue length.
* `allowStreams`: also allow direct `https` audio links (radio, `.mp3`). Off by default, because listeners' games fetch the link, so its host sees their IP addresses.
* `audience`: which vehicles have a media player. Empty means all.

### Quick Pins

```lua theme={null}
Config.QuickPins = {
    enabled = true,
    maxPins = 20,
    presets = {
        { label = 'Legion Square',    x = 160.45,   y = -1001.23 },
        { label = 'Pillbox Hospital', x = 294.07,   y = -580.97 },
        { label = 'Police Station',   x = 427.41,   y = -978.94 },
        { label = 'Airport',          x = -1031.38, y = -2730.54 },
    },
}
```

The vehicle panel's **Places** tab: one-click GPS waypoints. Players' own pins stay on their PC. The `presets` are shared with everyone and cannot be deleted.

* `maxPins`: how many pins a player can save.
* `presets`: your shared places as `{ label, x, y }`. Leave it empty for none.

> [!TIP]
>
> Use a road-side spot rather than a building center. The game moves a waypoint it cannot route to.

### Manual Transmission

```lua theme={null}
Config.ManualTransmission = {
    enabled      = true,
    defaultOn    = false,
    command      = 'gearbox',
    toggleKey    = '',
    shiftUpKey   = 'E',
    shiftDownKey = 'Q',
    gearSpeedLimits     = true,
    autoDownshiftOnStop = false,
    preventBrakeReverse = true,
    audience     = {
        exceptClasses = { 'motorcycles', 'cycles', 'boats',
                          'helicopters', 'planes', 'trains' },
        jobs          = {},
    },
}
```

* `defaultOn`: new drivers start in manual.
* `command`: the command that switches manual on and off.
* `toggleKey`: an optional keybind to switch manual on and off.
* `shiftUpKey` / `shiftDownKey`: the default shift keys.
* `gearSpeedLimits`: each gear tops out at a realistic speed.
* `autoDownshiftOnStop`: drop to 1st gear on a full stop.
* `preventBrakeReverse`: holding the brake in a forward gear stops the car without reversing.

### Nitrous

```lua theme={null}
Config.Nitro = {
    enabled    = true,
    fitting    = 'item',
    refill     = 'item',
    kitItem    = 'nitrous_kit',
    bottleItem = 'nitrous_bottle',
    fitTime    = 8000,
    refillTime = 4000,
    driveBoost = true,

    key      = 'LSHIFT',
    purgeKey = 'LCONTROL',
    flowKey  = 'PAGEUP',
    command  = 'revo_nitro',

    drainRate      = 16,
    purgeDrain     = 5,
    maxBurnTime    = 3500,
    cooldown       = 4000,
    overheatDamage = 100,
    minSpeed       = 5,
    rechargeRate   = 5,
    rechargeDelay  = 3000,

    exhaustFlames      = true,
    lightTrails        = true,
    purgeSmoke         = true,
    purgeColour        = '#FFFFFF',
    screenSpeedFx      = true,
    motionBlur         = true,
    motionBlurStrength = 0.80,
    colorEffect        = false,
    cameraShake        = true,
    shakeAmount        = 0.25,
    nativeAudio        = true,
    purgeAudio         = true,
    exhaustPops        = true,

    allowElectric = false,

    audience = {
        exceptClasses = { 'motorcycles', 'cycles', 'boats', 'helicopters', 'planes', 'trains' },
        jobs          = {},
        exceptModels  = {},
    },
}
```

Built-in nitrous. A car needs a kit and a bottle, kept by plate across restarts. See [Nitrous](/products/hud/usage#nitrous) for the full guide and item setup.

**Setup**

* `fitting`: how a car gets a kit.
  * `'item'`: players fit one with `kitItem`
  * `'all'`: every car comes with a kit, no items needed
  * `'export'`: only your own scripts fit kits
* `refill`: how the bottle fills again.
  * `'item'`: `bottleItem` swaps in a full one
  * `'recharge'`: it refills itself after a pause
* `kitItem` / `bottleItem`: the item names.
* `fitTime` / `refillTime`: milliseconds to fit a kit or swap a bottle.
* `driveBoost`: set to `false` if another nitrous script runs the boost and the HUD should only show its gauge (see `exports['revo_hud']:setNitro`).

**Keys** (each player can rebind them in FiveM's key settings)

* `key`: hold to boost.
* `purgeKey`: hold to purge.
* `flowKey`: step the flow through stage 1, 2 and 3 (`''` for no key).
* `command`: the base name of the key commands.

**Behavior**

* `drainRate`: percent of the bottle used per second while boosting (stage 1).
* `purgeDrain`: percent per second while purging.
* `maxBurnTime`: milliseconds of continuous boost before it overheats (`0` means never).
* `cooldown`: milliseconds locked out after overheating.
* `overheatDamage`: engine damage when it overheats (engine health is 1000). Use `0` for none.
* `minSpeed`: km/h needed to engage.
* `rechargeRate`: percent per second (`'recharge'` only).
* `rechargeDelay`: milliseconds after use before it recharges (`'recharge'` only).

**Effects**

* `exhaustFlames`, `lightTrails` (tail-light trails), `purgeSmoke`, `purgeColour` (for example `'#8FD6FF'` for an icy blue).
* `screenSpeedFx`: the driver's screen while boosting, made of `motionBlur` (with `motionBlurStrength`, 0.1 to 1.0), `colorEffect` (yellow color grading) and `cameraShake` (with `shakeAmount`).
* `nativeAudio` (GTA's boost sound), `purgeAudio` (blow-off hiss) and `exhaustPops`.

**Other**

* `allowElectric`: an electric car has no bottle to fit, so it gets no gauge and no boost unless this is `true`.
* `audience`: who may fit and use nitrous.

### Drift

```lua theme={null}
Config.Drift = {
    enabled  = true,
    minAngle  = 10,
    minSpeed  = 15,
    breakTime = 1500,
    comboStep = 2500,
    maxCombo  = 5,
    scoreRate = 0.40,
    showBest = true,
    saveBest = true,
    audience = {
        exceptClasses = {},
        exceptJobs    = {},
        jobs          = {},
    },
}
```

* `minAngle`: degrees of slide before scoring starts.
* `minSpeed`: km/h needed to score.
* `breakTime`: milliseconds between slides before the combo is lost.
* `comboStep`: milliseconds of drifting per combo step.
* `maxCombo`: highest multiplier.
* `scoreRate`: points per degree per tick.
* `showBest`: show the best run beside the live score.
* `saveBest`: keep the best run per character, across restarts and relogs.
* `audience`: who scores drifts. Empty means everyone.

### Speed Limits

```lua theme={null}
Config.SpeedLimits = {
    enabled   = true,
    signStyle = 'US',
    default   = 80,
    flashOver = 10,
    zones     = {
        ['FREEWY']  = 120,
        ['DOWNT']   = 50,
        ['VESP']    = 60,
        ['GRAPES']  = 80,
        -- ...more zones
    },
}
```

The speed limit sign.

* `signStyle`: `'US'`, `'EU'`, `'AU'` or `'Minimal'`. Players can change it.
* `default`: the limit in km/h where no zone below matches.
* `flashOver`: km/h over the limit before the sign warns.
* `zones`: the limit in km/h for each GTA zone name. The default config already lists many city and rural zones, so add or change entries to suit your server.

### Electric Vehicles

```lua theme={null}
Config.ElectricVehicles = {
    'imorgon', 'neon', 'raiden', 'cyclone', 'voltic', 'voltic2',
    'tezeract', 'dilettante', 'dilettante2', 'airtug', 'caddy',
    'caddy2', 'caddy3', 'surge', 'khamelion', 'rcbandito',
}
```

Vehicles shown with a battery gauge instead of fuel, for builds where the game cannot tell. Add the spawn names of your own electric cars here.

### Trains

```lua theme={null}
Config.Trains = {
    topSpeed = {
        default    = 130,
        metrotrain = 90,
    },
}
```

The train speedometer's dial scale in km/h, by model (a train has no top speed of its own). A train script can send its own values, see [Exports](/products/hud/exports#train-scripts).

***

## 6. Player Status and Effects

### Stress

```lua theme={null}
Config.Stress = {
    enabled = true,
    preset  = 'relaxed',

    speeding          = 1,
    minSpeedUnbuckled = 50,
    minSpeedBuckled   = 100,
    shooting          = 1,
    shootingChance    = 0.10,
    gettingHurt       = 2,
    killing           = 6,
    crashMedium       = 3,
    crashHeavy        = 8,
    exceptWeapons = {
        'WEAPON_STUNGUN', 'WEAPON_FIREEXTINGUISHER', 'WEAPON_PETROLCAN',
        'WEAPON_HAZARDCAN', 'WEAPON_FLARE', 'WEAPON_SNOWBALL', 'WEAPON_BALL',
    },

    calmAfter     = 30,
    reliefEvery   = 20,
    reliefResting = 4,
    reliefDriving = 2,
    reliefWalking = 2,
    reliefFood    = 4,
    reliefDrink   = 3,
    mealMin       = 5,

    audience = {
        exceptJobs    = { 'emergency' },
        exceptClasses = { 'motorcycles', 'cycles', 'boats', 'helicopters',
                          'planes', 'emergency', 'military', 'commercial', 'trains' },
        exceptModels  = {},
        onDuty        = nil,
    },

    jobMultipliers = {
        ['trucker']  = 0.70,
        ['taxi']     = 0.70,
        ['mechanic'] = 0.85,
        ['bus']      = 0.80,
    },

    effects = {
        enabled    = true,
        vignetteAt = 35,
        blurAt     = 50,
        shakeAt    = 75,
        collapseAt = 100,
    },
}
```

Stress builds in trouble and eases off once the player is calm. Amounts are points out of 100, varied by plus or minus 50 percent. An amount of `0` turns that source off.

`preset` scales every number:

| Preset | Behavior |
| - | - |
| `'relaxed'` | Builds slowly and clears quickly. |
| `'realistic'` | The numbers as written. |
| `'intense'` | Builds fast and sits on the player. |

**What adds stress**

* `speeding`: added every 10 seconds above `minSpeedUnbuckled` (without a seatbelt) or `minSpeedBuckled` (with one), in km/h.
* `shooting`: added per shot, with `shootingChance` of happening.
* `gettingHurt`: each time the player is hurt (at most every 3 seconds).
* `killing`: each person the player kills.
* `crashMedium` / `crashHeavy`: medium and heavy crashes (see `Config.CrashImpact`).
* `exceptWeapons`: firing these weapons never adds stress.

**How it eases**

Once the player has gained no stress for `calmAfter` seconds, stress drops every `reliefEvery` seconds by an amount that depends on what they are doing.

* `reliefResting`: standing still, sitting, a passenger, or parked.
* `reliefDriving`: driving.
* `reliefWalking`: walking unarmed (running gives none).
* `reliefFood` / `reliefDrink`: a serving that puts back at least `mealMin` points of food or water.

Other scripts can relieve stress with QBCore's `hud:server:RelieveStress` event or `exports['revo_hud']:RelieveStress(amount)`.

**Who gains stress**

* `audience`: by default, emergency services on the job do not gain stress, and the vehicle classes only stop speeding and crash stress.
* `jobMultipliers`: less stress for jobs that still gain it (name, type or group).

**What the player sees** (each player can switch these off in `/hud`)

* `vignetteAt`: a soft dark edge starts at this stress level.
* `blurAt`: short blurs, every 60 seconds here and every 15 seconds at 100.
* `shakeAt`: the camera shakes through each blur.
* `collapseAt`: on foot, the player stumbles to the ground and blacks out.

### Status Effects

```lua theme={null}
Config.StatusEffects = {
    enabled   = true,
    audioMode = 'hybrid',
    hunger = {
        enabled        = true,
        threshold      = 20,
        repeatInterval = 50000,
        dizzyDuration  = 2500,
        cameraShake    = true,
    },
    thirst = {
        enabled        = true,
        threshold      = 20,
        repeatInterval = 50000,
        blurDuration   = 2500,
    },
    oxygen = {
        enabled        = true,
        threshold      = 25,
        repeatInterval = 9000,
    },
    injury = {
        enabled         = true,
        healthThreshold = 25,
        detectLimbHits  = true,
        painInterval    = 25000,
        bloodOnHit      = true,
        lowHealthVision = true,
    },
}
```

What the player feels as their needs run low and when they get hurt.

* `audioMode`: `'hybrid'` (GTA's own voice lines plus HUD sounds), `'native'` (GTA's voice lines only) or `'dsp'` (HUD sounds only).
* `hunger`: below `threshold` percent food, a stomach rumble and a slight sway. `repeatInterval` and `dizzyDuration` are in milliseconds.
* `thirst`: below `threshold` percent water, a dry cough and heat shimmer.
* `oxygen`: below `threshold` percent air left underwater, suffocation effects start.
* `injury`:
  * `healthThreshold`: below this health percent the player limps.
  * `detectLimbHits`: also limp after being shot in the legs.
  * `painInterval`: milliseconds between pain sounds while hurt.
  * `bloodOnHit`: blood on the screen when hit, from the side it came from.
  * `lowHealthVision`: below 25 percent health, the edges dim with the heartbeat and blood gathers on the lens.

### Alerts

```lua theme={null}
Config.Alerts = {
    enabled = true,
    sounds  = true,
    rearm   = 5,

    list = {
        lowHealth  = { enabled = true, threshold = 25, repeatInterval = 8000,  type = 'error',   message = 'You are badly hurt' },
        noArmor    = { enabled = true, threshold = 1,  repeatInterval = 0,     type = 'warning', message = 'Your armor is gone' },
        lowHunger  = { enabled = true, threshold = 15, repeatInterval = 60000, type = 'warning', message = 'You are getting hungry' },
        lowThirst  = { enabled = true, threshold = 15, repeatInterval = 60000, type = 'warning', message = 'You are getting thirsty' },
        highStress = { enabled = true, threshold = 80, repeatInterval = 30000, type = 'error',   message = 'You need to calm down', inverted = true },
        lowFuel    = { enabled = true, threshold = 15, repeatInterval = 45000, type = 'warning', message = 'Low fuel', vehicleOnly = true },
    },
}
```

Notifications when a value runs low.

* `sounds`: alert sounds.
* `rearm`: percent a value must recover before it can alert again.
* Each alert in `list` has `enabled`, `threshold`, `repeatInterval` (milliseconds, `0` for once), `type` (the notification style, such as `'error'` or `'warning'`) and `message`.
* `inverted`: alert when the value rises **above** the threshold instead of below.
* `vehicleOnly`: alert only while in a vehicle.

***

## 7. Advanced

The defaults suit almost every server.

```lua theme={null}
Config.StatusSource  = 'auto'
Config.StaminaSource = 'auto'
Config.HideUnfedStatuses = true

Config.UpdateInterval = 200
Config.SlowInterval   = 1000
```

* `Config.StatusSource`: where hunger, thirst and stress come from: `'auto'`, `'esx_status'` or `'metadata'` (QBCore and Qbox player metadata).
* `Config.StaminaSource`: where stamina comes from: `'auto'` (sprint stamina), `'esx_status'`, `'metadata'` or `'native'`.
* `Config.HideUnfedStatuses`: hide the hunger and thirst bars when nothing on the server supplies them. Set to `false` to show them anyway.
* `Config.UpdateInterval`: how often the status and vehicle readings update, in milliseconds. Lower is more responsive and costs more CPU. `200` is smooth and light, and `100` is the most responsive. The gauges animate between updates, so values up to about `250` stay smooth.
* `Config.SlowInterval`: how often the street name, compass, time and weather update, in milliseconds.

> [!WARNING]
>
> Do not rename config keys or remove sections when you update. Always start from the new `config.lua` and copy your values into it. See [How to Update](/products/hud/updates).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.