Docs /Blackmarket/Configuration
v1.1.1

Configuration

Toute la configuration se fait dans config.lua. Les options sont organisees du plus modifie au moins modifie. Cette page documente toutes les options disponibles afin que vous n’ayez pas a fouiller le fichier.

Reglages de base

Config.Locale = 'en'                  -- 'fr' | 'en' | 'es' | 'de'
Config.Debug  = true                  -- logs console
OptionTypeDescription
Config.LocalestringCode langue. Doit correspondre a un fichier locales/<code>.lua. Si la langue n’existe pas, fallback automatique vers en avec un avertissement console.
Config.DebugboolActive les logs detailles (utile pour le ciblage / animation / phone).

Framework & inventaire

Config.FrameworkOverride = nil        -- 'esx' | 'qbcore' | 'qbox' | 'standalone' | nil (auto)
Config.InventoryOverride = nil        -- 'ox_inventory' | 'qs-inventory' | 'esx' | 'qb' | nil (auto)
ValeurEffet
nilDetection automatique du framework / inventaire actif.
'esx'Force ESX (es_extended).
'qbcore'Force QBCore (qb-core).
'qbox'Force QBox (qbx_core).
'standalone'Aucun framework. Bridge minimal (notifications via lib.notify).
Config.MenuType     = 'nui'           -- 'rageui' (in-game) | 'nui' (HTML)
Config.TargetSystem = 'auto'          -- 'auto' | 'ox_target' | 'qb-target' | 'qtarget' | 'none'
Config.UseTextUI    = true            -- fallback textUI si TargetSystem='none'
Config.UseOxTarget  = true            -- legacy : false force le fallback textUI

Types de menu (Config.MenuType)

ValeurDescription
'nui'Menu HTML/CSS plein ecran, sidebar gauche + preview 3D de l’arme dans le coffre du van. Camera scriptee, drag souris pour faire tourner l’arme, molette pour zoomer.
'rageui'Menu in-game style GTA V utilisant la librairie integree src/*. Voir la section Apparence du menu RageUI ci-dessous pour les themes.

Systemes de target (Config.TargetSystem)

ValeurDescription
'auto'Detection automatique dans cet ordre : ox_target → qb-target → qtarget → fallback textUI.
'ox_target'BoxZone autour du vendeur (le ped est attache au van, raycast direct sur le ped peut echouer).
'qb-target'AddTargetEntity sur le ped.
'qtarget'AddTargetEntity sur le ped.
'none'Aucun target ; affiche un textUI [E] Parler au vendeur quand le joueur est dans Config.InteractDistance.

Argent & jobs

Config.MoneyAccount  = 'cash'         -- compte d'argent utilise (ESX/QBCore)
Config.MoneyItemName = 'money'        -- nom item pour ox_inventory standalone

Config.PoliceJobs = { 'police', 'lspd', 'sasp', 'bcso' }
OptionDescription
Config.MoneyAccountCompte ESX (money, bank, black_money…) ou QBCore (cash, bank…).
Config.MoneyItemNameNom d’item utilise pour les retraits via ox_inventory en mode standalone.
Config.PoliceJobsListe des job.name consideres comme police (le vendeur fuit s’ils s’approchent, si Config.CopFleeMode = true).

Apparence du menu RageUI

Ces options ne s’appliquent que si Config.MenuType = 'rageui'. Pour le mode NUI, voir la section Apparence du menu NUI plus bas.

Config.RageUI = {
    Theme = 'classic',                -- 'classic' | 'modern'

    AccentColor = { R = 59, G = 130, B = 246, A = 200 },

    AnimationEnabled = true,
    AnimationSpeed   = 7,

    BannerDict    = 'shopui_title_gunvan',
    BannerTexture = 'shopui_title_gunvan',
}

Themes disponibles

ThemeDescription visuelleA utiliser si…
'classic'Style GTA V d’origine : gradient bleu/blanc, sprites animes, fond dynamique, sous-titre noir uppercase.Vous voulez l’apparence GTA standard, coherente avec les menus natifs.
'modern'Style sombre moderne : rectangles plats, barre d’accent coloree sur l’item actif, fond solide, animation de remplissage progressive.Vous voulez un look UI moderne avec votre couleur de marque.

Le theme par defaut est 'classic'. Pour changer, modifiez Config.RageUI.Theme. Le theme est charge au demarrage du resource.

Options communes

OptionS’applique aDescription
AccentColormodernCouleur RGBA de la barre laterale sur l’item selectionne.
AnimationEnabledmodernActive/desactive l’animation de remplissage de l’item actif.
AnimationSpeedmodernVitesse de l’animation (1-15, plus haut = plus rapide).
BannerDict / BannerTextureles deuxBanniere graphique en haut du menu.

Bannieres disponibles

Presets recommandes (toujours disponibles, pas de DLC requis) :

DictTextureApparence
shopui_title_gunclub_shopshopui_title_gunclub_shopBanniere Ammu-Nation classique.
shopui_title_gunmod_shopshopui_title_gunmod_shopBanniere atelier d’armes.
shopui_title_gunrunningshopui_title_gunrunningBanniere DLC Gunrunning (toujours disponible).
shopui_title_gunvanshopui_title_gunvanBanniere Gun Van (Drug Wars DLC, fallback automatique si absent).

Couleurs avancees du theme modern

Les couleurs detaillees (texte, sous-titre, description, slider, navigation, etc.) sont reglables dans src/config.lua :

RageUIConfig.RageUI = {
    AccentWidth          = 3,
    ItemGap              = 2,
    ItemBackgroundColor  = { R = 28, G = 32, B = 40, A = 220 },
    MenuBackgroundColor  = { R = 16, G = 20, B = 26, A = 230 },
    TextActiveColor      = { R = 255, G = 255, B = 255, A = 255 },
    TextInactiveColor    = { R = 215, G = 220, B = 228, A = 240 },
    TextDisabledColor    = { R = 135, G = 140, B = 148, A = 200 },
    SubtitleTextColor    = { R = 255, G = 255, B = 255, A = 255 },
    SubtitleBgColor      = { R = 14, G = 18, B = 24, A = 230 },
    DescriptionTextColor = { R = 225, G = 230, B = 240, A = 240 },
    DescriptionBgColor   = { R = 14, G = 18, B = 24, A = 220 },
    MouseHoverColor      = { R = 255, G = 255, B = 255, A = 15 },
    SliderBgColor        = { R = 20, G = 24, B = 32, A = 140 },
    SliderFillColor      = { R = 28, G = 218, B = 236, A = 180 },
    SliderDividerColor   = { R = 80, G = 84, B = 92, A = 140 },
    NavigationBgColor    = { R = 20, G = 24, B = 28, A = 180 },
    NavigationHoverColor = { R = 40, G = 44, B = 52, A = 140 },
}

Apparence du menu NUI

S’applique si Config.MenuType = 'nui'. Le menu utilise des variables CSS modifiables a chaud.

Config.Theme = {
    ['--bg-base']      = '#0b0f1a',   -- fond principal
    ['--bg-panel']     = '#0e1322',   -- fond panneau sidebar
    ['--bg-card']      = '#121829',   -- fond carte item
    ['--bg-hover']     = '#161d32',   -- fond item survole
    ['--accent']       = '#3b82f6',   -- couleur d'accent (bouton acheter)
    ['--accent-light'] = '#60a5fa',   -- accent clair (hover)
    ['--text-primary'] = '#e2e8f0',   -- texte principal
    ['--text-muted']   = '#d3d3d3',   -- texte secondaire
    ['--red']          = '#f87171',   -- couleur erreur / out of stock
    ['--green']        = '#4ade80',   -- couleur succes
}

Preview 3D de l’arme (NUI uniquement)

Config.PreviewCamOffset     = vector3(0.75, -2.60, 0.80)   -- position camera (offset local du van)
Config.PreviewCamLookOffset = vector3(-0.05, -1.10, 0.50)  -- point regarde (offset local du van)
Config.PreviewCamFov        = 32.0                          -- FOV initial
Config.PreviewZoomStep      = 2.0                           -- pas de zoom (molette)
Config.PreviewMinFov        = 12.0                          -- zoom max
Config.PreviewMaxFov        = 55.0                          -- zoom min
Config.PreviewSensitivity   = 0.6                           -- sensibilite drag souris
Config.PreviewAutoSpin      = true                          -- auto-rotation apres 1.8s d'inactivite
Config.PreviewAutoSpinSpeed = 20.0                          -- vitesse auto-rotation
Config.PreviewWeaponLight   = true                          -- lumiere bleue + blanche sur l'arme

Config.WeaponDisplayOffset   = vector3(0.0, -1.10, 0.55)    -- position arme (offset local du van)
Config.WeaponDisplayRotation = vector3(0.0, 0.0, 0.0)       -- rotation arme initiale

Cycle de vie du van

Config.FirstSpawnDelaySeconds = 5  * 60   -- 1er spawn apres demarrage du serveur
Config.LifetimeSeconds        = 30 * 60   -- duree de presence du van
Config.RespawnCooldownSeconds = 45 * 60   -- pause avant un nouveau spawn
Config.AvoidPreviousLocation  = true      -- evite de respawn au meme endroit

Cycle automatique : spawn → attend LifetimeSeconds ou stock total epuise → despawn → attend RespawnCooldownSecondsspawn au prochain emplacement.

Blip carte (permanent)

Config.ShowBlip           = false  -- deconseille en RP (utiliser le telephone crypte)
Config.RequireContactItem = false  -- blip seulement si le joueur a bm_contact
Config.ContactItemName    = 'bm_contact'

Config.BlipSprite = 110
Config.BlipColor  = 1
Config.BlipScale  = 0.85
Config.BlipName   = nil            -- nil = utilise la traduction _U('blip_name')

Telephone crypte

Config.EncryptedPhone = {
    enable          = true,
    itemName        = 'bm_encrypted_phone',
    cooldownSeconds = 30,

    callAnimDurationMs = 4500,   -- duree de l'animation "passer un appel" cote client

    -- Phase 1 : blip de recherche clignotant
    searchBlipSprite      = 161,
    searchBlipColor       = 1,
    searchBlipScale       = 1.2,
    searchBlipFlash       = true,
    searchBlipDuration    = 20,    -- secondes
    searchBlipStartRadius = 300.0, -- rayon initial autour de la vraie position
    searchBlipEndRadius   = 30.0,  -- rayon final (se resserre progressivement)
    searchBlipUpdateMs    = 1200,  -- frequence de mise a jour du blip
    searchBlipJitter      = 12.0,  -- tremblement aleatoire (effet recherche)

    -- Phase 2 : position precise du van
    vanBlipSprite   = 110,
    vanBlipColor    = 5,
    vanBlipScale    = 0.95,
    vanBlipDuration = 60,          -- secondes
}

Quand le joueur utilise l’item, un blip clignotant apparait pendant searchBlipDuration secondes a une position aleatoire qui se rapproche progressivement de la vraie position, puis la position precise du van pendant vanBlipDuration secondes.

Police & heat

Config.CopFleeMode       = true     -- le vendeur fuit si un flic approche
Config.CopFleeRadius     = 80.0     -- en metres
Config.PoliceAlertChance = 0.10     -- 10% de chance d'alerte par achat

Config.HeatSystem         = true    -- accumulation de chaleur sur le van
Config.HeatThreshold      = 8       -- despawn force au-dela
Config.HeatDecayPerMinute = 1

Economie

Config.StockVariance = 0.30   -- variation stock entre vans (+/-30%)
Config.PriceVariance = 0.10   -- variation prix entre vans (+/-10%)

Config.MaxBuyDistance     = 5.0
Config.BuyCooldownSeconds = 3

Interaction

Config.InteractDistance = 3.5

-- BoxZone pour ox_target (le ped est attache au van : pas de raycast)
Config.TargetZoneOffset = vector3(0.0, -2.6, 0.5)
Config.TargetZoneSize   = vector3(2.2, 2.2, 2.0)

Emplacements de spawn

Config.SpawnLocations = {
    { coords = vector3(-318.9387, -2214.3159, 8.3723), heading = 235.3325, label = 'Elysian Island' },
    { coords = vector3(849.5719, -2180.7517, 30.2998), heading =  37.0987, label = 'Cypress Flats' },
    -- ... ajoutez-en autant que voulu
}

Le serveur choisit aleatoirement un emplacement. Avec AvoidPreviousLocation = true, il evite de reprendre le precedent (si au moins 2 emplacements).

Categories d’items

Config.Categories = {
    { key = 'weapons',    labelKey = 'ui_cat_weapons',    icon = 'crosshair' },
    { key = 'items',      labelKey = 'ui_cat_items',      icon = 'box' },
    { key = 'protection', labelKey = 'ui_cat_protection', icon = 'shield' },
    { key = 'customs',    labelKey = 'ui_cat_customs',    icon = 'wrench' },
}
Config.DefaultCategory = 'weapons'
ChampDescription
keyCle de la categorie (referencee par chaque item via son champ category).
labelKeyCle de traduction (voir locales/*.lua).
iconIcone SVG embarquee. Valeurs supportees : 'crosshair', 'box', 'shield', 'wrench'.

Categorie speciale 'customs' : automatique, n’apparait que si le joueur possede au moins une arme listee dans Config.WeaponCustoms.

Items et armes

Chaque item a une cle, un invName (nom inventaire), une categorie, un prix, un stock, etc.

Config.Items = {
    {
        key = 'weapon_pistol', category = 'weapons',
        invName = 'WEAPON_PISTOL', weaponHash = `WEAPON_PISTOL`, isWeapon = true,
        label = '9mm Pistol', description = 'Compact, reliable, traceable... maybe.',
        price = 4500, stock = 5, minRep = 0, heat = 1,
        stats = { damage = 35, range = 40, fireRate = 55, accuracy = 60 },
        scratched = true,
    },
    -- ...
}

Parametres d’un item

ChampTypeDescription
keystringCle unique (utilisee pour le stock et le price modifier).
categorystring'weapons' | 'items' | 'protection' (les categories customs sont generees).
invNamestringNom de l’item dans l’inventaire.
isWeaponbooltrue pour utiliser AddWeapon (1 unite uniquement).
weaponHashhashUtilise pour la preview 3D (prop_* autorise pour les items non-arme).
labelstringNom affiche dans le menu.
descriptionstringDescription affichee sous l’item.
pricenumberPrix de base ($), modifie par PriceVariance.
stocknumberQuantite max par van, modifie par StockVariance.
minRepnumberReputation minimale requise (0 = aucune).
heatnumberPoints de chaleur generes a l’achat.
statstableStats affichees dans le menu (damage, range, fireRate, accuracy, 0-100).
scratchedboolMet metadata.serial = 'SCRATCHED' dans ox_inventory.

Customisation d’armes

Config.WeaponCustoms = {
    ['WEAPON_PISTOL'] = {
        weaponHash = `WEAPON_PISTOL`,
        label      = '9mm Pistol',
        components = {
            { key = 'p_supp', label = 'Silencieux', price = 800,
              component = `COMPONENT_AT_PI_SUPP_02`, metaName = 'at_suppressor_light' },
            -- ...
        },
        tints = {
            { key = 't_norm', label = 'Standard', price = 0,    tint = 0 },
            { key = 't_gold', label = 'Or',       price = 1200, tint = 2 },
        },
    },
}

Les customs sont proposes uniquement si le joueur possede deja l’arme. Le metaName correspond a l’entree dans metadata.components d’ox_inventory.

Modele de van

Config.VanModel      = `burrito3`
Config.VanLockDoors  = true       -- portes verrouillees pour tous
Config.VanInvincible = true

Config.VanCustom = {
    enable          = true,
    primaryColor    = 12,          -- color id GTA V
    secondaryColor  = 84,
    pearlescent     = 12,
    wheelColor      = 0,
    windowTint      = 1,           -- 0 a 4
    plateText       = 'BLK MKT',
    plateIndex      = 3,
    dirtLevel       = 4.0,
    wheelType       = 7,
    wheelMod        = 6,           -- -1 pour aucun
    livery          = -1,          -- -1 pour aucune
    neonEnable      = false,
    neonR = 59, neonG = 130, neonB = 246,
}

Config.VanProps = {
    { model = `ch_prop_ch_crate_full_01a`, offset = vector3(0.0, -0.50, -0.30), rot = vector3(0.0, 0.0, 0.0) },
    { model = `ch_prop_box_ammo01b`,       offset = vector3(0.30, -1.20, -0.30), rot = vector3(0.0, 0.0, 90.0) },
    { model = `prop_box_ammo07b`,          offset = vector3(0.30, -1.20, -0.10), rot = vector3(0.0, 0.0, 0.0) },
}

Les VanProps sont des props attaches au van avec un offset local (X=droite, Y=avant, Z=haut). Ils donnent l’aspect “marchandise dans le coffre”.

Comportement des portes

Config.DoorIndices       = { 2, 3 }    -- indices des portes a ouvrir/fermer
Config.DoorOpenDistance  = 6.0         -- distance d'ouverture (en metres)
Config.DoorCloseDistance = 8.5         -- distance de fermeture
Config.DoorCheckInterval = 250         -- ms entre verifications
Config.DoorAnimStep      = 0.015       -- pas d'animation (plus petit = plus fluide)
Config.DoorMaxAngle      = 1.0         -- angle max d'ouverture (1.0 = grand ouvert)

Vendeur (PED)

Config.PedModels        = { `IG_GunVanSeller` }   -- aleatoire si plusieurs
Config.PedInvincible    = true
Config.PedFleesOnAttack = false

Config.PedAttachOffset   = vector3(-0.65, -1.9, 0.15)
Config.PedAttachRotation = vector3(0.0, 0.0, -160.0)

Config.PedSitAnim = {
    dict = 'veh@van@rps_rear@base', name = 'sit', flag = 1,
}

Config.PedAnims = {
    hello  = { dict = 'gestures@m@standing@casual', name = 'gesture_hello',     duration = 2500 },
    bye    = { dict = 'gestures@m@standing@casual', name = 'gesture_bye_soft',  duration = 2500 },
    thanks = { dict = 'gestures@m@standing@casual', name = 'gesture_thank_you', duration = 2500 },
}

Config.PedSpeech = {
    hello = 'GENERIC_HI', bye = 'GENERIC_BYE', thanks = 'GENERIC_THANKS',
}

Config.PedDoorOpenDelayMs = 550     -- delai entre salut et ouverture portes
Config.PedThankCooldownMs = 2500    -- cooldown anti-spam du remerciement

Admin

Config.AdminAce    = 'foltone_blackmarket.admin'
Config.AdminGroups = { 'admin', 'superadmin', 'god', 'owner' }

Les joueurs avec l’ace ou un des groupes peuvent utiliser les commandes admin (/bm_spawn, /bm_despawn).

Webhook Discord

Config.Webhook         = ''                          -- vide = desactive
Config.WebhookUsername = 'Foltone Blackmarket'
Config.WebhookColor    = 0x3b82f6

Chaque achat (item + custom) envoie un embed avec le joueur, l’item et le prix.

Hook de notification personnalise

Config.Notification = function(msg, kind)
    if lib and lib.notify then
        lib.notify({ description = msg, type = kind or 'inform' })
        return
    end
    -- fallback selon framework...
end

Vous pouvez remplacer cette fonction par votre propre systeme de notification (Okok, etc.).