Parent : [[INDEX-FIVEM-FRAMEWORK]]
FiveM - Framework Bridge Auto-Detect : ESX/QBCore sans modification manuelle
Problème
Un script FiveM doit fonctionner avec ESX ou QBCore, mais l'utilisateur final ne veut pas modifier le code pour adapter le framework. Chaque framework a des triggers différents, des objets partagés différents, et des drivers MySQL différents.
Solution
Détecter automatiquement le framework actif au démarrage de la ressource via GetResourceState, puis configurer dynamiquement les triggers et l'objet partagé.
Config.Framework = 'auto_detect'
Config.FrameworkTriggers = {
esx = { resource_name = 'es_extended', shared_object = 'esx:getSharedObject' },
qbcore = { resource_name = 'qb-core', shared_object = 'QBCore:GetCoreObject' }
}
Config.Database = 'auto_detect'
-- Détection automatique au chargement
if Config.Framework == 'auto_detect' then
if GetResourceState(Config.FrameworkTriggers.esx.resource_name) == 'started' then
Config.Framework = 'esx'
elseif GetResourceState(Config.FrameworkTriggers.qbcore.resource_name) == 'started' then
Config.Framework = 'qbcore'
end
end
if Config.Database == 'auto_detect' then
if GetResourceState('oxmysql') == 'started' then
Config.Database = 'oxmysql'
elseif GetResourceState('mysql-async') == 'started' then
Config.Database = 'mysql-async'
elseif GetResourceState('ghmattimysql') == 'started' then
Config.Database = 'ghmattimysql'
end
end
Pourquoi
- Évite la maintenance de forks spécifiques à chaque framework
- Réduit le support utilisateur ("ça marche pas avec ESX/QBCore")
- Le choix se fait une fois au démarrage, pas à chaque appel
Quand l'utiliser
- Script commercial ou open-source destiné à plusieurs communautés
- Script de gameplay complexe utilisant player data, jobs, money
Quand NE PAS l'utiliser
- Script interne à un serveur unique (overhead inutile)
- Script standalone n'utilisant aucune API framework
Exemples
Correct
-- Bridge unifié : on wrap les fonctions communes
local function GetPlayer(source)
if Config.Framework == 'esx' then
return ESX.GetPlayerFromId(source)
elseif Config.Framework == 'qbcore' then
return QBCore.Functions.GetPlayer(source)
end
end
local function GetPlayerCash(player)
if Config.Framework == 'esx' then
return player.getMoney()
elseif Config.Framework == 'qbcore' then
return player.PlayerData.money.cash
end
end
Incorrect
-- Hardcodé ESX uniquement → incompatible QBCore
local ESX = exports["es_extended"]:getSharedObject()
function GiveMoney(source, amount)
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.addMoney(amount) -- Échoue si QBCore
end
Références
- cd_dispatch/config.lua L413-453
- rm_drugs/shared/config.lua L3-12
- KNOW-PAT-102 (Dual Framework Bridge Functions)
Liens connexes
- [[KNOW-ANT-FIVEM-002-client-side-validation-only|KNOW-ANT-FIVEM-002]]