TC ScriptDocumentation

Configuration

Toutes les options de shared/config.lua : bridge, police, preuves, douilles, empreintes, prélèvements, labo, photo, enquêtes.

Le fichier est shared/config.lua (en clair, modifiable). Les réglages de terrain (laboratoires) se font en jeu avec /forensicgestion.

#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',    -- 'auto' | 'ox_target' | 'qb-target' | 'none'
    Society   = 'auto',    -- non utilisé par ce script
    Callbacks = 'auto',    -- 'auto' (ox_lib > callbacks du framework > callbacks internes) | 'native'
    Debug     = false,
    Admins    = {},        -- identifiants staff, ex. 'license:xxxx', 'discord:xxxx'
    AdminAce  = 'command', -- permission ACE du staff
    Standalone = {},       -- crochets standalone
}

#Mode standalone

FonctionRetour
getJob(src){ name, label, grade, gradeName, onDuty }
getCharacter(identifier)profil du personnage
itemCount(src, name)quantité
addItem(src, name, count, metadata)ajout
removeItem(src, name, count, metadata)retrait

#Intégrations

Chaque intégration n'est utilisée que si la ressource est démarrée et activée ici.

Lua
Config.Integrations = {
    logs       = true,   -- tc-logs : copie des actions sur Discord
    screenshot = true,   -- screenshot-basic : requis par l'appareil photo
    doorlock   = true,   -- ox_doorlock : empreintes sur les portes
    emotes     = true,   -- tablette en main pendant /enquete (rpemotes ou compatible)
}
Config.Logs = { webhook = 'forensic.default' }   -- clé du salon tc-logs ; le webhook se règle dans tc-logs
Config.TabletAnim = { command = 'e tablet2', cancel = { resource = 'rpemotes', export = 'EmoteCancel' } }

#Staff et jobs police

Lua
Config.AdminDiscords = {}                                    -- IDs Discord toujours staff (ne mets jamais d'ID réel dans une config distribuée)
Config.StaffPermissions = { 'gestion_features', 'staff_menu' }   -- Vision uniquement

Config.Police = { jobs = { 'police', 'sheriff' } }

Sur Vision, les jobs police viennent du core (type police). Ailleurs, ce sont ceux de Config.Police.jobs. Seuls ces jobs, en service, accèdent aux enquêtes, au labo et aux scellés.

#Preuves

Lua
Config.Evidence = {
    backend  = 'auto',          -- 'auto' | 'core' (Vision) | 'internal' (tables tc_forensic_*)
    hashSalt = 'change-me',     -- ⚠ à changer : sel des codes ADN / empreintes (mode internal)
    expireHours = { casing = 168, fingerprint = 72, blood = 72, gunpowder = 24, gsr = 6, fragment = 72, bullet_impact = 72 },
    gsrOnShot = true,           -- mode internal : un résidu de tir est enregistré à chaque tir
}

expireHours : durée de vie d'une trace restée au sol, en heures (mode internal). 0 = illimité.

#Items

Noms des items dans ton inventaire :

Lua
Config.Items = {
    casing = 'douille', camera = 'camera', photo = 'photo', folder = 'dossier_photo',
    dnaSample = 'prelevement_adn', printCard = 'fiche_empreintes', gsrTest = 'test_gsr',
    kit = 'forensic_kit', gloves = 'gloves', bag = 'evidence_bag',
    uvLamp = 'lampe_uv', casingBag = 'sachet_douilles',
}

Config.NewItems (Vision uniquement) liste les items créés automatiquement au démarrage s'ils n'existent pas. Ailleurs, voir Items.

#Douilles

OptionDéfautRôle
modelsw_pi_flaregun_shell, w_am_casePremier modèle présent dans le jeu
viewDistance35.0Distance d'apparition du prop
pickupRange1.6Distance pour ramasser
needFlashlighttrueLampe allumée obligatoire pour voir l'invite
civilianFlashlightfalsetrue : la lampe torche classique marche aussi pour les civils
pickupTime1800Durée du ramassage (ms)
everyBullettrueUne douille par balle, quel que soit le tireur
npcShots / npcRangetrue / 150.0Les PNJ armés laissent aussi leurs douilles
maxPerSecond40Plafond anti-abus par joueur
maxProps200Props affichés en même temps (les plus proches)
disableStateBags{ 'inPaintball' }State bags du joueur qui coupent les douilles (ex. mini-jeu de paintball)
Vision

Coupe « Spawn douille au tir » dans le menu config preuves du core, sinon il ajoute sa propre douille en double.

#Empreintes

Lua
Config.Prints = { vehicles = true, doors = true, cooldown = 300, vehicleScanRange = 3.0 }

cooldown : secondes entre deux empreintes du même joueur au même endroit.

#Prélèvements

Lua
Config.Sampling = {
    range = 2.5, duration = 6000,   -- portée (m) et durée (ms)
    consentTimeout = 20,            -- secondes pour accepter
    forceIfRestrained = true,       -- sans accord si la cible est menottée, à terre ou morte
    gsrWindow = 45,                 -- minutes : un tir dans ce délai rend le test positif
}

#Laboratoire

Lua
Config.Lab = {
    pointRange = 6.0,
    atLab = { ballistics = true, dna = false, prints = false, paint = false, gsr = false },   -- analyses lançables seulement à un point labo
    durations = { dna = 240, prints = 180, ballistics = 180, paint = 120, gsr = 90 },         -- secondes
}

Les points « Laboratoire » se placent en jeu (/forensicgestion). Une trace ADN / empreinte analysée donne toujours l'identité, sans prélèvement préalable.

#Appareil photo, enquêtes, lampe UV, sachet

Lua
Config.Camera   = { traceRange = 120.0, quality = 0.72, width = 1280, maxPhotosPerFolder = 40 }
Config.Cases    = { manageGrade = 3, categories = { 'Homicide', 'Vol', 'Autre' --[[ … ]] }, roles = { 'Suspect', 'Témoin' --[[ … ]] } }
Config.UvLamp   = { prop = 'prop_cs_police_torch_02', color = { 140, 40, 255 }, range = 18.0 }
Config.CasingBag = { slots = 30, maxWeight = 3.0 }
  • Config.Cases.manageGrade : grade minimum pour supprimer une enquête qui n'est pas la sienne ; categories et roles sont les listes proposées dans l'interface.
  • Config.CasingBag : chaque sachet a son propre coffre (30 places, 3 kg).

#Fichier complet

Afficher config.lua (243 lignes)
shared/config.luaTélécharger
Config = {}

---------------------------------------------------------------------------
-- Compatibilité / Compatibility  (voir bridge/*.lua)
-- FR : tc-forensic fonctionne avec Vision (core), ESX, QBCore, Qbox ou en standalone.
--      Tout est détecté automatiquement ('auto'). Ne force une valeur que si la détection se trompe.
-- EN : tc-forensic runs on Vision (core), ESX, QBCore, Qbox or standalone.
--      Everything is auto-detected ('auto'). Only force a value if detection is wrong.
---------------------------------------------------------------------------
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'
    Society   = 'auto',    -- non utilisé par ce script / not used by this script
    Callbacks = 'auto',    -- 'auto' (ox_lib > callbacks du framework > callbacks internes) | 'native'
    Debug     = false,     -- logs de diagnostic / diagnostic logs
    -- FR : identifiants (ex. 'license:xxxx', 'discord:xxxx') considérés comme staff / admin du script.
    -- EN : identifiers (e.g. 'license:xxxx') treated as script staff / admins.
    Admins    = {},
    AdminAce  = 'command', -- permission ACE pour le staff (add_ace group.admin command allow)
    -- FR : crochets pour le mode standalone (sans framework), à remplir si besoin :
    --      getJob(src) -> { name, label, grade, gradeName, onDuty }, getCharacter(identifier), itemCount(src, name),
    --      addItem(src, name, count, metadata), removeItem(src, name, count, metadata)
    -- EN : hooks for standalone mode (no framework), fill in if needed.
    Standalone = {},
}

---------------------------------------------------------------------------
-- Intégrations optionnelles / Optional integrations
-- FR : chaque intégration n'est utilisée que si la ressource est démarrée ET si elle est activée ici.
-- EN : each integration is only used when the resource is started AND enabled here.
---------------------------------------------------------------------------
Config.Integrations = {
    logs       = true,   -- tc-logs : copie des actions sur Discord / copies actions to Discord
    screenshot = true,   -- screenshot-basic : requis pour l'appareil photo / required by the camera
    doorlock   = true,   -- ox_doorlock : empreintes sur les portes / fingerprints on doors
    emotes     = true,   -- tablette en main pendant /enquete (rpemotes ou compatible)
}

-- tc-logs : clé du salon (webhook) utilisée pour les logs. Le webhook Discord lui-même se règle dans tc-logs.
-- tc-logs: channel key used for logs. The Discord webhook itself is configured in tc-logs.
Config.Logs = {
    webhook = 'forensic.default',
}

-- Emote jouée avec /enquete (tablette en main) et export pour l'annuler.
-- Emote played with /enquete (tablet in hands) and the export to cancel it.
Config.TabletAnim = {
    command = 'e tablet2',
    cancel  = { resource = 'rpemotes', export = 'EmoteCancel' },
}

-- FR : staff (accès /forensicgestion). Identifiants Discord toujours considérés staff, et permissions
--      globales du core Vision. Sur ESX / QBCore / Qbox : ACE joaat('command'), groupes admin ou Config.Bridge.Admins.
-- EN : staff (access to /forensicgestion). Discord IDs always treated as staff, and Vision core global
--      permissions. On ESX / QBCore / Qbox: ACE joaat('command'), admin groups or Config.Bridge.Admins.
-- ⚠ Ne mets aucun identifiant réel dans une config distribuée / never ship real IDs.
Config.AdminDiscords = {}
Config.StaffPermissions = { 'gestion_features', 'staff_menu' }   -- Vision uniquement / Vision only

---------------------------------------------------------------------------
-- Police / Police jobs
-- FR : sur Vision, les jobs police viennent du core (type police). Ailleurs (ESX, QBCore, Qbox, standalone)
--      ce sont les jobs listés ici. Seuls ces jobs, EN SERVICE, accèdent aux enquêtes, au labo et aux scellés.
-- EN : on Vision, police jobs come from the core. Elsewhere they are the jobs listed here.
---------------------------------------------------------------------------
Config.Police = {
    jobs = { 'police', 'sheriff' },
}

---------------------------------------------------------------------------
-- Preuves / Evidence
-- FR : sur Vision, les preuves (douilles, empreintes, sang…) sont gérées par le core.
--      Sans ce système, tc-forensic utilise ses propres tables (tc_forensic_evidence, tc_forensic_custody).
-- EN : on Vision, evidence is handled by the core. Without it, tc-forensic uses its own SQL tables.
---------------------------------------------------------------------------
Config.Evidence = {
    backend  = 'auto',                -- 'auto' | 'core' (Vision) | 'internal' (tables tc_forensic_*)
    hashSalt = 'change-me',           -- ⚠ change cette valeur : sel des codes ADN / empreintes (mode internal)
    -- Durée de vie d'une trace restée au sol, en heures (mode internal). 0 = illimité.
    expireHours = { casing = 168, fingerprint = 72, blood = 72, gunpowder = 24, gsr = 6, fragment = 72, bullet_impact = 72 },
    -- Mode internal : un résidu de tir (gsr) est enregistré à chaque tir d'un joueur (test GSR).
    gsrOnShot = true,
}

-- Coffres des preuves (mode internal uniquement : sur Vision ils se placent dans /gestion du core).
-- Chaque entrée : { job = 'police', label = 'Coffre des preuves', coords = vec3(x, y, z), slots = 100, weight = 500 (kg) }
-- Internal mode only (on Vision they are placed in the core's /gestion).
Config.EvidenceLockers = {}

---------------------------------------------------------------------------
-- Objets / Items (noms des items dans ton inventaire). Voir install/ pour les créer.
-- FR : joaat('camera'), joaat('forensic_kit'), joaat('gloves'), joaat('evidence_bag') sont des items « externes » à créer aussi (install/).
-- EN : see install/ to create them (ox_inventory, QBCore, ESX).
---------------------------------------------------------------------------
Config.Items = {
    casing     = 'douille',          -- douille ramassée au sol
    camera     = 'camera',           -- appareil photo
    photo      = 'photo',            -- photo développée
    folder     = 'dossier_photo',    -- dossier qui contient des photos
    dnaSample  = 'prelevement_adn',  -- prélèvement ADN scellé (sur personne)
    printCard  = 'fiche_empreintes', -- fiche d'empreintes (sur personne)
    gsrTest    = 'test_gsr',         -- test de résidus de tir (consommé)
    kit        = 'forensic_kit',     -- kit de prélèvement (requis pour ADN / empreintes)
    gloves     = 'gloves',           -- gants : pas d'empreintes
    bag        = 'evidence_bag',     -- sachet de preuve scellé (lu par le labo)
    uvLamp     = 'lampe_uv',         -- lampe UV (illégal) : fait ressortir les douilles
    casingBag  = 'sachet_douilles',  -- sachet de douilles : mini-inventaire de 30 places
}

-- Items créés au démarrage s'ils n'existent pas (poids en kg) : Vision uniquement (table joaat('items') du core).
-- Ailleurs, ajoute-les avec les fichiers de install/. / Auto-created on Vision only; elsewhere use install/.
Config.NewItems = {
    { name = 'photo',            label = 'Photo',                     weight = 0.01, type = 'objects' },
    { name = 'dossier_photo',    label = 'Dossier photos',            weight = 0.2,  type = 'objects' },
    { name = 'prelevement_adn',  label = 'Prélèvement ADN',           weight = 0.05, type = 'objects' },
    { name = 'fiche_empreintes', label = "Fiche d'empreintes",        weight = 0.05, type = 'objects' },
    { name = 'test_gsr',         label = 'Test de résidus de tir',    weight = 0.1,  type = 'consumable' },
    { name = 'lampe_uv',         label = 'Lampe UV',                  weight = 0.3,  type = 'objects' },
    { name = 'sachet_douilles',  label = 'Sachet de douilles',        weight = 0.05, type = 'objects' },
}

-- Vision uniquement : corrige la description (fausse) du kit de nettoyage du core.
Config.FixCleaningKitDescription = true

---------------------------------------------------------------------------
-- Douilles physiques au sol (visibles par tout le monde)
---------------------------------------------------------------------------
Config.Casings = {
    -- Premier modèle présent dans le jeu (petite douille de laiton).
    models        = { 'w_pi_flaregun_shell', 'w_am_case' },
    viewDistance  = 35.0,   -- distance d'apparition du prop
    pickupRange   = 1.6,    -- distance pour ramasser
    needFlashlight = true,  -- lampe allumée obligatoire pour voir le prompt
    -- Police en service : sa lampe torche. Les autres : la lampe UV (item).
    -- true = la lampe torche classique marche aussi pour les civils.
    civilianFlashlight = false,
    pickupTime    = 1800,   -- ms
    -- Une douille par balle tirée, quel que soit le tireur (joueur, police en
    -- service, PNJ) et l'endroit. Vision : couper « Spawn douille au tir » dans le menu
    -- config preuves du core, sinon il ajoute sa propre douille en double.
    everyBullet   = true,
    npcShots      = true,   -- les PNJ armés laissent aussi leurs douilles
    npcRange      = 150.0,  -- m autour du joueur pour suivre les PNJ qu'il contrôle
    maxPerSecond  = 40,     -- plafond anti-abus par joueur (au-delà : balles ignorées)
    maxProps      = 200,    -- props affichés en même temps (les plus proches)
    -- State bags du joueur local qui coupent les douilles (ex. mini-jeu de paintball : tc-paintball).
    -- Player state bags that disable casings (e.g. a paintball mini-game).
    disableStateBags = { 'inPaintball' },
}

---------------------------------------------------------------------------
-- Empreintes digitales
---------------------------------------------------------------------------
Config.Prints = {
    vehicles   = true,   -- monter dans un véhicule laisse une empreinte (portière)
    doors      = true,   -- ouvrir/fermer une porte ox_doorlock
    cooldown   = 300,    -- s entre deux empreintes du même joueur au même endroit
    vehicleScanRange = 3.0, -- relevé des empreintes d'un véhicule (menu Alt)
}

---------------------------------------------------------------------------
-- Prélèvements sur une personne (menu Alt sur un joueur)
---------------------------------------------------------------------------
Config.Sampling = {
    range          = 2.5,
    duration       = 6000,   -- ms
    consentTimeout = 20,     -- s pour accepter
    -- Sans accord si la cible est menottée, à terre ou morte.
    forceIfRestrained = true,
    gsrWindow      = 45,     -- min : un tir dans ce délai rend le test positif
}

---------------------------------------------------------------------------
-- Laboratoire (analyses longues, résultats dans l'interface Enquêtes)
---------------------------------------------------------------------------
Config.Lab = {
    -- Points « Laboratoire » : placés en jeu par le staff avec /forensicgestion
    -- (Vision : aussi /gestion → Police scientifique) → page Laboratoires
    -- (table tc_forensic_settings, clé 'labs').
    pointRange    = 6.0,
    -- Analyses lançables seulement à un point Laboratoire (refusées partout
    -- tant qu'aucun point n'est placé).
    atLab = {
        ballistics = true,  -- douilles, poudre, impacts
        dna        = false,
        prints     = false,
        paint      = false,
        gsr        = false,
    },
    -- Une trace ADN / empreinte analysée donne toujours l'identité (nom, prénom),
    -- sans prélèvement préalable sur la personne.
    durations = {           -- secondes
        dna        = 240,
        prints     = 180,
        ballistics = 180,
        paint      = 120,
        gsr        = 90,
    },
}

---------------------------------------------------------------------------
-- Appareil photo
---------------------------------------------------------------------------
Config.Camera = {
    traceRange   = 120.0,  -- trajectoires visibles (police en service)
    quality      = 0.72,   -- jpg après redimensionnement
    width        = 1280,   -- largeur max de la photo stockée
    maxPhotosPerFolder = 40,
}

---------------------------------------------------------------------------
-- Enquêtes
---------------------------------------------------------------------------
Config.Cases = {
    manageGrade = 3,        -- grade mini pour supprimer une enquête qui n'est pas la sienne
    categories = {
        'Homicide', 'Tentative de meurtre', 'Fusillade', 'Braquage', 'Vol', 'Cambriolage',
        'Trafic de stupéfiants', 'Trafic d’armes', 'Délit de fuite', 'Agression', 'Enlèvement',
        'Disparition', 'Fraude', 'Corruption', 'Autre',
    },
    roles = { 'Suspect', 'Témoin', 'Victime', 'Personne d’intérêt', 'Plaignant', 'Interpellé' },
}

---------------------------------------------------------------------------
-- Lampe UV (item illégal) : utilisée, elle sort une lampe en main qui fait
-- ressortir les douilles au sol. Réutiliser l'item pour la ranger.
---------------------------------------------------------------------------
Config.UvLamp = {
    prop  = 'prop_cs_police_torch_02',
    color = { 140, 40, 255 },  -- violet UV
    range = 18.0,              -- portée du faisceau
}

---------------------------------------------------------------------------
-- Sachet de douilles : chaque sachet a son propre coffre (inventaire du framework),
-- ouvert à côté de l'inventaire quand on utilise l'item.
---------------------------------------------------------------------------
Config.CasingBag = {
    slots     = 30,
    maxWeight = 3.0,   -- kg : 30 douilles (0,1 kg) — les objets lourds n'y rentrent pas
}
Dernière mise à jour : 7 novembre 2026© 2026 TC Script