Explorer
KNOW-PAT-084

FiveM - Framework Bridge Auto-Detect : ESX/QBCore sans modification manuelle

Domaine
framework
Type
pattern
Priorité
P1

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]]