HZ Scripts

Exports & Evenements

HZ-AudioMixer fournit une API client complete pour integrer le mixeur (ou votre propre interface personnalisee) dans n'importe quelle autre ressource. Tous les exports sont sous le nom de ressource HZ-AudioMixer.

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


Controle 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 categories actives.

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

getCategoriesData()

Retourne les metadonnees completes des categories — utilisez ceci pour construire votre propre interface. Les libelles et descriptions sont pre-traduits selon Config.Locale.

local data = exports['HZ-AudioMixer']:getCategoriesData()

Structure retournee :

{
    {
        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 categorie (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 categories actives.

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

API d'ecriture

setVolume(categoryId, value)

Definit le volume d'une categorie. Sauvegarde dans le KVP, applique le changement audio immediatement et declenche l'evenement volumeChanged.

-- Les volumes vont de 0 a 100 (precision 1%)
local ok = exports['HZ-AudioMixer']:setVolume('weather', 30)
ParamTypeDescription
categoryIdstringUn des 9 IDs de categorie (voir getCategories())
valuenumber0–100 (borne). 0 = muet, 100 = volume max
Retourne true en cas de succes, false si la categorie est invalide ou desactivee dans Config.Categories.

setVolumes(map)

Definit plusieurs volumes a la fois. Ignore les cles invalides silencieusement. Retourne le nombre de changements appliques avec succes.

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

resetAll()

Reinitialise chaque categorie active a Config.DefaultVolume et sauvegarde dans le KVP.

exports['HZ-AudioMixer']:resetAll()

Evenements

hz-audiomixer:volumeChanged

Declenche a chaque changement de volume (depuis n'importe quelle source : interface integree, exports, resetAll). Utilisez-le pour synchroniser votre interface personnalisee.

AddEventHandler('hz-audiomixer:volumeChanged', function(categoryId, value)
    print(('%s regle a %d%%'):format(categoryId, value))
end)
ArgumentTypeDescription
categoryIdstringLa categorie dont le volume a change
valuenumberLa nouvelle valeur (0–100)

Exemples d'integration

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

Cote 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 cinematique

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 categories disponibles

IDDescription
weaponsArmes a feu, explosions, mecanismes d'armes
vehiclesMoteurs, klaxons, sirenes, helicopteres
ambienceOiseaux, insectes, bruit de fond urbain
weatherPluie, tonnerre, vent
speechVoix de PNJ, dialogues scriptes
pedsPas, vetements, sons de pietons
scriptedAlarmes, TV, sons de mission
musicMusique de jeu, musique ambiante
radioRadio dans les vehicules

Etape suivante