API et exports PMMS
Exports serveur et client de PMMS vérifiés dans l’archive — démarrer, arrêter et verrouiller des lecteurs, gérer modèles et lecteurs par défaut — et format des options de lecture.
But : piloter PMMS depuis vos propres ressources.
Où : dans le code de vos ressources, démarrées après pmms.
Handles
Chaque lecteur actif est identifié par un handle :
- entité réseau : son identifiant réseau (
NetworkGetNetworkIdFromEntity) ; - entité locale ou position : un hash calculé à partir des coordonnées arrondies au dixième.
Les exports de démarrage renvoient ce handle ; gardez-le pour stop, pause, lock… pmms_ctl list (console serveur) affiche les handles actifs.
Exports serveur
| Signature | Retour | Effet |
|---|---|---|
exports.pmms:startByNetworkId(netId, options) | handle (= netId) | Lance un média sur une entité réseau. |
exports.pmms:startByCoords(x, y, z, options) | handle (hash des coordonnées) | Lance un média sur une entité non réseau désignée par ses coordonnées. |
exports.pmms:startScaleform(scaleform, options) | handle | Lance un média sur un écran scaleform indépendant : { name, position, rotation, scale } (vector3). |
exports.pmms:stop(handle) | rien | Arrête le lecteur et libère son handle. |
exports.pmms:pause(handle) | rien | Met en pause ou reprend. |
exports.pmms:lock(handle) | rien | Verrouille un lecteur actif. |
exports.pmms:unlock(handle) | rien | Déverrouille un lecteur actif. |
exports.pmms:mute(handle) | rien | Coupe le son d’un lecteur actif. |
exports.pmms:unmute(handle) | rien | Rétablit le son. |
exports.pmms:addModel(modelHash, data) | rien | Ajoute ou modifie un modèle jusqu’au redémarrage (champs de Config.models). |
exports.pmms:addModelPermanently(modelHash, data) | rien | Idem, et enregistre dans models.json. |
exports.pmms:addEntity(coords, data) | rien | Ajoute ou modifie un lecteur par défaut jusqu’au redémarrage. Pour un nouveau lecteur, data doit contenir position. |
exports.pmms:addEntityPermanently(coords, data) | rien | Idem, fixe position = coords et enregistre dans defaultMediaPlayers.json. |
exports.pmms:removeModel(modelHash) | données retirées ou nil | Retire un modèle jusqu’au redémarrage. |
exports.pmms:removeModelPermanently(modelHash) | données retirées ou nil | Idem, et le retire de models.json. |
exports.pmms:removeEntity(coords) | données retirées ou nil | Retire un lecteur par défaut jusqu’au redémarrage. |
exports.pmms:removeEntityPermanently(coords) | données retirées ou nil | Idem, et le retire de defaultMediaPlayers.json. |
exports.pmms:getMediaPlayerInfo(handle) | table ou nil | Options et état du lecteur actif. |
exports.pmms:getAllMediaPlayers() | table handle → options | Tous les lecteurs actifs, indexés par handle. |
Les exports serveur ne vérifient aucune permission et ne sont pas soumis à Config.oneMediaPerPlayer. Chaque démarrage par export est envoyé aux logs Discord comme « Lancement serveur/export ». stop, pause, lock, unlock, mute et unmute supposent un handle actif : vérifiez-le avec getMediaPlayerInfo avant l’appel.
getAllMediaPlayers et getMediaPlayerInfo renvoient les tables utilisées par le serveur : lisez-les sans les modifier.
Options de lecture
Table options des exports de démarrage, des presets et des lecteurs par défaut :
| Champ | Type | Effet |
|---|---|---|
url | string | URL du média, nom de preset ou random. Un nom sans http(s):// est cherché dans pmms/http/media. |
title | string | Titre affiché ; un preset impose le sien. |
volume | number | 0 à 100, 100 par défaut. |
offset | number | Position de départ en secondes, 0 par défaut. |
duration | number | Durée en secondes. Absente, false ou 0 : traité comme un direct, qui ne s’arrête pas seul et ne passe pas à la suite de la file. |
loop | boolean | Reprend au début à la fin ; nécessite duration. |
filter | boolean | Filtre immersif ; absent : Config.enableFilterByDefault côté serveur. |
locked | boolean | Seuls les joueurs avec pmms.manage peuvent le contrôler. |
video | boolean | Affiche la vidéo (écran DUI si le modèle a un renderTarget, sinon écran NUI au-dessus de l’entité). |
videoSize | number | 10 à 100, Config.defaultVideoSize par défaut. |
muted | boolean | Démarre en sourdine. |
attenuation | { sameRoom, diffRoom } | Chaque valeur 0 à 10 ; défauts de config.lua. |
diffRoomVolume | number | 0 à 1. |
range | number | 0 à Config.maxRange, Config.defaultRange par défaut. |
visualization | string | Clé de Config.audioVisualizations. |
Exemple : radio d’un véhicule
Côté serveur, dans votre ressource (mon_garage est un exemple) :
RegisterNetEvent('mon_garage:radio', function(netId, url)
local src = source
if not IsPlayerAceAllowed(src, 'pmms.interact') then
return
end
local entity = NetworkGetEntityFromNetworkId(netId)
if entity == 0 or #(GetEntityCoords(GetPlayerPed(src)) - GetEntityCoords(entity)) > 5.0 then
return
end
local current = exports.pmms:getMediaPlayerInfo(netId)
if current then
exports.pmms:stop(netId)
end
exports.pmms:startByNetworkId(netId, {
url = url,
title = 'Radio',
volume = 70,
filter = false,
range = 25
})
end)
Résultat : la radio du véhicule joue l’URL pour tous les joueurs à moins de 25 m. Le contrôle de permission et de distance est fait par votre événement, puisque l’export n’en fait aucun. Validez aussi url selon vos règles.
Exemple : enceinte personnelle
Côté client :
local speaker
RegisterCommand('enceinte', function()
if speaker then
exports.pmms:deleteMediaPlayer(speaker)
speaker = nil
return
end
local ped = PlayerPedId()
speaker = exports.pmms:createMediaPlayer({
model = `prop_boombox_01`,
position = GetOffsetFromEntityInWorldCoords(ped, 0.0, 0.8, -0.95),
rotation = vector3(0.0, 0.0, GetEntityHeading(ped))
})
end)
Résultat : /enceinte pose une enceinte devant le joueur ; elle apparaît dans son panneau même sans pmms.anyEntity, et disparaît à l’arrêt de pmms ou au second appel.
Exports client
| Signature | Retour | Effet |
|---|---|---|
exports.pmms:enableEntity(entity) | rien | Autorise ce joueur à utiliser cette entité même sans pmms.anyEntity. |
exports.pmms:disableEntity(entity) | rien | Retire cette autorisation et demande l’arrêt du média qui y joue. |
exports.pmms:createMediaPlayer({ model, position, rotation }) | entité | Crée une entité réseau utilisable par ce joueur ; model absent : Config.defaultModel. Supprimée à l’arrêt de pmms. |
exports.pmms:deleteMediaPlayer(entity) | rien | Supprime une entité créée par createMediaPlayer. |
Événements
Les événements pmms:* servent à la communication interne entre client, serveur et interface. Ils ne constituent pas une API publique : utilisez les exports.
Erreurs fréquentes
- « No such export » :
pmmsn’est pas démarré, ou votre ressource démarre avant lui. - Erreur Lua sur
stopoulock: le handle ne correspond à aucun lecteur actif. - Média qui ne s’arrête jamais :
durationabsent, le média est traité comme un direct ; la boucle et la file d’attente ne fonctionnent pas non plus. - Effet radio inattendu :
filterabsent dans les options (voir Dépannage).