Accueil › Documentation › Vente de drogue · origen_ilegalv2

Vente de drogue · origen_ilegalv2

Le système de vente de drogue permet aux joueurs de vendre de la drogue à des clients PNJ. Il prend en charge deux modes de vente indépendants qui peuvent fonctionner en même temps ou être activés séparément.


Modes de vente

luaconfig/drug_sales.lua
Config.DrugSales.Modes = {
    ZoneSale = {
        Enable                = true,
        RequireReputation     = false,  -- require street rep to start
        MinReputationToStart  = 90,
    },
 
    ItemSale = {
        Enable = true,
    },
}
Mode Déclencheur Description
ZoneSale Menu rapide du gang (F6) Les peds marchent VERS le joueur. Ne fonctionne que si le joueur est dans un gang.
ItemSale Utiliser un item de drogue de l’inventaire Ouvre un menu pour vendre à un ped proche ou consommer la drogue. Les items utilisables sont enregistrés automatiquement au démarrage du serveur.

Définir Config.DrugSales.Enable = false désactive tout le système, quel que soit le mode ci-dessus.


Réglages principaux

luaconfig/drug_sales.lua
Config.DrugSales = {
    Enable             = true,
    CopRequired        = 0,      -- min police online to allow sales
    CopAlertBlipTime   = 200,    -- ms the police alert blip stays on the map
    AllowPoliceToSell  = false,
 
    MaxCustomer               = 30,  -- total customers queued per seller
    MaxSimultaneousCustomers  = 1,
    RejectPercentage          = 20,  -- % chance customer refuses
 
    CustomerSpawnTime       = { min = 3, max = 7 },  -- seconds before next customer
    CustomerInteractionTime = 60,                     -- seconds seller has to interact
 
    UseBlackMoney = true,   -- pay out as dirty money
 
    MinDistanceBetweenSales = 50.0,  -- meters between active sell points
    SaleRadius              = 50.0,  -- active sale area radius around the seller
}

File de priorité des clients

Contrôle l’ordre dans lequel les clients en attente sont servis.

lua
CustomerPriority = {
    enabled               = true,
    distanceThreshold     = 0.5,   -- meters: customers closer are in the "near" group
    priorityByArrival     = true,  -- earlier arrivals get served first
    showWaitingMessages   = true,  -- show queue position messages to waiting customers
    messageUpdateInterval = 0,
    fixedMessages         = true,
},

Peds clients

Modèles de ped PNJ utilisés comme clients. Ajoute ou retire des entrées selon tes besoins.

lua
CustomerPeds = {
    's_m_y_doorman_01',
    'a_f_m_tourist_01',
    'a_m_m_eastsa_02',
    'a_m_m_polynesian_01',
    'ig_priest',
    'ig_ramp_hipster',
    'ig_rashcosvki',
    'ig_money',
    'ig_hunter',
},

Alertes à la police

lua
PoliceAlerts = {
    onReject = true,                                 -- alert when customer rejects
    onAccept = { enabled = true, percentage = 20 },  -- % chance on accept
},
 
PoliceJobs = {
    ['police']  = true,
    ['sheriff'] = true,
    ['sapd']    = true,
},

Réglages de vente dans la rue

Réglages partagés utilisés par les deux modes lorsqu’un ped s’approche du joueur pendant une vente.

lua
StreetSale = {
    Enable            = true,   -- legacy guard, modes are controlled via Modes above
    MaxDistance       = 6.0,    -- meters
    CooldownTime      = 5000,   -- ms between attempts (anti-spam)
    OnlyPeds          = true,   -- only NPC peds can buy
    ExcludePlayerPeds = true,   -- exclude player-controlled peds
    IgnoreDeadPeds    = true,   -- skip dead peds as targets
    PriceMultiplier   = 0.8,    -- 80% of the normal drug price
},

Liste des drogues

Définis dans DrugList quels items sont vendables. Chaque entrée accepte les champs suivants :

Champs de base

Champ Type Description
label string Nom affiché dans l’UI d’interaction
image string URL ou chemin d’image facultatif (utilisé dans le panneau d’administration)
quantity { min, max } Unités vendues par transaction
price { min, max } Prix par unité en $
prop string Prop du monde tenu pendant l’échange
rejectChance number|nil Surcharge du % de refus par drogue. Si nil, utilise RejectPercentage
policeChance number|nil Surcharge du % d’alerte à la police à l’acceptation, par drogue
forSale boolean Si cette drogue peut être vendue aux PNJ. Par défaut true
forConsumption boolean Si le joueur peut consommer cette drogue. Par défaut false

effect (consommation uniquement)

Appliqué lorsque le joueur consomme la drogue. Utilisé uniquement si forConsumption = true.

Champ Type Description
type string Clé du type d’effet (voir tableau ci-dessous)
value number|nil Intensité de l’effet (la signification varie selon le type)
duration number|nil Durée en secondes

Types d’effet disponibles :

Clé Description Utilise value Utilise duration
heal Restaure value % de la vie max ✅ (%) —
armor Ajoute value points d’armure ✅ —
stamina Restaure l’endurance instantanément — —
heal_full Vie complète + armure complète — —
speed Multiplicateur de vitesse de déplacement ✅ (multiplicateur) ✅
superman Vitesse ×2 + super saut — ✅
no_ragdoll Désactive le ragdoll — ✅
super_jump Active le super saut — ✅
invincible Mode dieu — ✅
one_punch Dégâts de mêlée massifs — ✅
infinite_stamina Endurance infinie — ✅
fireproof Immunité au feu — ✅
screen_high Post-fx d’Aliens fight — ✅
screen_drunk Tremblement + flou d’ivresse ✅ (intensité 0–5) ✅
blur Effet de flou d’écran — ✅
night_vision Vision nocturne — ✅

consume (animation de consommation)

Contrôle l’animation et la barre de progression affichées lorsque le joueur consomme la drogue.

Champ Type Description
animDict string|nil Dictionnaire d’animation
animClip string|nil Clip d’animation
animFlag number Flag d’animation (par défaut 49)
progressDur number|nil Durée de la barre de progression en secondes
progressLabel string|nil Libellé de la barre de progression. À défaut, utilise "Consuming {drug label}"
canMove boolean Autorise le déplacement pendant la consommation (par défaut false)
propModel string|nil Prop facultatif tenu pendant l’animation
propBone number Os du ped auquel le prop est attaché (par défaut 57005, main droite)
propPos { x, y, z } Décalage de position du prop
propRot { x, y, z } Décalage de rotation du prop

Exemple d’entrée complète

luaconfig/drug_sales.lua — DrugList
DrugList = {
    ['packaged_weed'] = {
        label          = 'Gram of Marijuana',
        quantity       = { min = 1, max = 3 },
        price          = { min = 80, max = 150 },
        prop           = 'prop_weed_block_01',
        forSale        = true,
        forConsumption = true,
 
        effect = {
            type     = 'infinite_stamina',
            duration = 30,
        },
 
        consume = {
            animDict      = 'amb@world_human_smoking@male@male1@base',
            animClip      = 'base',
            animFlag      = 49,
            progressDur   = 3,
            progressLabel = 'Smoking...',
            canMove       = true,
        },
    },
 
    ['cokebaggy'] = {
        label    = 'Cocaine Bag',
        quantity = { min = 1, max = 2 },
        price    = { min = 250, max = 400 },
        prop     = 'prop_drug_package_02',
        forSale  = true,
    },
 
    ['meth_bag'] = {
        label    = 'Meth Bag',
        quantity = { min = 1, max = 2 },
        price    = { min = 200, max = 350 },
        prop     = 'prop_drug_package_02',
        forSale  = true,
    },
},

Paquets de weed Origin (par rareté)

Drogue d’entrée de gamme, à prix plus bas, échelonnée par rareté :

lua
['weed_packed_common']    = { label = 'Marijuana Pack (Common)',    quantity = { min = 1, max = 5 }, price = { min = 45,  max = 75  }, prop = 'prop_weed_block_01' },
['weed_packed_uncommon']  = { label = 'Marijuana Pack (Uncommon)',  quantity = { min = 1, max = 4 }, price = { min = 60,  max = 95  }, prop = 'prop_weed_block_01' },
['weed_packed_rare']      = { label = 'Marijuana Pack (Rare)',      quantity = { min = 1, max = 4 }, price = { min = 80,  max = 115 }, prop = 'prop_weed_block_01' },
['weed_packed_epic']      = { label = 'Marijuana Pack (Epic)',      quantity = { min = 1, max = 3 }, price = { min = 95,  max = 130 }, prop = 'prop_weed_block_01' },
['weed_packed_legendary'] = { label = 'Marijuana Pack (Legendary)', quantity = { min = 1, max = 3 }, price = { min = 110, max = 148 }, prop = 'prop_weed_block_01' },

Toute la liste des drogues peut être gérée directement depuis le panneau d’administration (/gangadmin) sans toucher à aucun fichier de configuration. Tu peux créer, modifier et supprimer des drogues à l’exécution, y compris les prix, les quantités, les effets et les animations de consommation. Les modifications sont enregistrées dans origen_drug_sales_custom en base de données et fusionnées avec la configuration statique au démarrage. Les entrées statiques sans surcharge en base sont traitées par défaut comme forSale = true, forConsumption = false.


Zones sur liste noire

Les ventes sont bloquées dans les zones configurées. Ajoute d’autres entrées selon tes besoins :

lua
BlacklistedZones = {
    { name = "Police Station", coords = vector3(425.1, -979.5, 30.7),       radius = 100.0 },
    { name = "Hospital",       coords = vector3(298.7, -584.7, 43.2),       radius = 100.0 },
    { name = "Airport",        coords = vector3(-1037.45, -2737.04, 20.17), radius = 400.0 },
},

Fuite du client

Si le vendeur ignore un client qui attend, le PNJ s’enfuit après un délai.

lua
CustomerEscape = {
    enabled        = true,
    escapeTime     = 20000,                    -- ms before the customer runs
    escapeDistance = { min = 40, max = 60 },   -- meters run before despawn
},

Animations

lua
Animations = {
    phoneCall = {
        enabled    = true,
        duration   = 3000,
        phoneModel = "prop_npc_phone_02",
    },
    exchange = {
        enabled    = true,
        duration   = 3000,
        playerAnim = 'givetake1_a',
        npcAnim    = 'givetake1_b',
    },
},

Blip et messages

lua
BlipSettings = {
    enable = false,   -- show sell point blip on the minimap
},
 
Messages = {
    accepted = 'drug_sales.messages.accepted',
    rejected = 'drug_sales.messages.rejected',
    waiting  = 'drug_sales.messages.waiting',
},

Débogage

lua
Debug = {
    enabled              = false,
    showBlacklistedZones = true,
    showSaleRadius       = true,
    markerSettings       = {
        type            = 1,
        scale           = { x = 1.0, y = 1.0, z = 100.0 },
        color           = { r = 255, g = 0,   b = 0, a = 100 },
        colorSaleRadius = { r = 0,   g = 255, b = 0, a = 100 },
    },
},