TC ScriptDocumentation

Configuration

Toutes les options de config.lua : accès, lobby, difficultés, arènes, vocal, touches, gestes.

#Bridge

Lua
Config.Bridge = {
    Framework = 'auto',     -- 'auto' | 'vision' | 'qbox' | 'qbcore' | 'esx' | 'standalone'
    Inventory = 'auto',     -- non utilisés par ce script (présents pour le bridge commun)
    Target    = 'auto',
    Society   = 'auto',
    Callbacks = 'auto',
    Debug     = false,      -- logs de détection dans la console serveur
    Admins    = {},         -- identifiants staff hors Vision, ex. { 'license:xxxxxxxx', 'discord:123456' }
    AdminAce  = 'command',  -- ACE donnant accès aux commandes staff hors Vision
    Standalone = {},
}

#Intégrations optionnelles

Aucune n'est obligatoire : si la ressource n'est pas démarrée, elle est ignorée.

Lua
Config.Integrations = {
    logs     = true,   -- tc-logs : journal Discord (début / fin de partie, arrêt par un staff)
    lbphone  = true,   -- lb-phone : téléphone coupé pendant la partie (si Config.BlockComms)
    pmavoice = true,   -- pma-voice : radio / appels coupés pendant la partie (si Config.BlockComms)
}

#Accès (PNJ)

Lua
Config.InteractId = 'auto:banana_defuse'   -- Vision : identifiant du point (préfixe « auto: » obligatoire) ; ignoré ailleurs
Config.Npc = {
    model  = 'a_m_y_hipster_01',
    coords = vector4(209.0, -925.5, 30.69, 160.0),   -- hauteur de torse (le ped est posé 0.98 plus bas)
}
Config.Blip = { sprite = 486, color = 5, scale = 0.7, label = 'Bombe Banana' }   -- sprite = nil : pas de blip
Config.InteractIcon       = 'Jobcenter'
Config.NpcDistance        = 2.0      -- distance pour parler au PNJ
Config.LobbyLeaveDistance = 60.0     -- au-delà du PNJ, un joueur du lobby en est retiré

#Staff

Lua
Config.Permissions = { 'staff_menu', 'gestion', 'dev' }   -- Vision uniquement : il suffit d'en avoir UNE

Donne /banana stop, /banana arene et le lancement même si on n'est pas chef du lobby. Sur ESX / QBCore / Qbox / standalone, le staff est l'admin du bridge (ACE Config.Bridge.AdminAce, groupe admin, Config.Bridge.Admins).

#Lobby

OptionDéfautRôle
Config.Command'banana'Commande : /banana quitter | statut | stop | arene
Config.AdminOnlyStartfalsetrue : seul le staff peut lancer depuis le menu
Config.AutoStarttrueLance automatiquement à 3 joueurs
Config.AutoStartDelay15Secondes avant le lancement auto
Config.DefaultDifficulty'normal'Difficulté par défaut ; le chef du lobby peut la changer

#Difficultés

Lua
Config.Difficulties = {
    facile    = { label = 'Facile',    modules = 3, time = 360, strikes = 3 },
    normal    = { label = 'Normal',    modules = 4, time = 360, strikes = 3 },
    difficile = { label = 'Difficile', modules = 5, time = 300, strikes = 2 },
    expert    = { label = 'Expert',    modules = 7, time = 420, strikes = 2 },
}

modules : nombre de modules · time : durée en secondes · strikes : erreurs tolérées.

#Partie

OptionDéfautRôle
Config.BlockCommstrueCoupe téléphone, radio et appels pendant la partie
Config.EndDelay8Secondes d'écran de fin avant le retour des joueurs
Config.BucketBase7300Routing bucket = BucketBase + index de l'arène
Config.InteractDistance2.0Distance pour interagir avec la bombe (client)
Config.MaxActionDistance4.0Vérification serveur (OneSync)
Config.ServerDistanceChecktrueActive la vérification de distance côté serveur
Config.LeashDistance25.0Un joueur qui s'éloigne plus que ça est replacé
Config.BoomScreenEffect'ExplosionJosh3'Effet d'écran de la détonation

#Arènes

Lua
Config.Arenas = {
    { label = 'Legion Square', bomb = vector3(195.0, -933.0, 30.7), heading = 0.0 },
}
Coordonnées d'exemple

Les coordonnées fournies (Legion Square) sont un exemple : vérifie-les sur ta map. Le Z est recalé au sol côté client. Une arène = une partie simultanée possible.

Config.BombModels (prop_ld_bomb, prop_ld_suitcase_01) : modèle de la bombe, le premier existant est utilisé. Config.Table : tables, chaises, rayon, hauteur d'assise, chairHeadingOffset (à ajuster à 0.0 ou 180.0 si les chaises tournent le dos à la table).

#Vocal

Lua
Config.Voice = { enabled = true }

Utilise MumbleSetVolumeOverrideByServerId : le sourd met à 0 le volume des deux autres, tous mettent à 0 celui du muet. Réappliqué toutes les 500 ms, remis à normal en fin de partie. pma-voice ne réécrit ces valeurs que pour la radio et les appels, bloqués pendant la partie.

#Touches

Chaque joueur peut les changer dans Paramètres → Raccourcis → FiveM.

Lua
Config.Keys = {
    interact = 'E',   -- aveugle : manipuler · sourd : regarder · muet : ouvrir le manuel
    gesture  = 'G',   -- menu des gestes
    slap     = 'H',   -- gifler le coéquipier le plus proche
}

#Gestes

Config.Gestures liste les 24 gestes du muet (chiffres, actions, réponses, couleurs). Chaque geste : id, cat (rubrique), text (bulle) ou color + name, et anim (animation haut du corps jouée assis, issue de la liste vérifiée de rpemotes). Config.GestureDuration (4000 ms) règle la durée de la bulle et Config.SlapAnim l'animation de la gifle.

La liste est volontairement courte pour garder le jeu difficile : pas d'alphabet ni de questions.

#Fichier complet

Afficher config.lua (184 lignes)
config.luaTélécharger
Config = {}

-- ================================================================ Bridge / Compatibilité
-- Couche de compatibilité framework (bridge/*.lua). 'auto' détecte tout seul.
-- Compatibility layer. 'auto' detects everything by itself.
--   Framework : 'auto' | 'vision' | 'qbox' | 'qbcore' | 'esx' | 'standalone'  (auto : vision > qbox > qbcore > esx > standalone)
--   Inventory / Target / Society / Callbacks : 'auto' (non utilisés par ce script, présents pour le bridge commun)
--   Debug     : true = logs de détection dans la console serveur
--   Admins    : identifiants autorisés comme staff hors Vision, ex. { 'license:xxxxxxxx', 'discord:123456' }
--   AdminAce  : permission ACE donnant accès aux commandes staff hors Vision (add_ace group.admin command allow)
--   Standalone: réservé (surcharges éventuelles en mode standalone)
Config.Bridge = {
    Framework = 'auto',
    Inventory = 'auto',
    Target    = 'auto',
    Society   = 'auto',
    Callbacks = 'auto',
    Debug     = false,
    Admins    = {},
    AdminAce  = 'command',
    Standalone = {},
}

-- ================================================================ Intégrations optionnelles / Optional integrations
-- Aucune n'est obligatoire : si la ressource n'est pas démarrée, elle est simplement ignorée.
Config.Integrations = {
    logs     = true,   -- tc-logs : journal Discord (début / fin de partie, arrêt par un staff)
    lbphone  = true,   -- lb-phone : téléphone coupé pendant la partie (si Config.BlockComms)
    pmavoice = true,   -- pma-voice : radio / appels coupés pendant la partie (si Config.BlockComms)
}

-- ---------------------------------------------------------------- Accès (PNJ)
-- Le lobby s'ouvre en parlant au PNJ (touche E).
-- Sur Vision, le PNJ est géré par la gestion staff du serveur (menu gestion > interactions
-- « Bombe Banana ») : déplacement, modèle du ped, suppression. Les coords ci-dessous ne servent
-- alors qu'au premier démarrage. Sur les autres frameworks, le PNJ est créé directement
-- à ces coordonnées (ped local, blip, touche E).
-- Config.InteractId : identifiant du point côté Vision (préfixe « auto: » obligatoire) ; ignoré ailleurs.
Config.InteractId = 'auto:banana_defuse'
Config.Npc = {
    model  = 'a_m_y_hipster_01',
    coords = vector4(209.0, -925.5, 30.69, 160.0), -- hauteur de torse (le ped est posé 0.98 plus bas)
}
Config.Blip = { sprite = 486, color = 5, scale = 0.7, label = 'Bombe Banana' } -- sprite = nil : pas de blip
Config.InteractIcon     = 'Jobcenter'
Config.NpcDistance      = 2.0    -- distance pour parler au PNJ
Config.LobbyLeaveDistance = 60.0 -- au-delà du PNJ, un joueur du lobby (partie pas lancée) en est retiré

-- ---------------------------------------------------------------- Staff
-- Permissions staff VISION uniquement (PlayerGlobal.permissions) : il suffit d'en avoir UNE.
-- Sur ESX / QBCore / Qbox / standalone, le staff = admin du bridge (ACE Config.Bridge.AdminAce, groupe admin, Config.Bridge.Admins).
-- Donne /banana stop | arene et le lancement même si on n'est pas chef du lobby.
Config.Permissions = { 'staff_menu', 'gestion', 'dev' }

-- ---------------------------------------------------------------- Lobby
Config.Command          = 'banana'           -- /banana quitter | statut | stop | pnj | arene
Config.AdminOnlyStart   = false              -- true = seul le staff peut lancer depuis le menu
Config.AutoStart        = true               -- lance automatiquement quand 3 joueurs sont dans le lobby
Config.AutoStartDelay   = 15                 -- secondes avant le lancement auto
Config.DefaultDifficulty = 'normal'          -- le chef du lobby (1er inscrit) peut la changer dans le menu

Config.Difficulties = {
    facile    = { label = 'Facile',    modules = 3, time = 360, strikes = 3 },
    normal    = { label = 'Normal',    modules = 4, time = 360, strikes = 3 },
    difficile = { label = 'Difficile', modules = 5, time = 300, strikes = 2 },
    expert    = { label = 'Expert',    modules = 7, time = 420, strikes = 2 },
}

-- ---------------------------------------------------------------- Radio / téléphone
-- Pendant une partie : téléphone (lb-phone) désactivé, radio pma-voice coupée,
-- appels raccrochés (chaque intégration est optionnelle, voir Config.Integrations).
-- Tout est rétabli à la fin (la radio est à rallumer).
Config.BlockComms = true

-- ---------------------------------------------------------------- Partie
-- Le briefing de chaque rôle reste affiché jusqu'à ce que les 3 joueurs aient cliqué « Compris » :
-- la bombe ne s'arme qu'à ce moment-là (sinon /banana quitter).
Config.EndDelay         = 8      -- secondes d'écran de fin avant le retour des joueurs
Config.BucketBase       = 7300   -- routing bucket = BucketBase + index de l'arène (une partie isolée par arène)

-- Une arène = une partie simultanée possible. Les joueurs sont placés
-- automatiquement autour de la bombe. Le Z est recalé au sol côté client.
-- ⚠ Coordonnées d'exemple (Legion Square) : vérifiez-les sur votre map.
Config.Arenas = {
    { label = 'Legion Square', bomb = vector3(195.0, -933.0, 30.7), heading = 0.0 },
    -- { label = 'Arène 2', bomb = vector3(x, y, z), heading = 0.0 },
}

-- Modèle de la bombe (prop local). Vérifié au chargement avec IsModelInCdimage :
-- si le premier n'existe pas, le suivant est essayé, sinon seul le marqueur est affiché.
Config.BombModels = { 'prop_ld_bomb', 'prop_ld_suitcase_01' }

-- Table et chaises (props locaux, posés à l'identique chez les 3 joueurs).
-- La bombe est posée au centre de la table, les joueurs sont assis autour et se font face.
-- Premier modèle existant utilisé. chairHeadingOffset : à ajuster si les chaises
-- tournent le dos à la table (0.0 ou 180.0 selon le modèle).
Config.Table = {
    models  = { 'prop_table_04', 'prop_table_01', 'prop_table_02' },
    chairs  = { 'prop_table_04_chr', 'prop_table_02_chr', 'prop_chair_01a' },
    radius  = 0.95,               -- distance centre de la table → siège
    seatHeight = 0.5,             -- hauteur d'assise au-dessus du sol
    chairHeadingOffset = 180.0,
    scenario = 'PROP_HUMAN_SEAT_CHAIR_MP_PLAYER',
}

Config.InteractDistance  = 2.0   -- distance pour interagir avec la bombe (client)
Config.MaxActionDistance = 4.0   -- vérification serveur (nécessite OneSync, ignorée sinon)
Config.ServerDistanceCheck = true
Config.LeashDistance     = 25.0  -- un joueur qui s'éloigne plus que ça est replacé

-- Pas de vraie explosion : beaucoup d'anticheats bloquent les explosions créées par un client.
-- La « détonation » est un effet d'écran local + secousse + son.
Config.BoomScreenEffect  = 'ExplosionJosh3'

-- ---------------------------------------------------------------- Vocal
-- Utilise MumbleSetVolumeOverrideByServerId (native client FiveM) :
--  · le sourd met à 0 le volume des deux autres joueurs
--  · tous les joueurs de la partie mettent à 0 le volume du muet
-- Réappliqué toutes les 500 ms, remis à -1.0 (normal) en fin de partie.
-- pma-voice ne réécrit ces valeurs que pour la radio et les appels, bloqués pendant la partie.
Config.Voice = { enabled = true }

-- ---------------------------------------------------------------- Touches (modifiables par chaque joueur dans Paramètres > Raccourcis > FiveM)
Config.Keys = {
    interact = 'E',   -- aveugle : manipuler la bombe · sourd : regarder la bombe · muet : ouvrir le manuel
    gesture  = 'G',   -- menu des gestes
    slap     = 'H',   -- gifler le coéquipier le plus proche
}

-- ---------------------------------------------------------------- Gestes (émotes du muet)
-- Affichés au-dessus de la tête et dans le HUD (visibles par le sourd et le muet, pas par l'aveugle).
-- cat = rubrique du menu ; text = texte de la bulle ; color = carré de couleur.
-- anim = animation haut du corps jouée assis. Toutes viennent de la liste vérifiée de rpemotes.
local G  = 'gestures@m@standing@casual'
local GF = 'gestures@f@standing@casual'
local POINT   = { GF, 'gesture_point' }
local THUMBS  = { 'anim@mp_player_intupperthumbs_up', 'idle_a' }
local NO      = { 'mp_player_int_upper_nod', 'mp_player_int_nod_no' }
local SHRUG   = { GF, 'gesture_shrug_hard' }
local HAND    = { GF, 'gesture_hand_down' }
local PEACE   = { 'mp_player_int_upperpeace_sign', 'mp_player_int_peace_sign' }
local ME      = { G, 'gesture_me_hard' }
local HELLO   = { G, 'gesture_hello' }
local DAMN    = { G, 'gesture_damn' }
local NOWAY   = { G, 'gesture_no_way' }
local HURRY   = { 'misscommon@response', 'bring_it_on' }
local THINK   = { 'misscarsteal4@aliens', 'rehearsal_base_idle_director' }

-- Version courte (24 gestes) : volontairement limitée pour garder le jeu difficile.
-- Pas d'alphabet ni de questions : le muet doit se débrouiller avec OUI / NON / STOP
-- pendant que le sourd lit à voix haute (il l'entend).
Config.Gestures = {
    { id = 'n1', cat = 'Chiffres', text = '1', anim = POINT },
    { id = 'n2', cat = 'Chiffres', text = '2', anim = PEACE },
    { id = 'n3', cat = 'Chiffres', text = '3', anim = POINT },
    { id = 'n4', cat = 'Chiffres', text = '4', anim = POINT },
    { id = 'n5', cat = 'Chiffres', text = '5', anim = POINT },
    { id = 'n6', cat = 'Chiffres', text = '6', anim = POINT },

    { id = 'cut',     cat = 'Actions', text = 'COUPE',     anim = POINT },
    { id = 'press',   cat = 'Actions', text = 'APPUIE',    anim = POINT },
    { id = 'hold',    cat = 'Actions', text = 'MAINTIENS', anim = HAND },
    { id = 'release', cat = 'Actions', text = 'LÂCHE',     anim = HELLO },
    { id = 'up',      cat = 'Actions', text = 'HAUT',      anim = POINT },
    { id = 'down',    cat = 'Actions', text = 'BAS',       anim = HAND },
    { id = 'submit',  cat = 'Actions', text = 'VALIDE',    anim = THUMBS },

    { id = 'ok',   cat = 'Réponses', text = 'OUI',     anim = THUMBS },
    { id = 'no',   cat = 'Réponses', text = 'NON',     anim = NO },
    { id = 'what', cat = 'Réponses', text = '?',       anim = SHRUG },
    { id = 'stop', cat = 'Réponses', text = 'STOP',    anim = NOWAY },
    { id = 'wait', cat = 'Réponses', text = 'ATTENDS', anim = THINK },

    { id = 'c_rouge', cat = 'Couleurs', color = { 217, 59, 59 },   name = 'Rouge', anim = POINT },
    { id = 'c_bleu',  cat = 'Couleurs', color = { 47, 111, 224 },  name = 'Bleu',  anim = POINT },
    { id = 'c_jaune', cat = 'Couleurs', color = { 242, 194, 48 },  name = 'Jaune', anim = POINT },
    { id = 'c_vert',  cat = 'Couleurs', color = { 47, 179, 90 },   name = 'Vert',  anim = POINT },
    { id = 'c_blanc', cat = 'Couleurs', color = { 242, 242, 242 }, name = 'Blanc', anim = POINT },
    { id = 'c_noir',  cat = 'Couleurs', color = { 20, 20, 20 },    name = 'Noir',  anim = POINT },
}
Config.GestureDuration = 4000   -- ms d'affichage de la bulle

Config.SlapAnim = { 'melee@unarmed@streamed_variations', 'plyr_takedown_front_slap' }
Dernière mise à jour : 7 novembre 2026© 2026 TC Script