MrPoulpi Labs
PMMS

Scripts disponibles

EN
Centre de documentation

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 » : pmms n’est pas démarré, ou votre ressource démarre avant lui.
  • Erreur Lua sur stop ou lock : le handle ne correspond à aucun lecteur actif.
  • Média qui ne s’arrête jamais : duration absent, le média est traité comme un direct ; la boucle et la file d’attente ne fonctionnent pas non plus.
  • Effet radio inattendu : filter absent dans les options (voir Dépannage).

Rechercher

Tapez un terme : paramètre, export, erreur…