# Full Configuration Breakdown

### Server-side Configuration (`config.lua`)

#### Voice Warning Settings

```lua
Config.VoiceWarning = {
    checkInterval = 1000 -- How often to check voice connection (in ms)
}
```

#### Voice Control Features

```lua
Config.VoiceControl = {
    -- Mute Toggle
    muteToggle = {
        enabled = true,
        hotkey = 'M', -- Default key to mute/unmute
        notification = true, -- Show notification when toggling mute
        showIndicator = true -- Show persistent UI indicator when muted
    },

    -- Talk Range Control
    talkRange = {
        enabled = true,
        hotkey = 'Z', -- Default key to cycle through ranges
        ranges = {1.0, 5.0, 15.0, 30.0}, -- Available talk ranges (meters)
        defaultIndex = 2, -- Default range index in the ranges array (1-based)
        drawMarker = true, -- Whether to draw a marker showing the current range
        marker = {
            type = 1,
            color = {r = 0, g = 0, b = 255, a = 100},
            bobUpAndDown = false,
            faceCamera = false,
            rotate = false,
            drawDistance = 50.0,
            zOffset = -2.15,
            height = 2.25,
            displayDuration = 2000
        },
        notification = true -- Show notification when changing range
    },

    -- Pause Menu Control
    pauseMenuControl = {
        enabled = true,
        hideInPauseMenu = true, -- Automatically hide UI when pause menu is active
        checkInterval = 500, -- How often to check pause menu state (in ms)
        gracePeriod = 15000 -- Time in ms to keep UI hidden after pause menu closes
    }
}
```

#### Notification System Configuration

```lua
Config.Notifications = {
    system = 'x_hud_notify',
    duration = 5000,
    types = {
        esx = {
            mute = 'error',
            unmute = 'success',
            range = 'info'
        },
        qbcore = {
            mute = 'error',
            unmute = 'success',
            range = 'primary'
        },
        x_hud = {
            mute = 'mute',
            unmute = 'unmute',
            range = 'range'
        }
    }
}
```

#### Notification Function

```lua
function SendNotification(message, title, type)
    -- Default notification type to 'info' if not specified
    if not type then type = 'info' end

    -- Handle ESX notifications
    if Config.Notifications.system == 'esx' then
        local notificationType = Config.Notifications.types.esx[type] or 'info'
        exports["esx_notify"]:Notify(notificationType, Config.Notifications.duration, message)

    -- Handle QBCore notifications
    elseif Config.Notifications.system == 'qbcore' and QBCore then
        local notificationType = Config.Notifications.types.qbcore[type] or 'primary'
        exports['qb-core']:DrawText(message, notificationType)

    -- Handle X_HUD notifications
    elseif Config.Notifications.system == 'x_hud_notify' then
        local notificationType = Config.Notifications.types.x_hud[type] or 'info' 
        exports['X_HUD_Notify']:Notify(message, notificationType, Config.Notifications.duration)

    -- Default to native notifications
    else
        BeginTextCommandThefeedPost("STRING")
        AddTextComponentSubstringPlayerName(message)
        EndTextCommandThefeedPostTicker(true, true)
    end
end
```

### UI Configuration (`config.js`)

#### Default Language

```javascript
defaultLang: 'en',
```

#### Animations

```javascript
animations: {
    fadeInDuration: 300,
    fadeOutDuration: 300
}
```

#### Mute Indicator

```javascript
muteIndicator: {
    position: {
        vertical: 'bottom',
        horizontal: 'center',
        verticalPercent: 8,
        horizontalPercent: 50
    },
    layout: {
        direction: 'vertical',
        iconMargin: 8,
        alignItems: 'center'
    },
    size: {
        padding: '12px 18px',
        maxWidth: 250,
        borderRadius: 8
    },
    border: {
        width: 2,
        style: 'solid',
        color: 'rgba(121, 121, 121, 0.5)',
        glow: {
            color: 'rgba(255, 59, 48, 0.7)',
            blur: 15,
            spread: 3,
            intensity: 3
        }
    },
    glass: {
        enabled: true,
        blurStrength: 4,
        opacity: 0.6,
        backgroundColor: 'rgba(255, 59, 48, 0.08)',
        boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',
        shine: {
            enabled: true,
            color: 'rgba(255, 255, 255, 0.1)',
            angle: -25,
            animationDuration: 5
        }
    },
    font: {
        family: 'Poppins',
        weight: 600,
        style: 'normal'
    },
    icon: {
        name: 'mic-off-outline',
        size: 50,
        color: '#ff3b30',
        glowColor: 'rgba(255, 59, 48, 0.9)',
        glowSize: 8,
        marginRight: 12,
        pulseColor: 'rgba(255, 59, 48, 0.25)',
        pulseSize: {
            base: 60,
            expanded: 90
        },
        pulseSpeed: 2
    },
    text: {
        color: 'white',
        size: 14,
        fontWeight: 600,
        letterSpacing: '0.5px',
        textShadow: '0 2px 3px rgba(0, 0, 0, 0.5)',
        uppercase: true
    },
    animation: {
        type: 'slide',
        direction: 'bottom',
        duration: 300,
        easing: 'ease'
    }
}
```

#### Voice Warning

```javascript
voiceWarning: {
    font: {
        family: 'Poppins',
        titleWeight: 700,
        messageWeight: 500,
        style: 'normal'
    },
    background: {
        gradient: {
            startColor: 'rgba(70, 70, 70, 0.8)',
            endColor: 'rgba(50, 50, 50, 0.8)',
            angle: '135deg'
        },
        shadow: {
            primarySize: '150px',
            primarySpread: '40px',
            primaryOpacity: 0.85,
            secondarySize: '80px',
            secondarySpread: '20px',
            secondaryOpacity: 0.65
        }
    },
    icon: {
        size: 120,
        color: '#ff3b30',
        glowColor: 'rgba(255, 59, 48, 0.9)',
        glowSize: {
            min: 25,
            max: 55
        },
        pulseSize: {
            base: 150,
            expanded: 175
        },
        pulseSpeed: 2,
        glowSpeed: 2
    },
    text: {
        title: {
            size: 28,
            color: '#ff3b30',
            glowColor: 'rgba(255, 59, 48, 0.9)',
            glowSize: '35px',
            shadowColor: 'rgba(0, 0, 0, 0.7)',
            letterSpacing: '1px',
            singleLine: true
        },
        message: {
            size: 20,
            color: 'white',
            opacity: 0.9,
            letterSpacing: '0.5px',
            maxWidth: 350
        },
        spacing: 55
    }
}
```

#### WebGL Configuration

```javascript
const WebGLConfig = {
    renderResolution: 0.5,
    blurStrength: 10,
    glassColor: 'rgba(255, 255, 255, 0.1)',
    vertexShaderSource: `
        attribute vec2 position;
        varying vec2 vUv;
        
        void main() {
            vUv = 0.5 * (position + 1.0);
            gl_Position = vec4(position, 0, 1);
        }
    `,
    fragmentShaderSource: `
        precision mediump float;
        
        uniform sampler2D uTexture;
        uniform vec2 uResolution;
        uniform float uBlurStrength;
        
        varying vec2 vUv;
        
        void main() {
            vec2 texelSize = 1.0 / uResolution;
            float blurSize = uBlurStrength;
            
            vec4 sum = vec4(0.0);
            
            for (float x = -4.0; x <= 4.0; x++) {
                for (float y = -4.0; y <= 4.0; y++) {
                    vec2 offset = vec2(x, y) * texelSize * blurSize;
                    sum += texture2D(uTexture, vUv + offset);
                }
            }
            
            gl_FragColor = sum / 81.0;
        }
    `,
    debug: false
};

window.WebGLConfig = WebGLConfig;
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://fiveworld.gitbook.io/fiveworld-docs/x_hud_ingamevoice/full-configuration-breakdown.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
