TC ScriptDocumentation

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:

FunctionReturns
getJob(src){ name, label, grade, gradeName, gradeLabel, onDuty }
listJobs(){ police = { label = 'Police', grades = { { grade = 0, name = 'cadet', label = 'Cadet' } } } }
getMoney, removeMoney, addMoney, itemCount, addItemfor 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, or AdminDiscords.

#Divisions and boss management

OptionDefaultRole
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.MaxDivisionsPerJob20Maximum divisions per job
Config.BossChests{ max = 3, slots = 50, weight = 200 }Boss chests: count, slots, weight (kg). Adjustable per company in /divgestion
Config.BossChestReach10.0Max 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

OptionRole
Config.GarageMaxOutVehicles out at the same time per player, all garages combined (0 = no limit)
Config.GarageLargeLarge vehicles: beyond length / height (m), the model only spawns on spots flagged “large vehicle”
Config.CallsignRoof number: mod layouts, number of slots, sector and badge digits
Config.VehicleImageFallbackVehicle 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é' },
}
Last updated : 7 November 2026© 2026 TC Script