Aller au contenu principal
ShadowAcademy

Les langages Interfaces NUI FiveM Comprendre le NUI

Une page web dans le jeu

FiveM embarque un navigateur. Une ressource peut afficher une page web par-dessus le jeu : menus, inventaires, téléphones, guichets. On l'appelle l'interface NUI. Elle s'écrit en HTML, CSS et JavaScript, exactement comme un site ; le script Lua côté client la pilote.

Déclarer la page

Dans le fxmanifest.lua de la ressource :

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/style.css',
    'html/script.js',
}

Du jeu vers la page : SendNUIMessage

SendNUIMessage({ action = 'ouvrir', solde = 250 })

La table Lua arrive dans la page sous forme d'objet JavaScript, par l'événement message de window :

window.addEventListener("message", (e) => {
    if (e.data.action === "ouvrir") { ... }
});

Le champ action n'a rien d'obligatoire : c'est une convention qui permet à la page de savoir quoi faire du message.

De la page vers le jeu : fetch et RegisterNUICallback

La page envoie une requête à une adresse spéciale, formée du nom de la ressource :

fetch(`https://${GetParentResourceName()}/fermer`, {
    method: "POST",
    body: JSON.stringify({}),
});

GetParentResourceName() donne ce nom : ne jamais l'écrire en dur, la ressource peut être renommée par l'administrateur du serveur.

Côté Lua, le rappel du même nom la reçoit :

RegisterNUICallback('fermer', function(data, cb)
    SetNuiFocus(false, false)
    cb('ok')
end)

data contient le corps envoyé par la page ; cb renvoie la réponse, que la page lit avec await reponse.json(). Toujours appeler cb : sans réponse, la requête de la page reste en attente.

Le focus

SetNuiFocus(true, true)    -- clavier, souris : la page peut être utilisée
SetNuiFocus(false, false)  -- le joueur reprend la main sur le jeu

Oublier de rendre le focus est le bug NUI le plus courant : l'interface est fermée, mais le joueur ne peut plus bouger.

La règle de sécurité

Tout ce qui vient de la page vient du joueur : il peut ouvrir les outils de développement du navigateur du jeu et envoyer n'importe quoi à vos rappels. Le client vérifie pour aider le joueur (un message d'erreur clair) ; le serveur vérifie pour protéger le serveur -- le parcours Sécurité FiveM le détaille.