Início › Documentação › 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.
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.
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
}Controla a ordem pela qual os clientes em espera são atendidos.
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,
},Modelos de ped NPC usados como clientes. Adiciona ou remove entradas conforme precisares.
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',
},PoliceAlerts = {
onReject = true, -- alert when customer rejects
onAccept = { enabled = true, percentage = 20 }, -- % chance on accept
},
PoliceJobs = {
['police'] = true,
['sheriff'] = true,
['sapd'] = true,
},Definições partilhadas que ambos os modos usam quando um ped se aproxima do jogador durante uma venda.
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
},Define quais os itens que se podem vender em DrugList. Cada entrada suporta os seguintes campos:
| 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 |
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,
},
},Droga de nível de entrada com preço mais baixo e escalonada por raridade:
['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.
As vendas são bloqueadas dentro das zonas configuradas. Adiciona mais entradas conforme precisares:
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 },
},Se o vendedor ignorar um cliente em espera, o NPC foge passado um tempo limite.
CustomerEscape = {
enabled = true,
escapeTime = 20000, -- ms before the customer runs
escapeDistance = { min = 40, max = 60 }, -- meters run before despawn
},Animations = {
phoneCall = {
enabled = true,
duration = 3000,
phoneModel = "prop_npc_phone_02",
},
exchange = {
enabled = true,
duration = 3000,
playerAnim = 'givetake1_a',
npcAnim = 'givetake1_b',
},
},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',
},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 },
},
},