Conception du système de drogue FiveM : collecte, traitement et vente sécurisés

Comment concevoir un système de drogue FiveM : collecte et traitement avec vérifications d'articles côté serveur, limites de débit, vente à des PNJ sûre, alertes police et équilibrage des gains.

Le symptôme : les joueurs ont des milliers de drogues en minutes, vendent le même article au même PNJ pour toujours, ou gagnent dix fois ce qu'un emploi paye sans alerte police du tout.

Un système de drogue a trois étapes : collecte, traitement et vente. Tous les trois suivent la même règle : le client demande, le serveur vérifie et décide. Cet article montre les vérifications et les questions d'équilibre qui importent.

Les trois étapes

Étape Ce qui arrive Ce que le serveur doit vérifier
Collecte Le joueur cueille une plante, mine une ressource Emplacement, délai d'attente, une limite de débit
Traitement Les articles bruts deviennent un produit fini Le joueur a les articles, est au spot de traitement
Vente Le produit se transforme en argent ou argent sale L'article, l'acheteur, le prix, le délai d'attente

Chaque étape consomme ou crée des articles, donc la conception sûre utilise les fonctions serveur de votre inventaire. Le côté création d'articles est dans ajouter des articles à ox_inventory.

Vérifications d'articles côté serveur

Ne faites jamais confiance à un client qui dit « j'en ai 10 ». Demandez à l'inventaire sur le serveur, enlevez les entrées, puis ajoutez les sorties, dans un endroit :

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)

Enlevez d'abord, ajoutez deuxième, et n'ajoutez que quand l'enlèvement réussit. Si vous ajoutez d'abord, un joueur qui spamme l'événement peut garder la sortie et ne perdre rien. Vérifiez canCarryItem avant d'ajouter si les joueurs peuvent être pleins.

Limites de débit

Même un événement légitime peut être abusé en le déclenchant d'une boucle. Donnez à chaque action un délai minimum par joueur, tenu sur le serveur :

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

Réglez le délai un peu sous ce que l'action réelle prend, pour que les joueurs honnêtes ne soient jamais bloqués. N'oubliez pas d'effacer lastAction[src] sur playerDropped pour que la table ne grandisse pas pour toujours. La collecte devrait aussi être limitée par emplacement : une plante qui existe dans un champ ne doit pas être cueillable de n'importe où.

Vendre à des PNJ sûrement

Vendre à des piétons est la partie la plus abusée, car le client choisit le ped. Ajoutez l'option avec votre bibliothèque de ciblage sur le client, par exemple sur tous les 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,
    },
})

Les principes de base de ciblage sont dans ajouter des zones ox_target. Remarquez que le client envoie seulement le nom de l'article. Tout le reste est décidé sur le serveur :

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)

Le prix vient de la config du serveur, jamais du client. Le nom de l'article devrait être vérifiè contre une liste autorisée, car un client pourrait envoyer n'importe quel nom. Ajoutez une chance aléatoire que le PNJ refuse ou vous dénonce. Si la vente a besoin que le joueur soit dans une zone ou seulement la nuit, vérifiez-le aussi sur le serveur. Le nom de l'article black_money dépend de votre configuration ; voir types d'argent.

Alertes police

Le risque est ce qui rend les drogues intéressantes. Alertez la police sur une chance, depuis le serveur, avec l'emplacement de la transaction :

  • Un pourcentage de chance sur chaque vente (par exemple une petite chance que le PNJ appelle la police).
  • Une plus grande chance quand moins de transactions ont été faites dans une zone calme, ou quand de nombreuses transactions se produisent au même endroit.
  • Un minimum requis d'officiers en devoir pour la vente et le traitement, comptés sur le serveur, comme dans configuration d'un emploi de police.

Si vous utilisez une application téléphonique pour les transactions, les commandes et les points de rencontre devraient toujours être créés et vérifiés sur le serveur.

Drug Dealer AppLa vente de rue en app lb-phone : zones, acheteurs PNJ, niveaux et alertes police.dès 18,15 €Voir le script →

Équilibrage des gains

Équilibrez en nombres, pas en sentiment :

  1. Chronométrez une boucle complète (collecte, traitement, vente) et comptez combien de minutes cela prend.
  2. Calculez l'argent par heure : le gain multiplie les boucles par heure.
  3. Comparez-le avec le salaire du meilleur emploi légal de votre serveur. Les drogues peuvent payer plus, à cause du risque, mais un facteur de deux ou trois est amplement.
  4. Ajoutez de la friction : temps de traitement, poids de l'article, un nombre limité de ventes par PNJ, un délai d'attente par emplacement.

Puis regardez l'argent dans votre base de données après une semaine et ajustez. La méthode est dans équilibrer votre économie serveur.

Liste de vérification

Symptôme Correction
Articles infinis Vérifiez l'emplacement, enlevez les entrées d'abord et limitez le débit sur le serveur
Le client définit le prix Prenez les prix de la config du serveur seulement
Vend n'importe quel article comme drogue Vérifiez le nom de l'article contre une liste autorisée
Le même PNJ achète pour toujours Ajoutez un délai d'attente par joueur et par ped ou emplacement
Les drogues paient trop Comparez l'argent par heure avec un emploi normal
Pas de réaction de la police Alertez sur une chance, depuis le serveur

Réponses rapides

Pourquoi les joueurs reçoivent-ils des drogues illimitées ?

L'événement de collecte ou de traitement s'exécute sur le serveur sans vérifier l'emplacement, le temps ou les limites, donc un client modifié peut le déclencher en boucle. Ajoutez les vérifications et une limite de débit sur le serveur.

Comment laisser les joueurs vendre des drogues à des PNJ ?

Ajoutez une option de ciblage aux piétons sur le client, puis laissez le serveur vérifier l'article, la distance, un délai d'attente et le prix avant qu'il paye. Le client demande seulement.

Comment équilibrer les gains de drogue ?

Calculez le gain d'argent par heure qu'un joueur peut faire et comparez-le avec un emploi normal. Les drogues peuvent payer plus car du risque, mais pas tellement que personne ne fasse autre chose.

Des scripts sans ce problème

Drug Dealer AppLa vente de rue en app lb-phone : zones, acheteurs PNJ, niveaux et alertes police.Voir le script →Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →Pawn Shop AppUn marché de prêt sur gage entre joueurs, directement dans lb-phone.Voir le script →

À lire aussi