Un serveur roleplay FiveM repose presque toujours sur un framework : un ensemble de ressources qui gère les personnages, l'argent, les métiers, l'inventaire et les véhicules. Trois frameworks dominent : ESX Legacy, QBCore et Qbox. Ce guide vous aide à choisir, à installer, puis à écrire des scripts pour chacun.
Lequel choisir ?
| ESX Legacy | QBCore | Qbox | |
|---|---|---|---|
| Ancienneté | Le plus ancien, très répandu | Très populaire depuis 2021 | Version modernisée de QBCore |
| Scripts disponibles | Énormément | Énormément | Compatible avec la plupart des scripts QBCore |
| Inventaire | ox_inventory conseillé | qb-inventory ou ox_inventory | ox_inventory |
| Bibliothèques | ox_lib, oxmysql | qb-core, oxmysql | ox_lib, oxmysql, ox_inventory |
| Pour qui | Serveurs qui veulent le plus grand choix de scripts | Serveurs qui veulent un ensemble complet prêt à l'emploi | Serveurs qui partent de zéro et veulent un code récent et performant |
Pour un nouveau serveur, Qbox ou ESX Legacy avec ox_lib et ox_inventory donnent une base moderne et rapide. Si vous avez repéré des scripts payants précis, vérifiez d'abord pour quel framework ils sont écrits.
Méthode 1 : installer avec txAdmin (conseillé)
C'est la méthode la plus sûre : txAdmin télécharge les bonnes versions de chaque ressource, crée la base de données et écrit le server.cfg.
- Ouvrez txAdmin, puis Setup (ou, sur un serveur déjà configuré, créez un nouveau profil de serveur).
- Choisissez Popular Recipes, puis ESX Legacy, QBCore ou Qbox.
- Laissez les identifiants de base de données proposés : sur EsoterHost, ils sont déjà remplis avec la base MariaDB de votre serveur.
- Collez votre clé de licence
cfxk_…, puis lancez le déploiement. - À la fin, démarrez le serveur depuis txAdmin.
Le déploiement d'un modèle crée un nouveau dossier dans txData. Vos anciens fichiers restent en place. Une fois le nouveau serveur validé, supprimez l'ancien dossier pour libérer de la place.
Méthode 2 : installer à la main
Utile pour ajouter un framework à un serveur existant ou pour choisir précisément chaque version.
ESX Legacy
- Téléchargez la dernière version depuis le dépôt GitHub
esx-framework/esx_core(onglet Releases). - Copiez les ressources dans
resources/[esx]/, oxmysql et ox_lib dansresources/[ox]/. - Importez le fichier SQL fourni (
legacy.sql) dans votre base. - Ajoutez au server.cfg, dans cet ordre :
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure esx_menu_default
ensure esx_identity
ensure esx_skin
ensure skinchanger
ensure esx_multicharacter
ensure [esx_addons]QBCore
- Téléchargez
qb-coreet les ressources de base depuis l'organisation GitHubqbcore-framework. - Importez
qbcore.sqldans votre base. - Ajoutez au server.cfg :
ensure oxmysql
ensure qb-core
ensure [qb]
ensure [standalone]
ensure [voice]
ensure [defaultmaps]Qbox
Qbox recommande l'installation par txAdmin : ses ressources (qbx_core, ox_lib, ox_inventory et les autres) évoluent vite et dépendent de versions précises.
La base de données
Les trois frameworks utilisent oxmysql, qui lit la ligne suivante du server.cfg :
set mysql_connection_string "mysql://fivem:motdepasse@127.0.0.1/fivem?charset=utf8mb4"Tables principales à connaître :
| Framework | Joueurs | Véhicules | Métiers |
|---|---|---|---|
| ESX Legacy | users | owned_vehicles | jobs, job_grades |
| QBCore | players | player_vehicles | dans qb-core/shared/jobs.lua |
| Qbox | players | player_vehicles | dans qbx_core/shared/jobs.lua |
Ajouter un métier
ESX Legacy (en base de données)
INSERT INTO jobs (name, label) VALUES ('mecano', 'Mécanicien');
INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
('mecano', 0, 'apprenti', 'Apprenti', 150, '{}', '{}'),
('mecano', 1, 'mecanicien', 'Mécanicien', 250, '{}', '{}'),
('mecano', 2, 'chef', "Chef d'atelier", 400, '{}', '{}');QBCore (dans le fichier des métiers)
QBShared.Jobs['mecano'] = {
label = 'Mécanicien',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Apprenti', payment = 150 },
['1'] = { name = 'Mécanicien', payment = 250 },
['2'] = { name = "Chef d'atelier", isboss = true, payment = 400 },
},
}Redémarrez le serveur pour que le métier soit pris en compte, puis donnez-le à un joueur avec la commande d'administration du framework : /setjob [id] mecano 0 (ESX) ou /setjob [id] mecano 0 (QBCore).
Ajouter un objet
Avec ox_inventory (ESX Legacy et Qbox)
['cle_atelier'] = {
label = "Clé de l'atelier",
weight = 50,
stack = false,
close = true,
description = "Ouvre la porte de l'atelier des mécaniciens",
},Avec qb-inventory (QBCore)
cle_atelier = {
name = 'cle_atelier', label = "Clé de l'atelier", weight = 50, type = 'item',
image = 'cle_atelier.png', unique = true, useable = true, shouldClose = true,
description = "Ouvre la porte de l'atelier des mécaniciens",
},Ajoutez l'image cle_atelier.png dans le dossier d'images de l'inventaire (ox_inventory/web/images/ ou qb-inventory/html/images/).
Écrire un script compatible avec chaque framework
Le même besoin, donner une prime à un joueur, s'écrit différemment selon le framework.
local ESX = exports['es_extended']:getSharedObject()
RegisterCommand('prime', function(src, args)
local cible = tonumber(args[1])
local montant = tonumber(args[2])
if not cible or not montant or montant <= 0 then return end
local xPlayer = ESX.GetPlayerFromId(cible)
if not xPlayer then return end
xPlayer.addAccountMoney('bank', montant, 'Prime de la direction')
xPlayer.showNotification(('Vous avez reçu une prime de %d $'):format(montant))
end, true)local QBCore = exports['qb-core']:GetCoreObject()
RegisterCommand('prime', function(src, args)
local cible = tonumber(args[1])
local montant = tonumber(args[2])
if not cible or not montant or montant <= 0 then return end
local Player = QBCore.Functions.GetPlayer(cible)
if not Player then return end
Player.Functions.AddMoney('bank', montant, 'prime-direction')
TriggerClientEvent('QBCore:Notify', cible, ('Vous avez reçu une prime de %d $'):format(montant), 'success')
end, true)RegisterCommand('prime', function(src, args)
local cible = tonumber(args[1])
local montant = tonumber(args[2])
if not cible or not montant or montant <= 0 then return end
local player = exports.qbx_core:GetPlayer(cible)
if not player then return end
player.Functions.AddMoney('bank', montant, 'prime-direction')
exports.qbx_core:Notify(cible, ('Vous avez reçu une prime de %d $'):format(montant), 'success')
end, true)Lire le métier du joueur côté client
local ESX = exports['es_extended']:getSharedObject()
RegisterNetEvent('esx:setJob', function(job)
print('Nouveau métier : ' .. job.label .. ' (grade ' .. job.grade_label .. ')')
end)
local function estMecano()
local data = ESX.GetPlayerData()
return data.job and data.job.name == 'mecano'
endlocal QBCore = exports['qb-core']:GetCoreObject()
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
print('Nouveau métier : ' .. job.label)
end)
local function estMecano()
local data = QBCore.Functions.GetPlayerData()
return data.job and data.job.name == 'mecano' and data.job.onduty
endLes callbacks : demander une information au serveur
Avec ox_lib, disponible sur les trois frameworks, un callback s'écrit pareil partout :
lib.callback.register('atelier:peutOuvrir', function(src)
local count = exports.ox_inventory:Search(src, 'count', 'cle_atelier')
return count > 0
end)local autorise = lib.callback.await('atelier:peutOuvrir', false)
if autorise then
lib.notify({ title = 'Atelier', description = 'La porte est ouverte', type = 'success' })
else
lib.notify({ title = 'Atelier', description = 'Il vous faut la clé', type = 'error' })
endN'oubliez pas de déclarer ox_lib dans le manifeste :
fx_version 'cerulean'
game 'gta5'
lua54 'yes'
shared_script '@ox_lib/init.lua'
client_script 'client.lua'
server_script 'server.lua'
dependencies { 'ox_lib', 'ox_inventory' }Problèmes fréquents
| Symptôme | Cause probable | Solution |
|---|---|---|
| Écran noir ou chargement infini à la création du personnage | Ressource d'identité ou d'apparence absente ou démarrée trop tôt | Vérifiez l'ordre des ensure |
attempt to index a nil value (global 'ESX') | Ancienne méthode esx:getSharedObject | Utilisez exports['es_extended']:getSharedObject() |
No such export GetCoreObject in resource qb-core | qb-core pas encore démarré | Placez ensure qb-core avant vos scripts |
| Erreurs SQL « Table doesn't exist » | Fichier .sql de la ressource non importé | Importez-le dans votre base |
| Argent ou objets perdus au redémarrage | Serveur arrêté brutalement | Arrêtez toujours le serveur depuis txAdmin ou le panel |
Pour aller plus loin
- Le guide Créer un script FiveM en Lua explique les bases (événements, natives, sécurité).
- La bibliothèque de scripts FiveM contient des scripts complets, dont un salaire automatique pour ESX et QBCore.
EsoterHost n'est ni approuvé, ni sponsorisé, ni affilié à Rockstar Games ou à Cfx.re. FiveM et Grand Theft Auto V sont des marques de leurs propriétaires.
