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:

lua
-- 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:

lua
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
end

Defina 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:

lua
-- 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:

lua
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:

  1. Cronométre um loop completo (colheita, processamento, venda) e conte quantos minutos leva.
  2. Calcule dinheiro por hora: payout vezes loops por hora.
  3. 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.
  4. 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 →

Continue lendo