Configuration
Every tc-divisions config.lua option: bridge, staff, limits, codes, garages, panic, images.
#Bridge
Lua
Config.Bridge = {
Framework = 'auto', -- 'auto' | 'vision' | 'qbox' | 'qbcore' | 'esx' | 'standalone'
Inventory = 'auto', -- 'auto' | 'ox_inventory' | 'qs-inventory' | 'qb-inventory' | 'framework' | 'none'
Target = 'auto', -- not used by this script
Society = 'auto', -- not used by this script
Callbacks = 'auto', -- 'auto' | 'native'
VehicleKeys = 'auto', -- 'auto' | 'qb-vehiclekeys' | 'qs-vehiclekeys' | 'Renewed-Vehiclekeys' | 'wasabi_carlock' | 'none'
Debug = false, -- prints the detected framework / inventory in the console
Admins = {}, -- identifiers always admin, e.g. 'license:xxxxxxxx'
AdminAce = 'command', -- ACE granting staff access (outside Vision)
Standalone = {}, -- hooks, standalone mode only
}#Standalone mode
The character identifier is the Rockstar license. Provide:
| Function | Returns |
|---|---|
getJob(src) | { name, label, grade, gradeName, gradeLabel, onDuty } |
listJobs() | { police = { label = 'Police', grades = { { grade = 0, name = 'cadet', label = 'Cadet' } } } } |
getMoney, removeMoney, addMoney, itemCount, addItem | for paid shops |
#Integrations
Lua
Config.Integrations = { logs = true } -- tc-logs: copy the journal to Discord#Staff and commands
Lua
Config.Permissions = { 'gestion', 'gestion_features', 'dev' } -- Vision: one is enough
Config.AdminDiscords = { '123456789012345678' } -- Discord IDs with management access
Config.Commands = {
Gestion = 'divgestion', -- staff: full menu
Manage = 'division', -- players: see their division; bosses: assign their employees
Panic = 'panic', -- panic button
}- Vision: having one of the permissions above, or being in
AdminDiscords, is enough. - Other frameworks: ACE
Config.Bridge.AdminAce, framework admin groups,Config.Bridge.Admins, orAdminDiscords.
#Divisions and boss management
| Option | Default | Role |
|---|---|---|
Config.DefaultManageGrade | 'top' | Minimum grade to manage their own company's divisions when nothing is set in game: 'top' = highest grade, or a number |
Config.MaxDivisionsPerJob | 20 | Maximum divisions per job |
Config.BossChests | { max = 3, slots = 50, weight = 200 } | Boss chests: count, slots, weight (kg). Adjustable per company in /divgestion |
Config.BossChestReach | 10.0 | Max distance (m) between the boss and the chest they place |
#Codes and security
Lua
Config.Code = { min = 4, max = 8 } -- codes: digits only
Config.MaxAttempts = 3 -- wrong codes before lock
Config.LockSeconds = 120 -- lock duration (per character, survives a reconnect)
Config.ShopUnlockSeconds = 600 -- a shop unlocked by code stays unlocked this long
Config.InteractKey = 38 -- interaction key (38 = E)#Defaults and limits
Lua
Config.ChestDefaults = { slots = 50, weight = 200, radius = 1.5 }
Config.ShopDefaults = { radius = 1.5 }
Config.GarageDefaults = { radius = 1.5, storeRadius = 5.0 }
Config.Limits = { -- bounds accepted by the server
slots = { 1, 500 },
weight = { 1, 10000 }, -- kg
radius = { 0.8, 5.0 },
price = { 0, 1000000 },
quantity = { 1, 100 }, -- quantity given per purchase
perBuy = { 1, 50 }, -- purchases at once
}
Config.Payment = { cash = true, bank = true } -- payment methods for paid shops#Garages
| Option | Role |
|---|---|
Config.GarageMaxOut | Vehicles out at the same time per player, all garages combined (0 = no limit) |
Config.GarageLarge | Large vehicles: beyond length / height (m), the model only spawns on spots flagged “large vehicle” |
Config.Callsign | Roof number: mod layouts, number of slots, sector and badge digits |
Config.VehicleImageFallback | Vehicle image URL template (%s = lowercase spawn name). Empty = car icon |
Lua
Config.Callsign = {
layouts = {
{ 5, 42, 43, 44, 45 }, -- onx: positions A → E
{ 8, 10, 9 }, -- nk: left, centre, right
},
maxSlots = 5,
sectorDigits = 2, -- max sector digits
matriculeDigits = 4, -- max badge-number digits
}#Item images and outfits
Lua
Config.ItemImageBase = '' -- e.g. 'nui://ox_inventory/web/images/%s.png'; empty = detected from your inventory
Config.Outfits = { Enabled = 'auto', Item = 'outfit' } -- outfits sold in shops (see Installation)#Panic button
Alerts colleagues of the same service. Vision: same alert as the core's PANIC BUTTON (all jobs of the same type). Other frameworks: notification + temporary GPS blip for players of the listed jobs.
Lua
Config.Panic = {
Enabled = true,
Jobs = { 'police', 'sheriff', 'ambulance' }, -- jobs concerned (outside Vision)
RequireDuty = true, -- you must be on duty
CooldownSeconds = 15,
BlipSeconds = 60, -- GPS blip duration for colleagues
}#Appearance
Lua
Config.InteractIcons = { chest = 'Stockage', shop = 'Catalogue', garage = 'Garage' } -- Vision prompt icons
Config.Blips = {
chest = { sprite = 587, color = 5, scale = 0.7 },
shop = { sprite = 52, color = 3, scale = 0.7 },
garage = { sprite = 357, color = 3, scale = 0.7 },
}Config.Props and Config.Peds list the objects and peds offered in the builder (a free model can also be typed).
#Full file
Show config.lua (189 lines)
config.luaDownload
-- tc-divisions : configuration / settings
Config = Config or {}
Config.Debug = false
-- ============================================================================
-- CADRE / FRAMEWORK (Bridge)
-- Le script détecte tout seul votre framework (Vision, Qbox, QBCore, ESX ou standalone),
-- votre inventaire et votre système de cibles. Ne touchez à ceci que pour forcer un choix.
-- The script auto-detects your framework, inventory and target system. Only edit this to force a choice.
-- ============================================================================
Config.Bridge = {
Framework = 'auto', -- 'auto' | 'vision' | 'qbox' | 'qbcore' | 'esx' | 'standalone'
Inventory = 'auto', -- 'auto' | 'ox_inventory' | 'qs-inventory' | 'qb-inventory' | 'framework' | 'none'
Target = 'auto', -- 'auto' | 'ox_target' | 'qb-target' | 'none' (non utilisé par ce script / unused here)
Society = 'auto', -- compte société (non utilisé par ce script / unused here)
Callbacks = 'auto', -- 'auto' | 'native' (callbacks du framework, sinon système intégré au script)
VehicleKeys = 'auto', -- clés de véhicule : 'auto' | 'qb-vehiclekeys' | 'qs-vehiclekeys' | 'Renewed-Vehiclekeys' | 'wasabi_carlock' | 'none'
Debug = false, -- affiche dans la console le framework / l'inventaire détectés
Admins = {}, -- identifiants toujours admin, ex. 'license:xxxxxxxx' (en plus de l'ACE et des groupes du framework)
AdminAce = 'command', -- permission ACE qui donne l'accès staff (add_ace group.admin command allow) ; hors Vision
-- Hooks à fournir UNIQUEMENT en mode standalone (sans framework). Only for standalone mode.
-- Pour ce script : getJob(src) -> { name, label, grade, gradeName, gradeLabel, onDuty },
-- listJobs() -> { police = { label = 'Police', grades = { { grade = 0, name = 'cadet', label = 'Cadet' } } } },
-- ainsi que getMoney / removeMoney / addMoney / itemCount / addItem pour les shops payants.
-- L'identifiant du personnage est la licence Rockstar.
-- Example: Standalone = { getJob = function(src) return {...} end, listJobs = function() return {...} end }
Standalone = {},
}
-- ============================================================================
-- INTÉGRATIONS OPTIONNELLES / OPTIONAL INTEGRATIONS
-- Chaque intégration n'est utilisée que si la ressource correspondante est démarrée.
-- ============================================================================
Config.Integrations = {
logs = true, -- tc-logs : copie du journal vers Discord (webhooks configurés dans tc-logs)
}
-- ============================================================================
-- STAFF / ACCÈS ADMIN
-- Vision : il suffit d'avoir UNE des permissions de compte ci-dessous, ou d'être dans AdminDiscords.
-- Autres frameworks : ACE `Config.Bridge.AdminAce`, groupes admin du framework ou Config.Bridge.Admins,
-- ou être dans AdminDiscords.
-- ============================================================================
Config.Permissions = { 'gestion', 'gestion_features', 'dev' }
-- IDs Discord qui ont accès à la gestion (chaînes entre guillemets). Laisser vide si inutile.
-- Discord IDs granted staff access (strings). Leave empty if unused.
Config.AdminDiscords = {
-- '123456789012345678',
}
Config.Commands = {
Gestion = 'divgestion', -- staff : menu complet (sur Vision aussi dans /gestion → « Divisions & accès »)
Manage = 'division', -- joueurs : voir sa division ; patrons : affecter leurs employés
Panic = 'panic', -- bouton panic (voir Config.Panic)
}
-- Grade minimum pour gérer les divisions de SON entreprise, quand rien n'est réglé
-- en jeu pour ce job : 'top' = le grade le plus élevé du job, sinon un nombre.
Config.DefaultManageGrade = 'top'
-- Limites des divisions.
Config.MaxDivisionsPerJob = 20
-- Coffres gérés par les patrons (/division → Coffres) : nombre de coffres de l'entreprise,
-- emplacements et poids (kg) max de chaque coffre. Valeurs par défaut, réglables par
-- entreprise dans /divgestion (fiche du job). Un coffre créé par le staff peut être confié
-- à une entreprise (« Géré par ») : il compte alors dans sa limite.
Config.BossChests = { max = 3, slots = 50, weight = 200 }
-- Distance max (m) entre le patron et l'emplacement d'un coffre qu'il pose ou déplace.
Config.BossChestReach = 10.0
-- Codes des coffres / shops (chiffres uniquement).
Config.Code = { min = 4, max = 8 }
-- Anti-bruteforce : après MaxAttempts codes faux, le joueur est bloqué LockSeconds
-- secondes sur ce point (compté par personnage, survit à une reconnexion).
Config.MaxAttempts = 3
Config.LockSeconds = 120
-- Un shop protégé par un code reste déverrouillé ce temps-là pour le joueur.
Config.ShopUnlockSeconds = 600
-- Touche d'interaction (38 = E).
Config.InteractKey = 38
-- Valeurs par défaut et bornes acceptées par le serveur.
Config.ChestDefaults = { slots = 50, weight = 200, radius = 1.5 }
Config.ShopDefaults = { radius = 1.5 }
Config.GarageDefaults = { radius = 1.5, storeRadius = 5.0 }
-- Garages : véhicules sortis en même temps par joueur (tous garages confondus).
Config.GarageMaxOut = 0 -- 0 = pas de limite
-- Gros véhicules (camions, bus, échelles…) : en taille « auto », un modèle plus long ou plus
-- haut que ces valeurs (mètres) ne sort que sur les places marquées « gros véhicule » du
-- garage (s'il en a), avec un dégagement plus large pour vérifier que la place est libre.
Config.GarageLarge = { length = 8.0, height = 3.4, clearNormal = 3.0, clearLarge = 7.0 }
-- Numéro de toit (secteur + matricule) demandé à la sortie des véhicules qui en ont un.
-- Un chiffre par position ; chaque disposition liste les types de mods des positions,
-- de gauche à droite. Le chiffre affiché par chaque variante est lu dans son libellé
-- (« ONX_C4 », « NKSC_CSIGN_L4 »…), certains packs ayant des doublons ou des lettres.
Config.Callsign = {
layouts = {
{ 5, 42, 43, 44, 45 }, -- onx : positions A → E
{ 8, 10, 9 }, -- nk : gauche, centre, droite
},
maxSlots = 5,
sectorDigits = 2, -- chiffres max du secteur
matriculeDigits = 4, -- chiffres max du matricule
}
-- Images des véhicules : modèle d'URL (%s = nom de spawn en minuscules), par exemple
-- 'https://mon-cdn.exemple/vehicles/%s.webp' ou 'nui://ma_ressource/images/%s.png'.
-- Vide = aucune image par défaut : l'interface affiche une icône de voiture.
-- Une photo prise depuis le menu staff (bouton appareil photo, Vision) reste prioritaire.
Config.VehicleImageFallback = ''
Config.Limits = {
slots = { 1, 500 },
weight = { 1, 10000 }, -- kg
radius = { 0.8, 5.0 },
price = { 0, 1000000 },
quantity = { 1, 100 }, -- quantité donnée par achat
perBuy = { 1, 50 }, -- nombre d'achats d'un coup
}
-- Moyens de paiement proposés dans les shops payants.
Config.Payment = {
cash = true,
bank = true,
}
-- Images des objets : modèle d'URL (%s = nom de l'objet), par exemple
-- 'nui://ox_inventory/web/images/%s.png'. Vide = détecté selon votre inventaire
-- (ox_inventory, qb-inventory, qs-inventory) ; sans image, l'interface affiche une icône de boîte.
Config.ItemImageBase = ''
-- Tenues vendues dans les shops : l'achat donne l'objet `Item` avec la tenue en métadonnées
-- (sexe, vêtements, nom). Enabled = 'auto' : actif sur Vision (objet « outfit » du core) ;
-- ailleurs, mettre true seulement si votre inventaire / habillage sait utiliser cet objet.
-- Outfits sold in shops: gives item `Item` with the outfit stored in its metadata.
Config.Outfits = { Enabled = 'auto', Item = 'outfit' }
-- Bouton panic (/panic) : alerte les collègues du même service.
-- Vision : même alerte que le PANIC BUTTON du core (tous les jobs du même type).
-- Autres frameworks : notification + point GPS temporaire chez les joueurs des jobs listés ici.
-- Other frameworks: notification + temporary GPS blip for players with one of these jobs.
Config.Panic = {
Enabled = true,
Jobs = { 'police', 'sheriff', 'ambulance' }, -- jobs concernés (hors Vision)
RequireDuty = true, -- il faut être en service pour déclencher
CooldownSeconds = 15,
BlipSeconds = 60, -- durée du point GPS chez les collègues
}
-- Icônes du prompt d'interaction du core Vision (ignoré ailleurs : le script affiche une invite tc-ui).
Config.InteractIcons = { chest = 'Stockage', shop = 'Catalogue', garage = 'Garage' }
Config.Blips = {
chest = { sprite = 587, color = 5, scale = 0.7 },
shop = { sprite = 52, color = 3, scale = 0.7 },
garage = { sprite = 357, color = 3, scale = 0.7 },
}
-- Objets proposés dans le builder (un modèle libre peut aussi être saisi).
Config.Props = {
{ model = '', label = 'Aucun (point invisible)' },
{ model = 'prop_ld_int_safe_01', label = 'Coffre-fort' },
{ model = 'p_v_43_safe_s', label = 'Petit coffre-fort' },
{ model = 'prop_mil_crate_01', label = 'Caisse militaire' },
{ model = 'prop_box_wood05a', label = 'Caisse en bois' },
{ model = 'prop_toolchest_05', label = 'Servante à outils' },
{ model = 'v_ind_cf_shelf2', label = 'Étagère' },
{ model = 'prop_cs_cardbox_01', label = 'Carton' },
}
-- PNJ proposés pour les shops (un modèle libre peut aussi être saisi).
Config.Peds = {
{ model = '', label = 'Aucun' },
{ model = 's_m_y_cop_01', label = 'Policier' },
{ model = 's_f_y_cop_01', label = 'Policière' },
{ model = 's_m_m_paramedic_01', label = 'Ambulancier' },
{ model = 's_m_y_armymech_01', label = 'Logisticien' },
{ model = 's_m_m_autoshop_01', label = 'Magasinier' },
{ model = 'a_f_y_business_01', label = 'Employée' },
{ model = 'a_m_y_business_02', label = 'Employé' },
}