Design de sistema de drogas FiveM: colheita, processamento e venda segura
Como projetar um sistema de drogas FiveM: colheita e processamento com verificações de itens do lado do servidor, limites de taxa, venda para NPCs com segurança, alertas de polícia e balanceamento de pagamentos.
O sintoma: jogadores têm milhares de drogas em minutos, vendem o mesmo item para o mesmo NPC para sempre ou ganham dez vezes o que um emprego paga sem nenhum alerta de polícia nenhum.
Um sistema de drogas tem três estágios: colheita, processamento e venda. Todos os três seguem a mesma regra: o cliente pede, o servidor verifica e decide. Este artigo mostra as verificações e as questões de balanço que importam.
Os três estágios
| Estágio | O que acontece | O que o servidor deve verificar |
|---|---|---|
| Colheita | Jogador colhe uma planta, minera um recurso | Localização, cooldown, um limite de taxa |
| Processamento | Itens brutos se tornam um produto acabado | O jogador tem os itens, está no local de processamento |
| Venda | Produto vira dinheiro ou dinheiro sujo | O item, o comprador, o preço, o cooldown |
Cada estágio consome ou cria itens, então o design seguro usa as funções de servidor de seu inventário. O lado de criação de item está em adicionando itens ao ox_inventory.
Verificações de item do lado do servidor
Nunca confie em um cliente que diz "Tenho 10 deste". Peça ao inventário no servidor, remova as entradas, depois adicione as saídas, em um lugar:
-- server
RegisterNetEvent('drugs:process', function()
local src = source
if not isNearProcessor(src) then return end -- distance check on the server
local count = exports.ox_inventory:GetItemCount(src, 'weed_leaf')
if count < 3 then return end
if exports.ox_inventory:RemoveItem(src, 'weed_leaf', 3) then
exports.ox_inventory:AddItem(src, 'weed_bag', 1)
end
end)Remova primeiro, adicione segundo e apenas adicione quando a remoção tiver sucesso. Se você adicionar primeiro, um jogador que spamma o evento pode manter a saída e não perder nada. Verifique canCarryItem antes de adicionar se os jogadores podem estar cheios.
Limites de taxa
Mesmo um evento legítimo pode ser abusado disparando-o de um loop. Dê a cada ação um atraso mínimo por jogador, mantido no servidor:
local lastAction = {}
local function rateLimited(src, key, ms)
local now = GetGameTimer()
lastAction[src] = lastAction[src] or {}
if lastAction[src][key] and now - lastAction[src][key] < ms then
return true
end
lastAction[src][key] = now
return false
endDefina o atraso um pouco menos do que a ação real leva, para que jogadores honrados nunca sejam bloqueados. Lembre-se de limpar lastAction[src] em playerDropped para que a tabela não cresça para sempre. A colheita também deve ser limitada por localização: uma planta que existe em um campo não deve ser colhível de qualquer lugar.
Venda segura para NPCs
Vender para pedestres é a parte mais abusada, porque o cliente escolhe o ped. Adicione a opção com sua biblioteca alvo no cliente, por exemplo em todos os peds:
-- client (ox_target)
exports.ox_target:addGlobalPed({
{
label = 'Offer drugs',
icon = 'fa-solid fa-cannabis',
distance = 2.0,
canInteract = function(entity)
return not IsPedAPlayer(entity) and not IsEntityDead(entity)
end,
onSelect = function(data)
TriggerServerEvent('drugs:sell', 'weed_bag')
end,
},
})O básico de targeting está em adicionando zonas ox_target. Note que o cliente envia apenas o nome do item. Tudo o mais é decidido no servidor:
RegisterNetEvent('drugs:sell', function(item)
local src = source
local price = Config.Prices[item]
if not price then return end -- only allowed items
if rateLimited(src, 'sell', 4000) then return end -- cooldown between deals
if exports.ox_inventory:RemoveItem(src, item, 1) then
local payout = math.random(price.min, price.max)
exports.ox_inventory:AddItem(src, 'black_money', payout)
end
end)O preço vem da configuração do servidor, nunca do cliente. O nome do item deve ser verificado contra uma lista permitida, porque um cliente poderia enviar qualquer nome. Adicione uma chance aleatória de que o NPC se recuse ou o denuncie. Se a venda precisar que o jogador esteja em uma zona ou apenas à noite, verifique isso no servidor também. O nome do item black_money depende de sua configuração; veja tipos de dinheiro.
Alertas de polícia
Risco é o que torna drogas interessantes. Alerte a polícia em uma chance, do servidor, com a localização do negócio:
- Uma chance de percentual em cada venda (por exemplo, uma pequena chance de que o NPC chame a polícia).
- Uma chance maior quando menos negócios foram feitos em uma área tranquila, ou quando muitos negócios acontecem no mesmo lugar.
- Um mínimo obrigatório de oficiais em serviço para venda e processamento, contado no servidor, como em configurando um emprego de polícia.
Se você usar um aplicativo de telefone para negócios, pedidos e pontos de encontro ainda devem ser criados e verificados no servidor.
Drug Dealer AppVendas na rua como app do lb-phone: zonas, compradores NPC, níveis e alertas para a polícia.a partir de € 18,15Ver o script →
Balanceamento de pagamentos
Balanço em números, não em sentimento:
- Cronométre um loop completo (colheita, processamento, venda) e conte quantos minutos leva.
- Calcule dinheiro por hora: payout vezes loops por hora.
- Compare com o contracheque do seu melhor emprego legal. Drogas podem pagar mais por causa do risco, mas um fator de dois ou três é o suficiente.
- Adicione fricção: tempo de processamento, peso do item, número limitado de vendas por NPC, cooldown por localização.
Depois observe o dinheiro em seu banco de dados após uma semana e ajuste. O método está em balanceando a economia do seu servidor.
Lista de verificação
| Sintoma | Correção |
|---|---|
| Itens infinitos | Verifique localização, remova entradas primeiro e limite de taxa no servidor |
| Cliente define o preço | Pegue preços apenas da configuração do servidor |
| Vende qualquer item como drogas | Verifique o nome do item contra uma lista permitida |
| Mesmo NPC compra para sempre | Adicione um cooldown por jogador e por ped ou localização |
| Drogas pagam muito | Compare dinheiro por hora com um emprego normal |
| Sem reação de polícia | Alerte em uma chance, do servidor |
Respostas rápidas
Por que os jogadores ganham drogas ilimitadas?
O evento de colheita ou processamento roda no servidor sem verificar localização, hora ou limites, então um cliente modificado pode disparar em loop. Adicione as verificações e um limite de taxa no servidor.
Como deixo os jogadores venderem drogas para NPCs?
Adicione uma opção alvo a pedestres no cliente, depois deixe o servidor verificar o item, a distância, um cooldown e o preço antes de pagar. O cliente apenas pede.
Como balanço os pagamentos de drogas?
Calcule o dinheiro por hora que um jogador pode ganhar e compare com um emprego normal. Drogas podem pagar mais por causa do risco, mas não tanto que ninguém faz mais nada.
Scripts sem esse problema
Drug Dealer AppVendas na rua como app do lb-phone: zonas, compradores NPC, níveis e alertas para a polícia.Ver script →
Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →
Pawn Shop AppUma casa de penhores entre jogadores dentro do lb-phone.Ver script →