Início › Documentação › Venda de droga · origen_ilegalv2

Venda de droga · origen_ilegalv2

O sistema de venda de droga permite aos jogadores vender droga a clientes NPC. Suporta dois modos de venda independentes que podem funcionar em simultâneo ou ser ativados em separado.


Modos de venda

luaconfig/drug_sales.lua
Config.DrugSales.Modes = {
    ZoneSale = {
        Enable                = true,
        RequireReputation     = false,  -- require street rep to start
        MinReputationToStart  = 90,
    },
 
    ItemSale = {
        Enable = true,
    },
}
Modo Disparador Descrição
ZoneSale Menu rápido da gangue (F6) Os peds caminham ATÉ ao jogador. Só funciona se o jogador estiver numa gangue.
ItemSale Usar um item de droga do inventário Abre um menu para vender a um ped próximo ou consumir a droga. Os itens utilizáveis são registados automaticamente no arranque do servidor.

Definir Config.DrugSales.Enable = false desativa todo o sistema, seja qual for o modo acima.


Definições principais

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
}

Fila de prioridade de clientes

Controla a ordem pela qual os clientes em espera são atendidos.

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. Adiciona ou remove entradas conforme precisares.

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 à polícia

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

Definições de venda na rua

Definições partilhadas que ambos os modos usam quando um ped se aproxima do jogador durante uma venda.

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 quais os itens que se podem vender em DrugList. Cada entrada suporta os seguintes campos:

Campos base

Campo Tipo Descrição
label string Nome mostrado na UI de interação
image string URL ou caminho de imagem opcional (usado no painel de administração)
quantity { min, max } Unidades vendidas por transação
price { min, max } Preço por unidade em $
prop string Prop do mundo segurado durante a troca
rejectChance number|nil Substituição do % de rejeição por droga. Se for nil, usa RejectPercentage
policeChance number|nil Substituição do % de alerta à polícia ao aceitar, por droga
forSale boolean Se esta droga pode ser vendida a NPCs. Por omissão true
forConsumption boolean Se o jogador pode consumir esta droga. Por omissão false

effect (apenas consumo)

Aplicado quando o jogador consome a droga. Só é usado se forConsumption = true.

Campo Tipo Descrição
type string Chave do tipo de efeito (ver tabela abaixo)
value number|nil Intensidade do efeito (o significado varia consoante o tipo)
duration number|nil Duração em segundos

Tipos de efeito disponíveis:

Chave Descrição Usa value Usa duration
heal Restaura value % da vida máxima ✅ (%) —
armor Adiciona value pontos de armadura ✅ —
stamina Restaura a resistência instantaneamente — —
heal_full Vida completa + armadura completa — —
speed Multiplicador de velocidade de movimento ✅ (multiplicador) ✅
superman Velocidade ×2 + super salto — ✅
no_ragdoll Desativa o ragdoll — ✅
super_jump Ativa o super salto — ✅
invincible Modo deus — ✅
one_punch Dano corpo a corpo massivo — ✅
infinite_stamina Resistência infinita — ✅
fireproof Imunidade ao fogo — ✅
screen_high Post-fx de Aliens fight — ✅
screen_drunk Tremor + desfoque de embriaguez ✅ (intensidade 0–5) ✅
blur Efeito de desfoque do ecrã — ✅
night_vision Visão noturna — ✅

consume (animação de consumo)

Controla a animação e a barra de progresso mostradas quando o jogador consome a droga.

Campo Tipo Descrição
animDict string|nil Dicionário de animação
animClip string|nil Clip de animação
animFlag number Flag de animação (por omissão 49)
progressDur number|nil Duração da barra de progresso em segundos
progressLabel string|nil Etiqueta da barra de progresso. Se não for indicada, usa "Consuming {drug label}"
canMove boolean Permite mover-se durante o consumo (por omissão false)
propModel string|nil Prop opcional segurado durante a animação
propBone number Osso do ped a que o prop é preso (por omissão 57005, mão direita)
propPos { x, y, z } Deslocamento de posição do prop
propRot { x, y, z } Deslocamento de rotação do prop

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

Pacotes de weed Origin (por raridade)

Droga de nível de entrada com preço mais baixo e escalonada por raridade:

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 a lista de drogas pode ser gerida diretamente a partir do painel de administração (/gangadmin) sem tocar em nenhum ficheiro de configuração. Podes criar, editar e eliminar drogas em tempo de execução, incluindo preços, quantidades, efeitos e animações de consumo. As alterações são guardadas em origen_drug_sales_custom na base de dados e combinadas com a configuração estática no arranque. As entradas estáticas sem substituição na base de dados são tratadas por omissão como forSale = true, forConsumption = false.


Zonas em lista negra

As vendas são bloqueadas dentro das zonas configuradas. Adiciona mais entradas conforme precisares:

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

Fuga do cliente

Se o vendedor ignorar um cliente em espera, o NPC foge passado um tempo limite.

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

Animações

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

Blip e mensagens

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

Depuração

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