Apprendre à créer un script FiveM est la compétence fondamentale pour transformer votre serveur GTA V en une expérience unique et immersive. En 2025, les outils de développement FiveM offrent une flexibilité incomparable pour personnaliser vos serveurs, que vous souhaitiez créer des systèmes de jobs, des scripts de véhicules ou des mécaniques de roleplay avancées. Ce guide complet vous accompagne pas à pas dans la création de scripts performants et optimisés.
Les fondamentaux pour créer un script FiveM en 2025
Avant de plonger dans le code, il est essentiel de comprendre l’architecture de FiveM et les langages utilisés. La plateforme repose principalement sur Lua, un langage de script léger et performant, ainsi que sur JavaScript pour les développeurs préférant une approche moderne. Les scripts FiveM s’organisent en ressources, chaque ressource étant un dossier contenant les fichiers nécessaires au bon fonctionnement de votre script.
Structure d’une ressource FiveM
Une ressource FiveM standard suit une structure précise qui garantit son bon fonctionnement. Chaque script doit contenir au minimum un fichier fxmanifest.lua qui définit les métadonnées et les fichiers à charger. Cette organisation permet au serveur de comprendre comment exécuter votre script.
fx_version 'cerulean'
game 'gta5'
author 'Votre Nom'
description 'Mon premier script FiveM'
version '1.0.0'
client_scripts {
'client.lua'
}
server_scripts {
'server.lua'
} Le fichier client.lua contient le code exécuté côté client (sur l’ordinateur du joueur), tandis que server.lua gère la logique serveur. Cette séparation est cruciale pour la sécurité et les performances de votre serveur hébergé sur une infrastructure robuste comme celle proposée par Nexus Games.
Environnement de développement recommandé
Pour créer un script FiveM efficacement, vous aurez besoin d’un éditeur de code adapté. Visual Studio Code est le choix privilégié de la communauté grâce à ses extensions dédiées. Installez l’extension FiveM Natives pour bénéficier de l’autocomplétion des fonctions natives et gagner un temps précieux lors du développement.
- Visual Studio Code avec extensions FiveM et Lua
- Git pour la gestion de versions
- Accès à un serveur de test FiveM
- Documentation officielle FiveM Docs à portée de main
Un serveur de test local ou hébergé est indispensable. Les offres Nexus Games permettent de déployer rapidement un environnement FiveM optimisé avec un AMD Ryzen 9 7950X3D et de la RAM DDR5 ECC, garantissant des performances stables même lors de tests intensifs.
Créer votre premier script FiveM étape par étape
Passons maintenant à la pratique en créant un script simple mais fonctionnel. Nous allons développer un système de message de bienvenue qui s’affiche lorsqu’un joueur rejoint le serveur. Cet exemple couvre les concepts essentiels que vous réutiliserez dans tous vos futurs projets.
Création du manifeste
Commencez par créer un dossier nommé welcome-script dans le répertoire resources de votre serveur FiveM. À l’intérieur, créez le fichier fxmanifest.lua avec le contenu suivant :
fx_version 'cerulean'
game 'gta5'
author 'Votre Pseudo'
description 'Script de bienvenue personnalisé'
version '1.0.0'
client_script 'client.lua' Développement du script client
Créez maintenant le fichier client.lua dans le même dossier. Ce fichier contiendra la logique d’affichage du message :
-- Event déclenché à la connexion du joueur
AddEventHandler('playerSpawned', function()
-- Récupération du nom du joueur
local playerName = GetPlayerName(PlayerId())
-- Affichage du message de bienvenue
TriggerEvent('chat:addMessage', {
color = {255, 0, 0},
multiline = true,
args = {"Serveur", "Bienvenue " .. playerName .. " sur notre serveur FiveM!"}
})
end)
-- Commande personnalisée /heure
RegisterCommand('heure', function()
local hours = GetClockHours()
local minutes = GetClockMinutes()
TriggerEvent('chat:addMessage', {
args = {"Info", string.format("Il est %02d:%02d", hours, minutes)}
})
end, false) Ce script démontre deux mécaniques fondamentales : l’utilisation des events et l’enregistrement de commandes. Les natives GetPlayerName() et GetClockHours() sont des fonctions GTA V accessibles via FiveM. Consultez la documentation officielle des natives pour découvrir les milliers de fonctions disponibles.
Activation et test du script
Pour activer votre script, éditez le fichier server.cfg de votre serveur et ajoutez la ligne suivante :
ensure welcome-script Redémarrez votre serveur FiveM et connectez-vous. Vous devriez voir le message de bienvenue s’afficher automatiquement. Testez également la commande /heure dans le chat pour vérifier que tout fonctionne correctement.
Scripts avancés : communication client-serveur
Les scripts FiveM les plus puissants utilisent une architecture client-serveur permettant de sécuriser les données sensibles et de synchroniser les actions entre joueurs. Apprenons à créer un script FiveM avec cette approche en développant un système de points d’expérience.
Architecture sécurisée
Le principe fondamental : ne jamais faire confiance au client. Toutes les opérations critiques (attribution de points, modifications de données, transactions) doivent être validées côté serveur. Le client ne fait qu’envoyer des demandes que le serveur accepte ou refuse.
| Côté Client | Côté Serveur |
| Envoie des demandes | Valide et traite les demandes |
| Affiche les interfaces | Stocke les données persistantes |
| Détecte les actions du joueur | Synchronise entre les joueurs |
| Exécute les effets visuels | Gère la logique métier |
Exemple de script serveur
Modifions notre script pour inclure une partie serveur. Mettez à jour le fxmanifest.lua :
fx_version 'cerulean'
game 'gta5'
author 'Votre Pseudo'
description 'Système de points d\'expérience'
version '2.0.0'
client_script 'client.lua'
server_script 'server.lua' Créez le fichier server.lua :
-- Table pour stocker l'XP des joueurs (en mémoire)
local playerXP = {}
-- Event pour ajouter de l'XP
RegisterNetEvent('xp:addExperience')
AddEventHandler('xp:addExperience', function(amount)
local source = source
local identifier = GetPlayerIdentifier(source, 0)
-- Initialisation si nouveau joueur
if not playerXP[identifier] then
playerXP[identifier] = 0
end
-- Validation de la quantité (sécurité)
if amount > 0 and amount <= 100 then
playerXP[identifier] = playerXP[identifier] + amount
TriggerClientEvent('xp:updateDisplay', source, playerXP[identifier])
print(string.format("Joueur %s a gagné %d XP (total: %d)",
GetPlayerName(source), amount, playerXP[identifier]))
end
end)
-- Commande admin pour consulter l'XP
RegisterCommand('getxp', function(source, args)
if source == 0 then -- Console serveur uniquement
local identifier = args[1]
print(string.format("XP du joueur %s: %d", identifier, playerXP[identifier] or 0))
end
end, true) Et modifiez le client.lua pour communiquer avec le serveur :
local currentXP = 0
-- Event pour mettre à jour l'affichage
RegisterNetEvent('xp:updateDisplay')
AddEventHandler('xp:updateDisplay', function(newXP)
currentXP = newXP
TriggerEvent('chat:addMessage', {
color = {0, 255, 0},
args = {"XP", "Votre XP total: " .. currentXP}
})
end)
-- Commande pour gagner de l'XP (action joueur)
RegisterCommand('gagnerxp', function()
-- Demande au serveur d'ajouter 10 XP
TriggerServerEvent('xp:addExperience', 10)
end, false)
-- Affichage permanent de l'XP à l'écran
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
DrawAdvancedText(0.900, 0.970, 0.005, 0.0028, 0.5,
"XP: " .. currentXP, 255, 255, 255, 255, 4, 0)
end
end)
function DrawAdvancedText(x, y, w, h, sc, text, r, g, b, a, font, jus)
SetTextFont(font)
SetTextScale(sc, sc)
SetTextColour(r, g, b, a)
SetTextJustification(jus)
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText(x - 0.1 + w, y - 0.02 + h)
end Optimisation des performances
Les performances sont cruciales pour créer un script FiveM de qualité professionnelle. Voici les bonnes pratiques à respecter en 2025 :
- Utilisez Citizen.Wait() : Ne jamais créer de boucle infinie sans délai. Un Wait(0) minimum est requis
- Évitez les calculs inutiles : Mettez en cache les valeurs fréquemment utilisées
- Natives optimisées : Préférez les natives performantes documentées comme telles
- Events ciblés : Utilisez TriggerClientEvent avec un joueur spécifique plutôt que -1 (broadcast)
- Nettoyage mémoire : Supprimez les entités, blips et objets créés quand ils ne sont plus nécessaires
Un serveur performant nécessite également une infrastructure adaptée. Les serveurs Nexus Games équipés de processeurs AMD Ryzen 9 7950X3D avec 16 cœurs et de stockage NVMe SSD garantissent une exécution fluide même avec des dizaines de scripts complexes actifs simultanément.
Intégration de bases de données et persistance
Pour créer des scripts FiveM professionnels, la persistance des données est indispensable. Les joueurs attendent que leur progression, leurs véhicules et leurs possessions soient sauvegardés entre les sessions.
Choix de la base de données
FiveM supporte nativement MySQL via le framework mysql-async ou son successeur moderne oxmysql. Cette dernière solution offre des performances supérieures et une syntaxe plus simple :
-- Installation dans fxmanifest.lua
dependencies {
'oxmysql'
}
server_scripts {
'@oxmysql/lib/MySQL.lua',
'server.lua'
} Exemple de script avec base de données
Améliorons notre système d’XP pour le rendre persistant. Dans server.lua :
-- Chargement de l'XP au spawn
RegisterNetEvent('xp:playerConnected')
AddEventHandler('xp:playerConnected', function()
local source = source
local identifier = GetPlayerIdentifier(source, 0)
MySQL.Async.fetchScalar('SELECT xp FROM users WHERE identifier = @identifier', {
['@identifier'] = identifier
}, function(xp)
if xp then
TriggerClientEvent('xp:updateDisplay', source, xp)
else
-- Création du joueur dans la base
MySQL.Async.execute('INSERT INTO users (identifier, xp) VALUES (@identifier, 0)', {
['@identifier'] = identifier
})
TriggerClientEvent('xp:updateDisplay', source, 0)
end
end)
end)
-- Sauvegarde de l'XP
RegisterNetEvent('xp:saveExperience')
AddEventHandler('xp:saveExperience', function(amount)
local source = source
local identifier = GetPlayerIdentifier(source, 0)
if amount > 0 and amount 0 then
MySQL.Async.fetchScalar('SELECT xp FROM users WHERE identifier = @identifier', {
['@identifier'] = identifier
}, function(newXP)
TriggerClientEvent('xp:updateDisplay', source, newXP)
end)
end
end)
end
end) Configuration MySQL
Pour héberger votre base de données, les solutions VPS Linux Nexus Games offrent la flexibilité nécessaire avec des ressources suffisantes (32 Go de RAM DDR5 ECC minimum recommandés pour les serveurs de production). Configurez MySQL dans le fichier server.cfg :
set mysql_connection_string "mysql://user:password@localhost/fivem?charset=utf8mb4" Pour la structure de table, exécutez ce SQL :
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
identifier VARCHAR(50) UNIQUE NOT NULL,
xp INT DEFAULT 0,
last_connection TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Frameworks et outils pour accélérer le développement
Créer un script FiveM from scratch est formateur, mais les frameworks modernes permettent de gagner un temps considérable sur les fonctionnalités communes.
Les frameworks populaires en 2025
ESX Legacy reste le framework le plus répandu pour les serveurs roleplay. Il fournit une base complète avec gestion des jobs, inventaire, économie et entreprises. QBCore gagne en popularité grâce à sa structure modulaire plus moderne et ses performances optimisées.
| Framework | Avantages | Cas d’usage |
| ESX Legacy | Écosystème riche, nombreux scripts compatibles | Serveurs RP traditionnels |
| QBCore | Performances supérieures, code moderne | Nouveaux projets RP |
| vRP | Très personnalisable, communauté BR forte | Serveurs nécessitant une personnalisation poussée |
| Standalone | Contrôle total, performances maximales | Projets non-RP ou très spécifiques |
Créer un script compatible framework
Pour créer un script FiveM compatible ESX, respectez la structure attendue :
ESX = exports['es_extended']:getSharedObject()
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
-- Le joueur est chargé, accès aux fonctions ESX
local job = xPlayer.getJob()
print("Job du joueur: " .. job.name)
end)
-- Utilisation des fonctions ESX côté serveur
RegisterCommand('donnerargent', function(source, args)
local xPlayer = ESX.GetPlayerFromId(source)
local amount = tonumber(args[1])
if amount and amount > 0 then
xPlayer.addMoney(amount)
xPlayer.showNotification("Vous avez reçu $" .. amount)
end
end) Outils de développement et debugging
Le debugging est une étape cruciale lors de la création de scripts FiveM. Utilisez ces techniques pour identifier et corriger les erreurs rapidement :
- Console F8 : Console de développement intégrée à FiveM côté client
- Print statements : Affichage de variables dans la console serveur et client
- txAdmin : Interface d’administration avec logs en temps réel
- restart nomressource : Commande pour recharger un script sans redémarrer le serveur
- resmon : Moniteur de ressources pour identifier les scripts gourmands
La commande resmon est particulièrement utile pour optimiser vos scripts. Elle affiche l’utilisation CPU et mémoire de chaque ressource, vous permettant d’identifier les goulets d’étranglement. Sur un serveur hébergé avec une bande passante de 1 Gbps et un stockage NVMe comme chez Nexus Games, les performances réseau et disque ne sont généralement pas limitantes, mais l’optimisation du code reste primordiale.
Publication et sécurisation de vos scripts
Une fois votre script FiveM développé et testé, il est temps de le déployer en production ou de le partager avec la communauté. La sécurisation de votre code est une étape souvent négligée mais cruciale.
Obfuscation et protection
Si vous commercialisez vos scripts, l’obfuscation peut protéger votre propriété intellectuelle. Des outils comme luac compilent votre code Lua en bytecode, le rendant difficile à lire. Cependant, aucune protection n’est infaillible. La meilleure sécurité reste de maintenir une logique critique côté serveur.
Configuration sécurisée
Utilisez des fichiers de configuration séparés pour les données sensibles :
-- config.lua
Config = {}
Config.APIKey = "VOTRE_CLE_API_ICI"
Config.DatabaseName = "fivem_production"
-- Ajoutez config.lua au .gitignore pour ne pas le publier
Déploiement avec Git
Utilisez Git pour versionner vos scripts et faciliter les déploiements. Structure recommandée :
mon-script-fivem/
├── .gitignore
├── README.md
├── fxmanifest.lua
├── config.lua
├── client/
│ └── main.lua
├── server/
│ └── main.lua
└── shared/
└── functions.lua Le fichier .gitignore doit inclure les fichiers sensibles et les caches :
config.lua
*.cache
node_modules/
.vscode/ Testing et qualité du code
Avant chaque publication, testez votre script dans différents scénarios. Un serveur de test dédié est idéal. Les offres de serveurs FiveM via le Panel Nexus permettent de déployer rapidement des environnements de test isolés sans impact sur votre serveur de production.
Pour un code de qualité professionnelle, suivez ces standards :
- Nommage cohérent : camelCase pour les variables locales, PascalCase pour les fonctions globales
- Commentaires : Documentez les fonctions complexes et la logique métier
- Indentation : 4 espaces ou 1 tab, soyez constant dans tout le projet
- Gestion d’erreurs : Utilisez pcall() pour capturer les erreurs et éviter les crashs
- Validation des entrées : Vérifiez toujours les données reçues du client
En conclusion, créer un script FiveM en 2025 est une compétence accessible avec de la pratique et les bonnes ressources. Que vous développiez des scripts standalone ou dans un framework, les principes fondamentaux restent identiques : architecture client-serveur sécurisée, optimisation des performances et code maintenable. Un hébergement performant constitue la base d’un serveur réussi, et les infrastructures modernes avec processeurs AMD Ryzen dernière génération et stockage NVMe offrent l’environnement idéal pour faire tourner vos créations.
FAQ
Quel langage choisir entre Lua et JavaScript pour créer un script FiveM ?
Lua reste le choix privilégié pour créer un script FiveM en raison de sa légèreté, ses performances supérieures et sa compatibilité native avec tous les frameworks existants. JavaScript est une alternative valide si vous venez du développement web, mais l’écosystème de ressources et scripts existants est majoritairement en Lua. Pour débuter, Lua offre une courbe d’apprentissage plus douce et une documentation plus fournie spécifique à FiveM.
Comment débugger efficacement un script FiveM qui ne fonctionne pas ?
Commencez par vérifier la console F8 côté client et la console serveur pour identifier les erreurs. Ajoutez des instructions print() à différents endroits de votre code pour tracer l’exécution. Vérifiez que le fxmanifest.lua déclare correctement tous les fichiers et que la syntaxe est valide. Utilisez la commande ‘restart nomressource’ pour recharger le script après modifications. Si le script ne se charge pas du tout, vérifiez qu’il est bien activé dans le server.cfg avec ‘ensure nomressource’.
Combien de ressources RAM consomme un script FiveM typique ?
Un script FiveM bien optimisé consomme généralement entre 1 et 10 Mo de RAM. Les scripts mal optimisés avec des boucles infinies sans Wait() ou des fuites mémoire peuvent consommer plusieurs centaines de Mo. Utilisez la commande ‘resmon’ pour surveiller la consommation en temps réel. Pour un serveur de production avec 32 à 64 joueurs et une vingtaine de scripts actifs, comptez 4 à 8 Go de RAM totale nécessaire, d’où l’importance de choisir un hébergement avec suffisamment de mémoire DDR5 ECC comme les serveurs optimisés pour FiveM.




