Retour au cours

games / fivem

Les bases de Lua pour FiveM

Leçon 11 exercice

Explication

Un peu d'histoire

FiveM est une modification (mod) pour Grand Theft Auto V, développée par un collectif de programmeurs connu sous le nom de CitizenFX, apparue autour de 2014-2015. Elle permet de créer des serveurs multijoueurs personnalisés et persistants, avec des scripts et des ressources sur mesure, alors que le mode multijoueur officiel du jeu (GTA Online) ne le permet pas. Le projet a connu des tensions juridiques avec Take-Two Interactive (l'éditeur du jeu) autour de 2017, avant de se stabiliser dans une forme tolérée qui a permis à un immense écosystème de serveurs de roleplay (RP) de se développer.

Pourquoi apprendre FiveM aujourd'hui

FiveM est devenu la plateforme de référence pour créer des serveurs de jeu roleplay très personnalisés, avec une communauté énorme et active. Savoir scripter pour FiveM (en Lua, avec des notions de client/serveur, de bases de données, d'interfaces NUI) est une compétence recherchée dans cette niche, et c'est aussi une excellente porte d'entrée concrète et motivante pour apprendre des concepts de programmation réseau/client-serveur.

Pourquoi commencer par Lua

Avant de toucher au moindre concept spécifique à FiveM, il faut maîtriser le langage dans lequel tout s'écrit : Lua. C'est un langage de script volontairement simple, léger et rapide à démarrer, ce qui explique pourquoi il est utilisé comme langage d'extension dans de nombreux jeux vidéo (World of Warcraft, Garry's Mod...) et pas seulement FiveM.

Ce que vous allez apprendre

  • Déclarer des variables locales et comprendre pourquoi éviter les variables globales
  • Utiliser une table Lua comme liste ordonnée et comme dictionnaire clé/valeur
  • Écrire des fonctions réutilisables, y compris en les passant en argument à une autre fonction
  • Parcourir une table avec ipairs (ordre garanti) et pairs (toutes les clés)
  • Manipuler des chaînes de caractères courantes en dev FiveM (format, gsub, upper)

Dans quel contexte ?

Avant même d'ouvrir FiveM, imagine que tu dois écrire un tout premier script qui affiche dans la console le nom, le niveau et le rang d'un joueur fictif, en calculant ce rang à partir du niveau. Ce mini-exercice mobilise déjà toutes les briques de cette leçon : variables, table de statistiques, fonction de calcul et boucle d'affichage — exactement la base sur laquelle repose ensuite tout script FiveM, qu'il gère une boutique, un inventaire ou un système de permissions.

Brique LuaRôleExemple
localLimite la portée d'une variablelocal hp = 100
Table (array)Liste ordonnée, index depuis 1{"a", "b", "c"}
Table (dictionnaire)Clé/valeur arbitraire{hp = 100, mana = 50}
FonctionBloc réutilisable, valeur de première classelocal function f() end

Piège fréquent

Oublier local devant une variable ne provoque aucune erreur immédiate : le script continue de fonctionner normalement. Le bug apparaît plus tard, quand un autre script (ou un autre fichier de la même ressource) modifie par erreur cette même variable globale sans le savoir — un des bugs les plus difficiles à tracer pour un débutant FiveM.

Les briques qui reviennent partout

Une variable stocke une information ; le mot-clé local limite sa visibilité au bloc de code où elle est créée — un réflexe à prendre systématiquement, car une variable globale (sans local) devient accessible et modifiable depuis n'importe où dans le script, ce qui rend les bugs beaucoup plus difficiles à traquer.

La table est la structure de données la plus importante de Lua : elle sert à la fois de liste ordonnée (comme une liste de courses numérotée) et de dictionnaire (comme un carnet d'adresses où chaque nom est associé à un numéro). Comprendre qu'une seule et même structure fait les deux, selon la façon dont on l'utilise, est la clé pour lire du code Lua efficacement.

Une fonction regroupe des instructions réutilisables sous un nom ; en Lua, une fonction est une valeur comme une autre, ce qui permet de la stocker dans une variable ou de la transmettre à une autre fonction — un mécanisme essentiel qu'on retrouvera constamment sous forme de "callbacks" dans les leçons sur les events.

Piège de débutant

Oublier local est l'erreur la plus commune : elle ne provoque pas d'erreur immédiate, mais peut créer des bugs très difficiles à comprendre plus tard, quand deux scripts différents modifient sans le savoir la même variable globale.

Commandes & code

Les bases de Lua pour FiveM

Lua est le langage de script de FiveM. Ces briques (variables, tables, fonctions, boucles) reviennent dans absolument tout le code du jeu.

lua
-- Variables et types de base
local playerName = "Nedvaide"        -- string
local playerLevel = 42               -- number
local isAdmin = false                -- boolean
local playerData = nil               -- nil (absence de valeur)

-- Tables : LA structure universelle de Lua (array + dictionnaire)
local weapons = {"WEAPON_PISTOL", "WEAPON_KNIFE", "WEAPON_BAT"} -- array (index 1..n)

local playerStats = {                -- dictionnaire (clé/valeur)
    health = 200,
    armor = 0,
    money = 5000,
}

-- Fonctions
local function GetFullName(firstName, lastName)
    return firstName .. " " .. lastName  -- ".." = concaténation de strings
end

print(GetFullName("John", "Doe")) -- John Doe

-- Boucles : ipairs pour les arrays (ordre garanti), pairs pour tout le reste
for i, weapon in ipairs(weapons) do
    print(i, weapon)
end

for key, value in pairs(playerStats) do
    print(key, value)
end

-- Boucle numérique classique
for i = 1, 10, 2 do -- de 1 à 10, pas de 2
    print("Itération " .. i)
end

-- Conditions
local function GetRank(level)
    if level >= 50 then
        return "Vétéran"
    elseif level >= 20 then
        return "Confirmé"
    else
        return "Débutant"
    end
end
lua
-- Manipuler les tables dynamiquement
table.insert(weapons, "WEAPON_KNIFE2")     -- ajoute à la fin
table.remove(weapons, 1)                    -- retire l'élément à l'index 1
print(#weapons) -- longueur de la table (uniquement la partie "array")

-- Fonctions string très utilisées en dev FiveM
local raw = "  Nedvaide  "
print(string.upper(raw))                                     -- "  NEDVAIDE  "
print(string.format("Joueur: %s (niveau %d)", playerName, playerLevel))
print((raw):gsub("%s+", ""))                                 -- retire les espaces (pattern Lua)

-- Fonctions comme valeurs (très courant en FiveM : callbacks, handlers)
local function ExecuteWithLog(fn, ...)
    print("Exécution démarrée")
    local result = fn(...)
    print("Exécution terminée")
    return result
end

ExecuteWithLog(GetFullName, "Marie", "Curie")

Résumé

  • local limite la portée d'une variable : toujours l'utiliser sauf besoin explicite de variable globale.
  • Les tables remplacent à la fois les tableaux et les objets/dictionnaires d'autres langages.
  • ipairs pour parcourir un array dans l'ordre, pairs pour tout parcourir sans garantie d'ordre.
  • Les fonctions sont des valeurs comme les autres : elles peuvent être passées en argument (base des callbacks).

Exercices pratiques

1 disponible
1

Mission : traquer une variable fantôme dans une boutique

Objectif : Diagnostiquer un bug de portée de variable et réécrire une fonction de calcul en s'appuyant sur une table plutôt que sur une chaîne de conditions.

Contexte

La ressource technologik_shop charge deux fichiers via shared_scripts : config.lua, qui contient discount = 10, et loyalty.lua, écrit plus tard par un autre développeur, qui contient lui aussi une ligne discount = 0 au démarrage pour sa propre logique de fidélité. Aucun des deux fichiers n'utilise local. Depuis l'ajout de loyalty.lua, la réduction boutique ne s'applique plus jamais, sans aucune erreur dans la console.

Tu dois comprendre pourquoi, puis améliorer une fonction de calcul de rang pour qu'elle soit plus facile à faire évoluer.

Résoudre l’exercice →