Accueil › Documentation › Personnalisation · origen_quests

Personnalisation · origen_quests

Tous les fichiers personnalisables sont exclus du chiffrement CFX escrow et peuvent être modifiés sans risque.

text
custom/
├── cl_drawtext.lua    -- Client: interaction text UI (key prompt at locations)
├── cl_framework.lua   -- Client: framework, notifications, player data
└── sv_framework.lua   -- Server: framework, admin, inventory, integrations

custom/cl_drawtext.lua

Contrôle le texte d’invite affiché lorsqu’un joueur est proche d’un emplacement de quête.

DrawQuestText(key, text)

Appelée lorsque le joueur entre dans le rayon d’interaction d’un emplacement. L’implémentation par défaut utilise le textUI de ox_lib.

lua
function DrawQuestText(key, text)
    lib.showTextUI("[" .. key .. "] - " .. text)
end
Paramètre Type Description
key string Libellé de la touche à afficher (p. ex. E)
text string Libellé d’interaction défini dans la configuration de l’emplacement

HideQuestText()

Appelée lorsque le joueur quitte le rayon d’interaction.

lua
function HideQuestText()
    lib.hideTextUI()
end

Remplace ces fonctions pour utiliser n’importe quel système de drawtext ou de textUI.


custom/cl_framework.lua

Framework.GetLocalIdentifier() → string | nil

Renvoie l’identifiant du joueur local (citizenid / license). Utilisé pour synchroniser l’XP.

lua
function Framework.GetLocalIdentifier()
    -- qbx / qb
    local ok, p = pcall(function() return exports.qbx_core:GetPlayerData() end)
    return (ok and p) and p.citizenid or nil
end

Framework.GetPlayerData() → table

Renvoie l’objet complet des données du joueur issu du framework. Utilisé pour les métadonnées de l’interface.

lua
function Framework.GetPlayerData()
    local ok, p = pcall(function() return exports.qbx_core:GetPlayerData() end)
    return (ok and p) and p or {}
end

Framework.NotifyClient(message, notifyType)

Envoie une notification au client local.

lua
function Framework.NotifyClient(message, notifyType)
    -- notifyType: 'inform' | 'success' | 'error' | 'warning'
    lib.notify({ description = message, type = notifyType })
end

Adapte cette fonction lorsque tu utilises Config.NotifySystem = 'custom' avec un événement client.

Framework.OnPlayerLoaded(callback)

Enregistre un callback exécuté lorsque le joueur a fini de charger. Utilisé pour initialiser les données de quêtes.

lua
function Framework.OnPlayerLoaded(callback)
    AddEventHandler('QBCore:Client:OnPlayerLoaded', callback)
end

Framework.TriggerCallback(name, cb, ...)

Encapsule lib.callback pour les callbacks serveur. Tu n’as normalement pas besoin de la modifier.

Framework.GetPlayerGang() → string

Renvoie le nom du gang actuel du joueur ou "none".

Framework.GetPlayerBusinesses() → table

Renvoie les entreprises actives du joueur depuis le statebag.


custom/sv_framework.lua

Framework.GetPlayer(source) → table | nil

Renvoie l’objet joueur du framework pour le source donné.

lua
function Framework.GetPlayer(source)
    local ok, p = pcall(function() return exports.qbx_core:GetPlayer(src) end)
    return (ok and p) and p or nil
end

Framework.GetIdentifier(source) → string | nil

Renvoie l’identifiant unique du joueur (citizenid pour QB, license pour ESX/standalone).

Framework.HasAdminPermission(source) → boolean

Vérifie si un joueur a un accès administrateur. Ordre de résolution selon Config.AdminSystem :

  1. origen_admin : vérifie la permission "origen_quests" de origen_admin
  2. ace : vérifie IsPlayerAceAllowed(source, Config.AdminAceNode)
  3. license : vérifie la liste Config.AdminLicenses
  4. custom : appelle Config.AdminCustom.resource:Config.AdminCustom.hasPermission(source, permission)
  5. qb : vérifie le groupe du joueur (god, superadmin, admin)
  6. esx : vérifie le groupe du joueur (superadmin, admin)

Framework.Notify(source, message, ntype)

Envoie une notification à un joueur côté serveur.

Framework.HasItem(source, item, amount) → boolean

Vérifie si le joueur possède au moins amount unités de item. Détecte automatiquement le système d’inventaire.

Framework.AddItem(source, item, amount) → boolean

Ajoute des objets à l’inventaire du joueur. Renvoie true en cas de succès.

Framework.RemoveItem(source, item, amount) → boolean

Retire des objets de l’inventaire du joueur. Renvoie true en cas de succès.

Framework.GetItems() → table

Renvoie tous les objets enregistrés dans le système d’inventaire actif. Utilisé pour remplir le sélecteur d’objets du panneau d’administration.

Framework.GetItemByName(source, itemName) → table

Renvoie les données d’un objet (avec count/amount) pour un joueur précis.

Framework.GetItemMetadata(itemName) → table

Renvoie les métadonnées d’un objet (name, label, image, description) à partir de son nom.


Hooks d’intégration

Le script principal appelle ces fonctions pour résoudre les intégrations. Remplace-les dans sv_framework.lua pour avoir un contrôle total.

Framework.GetPlayerAffiliationsCustom(source) → table | nil

Appelée lorsque Config.Integrations.affiliations.mode = 'custom'. Doit renvoyer :

lua
return {
    gang      = "mafia",       -- string, gang name or "none"
    businesses = { "auto_shop" }  -- table of business IDs
}

Framework.GetGangsCustom() → table

Appelée lorsque Config.Integrations.gangs.mode = 'custom'. Doit renvoyer un array :

lua
return {
    { id = "mafia",  label = "Mafia" },
    { id = "ballas", label = "Ballas" },
}

Framework.GetBusinessesCustom() → table

Appelée lorsque Config.Integrations.businesses.mode = 'custom'. Doit renvoyer un array :

lua
return {
    { id = "auto_shop", label = "Auto Shop", grades = { "owner", "manager" } },
}

Framework.SendPoliceDispatchCustom(source, data) → boolean

Appelée lorsque Config.Integrations.dispatch.mode = 'custom'. Reçoit :

lua
-- data = { message = "...", title = "..." }
-- Return true if the alert was sent successfully.
function Framework.SendPoliceDispatchCustom(_source, _data)
    exports['my_dispatch']:SendAlert(_source, _data)
    return true
end

Framework.CreateLog(data)

Appelée en interne lorsque des actions d’administration sont effectuées. Transmet à origen_admin s’il est en cours d’exécution ; sinon, utilise l’événement SendDiscordLog.