Comprendre comment utiliser exports et events FiveM constitue une étape fondamentale pour tout développeur souhaitant créer des scripts performants et modulaires en 2025. Les exports permettent de partager des fonctions entre ressources, tandis que les events assurent la communication client-serveur et inter-ressources. Ce guide complet vous accompagne pas à pas dans la maîtrise de ces mécanismes essentiels, avec des exemples concrets, des bonnes pratiques et des astuces d’optimisation pour transformer vos projets FiveM en expériences fluides et professionnelles.
Comprendre les exports FiveM : partage de fonctions entre ressources
Les exports représentent le système natif de FiveM pour exposer des fonctions d’une ressource vers d’autres. Contrairement aux événements qui transmettent des données, les exports retournent directement des valeurs, ce qui les rend particulièrement adaptés aux opérations synchrones comme la récupération d’informations de joueur, de statut ou de configuration.
Déclaration d’un export côté serveur
Pour déclarer un export serveur, utilisez la syntaxe suivante dans votre script Lua :
exports('getNomJoueur', function(source)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer then
return xPlayer.getName()
end
return nil
end)
Cette fonction devient accessible depuis n’importe quelle autre ressource via exports['nom_ressource']:getNomJoueur(source). L’avantage majeur réside dans la simplicité d’utilisation : pas besoin de callback complexe, la valeur est retournée immédiatement.
Déclaration d’un export côté client
Côté client, le principe reste identique. Voici un exemple pour exposer une fonction qui vérifie si un joueur est en véhicule :
exports('estEnVehicule', function()
local ped = PlayerPedId()
return IsPedInAnyVehicle(ped, false)
end)
D’autres ressources peuvent alors appeler exports['ma_ressource']:estEnVehicule() pour obtenir un booléen instantanément. Cette approche favorise la réutilisabilité du code et évite les duplications.
Bonnes pratiques pour les exports
- Nommage explicite : utilisez des noms de fonctions clairs (getPlayerMoney, isPlayerAdmin) pour faciliter la maintenance
- Validation des paramètres : vérifiez toujours la validité des arguments reçus pour éviter les erreurs runtime
- Documentation : commentez vos exports avec les paramètres attendus et les valeurs de retour
- Performance : évitez les opérations lourdes dans les exports appelés fréquemment
Pour héberger vos scripts et tester vos exports dans des conditions professionnelles, LocationFiveM propose des serveurs optimisés avec des performances garanties et un support technique réactif.
Maîtriser les events FiveM : communication client-serveur efficace
Les events (événements) constituent le système de messagerie de FiveM. Ils permettent une communication asynchrone entre client et serveur, ainsi qu’entre différentes ressources. Contrairement aux exports, les events ne retournent pas de valeur directement mais déclenchent des actions à distance.
Types d’événements dans FiveM
| Type | Fonction d’envoi | Fonction d’écoute | Usage |
| Client → Serveur | TriggerServerEvent | RegisterServerEvent + AddEventHandler | Actions nécessitant validation serveur |
| Serveur → Client | TriggerClientEvent | RegisterNetEvent + AddEventHandler | Notifications, synchronisation |
| Client → Client | TriggerEvent | AddEventHandler | Communication interne ressource |
| Serveur → Serveur | TriggerEvent | AddEventHandler | Logique serveur modulaire |
Exemple pratique : système de notification
Côté serveur, enregistrement et déclenchement de l’événement :
RegisterServerEvent('monscript:envoyerNotification')
AddEventHandler('monscript:envoyerNotification', function(message)
local _source = source
TriggerClientEvent('monscript:afficherNotif', _source, message)
end)
Côté client, réception et traitement :
RegisterNetEvent('monscript:afficherNotif')
AddEventHandler('monscript:afficherNotif', function(message)
SetNotificationTextEntry('STRING')
AddTextComponentString(message)
DrawNotification(false, false)
end)
Cette architecture garantit que seul le serveur peut déclencher l’affichage de notifications, renforçant la sécurité contre les abus clients.
Sécurisation des events
La sécurité des événements représente un enjeu majeur en 2025. Voici les règles d’or :
- Validation serveur systématique : ne faites jamais confiance aux données reçues du client
- Vérification des permissions : contrôlez toujours les droits avant d’exécuter une action sensible
- Rate limiting : limitez la fréquence d’appel des events pour éviter le spam
- Logs détaillés : enregistrez les actions importantes pour détecter les comportements suspects
Exemple de validation robuste :
RegisterServerEvent('banque:retirerArgent')
AddEventHandler('banque:retirerArgent', function(montant)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
if not xPlayer then return end
if type(montant) ~= 'number' or montant 50000 then
banPlayer(_source, 'Tentative de retrait invalide')
return
end
if xPlayer.getAccount('bank').money >= montant then
xPlayer.removeAccountMoney('bank', montant)
xPlayer.addMoney(montant)
end
end)
Exports vs Events : quand utiliser chaque méthode ?
Choisir entre exports et events FiveM dépend du contexte et des besoins spécifiques de votre script. Chaque méthode présente des avantages distincts qui la rendent plus adaptée à certaines situations.
Utilisez les exports quand :
- Vous avez besoin d’une valeur de retour immédiate (getPlayerMoney, isPlayerOnline)
- L’opération est synchrone et rapide (pas d’attente de base de données)
- Vous créez une API publique pour votre ressource
- La fonction est appelée fréquemment et nécessite des performances optimales
Utilisez les events quand :
- L’action nécessite une communication client-serveur
- Vous devez notifier plusieurs ressources ou joueurs simultanément
- L’opération est asynchrone (requêtes base de données, délais)
- Vous implémentez des systèmes d’hooks permettant à d’autres ressources de réagir
Combinaison des deux approches
Les développeurs expérimentés combinent souvent exports et events pour créer des systèmes robustes. Par exemple, un système d’inventaire pourrait exposer un export getItemCount(itemName) pour les vérifications rapides, tout en utilisant des events inventory:itemAdded pour notifier les autres ressources des changements.
-- Export pour lecture rapide
exports('getItemCount', function(source, itemName)
return inventoryData[source][itemName] or 0
end)
-- Event pour modification avec notification
RegisterServerEvent('inventory:addItem')
AddEventHandler('inventory:addItem', function(itemName, count)
local _source = source
inventoryData[_source][itemName] = (inventoryData[_source][itemName] or 0) + count
TriggerEvent('inventory:itemAdded', _source, itemName, count)
end)
Performance et optimisation
Les exports sont généralement plus performants pour les appels locaux répétés, car ils n’impliquent pas de sérialisation réseau. En revanche, les events sont indispensables dès qu’une communication réseau est nécessaire. Selon une analyse technique publiée sur la documentation officielle FiveM, les exports peuvent être jusqu’à 40% plus rapides pour les opérations locales.
Cas d’usage avancés et patterns de développement
La maîtrise complète des exports et events FiveM passe par l’application de patterns éprouvés qui structurent efficacement vos projets et facilitent la collaboration en équipe.
Pattern Observer avec les events
Le pattern Observer permet à plusieurs ressources de réagir à un événement sans couplage fort. Par exemple, un système de mort de joueur :
-- Ressource principale
AddEventHandler('gameEventTriggered', function(name, args)
if name == 'CEventNetworkEntityDamage' then
local victim = args[1]
local attacker = args[2]
if IsEntityDead(victim) and IsEntityAPed(victim) then
local victimId = NetworkGetPlayerIndexFromPed(victim)
TriggerEvent('joueur:estMort', victimId, attacker)
end
end
end)
-- Autres ressources peuvent écouter
AddEventHandler('joueur:estMort', function(victimId, attacker)
-- Statistiques, logs, pénalités, etc.
end)
Système de middleware pour validation
Créez un système de middleware réutilisable pour valider les events :
function createSecuredEvent(eventName, validator, handler)
RegisterServerEvent(eventName)
AddEventHandler(eventName, function(...)
local _source = source
local args = {...}
if validator(_source, table.unpack(args)) then
handler(_source, table.unpack(args))
else
print(('Event %s bloqué pour %s'):format(eventName, GetPlayerName(_source)))
end
end)
end
-- Utilisation
createSecuredEvent('shop:acheterItem',
function(source, itemId, quantity)
return type(itemId) == 'string' and type(quantity) == 'number' and quantity > 0
end,
function(source, itemId, quantity)
-- Logique d'achat sécurisée
end
)
Exports asynchrones avec callbacks
Bien que les exports soient synchrones, vous pouvez implémenter des callbacks pour les opérations asynchrones :
exports('recupererDonneesDB', function(playerId, callback)
MySQL.Async.fetchAll('SELECT * FROM users WHERE identifier = @id', {
['@id'] = GetPlayerIdentifier(playerId, 0)
}, function(result)
if callback then callback(result) end
end)
end)
-- Appel depuis une autre ressource
exports['ma_ressource']:recupererDonneesDB(source, function(data)
print('Données récupérées:', json.encode(data))
end)
Gestion d’état centralisée
Pour les projets complexes, créez une ressource dédiée à la gestion d’état exposant des exports et diffusant des events :
-- Ressource 'gamestate'
local serverState = {
meteo = 'CLEAR',
heure = 12,
joueurs = {}
}
exports('getState', function(key)
return serverState[key]
end)
function setState(key, value)
serverState[key] = value
TriggerClientEvent('gamestate:updated', -1, key, value)
end
exports('setState', setState)
Cette architecture favorise la cohérence des données et simplifie le débogage. Pour tester ces architectures avancées dans des conditions optimales, les serveurs proposés sur LocationFiveM offrent les ressources nécessaires avec des temps de réponse minimaux et une stabilité maximale.
Debugging et monitoring
Implémentez un système de logging pour tracer les appels d’exports et events :
local function logEvent(eventType, eventName, source, data)
local logEntry = {
timestamp = os.time(),
type = eventType,
name = eventName,
source = source,
data = data
}
-- Envoi vers système de monitoring
TriggerEvent('logger:save', logEntry)
end
-- Wrapper pour RegisterServerEvent
function RegisterTrackedServerEvent(eventName, handler)
RegisterServerEvent(eventName)
AddEventHandler(eventName, function(...)
logEvent('server_event', eventName, source, {...})
handler(...)
end)
end
Cette approche permet d’identifier rapidement les problèmes de performance ou les tentatives d’exploitation.
Maîtriser comment utiliser exports et events FiveM en 2025 vous permet de concevoir des scripts modulaires, performants et sécurisés. Les exports excellent dans la récupération synchrone de données, tandis que les events gèrent brillamment les communications asynchrones et les notifications multi-ressources. En combinant judicieusement ces deux mécanismes et en appliquant les patterns avancés présentés dans ce guide, vous développerez des systèmes robustes et maintenables qui élèveront la qualité de votre serveur FiveM. L’investissement dans la compréhension profonde de ces fondamentaux se traduit directement par des expériences de jeu fluides et une architecture technique solide.
FAQ
Quelle est la différence de performance entre exports et events FiveM ?
Les exports sont généralement 30 à 40% plus rapides pour les appels locaux car ils évitent la sérialisation réseau. Utilisez les exports pour les lectures fréquentes de données, et les events pour les communications client-serveur ou les notifications multi-ressources. Pour les opérations critiques appelées en boucle (comme dans les threads), privilégiez toujours les exports locaux.
Comment sécuriser efficacement mes events contre les exploits ?
Implémentez systématiquement trois couches de sécurité : validation stricte des types et plages de valeurs reçues, vérification des permissions joueur côté serveur, et rate limiting pour limiter la fréquence d’appel. Ajoutez des logs pour détecter les comportements anormaux. Ne faites jamais confiance aux données reçues du client et effectuez toutes les vérifications critiques exclusivement côté serveur.
Puis-je appeler un export depuis un event ou vice-versa ?
Oui, c’est même une pratique courante et recommandée. Par exemple, un event peut utiliser un export pour vérifier des données avant traitement, ou un export peut déclencher un event pour notifier d’autres ressources. Cette combinaison permet de créer des architectures flexibles où les exports fournissent l’API de lecture rapide et les events gèrent les modifications avec notifications, offrant ainsi le meilleur des deux approches.
Hébergez vos scripts FiveM sur des serveurs performants
Testez vos exports et events dans des conditions optimales avec LocationFiveM
