Inicio › Documentación › Venta de droga · origen_ilegalv2

Venta de droga · origen_ilegalv2

El sistema de venta de drogas permite a los jugadores vender drogas a clientes NPC. Admite dos modos de venta independientes que pueden funcionar a la vez o activarse por separado.


Modos de venta

luaconfig/drug_sales.lua
Config.DrugSales.Modes = {
    ZoneSale = {
        Enable                = true,
        RequireReputation     = false,  -- require street rep to start
        MinReputationToStart  = 90,
    },
 
    ItemSale = {
        Enable = true,
    },
}
Modo Disparador Descripción
ZoneSale Menú rápido de banda (F6) Los peds caminan HACIA el jugador. Solo funciona si el jugador está en una banda.
ItemSale Usar un objeto de droga del inventario Abre un menú para vender a un ped cercano o consumir la droga. Los objetos utilizables se registran automáticamente al arrancar el servidor.

Establecer Config.DrugSales.Enable = false desactiva todo el sistema, sea cual sea el modo de los anteriores.


Ajustes principales

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
}

Cola de prioridad de clientes

Controla el orden en que se atiende a los clientes que esperan.

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 de clientes

Modelos de ped NPC usados como clientes. Añade o quita entradas según necesites.

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',
},

Alertas a la policía

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

Ajustes de venta en la calle

Ajustes compartidos que usan ambos modos cuando un ped se acerca al jugador durante una venta.

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
},

Lista de drogas

Define qué objetos se pueden vender en DrugList. Cada entrada admite los siguientes campos:

Campos base

Campo Tipo Descripción
label string Nombre mostrado en la UI de interacción
image string URL o ruta de imagen opcional (se usa en el panel de administración)
quantity { min, max } Unidades vendidas por transacción
price { min, max } Precio por unidad en $
prop string Prop del mundo que se sostiene durante el intercambio
rejectChance number|nil Sobrescritura del % de rechazo por droga. Si es nil, usa RejectPercentage
policeChance number|nil Sobrescritura del % de alerta a la policía al aceptar, por droga
forSale boolean Si esta droga se puede vender a NPCs. Por defecto true
forConsumption boolean Si el jugador puede consumir esta droga. Por defecto false

effect (solo consumo)

Se aplica cuando el jugador consume la droga. Solo se usa si forConsumption = true.

Campo Tipo Descripción
type string Clave del tipo de efecto (ver tabla de abajo)
value number|nil Intensidad del efecto (el significado varía según el tipo)
duration number|nil Duración en segundos

Tipos de efecto disponibles:

Clave Descripción Usa value Usa duration
heal Restaura el value % de la vida máxima ✅ (%) —
armor Añade value puntos de armadura ✅ —
stamina Restaura la resistencia al instante — —
heal_full Vida completa + armadura completa — —
speed Multiplicador de velocidad de movimiento ✅ (multiplicador) ✅
superman Velocidad ×2 + supersalto — ✅
no_ragdoll Desactiva el ragdoll — ✅
super_jump Activa el supersalto — ✅
invincible Modo dios — ✅
one_punch Daño cuerpo a cuerpo masivo — ✅
infinite_stamina Resistencia infinita — ✅
fireproof Inmunidad al fuego — ✅
screen_high Post-fx de Aliens fight — ✅
screen_drunk Temblor + desenfoque de borrachera ✅ (intensidad 0–5) ✅
blur Efecto de desenfoque de pantalla — ✅
night_vision Visión nocturna — ✅

consume (animación de consumo)

Controla la animación y la barra de progreso que se muestran cuando el jugador consume la droga.

Campo Tipo Descripción
animDict string|nil Diccionario de animación
animClip string|nil Clip de animación
animFlag number Flag de animación (por defecto 49)
progressDur number|nil Duración de la barra de progreso en segundos
progressLabel string|nil Etiqueta de la barra de progreso. Si no se indica, usa "Consuming {drug label}"
canMove boolean Permite moverse durante el consumo (por defecto false)
propModel string|nil Prop opcional que se sostiene durante la animación
propBone number Hueso del ped al que se une el prop (por defecto 57005, mano derecha)
propPos { x, y, z } Desplazamiento de posición del prop
propRot { x, y, z } Desplazamiento de rotación del prop

Ejemplo de entrada completa

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,
    },
},

Paquetes de weed Origin (por rareza)

Droga de nivel de entrada con precio más bajo y escalonada por rareza:

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' },

Toda la lista de drogas se puede gestionar directamente desde el panel de administración (/gangadmin) sin tocar ningún fichero de configuración. Puedes crear, editar y eliminar drogas en tiempo de ejecución, incluidos precios, cantidades, efectos y animaciones de consumo. Los cambios se guardan en origen_drug_sales_custom en la base de datos y se combinan con la configuración estática al arrancar. Las entradas estáticas sin sobrescritura en la base de datos se tratan por defecto como forSale = true, forConsumption = false.


Zonas en lista negra

Las ventas se bloquean dentro de las zonas configuradas. Añade más entradas según necesites:

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 },
},

Huida del cliente

Si el vendedor ignora a un cliente que espera, el NPC huye pasado un tiempo de espera.

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

Animaciones

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

Blip y mensajes

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',
},

Depuración

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 },
    },
},