Accueil › Documentation › 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.
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 levelFramework.GetIdentifier(source) → string | nilRenvoie l’identifiant unique d’un joueur (citizenid / license). Appelé à chaque action de stationnement ou de récupération.
function Framework.GetIdentifier(source)
-- Config.Framework == 'custom'
return nil -- replace with your own logic
endFramework.GetVehicleOwner(plate) → string | nilRenvoie l’identifiant du propriétaire d’une plaque à partir de la table des véhicules du framework.
function Framework.GetVehicleOwner(plate)
-- Config.Framework == 'custom'
return nil
endFramework.SetVehicleStorageState(plate, stored)Marque un véhicule comme rangé (stored = true) ou sorti (stored = false) dans la table des véhicules du framework.
function Framework.SetVehicleStorageState(plate, stored)
-- Config.Framework == 'custom'
endFramework.HasAdminPermission(source, permission) → booleanAppelé dans tous les callbacks d’administration. Les systèmes de permissions sont vérifiés dans cet ordre :
origen_admin — exports['origen_admin']:HasPermission(src, permission)ace — IsPlayerAceAllowed(src, Config.AdminAceNode)qbx / qb — vérifie PlayerData.group pour god, superadmin, adminesx — vérifie xPlayer.getGroup() pour superadmin, admincustom — à implémenter ci-dessousfunction Framework.HasAdminPermission(source, permission)
-- Config.AdminSystem == 'custom'
return false
endFramework.Notify(source, message, ntype)Envoie une notification à un joueur. ntype : 'info' | 'success' | 'error'
function Framework.Notify(source, message, ntype)
-- Config.NotifySystem == 'custom'
endFramework.GetGarages() → table[]Renvoie une liste de garages pour le panneau d’administration. Chaque entrée : { id, name, label }.
function Framework.GetGarages()
-- Config.GarageIntegration == 'custom'
return {}
endFramework.GetMoney(source) → numberRenvoie le solde en liquide d’un joueur. Utilisé par le système de coût de stationnement.
function Framework.GetMoney(source)
-- Config.Framework == 'custom'
return 0
endFramework.RemoveMoney(source, amount) → booleanDéduit du liquide à un joueur. Renvoie true en cas de succès.
function Framework.RemoveMoney(source, amount)
-- Config.Framework == 'custom'
return false
endFramework.GetVehicleState(plate) → number | nilRenvoie 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).
function Framework.GetVehicleState(plate)
-- Config.Framework == 'custom'
return nil
endLe 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.
exports['origen_parking']:onVehicleLocked(vehicle) -- park this vehicle
exports['origen_parking']:onVehicleUnlocked(vehicle) -- unpark this vehicleBranchement depuis un événement de verrouillage/déverrouillage (la plupart des systèmes de clés qb / esx en déclenchent un) :
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) :
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.
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 :
function Keys.GiveKeys(source, entity, plate)
-- Config.KeySystem == 'custom'
-- exports['my_key_resource']:GiveKey(source, plate)
endKeys.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. |
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
endFramework.GetLocalIdentifier() → string | nilRenvoie, côté client, l’identifiant unique du joueur local.
function Framework.GetLocalIdentifier()
-- Config.Framework == 'custom'
return nil
endFramework.NotifyClient(message, notifyType)Affiche une notification au joueur local. notifyType : 'info' | 'success' | 'error'
function Framework.NotifyClient(message, notifyType)
-- Config.NotifySystem == 'custom'
endFramework.OnPlayerLoaded(callback)Enregistre un callback déclenché quand les données du joueur sont prêtes. Utilisé pour la synchronisation initiale.
function Framework.OnPlayerLoaded(callback)
-- Config.Framework == 'custom'
CreateThread(function() Wait(0); callback() end)
endKeys.IsLocked(vehicle) → booleanRenvoie 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. |
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
endSi 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.
Fuel.Get(vehicle) → numberRenvoie le niveau de carburant actuel (0–100) d’un véhicule.
Ordre de détection automatique : ox_fuel → LegacyFuel → ps-fuel → cdn-fuel → native.
function Fuel.Get(vehicle)
-- Config.FuelSystem == 'custom'
return GetVehicleFuelLevel(vehicle)
endFuel.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.
function Fuel.Set(vehicle, level)
-- Config.FuelSystem == 'custom'
SetVehicleFuelLevel(vehicle, level + 0.0)
end