games / fivem
Structure d'une ressource : fxmanifest.lua
Explication
Ce que vous allez apprendre
- Comprendre le rôle du
fxmanifest.luacomme carte d'identité obligatoire d'une ressource - Organiser son code en
client_scripts,server_scriptsetshared_scripts - Comprendre pourquoi l'ordre de déclaration des fichiers et dépendances compte
- Déclarer des dépendances externes (
ox_lib,oxmysql) correctement - Exposer des fonctions à d'autres ressources via
exports/server_exports
Dans quel contexte ?
Un développeur vient de recevoir un dossier de code fonctionnel écrit par un collègue, mais FiveM refuse obstinément de le charger : aucune erreur claire, la ressource reste simplement invisible dans la liste des ressources actives. La cause la plus fréquente pour un débutant est un fxmanifest.lua manquant, mal formé, ou avec des fichiers déclarés dans le mauvais ordre — exactement ce que cette leçon apprend à diagnostiquer et éviter.
Du code brut à une vraie ressource
Écrire quelques lignes de Lua dans un fichier isolé (leçon précédente) ne suffit pas pour que FiveM sache quoi en faire. Une ressource est l'unité de base que FiveM sait charger, démarrer et arrêter : un dossier autonome qui regroupe du code, des dépendances et éventuellement des fichiers web, décrit par un fichier obligatoire appelé fxmanifest.lua. C'est un peu la "carte d'identité" du dossier : sans lui, FiveM ne reconnaît pas le contenu comme une ressource exploitable.
Pourquoi séparer les fichiers en client/server/shared
Cette organisation en dossiers n'est pas qu'une convention esthétique : elle reflète directement le modèle d'exécution de FiveM, détaillé dans la leçon suivante. Un fichier déclaré dans client_scripts s'exécute sur la machine de chaque joueur ; un fichier dans server_scripts tourne uniquement sur le serveur ; un fichier shared_scripts est chargé des deux côtés à la fois — pratique pour une configuration qu'on veut identique partout, sans la dupliquer.
L'ordre de chargement compte vraiment
Un piège fréquent pour un débutant est de croire que l'ordre des fichiers listés n'a pas d'importance. En réalité, si un script utilise une fonctionnalité d'une bibliothèque externe (comme ox_lib), cette bibliothèque doit être déclarée AVANT dans la liste, sinon le script tente d'utiliser quelque chose qui n'existe pas encore au moment où il s'exécute — une source classique d'erreurs difficiles à diagnostiquer pour un débutant.
Les exports : parler à d'autres ressources
Une ressource peut avoir besoin d'utiliser du code écrit dans une AUTRE ressource, sans copier-coller ce code. Le mécanisme officiel pour cela s'appelle un "export" : une ressource expose explicitement certaines de ses fonctions, que d'autres ressources peuvent alors appeler proprement. Ce mécanisme sera repris et approfondi dans la leçon sur les frameworks RP, où il devient central pour faire communiquer des dizaines de scripts entre eux.
| Fichier déclaré dans | S'exécute où |
|---|---|
client_scripts | Machine de chaque joueur |
server_scripts | Serveur uniquement |
shared_scripts | Client ET serveur, chargé des deux côtés |
Prérequis
Cette leçon suppose que tu es à l'aise avec les bases de Lua vues en leçon 1 (variables, fonctions, tables). Aucune connaissance FiveM préalable n'est nécessaire.
Commandes & code
Structure d'une ressource : fxmanifest.lua
Une ressource FiveM est un dossier autonome décrit par un fxmanifest.lua, qui déclare tous ses fichiers et dépendances.
technologik_shop/
├── fxmanifest.lua
├── client/
│ └── main.lua
├── server/
│ └── main.lua
├── shared/
│ └── config.lua
└── html/
├── ui.html
├── ui.js
└── ui.css-- fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
author 'Technologik'
description 'Ressource boutique pour le cours FiveM'
version '1.0.0'
lua54 'yes' -- active Lua 5.4 (recommandé : perfs et syntaxe modernes)
shared_scripts {
'@ox_lib/init.lua', -- dépendance externe, chargée avant nos propres scripts
'shared/config.lua',
}
client_scripts {
'client/main.lua',
'client/*.lua', -- wildcard : charge tous les fichiers restants du dossier
}
server_scripts {
'@oxmysql/lib/MySQL.lua',
'server/main.lua',
}
ui_page 'html/ui.html' -- page NUI associée à cette ressource
files {
'html/ui.html',
'html/ui.js',
'html/ui.css',
}
dependencies {
'ox_lib',
'oxmysql',
}-- Déclarer des exports (fonctions réutilisables par d'autres ressources)
exports {
'GetShopItems',
}
server_exports {
'AddMoneyToPlayer',
}| Type de script | Exécuté où | Accès natives client | Accès base de données |
|---|---|---|---|
shared_scripts | client ET serveur | selon le contexte | selon le contexte |
client_scripts | machine du joueur | oui | non |
server_scripts | serveur uniquement | non | oui |
Résumé
fx_version 'cerulean'etgame 'gta5'sont obligatoires en tête de fichier.shared_scriptscharge le même fichier des deux côtés (ex: fichiers de config).- L'ordre des dépendances compte : une lib comme
ox_libdoit être chargée avant qu'on l'utilise. exports/server_exportssont le mécanisme officiel de communication entre ressources.
Exercices pratiques
Mission : ressource invisible sans erreur
Objectif : Diagnostiquer un fxmanifest mal ordonné qui empêche une ressource de se charger, puis écrire un manifest correct.
Contexte
On te transmet la ressource technologik_shop, absente de la liste des ressources actives malgré ensure technologik_shop dans le server.cfg, sans le moindre message d'erreur en console. En inspectant le fxmanifest.lua, tu remarques que shared_scripts déclare d'abord 'shared/config.lua', puis seulement ensuite '@ox_lib/init.lua' — alors que config.lua appelle lib.print.info(...) dès sa première ligne. Le client_scripts déclare aussi { 'client/*.lua' } en un seul bloc, sans fichier explicite en tête.