Exports & Événements

HZ-AudioMixer fournit une API client complète pour intégrer le mixeur (ou votre propre interface personnalisée) dans n'importe quelle autre ressource. Tous les exports sont sous le nom de ressource hz_audiomixer.

Le moteur audio interne (mapping, activation de scène, persistance KVP) reste dans le client.lua chiffre. Les exports sont la surface publique — tout le reste est scelle par Asset Escrow.


Contrôle de l'interface

open()

Ouvre l'interface Ghost Protocol du mixeur.

exports['hz_audiomixer']:open()

close()

Ferme l'interface du mixeur.

exports['hz_audiomixer']:close()

toggle()

Bascule l'interface du mixeur (ouvre/ferme).

exports['hz_audiomixer']:toggle()

isOpen()

Retourne true si l'interface du mixeur est actuellement ouverte.

local open = exports['hz_audiomixer']:isOpen()


API de lecture

getCategories()

Retourne un tableau des IDs de catégories actives.

local ids = exports['hz_audiomixer']:getCategories()
-- { 'weapons', 'vehicles', 'ambience', 'weather', 'speech', 'peds', 'scripted', 'music', 'radio' }

getCategoriesData()

Retourne les métadonnées complètes des catégories — utilisez ceci pour construire votre propre interface. Les libellés et descriptions sont pre-traduits selon Config.Locale.

local data = exports['hz_audiomixer']:getCategoriesData()

Structure retournée :

{
    {
        id    = 'weather',
        label = 'Meteo',              -- localise
        desc  = 'Pluie, tonnerre, vent', -- localise
        icon  = 'weather',
        value = 70,                   -- 0-100 (precision 1%)
        min   = 0,
        max   = 100,
        step  = 1,
    },
    -- ... 8 autres
}

getVolume(categoryId)

Retourne le volume actuel d'une catégorie (0–100), ou nil si l'ID est invalide.

local vol = exports['hz_audiomixer']:getVolume('weather')  -- ex: 70

getAllVolumes()

Retourne une map { categoryId = volume } pour toutes les catégories actives.

local volumes = exports['hz_audiomixer']:getAllVolumes()
-- { weapons = 100, vehicles = 80, weather = 30, ... }


API d'ecriture

setVolume(categoryId, value)

Définit le volume d'une catégorie. Sauvegarde dans le KVP, applique le changement audio immédiatement et declenche l'événement volumeChanged.

-- Les volumes vont de 0 a 100 (precision 1%)
local ok = exports['hz_audiomixer']:setVolume('weather', 30)

ParamTypeDescription
categoryIdstringUn des 9 IDs de catégorie (voir getCategories())
valuenumber0–100 (borne). 0 = muet, 100 = volume max
Retourne true en cas de succès, false si la catégorie est invalide ou désactivée dans Config.Categories.

setVolumes(map)

Définit plusieurs volumes à la fois. Ignore les clés invalides silencieusement. Retourne le nombre de changements appliques avec succès.

local count = exports['hz_audiomixer']:setVolumes({
    weather  = 30,
    weapons  = 100,
    vehicles = 70,
})

resetAll()

Réinitialise chaque catégorie active à Config.DefaultVolume et sauvegarde dans le KVP.

exports['hz_audiomixer']:resetAll()


Événements

hz-audiomixer:volumeChanged

Declenche à chaque changement de volume (depuis n'importe quelle source : interface intégrée, exports, resetAll). Utilisez-le pour synchroniser votre interface personnalisée.

AddEventHandler('hz-audiomixer:volumeChanged', function(categoryId, value)
    print(('%s regle a %d%%'):format(categoryId, value))
end)

ArgumentTypeDescription
categoryIdstringLa catégorie dont le volume à change
valuenumberLa nouvelle valeur (0–100)

Exemples d'intégration

Ouvrir le mixeur depuis un menu pause personnalise

-- Dans votre script de menu pause
RegisterCommand('monmenu_ouvrir_mixer', function()
    exports['hz_audiomixer']:open()
end)

Construire vos propres curseurs dans votre NUI

Côté Lua :

RegisterNUICallback('monmenu:getMixerData', function(_, cb)
    cb({
        categories = exports['hz_audiomixer']:getCategoriesData()
    })
end)

RegisterNUICallback('monmenu:setMixerVolume', function(data, cb)
    exports['hz_audiomixer']:setVolume(data.id, data.value)
    cb('ok')
end)

-- Pousser les mises a jour vers votre NUI quand le volume change
AddEventHandler('hz-audiomixer:volumeChanged', function(id, value)
    SendNUIMessage({
        action = 'audioVolumeUpdate',
        id     = id,
        value  = value,
    })
end)

Cote HTML/JS :

// A l'ouverture du menu — recuperer les categories
fetch('https://mon-pausemenu/monmenu:getMixerData', {
    method: 'POST',
    body:   '{}'
})
.then(r => r.json())
.then(data => {
    data.categories.forEach(cat => {
        // cat = { id, label, desc, icon, value (0-100), min:0, max:100, step:1 }
        renderSlider(cat)
    })
})

// Au changement de curseur
slider.oninput = (e) => {
    fetch('https://mon-pausemenu/monmenu:setMixerVolume', {
        method: 'POST',
        body:   JSON.stringify({
            id:    'weather',
            value: parseInt(e.target.value, 10),
        }),
    })
}

// Ecouter les mises a jour externes
window.addEventListener('message', (e) => {
    if (e.data.action === 'audioVolumeUpdate') {
        const slider = document.querySelector(`[data-id="${e.data.id}"]`)
        if (slider) slider.value = e.data.value
    }
})

Couper les armes pendant une cinématique

local backup = exports['hz_audiomixer']:getVolume('weapons')

exports['hz_audiomixer']:setVolume('weapons', 0)
PlayCutscene(...)
Wait(cutsceneDuration)
exports['hz_audiomixer']:setVolume('weapons', backup)

Mode streamer avec coupure rapide

RegisterCommand('streamerMode', function()
    exports['hz_audiomixer']:setVolumes({
        music = 0,
        radio = 0,
    })
    print('Mode streamer : musique + radio coupes')
end)


IDs de catégories disponibles

IDDescription
weaponsArmes à feu, explosions, mécanismes d'armes
vehiclesMoteurs, klaxons, sirènes, hélicoptères
ambienceOiseaux, insectes, bruit de fond urbain
weatherPluie, tonnerre, vent
speechVoix de PNJ, dialogues scriptes
pedsPas, vêtements, sons de piétons
scriptedAlarmes, TV, sons de mission
musicMusique de jeu, musique ambiante
radioRadio dans les véhicules

Étape suivante