Jeux Tarifs Pro Infrastructure Guides Blog Partenariat À propos

ESX Legacy, QBCore ou Qbox : choisir et installer un framework roleplay FiveM

Comparatif ESX Legacy, QBCore et Qbox, installation avec txAdmin ou à la main, base de données, ajout d'emplois et d'objets, et exemples de code pour écrire des scripts compatibles avec chaque framework.

4 min de lecture Mis à jour le 21 octobre 2026

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 LegacyQBCoreQbox
AnciennetéLe plus ancien, très répanduTrès populaire depuis 2021Version modernisée de QBCore
Scripts disponiblesÉnormémentÉnormémentCompatible avec la plupart des scripts QBCore
Inventaireox_inventory conseilléqb-inventory ou ox_inventoryox_inventory
Bibliothèquesox_lib, oxmysqlqb-core, oxmysqlox_lib, oxmysql, ox_inventory
Pour quiServeurs qui veulent le plus grand choix de scriptsServeurs qui veulent un ensemble complet prêt à l'emploiServeurs qui partent de zéro et veulent un code récent et performant
Notre conseil

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.

  1. Ouvrez txAdmin, puis Setup (ou, sur un serveur déjà configuré, créez un nouveau profil de serveur).
  2. Choisissez Popular Recipes, puis ESX Legacy, QBCore ou Qbox.
  3. Laissez les identifiants de base de données proposés : sur EsoterHost, ils sont déjà remplis avec la base MariaDB de votre serveur.
  4. Collez votre clé de licence cfxk_…, puis lancez le déploiement.
  5. À la fin, démarrez le serveur depuis txAdmin.
Repartir de zéro

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

  1. Téléchargez la dernière version depuis le dépôt GitHub esx-framework/esx_core (onglet Releases).
  2. Copiez les ressources dans resources/[esx]/, oxmysql et ox_lib dans resources/[ox]/.
  3. Importez le fichier SQL fourni (legacy.sql) dans votre base.
  4. Ajoutez au server.cfg, dans cet ordre :
resources.cfg
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

  1. Téléchargez qb-core et les ressources de base depuis l'organisation GitHub qbcore-framework.
  2. Importez qbcore.sql dans votre base.
  3. Ajoutez au server.cfg :
resources.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 :

server.cfg
set mysql_connection_string "mysql://fivem:motdepasse@127.0.0.1/fivem?charset=utf8mb4"

Tables principales à connaître :

FrameworkJoueursVéhiculesMétiers
ESX Legacyusersowned_vehiclesjobs, job_grades
QBCoreplayersplayer_vehiclesdans qb-core/shared/jobs.lua
Qboxplayersplayer_vehiclesdans qbx_core/shared/jobs.lua

Ajouter un métier

ESX Legacy (en base de données)

metier-mecano.sql
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)

qb-core/shared/jobs.lua
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)

ox_inventory/data/items.lua
['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)

qb-core/shared/items.lua
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.

server.lua (ESX Legacy)
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)
server.lua (QBCore)
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)
server.lua (Qbox)
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

client.lua (ESX Legacy)
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'
end
client.lua (QBCore)
local 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
end

Les callbacks : demander une information au serveur

Avec ox_lib, disponible sur les trois frameworks, un callback s'écrit pareil partout :

server.lua
lib.callback.register('atelier:peutOuvrir', function(src)
  local count = exports.ox_inventory:Search(src, 'count', 'cle_atelier')
  return count > 0
end)
client.lua
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' })
end

N'oubliez pas de déclarer ox_lib dans le manifeste :

fxmanifest.lua
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ômeCause probableSolution
Écran noir ou chargement infini à la création du personnageRessource d'identité ou d'apparence absente ou démarrée trop tôtVérifiez l'ordre des ensure
attempt to index a nil value (global 'ESX')Ancienne méthode esx:getSharedObjectUtilisez exports['es_extended']:getSharedObject()
No such export GetCoreObject in resource qb-coreqb-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émarrageServeur arrêté brutalementArrêtez toujours le serveur depuis txAdmin ou le panel

Pour aller plus loin


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.

Ce guide vous a-t-il aidé ? Une question ? Ouvrez un ticket

Vous ne trouvez pas votre réponse ?

Notre équipe répond à vos tickets 7j/7, directement depuis votre espace client.