Accueil › Documentation › Personnalisation · origen_parking

Personnalisation · origen_parking

Le dossier custom/ te permet d’intégrer n’importe quel framework, système de clés ou système de carburant sans toucher au cœur. Tous les fichiers qu’il contient survivent aux mises à jour.

text
custom/
├── sv_framework.lua  — server-side: identifier, permissions, money, notifications, garages
├── sv_keys.lua       — server-side: give keys, set lock state
├── cl_framework.lua  — client-side: identifier, notifications, player loaded event
├── cl_keys.lua       — client-side: read lock state
└── cl_fuel.lua       — client-side: get/set fuel level

sv_framework.lua

Framework.GetIdentifier(source) → string | nil

Renvoie l’identifiant unique d’un joueur (citizenid / license). Appelé à chaque action de stationnement ou de récupération.

lua
function Framework.GetIdentifier(source)
    -- Config.Framework == 'custom'
    return nil -- replace with your own logic
end

Framework.GetVehicleOwner(plate) → string | nil

Renvoie l’identifiant du propriétaire d’une plaque à partir de la table des véhicules du framework.

lua
function Framework.GetVehicleOwner(plate)
    -- Config.Framework == 'custom'
    return nil
end

Framework.SetVehicleStorageState(plate, stored)

Marque un véhicule comme rangé (stored = true) ou sorti (stored = false) dans la table des véhicules du framework.

lua
function Framework.SetVehicleStorageState(plate, stored)
    -- Config.Framework == 'custom'
end

Framework.HasAdminPermission(source, permission) → boolean

Appelé dans tous les callbacks d’administration. Les systèmes de permissions sont vérifiés dans cet ordre :

  1. origen_admin — exports['origen_admin']:HasPermission(src, permission)
  2. ace — IsPlayerAceAllowed(src, Config.AdminAceNode)
  3. qbx / qb — vérifie PlayerData.group pour god, superadmin, admin
  4. esx — vérifie xPlayer.getGroup() pour superadmin, admin
  5. custom — à implémenter ci-dessous
lua
function Framework.HasAdminPermission(source, permission)
    -- Config.AdminSystem == 'custom'
    return false
end

Framework.Notify(source, message, ntype)

Envoie une notification à un joueur. ntype : 'info' | 'success' | 'error'

lua
function Framework.Notify(source, message, ntype)
    -- Config.NotifySystem == 'custom'
end

Framework.GetGarages() → table[]

Renvoie une liste de garages pour le panneau d’administration. Chaque entrée : { id, name, label }.

lua
function Framework.GetGarages()
    -- Config.GarageIntegration == 'custom'
    return {}
end

Framework.GetMoney(source) → number

Renvoie le solde en liquide d’un joueur. Utilisé par le système de coût de stationnement.

lua
function Framework.GetMoney(source)
    -- Config.Framework == 'custom'
    return 0
end

Framework.RemoveMoney(source, amount) → boolean

Déduit du liquide à un joueur. Renvoie true en cas de succès.

lua
function Framework.RemoveMoney(source, amount)
    -- Config.Framework == 'custom'
    return false
end

Framework.GetVehicleState(plate) → number | nil

Renvoie l’état de stockage d’un véhicule d’après la table du framework (1 = sorti, 0 = rangé, ou nil s’il est introuvable).

lua
function Framework.GetVehicleState(plate)
    -- Config.Framework == 'custom'
    return nil
end

Intégration du système de clés

Le système de stationnement communique avec ton système de clés via deux fichiers passerelles : custom/sv_keys.lua (donner les clés et fixer le verrouillage) et custom/cl_keys.lua (lire l’état du verrouillage). Le chemin exécuté dépend de Config.KeySystem :

Config.KeySystem Comportement
qbx_vehiclekeys GiveKeys + SetLockState via les exports de qbx, avec repli natif.
qb-vehiclekeys GiveKeys via l’export de qb, verrouillage appliqué avec le natif + state bag.
qs-vehiclekeys GiveKeys + setLocked via les exports de qs, avec repli natif.
rk-keys addKey via l’export de rk, verrouillage natif.
none Aucune clé donnée, les véhicules apparaissent déverrouillés.
custom Tu implémentes la passerelle dans sv_keys.lua / cl_keys.lua.

Quel que soit Config.KeySystem, la méthode recommandée pour piloter le stationnement/la sortie depuis ton système de clés passe par les hooks client explicites ci-dessous. Ils sont déterministes et exécutent toutes les vérifications d’éligibilité, sans rien deviner.


Appelle ces exports client depuis ton système de clés chaque fois que le joueur verrouille ou déverrouille un véhicule. Le système de stationnement s’occupe du reste (vérifications d’éligibilité, stationnement/sortie côté serveur). Les deux acceptent un handle d’entité du véhicule et ne font rien si le véhicule n’est pas éligible.

lua
exports['origen_parking']:onVehicleLocked(vehicle)    -- park this vehicle
exports['origen_parking']:onVehicleUnlocked(vehicle)  -- unpark this vehicle

Branchement depuis un événement de verrouillage/déverrouillage (la plupart des systèmes de clés qb / esx en déclenchent un) :

lua
AddEventHandler('my_keys:client:vehicleLocked', function(veh)
    exports['origen_parking']:onVehicleLocked(veh)
end)
 
AddEventHandler('my_keys:client:vehicleUnlocked', function(veh)
    exports['origen_parking']:onVehicleUnlocked(veh)
end)

Branchement depuis le state bag de verrouillage des portes (qbx_vehiclekeys et similaires publient doorslockstate) :

lua
AddStateBagChangeHandler('doorslockstate', nil, function(bagName, _, value)
    local veh = GetEntityFromStateBagName(bagName)
    if veh == 0 then return end
    if value and value >= 2 then
        exports['origen_parking']:onVehicleLocked(veh)
    else
        exports['origen_parking']:onVehicleUnlocked(veh)
    end
end)

Les systèmes de clés qui n’utilisent que des natifs verrouillent la voiture côté serveur ; le client propriétaire de l’entité ne peut donc pas toujours observer le verrouillage via le sondage natif. Pour ces systèmes, les hooks explicites ci-dessus sont le seul déclencheur fiable : privilégie-les à Config.AutomaticParking.


sv_keys.lua

Keys.GiveKeys(source, entity, plate)

Donne les clés du véhicule à un joueur à l’apparition. S’exécute uniquement quand Config.GiveKeysOnSpawn = true. Chaque branche vérifie que la ressource de clés est en started et enveloppe l’export dans un pcall, de sorte qu’un système de clés absent ne casse jamais l’apparition.

Paramètre Type Description
source number ID serveur du joueur qui reçoit les clés.
entity number Handle d’entité du véhicule (peut valoir 0 s’il n’est pas encore apparu : utilise plate).
plate string Plaque d’immatriculation du véhicule.

Gérés d’office : qbx_vehiclekeys, qb-vehiclekeys, qs-vehiclekeys, rk-keys. Pour custom, ajoute ton propre appel d’export :

lua
function Keys.GiveKeys(source, entity, plate)
    -- Config.KeySystem == 'custom'
    -- exports['my_key_resource']:GiveKey(source, plate)
end

Keys.SetLock(entity, locked)

Verrouille ou déverrouille une entité de véhicule côté serveur. S’exécute uniquement quand Config.LockVehiclesOnSpawn = true. locked = true → verrouillé (état 2), false → déverrouillé (état 1). Chaque branche se rabat sur le natif + state bag afin que les autres joueurs voient le véhicule stationné comme verrouillé.

Paramètre Type Description
entity number Handle d’entité du véhicule.
locked boolean true pour verrouiller, false pour déverrouiller.
lua
function Keys.SetLock(entity, locked)
    -- Config.KeySystem == 'custom' / 'none' / 'rk-keys' → native fallback:
    SetVehicleDoorsLocked(entity, locked and 2 or 1)
    Entity(entity).state.doorslockstate = locked and 2 or 1
end

cl_framework.lua

Framework.GetLocalIdentifier() → string | nil

Renvoie, côté client, l’identifiant unique du joueur local.

lua
function Framework.GetLocalIdentifier()
    -- Config.Framework == 'custom'
    return nil
end

Framework.NotifyClient(message, notifyType)

Affiche une notification au joueur local. notifyType : 'info' | 'success' | 'error'

lua
function Framework.NotifyClient(message, notifyType)
    -- Config.NotifySystem == 'custom'
end

Framework.OnPlayerLoaded(callback)

Enregistre un callback déclenché quand les données du joueur sont prêtes. Utilisé pour la synchronisation initiale.

lua
function Framework.OnPlayerLoaded(callback)
    -- Config.Framework == 'custom'
    CreateThread(function() Wait(0); callback() end)
end

cl_keys.lua

Keys.IsLocked(vehicle) → boolean

Renvoie true si le véhicule est actuellement verrouillé. Utilisé uniquement par le sondage optionnel de stationnement automatique (Config.AutomaticParking) pour détecter quand le joueur verrouille sa voiture après en être sorti. Il vérifie à la fois l’état de verrouillage natif et le state bag doorslockstate, sans jamais sortir prématurément sur un state bag déverrouillé, afin qu’un bag périmé ne masque pas un vrai verrouillage natif.

Paramètre Type Description
vehicle number Handle d’entité du véhicule.
lua
function Keys.IsLocked(vehicle)
    -- Native lock: 0=None 1=Unlocked 2=Locked 3=LockedForPlayer 4=StuckForPlayer
    if GetVehicleDoorLockStatus(vehicle) >= 2 then return true end
 
    local stateBagLock = Entity(vehicle).state.doorslockstate
    if stateBagLock ~= nil and stateBagLock >= 2 then return true end
 
    return false
end

Si la détection automatique n’est pas fiable avec ton système de clés, laisse de côté le sondage et utilise les hooks explicites (onVehicleLocked / onVehicleUnlocked) documentés plus haut dans Intégration du système de clés.


cl_fuel.lua

Fuel.Get(vehicle) → number

Renvoie le niveau de carburant actuel (0–100) d’un véhicule.

Ordre de détection automatique : ox_fuel → LegacyFuel → ps-fuel → cdn-fuel → native.

lua
function Fuel.Get(vehicle)
    -- Config.FuelSystem == 'custom'
    return GetVehicleFuelLevel(vehicle)
end

Fuel.Set(vehicle, level)

Définit le niveau de carburant (0–100) d’un véhicule. Appelle toujours SetVehicleFuelLevel comme base, puis le système actif par-dessus.

lua
function Fuel.Set(vehicle, level)
    -- Config.FuelSystem == 'custom'
    SetVehicleFuelLevel(vehicle, level + 0.0)
end