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 :
-- 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 :
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
endRé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 :
-- 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 :
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 :
- Chronométrez une boucle complète (collecte, traitement, vente) et comptez combien de minutes cela prend.
- Calculez l'argent par heure : le gain multiplie les boucles par heure.
- 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.
- 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 →